:root{color-scheme:dark;--bg:#070c0a;--panel:#101914;--edge:#294436;--mint:#9af6a9;--yellow:#f6d35d;--red:#fa776a;--muted:#7d9d8c}*{box-sizing:border-box}body{margin:0;background:linear-gradient(90deg,#ffffff02 1px,transparent 1px),repeating-linear-gradient(0deg,transparent 0 3px,#ffffff02 4px),var(--bg);background-size:32px 32px,auto;color:#e3f1e4;font:13px 'Consolas','Courier New',monospace}button,select{font:inherit}button{cursor:pointer}button:focus-visible,select:focus-visible,.train-dot:focus-visible,.station:focus-visible{outline:2px solid #fff;outline-offset:3px}.mast{display:flex;justify-content:space-between;gap:20px;align-items:center;padding:24px clamp(16px,3vw,48px);border-bottom:1px solid var(--edge);background:linear-gradient(110deg,#112018,#080e0a)}.eyebrow,.sub{font-size:10px;letter-spacing:.17em;color:var(--muted)}h1{margin:8px 0;color:var(--mint);font-size:clamp(25px,3.8vw,48px);letter-spacing:.06em;text-shadow:0 0 26px #76ff8230}h1 span{color:var(--yellow)}.edition{color:var(--yellow);margin-left:15px}.clockbox{text-align:right;white-space:nowrap}#clock{font-size:28px;color:var(--yellow)}.status-text{margin-top:6px;font-size:10px;color:var(--mint)}.ticker{display:flex;gap:20px;padding:12px clamp(16px,3vw,48px);background:#252012;border-bottom:1px solid #4b4227;color:var(--yellow);font-size:11px;letter-spacing:.05em}.flash{font-weight:bold;white-space:nowrap}.metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--edge);border-bottom:1px solid var(--edge)}.metrics>div{padding:15px 25px;background:#0d1711;display:flex;flex-direction:column;gap:5px}.metrics small{font-size:10px;color:var(--muted);letter-spacing:.1em}.metrics strong{font-size:clamp(19px,2vw,29px);color:var(--mint);font-weight:500}.metrics span{color:var(--muted);font-size:10px}.layout{display:grid;grid-template-columns:minmax(0,1fr) 365px;gap:14px;padding:14px;max-width:1900px;margin:auto;align-items:start}.map-panel,.side-panel{background:#0d1610;border:1px solid var(--edge);box-shadow:inset 0 0 40px #0006}.panel-heading{padding:16px;display:flex;justify-content:space-between;align-items:center;gap:12px;border-bottom:1px solid var(--edge);font-weight:bold;letter-spacing:.08em}.panel-heading small{display:block;font-size:9px;color:var(--muted);margin-top:6px}.index,h2 span{color:var(--yellow)}.map-tools{display:flex;gap:8px}.map-tools button,.tiny{padding:8px;border:1px solid #42644b;background:#17251a;color:var(--mint);font-size:10px;white-space:nowrap}.map-tools button:hover,.tiny:hover,.wide:hover{background:#25422c}.map-viewport{overflow:auto;position:relative;background:radial-gradient(ellipse at 45% 40%,#172a1b 0%,#080f0b 72%);height: min(75vh,800px);min-height:560px}.map-viewport:after{content:'';position:absolute;inset:0;pointer-events:none;background:repeating-linear-gradient(0deg,transparent 0 5px,#ffffff04 6px)}#network{width:100%;height:100%;min-width:900px;min-height:650px}.track{fill:none;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;opacity:.85}.station{fill:#09100b;stroke:#bbd5c0;stroke-width:1.5;cursor:pointer}.station:hover,.station.active{fill:#fff;stroke:var(--yellow);stroke-width:3}.station-label{fill:#8ba994;font-size:10px;pointer-events:none}.train-dot{cursor:pointer;filter:drop-shadow(0 0 5px #f9f0a2)}.train-dot circle{fill:var(--yellow);stroke:#111;stroke-width:2}.train-dot text{fill:#050a07;font-size:10px;font-weight:bold;pointer-events:none}.train-dot.active circle{fill:#fff;stroke:var(--yellow);stroke-width:4}.route-glow{fill:none;stroke:#fff;stroke-width:10;opacity:.15;stroke-dasharray:6 9;pointer-events:none}.route-stop{fill:#fff;stroke:var(--yellow);stroke-width:2;pointer-events:none}.map-foot{display:flex;gap:18px;flex-wrap:wrap;padding:14px;color:var(--muted);font-size:10px;border-top:1px solid var(--edge)}.key{display:inline-block;width:11px;height:11px;border-radius:50%;margin-right:5px;background:var(--yellow)}.key.green{background:var(--mint)}.key.marker{background:#fff}.sidebar{display:flex;flex-direction:column;gap:14px}.side-panel h2{margin:0;padding:15px;border-bottom:1px solid var(--edge);font-size:12px;letter-spacing:.09em;display:flex;align-items:center;justify-content:space-between}.pad{padding:16px}.pad label{display:block;color:var(--muted);font-size:10px;margin-bottom:8px}.pad select,.wide{width:100%;padding:11px;background:#09120c;border:1px solid #45654c;color:#e5ffe7}.wide{color:var(--mint)}.dim{color:var(--muted);line-height:1.6}.departures{padding:0 16px 16px;max-height:420px;overflow:auto}.platform{margin:14px 0 6px;font-size:10px;color:var(--yellow);letter-spacing:.1em}.departure{width:100%;display:flex;justify-content:space-between;gap:8px;text-align:left;background:#132117;border:1px solid #294331;color:#e5f3e7;padding:11px;margin:6px 0}.departure:hover{border-color:var(--yellow)}.departure small{display:block;color:var(--muted);margin-top:5px}.due{color:var(--yellow);white-space:nowrap}.delay{color:var(--red);font-size:10px}.train-title{font-size:20px;color:var(--yellow);margin:0 0 8px}.train-status{font-size:11px;color:var(--muted);line-height:1.6}.stops{list-style:none;padding:0;margin:12px 0;max-height:300px;overflow:auto}.stops li{padding:9px 0;border-bottom:1px solid var(--edge);display:flex;justify-content:space-between;gap:8px}.stops li.next{color:var(--yellow)}.side-panel a{display:block;color:var(--mint);margin:13px 0;text-decoration:none}.side-panel a:hover{text-decoration:underline}footer{text-align:center;padding:26px;color:var(--muted);font-size:10px;line-height:2}footer a{color:inherit}@media(max-width:1050px){.layout{grid-template-columns:1fr}.sidebar{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}.sidebar .side-panel:last-child{grid-column:1/-1}}@media(max-width:650px){.mast{align-items:flex-start;flex-direction:column}.clockbox{text-align:left}.metrics{grid-template-columns:repeat(2,1fr)}.sidebar{display:flex}.panel-heading{flex-direction:column;align-items:flex-start}.map-viewport{height:600px}.ticker{flex-direction:column;gap:5px}.edition{display:block;margin:5px 0}}

/* v0.08: single-screen desktop control room; scrolling stays within data panels. */
@media (min-width:1051px) {
 html,body{height:100%;overflow:hidden}
 body{display:flex;flex-direction:column;min-height:0}
 .mast{flex:0 0 auto;padding:10px 20px}
 h1{font-size:clamp(23px,2.6vw,35px);margin:3px 0}
 #clock{font-size:22px}
 .ticker{flex:0 0 auto;padding:7px 20px}
 .metrics{flex:0 0 auto}
 .metrics>div{padding:8px 17px;gap:2px}
 .metrics strong{font-size:clamp(18px,1.6vw,24px)}
 .layout{flex:1 1 0;min-height:0;width:100%;max-width:none;align-items:stretch;padding:8px;gap:8px;grid-template-columns:minmax(0,1fr) minmax(315px,350px)}
 .map-panel{display:flex;flex-direction:column;min-height:0;min-width:0}
 .panel-heading{flex:0 0 auto;padding:9px 12px}
 .map-viewport{flex:1 1 0;height:auto;min-height:0;overflow:hidden}
 #network{width:100%;height:100%;min-width:0;min-height:0}
 .map-foot{flex:0 0 auto;padding:7px 10px;gap:10px;font-size:9px}
 .sidebar{min-height:0;overflow-y:auto;overscroll-behavior:contain;gap:8px;scrollbar-width:thin}
 .side-panel{flex:0 0 auto}
 .side-panel h2{padding:10px}
 .pad{padding:10px}
 .departures{max-height:clamp(130px,25vh,290px);overflow-y:auto;padding:0 10px 10px}
 .stops{max-height:clamp(100px,22vh,240px)}
 .departure{padding:7px;margin:4px 0}
 footer{flex:0 0 auto;padding:5px 10px;font-size:9px;line-height:1.35}
}
/* Narrow screens retain ordinary page scrolling so content remains accessible. */

/* v0.09 collapsible surveillance drawer */
.sidebar{position:relative;min-width:0}
.sidebar-content{min-width:0;display:flex;flex-direction:column;gap:8px}
.sidebar-rail{display:flex;justify-content:flex-end;align-items:center;gap:8px}
#sidebar-toggle{border:1px solid #42644b;background:#17251a;color:var(--mint);padding:8px 10px;font-size:10px;letter-spacing:.06em;white-space:nowrap}
#sidebar-toggle:hover{background:#25422c}
.rail-label{display:none}
@media(min-width:1051px){
 .layout{transition:grid-template-columns .28s ease;grid-template-columns:minmax(0,1fr) minmax(315px,350px)}
 .sidebar{display:flex;flex-direction:column;overflow-y:auto;overflow-x:hidden}
 .sidebar-content{flex:0 0 auto}
 .sidebar-rail{position:sticky;top:0;z-index:5;background:#0d1610;padding:0 0 6px}
 .sidebar-collapsed .layout{grid-template-columns:minmax(0,1fr) 46px}
 .sidebar-collapsed .sidebar{overflow:hidden;align-items:stretch}
 .sidebar-collapsed .sidebar-content{display:none}
 .sidebar-collapsed .sidebar-rail{height:100%;padding:0;display:flex;flex-direction:column;justify-content:flex-start;gap:20px}
 .sidebar-collapsed #sidebar-toggle{width:100%;padding:12px 0}
 .sidebar-collapsed #sidebar-toggle span{display:none}
 .sidebar-collapsed .rail-label{display:block;writing-mode:vertical-rl;letter-spacing:.18em;color:var(--muted);font-size:10px}
 /* A single sidebar scrollbar instead of scrollbars within departure/stop lists */
 .departures,.stops{max-height:none;overflow:visible}
}
@media(max-width:1050px){.sidebar-rail{justify-content:flex-start;padding:8px}.sidebar-collapsed .sidebar-content{display:none}.sidebar-collapsed .sidebar-rail{justify-content:flex-start}}
@media(prefers-reduced-motion:reduce){.layout{transition:none}}

/* v0.10 schematic readability */
.station-label{font-size:12px;paint-order:stroke;stroke:#08130c;stroke-width:3px;stroke-linejoin:round;fill:#b9d8c2}
.station{stroke-width:2}
.train-dot circle{stroke-width:2.5}

/* v0.11 — collision-free train marker clusters and route-safe pursuit */
.train-dot{transition:opacity .2s ease;filter:drop-shadow(0 0 4px #f9e88a)}
.train-dot.subdued{opacity:.27}
.train-dot.subdued:hover,.train-dot.subdued:focus-visible{opacity:1}
.train-dot.active{opacity:1;filter:drop-shadow(0 0 9px #fff0a0)}
.train-dot.active circle{stroke:#fff;stroke-width:3}
.train-tether{stroke:var(--yellow);stroke-width:1;stroke-dasharray:2 3;opacity:.55;pointer-events:none}
.route-segment{stroke:#fff6ac;stroke-width:9;stroke-opacity:.23;stroke-linecap:round;pointer-events:none}

/* v0.12 map camera controls */
.map-viewport{touch-action:none}
.zoom-tools{position:absolute;z-index:8;top:12px;left:12px;display:flex;gap:5px;align-items:center;background:#08120de8;border:1px solid #35533d;padding:5px;box-shadow:0 5px 20px #0008}
.zoom-tools button{min-width:30px;min-height:30px;border:1px solid #42644b;background:#17251a;color:var(--mint);font-size:13px;font-weight:bold;padding:5px 8px}
.zoom-tools button:hover{background:#25422c;border-color:var(--yellow)}
#zoom-level{font-size:10px;color:var(--yellow);min-width:38px;text-align:center}
#network{cursor:grab;user-select:none}
#network.is-panning{cursor:grabbing}
.train-dot:hover circle{stroke:#fff;stroke-width:3;filter:drop-shadow(0 0 7px #fff)}
.train-dot:hover text{font-weight:900}
@media(max-width:650px){.zoom-tools{top:7px;left:7px}.zoom-tools button{min-height:34px}}

/* v0.13 — floating pursuit and observed-train directory */
.floating-pursuit[hidden]{display:none!important}.floating-pursuit{position:absolute;right:12px;top:12px;z-index:8;width:min(335px,calc(100% - 24px));padding:12px;background:#0b1912f5;border:1px solid #78d894;box-shadow:0 6px 32px #000b,0 0 20px #66ef8c18;font-size:11px;line-height:1.6;pointer-events:auto}.float-head{display:flex;align-items:center;justify-content:space-between;color:var(--yellow);font-size:13px}.float-head button,.float-actions button{background:#17271b;border:1px solid #47684e;color:var(--mint);padding:5px 9px;cursor:pointer}.floating-pursuit small{display:block;color:var(--muted);margin-top:5px}.float-actions{display:flex;gap:7px;margin-top:10px}.pursuit-controls{border-bottom:1px solid var(--edge)}.pursuit-controls label{display:flex;align-items:center;gap:8px;color:var(--mint);cursor:pointer}.pursuit-controls input{accent-color:#9af6a9}.history-title{color:var(--yellow);font-size:10px;margin:10px 0}.movement-history{list-style:none;margin:0;padding:0}.movement-history li{padding:5px 0;border-bottom:1px solid var(--edge);font-size:10px}.side-panel h2 small{font-size:9px;color:var(--muted)}#train-search{width:100%;padding:9px;border:1px solid #45654c;background:#09120c;color:#e5ffe7}.train-directory{margin-top:8px;display:grid;gap:4px}.directory-train{width:100%;text-align:left;background:#132117;color:#e5f3e7;border:1px solid #294331;padding:7px;cursor:pointer}.directory-train:hover,.directory-train.selected{border-color:var(--yellow)}.directory-train strong{display:block;font-size:11px}.directory-train small{display:block;margin-top:4px;color:var(--muted);font-size:10px}

/* v0.14 pursuit zoom and status */
#pursuit-event{color:#9af6a9;margin:7px 0}#pursuit-next{color:#f6d35d;margin:7px 0}

/* Build 018: evidence-level colour coding; no additional controls. */
#float-next[data-confidence="live-prediction"],#pursuit-next[data-confidence="live-prediction"]{color:#80efa6}
#float-next[data-confidence="route-estimate"],#pursuit-next[data-confidence="route-estimate"]{color:#f6d35d}
#float-next[data-confidence="unconfirmed"],#pursuit-next[data-confidence="unconfirmed"]{color:#a2afa9}
#float-next[data-confidence]::before,#pursuit-next[data-confidence]::before{content:'● ';font-size:.9em}

/* v0.20: observations are not treated as live if stale or contradictory. */

/* v0.21 scan validation: restrained evidence colours */
.evidence-status,.directory-evidence{font-size:10px;line-height:1.5;color:#a2afa9}
[data-evidence="progress"],[data-evidence="same-station"]{color:#80efa6!important}
[data-evidence="change"],[data-evidence="jump"]{color:#f6d35d!important}
[data-evidence="conflict"],[data-evidence="stale"]{color:#fa776a!important}
[data-evidence="unchanged"],[data-evidence="pending"],[data-evidence="unknown"]{color:#a2afa9!important}
