:root{--accent: #6fffab;--accent-soft: #7fc98f;--glow: rgba(80,255,140,.18);--terminal-font: Fixedsys, "Lucida Console", "Courier New", monospace}*{box-sizing:border-box}html,body{margin:0;min-height:100%;background:#020403;font-family:ui-monospace,Consolas,Courier New,monospace}body{min-height:100vh;overflow:hidden;color:#b7c8bd;background:radial-gradient(circle at 28% 48%,var(--glow),transparent 31%),#020403}#app{width:min(1520px,calc(100vw - 48px));margin:0 auto;min-height:100vh;display:grid;grid-template-columns:minmax(560px,1.42fr) minmax(340px,.88fr);align-items:center;gap:clamp(18px,2.2vw,36px)}#viewport{position:relative;width:100%;max-width:936px;justify-self:start;aspect-ratio:3 / 2;overflow:hidden;border:1px solid color-mix(in srgb,var(--accent) 40%,#17231c);background:#000;box-shadow:0 0 70px var(--glow),inset 0 0 0 1px #ffffff06}canvas{position:absolute;inset:0;width:100%;height:100%;background:#000;cursor:crosshair}#fx{position:absolute;inset:0;z-index:4;pointer-events:none;background:repeating-linear-gradient(0deg,rgba(255,255,255,.012) 0,rgba(255,255,255,.012) 1px,transparent 1px,transparent 4px),radial-gradient(ellipse at center,transparent 58%,rgba(0,0,0,.08) 82%,rgba(0,0,0,.28) 100%)}#relay-transfer{position:fixed;inset:0;z-index:120;pointer-events:none;opacity:0;display:flex;align-items:center;justify-content:center;background:#000;color:#69e58c;font-family:var(--terminal-font);font-size:clamp(13px,1.1vw,18px);letter-spacing:.13em;white-space:pre-line;text-align:center;text-shadow:0 0 3px rgba(105,255,145,.9),0 0 18px rgba(47,255,103,.42);transition:opacity .28s ease}#relay-transfer.active{opacity:1}#relay-transfer.resolve-release{transition:none}#relay-transfer:after{content:"";position:absolute;inset:0;opacity:.2;background:repeating-linear-gradient(0deg,rgba(78,255,127,.13) 0,rgba(78,255,127,.13) 1px,transparent 1px,transparent 4px)}#relay-transfer span{position:relative;z-index:1}#dev-fps-counter{position:absolute;z-index:8;top:8px;left:8px;padding:5px 8px;border:1px solid rgba(111,255,171,.5);background:#000804d1;color:#baffc9;font:11px/1.25 Consolas,Courier New,monospace;letter-spacing:.06em;text-shadow:0 0 5px rgba(80,255,140,.32);pointer-events:none}body.intro-active #dev-fps-counter{opacity:0}#prelude-prompt{position:fixed;z-index:90;left:50%;bottom:clamp(26px,5vh,54px);transform:translate(-50%) translateY(8px);opacity:0;pointer-events:none;padding:10px 16px;border:1px solid rgba(255,255,255,.22);background:#040404b8;color:#ffffffeb;font-family:system-ui,-apple-system,Segoe UI,sans-serif;font-size:clamp(12px,1vw,16px);font-weight:500;letter-spacing:.08em;text-transform:uppercase;box-shadow:0 8px 28px #00000073;transition:opacity .18s ease,transform .18s ease}#prelude-prompt.show{opacity:1;transform:translate(-50%) translateY(0)}body.prelude-room{background:#070706}body.prelude-room #viewport{border-color:#b4a59138;box-shadow:0 0 70px #4a37262e,inset 0 0 0 1px #ffffff05}body.prelude-room #fx{background:radial-gradient(ellipse at center,transparent 58%,rgba(0,0,0,.13) 80%,rgba(0,0,0,.42) 100%)}#topo-map-overlay{position:absolute;inset:0;z-index:9;display:none;align-items:stretch;justify-content:stretch;background:#000503}#topo-map-overlay.open{display:flex}#topo-map-shell{position:relative;width:100%;height:100%;border:0;background:#010704;box-shadow:inset 0 0 80px #000000ad,inset 0 0 0 1px #6fffab52;overflow:hidden}#topo-map-canvas{position:absolute;inset:0;width:100%;height:100%;background:#010704;cursor:grab}#topo-map-canvas.dragging{cursor:grabbing}#topo-map-canvas.rotating{cursor:none}body.topo-map-orbiting,body.topo-map-orbiting *{cursor:none!important}#topo-map-hud{position:absolute;left:12px;top:10px;z-index:2;pointer-events:none;white-space:pre;color:#75d990;font:9px/1.42 var(--terminal-font);letter-spacing:.045em;text-shadow:0 0 4px rgba(80,255,140,.48)}#topo-map-hud strong{color:#baffc9;font-weight:400}#topo-map-close{position:absolute;z-index:3;right:10px;top:9px;padding:5px 8px;border:1px solid rgba(111,255,171,.42);background:#000904b3;color:#8aeaa2;font:9px/1 var(--terminal-font);cursor:pointer}#topo-map-close:hover,#topo-map-close:focus-visible{color:#fff;border-color:#6fffabe6;outline:0}#topo-map-scan{position:absolute;inset:0;pointer-events:none;z-index:1;opacity:.44;background:repeating-linear-gradient(0deg,rgba(120,255,160,.028) 0,rgba(120,255,160,.028) 1px,transparent 1px,transparent 4px),radial-gradient(ellipse at center,transparent 48%,rgba(0,0,0,.58) 100%)}#touch-controls[hidden],#touch-pause-menu[hidden],#mobile-hud[hidden],#mobile-context[hidden],#orientation-guide[hidden]{display:none!important}#touch-controls{position:fixed;inset:0;z-index:100;pointer-events:none;color:#d8f7df;font-family:var(--terminal-font);user-select:none;-webkit-user-select:none}body.touch-mode #viewport,body.touch-mode #cv{touch-action:none}.touch-stick{position:absolute;width:clamp(104px,18vw,132px);aspect-ratio:1;border:1px solid rgba(111,255,171,.54);border-radius:50%;background:radial-gradient(circle,#2a71432e,#040c0780);box-shadow:inset 0 0 0 1px #ffffff09,0 0 24px #47ff8224;pointer-events:auto;touch-action:none}.touch-stick:before,.touch-stick:after{content:"";position:absolute;background:#6fffab38;pointer-events:none}.touch-stick:before{width:1px;top:15%;bottom:15%;left:50%}.touch-stick:after{height:1px;left:15%;right:15%;top:50%}.touch-stick-thumb{position:absolute;left:50%;top:50%;width:42%;aspect-ratio:1;border:1px solid rgba(150,255,185,.9);border-radius:50%;background:#56ed852e;box-shadow:0 0 18px #4dff8357;transform:translate(0);margin:-21%;pointer-events:none;will-change:transform}#touch-move{left:max(16px,env(safe-area-inset-left));bottom:max(16px,env(safe-area-inset-bottom))}#touch-look{right:max(16px,env(safe-area-inset-right));bottom:max(16px,env(safe-area-inset-bottom))}.touch-action-cluster{position:absolute;top:max(14px,env(safe-area-inset-top));right:max(14px,env(safe-area-inset-right));display:grid;grid-template-columns:repeat(3,minmax(52px,auto));gap:8px;pointer-events:auto}.touch-action-cluster button,#touch-choice-controls button,#touch-resume{min-width:52px;min-height:52px;border:1px solid rgba(111,255,171,.62);border-radius:4px;padding:8px 10px;background:#051109d1;color:#bdffd1;font:inherit;font-size:11px;letter-spacing:.08em;box-shadow:0 0 16px #40ff7a21;touch-action:manipulation}#touch-layout{grid-column:1 / -1;min-height:34px;padding:6px 10px;color:#ffd9a8;border-color:#ffbe788c;box-shadow:0 0 16px #ffaa5a1f}.touch-action-cluster button:active,#touch-choice-controls button:active,#touch-resume:active{background:#56ed8547;transform:translateY(1px)}.touch-action-cluster button:focus-visible,#touch-choice-controls button:focus-visible,#touch-resume:focus-visible{outline:2px solid #d5ffe1;outline-offset:2px}#touch-choice-controls{position:absolute;left:50%;bottom:max(18px,env(safe-area-inset-bottom));transform:translate(-50%);display:flex;gap:8px;max-width:min(94vw,720px);pointer-events:auto}#touch-choice-controls button{max-width:min(30vw,220px);min-width:72px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#touch-controls.is-paused .touch-stick,#touch-controls.is-paused #touch-action,#touch-controls.is-paused #touch-back,#touch-controls.is-paused #touch-choice-controls,#touch-controls.is-panel-open .touch-stick,#touch-controls.is-panel-open #touch-action,#touch-controls.is-panel-open #touch-back,#touch-controls.is-panel-open #touch-pause,#touch-controls.is-panel-open #touch-choice-controls{opacity:.32;pointer-events:none}#touch-pause-menu{position:fixed;z-index:115;left:50%;top:50%;min-width:min(300px,calc(100vw - 40px));transform:translate(-50%,-50%);padding:24px;border:1px solid rgba(111,255,171,.66);background:#030b06f0;color:#caffd7;text-align:center;font-family:var(--terminal-font);box-shadow:0 0 42px #40ff7a38}#touch-pause-title{font-size:16px;letter-spacing:.12em}#touch-pause-menu p{margin:13px 0 20px;color:#8fca9e;font-size:12px;line-height:1.5}body.touch-mode #prelude-prompt{bottom:max(26px,calc(env(safe-area-inset-bottom) + 14px))}@media(orientation:portrait)and (max-width:980px){.touch-stick{width:clamp(96px,28vw,126px)}.touch-action-cluster{grid-template-columns:repeat(3,minmax(52px,auto))}#touch-pause{grid-column:1 / -1}#touch-choice-controls{bottom:max(154px,calc(env(safe-area-inset-bottom) + 136px))}}body.touch-mode{min-height:100dvh;overflow:hidden}body.touch-mode #app{width:100vw;min-height:100dvh;height:100dvh;margin:0;padding:0;display:block}body.touch-mode #viewport{width:100vw;max-width:none;height:100dvh;aspect-ratio:auto;border:0;box-shadow:none}body.touch-mode #interface{display:none}#mobile-hud,#mobile-context{position:fixed;z-index:75;pointer-events:none;color:#c9fbd7;font-family:var(--terminal-font);border:1px solid rgba(111,255,171,.35);background:#030d07ad;box-shadow:0 0 20px #40ff7a1a;text-shadow:0 0 5px rgba(64,255,122,.22)}#mobile-hud{left:max(14px,env(safe-area-inset-left));top:max(14px,env(safe-area-inset-top));max-width:min(44vw,330px);padding:8px 10px;font-size:10px;line-height:1.45;letter-spacing:.07em}#mobile-hud-zone{color:#b9ffd0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#mobile-hud-bearing{color:#78c98f}#mobile-context{left:50%;bottom:max(156px,calc(env(safe-area-inset-bottom) + 142px));width:min(54vw,430px);max-height:min(140px,calc(100dvh - 210px));transform:translate(-50%);overflow:hidden;padding:9px 12px;text-align:center}#mobile-context-label{color:#77c98f;font-size:9px;letter-spacing:.11em}#mobile-context-title{display:block;margin-top:4px;color:#c8ffd9;font-size:12px;font-weight:400;letter-spacing:.05em}#mobile-context-copy{display:-webkit-box;margin-top:5px;overflow:hidden;color:#91cfa1;font-size:10px;line-height:1.35;-webkit-box-orient:vertical;-webkit-line-clamp:3}#orientation-guide{position:fixed;z-index:110;left:50%;top:50%;width:min(320px,calc(100vw - 36px));transform:translate(-50%,-50%);padding:22px;border:1px solid rgba(111,255,171,.66);background:#030d07f2;color:#c9fbd7;text-align:center;font-family:var(--terminal-font);box-shadow:0 0 42px #40ff7a33}#orientation-guide>div{letter-spacing:.11em;font-size:14px}#orientation-guide p{margin:12px 0 18px;color:#91cfa1;font-size:12px;line-height:1.5}#orientation-continue{min-width:96px;min-height:52px;border:1px solid rgba(111,255,171,.62);border-radius:4px;background:#051109d1;color:#bdffd1;font:inherit;font-size:11px;letter-spacing:.08em}#orientation-continue:focus-visible{outline:2px solid #d5ffe1;outline-offset:2px}@media(orientation:landscape){#mobile-context{bottom:max(16px,env(safe-area-inset-bottom));max-height:min(92px,calc(100dvh - 96px))}#touch-controls.has-context #touch-choice-controls{bottom:max(110px,calc(env(safe-area-inset-bottom) + 96px))}body.touch-mode #orientation-guide{display:none!important}}@media(orientation:portrait)and (max-width:980px){#mobile-context{bottom:max(184px,calc(env(safe-area-inset-bottom) + 168px));width:min(88vw,430px)}}body.touch-mode.touch-panel-open #interface{display:block;position:fixed;z-index:105;left:0;right:0;bottom:0;width:100%;height:min(66dvh,540px);min-height:0;max-height:66dvh;overflow:hidden;padding:14px 18px 16px;border:1px solid rgba(111,255,171,.42);background:#020a05f7;box-shadow:0 -14px 42px #0000008c,0 0 34px #40ff7a29;transform:none}body.touch-mode.touch-panel-open #interface-ascii{display:block}body.touch-mode.touch-panel-open #interface.ascii-ui-active #diagnostics,body.touch-mode.touch-panel-open #interface.ascii-ui-active #context-panel{opacity:0;pointer-events:none}body.touch-mode.touch-panel-open #mobile-hud,body.touch-mode.touch-panel-open #mobile-context{display:none!important}#interface{position:relative;isolation:isolate;height:min(720px,calc(100vh - 96px));min-height:min(720px,calc(100vh - 96px));max-height:min(720px,calc(100vh - 96px));overflow:hidden;padding:48px clamp(22px,2.4vw,38px) 30px;border:0;background:radial-gradient(ellipse at 38% 38%,rgba(26,105,55,.09),transparent 68%);color:#79b989;box-shadow:none;font-family:var(--terminal-font);font-variant-ligatures:none;-webkit-font-smoothing:antialiased;text-rendering:auto;text-shadow:0 0 4px rgba(72,255,128,.3)}#interface{transition:opacity .82s ease,transform .82s cubic-bezier(.2,.75,.2,1)}#interface-ascii{position:absolute!important;inset:0!important;width:100%!important;height:100%!important;z-index:3;pointer-events:none;background:transparent;image-rendering:pixelated;transform:none!important;filter:none!important}#interface.ascii-ui-active #diagnostics,#interface.ascii-ui-active #context-panel{opacity:0;pointer-events:none}body.intro-active #interface{opacity:0;transform:translateY(5px);pointer-events:none}#interface>*{position:relative;z-index:1;filter:none}#interface:before,#interface:after{content:"";position:absolute;inset:0;pointer-events:none}#interface:before{display:none}#interface:after{z-index:2;opacity:.72;background:radial-gradient(ellipse at 42% 42%,transparent 46%,rgba(0,0,0,.22) 76%,rgba(0,0,0,.68) 100%);box-shadow:inset 0 0 58px #000000b8}.module-label{display:block;margin-bottom:12px;color:#58ad73;font-size:10px;letter-spacing:.12em;text-transform:uppercase;white-space:nowrap;overflow:hidden;opacity:.82}.module-label:before{content:">> ";color:#82e69c}.module-label:after{content:""}.readout-grid{display:grid;grid-template-columns:1fr;gap:5px;margin:0}.readout-grid div{display:grid;grid-template-columns:minmax(104px,.9fr) 1.15fr;align-items:baseline;min-width:0}.readout-grid dt{margin:0;color:#477b57;font-size:9px;letter-spacing:.05em;text-transform:uppercase}.readout-grid dt:before{content:""}.readout-grid dt:after{content:":";color:#396847}.readout-grid dd{margin:0;color:#83b990;font-size:11px;letter-spacing:.02em;white-space:nowrap}.readout-grid dd:before{content:" "}.readout-grid dd.accent{color:var(--accent)}#context-panel{min-height:220px;padding:clamp(76px,12vh,132px) clamp(2px,1vw,12px) 0;text-align:left}#context-panel[hidden]{display:none}#context-panel .module-label{margin-bottom:31px}.empty-bay{position:relative;min-height:160px;padding:0;border:0;background:none}.empty-bay:before,.empty-bay:after{content:none}.empty-bay>div{width:100%}.empty-bay strong{display:block;color:#69e58c;font-size:clamp(15px,1.15vw,18px);font-weight:400;letter-spacing:.035em;line-height:1.45;text-transform:none;text-shadow:0 0 2px rgba(105,255,145,.75),0 0 9px rgba(47,255,103,.32)}.empty-bay strong:before{content:"CITY://LOCAL> ";color:#3c8051}.empty-bay strong:after{content:" \2588";color:#65d983;animation:cursor-blink 1.1s steps(1,end) infinite}.empty-bay span{display:block;max-width:460px;margin:22px 0 0;color:#5f9d70;font-size:clamp(12px,.86vw,14px);letter-spacing:.025em;line-height:1.72;white-space:pre-line}#ui-context-choices{max-width:460px;margin:22px 0 0;padding:0;border:0;white-space:pre-line;color:#75bc86;font-size:clamp(11px,.78vw,13px);letter-spacing:.025em;line-height:1.82;text-align:left}#ui-context-choices[hidden]{display:none}#diagnostics{position:absolute;z-index:8;top:12px;left:clamp(2px,1vw,12px);right:auto;width:auto;min-width:250px;border:0;background:transparent;color:#6eaa7d;font-family:var(--terminal-font);box-shadow:none}#diagnostics[open]{width:min(390px,calc(100% - 28px))}#diagnostics summary{padding:7px 0;cursor:pointer;list-style:none;color:#568c65;font-size:10px;letter-spacing:.075em;text-align:left;user-select:none}#diagnostics summary::-webkit-details-marker{display:none}#diagnostics summary:focus{outline:0}#diagnostics summary:focus-visible{color:#71b982;text-shadow:0 0 2px currentColor,0 0 8px rgba(68,255,122,.38)}#diagnostics summary:before{content:"sys@city:~$ ";color:#6fd58a}#diagnostics summary:after{content:" \2592";color:#42744f}#diagnostics[open] summary:before{content:"sys@city:~$ cat "}.diagnostic-body{max-height:min(610px,calc(100vh - 170px));overflow-y:auto;padding:7px 0 18px}.diagnostic-body .module{padding:13px 0 11px;border:0}.diagnostic-body::-webkit-scrollbar{width:4px}.diagnostic-body::-webkit-scrollbar-thumb{background:#244a30}@keyframes cursor-blink{50%{color:transparent;text-shadow:none}}@media(max-width:980px){body{overflow:auto}#app{width:min(calc(100% - 28px),820px);min-height:auto;padding:42px 0 28px;grid-template-columns:1fr;align-items:start}#interface{height:620px;min-height:620px;max-height:620px}}@media(max-width:620px){#app{width:calc(100% - 16px);padding-top:28px;gap:14px}#interface{height:560px;min-height:560px;max-height:560px;padding-left:18px;padding-right:18px}}#music-controls{display:none!important}#interface #interface-scroll{position:absolute;inset:0 0 30px;z-index:3;overflow-y:auto;overflow-x:hidden;padding:0;overscroll-behavior:contain;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:#38794d transparent;touch-action:pan-y}#interface-scroll:focus-visible{outline:1px solid #6fffab;outline-offset:-2px}#interface #interface-scroll #interface-ascii{position:static!important;inset:auto!important;display:block;width:auto!important;height:auto!important;cursor:default}#interface #interface-scroll-tools{position:absolute;z-index:4;bottom:0;left:0;right:0;height:28px;display:flex;align-items:center;justify-content:flex-end;gap:6px;background:#020904;font:11px Consolas,monospace;color:#7fc98f}#interface-scroll-tools span{margin-right:auto}#interface-scroll-tools button,#boot-retry{border:1px solid #38794d;color:#a8efba;background:#06170c;font:inherit;padding:3px 8px;cursor:pointer}#interface-scroll-tools[hidden],#boot-retry[hidden]{display:none!important}#boot-details{display:none}#relay-transfer.boot-loading{flex-direction:column;gap:24px;pointer-events:auto}#relay-transfer.boot-loading #relay-transfer-text{animation:city-link-pulse 1.6s ease-in-out infinite}#relay-transfer.boot-loading #boot-details{display:block;z-index:1;width:min(520px,90vw);font:13px/1.6 Consolas,monospace;letter-spacing:.06em;white-space:normal;text-shadow:none}.boot-upload{margin:12px 0 4px}#boot-meter{width:100%;height:8px;accent-color:#6fffab}#boot-hint{color:#79b989;font-size:12px;margin:8px 0}#relay-transfer.boot-failed #relay-transfer-text{animation:none}body[data-boot-state=failed] #relay-transfer{opacity:1!important}@keyframes city-link-pulse{0%,to{opacity:.55}50%{opacity:1}}@media(prefers-reduced-motion:reduce){#relay-transfer.boot-loading #relay-transfer-text{animation:none}}#music-toggle{border:1px solid hsl(138,35%,34%);background:#050b08;color:inherit;padding:5px 9px;font:inherit;cursor:pointer}#music-toggle[aria-pressed=true]{color:#64f790}body.cctv-active{background:#000;margin:0;display:flex;align-items:center;justify-content:center;min-height:100vh;min-height:100dvh}#cctv-stage{width:min(84vw,114vh);display:flex;flex-direction:column;align-items:stretch}body.cctv-active #viewport{position:relative;width:100%;max-width:none;height:auto;aspect-ratio:3 / 2;overflow:hidden;border:1px solid rgba(111,255,171,.18);background:#000;box-shadow:0 0 90px #000000d9}body.cctv-active #fx{background:repeating-linear-gradient(0deg,rgba(255,255,255,.05) 0,rgba(255,255,255,.05) 1px,transparent 1px,transparent 4px),radial-gradient(ellipse at center,transparent 55%,rgba(0,0,0,.1) 80%,rgba(0,0,0,.45) 100%)}#cctv-static,#cctv-flash{position:absolute}body.cctv-active{font-family:Fixedsys,Lucida Console,Courier New,monospace;color:#b7ffd0;text-shadow:0 0 6px rgba(111,255,171,.5)}#cctv-panel{margin-top:clamp(12px,2.2vh,24px);padding:clamp(10px,1.8vh,16px) clamp(12px,1.6vw,20px);border:1px solid rgba(111,255,171,.28);background:#030a06b8;display:flex;flex-direction:row;align-items:center;gap:clamp(12px,1.5vw,22px);font-size:clamp(13px,1.9vh,18px);letter-spacing:.1em;animation:cctv-panel-drift 240s ease-in-out infinite}.cctv-panel-text{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:clamp(5px,.9vh,9px)}#cctv-map{position:static;flex:0 0 auto;width:clamp(84px,15vh,132px);height:clamp(84px,15vh,132px);image-rendering:pixelated;border:1px solid rgba(111,255,171,.22);background:#010402;cursor:default}.cctv-panel-row{display:flex;gap:16px;align-items:baseline;white-space:nowrap}#cctv-feed-label{font-weight:700}#cctv-sound{font:inherit;color:#b7ffd0;background:transparent;border:1px solid rgba(111,255,171,.35);border-radius:2px;padding:0 8px;margin-left:auto;cursor:pointer;font-size:.8em;letter-spacing:.12em;text-shadow:inherit}#cctv-sound:hover{border-color:#6fffabb3}#cctv-sound[aria-pressed=true]{color:#0a2416;background:#6fffab;border-color:#6fffab;text-shadow:none}#cctv-sound:disabled{opacity:.35;cursor:default}#cctv-vol{-webkit-appearance:none;appearance:none;width:92px;height:2px;padding:0;margin:0 2px;background:#6fffab59;border:none;border-radius:1px;outline:none;cursor:pointer;align-self:center}#cctv-vol::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:10px;height:16px;border:none;border-radius:1px;background:#6fffab;box-shadow:0 0 6px #6fffab99;cursor:pointer}#cctv-vol::-moz-range-track{background:#6fffab59;height:2px;border-radius:1px}#cctv-vol::-moz-range-thumb{width:10px;height:16px;border:none;border-radius:1px;background:#6fffab;box-shadow:0 0 6px #6fffab99;cursor:pointer}#cctv-vol:hover:not(:disabled){background:#6fffab99}#cctv-vol:disabled{opacity:.35;cursor:default}#cctv-audio{opacity:.5;font-size:.72em;letter-spacing:.1em}.cctv-rec-dot{color:#ff5a5a;text-shadow:0 0 8px rgba(255,90,90,.8);animation:cctv-rec-blink 1.6s steps(1) infinite}@keyframes cctv-rec-blink{0%,60%{opacity:1}60.01%,to{opacity:0}}#cctv-panel-street{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#cctv-utc{opacity:.85;color:#7dffb2;font-size:.88em;letter-spacing:.14em}#cctv-panel-subline{opacity:.68;font-size:.82em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#cctv-panel-subline.cctv-degraded{opacity:.4}@keyframes cctv-panel-drift{0%,to{transform:translate(0)}50%{transform:translateY(-6px)}}#cctv-credits{position:absolute;right:10px;bottom:7px;z-index:5;opacity:.55;font-size:clamp(10px,1.4vh,13px);letter-spacing:.16em}#cctv-static{z-index:1;opacity:.055;pointer-events:none;background-image:repeating-linear-gradient(0deg,#ffffff80 0,#ffffff59 1px,#00000080 1px 2px),repeating-linear-gradient(90deg,#ffffff0f 0 1px,#0000 1px 3px);animation:cctv-static-drift 1.2s steps(6) infinite}@keyframes cctv-static-drift{0%{transform:translateY(0)}to{transform:translateY(4px)}}#cctv-flash{z-index:6;pointer-events:none;opacity:0;background:#000}#cctv-flash.cctv-flash-run{animation:cctv-cut-flash 1.15s ease-out 1}@keyframes cctv-cut-flash{0%{opacity:1}45%{opacity:.92}to{opacity:0}}body.cctv-active #interface,body.cctv-active #relay-transfer,body.cctv-active #prelude-prompt,body.cctv-active #mobile-hud,body.cctv-active #mobile-context,body.cctv-active #orientation-guide,body.cctv-active #touch-controls,body.cctv-active #touch-pause-menu,body.cctv-glitch #relay-transfer{display:none!important}body.cctv-ui-hidden #cctv-panel,body.cctv-ui-hidden #cctv-credits{opacity:0!important;transition:opacity .6s ease;pointer-events:none}body.cctv-ui-hidden{cursor:none!important}body.cctv-ui-hidden canvas{cursor:none!important}body.cctv-ui-hidden #cctv-static{opacity:.05}@media(max-width:720px){#cctv-stage{width:94vw}#cctv-panel{font-size:clamp(11px,2.6vw,14px);letter-spacing:.06em}#cctv-map{width:68px;height:68px}#cctv-credits{display:none}}#cctv-cockpit{display:none;position:absolute;inset:0;width:100%;height:100%;z-index:4;pointer-events:none;background:transparent}body.cctv-active.cctv-taxi-view #cctv-cockpit{display:block}#cctv-listener-mix{display:flex;flex-direction:column;gap:7px;align-self:center}#cctv-listener-mix label{display:flex;align-items:center;justify-content:flex-end;gap:8px;color:#86b99a;font-size:.7em;letter-spacing:.08em}#cctv-listener-mix input[type=range]{appearance:none;width:92px;height:28px;padding:0;margin:0 2px;background:linear-gradient(#6fffab59,#6fffab59) center / 100% 2px no-repeat;border:0;outline:none;cursor:pointer;touch-action:none}#cctv-listener-mix input[type=range]::-webkit-slider-thumb{appearance:none;width:16px;height:24px;background:#6fffab;border:0;border-radius:2px;box-shadow:0 0 6px #6fffab99}#cctv-listener-mix input[type=range]::-moz-range-thumb{width:16px;height:24px;background:#6fffab;border:0;border-radius:2px}#cctv-listener-mix input[type=range]:disabled{opacity:.35;cursor:default}body.cctv-active{box-sizing:border-box;height:100dvh;min-height:0;padding:clamp(18px,3vh,36px) 0;overflow:hidden}body.cctv-active #cctv-stage{width:min(84vw,max(240px,calc((100dvh - 430px)*1.5)));flex:0 0 auto}body.cctv-active #cv{filter:saturate(1.55)}#cctv-title{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:9px;margin:0 0 clamp(10px,1.7vh,20px);text-align:center;line-height:1}#cctv-title .cctv-title-kicker{color:#638d73;font:700 clamp(9px,.9vw,12px)/1.2 Consolas,"Courier New",monospace;letter-spacing:.32em;text-shadow:none}#cctv-title img{display:block;width:min(100%,930px);height:clamp(45px,9vh,105px);object-fit:cover;object-position:center center;transform:translate(5.5%)}#cctv-links{display:flex;flex-wrap:wrap;gap:4px 18px;font-size:.7em;line-height:1.3;letter-spacing:.08em}#cctv-links a{color:#7dffb2;text-decoration:underline dotted;text-underline-offset:3px;opacity:.8}#cctv-links a:hover,#cctv-links a:focus-visible{opacity:1;text-decoration-style:solid}@media(max-width:720px){body.cctv-active{padding:12px 0}body.cctv-active #cctv-stage{width:min(94vw,max(240px,calc((100dvh - 310px)*1.5)))}#cctv-title{gap:4px;margin-bottom:10px}#cctv-title .cctv-title-kicker{font-size:9px;letter-spacing:.12em}#cctv-title img{height:clamp(42px,8vh,65px);transform:translate(3%)}#cctv-panel{margin-top:8px;padding:8px;gap:8px;font-size:12px;letter-spacing:.04em}#cctv-map{width:56px;height:56px}.cctv-panel-row{flex-wrap:wrap;align-items:center;gap:6px 8px;white-space:normal}#cctv-sound{padding:3px 6px;min-height:26px}#cctv-listener-mix{flex:1 0 100%;flex-direction:row;justify-content:space-between;gap:6px}#cctv-listener-mix label{gap:4px;font-size:9px}#cctv-listener-mix input[type=range]{width:clamp(42px,10vw,68px);height:32px}#cctv-panel-street,#cctv-panel-subline,#cctv-utc{letter-spacing:.03em}#cctv-links{gap:3px 10px;font-size:10px}}@media(max-width:900px)and (max-height:500px)and (orientation:landscape){body.cctv-active{padding:8px 0}body.cctv-active #cctv-stage{width:min(94vw,max(210px,calc((100dvh - 195px)*1.5)))}#cctv-title{gap:2px;margin-bottom:4px}#cctv-title img{height:38px}#cctv-panel{margin-top:4px;padding:5px 8px}#cctv-map,#cctv-panel-subline{display:none}.cctv-panel-text{gap:2px}}#cctv-audio-dev[hidden]{display:none}#cctv-audio-dev{position:fixed;top:16px;right:16px;z-index:30;width:min(310px,calc(100vw - 32px));padding:14px;box-sizing:border-box;color:#bcffd5;background:#030c09f5;border:1px solid #568b70;box-shadow:0 8px 32px #000b;font:12px/1.35 Consolas,Courier New,monospace;text-shadow:none}#cctv-audio-dev strong,#cctv-audio-dev small,#cctv-audio-dev output{display:block}#cctv-audio-dev strong{margin-bottom:5px;letter-spacing:.1em}#cctv-audio-dev small{color:#8da99a;margin-bottom:12px}#cctv-audio-dev label:not(.cctv-audio-check){display:grid;grid-template-columns:1fr 108px 42px;align-items:center;gap:5px;margin:8px 0}#cctv-audio-dev input[type=range]{width:100%;accent-color:#84e4ac}#cctv-audio-dev output[data-level]{text-align:right;font-variant-numeric:tabular-nums}#cctv-audio-dev .cctv-audio-check{display:flex;align-items:center;gap:6px;margin:14px 0 9px}#cctv-audio-dev .cctv-audio-actions{display:flex;gap:7px}#cctv-audio-dev button{flex:1;background:#10231b;border:1px solid #568b70;color:#bcffd5;padding:6px 4px;font:inherit;cursor:pointer}#cctv-audio-dev button:hover{background:#1d3b29}#cctv-mix-status{color:#8da99a;margin-top:8px;min-height:1.35em}

/* ================= City chat (LIVE v2) =================
   A full-height sidebar docked to the RIGHT edge, living in the black margin
   beside the 3:2 feed — the picture keeps its full size and is never covered
   (on narrow windows the sidebar overlays the feed's right edge).
   Input events are exempted from the feed's etiquette swallowers in cctv.js
   (stopPropagation, no preventDefault). */
:root { --chat-w: clamp(220px, 17vw, 300px); --stage-w: min(84vw, max(240px, calc((100dvh - 430px) * 1.5))); }
/* The toggle is a fixed, prominent tab docked to the sidebar's top-left
   corner — always at the same place as the panel it controls, in normal flow
   of nothing, above the stage (z-index above the sidebar). */
#cctv-chat {
  position: fixed; top: 10px; right: 10px;   /* hidden sidebar: top-right corner */
  z-index: 30;
  font: inherit; color: #0a2416; background: #6fffab;
  border: 1px solid #6fffab; border-radius: 2px;
  padding: 4px 10px; cursor: pointer;
  font-size: clamp(11px, 1.6vh, 14px); letter-spacing: .12em;
  box-shadow: 0 0 12px rgba(111,255,171,.35);
}
#cctv-chat:hover { filter: brightness(1.08); }
/* Sidebar open: the tab docks to the sidebar's top-left corner — visibly
   attached to the panel it controls. */
