/* MaestroOS Spatial — Data Centre Reference Twin
   Palette and type scale follow the locked MaestroOS design tokens. */

:root{
  --bg-base:#0a0f1e;
  --bg-panel:#080d1a;
  --bg-card:#0d1628;
  --border:#1e2d4a;
  --text-1:#e8edf5;
  --text-2:#8aaac8;
  --text-3:#4a6a8a;
  --text-dim:#2a3a52;
  --accent:#3a8fd4;
  --green:#2ecc71;
  --orange:#f39c12;
  --red:#e74c3c;
  --purple:#9b59b6;
  --brand:#45bff0;      /* MaestroOS logo cyan */
}

*{box-sizing:border-box;margin:0;padding:0;}
::-webkit-scrollbar{width:6px;height:6px;}
::-webkit-scrollbar-track{background:var(--bg-panel);}
::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px;}
::-webkit-scrollbar-thumb:hover{background:#2e4a6a;}

body{
  background:var(--bg-base);color:var(--text-1);
  font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
  height:100vh;display:flex;flex-direction:column;font-size:13px;overflow:hidden;
}
button{cursor:pointer;font-family:inherit;}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px;}

/* ── Top bar ─────────────────────────────────────────────────── */
.top-bar{display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:0 16px;border-bottom:1px solid var(--border);background:var(--bg-panel);
  flex-shrink:0;height:60px;}
.logo{display:flex;align-items:center;gap:11px;flex-shrink:0;}
.logo-img{height:38px;width:auto;display:block;}
.logo-div{width:1px;height:30px;background:var(--border);flex-shrink:0;}
.logo-meta{display:flex;flex-direction:column;gap:1px;}
.logo-meta .mode{font-size:13px;font-weight:500;color:var(--text-1);letter-spacing:.4px;line-height:1.1;}
.logo-sub{font-size:9.5px;color:var(--text-3);letter-spacing:1.6px;text-transform:uppercase;white-space:nowrap;}

.stats{display:flex;align-items:center;gap:7px;overflow-x:auto;scrollbar-width:none;
  padding:0 4px;}
.stats::-webkit-scrollbar{display:none;}

/* KPI cards — each reads as its own instrument, not a run of text. */
.stat{display:flex;flex-direction:column;gap:2px;white-space:nowrap;
  background:var(--bg-card);border:1px solid var(--border);
  border-left:2px solid var(--text-dim);border-radius:4px;
  padding:5px 10px 5px 9px;flex:0 0 96px;width:96px;transition:all .2s;}
.stat b{font-size:15px;font-weight:600;color:var(--text-1);
  font-variant-numeric:tabular-nums;line-height:1.05;
  overflow:hidden;text-overflow:ellipsis;}
.stat span{font-size:8px;letter-spacing:1.1px;text-transform:uppercase;
  color:var(--text-3);line-height:1.1;}

/* Nominal counters read green; a raised count takes the semantic colour
   and the card itself changes, so it is visible without reading a digit. */
.stat.ok{border-left-color:var(--green);}
.stat.ok b{color:var(--green);}
.stat.warn{border-left-color:var(--orange);background:rgba(243,156,18,.10);}
.stat.warn b{color:var(--orange);}
.stat.alarm{border-left-color:var(--red);background:rgba(231,76,60,.12);}
.stat.alarm b{color:var(--red);}
.stat.alarm{animation:statPulse 1.6s ease-in-out infinite;}
@keyframes statPulse{0%,100%{box-shadow:0 0 0 0 rgba(231,76,60,0);}
                     50%{box-shadow:0 0 0 3px rgba(231,76,60,.16);}}
@media (prefers-reduced-motion:reduce){.stat.alarm{animation:none;}}
.stat.key{border-left-color:var(--brand);}
.stat.key b{color:var(--brand);}

.badge{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border:1px solid var(--border);
  border-radius:20px;font-size:10px;color:var(--text-3);letter-spacing:.6px;white-space:nowrap;}
.badge .dot{width:6px;height:6px;border-radius:50%;background:var(--green);}

