/* ============================================================
   Grayvolt Device UI — Stylesheet
   ============================================================ */
:root{
  --bg:#0a0a0b; --bg-elev:#131316; --bg-card:#1a1a1f; --bg-inset:#0d0d10;
  /* v2.13.143: surface elevation rung that markup/JS already referenced but was
     never defined (rendered transparent — incl. the OTA progress track). */
  --surface:#16161b; --surface-2:#202027;
  --border:#2a2a30; --border-strong:#3a3a42; --grid:#22222a;
  /* --text-muted lifted #5a5a65->#82828f: the old value was 2.5-2.9:1 (sub-WCAG-AA)
     and carries unit/axis-label text the instrument exists to communicate. */
  --text:#e8e8ec; --text-dim:#8b8b96; --text-muted:#82828f;
  --accent:#c8ff00; --accent-dim:rgba(200,255,0,.08); --accent-glow:rgba(200,255,0,.18);
  --accent-shadow:rgba(200,255,0,.25); --accent-ring:rgba(200,255,0,.40); --accent-line:rgba(200,255,0,.20);
  --accent-bg:rgba(200,255,0,.06);
  --blue:#4d9fff; --red:#ff4d6a; --green:#00d4aa; --amber:#ffb454; --violet:#a78bfa;
  /* Semantic axis colors — single source of truth. Y moved off the lime accent
     (#c8ff00) onto --green so the accent stays a true highlight, not a data hue.
     Canvas resolves these via getComputedStyle (see app.js AXIS). */
  --axis-x:var(--red); --axis-y:var(--green); --axis-z:var(--blue);
  --font-display:system-ui,-apple-system,'Segoe UI',sans-serif;
  --font-body:system-ui,-apple-system,'Segoe UI',sans-serif;
  --font-mono:ui-monospace,'SF Mono',monospace;
  --radius:12px; --radius-sm:8px; --radius-pill:100px; --radius-cta:6px;
  /* Spacing scale (v2.13.143). */
  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:20px; --s6:24px;
  --pad-row:10px 14px;
  --dur:.2s; --dur-fast:.12s; --ease:cubic-bezier(.22,1,.36,1);
}
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
html,body{background:var(--bg);color:var(--text);font-family:var(--font-body);font-size:15px;line-height:1.6;-webkit-font-smoothing:antialiased;min-height:100%}
body{
  position:relative;overflow-x:hidden;
  background:
    radial-gradient(72vw 56vh at 90% -12%, var(--accent-glow), transparent 55%),
    radial-gradient(56vw 46vh at -8% 112%, rgba(77,159,255,.06), transparent 55%),
    var(--bg);
  background-attachment:fixed;
}

/* Noise overlay */
body::before{
  content:"";position:fixed;inset:0;pointer-events:none;z-index:9999;opacity:.05;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
}
/* Vignette — frames the content with subtly darker edges for depth.
   (The top-right accent glow + bottom-left blue glow now live in the body
   background gradient above.) */
body::after{
  content:"";position:fixed;inset:0;pointer-events:none;z-index:0;
  background:radial-gradient(135% 110% at 50% -5%, transparent 58%, rgba(0,0,0,.5));
}

a{color:inherit;text-decoration:none}
button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}
input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}

/* === Typography === */
.eyebrow{font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--accent);text-transform:uppercase;letter-spacing:2px}
.mono{font-family:var(--font-mono);letter-spacing:.5px}
.mono-label{font-family:var(--font-mono);font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:1.5px}

/* === App Layout === */
.app{position:relative;z-index:1;min-height:100vh;display:flex;flex-direction:column}

/* === Top Nav === */
.topnav{
  position:sticky;top:0;z-index:50;
  background:rgba(10,10,11,.82);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);
  border-bottom:1px solid var(--border);
  padding:14px 24px;
  display:flex;align-items:center;gap:20px;
}
.brand{display:flex;align-items:center;gap:10px;font-family:var(--font-display);font-weight:800;font-size:17px;letter-spacing:-.5px}
.brand-mark{width:40px;height:auto;display:block;filter:drop-shadow(0 0 10px rgba(200,255,0,.25))}
@keyframes pulseDot{0%,100%{box-shadow:0 0 0 0 var(--accent-ring)}50%{box-shadow:0 0 0 6px rgba(200,255,0,0)}}
.brand-name{color:var(--text)}
.brand-sku{color:var(--text-muted);font-weight:400;font-family:var(--font-mono);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;margin-left:4px}

.nav-tabs{display:flex;gap:2px;margin-left:18px;flex:1;overflow-x:auto;scrollbar-width:none}
.nav-tabs::-webkit-scrollbar{display:none}
.nav-tab{
  font-family:var(--font-mono);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;font-weight:500;
  color:var(--text-dim);padding:10px 14px;border-radius:6px;white-space:nowrap;transition:color var(--dur) var(--ease),background var(--dur) var(--ease),box-shadow var(--dur) var(--ease);
}
.nav-tab:hover{color:var(--text)}
.nav-tab.active{color:var(--accent);background:var(--accent-dim);box-shadow:inset 0 -2px 0 var(--accent)}
.nav-tab[data-sku="balancer"]{display:none}
body[data-sku="balancer"] .nav-tab[data-sku="balancer"]{display:block}

.conn-pill{
  display:flex;align-items:center;gap:8px;padding:7px 12px;border:1px solid var(--border);border-radius:var(--radius-pill);
  font-family:var(--font-mono);font-size:11px;letter-spacing:1px;text-transform:uppercase;color:var(--text-dim);
  transition:color var(--dur),border-color var(--dur);
}
.conn-dot{width:7px;height:7px;border-radius:50%;background:var(--text-muted);flex:none}
.conn-pill.online .conn-dot{background:var(--accent);box-shadow:0 0 0 0 var(--accent-ring);animation:pulseDot 2s ease-in-out infinite}
.conn-pill.online{color:var(--text);border-color:var(--accent-line)}
.conn-pill.offline .conn-dot{background:var(--red)}

.rssi{color:var(--text-muted);font-size:10px}

/* === Main === */
main{flex:1;max-width:1240px;width:100%;margin:0 auto;padding:32px 24px 80px}

.view{display:none}
.view.active{display:block}
@keyframes fadeUp{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}

