.nornir/assets/idle-auto-rotate.svg
<svg xmlns="http://www.w3.org/2000/svg" width="560" height="230" viewBox="0 0 560 230" font-family="monospace" font-size="12">
<rect width="560" height="230" fill="#0e1620"/>
<!-- idle timeline -->
<text x="16" y="30" fill="#9fb3c8">tick(dt, interacted)</text>
<line x1="16" y1="52" x2="360" y2="52" stroke="#3a4b5c" stroke-width="2"/>
<!-- interacting segment -->
<line x1="16" y1="52" x2="150" y2="52" stroke="#e0785a" stroke-width="6"/>
<text x="20" y="74" fill="#e0785a">interacting → clock reset</text>
<!-- idle build-up -->
<line x1="150" y1="52" x2="250" y2="52" stroke="#6fd3f5" stroke-width="6"/>
<text x="150" y="90" fill="#6fd3f5">idle < 6s</text>
<!-- threshold marker -->
<line x1="250" y1="40" x2="250" y2="64" stroke="#f5d76f" stroke-width="2"/>
<text x="214" y="34" fill="#f5d76f">threshold 6s</text>
<!-- spinning segment -->
<line x1="250" y1="52" x2="360" y2="52" stroke="#7fe08a" stroke-width="6"/>
<text x="256" y="90" fill="#7fe08a">idle ≥ 6s → SPIN</text>
<!-- MapFacet camera box -->
<rect x="410" y="40" width="130" height="130" rx="8" fill="#132430" stroke="#6fd3f5" stroke-width="1.5"/>
<text x="475" y="60" fill="#9fb3c8" text-anchor="middle">MapFacet</text>
<circle cx="475" cy="115" r="34" fill="none" stroke="#3a4b5c" stroke-width="1.5"/>
<!-- rotate arc + arrowhead -->
<path d="M 475 81 A 34 34 0 1 1 441 115" fill="none" stroke="#7fe08a" stroke-width="2.5"/>
<polygon points="441,115 447,108 449,120" fill="#7fe08a"/>
<text x="475" y="119" fill="#7fe08a" text-anchor="middle">bearing</text>
<text x="475" y="160" fill="#f5d76f" text-anchor="middle">8°/s</text>
<!-- flow arrow timeline -> facet -->
<line x1="360" y1="52" x2="404" y2="90" stroke="#6fd3f5" stroke-width="1.5"/>
<polygon points="404,90 396,86 397,95" fill="#6fd3f5"/>
<text x="16" y="200" fill="#607890">any pointer/scroll/key event → reset idle clock, stop spin (state_json: idle_rotating=false)</text>
</svg>