crates/nornir-funnel-embed/.nornir/assets/live-poll.svg
<svg xmlns="http://www.w3.org/2000/svg" width="760" height="250" font-family="monospace" font-size="13">
<rect width="760" height="250" fill="#0f1720"/>
<text x="16" y="26" fill="#6fd3f5" font-size="15">nornir-funnel-embed — live auto-poll</text>
<!-- egui loop -->
<rect x="16" y="50" width="150" height="60" rx="6" fill="#12202c" stroke="#6fd3f5"/>
<text x="30" y="76" fill="#cfe8f5">egui ui() frame</text>
<text x="30" y="96" fill="#7fb0cc" font-size="11">now_s = input.time</text>
<!-- poll_due -->
<rect x="210" y="50" width="150" height="60" rx="6" fill="#12202c" stroke="#6fd3f5"/>
<text x="224" y="72" fill="#cfe8f5">poll_due(now)?</text>
<text x="224" y="92" fill="#7fb0cc" font-size="11">auto_poll &&</text>
<text x="224" y="105" fill="#7fb0cc" font-size="11">now-last ≥ 1.5s</text>
<!-- refresh -->
<rect x="404" y="50" width="160" height="60" rx="6" fill="#12202c" stroke="#8fe28f"/>
<text x="418" y="76" fill="#cfe8f5">refresh():</text>
<text x="418" y="96" fill="#7fb0cc" font-size="11">Funnel.Show (thin gRPC)</text>
<!-- plandag -->
<rect x="606" y="50" width="138" height="60" rx="6" fill="#12202c" stroke="#8fe28f"/>
<text x="620" y="76" fill="#cfe8f5">plan-DAG</text>
<text x="620" y="96" fill="#7fb0cc" font-size="11">grows: +nodes</text>
<line x1="166" y1="80" x2="210" y2="80" stroke="#6fd3f5" marker-end="url(#a)"/>
<line x1="360" y1="80" x2="404" y2="80" stroke="#6fd3f5" marker-end="url(#a)"/>
<line x1="564" y1="80" x2="606" y2="80" stroke="#8fe28f" marker-end="url(#a)"/>
<!-- repaint loop back -->
<path d="M480 110 L480 150 L91 150 L91 110" fill="none" stroke="#e0785a" stroke-dasharray="4 3" marker-end="url(#a)"/>
<text x="150" y="145" fill="#e0785a" font-size="11">request_repaint_after(1.5s) — keeps ticking, throttled (● live)</text>
<!-- offline -->
<rect x="404" y="180" width="340" height="46" rx="6" fill="#241318" stroke="#e0785a"/>
<text x="418" y="200" fill="#f0b8a8" font-size="11">server offline → clean "unavailable", never wedges/panics</text>
<text x="418" y="216" fill="#7fb0cc" font-size="11">⏸ paused toggle stops the poll; manual ⟳ Refresh still works</text>
<text x="16" y="200" fill="#7fb0cc" font-size="11">state_json:</text>
<text x="16" y="216" fill="#7fb0cc" font-size="11">auto_poll,</text>
<text x="16" y="230" fill="#7fb0cc" font-size="11">poll_interval_s</text>
<defs><marker id="a" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto">
<path d="M0,0 L6,3 L0,6 Z" fill="#6fd3f5"/></marker></defs>
</svg>