/* ── Layout ──────────────────────────────────────────────────── */
.shell{flex:1;display:grid;grid-template-columns:216px 1fr 330px;min-height:0;}
.panel{background:var(--bg-panel);display:flex;flex-direction:column;min-height:0;overflow-y:auto;}
.panel.left{border-right:1px solid var(--border);}
.panel.right{border-left:1px solid var(--brand);box-shadow:-1px 0 0 rgba(69,191,240,.18);}

.sec{padding:12px 14px;border-bottom:1px solid var(--border);}
.sec-title{font-size:9px;letter-spacing:1.6px;text-transform:uppercase;color:var(--text-3);
  margin-bottom:9px;font-weight:600;}

.nav-btn{display:flex;align-items:center;gap:8px;width:100%;text-align:left;padding:7px 9px;
  background:transparent;border:1px solid transparent;border-radius:4px;color:var(--text-2);
  font-size:12px;transition:all .13s;margin-bottom:2px;}
.nav-btn:hover{background:var(--bg-card);color:var(--text-1);}
.nav-btn.on{background:var(--bg-card);border-color:var(--accent);color:var(--accent);}
.nav-btn .k{width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.55;flex-shrink:0;}

.chip-row{display:flex;flex-wrap:wrap;gap:5px;}
.chip{padding:4px 9px;border:1px solid var(--border);border-radius:4px;background:transparent;
  color:var(--text-2);font-size:11px;transition:all .13s;}
.chip:hover{border-color:var(--accent);color:var(--accent);}
.chip.on{background:rgba(58,143,212,.14);border-color:var(--accent);color:var(--accent);}
.chip .sw{display:inline-block;width:7px;height:7px;border-radius:2px;margin-right:5px;vertical-align:middle;}

.scn{width:100%;text-align:left;padding:8px 10px;border:1px solid var(--border);border-radius:4px;
  background:var(--bg-card);color:var(--text-2);margin-bottom:5px;transition:all .13s;}
.scn:hover{border-color:var(--accent);}
.scn.on{border-color:var(--orange);}
.scn b{display:block;font-size:11.5px;color:var(--text-1);font-weight:500;margin-bottom:2px;}
.scn i{font-style:normal;font-size:10px;color:var(--text-3);line-height:1.35;display:block;}

