/* ============================================================================
   Prius OBD Dashboard — styles (v2.2 modern overhaul)
   ========================================================================== */

@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@300;400;500;600&family=Inter:wght@400;500;600;700&display=swap');

*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}

:root{
  --bg:#070b15;--bg2:#0a1020;
  --surface:#0f1729;--surface2:#141d33;--surfaceHi:#1a2540;
  --border:#1e293b;--border2:#334155;--borderHi:#3b4a63;
  --text:#e7edf6;--muted:#94a3b8;--dim:#64748b;--faint:#334155;
  --cyan:#22d3ee;--teal:#2dd4bf;--orange:#fb923c;--violet:#a78bfa;
  --green:#34d399;--red:#f87171;--yellow:#fbbf24;--blue:#60a5fa;
  --mono:'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,monospace;
  --sans:'Inter',system-ui,-apple-system,Segoe UI,Roboto,sans-serif;
  --r:12px;--r-sm:8px;
  --shadow:0 1px 2px rgba(0,0,0,.4),0 8px 24px -12px rgba(0,0,0,.5);
  --glow:0 0 0 1px rgba(34,211,238,.25),0 0 22px -6px rgba(34,211,238,.35);
}

html,body{height:100%;background:var(--bg);color:var(--text);font-family:var(--mono);font-size:13px;overflow:hidden}
body{background:
  radial-gradient(1200px 600px at 80% -10%,rgba(34,211,238,.06),transparent 60%),
  radial-gradient(900px 500px at -10% 110%,rgba(167,139,250,.06),transparent 55%),
  var(--bg);
}

/* ── Layout ───────────────────────────────────────────────────────────────── */
#app{display:flex;flex-direction:column;height:100vh;height:100dvh}
#topbar{display:flex;align-items:center;gap:10px;padding:11px 16px;flex-shrink:0;
  background:linear-gradient(180deg,rgba(20,29,51,.7),rgba(15,23,41,.3));
  border-bottom:1px solid var(--border);backdrop-filter:blur(8px)}
#topbar .dot{width:8px;height:8px;border-radius:50%;background:var(--dim);flex-shrink:0;transition:.3s}
#topbar .dot.live{background:var(--green);box-shadow:0 0 10px var(--green);animation:pulse 1.6s infinite}
#topbar .title{font-size:10px;letter-spacing:.2em;color:var(--muted);flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:500}
#topbar .badge{font-size:9px;padding:3px 8px;border-radius:6px;background:rgba(148,163,184,.1);color:var(--dim);letter-spacing:.1em;white-space:nowrap;border:1px solid transparent}
#topbar .badge.online{background:rgba(52,211,153,.12);color:var(--green);border-color:rgba(52,211,153,.25)}
#topbar .badge.ble-on{background:rgba(52,211,153,.12);color:var(--green);border-color:rgba(52,211,153,.25)}
#topbar .badge.ble-err{background:rgba(248,113,113,.12);color:var(--red);border-color:rgba(248,113,113,.25)}
#topbar .badge.ver{background:rgba(167,139,250,.12);color:var(--violet);border-color:rgba(167,139,250,.22);letter-spacing:.06em}

@keyframes pulse{0%,100%{opacity:1}50%{opacity:.4}}

#tabs{display:flex;gap:4px;padding:8px 12px;flex-shrink:0;overflow-x:auto;scrollbar-width:none;border-bottom:1px solid var(--border)}
#tabs::-webkit-scrollbar{display:none}
.tab-btn{background:none;border:none;color:var(--dim);cursor:pointer;font-family:var(--mono);font-size:10px;letter-spacing:.08em;
  padding:7px 13px;white-space:nowrap;border-radius:8px;transition:.18s;font-weight:500}
