:root{
  --bg:#0d1117;--card:#161b22;--card2:#1d232c;--fg:#e6edf3;--muted:#8b949e;--border:#30363d;
  --accent:#2f81f7;--danger:#f85149;--ok:#3fb950;--warn:#d29922;
  --c-raw:#58a6ff;--c-avg:#3fb950;--c-max:#f85149;--c-min:#d29922;
}
*{box-sizing:border-box}
html,body{margin:0;background:var(--bg);color:var(--fg);font:15px/1.4 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif}
body{padding-bottom:env(safe-area-inset-bottom)}
.hidden{display:none!important}
.muted{color:var(--muted);font-weight:400}
.topbar{position:sticky;top:0;z-index:5;display:flex;justify-content:space-between;align-items:center;gap:8px;
  padding:10px 14px;padding-top:calc(10px + env(safe-area-inset-top));background:#11151c;border-bottom:1px solid var(--border)}
.brand{font-weight:700;font-size:17px}
.status{display:flex;gap:6px;align-items:center}
.pill{font-size:12px;padding:3px 9px;border-radius:999px;background:var(--card2);border:1px solid var(--border);white-space:nowrap}
.pill.ok{border-color:var(--ok);color:var(--ok)}
.pill.warn{border-color:var(--warn);color:var(--warn)}
.pill.err{border-color:var(--danger);color:var(--danger)}
.banner{margin:10px 14px 0;padding:10px 12px;border-radius:10px;background:#3a2a0a;border:1px solid var(--warn);color:#f5d68a}
main{max-width:900px;margin:0 auto;padding:12px 14px 40px;display:flex;flex-direction:column;gap:12px}
button{font:inherit;color:var(--fg);background:var(--card2);border:1px solid var(--border);border-radius:10px;padding:10px 14px;cursor:pointer;min-height:44px}
button:hover{border-color:#8b949e}
button:disabled{opacity:.45;cursor:not-allowed}
button.primary{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600}
button.primary.disconnect{background:var(--danger);border-color:var(--danger)}
button.active{border-color:var(--ok);color:var(--ok)}
button.danger{color:var(--danger)}
button.small{min-height:32px;padding:4px 10px;font-size:13px}
.controls{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.controls button{white-space:nowrap}
@media (max-width:520px){.controls{flex-wrap:nowrap;gap:6px}.controls button{flex:1 1 auto;min-width:0;padding:10px 8px}#btnTare{flex:1.4 1 auto}}
@media (max-width:400px){.controls{gap:5px}.controls button{padding:10px 6px;font-size:14px}}
.readout-card{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:12px 16px;text-align:center}
.readout{display:flex;justify-content:center;align-items:baseline;gap:8px}
.live{font-size:clamp(64px,22vw,120px);font-weight:700;font-variant-numeric:tabular-nums;letter-spacing:-2px;line-height:1}
.live.active{color:var(--ok)}
.live.stale{color:var(--muted)}
.unit{font-size:20px;color:var(--muted)}
.phase{color:var(--muted);margin-top:4px;min-height:1.4em}
.stats{display:grid;grid-template-columns:repeat(5,1fr);gap:8px}
.stat{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:8px;text-align:center}
.stat .label{font-size:12px;color:var(--muted)}
.stat .val{font-size:22px;font-weight:600;font-variant-numeric:tabular-nums}
.stats.dim .stat{opacity:.4}
@media (max-width:520px){.stats{grid-template-columns:repeat(3,1fr)}.stat .val{font-size:19px}}
.chart-card{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:8px}
#chart{width:100%;height:clamp(240px,45vh,420px);display:block;touch-action:pan-y;cursor:grab;user-select:none;-webkit-user-select:none}
.toggles{display:flex;flex-wrap:wrap;gap:14px;padding:6px 6px 0;font-size:14px}
.toggles label{display:flex;align-items:center;gap:6px;user-select:none}
.sw{display:inline-block;width:14px;height:4px;border-radius:2px}
.c-raw{background:var(--c-raw)}.c-avg{background:var(--c-avg)}.c-max{background:var(--c-max)}.c-min{background:var(--c-min)}
.footnote{font-size:12px;color:var(--muted);margin:6px 6px 2px}
.panel{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:4px 14px}
.panel summary{cursor:pointer;padding:10px 0;font-weight:600}
.panel-actions{display:flex;gap:8px;flex-wrap:wrap;margin:6px 0 12px}
.settings{display:flex;flex-direction:column;gap:10px;padding-bottom:12px}
.settings h3{margin:8px 0 0;font-size:14px;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}
.settings label{display:flex;flex-direction:column;gap:4px}
.settings label.check{flex-direction:row;align-items:center;gap:8px}
.settings small{color:var(--muted);font-size:12px}
.settings input[type=number]{font:inherit;color:var(--fg);background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:8px;max-width:180px}
.history{list-style:none;margin:0;padding:0 0 12px;display:flex;flex-direction:column;gap:8px}
.history li{background:var(--card2);border:1px solid var(--border);border-radius:10px;padding:8px 10px;display:flex;flex-wrap:wrap;gap:6px 12px;align-items:center;justify-content:space-between}
.history .meta{font-size:13px;color:var(--muted)}
.history .nums{font-variant-numeric:tabular-nums}
.history .acts{display:flex;gap:6px}
.devinfo{display:grid;grid-template-columns:max-content 1fr;gap:4px 14px;margin:0 0 12px}
.devinfo dt{color:var(--muted)}
.devinfo dd{margin:0;word-break:break-all}
.log{max-height:220px;overflow:auto;font-size:12px;color:var(--muted);white-space:pre-wrap;margin:0 0 12px}
/* One toolbar row for audio transport + chart buttons: never overlaps the plot (it is outside the canvas). */
.chart-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:6px 8px;padding:2px 4px 6px}
.playback{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;flex:1 1 300px;min-width:0}
.playback audio{flex:1 1 220px;min-width:180px;height:40px}
.playback button{flex:none;white-space:nowrap}
.playback .hint{font-size:12px;color:var(--muted);flex:1 1 auto}
/* Portrait/desktop: audio on its own line, then Download · hint · Reset zoom/Live · ⤢ on one line */
body:not(.chart-max) .playback{display:contents}
body:not(.chart-max) .playback audio{flex:1 1 100%}
#chart.seekable{cursor:pointer}
.chart-wrap{position:relative}
.chart-btns{display:flex;gap:6px;flex:none;margin-left:auto}
.chart-btns button{min-height:32px;padding:2px 10px;white-space:nowrap}
.stat.help{cursor:pointer}
.qmark{font-size:10px;opacity:.7}
.popover{position:fixed;z-index:20;padding:10px 12px;font-size:13px;line-height:1.45;background:#1d232c;border:1px solid var(--border);
  border-radius:10px;box-shadow:0 6px 24px rgba(0,0,0,.5)}
.popover code{background:var(--bg);padding:1px 5px;border-radius:4px}
.popover .muted{display:block;margin-top:4px}
.live-btn{color:var(--danger)!important;border-color:var(--danger)!important;font-weight:600}
.menu-btn{display:none}

/* ---- Gauge mode: analogue dial replaces the big number + stats ---- */
.gauge-card{display:none;background:var(--card);border:1px solid var(--border);border-radius:14px;padding:10px 10px 8px;position:relative}
body.gauge .gauge-card{display:block}
body.gauge .readout-card,body.gauge .stats{display:none}
#dial{display:block;width:100%;height:min(82vw,420px);margin:0 auto}
.gauge-actions{display:flex;justify-content:flex-end;margin-top:4px}
#btnZero{background:var(--danger);border-color:var(--danger);color:#fff;font-weight:600;min-width:96px}
#btnZero.active{background:var(--card2);color:var(--ok);border-color:var(--ok)}

/* ---- Full-screen chart: phone landscape (automatic) or the ⤢ button ---- */
body.chart-max{overflow:hidden}
body.chart-max .topbar,body.chart-max .banner,body.chart-max .panel,body.chart-max .footnote,body.chart-max .phase{display:none!important}
body.chart-max main{padding:0;max-width:none}
body.chart-max .chart-card{position:fixed;inset:0;border:0;border-radius:0;z-index:1;display:flex;flex-direction:column;
  padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)}
body.chart-max .chart-wrap{flex:1;min-height:0}
body.chart-max #chart{height:100%;touch-action:none}
/* Toolbar becomes a slim row BELOW the plot (after the x-axis labels); the canvas flexes to the remaining height. */
body.chart-max .chart-bar{order:2;flex:none;flex-wrap:nowrap;padding:3px 8px;
  border-top:1px solid var(--border);background:#12171e}
body.chart-max .playback{flex:1 1 auto;flex-wrap:nowrap}
body.chart-max .playback audio{height:32px;min-width:160px}
body.chart-max .chart-bar button{min-height:32px;padding:2px 10px}
body.chart-max .readout-card{position:fixed;z-index:3;top:calc(4px + env(safe-area-inset-top));left:calc(48px + env(safe-area-inset-left));
  padding:2px 10px;background:rgba(22,27,34,.85);border-radius:10px}
body.chart-max .live{font-size:44px;letter-spacing:-1px}
body.chart-max .unit{font-size:13px}
body.chart-max .stats{position:fixed;z-index:3;top:calc(4px + env(safe-area-inset-top));right:calc(8px + env(safe-area-inset-right));gap:4px;grid-template-columns:repeat(5,auto)}
body.chart-max .stat{padding:2px 8px;background:rgba(22,27,34,.85)}
body.chart-max .stat .label{font-size:10px}
body.chart-max .stat .val{font-size:16px}
body.chart-max .toggles{display:none}
body.chart-max .playback .hint{display:none}
@media (max-width:760px){body.chart-max .playback .lbl{display:none}}
body.chart-max .menu-btn{display:block;position:fixed;z-index:4;left:calc(6px + env(safe-area-inset-left));top:calc(6px + env(safe-area-inset-top));
  min-height:36px;padding:4px 10px;background:rgba(29,35,44,.9)}
body.chart-max .controls{display:none}
body.chart-max.drawer-open .controls{display:flex;position:fixed;z-index:4;left:calc(6px + env(safe-area-inset-left));top:calc(48px + env(safe-area-inset-top));
  flex-direction:column;align-items:stretch;padding:8px;background:rgba(22,27,34,.97);border:1px solid var(--border);border-radius:12px}
body.chart-max.drawer-open .toggles{display:flex;position:fixed;z-index:4;left:calc(150px + env(safe-area-inset-left));top:calc(48px + env(safe-area-inset-top));
  flex-direction:column;padding:10px;background:rgba(22,27,34,.97);border:1px solid var(--border);border-radius:12px}

/* Landscape gauge mode: dial on the left, small scrolling chart beside it (if there is room) */
body.chart-max.gauge .gauge-card{position:fixed;z-index:2;top:0;bottom:0;left:0;width:min(52vw,calc(100vh * 1.25));border:0;border-radius:0;
  padding:calc(6px + env(safe-area-inset-top)) 6px calc(6px + env(safe-area-inset-bottom)) calc(48px + env(safe-area-inset-left));display:flex;flex-direction:column}
body.chart-max.gauge #dial{flex:1;min-height:0;height:auto}
body.chart-max.gauge .gauge-actions{flex:none;margin-top:2px}
body.chart-max.gauge #btnZero{min-height:36px;padding:4px 12px}
body.chart-max.gauge .chart-card{left:min(52vw,calc(100vh * 1.25));border-left:1px solid var(--border)}
@media (max-width:559px){body.chart-max.gauge .gauge-card{width:100vw}body.chart-max.gauge .chart-card{display:none}}
