:root{--ink: #0c1116;--panel: #131a21;--panel-2: #18212a;--line: #1f2a33;--line-bright: #2c3b47;--text: #c9d6df;--text-strong: #eef4f8;--muted: #6d8394;--faint: #47596a;--aqua: #3bc9c4;--amber: #e8963c;--rose: #e2566b;--yellow: #d8c25a;--slate: #5b7fa8;--violet: #9b7bd4;--sev-critical: var(--rose);--sev-high: var(--amber);--sev-medium: var(--yellow);--sev-low: var(--slate);--sev-info: var(--faint);--display: "Bahnschrift", "DIN Alternate", "Roboto Condensed", "Segoe UI Semibold", system-ui, sans-serif;--mono: ui-monospace, "Cascadia Mono", "SF Mono", "JetBrains Mono", Consolas, "Liberation Mono", monospace;--body: "Segoe UI Variable Text", "Segoe UI", system-ui, -apple-system, sans-serif;--rail: 400px;--header: 52px;--status: 30px;color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--ink);color:var(--text);font-family:var(--body);font-size:13px;line-height:1.55;-webkit-font-smoothing:antialiased}.label{font-family:var(--display);font-size:10px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}.mono{font-family:var(--mono);font-size:12px;letter-spacing:-.01em}button{font:inherit;color:inherit;background:none;border:none;cursor:pointer}:focus-visible{outline:1px solid var(--aqua);outline-offset:2px}.app{display:grid;grid-template-rows:var(--header) 1fr var(--status);height:100%}.header{display:flex;align-items:center;gap:20px;padding:0 16px;border-bottom:1px solid var(--line);background:var(--panel)}.brand{font-family:var(--display);font-size:15px;font-weight:700;letter-spacing:.22em;text-transform:uppercase;color:var(--text-strong)}.brand span{color:var(--aqua)}.header .spacer{flex:1}.region-chip{display:inline-flex;align-items:center;gap:7px;font-family:var(--mono);font-size:11px;color:var(--muted)}.region-chip i{width:6px;height:6px;border-radius:50%;background:var(--slate);display:block}.region-chip.east i{background:var(--aqua)}.region-chip.west i{background:var(--violet)}.btn{font-family:var(--display);font-size:11px;letter-spacing:.12em;text-transform:uppercase;padding:7px 14px;border:1px solid var(--line-bright);background:var(--panel-2);color:var(--text);border-radius:2px;transition:border-color .14s,color .14s,background .14s}.btn:hover:not(:disabled){border-color:var(--aqua);color:var(--text-strong)}.btn:disabled{opacity:.45;cursor:default}.btn.primary{border-color:var(--aqua);color:var(--aqua)}.btn.primary:hover:not(:disabled){background:#3bc9c417}.body{display:grid;grid-template-columns:1fr var(--rail);min-height:0}.statusbar{display:flex;align-items:center;gap:22px;padding:0 16px;border-top:1px solid var(--line);background:var(--panel);font-family:var(--mono);font-size:11px;color:var(--muted)}.statusbar b{color:var(--text-strong);font-weight:500}.map{position:relative;min-width:0;background:radial-gradient(circle at 50% 42%,rgba(59,201,196,.045),transparent 62%),var(--ink);overflow:hidden}.map svg{display:block;width:100%;height:100%;touch-action:none}.map.grabbing svg{cursor:grabbing}.map-controls{position:absolute;left:14px;bottom:14px;display:flex;gap:6px}.map-controls button{width:28px;height:28px;border:1px solid var(--line-bright);background:#131a21e6;color:var(--muted);border-radius:2px;font-family:var(--mono);font-size:13px}.map-controls button:hover{color:var(--aqua);border-color:var(--aqua)}.map-controls button.wide{width:auto;padding:0 10px;font-size:10px;font-family:var(--display);letter-spacing:.1em;text-transform:uppercase}.legend{position:absolute;right:14px;bottom:14px;display:grid;gap:5px;padding:10px 12px;border:1px solid var(--line);background:#131a21eb;border-radius:2px}.legend div{display:flex;align-items:center;gap:8px;font-size:10px;font-family:var(--mono);color:var(--muted)}.legend svg{width:26px;height:8px}.edge{fill:none;stroke-width:1;stroke:var(--line-bright)}.edge.association{stroke:var(--slate);stroke-width:1.25}.edge.propagation{stroke:var(--violet);stroke-dasharray:2 4;opacity:.55}.edge.attach{stroke:var(--line-bright)}.edge.owns{stroke:var(--line)}.edge.peering{stroke:var(--aqua);stroke-width:1.5;opacity:.8}.edge.lit{stroke:var(--aqua);stroke-width:2.25;opacity:1;stroke-dasharray:none}.edge.dim{opacity:.1}.node rect{fill:var(--panel);stroke:var(--line-bright);stroke-width:1;rx:2}.node:hover rect{stroke:var(--line-bright);filter:brightness(1.35)}.node.selected rect{stroke:var(--aqua)}.node.lit rect{stroke:var(--aqua);fill:#16232a}.node.dim{opacity:.22}.node{cursor:pointer}.node .n-title{font-family:var(--mono);font-size:11.5px;fill:var(--text-strong)}.node .n-sub{font-family:var(--display);font-size:9px;letter-spacing:.12em;text-transform:uppercase;fill:var(--faint)}.node.tgw rect{fill:var(--panel-2);stroke:var(--line-bright);stroke-width:1.5}.node.tgw .n-title{font-size:12.5px}.node.rtb rect{fill:#121b22}.node.vpc rect{fill:#10171d}.node.external rect{stroke-dasharray:3 3}.node .sev{stroke:none}.region-frame{fill:none;stroke:var(--line);stroke-dasharray:2 5}.region-name{font-family:var(--display);font-size:11px;letter-spacing:.24em;text-transform:uppercase;fill:var(--muted)}.col-label{font-family:var(--display);font-size:9px;letter-spacing:.18em;text-transform:uppercase;fill:var(--faint)}.spine{stroke:var(--line-bright);stroke-width:1;stroke-dasharray:1 6}.spine-label{font-family:var(--display);font-size:9px;letter-spacing:.2em;text-transform:uppercase;fill:var(--faint)}.rail{display:grid;grid-template-rows:auto 1fr;border-left:1px solid var(--line);background:var(--panel);min-height:0}.tabs{display:flex;border-bottom:1px solid var(--line)}.tabs button{flex:1;padding:11px 8px;font-family:var(--display);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);border-bottom:1px solid transparent;margin-bottom:-1px}.tabs button.on{color:var(--text-strong);border-bottom-color:var(--aqua)}.tabs button:hover{color:var(--text)}.tabs .count{font-family:var(--mono);font-size:10px;letter-spacing:0;color:var(--faint);margin-left:5px}.rail-body{overflow-y:auto;min-height:0}.rail-body::-webkit-scrollbar{width:9px}.rail-body::-webkit-scrollbar-thumb{background:var(--line-bright);border-radius:0}.empty{padding:40px 22px;color:var(--muted);text-align:center}.empty p{margin:8px 0 0;font-size:12px}.filters{display:flex;flex-wrap:wrap;gap:5px;padding:10px 12px;border-bottom:1px solid var(--line)}.filters button{font-family:var(--mono);font-size:10.5px;padding:3px 8px;border:1px solid var(--line);border-radius:2px;color:var(--muted)}.filters button.on{border-color:var(--line-bright);color:var(--text-strong);background:var(--panel-2)}.finding{display:block;width:100%;text-align:left;padding:13px 14px 13px 16px;border-bottom:1px solid var(--line);border-left:2px solid transparent;transition:background .12s}.finding:hover{background:var(--panel-2)}.finding.on{background:var(--panel-2);border-left-color:var(--aqua)}.finding-head{display:flex;align-items:baseline;gap:9px}.finding h3{margin:0;font-family:var(--body);font-size:12.5px;font-weight:600;color:var(--text-strong);line-height:1.35}.sev-dot{width:7px;height:7px;border-radius:50%;flex:none;transform:translateY(-1px)}.finding .cat{font-family:var(--display);font-size:9px;letter-spacing:.14em;text-transform:uppercase;color:var(--faint);margin-top:5px}.finding p{margin:6px 0 0;font-size:12px;color:var(--muted)}.finding .fix{margin-top:8px;padding-left:9px;border-left:1px solid var(--line-bright);font-size:11.5px;color:var(--text)}.ids{margin-top:7px;display:flex;flex-wrap:wrap;gap:5px}.ids code{font-family:var(--mono);font-size:10px;padding:1px 5px;border:1px solid var(--line);color:var(--muted);border-radius:2px}.trace-form{padding:12px 14px;border-bottom:1px solid var(--line)}.trace-row{display:grid;grid-template-columns:1fr 1fr;gap:8px}.trace-row.thirds{grid-template-columns:1fr 1fr 1fr}.field{display:grid;gap:4px;margin-bottom:8px}.field input,.field select{font-family:var(--mono);font-size:12px;padding:6px 8px;background:var(--ink);border:1px solid var(--line-bright);border-radius:2px;color:var(--text-strong)}.field input:focus,.field select:focus{border-color:var(--aqua);outline:none}.verdict{display:flex;align-items:baseline;gap:10px;padding:12px 14px;border-bottom:1px solid var(--line)}.verdict .tag{font-family:var(--display);font-size:11px;letter-spacing:.18em;text-transform:uppercase;padding:3px 9px;border:1px solid currentColor;border-radius:2px}.verdict p{margin:0;font-size:12px;color:var(--muted);flex:1}.v-ok{color:var(--aqua)}.v-asymmetric{color:var(--amber)}.v-one-way{color:var(--rose)}.v-blocked{color:var(--yellow)}.v-broken{color:var(--rose)}.tracks{display:grid;grid-template-columns:1fr 24px 1fr;align-items:stretch;padding-bottom:16px}.track-title{padding:14px 14px 8px}.track-title.right{text-align:right}.hop{position:relative;padding:8px 12px;min-height:34px}.hop.left{border-left:1px solid var(--line);margin-left:15px}.hop.right{border-right:1px solid var(--line);margin-right:15px;text-align:right}.hop.empty-hop{border-color:transparent}.hop.left:before,.hop.right:before{content:"";position:absolute;top:13px;width:6px;height:6px;border-radius:50%;background:var(--faint)}.hop.left:before{left:-3.5px}.hop.right:before{right:-3.5px}.hop.ok:before{background:var(--aqua)}.hop.warn:before{background:var(--amber)}.hop.drop:before{background:var(--rose)}.hop.info:before{background:var(--slate)}.hop .h-kind{font-family:var(--display);font-size:8.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--faint)}.hop .h-title{font-family:var(--mono);font-size:11.5px;color:var(--text-strong);margin-top:2px;word-break:break-word}.hop .h-detail{font-size:11px;color:var(--muted);margin-top:3px}.hop.drop .h-title{color:var(--rose)}.hop.warn .h-title{color:var(--amber)}.hop .h-route{margin-top:4px;font-family:var(--mono);font-size:10.5px;color:var(--aqua)}.divergence{display:grid;place-items:center;font-family:var(--mono);font-size:12px;color:var(--faint)}.divergence.on{color:var(--amber)}.checks{padding:4px 14px 18px}.check{display:grid;grid-template-columns:10px 1fr auto;gap:9px;align-items:baseline;padding:8px 0;border-bottom:1px solid var(--line)}.check:last-child{border-bottom:none}.check i{width:7px;height:7px;border-radius:50%;background:var(--aqua);display:block;transform:translateY(3px)}.check.bad i{background:var(--rose)}.check .c-label{font-size:12px;color:var(--text)}.check .c-note{font-size:11px;color:var(--muted);margin-top:2px}.check .c-ports{font-family:var(--mono);font-size:10.5px;color:var(--muted)}.check.bad .c-ports{color:var(--rose)}.detail-block{padding:12px 14px;border-bottom:1px solid var(--line)}.detail-block h4{margin:0 0 8px;font-family:var(--display);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-weight:600}.kv{display:grid;grid-template-columns:108px 1fr;gap:4px 10px}.kv dt{font-family:var(--display);font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--faint);padding-top:2px}.kv dd{margin:0;font-family:var(--mono);font-size:11.5px;color:var(--text-strong);word-break:break-all}table.routes{width:100%;border-collapse:collapse;font-family:var(--mono);font-size:11px}table.routes th{text-align:left;font-family:var(--display);font-size:9px;letter-spacing:.14em;text-transform:uppercase;color:var(--faint);font-weight:600;padding:0 8px 6px 0;border-bottom:1px solid var(--line)}table.routes td{padding:4px 8px 4px 0;border-bottom:1px solid var(--line);color:var(--text)}table.routes tr.blackhole td{color:var(--rose)}table.routes tr:hover td{background:var(--panel-2)}table.routes .t-static{color:var(--aqua)}table.routes .t-prop{color:var(--faint)}.login{height:100%;display:grid;place-items:center;background:radial-gradient(circle at 50% 45%,rgba(59,201,196,.06),transparent 55%),var(--ink)}.login form{width:320px;padding:28px;border:1px solid var(--line);background:var(--panel);border-radius:2px}.login .brand{display:block;margin-bottom:4px}.login .tagline{color:var(--muted);font-size:12px;margin:0 0 20px}.login .btn{width:100%;margin-top:6px}.error{color:var(--rose);font-size:12px;margin:10px 0 0}.progress{position:absolute;inset:0;display:grid;place-items:center;background:#0c1116db;z-index:5}.progress-inner{text-align:center}.progress .stage{font-family:var(--mono);font-size:12px;color:var(--aqua)}.progress .detail{font-family:var(--mono);font-size:11px;color:var(--muted);margin-top:6px}.scanner{width:220px;height:1px;margin:18px auto 0;background:var(--line-bright);position:relative;overflow:hidden}.scanner:after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,var(--aqua),transparent);animation:sweep 1.4s linear infinite}@keyframes sweep{0%{transform:translate(-100%)}to{transform:translate(100%)}}@media(prefers-reduced-motion:reduce){.scanner:after{animation:none;opacity:.5}*{transition-duration:1ms!important}}@media(max-width:1100px){:root{--rail: 340px}}@media(max-width:860px){.body{grid-template-columns:1fr;grid-template-rows:45% 1fr}.rail{border-left:none;border-top:1px solid var(--line)}}.target{width:460px;max-width:calc(100vw - 40px);padding:30px 32px;border:1px solid var(--line);background:var(--panel);border-radius:2px}.target.standalone{width:500px}.target .brand{display:block;margin-bottom:6px}.target .tagline{color:var(--muted);font-size:12.5px;margin:0 0 24px;max-width:40ch}.target-row{display:grid;grid-template-columns:1.6fr 1fr;gap:10px;align-items:end}.target-row:has(.drop){grid-template-columns:1.6fr 1fr 26px}.target-row .drop{height:30px;color:var(--faint);font-size:16px;margin-bottom:8px}.target-row .drop:hover{color:var(--rose)}.target-actions{display:flex;align-items:center;justify-content:space-between;gap:14px;margin:4px 0 20px;flex-wrap:wrap}.linkish{font-family:var(--display);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--aqua)}.linkish:hover{text-decoration:underline}.toggle{display:inline-flex;align-items:center;gap:7px;font-size:11.5px;color:var(--muted);cursor:pointer}.toggle input{accent-color:var(--aqua)}.target-submit{display:flex;gap:8px;justify-content:flex-end}.target-submit .btn{min-width:110px}.progress .target{box-shadow:0 24px 60px #00000080}.legend .legend-head{margin-top:2px}.legend .legend-head:not(:first-child){margin-top:8px}.legend .swatch{width:20px;height:3px;display:block;border-radius:1px}.finding .examples{margin-top:8px;display:flex;flex-wrap:wrap;gap:5px;align-items:center}.finding .examples .label{width:100%;margin-bottom:1px}.finding .examples code{font-family:var(--mono);font-size:10px;padding:1px 5px;border:1px solid var(--line);color:var(--muted);border-radius:2px}.flow{pointer-events:none}.flow-line{fill:none;stroke-width:2.5;opacity:.22}.flow-march{fill:none;stroke-width:2.5;stroke-dasharray:7 13;animation:march var(--march-dur, 2.6s) linear infinite}.flow-packet{filter:drop-shadow(0 0 5px currentColor)}.flow.forward .flow-line,.flow.forward .flow-march{stroke:var(--aqua)}.flow.forward .flow-packet{fill:var(--aqua);color:var(--aqua)}.flow.reverse .flow-line,.flow.reverse .flow-march{stroke:var(--amber)}.flow.reverse .flow-packet{fill:var(--amber);color:var(--amber)}@keyframes march{to{stroke-dashoffset:-20}}.legend .count{margin-left:auto;color:var(--faint);padding-left:10px}.legend .flow-key{height:3px}.legend .flow-key.forward{background:var(--aqua)}.legend .flow-key.reverse{background:var(--amber)}@media(prefers-reduced-motion:reduce){.flow-march{animation:none;stroke-dasharray:none;opacity:.9}.flow-packet{display:none}}.flow-banner{position:absolute;top:14px;left:14px;z-index:4;display:flex;align-items:center;gap:10px;padding:7px 10px 7px 12px;border:1px solid var(--line-bright);background:#131a21f0;border-radius:2px}.flow-banner code{font-family:var(--mono);font-size:11.5px;color:var(--text-strong)}.flow-banner .tag{font-family:var(--display);font-size:9px;letter-spacing:.16em;text-transform:uppercase;padding:2px 7px;border:1px solid currentColor;border-radius:2px}.flow-banner button{color:var(--faint);font-size:15px;line-height:1;padding:0 2px}.flow-banner button:hover{color:var(--rose)}.node.dim{opacity:.38}.edge.dim{opacity:.16}.diverge{pointer-events:none}.diverge rect{fill:none;stroke:var(--amber);stroke-width:1.5;stroke-dasharray:4 3;rx:4;animation:breathe 2.8s ease-in-out infinite}.diverge text{font-family:var(--display);font-size:12px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;fill:var(--amber);paint-order:stroke;stroke:var(--ink);stroke-width:3px;stroke-linejoin:round}@keyframes breathe{0%,to{opacity:.45}50%{opacity:1}}@media(prefers-reduced-motion:reduce){.diverge rect{animation:none;opacity:.9}}