.view-head{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;margin-bottom:28px;flex-wrap:wrap}
.view-head h1{font-family:var(--font-display);font-weight:800;font-size:clamp(28px,4vw,44px);line-height:1.05;letter-spacing:-1.5px}
.view-head h1 .accent{color:var(--accent);text-shadow:0 0 26px var(--accent-glow)}
.view-head .sub{color:var(--text-dim);font-size:14px;margin-top:6px;max-width:520px}
.view-eyebrow{margin-bottom:8px}

/* === Dashboard grid === */
.grid{display:grid;gap:16px}
.grid-hero{grid-template-columns:1.4fr 1fr;margin-bottom:16px}
.grid-stats{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));margin-bottom:16px}
.grid-2{grid-template-columns:1fr 1fr}
body[data-sku="analyzer"] .rpm-card{display:none}
body[data-sku="analyzer"] .grid-hero{grid-template-columns:1fr}
body[data-sku="analyzer"] .tach-settings-section{display:none}
/* v2.13.100: hide every element marked balancer-only when running
 * in analyzer mode. Lets the markup pick up SKU-gated visibility
 * with a data attribute rather than a custom class per panel, and
 * keeps the gating CSS-only (no JS query/hide loop on view changes). */
body[data-sku="analyzer"] [data-balancer-only]{display:none !important}
@media(max-width:960px){
  .grid-hero{grid-template-columns:1fr}
  .grid-stats{grid-template-columns:repeat(2,1fr)}
  .grid-2{grid-template-columns:1fr}
}

.panel{
  background:linear-gradient(180deg,#1d1d23,#17171c);
  border:1px solid var(--border);border-radius:var(--radius);
  position:relative;overflow:hidden;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.04), 0 1px 2px rgba(0,0,0,.45), 0 18px 40px -22px rgba(0,0,0,.65);
  transition:border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.panel:hover{
  border-color:var(--border-strong);
  transform:translateY(-2px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.05), 0 1px 2px rgba(0,0,0,.45), 0 28px 56px -26px rgba(0,0,0,.72), 0 0 0 1px var(--accent-line);
}
.panel-hd{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:18px 20px;border-bottom:1px solid var(--border)}
.panel-hd h3{font-family:var(--font-mono);font-size:11px;text-transform:uppercase;letter-spacing:2px;color:var(--text-dim);font-weight:500}
.panel-bd{padding:20px}
.panel-actions{display:flex;gap:6px}

/* Hero metric cards */
.metric{padding:24px 24px 22px;position:relative}
.metric-label{font-family:var(--font-mono);font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:2px;margin-bottom:14px;display:flex;align-items:center;gap:8px}
.metric-tag{font-family:var(--font-mono);font-size:10px;padding:2px 7px;border-radius:3px;background:var(--accent-dim);color:var(--accent);letter-spacing:1px;border:1px solid var(--accent-line)}
.metric-value{font-family:var(--font-display);font-weight:800;line-height:.95;letter-spacing:-3px;display:flex;align-items:baseline;gap:8px}
.metric-value .num{font-size:clamp(52px,8vw,84px);color:var(--text);font-variant-numeric:tabular-nums}
.metric-value .unit{font-size:22px;color:var(--text-muted);font-weight:500;letter-spacing:-.5px}
.metric-sub{margin-top:14px;display:flex;gap:18px;flex-wrap:wrap;font-family:var(--font-mono);font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:1.5px}
.metric-sub strong{color:var(--text);font-weight:500}
.metric.accent{background:linear-gradient(180deg,rgba(200,255,0,.04) 0%,transparent 60%)}
.metric.accent .metric-value .num{color:var(--accent);text-shadow:0 0 40px var(--accent-glow),0 0 16px var(--accent-shadow)}

/* Axis card */
.axis-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--border)}
.axis-cell{background:var(--bg-card);padding:16px 18px;position:relative}
.axis-cell.dominant{background:linear-gradient(180deg,rgba(200,255,0,.05),transparent);}
.axis-cell.dominant::before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--accent)}
.axis-cell .label{display:flex;align-items:center;justify-content:space-between;font-family:var(--font-mono);font-size:10px;color:var(--text-muted);text-transform:uppercase;letter-spacing:1.5px;margin-bottom:8px}
.axis-cell .label .swatch{width:8px;height:8px;border-radius:2px}
.axis-cell .val{font-family:var(--font-display);font-weight:700;font-size:22px;letter-spacing:-.5px;color:var(--text);font-variant-numeric:tabular-nums}
.axis-cell .val .u{font-size:11px;color:var(--text-muted);font-family:var(--font-mono);font-weight:400;letter-spacing:0;margin-left:3px}
.axis-cell[data-axis="x"] .swatch{background:var(--axis-x)}
.axis-cell[data-axis="y"] .swatch{background:var(--axis-y)}
.axis-cell[data-axis="z"] .swatch{background:var(--axis-z)}

/* Verdict pill */
.verdict{
  display:inline-flex;align-items:center;gap:10px;padding:9px 14px;border:1px solid var(--border);
  border-radius:var(--radius-pill);font-family:var(--font-mono);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;
  background:var(--bg-inset);
}
.verdict-dot{width:8px;height:8px;border-radius:50%;background:var(--text-muted)}
.verdict strong{color:var(--text);font-weight:500}
.verdict.g-good{border-color:var(--accent-line);color:var(--accent)}
.verdict.g-good .verdict-dot{background:var(--accent);box-shadow:0 0 0 0 var(--accent-ring);animation:pulseDot 2s infinite}
.verdict.g-ok{border-color:rgba(255,180,84,.3);color:var(--amber)}
.verdict.g-ok .verdict-dot{background:var(--amber)}
.verdict.g-bad{border-color:rgba(255,77,106,.3);color:var(--red)}
.verdict.g-bad .verdict-dot{background:var(--red)}

/* Canvas panels */
canvas{display:block;width:100%}
.chart-wrap{padding:16px 20px 20px}
.chart-legend{display:flex;gap:16px;margin-top:10px;font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:1.5px;color:var(--text-muted)}
.chart-legend .item{display:flex;align-items:center;gap:6px}
.chart-legend .sw{width:10px;height:2px}