body.cctv-chat-open #cctv-chat { right: calc(var(--chat-w) + 10px); }
#cctv-chat.cctv-chat-online { color: #6fffab; background: rgba(4,18,10,.92); }
#cctv-chat:disabled { opacity: .35; cursor: default; box-shadow: none; }
#cctv-chat:hover { border-color: rgba(111,255,171,.7); }
#cctv-chat.cctv-chat-online { color: #0a2416; background: #6fffab; border-color: #6fffab; text-shadow: none; }
#cctv-chat:disabled { opacity: .35; cursor: default; }

#cctv-fullscreen, #cctv-fullscreen-close {
  position: fixed; z-index: 40; top: 10px;
  font: inherit; font-size: clamp(11px, 1.6vh, 14px); letter-spacing: .12em;
  color: #6fffab; background: rgba(4,18,10,.92);
  border: 1px solid #6fffab; border-radius: 2px;
  padding: 4px 10px; min-height: 32px; cursor: pointer;
  text-shadow: none;
}
#cctv-fullscreen { right: 130px; }
body.cctv-chat-open #cctv-fullscreen { right: calc(var(--chat-w) + 130px); }
#cctv-fullscreen-close { right: 10px; }
#cctv-fullscreen-close[hidden] { display: none !important; }
#cctv-fullscreen:hover, #cctv-fullscreen-close:hover { background: rgba(20,65,38,.95); }
body.cctv-ui-hidden #cctv-fullscreen { opacity: 0; pointer-events: none; }

