.tsv{--t-bg: #f8fafc;--t-surface: #ffffff;--t-surface-raised: #f1f5f9;--t-border: #cbd5e1;--t-border-subtle: #e2e8f0;--t-text: #0f172a;--t-text-muted: #475569;--t-text-faint: #94a3b8;--t-control: #7c3aed;--t-control-bg: #ede9fe;--t-direct: #16a34a;--t-direct-bg: #dcfce7;--t-relay: #d97706;--t-relay-bg: #fef3c7;--t-idle: #cbd5e1;--t-node-fill: #ffffff;--t-node-stroke: #cbd5e1;--t-node-dim: .45;font-family:IBM Plex Sans,system-ui,sans-serif;background:var(--t-bg);color:var(--t-text);padding:20px;border-radius:12px;max-width:700px;margin:2rem auto;border:1px solid var(--t-border);box-sizing:border-box}.tsv *,.tsv *:before,.tsv *:after{box-sizing:border-box}html[data-theme=dark] .tsv{--t-bg: #0b0d13;--t-surface: #11141d;--t-surface-raised: #1c2035;--t-border: #2b3154;--t-border-subtle: #222744;--t-text: #dde3f2;--t-text-muted: #b4bcda;--t-text-faint: #8c96bc;--t-control: #b8aafc;--t-control-bg: #201844;--t-direct: #58de80;--t-direct-bg: #061410;--t-relay: #f8c848;--t-relay-bg: #201505;--t-idle: #3d4570;--t-node-fill: #11141d;--t-node-stroke: #2b3154}.tsv .tsv-tabs{display:flex;gap:4px;flex-wrap:wrap;margin-bottom:14px;padding-bottom:12px;border-bottom:1px solid var(--t-border-subtle)}.tsv .tsv-tab{font-family:IBM Plex Mono,monospace;font-size:11px;background:transparent;border:1px solid var(--t-border-subtle);color:var(--t-text-muted);padding:5px 10px;border-radius:6px;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.tsv .tsv-tab:hover{background:var(--t-surface-raised);color:var(--t-text)}.tsv .tsv-tab.on{background:var(--t-control-bg);border-color:var(--t-control);color:var(--t-control);font-weight:600}.tsv .tsv-stage{background:var(--t-surface);border:1px solid var(--t-border-subtle);border-radius:10px;padding:8px;margin-bottom:12px}.tsv .tsv-svg{width:100%;height:auto;display:block}.tsv .tsv-lane-label{font-family:IBM Plex Mono,monospace;font-size:10px;fill:var(--t-text-faint);text-transform:uppercase;letter-spacing:.06em}.tsv .tsv-lane-div{stroke:var(--t-border-subtle);stroke-width:1;stroke-dasharray:3 4}.tsv .tsv-path{fill:none;stroke:var(--t-idle);stroke-width:2;opacity:.4;transition:stroke .3s,opacity .3s,stroke-width .3s}.tsv .tsv-path-control.lit{stroke:var(--t-control);stroke-dasharray:4 4;opacity:.85;animation:tsv-dash 1.2s linear infinite;marker-end:url(#tsv-arrow-control)}.tsv .tsv-path-direct.lit{stroke:var(--t-direct);stroke-width:3;opacity:1;marker-end:url(#tsv-arrow-direct);marker-start:url(#tsv-arrow-direct)}.tsv .tsv-path-direct.broken{stroke:var(--t-relay);stroke-width:2;stroke-dasharray:2 5;opacity:.35}.tsv .tsv-path-relay.lit{stroke:var(--t-relay);stroke-width:3;opacity:1;marker-end:url(#tsv-arrow-relay)}.tsv .tsv-path.hidden{opacity:0}@keyframes tsv-dash{to{stroke-dashoffset:-16}}.tsv .tsv-arrow-control{fill:var(--t-control)}.tsv .tsv-arrow-direct{fill:var(--t-direct)}.tsv .tsv-arrow-relay{fill:var(--t-relay)}.tsv .tsv-pkt{opacity:0;transition:opacity .3s}.tsv .tsv-pkt-control{fill:var(--t-control)}.tsv .tsv-pkt-direct{fill:var(--t-direct)}.tsv .tsv-pkt-relay{fill:var(--t-relay)}.tsv .tsv-pkt.shown{opacity:1}.tsv .tsv-node rect{fill:var(--t-node-fill);stroke:var(--t-node-stroke);stroke-width:1.5;transition:stroke .3s,stroke-width .3s,opacity .3s}.tsv .tsv-node.lit-control rect{stroke:var(--t-control);stroke-width:2}.tsv .tsv-node.lit-direct rect{stroke:var(--t-direct);stroke-width:2.5}.tsv .tsv-node.lit-relay rect{stroke:var(--t-relay);stroke-width:2.5}.tsv .tsv-node.dim{opacity:var(--t-node-dim)}.tsv .tsv-node.hidden{opacity:0;pointer-events:none}.tsv .tsv-node-title{font-family:IBM Plex Mono,monospace;font-size:13px;font-weight:600;fill:var(--t-text);text-anchor:middle}.tsv .tsv-node-sub{font-family:IBM Plex Sans,system-ui,sans-serif;font-size:10px;fill:var(--t-text-faint);text-anchor:middle}.tsv .tsv-node-ip{font-family:IBM Plex Mono,monospace;font-size:11px;fill:var(--t-text-muted);text-anchor:middle}.tsv .tsv-node-badge{font-family:IBM Plex Mono,monospace;font-size:9.5px;fill:var(--t-text-muted);text-anchor:middle;font-weight:500}.tsv .tsv-nat{opacity:0;transition:opacity .35s}.tsv .tsv-nat.shown{opacity:1}.tsv .tsv-nat-wall{fill:var(--t-relay-bg);stroke:var(--t-relay);stroke-width:1.5;stroke-dasharray:3 2}.tsv .tsv-nat-label{font-family:IBM Plex Mono,monospace;font-size:9px;fill:var(--t-relay);text-anchor:middle;font-weight:600}.tsv .tsv-ssh-label{opacity:0;transition:opacity .35s}.tsv .tsv-ssh-label.shown{opacity:1}.tsv .tsv-ssh-bg{fill:var(--t-direct-bg);stroke:var(--t-direct);stroke-width:1}.tsv .tsv-ssh-text{font-family:IBM Plex Mono,monospace;font-size:10px;fill:var(--t-direct);text-anchor:middle;font-weight:600}.tsv .tsv-out{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;margin-bottom:12px;background:var(--t-surface-raised);border:1px solid var(--t-border-subtle);color:var(--t-text-muted);transition:background .3s,border-color .3s,color .3s}.tsv .tsv-out.control{background:var(--t-control-bg);border-color:var(--t-control);color:var(--t-control)}.tsv .tsv-out.direct{background:var(--t-direct-bg);border-color:var(--t-direct);color:var(--t-direct)}.tsv .tsv-out.relay{background:var(--t-relay-bg);border-color:var(--t-relay);color:var(--t-relay)}.tsv .tsv-out-dot{width:10px;height:10px;border-radius:50%;background:currentColor;flex-shrink:0}.tsv .tsv-out-title{font-family:IBM Plex Mono,monospace;font-size:12px;font-weight:600}.tsv .tsv-out-sub{font-size:11px;opacity:.85;margin-top:1px;color:var(--t-text-muted)}.tsv .tsv-out.direct .tsv-out-sub,.tsv .tsv-out.relay .tsv-out-sub,.tsv .tsv-out.control .tsv-out-sub{color:inherit;opacity:.85}.tsv .tsv-legend{display:flex;flex-wrap:wrap;gap:6px 14px;margin-bottom:12px}.tsv .tsv-leg{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--t-text-muted)}.tsv .tsv-leg-sw{display:inline-block;width:18px;height:3px;border-radius:2px;flex-shrink:0}.tsv .tsv-leg-control{background:var(--t-control)}.tsv .tsv-leg-direct{background:var(--t-direct)}.tsv .tsv-leg-relay{background:var(--t-relay)}.tsv .tsv-sdesc{font-size:13px;line-height:1.65;color:var(--t-text);background:var(--t-surface);border:1px solid var(--t-border-subtle);border-radius:8px;padding:12px 14px;margin-bottom:14px}.tsv .tsv-nav{display:flex;align-items:center;gap:12px}.tsv .tsv-nav-btn{font-family:IBM Plex Mono,monospace;font-size:12px;background:var(--t-surface-raised);border:1px solid var(--t-border);color:var(--t-text-muted);padding:6px 14px;border-radius:6px;cursor:pointer;transition:background .15s,color .15s}.tsv .tsv-nav-btn:hover:not(:disabled){background:var(--t-border);color:var(--t-text)}.tsv .tsv-nav-btn:disabled{opacity:.28;cursor:default}.tsv .tsv-dots{flex:1;display:flex;justify-content:center;gap:7px}.tsv .tsv-dot{width:5px;height:5px;border-radius:50%;background:var(--t-border);transition:background .2s,transform .2s}.tsv .tsv-dot.on{background:var(--t-control);transform:scale(1.4)}@media(max-width:540px){.tsv{padding:14px}.tsv .tsv-legend{font-size:10px}.tsv .tsv-sdesc{font-size:12px}}