/* === Buttons === */
/* v2.13.57: defensive global rule. `.btn { display: inline-flex }` (and
 * any other display:* rule with class specificity) overrides the default
 * user-agent `[hidden] { display: none }`, which broke the Export/Import
 * settings buttons that should have been invisible. Force [hidden] to
 * always win, anywhere. */
[hidden]{display:none !important}

.btn{
  display:inline-flex;align-items:center;gap:8px;padding:12px 20px;border-radius:var(--radius-sm);
  font-family:var(--font-display);font-size:14px;font-weight:600;letter-spacing:-.2px;
  transition:all var(--dur) ease-out;border:1px solid transparent;
}
.btn-primary{background:linear-gradient(180deg,#d6ff45,#c8ff00);color:#0a0a0b;box-shadow:inset 0 1px 0 rgba(255,255,255,.28), 0 6px 18px -8px var(--accent-shadow)}
.btn-primary:hover{transform:translateY(-2px);box-shadow:inset 0 1px 0 rgba(255,255,255,.32), 0 12px 34px -8px var(--accent-shadow), 0 0 0 1px rgba(200,255,0,.5)}
.btn-primary:active{transform:translateY(0)}
.btn-ghost{border-color:var(--border);color:var(--text)}
.btn-ghost:hover{border-color:var(--text-muted);background:rgba(255,255,255,.03)}
.btn-warn{background:#f2a441;color:#1a1200;border-color:#f2a441}
.btn-warn:hover{background:#ffb757;box-shadow:0 8px 30px rgba(242,164,65,.25)}
.btn-sm{padding:8px 14px;font-size:12px}
.btn-lg{padding:16px 28px;font-size:15px}
.btn-danger{border-color:rgba(255,77,106,.3);color:var(--red)}
.btn-danger:hover{background:rgba(255,77,106,.08)}
.btn[disabled]{opacity:.4;pointer-events:none}
.btn .arrow{transition:transform var(--dur)}
.btn:hover .arrow{transform:translateX(3px)}

/* Segmented control */
.seg{display:inline-flex;padding:3px;background:var(--bg-inset);border:1px solid var(--border);border-radius:var(--radius-sm);gap:2px}
.seg button{
  padding:7px 12px;font-family:var(--font-mono);font-size:10px;letter-spacing:1.5px;text-transform:uppercase;
  color:var(--text-muted);border-radius:5px;transition:all var(--dur);font-weight:500;
}
.seg button:hover{color:var(--text)}
.seg button.active{background:var(--bg-card);color:var(--accent)}

/* === Inputs === */
.field{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
.field label{font-family:var(--font-mono);font-size:11px;text-transform:uppercase;letter-spacing:1.5px;color:var(--text-dim)}
.input,.select{
  background:var(--bg-inset);border:1px solid var(--border);border-radius:var(--radius-sm);
  color:var(--text);padding:11px 14px;font-size:14px;transition:border-color var(--dur);outline:none;width:100%;
  font-family:var(--font-body);
}
.input:focus,.select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-bg)}
.input-row{display:flex;gap:8px;align-items:stretch}

/* === Wizard === */
.wizard-stepper{display:flex;gap:8px;margin-bottom:28px;overflow-x:auto;scrollbar-width:none;padding-bottom:4px}
.wizard-stepper::-webkit-scrollbar{display:none}
.step-node{
  flex:1;min-width:140px;display:flex;align-items:center;gap:12px;padding:12px 14px;
  background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-sm);
  transition:border-color var(--dur);
}
.step-node .n{
  width:26px;height:26px;border-radius:50%;border:1px solid var(--border);flex:none;
  font-family:var(--font-mono);font-size:11px;display:flex;align-items:center;justify-content:center;color:var(--text-muted);
}
.step-node .t{font-family:var(--font-mono);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:var(--text-dim)}
.step-node.active{border-color:var(--accent)}
.step-node.active .n{background:var(--accent);color:#0a0a0b;border-color:var(--accent)}
.step-node.active .t{color:var(--accent)}
.step-node.done .n{background:var(--accent-dim);color:var(--accent);border-color:var(--accent-line)}
.step-node.done .t{color:var(--text)}

.step-panel{display:none}
.step-panel.active{display:block;animation:fadeUp .4s ease-out}

.readout-row{display:flex;gap:24px;padding:18px 22px;background:var(--bg-inset);border:1px solid var(--border);border-radius:var(--radius-sm);margin:20px 0}
.readout-row .item{flex:1}
.readout-row .item .label{font-family:var(--font-mono);font-size:10px;letter-spacing:1.5px;color:var(--text-muted);text-transform:uppercase;margin-bottom:6px}
.readout-row .item .val{font-family:var(--font-display);font-weight:700;font-size:26px;letter-spacing:-.5px;font-variant-numeric:tabular-nums}
.readout-row .item .val .u{font-size:12px;color:var(--text-muted);font-family:var(--font-mono);font-weight:400;margin-left:4px}

/* Progress */
.progress{height:3px;background:var(--border);border-radius:100px;overflow:hidden;margin-top:14px}
.progress-fill{height:100%;width:0;background:var(--accent);transition:width .2s linear;box-shadow:0 0 12px var(--accent-shadow)}

/* === Polar plot wrapper === */
.polar-wrap{display:flex;flex-direction:column;align-items:center;padding:24px;gap:16px}
.polar-wrap canvas{max-width:420px;aspect-ratio:1/1;cursor:grab;border-radius:50%;touch-action:none;user-select:none}
.polar-wrap canvas:active{cursor:grabbing}
.polar-hint{font-family:var(--font-mono);font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:1.5px;text-align:center}
.polar-ctl{display:flex;align-items:center;gap:10px}
.view-rot{transition:color .15s}
.view-rot.rotated{color:var(--accent)}
.rot-reset{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;background:transparent;color:var(--text-dim);border:1px solid var(--border);border-radius:6px;font-size:14px;cursor:pointer;transition:all .15s;padding:0}
.rot-reset:hover{color:var(--accent);border-color:var(--accent)}

/* Results */
.result-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}
@media(max-width:600px){.result-grid{grid-template-columns:1fr}}
.result-card{padding:24px;text-align:left;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius)}
.result-card.hero{border-color:var(--accent-line);background:linear-gradient(180deg,rgba(200,255,0,.04),transparent 70%)}
.result-card .label{font-family:var(--font-mono);font-size:11px;letter-spacing:2px;color:var(--accent);text-transform:uppercase;margin-bottom:12px}
.result-card .val{font-family:var(--font-display);font-weight:800;font-size:56px;letter-spacing:-2px;line-height:1;font-variant-numeric:tabular-nums}
.result-card .val .u{font-size:18px;color:var(--text-muted);font-weight:500;letter-spacing:-.5px;margin-left:4px}
.result-card .sub{margin-top:10px;font-size:13px;color:var(--text-dim)}

/* === Settings === */
.settings-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}
@media(max-width:800px){.settings-grid{grid-template-columns:1fr}}
.setting-section{padding:20px}
.setting-section h4{font-family:var(--font-mono);font-size:11px;text-transform:uppercase;letter-spacing:2px;color:var(--accent);margin-bottom:16px;font-weight:500}