body.cctv-fullscreen { padding: 0 !important; }
body.cctv-fullscreen #cctv-stage, #cctv-stage:fullscreen {
  width: 100vw !important; height: 100dvh !important;
  margin: 0 !important; padding: 0 !important;
  background: #000; display: block;
}
body.cctv-fullscreen #viewport, #cctv-stage:fullscreen #viewport {
  width: 100% !important; height: 100% !important;
  aspect-ratio: auto !important; border: 0 !important;
}
body.cctv-fullscreen #cctv-title, body.cctv-fullscreen #cctv-panel,
body.cctv-fullscreen #cctv-chat, body.cctv-fullscreen #cctv-chat-strip,
body.cctv-fullscreen #cctv-fullscreen { display: none !important; }
body.cctv-fullscreen #cctv-fullscreen-close { display: block; }

#cctv-chat-strip {
  display: none;                       /* body.cctv-chat-open reveals it */
  flex-direction: column;
  position: fixed; top: 0; right: 0; bottom: 0;
  width: var(--chat-w);
  z-index: 20;
  border: none; border-left: 1px solid rgba(111,255,171,.28);
  background: rgba(2,8,5,.93);
  box-shadow: -14px 0 44px rgba(0,0,0,.65);
  font-size: clamp(12px, 1.7vh, 15px); letter-spacing: .08em;
}
body.cctv-chat-open #cctv-chat-strip { display: flex; }
/* With the sidebar open the stage keeps its size and slides left only when it
   would actually slide under the sidebar: flex centring halves margins, so
   the required margin-right is 2*chat-w + gutter − free-space (0 when the
   sidebar already fits in the black margin). */
