:root{--bg:#040421;--glass:#0b0d33c7;--line:#fff3;--text:#f8fafc;--dim:#aab0be;--accent:#2d7ff9;--cyan:#4ea7ff;--ok:#22e06b;--warn:#ffb000;--bad:#ff3b3b;color:var(--text);font-family:Inter,system-ui,sans-serif}*{box-sizing:border-box}html,body{background:var(--bg);height:100%;margin:0;overflow:hidden}#scene{width:100vw;height:100vh;display:block;position:fixed;inset:0}.glass{background:var(--glass);-webkit-backdrop-filter:blur(24px)saturate(140%);backdrop-filter:blur(24px)saturate(140%);border:1px solid var(--line);border-radius:0;position:fixed;box-shadow:0 10px 40px #00000073,inset 0 1px #ffffff0a}.dim{color:var(--dim);font-weight:400}.label{letter-spacing:.14em;color:var(--dim);margin:10px 0 6px;font:600 11px Inter,sans-serif}h3{letter-spacing:.18em;color:var(--accent);margin:16px 0 8px;font:700 12px Inter,sans-serif}.topbar{align-items:center;gap:22px;height:52px;padding:0 16px;display:flex;top:12px;left:12px;right:12px}.brand{letter-spacing:.12em;font:700 18px Orbitron,sans-serif}.logo{color:var(--accent);text-shadow:0 0 8px #2d7ff966}.title{letter-spacing:.06em;flex:1;align-items:baseline;gap:12px;font:600 16px Orbitron,sans-serif;display:flex}.lighting button{margin-left:4px}.clock{color:var(--cyan);text-align:right;min-width:210px;font:600 13px IBM Plex Mono,monospace}button,select{color:var(--text);border:1px solid var(--line);letter-spacing:.08em;cursor:pointer;background:#141c50b3;border-radius:0;padding:6px 10px;font:600 12px Inter,sans-serif}button:hover{border-color:var(--accent)}button.active{border-color:var(--accent);color:#fff;background:#2d7ff92e}button.primary{border-color:var(--accent);background:#2d7ff938}.sidebar{width:250px;padding:4px 14px 14px;top:76px;bottom:12px;left:12px;overflow-y:auto}.sidebar ul{margin:0;padding:0;list-style:none}.sidebar li{cursor:pointer;border:1px solid #0000;border-radius:0;margin-bottom:4px;padding:8px 10px}.sidebar li:hover{border-color:var(--line)}.sidebar li.active{border-color:var(--accent);background:#2d7ff91a}.sidebar li small{color:var(--dim);font-size:11px;display:block}.sidebar select{width:100%}.sim-controls{gap:6px;margin-top:8px;display:flex}.sim-controls button:first-child{flex:1}.speed{color:var(--dim);margin-top:10px;font:600 12px Inter,sans-serif;display:block}.speed input{width:100%;accent-color:var(--accent)}.commands{flex-wrap:wrap;gap:6px;display:flex}.commands button{padding:5px 8px;font-size:11px}.hud{width:320px;max-height:calc(100vh - 280px);padding:12px 16px;top:76px;right:12px;overflow-y:auto}.hud-head{grid-template-columns:1fr 1fr;gap:10px;display:grid}.state,.phase{letter-spacing:.08em;font:700 20px Inter,sans-serif}.state.running{color:var(--ok);text-shadow:0 0 10px #22e06b99}.state.fault{color:var(--bad);text-shadow:0 0 10px #ff3b3b99}.state.blocked,.state.starved,.state.setup,.state.starting,.state.cleaning,.state.maintenance{color:var(--warn)}.phase{color:var(--cyan)}.faults{margin-top:8px}.faults span{border:1px solid var(--bad);color:#ffb3b3;background:#ff3b3b29;border-radius:0;margin:2px;padding:2px 6px;font:600 11px IBM Plex Mono;display:inline-block}.kpis{grid-template-columns:1fr 1fr;gap:6px;display:grid}.kpi{border:1px solid var(--line);border-radius:0;padding:6px 8px}.kpi .v{color:#fff;font:700 18px Inter,sans-serif}.kpi .k{color:var(--dim);text-transform:uppercase;letter-spacing:.06em;font-size:10px}.vars{font:12px IBM Plex Mono,monospace}.vars div{border-bottom:1px dashed #78b4e614;justify-content:space-between;padding:3px 0;display:flex}.vars div span:first-child{color:var(--dim)}.events{width:320px;height:180px;padding:4px 14px;bottom:12px;right:12px;overflow-y:auto}.events ol{margin:0;padding:0;font:11px IBM Plex Mono,monospace;list-style:none}.events li{color:var(--dim);padding:2px 0}.events li b{color:var(--text);font-weight:600}.events li.fault_raised b{color:var(--bad)}.events li.fault_cleared b,.events li.batch_completed b{color:var(--ok)}body.shot .glass,body.shot .lil-gui{display:none!important}.lil-gui.root{--background-color:#0b0d33cc;--title-background-color:#1e2c3ce6;--widget-color:#28384ae6;--focus-color:#3a5068;--number-color:#4ea7ff;--font-family:Inter, sans-serif;width:100%}.right-col{flex-direction:column;gap:10px;width:320px;display:flex;position:fixed;top:76px;bottom:204px;right:12px;overflow-y:auto}.right-col .glass{flex:none;width:auto;max-height:none;position:static}#gui-host{flex:none}.sidebar [hidden],.nav-link[hidden]{display:none}@media (width<=900px){.sidebar{width:200px}.hud,.events,.right-col{width:260px}#gui-host{display:none}}.asset-name{letter-spacing:.06em;font:700 18px Orbitron,sans-serif}.lines .line{border-bottom:1px solid var(--line);padding:6px 0;font-size:12px}.lines .line b{letter-spacing:.08em;color:var(--cyan);font:600 12px Inter,sans-serif;display:block}.lines .line span{color:var(--dim);font:400 11px IBM Plex Mono,monospace}.nav-link{color:var(--cyan);letter-spacing:.1em;margin-top:10px;font:600 12px Inter,sans-serif;text-decoration:none;display:block}.nav-link:hover{color:var(--accent)}.tour-stop{min-height:14px;margin-top:6px;font:11px IBM Plex Mono,monospace}body.portal{background:var(--bg);overflow:auto}.portal-wrap{max-width:1080px;margin:0 auto;padding:48px 20px 64px}.portal-head h1{letter-spacing:.04em;margin:18px 0 4px;font:700 34px Orbitron,sans-serif}.portal-cards{grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:16px;margin-top:28px;display:grid}.portal-card{flex-direction:column;gap:6px;padding:20px 22px;display:flex;position:static}.portal-card h2{letter-spacing:.04em;margin:0;font:700 22px Orbitron,sans-serif}.portal-card p{color:var(--dim);flex:1;margin:4px 0 14px;line-height:1.5}.portal-actions{flex-wrap:wrap;gap:8px;display:flex}.btn{color:var(--text);border:1px solid var(--line);letter-spacing:.08em;background:#141c50b3;border-radius:0;padding:8px 12px;font:600 12px Inter,sans-serif;text-decoration:none;display:inline-block}.btn:hover{border-color:var(--accent)}.btn.primary{border-color:var(--accent);background:#2d7ff92e}.lil-gui,.lil-gui *{border-radius:0!important}.dock{display:none}@media (width<=700px){.topbar{flex-wrap:wrap;gap:4px 12px;height:auto;padding:8px 12px;top:8px;left:8px;right:8px}.brand{font-size:14px}.title{flex-wrap:wrap;flex-basis:100%;order:3;gap:2px 8px;font-size:12px}.lighting{margin-left:auto}.lighting button{padding:5px 8px}#plant-meta{display:none}.clock{text-align:left;min-width:0;font-size:11px}body.has-dock .sidebar,body.has-dock .right-col,body.has-dock .hud,body.has-dock .events{display:none}body.has-dock[data-panel=sidebar] .sidebar,body.has-dock[data-panel=right-col] .right-col,body.has-dock[data-panel=hud] .hud,body.has-dock[data-panel=events-panel] .events{display:block}body.has-dock .sidebar,body.has-dock .hud,body.has-dock .events,body.has-dock .right-col{width:auto;height:auto;max-height:58vh;position:fixed;inset:auto 8px 64px;overflow-y:auto}body.has-dock .right-col{flex-direction:column;display:none}body.has-dock[data-panel=right-col] .right-col{display:flex}body.has-dock .right-col .hud{max-height:none;position:static}.dock{z-index:5;gap:6px;padding:6px;display:flex;position:fixed;bottom:8px;left:8px;right:8px}.dock button{flex:1;min-height:44px;font-size:12px}button,select,.btn{min-height:40px}.commands button{min-height:36px}.portal-wrap{padding:28px 14px 40px}.portal-head h1{font-size:26px}}.boot{z-index:50;background:var(--bg);place-items:center;transition:opacity .5s;display:grid;position:fixed;inset:0}.boot.done{opacity:0;pointer-events:none}.boot-card{width:min(420px,100vw - 32px)}.boot-brand{letter-spacing:.2em;margin-bottom:18px;font:700 13px Orbitron,sans-serif}.boot-title{margin:0 0 18px;font:600 20px Orbitron,sans-serif}.boot-track{border:1px solid var(--line);background:#ffffff1f;border-radius:0;height:6px;overflow:hidden}.boot-fill{background:var(--accent);width:0;height:100%;transition:width .45s;box-shadow:0 0 10px #2d7ff999}.boot-row{letter-spacing:.04em;justify-content:space-between;gap:12px;margin-top:10px;font:500 12px Inter,sans-serif;display:flex}.boot-pct{color:var(--accent);font-family:IBM Plex Mono,monospace}.boot.error .boot-fill{box-shadow:none;background:#ff6b6b}.boot.error .boot-stage{color:#ff9b9b}body.shot .boot{display:none}