/* Waterfall */
.waterfall-wrap{position:relative}
.waterfall-legend{position:absolute;top:12px;right:16px;font-family:var(--font-mono);font-size:10px;color:var(--text-muted);letter-spacing:1.5px;text-transform:uppercase;background:rgba(10,10,11,.6);padding:4px 8px;border-radius:4px;border:1px solid var(--border)}

/* Tach trigger pulse */
.tach-trigger{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:1.5px}
.tach-dot{width:8px;height:8px;border-radius:50%;background:var(--text-muted);transition:background .1s,box-shadow .1s}
.tach-dot.firing{background:var(--accent);box-shadow:0 0 16px var(--accent)}

/* === Tachometer live + calibration === */
.tach-live-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:16px}
.tach-live-cell{display:flex;flex-direction:column;gap:6px;padding:var(--pad-row);background:var(--bg-inset);border:1px solid var(--border);border-radius:var(--radius-sm)}
.tach-adc-val{color:var(--accent);font-weight:500;font-size:20px;font-variant-numeric:tabular-nums}
.comp-pill{display:inline-flex;align-items:center;gap:8px;padding:4px 10px;background:transparent;border:1px solid var(--border);border-radius:var(--radius-pill);font-family:var(--font-mono);font-size:12px;font-weight:500;letter-spacing:1px;color:var(--text-muted);text-transform:uppercase;width:fit-content;transition:all .1s}
.comp-pill .comp-dot{width:8px;height:8px;border-radius:50%;background:var(--text-muted);transition:all .1s}
.comp-pill.high{border-color:var(--accent-line);color:var(--accent)}
.comp-pill.high .comp-dot{background:var(--accent);box-shadow:0 0 10px var(--accent)}

.cal-callout{margin-top:14px;padding:14px;background:var(--bg-inset);border:1px solid var(--border);border-radius:var(--radius-sm)}
.cal-callout-hd{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.cal-ts{font-family:var(--font-mono);font-size:13px;color:var(--text);margin-top:2px}
.cal-values{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:14px;padding-top:14px;border-top:1px solid var(--border)}
.cal-values>div{display:flex;flex-direction:column;gap:4px}
.cal-values .mono{color:var(--accent);font-size:15px;font-weight:500;font-variant-numeric:tabular-nums}

/* === Calibration modal === */
.cal-modal-backdrop{position:fixed;inset:0;z-index:300;background:rgba(8,8,10,.75);backdrop-filter:blur(8px);display:none;align-items:center;justify-content:center;padding:20px;animation:fadeIn .2s}
.cal-modal-backdrop.open{display:flex}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
.cal-modal{width:min(540px,100%);max-height:90vh;overflow-y:auto;background:var(--bg-card);border:1px solid var(--border-strong);border-radius:var(--radius);box-shadow:0 30px 80px rgba(0,0,0,.7);animation:fadeUp .25s}
.cal-modal-hd{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--border)}
.cal-modal-hd h3{font-family:var(--font-display);font-size:22px;font-weight:700;letter-spacing:-.5px}
.cal-modal-hd .mono-label{color:var(--accent)}
.cal-modal-bd{padding:24px}
.cal-modal-ft{display:flex;gap:10px;justify-content:space-between;padding:16px 24px;border-top:1px solid var(--border);flex-wrap:wrap}
.cal-close{background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:22px;padding:4px 8px;line-height:1}
.cal-close:hover{color:var(--text)}

.cal-steps{display:flex;gap:8px;margin-bottom:20px}
.cal-step-chip{flex:1;padding:10px 12px;background:var(--bg-inset);border:1px solid var(--border);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:1.5px;color:var(--text-muted);text-align:center;position:relative}
.cal-step-chip.active{border-color:var(--accent);color:var(--accent);background:var(--accent-bg)}
.cal-step-chip.done{border-color:var(--accent-line);color:var(--accent)}
.cal-step-chip.done::after{content:"\2713";margin-left:6px}

.cal-instruct{padding:16px 18px;background:var(--accent-bg);border:1px solid var(--accent-line);border-radius:var(--radius-sm);margin-bottom:20px;font-size:15px;line-height:1.5;color:var(--text)}
.cal-instruct strong{color:var(--accent)}

.cal-live-block{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:16px}
.cal-live-block .cell{padding:16px;background:var(--bg-inset);border:1px solid var(--border);border-radius:var(--radius-sm);display:flex;flex-direction:column;gap:8px}
.cal-live-block .cell .label{font-family:var(--font-mono);font-size:10px;letter-spacing:1.5px;text-transform:uppercase;color:var(--text-muted)}
.cal-live-block .cell .val{font-family:var(--font-mono);font-size:24px;font-weight:500;color:var(--accent);font-variant-numeric:tabular-nums}
.cal-live-block .cell .val.big{font-size:32px}
.cal-live-block .cell .val.muted{color:var(--text-dim)}