.tab-btn:hover{color:var(--muted);background:rgba(148,163,184,.06)}
.tab-btn.active{color:#04141a;background:linear-gradient(180deg,var(--cyan),var(--teal));box-shadow:0 4px 14px -6px rgba(34,211,238,.6)}
#content{flex:1;overflow-y:auto;overflow-x:hidden;padding:16px 14px 28px;-webkit-overflow-scrolling:touch}

/* ── Cards & grids ────────────────────────────────────────────────────────── */
.card{background:linear-gradient(180deg,var(--surface2),var(--surface));border:1px solid var(--border);
  border-radius:var(--r);padding:15px;box-shadow:var(--shadow);transition:border-color .2s,transform .2s}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.grid4{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
.grid-auto{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:8px}
.mb{margin-bottom:11px}
.row{display:flex;align-items:center;gap:10px}
.lbl{font-size:8px;letter-spacing:.16em;color:var(--dim);text-transform:uppercase;margin-bottom:4px;font-weight:500}
.big{font-size:18px;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums}
.big.sm{font-size:15px}
.unit{font-size:10px;color:var(--dim);margin-left:3px}
.note{font-size:9px;color:var(--dim);margin-top:4px}
.ct{font-size:9px;letter-spacing:.14em;color:var(--muted);text-transform:uppercase;margin-bottom:12px;font-weight:500;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.chart-wrap{position:relative;width:100%}
.hint{font-size:8.5px;color:var(--dim);margin-top:5px;line-height:1.5}

/* stat card (grid) gets a subtle top accent */
.grid4 .card{padding:13px;position:relative;overflow:hidden}
.grid4 .card::before{content:'';position:absolute;inset:0 0 auto 0;height:2px;background:linear-gradient(90deg,var(--cyan),transparent 70%);opacity:.6}

/* ── Inline unit dropdown ─────────────────────────────────────────────────── */
.unit-sel{font-family:var(--mono);font-size:10px;color:var(--cyan);background:rgba(34,211,238,.08);
  border:1px solid rgba(34,211,238,.22);border-radius:5px;padding:1px 4px;margin-left:5px;cursor:pointer;
  outline:none;transition:.15s;vertical-align:middle;appearance:none;-webkit-appearance:none}
.unit-sel:hover{background:rgba(34,211,238,.16);border-color:rgba(34,211,238,.4)}
.unit-sel option{background:var(--surface);color:var(--text)}
.unit-inline .unit-sel{color:var(--muted)}

/* ── Buttons & inputs ─────────────────────────────────────────────────────── */
button.btn,a.btn{background:var(--surfaceHi);border:1px solid var(--border2);color:var(--text);cursor:pointer;
  font-family:var(--mono);font-size:10px;letter-spacing:.06em;padding:9px 15px;border-radius:var(--r-sm);
  transition:.16s;text-decoration:none;display:inline-flex;align-items:center;gap:6px;justify-content:center;font-weight:500}
button.btn:hover{background:#22304d;border-color:var(--borderHi);transform:translateY(-1px)}
button.btn.primary{background:linear-gradient(180deg,rgba(34,211,238,.18),rgba(45,212,191,.1));border-color:rgba(34,211,238,.4);color:var(--cyan)}
button.btn.primary:hover{box-shadow:var(--glow)}
button.btn.danger{background:rgba(248,113,113,.12);border-color:rgba(248,113,113,.35);color:var(--red)}
button.btn:disabled{opacity:.4;cursor:not-allowed;transform:none}
button.btn.wide{width:100%}
input.fld,select.fld,textarea.fld{background:var(--bg2);border:1px solid var(--border2);color:var(--text);
  font-family:var(--mono);font-size:11px;padding:9px 11px;border-radius:var(--r-sm);outline:none;width:100%;transition:.15s}
input.fld:focus,select.fld:focus,textarea.fld:focus{border-color:var(--cyan);box-shadow:0 0 0 3px rgba(34,211,238,.1)}
textarea.fld{resize:vertical;min-height:64px;line-height:1.5}
label.flbl{font-size:9px;letter-spacing:.1em;color:var(--muted);text-transform:uppercase;display:block;margin-bottom:6px}

/* ── Sensor rows ──────────────────────────────────────────────────────────── */
.sensor-row{display:flex;align-items:center;gap:9px;padding:6px 0;border-bottom:1px solid rgba(30,41,59,.7)}
.sensor-row:last-child{border:none}
.dot-status{width:8px;height:8px;border-radius:50%;flex-shrink:0}
.dot-ok{background:var(--green);box-shadow:0 0 6px var(--green)}
.dot-warn{background:var(--yellow);box-shadow:0 0 6px var(--yellow)}
.dot-miss{background:var(--faint)}
.dot-err{background:var(--red);box-shadow:0 0 6px var(--red)}
.dot-stale{background:var(--orange);box-shadow:0 0 6px var(--orange)}
.sensor-name{flex:1;font-size:10px;color:var(--muted)}
.sensor-val{font-size:10px;color:var(--text);text-align:right;min-width:84px;font-variant-numeric:tabular-nums}
.cat-hdr{font-size:9px;letter-spacing:.12em;color:var(--muted);text-transform:uppercase;padding:2px 0 8px;margin-bottom:4px;font-weight:500}

/* ── Session list ─────────────────────────────────────────────────────────── */
.sess-item{display:flex;align-items:center;gap:11px;padding:12px 13px;background:linear-gradient(180deg,var(--surface2),var(--surface));
  border:1px solid var(--border);border-radius:10px;cursor:pointer;margin-bottom:7px;transition:.16s}
.sess-item:hover{border-color:var(--borderHi);transform:translateY(-1px)}
.sess-item.active{border-color:rgba(34,211,238,.5);box-shadow:var(--glow)}
.sess-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;box-shadow:0 0 8px currentColor}
.sess-info{flex:1;min-width:0}
.sess-label{font-size:11px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:500}
.sess-meta{font-size:9px;color:var(--dim);margin-top:3px;font-variant-numeric:tabular-nums}
.sess-tag{font-size:8px;padding:1px 6px;border-radius:4px;background:rgba(34,211,238,.14);color:var(--cyan);letter-spacing:.08em}
.sess-del{background:none;border:none;color:var(--dim);cursor:pointer;padding:5px;font-size:12px;border-radius:5px;transition:.15s}
.sess-del:hover{color:var(--red);background:rgba(248,113,113,.1)}

/* ── Drop zone ────────────────────────────────────────────────────────────── */
#dropzone{border:1.5px dashed var(--border2);border-radius:var(--r);padding:30px 20px;text-align:center;cursor:pointer;
  transition:.2s;margin-bottom:13px;background:rgba(20,29,51,.3)}
#dropzone.drag{border-color:var(--cyan);background:rgba(34,211,238,.06)}
#dropzone:hover{border-color:var(--borderHi);background:rgba(20,29,51,.5)}
#dropzone p{font-size:11px;color:var(--dim);margin-top:8px}
#dropzone .icon{font-size:30px;filter:drop-shadow(0 4px 12px rgba(34,211,238,.3))}

.empty{text-align:center;padding:48px 20px;color:var(--dim);font-size:11px;line-height:1.8}

/* ── Inline bars ──────────────────────────────────────────────────────────── */
.bar-wrap{display:flex;align-items:center;gap:9px;margin-bottom:8px}
.bar-label{font-size:10px;color:var(--dim);width:62px;flex-shrink:0}
.bar-track{flex:1;height:15px;background:rgba(30,41,59,.8);border-radius:7px;overflow:hidden}
.bar-fill{height:100%;border-radius:7px;transition:width .4s;box-shadow:0 0 10px -2px currentColor}
.bar-val{font-size:10px;color:var(--text);width:60px;text-align:right;flex-shrink:0;font-variant-numeric:tabular-nums}

/* ── Live gauges ──────────────────────────────────────────────────────────── */
.gauge-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:11px}
.gauge{background:linear-gradient(180deg,var(--surface2),var(--surface));border:1px solid var(--border);
  border-radius:14px;padding:15px;position:relative;overflow:hidden;box-shadow:var(--shadow);transition:.2s}
.gauge:hover{border-color:var(--borderHi);transform:translateY(-2px)}
.gauge .g-lbl{font-size:8px;letter-spacing:.16em;color:var(--dim);text-transform:uppercase;font-weight:500}
.gauge .g-val{margin-top:8px;display:flex;align-items:baseline;gap:2px;flex-wrap:wrap}
.gauge .g-num{font-size:32px;font-weight:600;line-height:1;font-variant-numeric:tabular-nums;
  background:linear-gradient(180deg,#fff,#9fb3cc);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.gauge .g-unit{font-size:11px;color:var(--dim);margin-left:3px}
.gauge .g-unit-wrap{font-size:11px;color:var(--dim)}
.gauge .g-bar{height:5px;background:rgba(30,41,59,.9);border-radius:3px;margin-top:12px;overflow:hidden}
.gauge .g-bar > div{height:100%;border-radius:3px;transition:width .25s ease-out,background .25s}
.gauge.stale{opacity:.42}
.gauge.stale .g-num{-webkit-text-fill-color:var(--dim)}
.gauge .g-stat{position:absolute;top:13px;right:13px;width:7px;height:7px;border-radius:50%;box-shadow:0 0 7px currentColor}

/* ── Toggles ──────────────────────────────────────────────────────────────── */
.toggle-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:1px solid rgba(30,41,59,.7)}
.toggle-row:last-child{border:none}
.toggle-row .tname{font-size:10px;color:var(--muted)}
.switch{position:relative;width:36px;height:20px;flex-shrink:0}
.switch input{opacity:0;width:0;height:0}
.switch .track{position:absolute;inset:0;background:var(--border2);border-radius:11px;transition:.2s;cursor:pointer}
.switch .track::before{content:'';position:absolute;width:14px;height:14px;border-radius:50%;background:var(--text);top:3px;left:3px;transition:.2s}
.switch input:checked + .track{background:linear-gradient(90deg,rgba(52,211,153,.5),rgba(45,212,191,.5))}
.switch input:checked + .track::before{transform:translateX(16px);background:var(--green)}

/* ── Chat / LLM ───────────────────────────────────────────────────────────── */
.chat{display:flex;flex-direction:column;gap:9px;margin-bottom:11px}
.msg{padding:10px 12px;border-radius:12px;font-size:11px;line-height:1.65;max-width:92%;white-space:pre-wrap;word-break:break-word}
.msg.user{align-self:flex-end;background:linear-gradient(180deg,rgba(34,211,238,.16),rgba(34,211,238,.08));border:1px solid rgba(34,211,238,.25);color:var(--text);border-bottom-right-radius:4px}
.msg.bot{align-self:flex-start;background:var(--surfaceHi);border:1px solid var(--border);color:var(--muted);border-bottom-left-radius:4px}
.msg.bot strong{color:var(--text)}
.msg.err{align-self:flex-start;background:rgba(248,113,113,.1);border:1px solid rgba(248,113,113,.3);color:var(--red)}
.ask-row{display:flex;gap:8px;align-items:flex-end}
.ask-row textarea{flex:1}
.chip{display:inline-block;font-size:9px;padding:5px 11px;border:1px solid var(--border2);border-radius:14px;color:var(--muted);cursor:pointer;margin:0 6px 7px 0;background:var(--surface);transition:.15s}
.chip:hover{border-color:var(--cyan);color:var(--cyan);background:rgba(34,211,238,.06)}

/* ── Modal ────────────────────────────────────────────────────────────────── */
#modal-bg{display:none;position:fixed;inset:0;background:rgba(3,7,18,.72);z-index:100;align-items:center;justify-content:center;padding:20px;backdrop-filter:blur(4px)}
#modal-bg.open{display:flex}
#modal{background:linear-gradient(180deg,var(--surface2),var(--surface));border:1px solid var(--border2);border-radius:14px;padding:22px;width:min(92vw,380px);font-size:11px;box-shadow:0 20px 60px -20px rgba(0,0,0,.7)}
#modal h3{font-size:12px;color:var(--cyan);margin-bottom:10px;letter-spacing:.04em}
#modal p{color:var(--muted);line-height:1.65;margin-bottom:14px}

/* ── Scrollbar ────────────────────────────────────────────────────────────── */
::-webkit-scrollbar{width:5px;height:5px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--border2);border-radius:3px}
::-webkit-scrollbar-thumb:hover{background:var(--borderHi)}

/* ── Responsive ───────────────────────────────────────────────────────────── */
@media(max-width:480px){
  .grid4{grid-template-columns:repeat(2,1fr)}
  .grid3{grid-template-columns:repeat(2,1fr)}
  .gauge .g-num{font-size:28px}
}
@media(min-width:900px){
  #content{max-width:1120px;margin:0 auto;width:100%}
}

/* ============================================================================
   Touch / car head-unit optimization (7–9" capacitive screens, ~1024×600)
   Larger hit targets (≥44px), icon tabs, bigger numerals — finger-friendly.
   ========================================================================== */
html,body{font-size:14px}

#topbar{padding:12px 16px}
#topbar .title{font-size:11px}
#topbar .badge{font-size:10px;padding:4px 9px}

/* Icon tabs: symbol over label, generous tap area */
#tabs{gap:6px;padding:8px 10px}
.tab-btn{display:flex;flex-direction:column;align-items:center;gap:3px;min-width:76px;min-height:54px;
  padding:8px 12px;border-radius:13px;justify-content:center}
.tab-btn .ti{font-size:20px;line-height:1;filter:saturate(.9)}
.tab-btn .tl{font-size:10px;letter-spacing:.05em}
.tab-btn.active .ti{filter:none}

/* Buttons & inputs — min 48px touch height */
button.btn,a.btn{min-height:48px;font-size:12px;padding:12px 18px;border-radius:12px}
input.fld,select.fld{min-height:48px;font-size:13px}
textarea.fld{font-size:13px}

/* Inline unit dropdowns — easier to tap */
.unit-sel{font-size:13px;padding:5px 9px;min-height:32px;border-radius:8px}

/* Lists / rows */
.sess-item{padding:15px 14px;border-radius:12px}
.sess-label{font-size:12px}.sess-meta{font-size:10px}
.sess-del{font-size:18px;padding:10px}
.toggle-row{padding:12px 0}
.toggle-row .tname{font-size:12px}
.sensor-row{padding:11px 0}
.sensor-name{font-size:12px}
.sensor-val{font-size:12px;min-width:98px}
.dot-status{width:11px;height:11px}
.cat-hdr{font-size:10px}

/* Drop zone & empty states */
#dropzone{padding:42px 20px;border-radius:14px}
#dropzone .icon{font-size:44px}
#dropzone div{font-size:13px !important}
.empty{font-size:12px;padding:52px 22px}

/* Gauges */
.gauge-grid{grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px}
.gauge{padding:16px}
.gauge .g-lbl{font-size:9px}
.gauge .g-num{font-size:40px}
.gauge .g-unit,.gauge .g-unit-wrap{font-size:13px}

/* Bigger toggle switch */
.switch{width:48px;height:28px}
.switch .track{border-radius:15px}
.switch .track::before{width:22px;height:22px;top:3px;left:3px}
.switch input:checked + .track::before{transform:translateX(20px)}

/* Chips, chat, stat numerals */
.chip{font-size:11px;padding:8px 14px;border-radius:18px;margin:0 7px 8px 0}
.msg{font-size:12px;padding:11px 13px}
.big.sm{font-size:18px}
.lbl{font-size:9px}

/* Momentum scroll, no text selection on taps */
#content{padding:16px;overscroll-behavior:contain}
.tab-btn,button.btn,.sess-item,.chip,.unit-sel,.switch{user-select:none}

/* Landscape head units: keep gauges roomy, charts taller for visibility */
@media(min-width:760px) and (max-height:680px){
  .chart-wrap{min-height:170px}
}