body.cctv-chat-open #cctv-stage {
  --stage-w: min(84vw, max(240px, calc((100dvh - 430px) * 1.5)), calc(100vw - var(--chat-w) - 40px));
  width: var(--stage-w);
  margin-right: max(0px, calc(var(--chat-w) * 2 + 40px + var(--stage-w) - 100vw));
}

#cctv-chat-head {
  display: flex; justify-content: space-between; align-items: baseline;
  padding: 6px 12px 4px;
  border-bottom: 1px solid rgba(111,255,171,.16);
  font-size: .8em; opacity: .85;
}
#cctv-chat-viewers { color: #7dffb2; letter-spacing: .14em; }
#cctv-chat-status { opacity: .6; font-size: .9em; }
#cctv-chat-status.cctv-chat-status-live { opacity: 1; color: #6fffab; }

#cctv-chat-log {
  flex: 1 1 auto; overflow-y: auto; overscroll-behavior: contain; padding: 6px 12px;
  display: flex; flex-direction: column; gap: 3px;
  scrollbar-width: thin; scrollbar-color: rgba(111,255,171,.35) transparent;
}
#cctv-chat-log::-webkit-scrollbar { width: 6px; }
#cctv-chat-log::-webkit-scrollbar-thumb { background: rgba(111,255,171,.3); }
.cctv-chat-row { display: flex; gap: 10px; align-items: baseline; min-width: 0; animation: cctv-chat-in .5s ease-out 1; }
.cctv-chat-who { flex: 0 0 auto; color: #6fffab; font-size: .85em; letter-spacing: .1em; }
.cctv-chat-text { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; white-space: pre-wrap; }
.cctv-chat-row-self .cctv-chat-who { color: #eafff3; }
.cctv-chat-row-owner .cctv-chat-who,
.cctv-chat-row-owner .cctv-chat-text { color: #ffd76f; text-shadow: 0 0 8px rgba(255,215,111,.45); }
.cctv-chat-row-sys { opacity: .55; font-size: .85em; }
@keyframes cctv-chat-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }

#cctv-chat-compose { display: flex; gap: 8px; padding: 6px 12px 8px; border-top: 1px solid rgba(111,255,171,.16); }
#cctv-chat-input {
  flex: 1 1 auto; min-width: 0;
  font: inherit; color: #eafff3; letter-spacing: .06em;
  background: rgba(1,6,3,.85); border: 1px solid rgba(111,255,171,.3); border-radius: 2px;
  padding: 4px 8px; outline: none;
}
#cctv-chat-input::placeholder { color: rgba(183,255,208,.35); }
#cctv-chat-input:focus { border-color: rgba(111,255,171,.65); box-shadow: 0 0 8px rgba(111,255,171,.25); }
#cctv-chat-send {
  flex: 0 0 auto; font: inherit; color: #0a2416; background: #6fffab;
  border: 1px solid #6fffab; border-radius: 2px; padding: 0 12px;
  cursor: pointer; font-size: .8em; letter-spacing: .12em;
}
#cctv-chat-send:hover { filter: brightness(1.1); }