.cal-edge-counter{padding:20px;background:var(--bg-inset);border:2px solid var(--border);border-radius:var(--radius-sm);text-align:center;margin-bottom:16px;transition:border-color .2s}
.cal-edge-counter.ok{border-color:var(--accent)}
.cal-edge-counter.fail{border-color:var(--red)}
.cal-edge-counter .count{font-family:var(--font-display);font-size:56px;font-weight:800;line-height:1;letter-spacing:-2px;font-variant-numeric:tabular-nums}
.cal-edge-counter.ok .count{color:var(--accent)}
.cal-edge-counter.fail .count{color:var(--red)}
.cal-edge-counter .label{font-family:var(--font-mono);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:var(--text-muted);margin-top:8px}
.cal-edge-counter .status{font-family:var(--font-mono);font-size:12px;letter-spacing:1px;text-transform:uppercase;margin-top:12px;padding:6px 12px;border-radius:var(--radius-pill);display:inline-block;background:var(--bg-card);border:1px solid var(--border);color:var(--text-dim)}
.cal-edge-counter.ok .status{color:var(--accent);border-color:var(--accent-line)}
.cal-edge-counter.fail .status{color:var(--red);border-color:rgba(255,77,106,.3)}

.cal-result{padding:18px;background:var(--accent-bg);border:1px solid var(--accent-line);border-radius:var(--radius-sm);margin-bottom:16px}
.cal-result h5{font-family:var(--font-mono);font-size:11px;text-transform:uppercase;letter-spacing:1.5px;color:var(--accent);margin-bottom:10px}
.cal-result .vals{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.cal-result .vals>div{display:flex;flex-direction:column;gap:4px}
.cal-result .vals .mono-label{font-size:10px}
.cal-result .vals .mono{color:var(--text);font-size:18px;font-weight:500}

.cal-fail{padding:18px;background:rgba(255,77,106,.08);border:1px solid rgba(255,77,106,.3);border-radius:var(--radius-sm);margin-bottom:16px}
.cal-fail h5{color:var(--red);font-family:var(--font-mono);font-size:11px;text-transform:uppercase;letter-spacing:1.5px;margin-bottom:6px}
.cal-fail p{color:var(--text-dim);font-size:13px;line-height:1.5}

/* Inline trigger tuning inside verify step */
.cal-tune{margin-bottom:16px;padding:16px;background:var(--bg-inset);border:1px solid var(--border);border-radius:var(--radius-sm)}
.cal-tune-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}
.cal-tune-reset{background:transparent;border:1px solid var(--border);color:var(--text-dim);font-family:var(--font-mono);font-size:10px;letter-spacing:1px;text-transform:uppercase;padding:5px 10px;border-radius:var(--radius-pill);cursor:pointer;transition:all .12s}
.cal-tune-reset:hover{color:var(--accent);border-color:var(--accent)}
.cal-tune-row{display:flex;align-items:center;gap:12px;margin-bottom:12px}
.cal-tune-row label{flex:0 0 120px;font-size:11px}
.cal-tune-ctl{display:flex;gap:6px;align-items:center;flex:1;flex-wrap:wrap}
.cal-tune-ctl input{flex:1;min-width:80px;padding:8px 12px;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font-family:var(--font-mono);font-size:14px;font-weight:500;text-align:center;font-variant-numeric:tabular-nums}
.cal-tune-ctl input:focus{outline:none;border-color:var(--accent)}
.cal-step-btn{padding:8px 10px;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-dim);font-family:var(--font-mono);font-size:11px;font-weight:500;cursor:pointer;transition:all .12s;min-width:44px}
.cal-step-btn:hover{color:var(--accent);border-color:var(--accent)}
.cal-edge-seg{display:flex;flex:1;gap:0;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden;background:var(--bg-card)}
.cal-edge-btn{flex:1;padding:9px 12px;background:transparent;border:none;color:var(--text-dim);font-family:var(--font-mono);font-size:11px;letter-spacing:.5px;cursor:pointer;transition:all .12s}
.cal-edge-btn+.cal-edge-btn{border-left:1px solid var(--border)}
.cal-edge-btn.active{background:var(--accent-bg);color:var(--accent)}
.cal-tune-hint{font-family:var(--font-mono);font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--text-muted);margin-top:10px;line-height:1.5}
.cal-tune-actions{display:flex;align-items:center;gap:12px;margin-top:14px;padding-top:14px;border-top:1px solid var(--border)}
.cal-tune-status{font-family:var(--font-mono);font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--accent);opacity:0;transition:opacity .2s}
.cal-tune-status.show{opacity:1}

