:root{--bg:#f6f7f9;--card:#fff;--text:#1a1f2c;--muted:#6b7280;--border:#e5e7eb;--accent:#2563eb;--ok:#16a34a;--warn:#d97706;--err:#dc2626;--r:#ef4444;--y:#eab308;--b:#3b82f6;--total:#334155;--radius:10px;--shadow:0 1px 2px #0000000a, 0 2px 8px #0000000a;font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}*{box-sizing:border-box}html,body{background:var(--bg);color:var(--text);margin:0;padding:0}.topbar{z-index:5;border-bottom:1px solid var(--border);background:#fff;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px;padding:12px 20px;display:grid;position:sticky;top:0}.topbar>.brand{justify-self:start}.topbar>.conn{justify-self:end}.proto-bar{color:#4338ca;letter-spacing:.02em;white-space:nowrap;background:#eef2ff;border-radius:999px;justify-self:center;padding:4px 12px;font-size:12px}.proto-bar strong{color:#1e1b4b;font-weight:600}.brand{align-items:center;gap:10px;display:flex}.brand h1{margin:0;font-size:18px;font-weight:600}.dot{background:var(--muted);border-radius:50%;width:10px;height:10px;display:inline-block}.dot.ok{background:var(--ok);box-shadow:0 0 0 4px #16a34a26}.dot.err{background:var(--err);box-shadow:0 0 0 4px #dc262626}.dot.pending{background:var(--warn);animation:1s ease-in-out infinite pulse}@keyframes pulse{0%,to{box-shadow:0 0 #d9770673}50%{box-shadow:0 0 0 6px #d9770600}}.status-text{color:var(--muted);background:#f3f4f6;border-radius:10px;margin-left:4px;padding:2px 8px;font-size:12px}.status-text.ok{color:var(--ok);background:#16a34a1a}.status-text.err{color:var(--err);background:#dc26261a}.status-text.pending{color:var(--warn);background:#d977061a}.conn{flex-wrap:wrap;align-items:end;gap:10px;display:flex}.conn label{color:var(--muted);flex-direction:column;gap:2px;font-size:11px;display:flex}.conn input,.conn select{font:inherit;border:1px solid var(--border);background:#fff;border-radius:8px;padding:6px 8px}.conn input{width:80px}button{font:inherit;border:1px solid var(--border);cursor:pointer;background:#fff;border-radius:8px;padding:7px 14px}button.primary{background:var(--accent);color:#fff;border-color:var(--accent)}button:disabled{opacity:.5;cursor:not-allowed}main{gap:20px;max-width:1280px;margin:0 auto;padding:20px;display:grid}.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px 20px}.card h2{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin:0 0 14px;font-size:14px;font-weight:600}.card.collapsed>div,.card.collapsed>.grid{display:none}.card .toggle{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;align-items:center;gap:8px;margin:-4px -6px 10px;padding:4px 6px;transition:background .15s;display:flex}.card .toggle:hover{background:#f3f4f6}.card .toggle .caret{color:var(--muted);font-size:14px;transition:transform .15s;display:inline-block}.card:not(.collapsed)>.toggle .caret{transform:rotate(90deg)}.card .toggle .hint{color:var(--muted);text-transform:none;letter-spacing:0;margin-left:auto;font-size:11px;font-weight:400}.card:not(.collapsed)>.toggle .hint:before{content:"click to collapse"}.card:not(.collapsed)>.toggle .hint{font-size:0}.card:not(.collapsed)>.toggle .hint:before{font-size:11px}.grid{gap:12px;display:grid}.grid-3{grid-template-columns:repeat(auto-fill,minmax(180px,1fr))}.tile{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);flex-direction:column;gap:4px;padding:12px 14px;display:flex}.tile .label{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-size:11px}.tile .value{font-variant-numeric:tabular-nums;font-size:22px;font-weight:600}.tile .unit{color:var(--muted);margin-left:4px;font-size:12px;font-weight:400}.tile.phase-r{border-color:var(--r)}.tile.phase-y{border-color:var(--y)}.tile.phase-b{border-color:var(--b)}.tile.total{border-color:var(--total)}.relays-strip{flex-wrap:wrap;gap:8px;display:flex}.relay-pip{width:36px;height:36px;color:var(--muted);font-variant-numeric:tabular-nums;background:#f3f4f6;border:1.5px solid #cbd5e1;border-radius:50%;justify-content:center;align-items:center;font:600 13px ui-sans-serif,system-ui,sans-serif;transition:background .15s,border-color .15s,color .15s,box-shadow .15s;display:inline-flex}.relay-pip.on{border-color:var(--ok);color:var(--ok);background:#16a34a26;box-shadow:0 0 0 3px #16a34a1f}.relay-pip.stale{opacity:.45}.phase-summary{gap:10px;display:grid}.phase-row{border:1px solid var(--border);border-radius:var(--radius);background:#fff;grid-template-columns:56px repeat(4,1fr);align-items:stretch;gap:8px;display:grid;overflow:hidden}.phase-row .phase-tag{color:#fff;letter-spacing:.04em;justify-content:center;align-items:center;font-size:16px;font-weight:700;display:flex}.phase-row.phase-r .phase-tag{background:var(--r)}.phase-row.phase-y .phase-tag{background:var(--y);color:#1a1f2c}.phase-row.phase-b .phase-tag{background:var(--b)}.phase-row .metric{border-left:1px solid var(--border);flex-direction:column;justify-content:center;padding:8px 12px;display:flex}.phase-row .m-label{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-size:10px}.phase-row .m-val{font-variant-numeric:tabular-nums;font-size:18px;font-weight:600}.phase-row .m-val .m-unit{color:var(--muted);margin-left:3px;font-size:11px;font-weight:400}.phase-row.stale{opacity:.45}.phase-row.stale .m-val{-webkit-text-decoration:line-through #00000059;text-decoration:line-through #00000059}@media (max-width:600px){.phase-row{grid-template-columns:44px repeat(2,1fr)}.phase-row .metric:nth-child(2){border-left:1px solid var(--border)}.phase-row .metric:nth-child(4),.phase-row .metric:nth-child(5){border-top:1px solid var(--border)}}.flags{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:6px;display:grid}.flag{border-radius:6px;align-items:center;gap:8px;padding:4px 8px;font-size:13px;display:flex}.flag .led{background:#d1d5db;border-radius:50%;flex:none;width:9px;height:9px}.flag.on .led{background:var(--ok);box-shadow:0 0 0 3px #16a34a2e}.flag.alarm.on .led{background:var(--err);box-shadow:0 0 0 3px #dc26262e}.flag .name{color:var(--text)}.flag.alarm.on .name{color:var(--err);font-weight:500}.flag.stale{opacity:.45}.flag.stale .name{-webkit-text-decoration:line-through #00000059;text-decoration:line-through #00000059}.tile.stale{opacity:.45}.tile.stale .num{-webkit-text-decoration:line-through #00000059;text-decoration:line-through #00000059}.tile.unsupported,.flag.unsupported,.relay-pip.unsupported{opacity:.4}.tile.unsupported .num,.flag.unsupported .name{color:var(--muted);font-style:italic;text-decoration:none}.flag.unsupported .led{background:var(--muted);box-shadow:none}.log{color:#e2e8f0;border-radius:var(--radius);background:#0f172a;max-height:160px;padding:10px 14px;font:12px/1.5 ui-monospace,Menlo,Consolas,monospace;overflow:auto}.log pre{white-space:pre-wrap;margin:0}.app-footer{color:var(--muted);border-top:1px solid var(--border);background:#fff;justify-content:center;align-items:center;gap:10px;padding:10px 20px;font-size:12px;display:flex}.app-footer .sep{opacity:.5}.app-footer .company{font-weight:500}.app-footer .version{font-variant-numeric:tabular-nums;letter-spacing:.02em}@media (max-width:900px){.topbar{grid-template-columns:1fr auto}.proto-bar{grid-column:1/-1;justify-self:start}}@media (max-width:600px){.conn{gap:6px}.conn input{width:64px}main{gap:12px;padding:12px}}