/* ── Viewport ────────────────────────────────────────────────── */
.viewport{position:relative;background:#070b12;min-width:0;}
#view{width:100%;height:100%;display:block;touch-action:none;}

.overlay{position:absolute;display:flex;gap:5px;flex-wrap:wrap;z-index:5;}
.overlay.tl{top:12px;left:12px;max-width:calc(100% - 24px);}
.overlay.bl{bottom:12px;left:12px;}
.overlay.br{bottom:12px;right:12px;}

.vbtn{padding:6px 11px;background:rgba(8,13,26,.86);border:1px solid var(--border);border-radius:4px;
  color:var(--text-2);font-size:11px;backdrop-filter:blur(8px);transition:all .13s;}
.vbtn:hover{border-color:var(--accent);color:var(--accent);}
.vbtn.on{background:rgba(58,143,212,.18);border-color:var(--accent);color:var(--accent);}
.vbtn:disabled{opacity:.34;cursor:not-allowed;}

.hint{position:absolute;bottom:12px;left:50%;transform:translateX(-50%);font-size:10px;
  color:var(--text-dim);letter-spacing:.4px;pointer-events:none;z-index:4;}

.tag{position:absolute;pointer-events:none;padding:3px 8px;background:rgba(8,13,26,.92);
  border:1px solid var(--accent);border-radius:3px;font-size:10.5px;color:var(--text-1);
  transform:translate(12px,-50%);z-index:6;white-space:nowrap;display:none;}

/* Sits clear of the view-mode row above it — both were at top:12px,
   so a wide scenario name ran into the Normal/X-ray/Cutaway buttons. */
.scn-banner{position:absolute;top:56px;left:50%;transform:translateX(-50%);z-index:6;
  background:rgba(13,22,40,.94);border:1px solid var(--orange);border-radius:5px;
  padding:8px 14px;display:none;align-items:center;gap:11px;backdrop-filter:blur(8px);max-width:90%;}
.scn-banner b{font-size:11.5px;color:var(--orange);white-space:nowrap;}
.scn-banner span{font-size:11px;color:var(--text-2);}
.scn-banner .prog{height:2px;background:var(--border);border-radius:2px;width:74px;overflow:hidden;flex-shrink:0;}
.scn-banner .prog i{display:block;height:100%;background:var(--orange);width:0;transition:width .3s;}

/* ── Asset telemetry card — anchored to the equipment ────────── */
.leader{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:5;display:none;}
.leader.show{display:block;}
.leader line{stroke:var(--brand);stroke-width:1;stroke-dasharray:3 3;opacity:.8;}
.leader circle{fill:none;stroke:var(--brand);stroke-width:1.5;}

.asset-card{position:absolute;width:252px;z-index:6;display:none;
  background:rgba(8,13,26,.95);border:1px solid var(--brand);border-radius:4px;
  backdrop-filter:blur(10px);box-shadow:0 12px 36px rgba(0,0,0,.55);overflow:hidden;}
.asset-card.show{display:block;}
.asset-head{padding:11px 13px 10px;border-bottom:1px solid var(--border);position:relative;}
.asset-head h2{font-size:13.5px;font-weight:600;margin-bottom:3px;line-height:1.25;padding-right:18px;}
.asset-head .sub{font-size:10px;color:var(--text-3);}
.asset-head .st{display:inline-flex;align-items:center;gap:5px;margin-top:8px;padding:2px 8px;
  border-radius:12px;font-size:9.5px;letter-spacing:.8px;text-transform:uppercase;}
.asset-head .x{position:absolute;top:7px;right:8px;background:none;border:none;
  color:var(--text-3);font-size:15px;line-height:1;padding:2px 5px;}
.asset-head .x:hover{color:var(--text-1);}
.st.ok{background:rgba(46,204,113,.13);color:var(--green);}
.st.warn{background:rgba(243,156,18,.13);color:var(--orange);}
.st.alarm{background:rgba(231,76,60,.15);color:var(--red);}
.purpose{padding:10px 13px;font-size:11px;line-height:1.5;color:var(--text-2);
  border-bottom:1px solid var(--border);}
.readings{padding:8px 13px 10px;}
.rd{display:flex;justify-content:space-between;align-items:baseline;padding:3.5px 0;font-size:11px;}
.rd span{color:var(--text-3);}
.rd b{font-weight:600;font-variant-numeric:tabular-nums;color:var(--text-1);}

/* ── Assistant — mirrors the MaestroOS command interface ─────── */
.assistant{flex:1;display:flex;flex-direction:column;min-height:250px;}
.asst-head{padding:11px 14px 10px;border-bottom:1px solid var(--border);display:flex;
  align-items:flex-start;justify-content:space-between;gap:10px;}
.asst-head .t{font-size:9px;letter-spacing:1.5px;text-transform:uppercase;color:var(--text-2);
  font-weight:500;line-height:1.35;}
.asst-head .t.r{text-align:right;color:var(--text-3);}
.log{flex:1;overflow-y:auto;padding:12px 14px;display:flex;flex-direction:column;gap:10px;}
/* Pinned to top: with the telemetry card moved onto the model, the
   command interface owns this panel alone and reads as a transcript. */

.msg{font-size:12px;line-height:1.55;border:1px solid var(--border);background:var(--bg-card);
  border-radius:3px;padding:9px 11px;position:relative;}
.msg::before{display:block;font-size:9px;letter-spacing:1.4px;text-transform:uppercase;
  font-weight:600;margin-bottom:5px;}
.msg.a{border-left:2px solid var(--brand);color:var(--text-2);white-space:pre-wrap;}
.msg.a::before{content:'Maestro';color:var(--brand);}
.msg.u{border-left:2px solid var(--text-3);color:var(--text-1);}
.msg.u::before{content:'You';color:var(--text-3);}
.msg.think{border-style:dashed;color:var(--text-3);}
.msg.think::before{content:'Maestro';color:var(--text-dim);}
.msg.think span{display:inline-block;width:5px;height:5px;border-radius:50%;
  background:var(--brand);margin-right:4px;opacity:.3;animation:pulse 1.1s infinite;}
.msg.think span:nth-child(2){animation-delay:.18s;}
.msg.think span:nth-child(3){animation-delay:.36s;}
@keyframes pulse{0%,60%,100%{opacity:.25;}30%{opacity:1;}}
@media (prefers-reduced-motion:reduce){.msg.think span{animation:none;opacity:.6;}}
.msg .did{display:block;margin-top:7px;padding-top:6px;border-top:1px solid var(--border);
  font-size:10px;color:var(--brand);letter-spacing:.2px;}

.ask{display:flex;gap:6px;padding:10px 12px;border-top:1px solid var(--border);}
.ask input{flex:1;background:var(--bg-card);border:1px solid var(--border);border-radius:3px;
  padding:9px 10px;color:var(--text-1);font-size:12px;font-family:inherit;min-width:0;}
.ask input::placeholder{color:var(--text-dim);}
.ask input:focus{outline:none;border-color:var(--accent);}
.ask button{padding:9px 15px;background:var(--bg-card);border:1px solid var(--accent);
  border-radius:3px;color:var(--accent);font-size:11.5px;font-weight:600;transition:all .13s;}
.ask button:hover:not(:disabled){background:rgba(58,143,212,.16);}
.ask button:disabled{opacity:.4;}
.suggests{display:flex;flex-wrap:wrap;gap:4px;padding:0 12px 10px;}
.suggests button{padding:4px 8px;background:transparent;border:1px solid var(--border);
  border-radius:11px;color:var(--text-3);font-size:10px;transition:all .13s;}
.suggests button:hover{border-color:var(--accent);color:var(--accent);}

/* ── Event log (left panel) ──────────────────────────────────── */
.sec.events{flex:1;min-height:110px;display:flex;flex-direction:column;}
.evlist{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:5px;max-height:190px;}
.ev{display:flex;gap:7px;font-size:10.5px;line-height:1.4;color:var(--text-3);
  padding-bottom:5px;border-bottom:1px solid rgba(30,45,74,.5);}
.ev:last-child{border-bottom:none;}
.ev time{color:var(--text-dim);flex-shrink:0;font-variant-numeric:tabular-nums;}
.ev.alarm{color:var(--red);}
.ev.step{color:var(--accent);}
.ev.scenario{color:var(--orange);}
.ev.info{color:var(--text-2);}

/* ── Companion phone ─────────────────────────────────────────── */
.phone{position:absolute;right:16px;bottom:52px;width:206px;background:var(--bg-panel);
  border:1px solid var(--border);border-radius:16px;padding:9px;z-index:7;display:none;
  box-shadow:0 18px 50px rgba(0,0,0,.6);}
.phone.show{display:block;}
.phone .bar{height:3px;width:44px;background:var(--border);border-radius:2px;margin:1px auto 8px;}
.phone .ph-t{font-size:9px;letter-spacing:1.3px;text-transform:uppercase;color:var(--text-3);
  margin-bottom:7px;display:flex;justify-content:space-between;align-items:center;}
.phone .ph-t b{color:var(--accent);font-weight:600;}
.phone .grid{display:grid;grid-template-columns:1fr 1fr;gap:4px;}
.phone .grid button{padding:7px 5px;background:var(--bg-card);border:1px solid var(--border);
  border-radius:4px;color:var(--text-2);font-size:9.5px;line-height:1.25;transition:all .13s;}
.phone .grid button:hover{border-color:var(--accent);color:var(--accent);}
.phone .grid button.wide{grid-column:1 / -1;}
.phone .sec-lbl{font-size:8.5px;letter-spacing:1.1px;text-transform:uppercase;
  color:var(--text-dim);margin:8px 0 5px;}

.disclaimer{padding:10px 14px;font-size:9.5px;line-height:1.5;color:var(--text-dim);}

/* ── Responsive ──────────────────────────────────────────────── */
@media (max-width:1180px){
  .shell{grid-template-columns:184px 1fr 290px;}
  /* The strip scrolls horizontally, so on a narrow window only the first
     card is visible — and the alarm count is the one that must never be
     the card you have to scroll to find. Drop the secondary metrics. */
  .stat.opt{display:none;}
}
@media (max-width:900px){
  .shell{grid-template-columns:1fr;grid-template-rows:1fr auto;}
  .panel.left{display:none;}
  .panel.right{border-left:none;border-top:1px solid var(--border);max-height:44vh;}
  .stats{gap:12px;}
}