/* Firmware flash disclaimer */
.fw-warn{margin-top:12px;padding:14px 16px;background:rgba(242,164,65,.06);border:1px solid rgba(242,164,65,.28);border-left:3px solid #f2a441;border-radius:var(--radius-sm)}
.fw-warn-hd{display:flex;align-items:center;gap:8px;color:#f2a441;font-family:var(--font-mono);font-size:10px;letter-spacing:1.5px;text-transform:uppercase;font-weight:600;margin-bottom:10px}
.fw-warn-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
.fw-warn-list li{position:relative;padding-left:16px;font-size:12.5px;line-height:1.55;color:var(--text-dim)}
.fw-warn-list li::before{content:"";position:absolute;left:0;top:8px;width:4px;height:4px;border-radius:50%;background:#f2a441;opacity:.7}
.fw-warn-list li strong{color:var(--text);font-weight:600}
.fw-warn-list li .mono{color:var(--text);font-family:var(--font-mono);font-size:11px}

/* Toast */
#toasts{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);z-index:300;display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none}
/* .toast is clickable (tap-to-dismiss) while #toasts stays click-through. */
.toast{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-sm);padding:10px 16px;font-family:var(--font-mono);font-size:11px;text-transform:uppercase;letter-spacing:1.5px;color:var(--text);animation:fadeUp .3s ease-out;pointer-events:auto;cursor:pointer;max-width:min(92vw,520px)}
.toast.ok{border-color:var(--accent-line);color:var(--accent)}
.toast.err{border-color:rgba(255,77,106,.3);color:var(--red)}

/* Connection-loss banner (v2.13.143) — persistent, unmissable on weak WiFi. */
#conn-banner{position:sticky;top:0;z-index:60;background:linear-gradient(180deg,rgba(255,77,106,.18),rgba(255,77,106,.10));border-bottom:1px solid rgba(255,77,106,.4);color:var(--red);font-family:var(--font-mono);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;text-align:center;padding:8px 14px}
#conn-banner[hidden]{display:none}

/* Misc */
.hidden{display:none!important}
.flex{display:flex}.gap-2{gap:8px}.gap-3{gap:12px}.gap-4{gap:16px}
.flex-wrap{flex-wrap:wrap}
.items-center{align-items:center}.justify-between{justify-content:space-between}
.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.mt-6{margin-top:24px}
.text-dim{color:var(--text-dim)}.text-muted{color:var(--text-muted)}.text-accent{color:var(--accent)}

/* Mobile nav adjust */
@media(max-width:720px){
  .topnav{padding:12px 16px;gap:10px;flex-wrap:wrap}
  .nav-tabs{order:3;width:100%;margin-left:0}
  .conn-pill{margin-left:auto}
  main{padding:20px 16px 60px}
  .view-head h1{font-size:28px}
  .readout-row{flex-direction:column;gap:12px}
  .metric-value .num{font-size:56px;letter-spacing:-2px}
}

/* ============================================================
   HARMONIC TRACKER (Spectrum view) — replaces waterfall
   ============================================================ */
.harm-range{display:flex;gap:2px;border:1px solid var(--border);border-radius:var(--radius-pill);padding:2px;background:var(--bg-inset)}
.harm-range button{padding:5px 10px;font-family:var(--font-mono);font-size:11px;letter-spacing:.5px;color:var(--text-muted);border-radius:var(--radius-pill);transition:all var(--dur)}
.harm-range button:hover{color:var(--text-dim)}
.harm-range button.active{background:var(--accent-bg);color:var(--accent);border:1px solid var(--accent-line)}
.harm-toggles{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:4px}
.harm-toggle{display:inline-flex;align-items:center;gap:8px;padding:6px 12px;border-radius:var(--radius-pill);background:var(--bg-inset);border:1px solid var(--border);font-family:var(--font-mono);font-size:11px;letter-spacing:.5px;color:var(--text-dim);cursor:pointer;transition:opacity var(--dur),background var(--dur),border-color var(--dur)}
.harm-toggle:hover{background:var(--bg-card)}
.harm-toggle .sw{width:10px;height:10px;border-radius:50%;background:var(--c,var(--accent));flex:none;box-shadow:0 0 8px 0 var(--c,var(--accent))}
.harm-toggle .lbl{color:var(--text);font-weight:500}
.harm-toggle .val{font-variant-numeric:tabular-nums;color:var(--text-dim)}
.harm-toggle .trend-up{color:var(--amber);font-weight:700;margin-left:2px}
.harm-toggle.off{opacity:.4}
.harm-toggle.off .sw{background:var(--text-muted)!important;box-shadow:none}
.harm-toggle.off .lbl{color:var(--text-muted)}

.diag-list{display:flex;flex-direction:column;gap:8px}
.diag-row{display:grid;grid-template-columns:42px 1fr auto;gap:14px;align-items:center;padding:var(--pad-row);background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-sm);transition:opacity var(--dur),border-color var(--dur)}
.diag-row .harm{font-family:var(--font-mono);font-size:16px;font-weight:600;letter-spacing:.5px}
.diag-row .meta{display:flex;flex-direction:column;gap:6px;min-width:0}
.diag-row .t-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;row-gap:4px}
.diag-row .t{font-family:var(--font-display);font-size:14px;font-weight:600;color:var(--text);flex:1 1 100%;min-width:0}
.diag-row .d{color:var(--text-dim);font-size:12px;line-height:1.45}
.diag-row .cur-val{font-family:var(--font-mono);font-size:14px;font-weight:600;font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}
.diag-row .cur-val .u{font-size:10px;color:var(--text-muted);margin-left:3px}
.diag-row.sev-watch{border-color:rgba(255,180,84,.3);background:linear-gradient(180deg,rgba(255,180,84,.04),transparent),var(--bg-card)}
.diag-row.sev-elevated{border-color:var(--accent-line);background:linear-gradient(180deg,var(--accent-bg),transparent),var(--bg-card)}
.diag-row.hidden-trace{opacity:.35}

.sev-pill{font-family:var(--font-mono);font-size:9.5px;letter-spacing:1px;text-transform:uppercase;font-weight:500;padding:2px 8px;border-radius:var(--radius-pill);border:1px solid var(--border);color:var(--text-muted);background:var(--bg-inset)}
.sev-pill.ok{color:var(--text-dim)}
.sev-pill.watch{color:var(--amber);background:rgba(255,180,84,.08);border-color:rgba(255,180,84,.3)}
.sev-pill.elevated{color:var(--accent);background:var(--accent-dim);border-color:var(--accent-line)}

/* ============================================================
   BEFORE/AFTER PANEL (Verify step)
   ============================================================ */
