facett-map3d/.nornir/assets/route-overlay-nav.svg
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="300" viewBox="0 0 640 300" font-family="monospace" font-size="12">
<rect width="640" height="300" fill="#0f1116"/>
<text x="16" y="26" fill="#e8eaed" font-size="14">OSM-3D route overlay + turn-by-turn follow (additive, opt-in)</text>
<!-- LEFT: the extruded city with the route ribbon draped on the streets -->
<text x="60" y="58" fill="#9fb3c8">route ribbon ON the streets</text>
<!-- ground -->
<rect x="40" y="70" width="240" height="200" fill="#161a20" stroke="#39424e" stroke-width="1"/>
<!-- a couple of building prisms -->
<rect x="70" y="150" width="34" height="60" fill="#2b3440" stroke="#3d4a5a"/>
<rect x="150" y="120" width="40" height="90" fill="#2b3440" stroke="#3d4a5a"/>
<rect x="215" y="170" width="30" height="46" fill="#2b3440" stroke="#3d4a5a"/>
<!-- street grid (faint) -->
<line x1="55" y1="230" x2="265" y2="230" stroke="#39424e" stroke-width="4"/>
<line x1="130" y1="90" x2="130" y2="255" stroke="#39424e" stroke-width="4"/>
<!-- the ROUTE: bright L polyline + waypoint dots + the "you are here" pip -->
<polyline points="60,230 200,230 200,110" fill="none" stroke="#6fd3f5" stroke-width="5"/>
<circle cx="60" cy="230" r="5" fill="#ffd25a"/>
<circle cx="200" cy="230" r="5" fill="#ffd25a"/>
<circle cx="200" cy="110" r="5" fill="#ffd25a"/>
<circle cx="130" cy="230" r="6" fill="#6fd3f5" stroke="#e8eaed"/>
<text x="98" y="222" fill="#6fd3f5">progress t →</text>
<!-- RIGHT: the follow loop -->
<text x="360" y="58" fill="#9fb3c8">turn-by-turn follow (Msg-driven)</text>
<rect x="350" y="72" width="250" height="196" fill="#141821" stroke="#39424e" stroke-width="1"/>
<text x="366" y="98" fill="#e8eaed">t = route_progress ∈ [0,1]</text>
<text x="366" y="124" fill="#8fe3a0">target = route.point_at(t)</text>
<text x="366" y="148" fill="#8fe3a0">bearing = route.bearing_deg_at(t)</text>
<text x="366" y="172" fill="#8fe3a0">tilt/dolly = chase constants</text>
<text x="366" y="196" fill="#f5a86f">Frame: t += dt·speed (wraps)</text>
<text x="366" y="224" fill="#9fb3c8">state_json: has_route · route_length</text>
<text x="366" y="242" fill="#9fb3c8"> route_progress · route_bearing_deg</text>
<text x="366" y="260" fill="#6fd3f5">reuses OrbitCamera — no new engine</text>
</svg>