/* Screensaver mode (H) hides the chat strip AND its toggle with the rest of
   the overlay. */
body.cctv-ui-hidden #cctv-chat { opacity: 0 !important; pointer-events: none; transition: opacity .6s ease; }
body.cctv-ui-hidden #cctv-chat-strip { opacity: 0 !important; pointer-events: none; transition: opacity .6s ease; }

/* Phone layout for the chat-enabled 4.5 upload. Keep the city visible above chat. */
@media (max-width: 720px) {
  #cctv-chat-strip {
    top: auto;
    bottom: 0;
    width: 100%;
    height: min(48dvh, 420px);
    border-left: 0;
    border-top: 1px solid rgba(111,255,171,.28);
  }
  body.cctv-chat-open #cctv-stage { width: min(94vw, max(240px, calc((100dvh - 310px) * 1.5))); margin-right: 0; }
  #cctv-chat { top: auto; bottom: 10px; right: 10px; min-height: 34px; padding: 6px 10px; }
  body.cctv-chat-open #cctv-chat { right: 10px; bottom: calc(min(48dvh, 420px) + 8px); }
  #cctv-fullscreen { top: auto; bottom: 10px; right: 126px; min-height: 34px; padding: 6px 10px; }
  body.cctv-chat-open #cctv-fullscreen { right: 126px; bottom: calc(min(48dvh, 420px) + 8px); }
  #cctv-chat-input { font-size: 16px; min-height: 36px; }
  #cctv-chat-send { min-height: 36px; }
  #cctv-chat-log { -webkit-overflow-scrolling: touch; }
}
@media (max-width: 900px) and (max-height: 500px) and (orientation: landscape) {
  #cctv-chat-strip { width: min(50vw, 340px); height: 100dvh; top: 0; bottom: 0; border-top: 0; border-left: 1px solid rgba(111,255,171,.28); }
  body.cctv-chat-open #cctv-stage { width: min(48vw, max(210px, calc((100dvh - 195px) * 1.5))); margin-right: min(50vw, 340px); }
  body.cctv-chat-open #cctv-chat { right: calc(min(50vw, 340px) + 8px); bottom: 8px; }
  body.cctv-chat-open #cctv-fullscreen { right: calc(min(50vw, 340px) + 124px); bottom: 8px; }
}