.ba-panel{margin-top:18px;background:var(--bg-card);border:1px solid var(--accent-line);border-radius:var(--radius);overflow:hidden;box-shadow:0 0 0 1px var(--accent-line) inset,0 24px 60px -30px var(--accent-glow)}
.ba-hd{display:flex;justify-content:space-between;align-items:center;padding:14px 20px;border-bottom:1px solid var(--border);background:linear-gradient(180deg,var(--accent-bg),transparent);flex-wrap:wrap;gap:10px}
.ba-hd-title{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}
.ba-hd-title h3{font-family:var(--font-display);font-size:18px;font-weight:700;letter-spacing:-.4px;color:var(--text)}
.ba-hd-title h3 .arr{color:var(--accent);margin:0 4px}
.ba-verdict{display:inline-flex;align-items:center;gap:8px;padding:6px 12px;border-radius:var(--radius-pill);font-family:var(--font-mono);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;font-weight:500;border:1px solid var(--border)}
.ba-verdict .dot{width:7px;height:7px;border-radius:50%;background:currentColor;flex:none;animation:pulseDot 2s ease-in-out infinite}
.ba-verdict.pass{color:var(--accent);background:var(--accent-dim);border-color:var(--accent-line)}
.ba-verdict.warn{color:var(--amber);background:rgba(255,180,84,.08);border-color:rgba(255,180,84,.25)}
.ba-verdict strong{font-weight:500}
.ba-headline{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--border)}
@media (max-width:900px){.ba-headline{grid-template-columns:1fr}}
.ba-tile{background:var(--bg-card);padding:18px 20px;display:flex;flex-direction:column;gap:10px}
.ba-tile .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:2px;color:var(--text-muted);text-transform:uppercase;font-weight:500}
.ba-tile .row{display:flex;align-items:center;gap:14px}
.ba-tile .col{flex:1;min-width:0}
.ba-tile .col .tag{font-family:var(--font-mono);font-size:9.5px;letter-spacing:1.2px;text-transform:uppercase;color:var(--text-muted);margin-bottom:4px}
.ba-tile .col.before .tag{color:var(--red)}
.ba-tile .col.after .tag{color:var(--accent)}
.ba-tile .num{font-family:var(--font-display);font-weight:800;font-size:28px;letter-spacing:-1px;line-height:1;font-variant-numeric:tabular-nums;color:var(--text)}
.ba-tile .col.before .num{color:var(--red)}
.ba-tile .col.after .num{color:var(--accent)}
.ba-tile .num.quality{font-size:24px}
.ba-tile .num .u{font-family:var(--font-display);font-size:13px;color:var(--text-muted);font-weight:500;margin-left:3px}
.ba-tile .row .arrow{color:var(--text-muted);font-family:var(--font-mono);font-size:18px;flex:none}
.ba-tile .delta{font-family:var(--font-mono);font-size:11px;letter-spacing:.5px;padding-top:8px;border-top:1px dashed var(--border)}
.ba-tile .delta.good{color:var(--accent)}
.ba-tile .delta.neutral{color:var(--text-muted)}
.ba-sub{background:var(--bg-elev);border-top:1px solid var(--border);padding:14px 20px}
.ba-sub-hd{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;flex-wrap:wrap;gap:8px}
.ba-legend{display:flex;gap:14px}
.ba-legend .li{display:flex;align-items:center;gap:6px;font-family:var(--font-mono);font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--text-dim)}
.ba-legend .sw{width:10px;height:2px;border-radius:1px;flex:none}
.ba-axis-grid{display:flex;flex-direction:column;gap:10px}
.ba-axis-row{display:grid;grid-template-columns:36px 1fr 60px;gap:14px;align-items:center;padding:var(--pad-row);background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-sm)}
.ba-axis-label{font-family:var(--font-mono);font-size:13px;font-weight:500;color:var(--text);letter-spacing:1px}
.ba-axis-row[data-axis="x"] .ba-axis-label{color:var(--red)}
.ba-axis-row[data-axis="y"] .ba-axis-label{color:var(--green)}
.ba-axis-row[data-axis="z"] .ba-axis-label{color:var(--blue)}
.ba-axis-bars{display:flex;flex-direction:column;gap:6px;min-width:0}
.bar-row{display:grid;grid-template-columns:50px 1fr 70px;align-items:center;gap:10px}
.bar-row .bar-tag{font-family:var(--font-mono);font-size:9.5px;letter-spacing:1px;text-transform:uppercase;color:var(--text-muted)}
.bar-row .track{height:6px;background:var(--bg-inset);border-radius:3px;border:1px solid var(--border);overflow:hidden}
.bar-row .track .fill{height:100%;border-radius:2px;transition:width .5s ease-out}
.bar-row .track .fill.before{background:var(--red)}
.bar-row .track .fill.after{background:var(--accent)}
.bar-row .bar-val{font-family:var(--font-mono);font-size:11px;color:var(--text);font-variant-numeric:tabular-nums;text-align:right}
.bar-row .bar-val.accent{color:var(--accent)}
.ba-axis-delta{font-family:var(--font-mono);font-size:14px;font-weight:500;color:var(--accent);text-align:right;font-variant-numeric:tabular-nums}
.ba-axis-delta.worse{color:var(--red)}
.ba-harm-table{border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden}
.ba-harm-row{display:grid;grid-template-columns:60px 1fr 1fr 1.4fr;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid var(--border)}
/* Metric value size modifiers — replace per-tile inline font-size overrides so
   the same role shares one scale (number + unit scale together). */
.metric-value.lg .num{font-size:clamp(38px,6vw,48px);letter-spacing:-1.5px}
.metric-value.lg .unit{font-size:16px}
.metric-value.md .num{font-size:38px;letter-spacing:-1px}
.metric-value.md .unit{font-size:15px}
.metric-value.sm .num{font-size:32px;letter-spacing:-1px}
.metric-value.sm .unit{font-size:14px}
.metric-value.xs .num{font-size:28px;letter-spacing:-.5px}
.metric-value.xs .unit{font-size:13px}
.ba-harm-row:last-child{border-bottom:0}
.ba-harm-row.hd{background:var(--bg-card);font-family:var(--font-mono);font-size:10px;letter-spacing:1.5px;text-transform:uppercase;color:var(--text-muted)}
.ba-harm-row.dominant{background:var(--accent-bg)}
.ba-harm-row .harm{font-family:var(--font-mono);font-size:13px;color:var(--text);font-weight:500}
.ba-harm-row.dominant .harm{color:var(--accent)}
.ba-harm-row .num{font-family:var(--font-mono);font-size:12px;font-variant-numeric:tabular-nums;color:var(--text-dim)}
.ba-harm-row .num.accent{color:var(--accent)}
.ba-harm-row .cause{font-size:12px;color:var(--text-dim)}
.ba-harm-row.warn-text{background:rgba(255,180,84,.06)}
.ba-harm-row.warn-text .num.accent{color:var(--amber)}
.ba-footer{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--border);border-top:1px solid var(--border)}
@media (max-width:720px){.ba-footer{grid-template-columns:repeat(2,1fr)}}
.ba-footer-item{background:var(--bg-card);padding:10px 14px;display:flex;flex-direction:column;gap:3px}
.ba-footer-item .lbl{font-family:var(--font-mono);font-size:9.5px;letter-spacing:1.2px;text-transform:uppercase;color:var(--text-muted)}
.ba-footer-item .val{font-family:var(--font-display);font-size:14px;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums}
.ba-footer-item .val.accent{color:var(--accent)}
.ba-footer-item .val.mono{font-family:var(--font-mono);font-size:12px}

/* ============================================================
   MODAL (placement-entry + save-to-history)
   ============================================================ */
/* `[hidden]` keeps the modal off the page when the attribute is set.
 * Without this, the `display:flex` below wins specificity over the UA
 * stylesheet's `[hidden]{display:none}` and the modal stays visible
 * permanently — which is exactly the bug in v2.9.54/55. The !important
 * makes sure no later rule (or inline style) can re-show it accidentally. */
.gv-modal-overlay[hidden]{display:none !important}
.gv-modal-overlay{position:fixed;inset:0;z-index:200;background:rgba(8,8,10,.78);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:flex;align-items:center;justify-content:center;padding:24px;animation:fadeIn .15s ease-out}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
.gv-modal{background:var(--bg-card);border:1px solid var(--accent-line);border-radius:var(--radius);max-width:560px;width:100%;max-height:90vh;display:flex;flex-direction:column;box-shadow:0 24px 60px -20px rgba(0,0,0,.6),0 0 0 1px var(--accent-line) inset}
.gv-modal-hd{display:flex;justify-content:space-between;align-items:center;padding:14px 20px;border-bottom:1px solid var(--border);background:linear-gradient(180deg,var(--accent-bg),transparent)}
.gv-modal-hd h3{font-family:var(--font-display);font-size:18px;font-weight:700;letter-spacing:-.4px;color:var(--text);margin:0}
.gv-modal-close{font-size:24px;line-height:1;color:var(--text-muted);background:none;border:none;cursor:pointer;padding:0 4px}
.gv-modal-close:hover{color:var(--text)}
.gv-modal-bd{padding:18px 20px;overflow-y:auto;flex:1}
.gv-modal-ft{display:flex;justify-content:flex-end;gap:10px;padding:14px 20px;border-top:1px solid var(--border);background:var(--bg-inset)}
.pmodal-row{display:grid;grid-template-columns:1fr 1fr 32px;gap:10px;align-items:end;margin-bottom:8px}
.pmodal-row .field{margin:0}
.pmodal-row-remove{background:none;border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-muted);cursor:pointer;font-size:18px;line-height:1;padding:8px 0;height:38px}
.pmodal-row-remove:hover{color:var(--red);border-color:var(--red)}
.pmodal-row-remove:disabled{opacity:.4;cursor:not-allowed}

/* ============================================================
   UI polish (ui-refresh) — global detail refinements. Additive
   only: themed scrollbars, text selection, keyboard focus rings,
   and reduced-motion safety. No markup or JS changes.
   ============================================================ */
::selection{background:var(--accent);color:#0a0a0b}

/* Themed scrollbars so overflow areas match the dark UI instead of
   the OS default light bar. */
*{scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent}
::-webkit-scrollbar{width:11px;height:11px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:100px;border:3px solid var(--bg);background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background:#4a4a52;background-clip:padding-box;border:3px solid var(--bg)}

/* Keyboard focus ring — the inputs/buttons clear the UA outline for the
   pointer case (outline:none), so restore an accent ring for keyboard
   users only via :focus-visible. */
:focus-visible{outline:2px solid var(--accent-ring);outline-offset:2px;border-radius:4px}
.btn:focus-visible,.nav-tab:focus-visible{outline-offset:3px}

/* Orchestrated entrance — when a view becomes active, its top-level
   sections rise + fade in a short stagger. Replaces the old whole-view
   fadeUp with a more deliberate cascade (re-triggers on every tab switch
   because display:none -> block restarts the animation). Transform/opacity
   only, so it's compositor-cheap and never reflows the live charts. */
@keyframes rise{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}
/* `backwards` (not `both`): applies the hidden start-state during each
   element's stagger delay, but releases the transform once done so the
   .panel:hover lift isn't locked out by a lingering forwards-fill. */
.view.active>*{animation:rise .5s var(--ease) backwards}
.view.active>*:nth-child(1){animation-delay:0s}
.view.active>*:nth-child(2){animation-delay:.06s}
.view.active>*:nth-child(3){animation-delay:.12s}
.view.active>*:nth-child(4){animation-delay:.18s}
.view.active>*:nth-child(5){animation-delay:.24s}
.view.active>*:nth-child(6){animation-delay:.3s}
.view.active>*:nth-child(n+7){animation-delay:.34s}

/* --- Per-tab finishing --------------------------------------------------- */

/* Diagnostic peak lists (Analyzer envelope-spectrum + Torsional). app.js
   renders these as bare <div> text rows; give them table-like rhythm —
   monospace tabular figures, hairline separators, and a hover highlight —
   so they read as a designed readout, not a text dump. The empty-state
   sentence (set as textContent, no child divs) is untouched. */
#anlz-peaks>div, #tors-peaks>div{
  font-family:var(--font-mono);font-variant-numeric:tabular-nums;
  padding:8px 12px;font-size:12px;line-height:1.5;
  border-bottom:1px solid var(--border);transition:background var(--dur) var(--ease);
}
#anlz-peaks>div:last-child, #tors-peaks>div:last-child{border-bottom:0}
#anlz-peaks>div:hover, #tors-peaks>div:hover{background:var(--accent-bg)}

/* Segmented controls (FFT size, gyro XYZ, etc.) — give the active segment a
   subtle inset accent ring so the selection reads more deliberately. */
.seg button.active{box-shadow:inset 0 0 0 1px var(--accent-line)}

/* Raw-capture control bar — group the loose controls onto a tidy inset
   surface (labeled inputs left, actions pushed to the right edge). Applies
   to both the accel (dashboard) and gyro raw-capture rows. */
.cap-controls{
  background:var(--bg-inset);border:1px solid var(--border);border-radius:var(--radius-sm);
  padding:14px 16px;align-items:flex-end;gap:16px;
}
.cap-controls .btn-primary{margin-left:auto}

/* Caption paragraph that lives directly inside a .panel (between the header
   and a chart-wrap). Aligns its left/right edge to the chart's padding and
   reads as a dim caption — fixes notes that were rendering edge-to-edge
   against the panel border (e.g. the gyro-spectrum description). */
.panel-note{padding:14px 20px 0;margin:0;color:var(--text-dim);font-size:13px;line-height:1.5}

/* Fleet device tiles — accent top-edge + tabular figures so the device grid
   reads as a row of instruments rather than generic cards. */
.fleet-card{font-variant-numeric:tabular-nums}
.fleet-card::after{
  content:"";position:absolute;left:0;right:0;top:0;height:2px;pointer-events:none;
  background:linear-gradient(90deg,var(--accent-line),transparent 65%);
}

/* Honour reduced-motion: kill the pulse/fade/slide animations and
   transitions for users who ask the OS to limit motion. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.001ms !important;animation-iteration-count:1 !important;
    transition-duration:.001ms !important;scroll-behavior:auto !important;
  }
}
