/* Notum Storm Guard monitor — dark ops theme (single deliberate dark mode).
   Palette per dataviz reference: surfaces #0d0d0d/#1a1a19, ink #fff/#c3c2b7/#898781,
   series dark steps: blue #3987e5, aqua #199e70, yellow #c98500, violet #9085e9,
   red #e66767; status: good #0ca30c, warning #fab219, serious #ec835a, critical #d03b3b. */

:root {
  color-scheme: dark;
  --page: #0d0d0d;
  --surface: #1a1a19;
  --surface-2: #232322;
  --ink: #ffffff;
  --ink-2: #c3c2b7;
  --muted: #898781;
  --grid: #2c2c2a;
  --baseline: #383835;
  --ring: rgba(255, 255, 255, 0.10);
  --s-blue: #3987e5;
  --s-aqua: #199e70;
  --s-yellow: #c98500;
  --s-violet: #9085e9;
  --s-red: #e66767;
  --good: #0ca30c;
  --warning: #fab219;
  --serious: #ec835a;
  --critical: #d03b3b;
  font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
}

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; background: var(--page); color: var(--ink); }
body { font-size: 14px; line-height: 1.45; }

h1 { font-size: 17px; letter-spacing: 2.5px; margin: 0; font-weight: 700; }
h2 { font-size: 13px; letter-spacing: 1.2px; margin: 0; font-weight: 600; text-transform: uppercase; color: var(--ink-2); }
.hint { color: var(--muted); font-weight: 400; text-transform: none; letter-spacing: 0; font-size: 12px; }
.sub { color: var(--muted); font-size: 12px; }
.center { text-align: center; }

/* ---------- header ---------- */
#topbar {
  display: flex; align-items: center; gap: 20px;
  padding: 10px 18px; border-bottom: 1px solid var(--grid);
  position: sticky; top: 0; background: rgba(13, 13, 13, 0.92);
  backdrop-filter: blur(6px); z-index: 1200;
}
.brand { display: flex; align-items: center; gap: 12px; flex: 1; }
.bolt { font-size: 26px; filter: drop-shadow(0 0 6px rgba(201, 133, 0, .6)); }
.badge {
  display: inline-block; padding: 1px 8px; border-radius: 4px;
  background: var(--surface-2); border: 1px solid var(--ring);
  font-size: 11px; letter-spacing: 1px; color: var(--ink-2);
}
.badge.live { color: var(--good); border-color: var(--good); }
.badge.synthetic { color: var(--warning); border-color: var(--warning); }

.statuses { display: flex; gap: 14px; }
.svc { display: flex; flex-direction: column; align-items: center; gap: 3px; font-size: 10px; color: var(--muted); letter-spacing: 1px; }
.dot { width: 10px; height: 10px; border-radius: 50%; background: var(--muted); }
.dot.ok { background: var(--good); box-shadow: 0 0 6px rgba(12, 163, 12, .7); }
.dot.warn { background: var(--warning); }
.dot.bad { background: var(--critical); box-shadow: 0 0 6px rgba(208, 59, 59, .7); }
.clock { text-align: right; }
#clock-utc { font-size: 19px; font-variant-numeric: tabular-nums; letter-spacing: 1px; }

/* ---------- layout ---------- */
main {
  display: grid; gap: 14px; padding: 14px 18px 4px;
  grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
  grid-template-areas: "map vg" "map live" "ensemble quality" "train quality";
  max-width: 1700px; margin: 0 auto;
}
#map-card { grid-area: map; display: flex; flex-direction: column; }
#vg-card { grid-area: vg; }
#live-card { grid-area: live; }
#ensemble-card { grid-area: ensemble; }
#train-card { grid-area: train; }
#quality-card { grid-area: quality; }
@media (max-width: 1080px) {
  main { grid-template-columns: 1fr;
         grid-template-areas: "map" "vg" "live" "ensemble" "train" "quality"; }
}

/* ---------- sources & ensemble ---------- */
.sources-row { display: flex; gap: 8px; flex-wrap: wrap; margin: 4px 0 10px; }
.src-chip {
  display: flex; align-items: center; gap: 6px; padding: 3px 9px;
  background: var(--surface-2); border: 1px solid var(--ring); border-radius: 12px;
  font-size: 11px; color: var(--ink-2); font-variant-numeric: tabular-nums;
}
.src-chip .dot { width: 7px; height: 7px; }
.degraded-banner {
  background: rgba(236, 131, 90, 0.12); border: 1px solid var(--serious);
  color: var(--serious); border-radius: 6px; padding: 6px 10px;
  font-size: 12px; margin-bottom: 8px;
}
.wbar { display: inline-flex; gap: 1px; align-items: flex-end; height: 14px; }
.wbar span { width: 5px; background: var(--s-blue); border-radius: 1px 1px 0 0; display: inline-block; }
.expert-badge { font-weight: 650; letter-spacing: .5px; }
.expert-badge.off { color: var(--muted); font-weight: 400; }

.card {
  background: var(--surface); border: 1px solid var(--ring); border-radius: 10px;
  padding: 12px 14px; min-width: 0;
}
.card-head { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; margin-bottom: 8px; flex-wrap: wrap; }

/* ---------- map ---------- */
#map { flex: 1; min-height: 520px; border-radius: 8px; background: #0a0d12; outline: 1px solid var(--grid); }
.leaflet-container { background: #0a0d12; font: inherit; }
.bin-select { display: flex; gap: 4px; flex-wrap: wrap; }

/* layer toggle pills — second row under the lead-time selector */
.layer-toggles { display: flex; gap: 6px; flex-wrap: wrap; margin: 2px 0 10px; }
.layer-btn {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 4px 12px; border-radius: 999px; font-size: 12px; cursor: pointer;
  background: var(--surface-2); color: var(--ink-2);
  border: 1px solid var(--ring);
  transition: border-color .15s, background .15s, color .15s, box-shadow .15s;
}
.layer-btn::before {
  content: ""; width: 7px; height: 7px; border-radius: 50%;
  background: var(--baseline); transition: background .15s, box-shadow .15s;
}
.layer-btn:hover { border-color: var(--s-blue); color: var(--ink); }
.layer-btn.on {
  background: rgba(57, 135, 229, 0.16); border-color: var(--s-blue); color: var(--ink);
}
.layer-btn.on::before {
  background: var(--s-blue); box-shadow: 0 0 6px rgba(57, 135, 229, 0.9);
}
.bin-btn {
  padding: 3px 9px; border-radius: 5px; font-size: 12px; cursor: pointer;
  background: var(--surface-2); color: var(--ink-2); border: 1px solid var(--ring);
  font-variant-numeric: tabular-nums;
}
.bin-btn.sel { background: var(--s-blue); border-color: var(--s-blue); color: #fff; }
.toggle { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--ink-2); cursor: pointer; }
.toggle input { accent-color: var(--s-blue); }
.map-foot { display: flex; justify-content: space-between; align-items: center; margin-top: 8px; gap: 12px; flex-wrap: wrap; }
.legend { display: flex; align-items: center; gap: 8px; font-size: 11px; color: var(--muted); }
.legend-bar {
  width: 160px; height: 8px; border-radius: 4px;
  background: linear-gradient(90deg, #30123b, #4662d8, #35abf8, #1be5b5, #74fe5d, #c9ef34, #fbb938, #f56918, #c92903, #7a0403);
  outline: 1px solid var(--ring);
}
.map-meta { font-size: 12px; color: var(--muted); font-variant-numeric: tabular-nums; }
.map-meta.stale { color: var(--warn, #e2a33d); font-weight: 600; }
.city-label { background: none; border: none; box-shadow: none; color: var(--ink-2); font-size: 10px; font-weight: 600; text-shadow: 0 0 4px #000, 0 0 2px #000; white-space: nowrap; }
.vg-label { color: #fff; font-size: 11px; }

/* ---------- city forecast (search) ---------- */
.city-search { display: flex; gap: 6px; margin-bottom: 10px; }
.city-search input {
  flex: 1; background: var(--surface-2); border: 1px solid var(--ring);
  border-radius: 6px; color: var(--ink); padding: 6px 10px; font: inherit; font-size: 13px;
}
.city-search input:focus { outline: 1px solid var(--s-blue); }
.city-search button {
  background: var(--surface-2); border: 1px solid var(--ring); border-radius: 6px;
  color: var(--ink-2); padding: 6px 10px; cursor: pointer; font-size: 12px;
}
.city-search button:hover { border-color: var(--s-blue); color: var(--ink); }
.wind-canvas {
  /* lives in the custom "wind" pane (z-index 450, set in JS): Leaflet
     positions it via transform (setPosition) and the pane rides drags */
  position: absolute;
  pointer-events: none;
  opacity: 1;
  transition: opacity 0.25s ease;  /* zoom fade-out / settle fade-in */
}
.crosshair-icon {
  color: #fff; font-size: 22px; font-weight: 700; line-height: 22px;
  text-shadow: 0 0 6px var(--s-blue), 0 0 3px #000; background: none; border: none;
}
.vg-chips { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; margin-bottom: 10px; }
.chip {
  background: var(--surface-2); border: 1px solid var(--ring); border-radius: 8px;
  text-align: center; padding: 7px 2px 6px;
}
.chip .p { font-size: 19px; font-weight: 700; font-variant-numeric: tabular-nums; }
.chip .l { font-size: 10px; color: var(--muted); letter-spacing: .5px; }
.chip.sel { border-color: var(--s-blue); }
.chip.alert .p { color: var(--serious); }

/* ---------- charts / tables ---------- */
/* fixed-height, overflow-clipped boxes: Chart.js sizes the canvas from the
   box, and minmax(0,·) columns let boxes SHRINK — a plain 1fr child's
   min-width:auto would let a wide canvas blow the grid out of the card */
.chart-box { position: relative; height: 190px; overflow: hidden; }
.chart-box.short { height: 140px; }
.charts-2col { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
               gap: 10px; align-items: start; }
.charts-2col > * { min-width: 0; }
.foot-note { font-size: 11px; color: var(--muted); margin-top: 4px; }
.vg-sub { font-size: 11px; color: var(--muted); margin: 2px 0 10px; }

.mini-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-top: 4px; }
.mini-table th { color: var(--muted); font-weight: 500; text-align: right; padding: 3px 6px; border-bottom: 1px solid var(--grid); }
.mini-table td { text-align: right; padding: 3px 6px; border-bottom: 1px solid var(--grid); font-variant-numeric: tabular-nums; color: var(--ink-2); }
.mini-table th:first-child, .mini-table td:first-child { text-align: left; color: var(--muted); }
.mini-table td.best { color: var(--good); font-weight: 600; }
.mini-table td.worst { color: var(--serious); }
.mini-table tr.sel td { background: rgba(57, 135, 229, 0.08); }

.stat-row { display: flex; gap: 18px; flex-wrap: wrap; margin: 6px 0 10px; }
.stat { min-width: 70px; }
.stat .v { font-size: 17px; font-weight: 650; font-variant-numeric: tabular-nums; }
.stat .k { font-size: 10px; color: var(--muted); letter-spacing: .8px; text-transform: uppercase; }

/* ---------- training ---------- */
.train-state { font-size: 15px; font-weight: 600; margin: 2px 0 6px; }
.train-state .state-training { color: var(--s-blue); }
.train-state .state-done { color: var(--good); }
.train-state .state-error { color: var(--critical); }
.train-state .state-waiting_for_data { color: var(--warning); }
.progress { height: 6px; border-radius: 3px; background: var(--surface-2); overflow: hidden; margin-bottom: 8px; }
.progress-fill { height: 100%; width: 0%; background: linear-gradient(90deg, var(--s-blue), var(--s-violet)); transition: width .6s; }

.quality-notes { font-size: 12px; color: var(--ink-2); }
.quality-notes .kv { margin-bottom: 6px; }
.quality-notes b { color: var(--ink); }

footer { padding: 10px 18px 22px; max-width: 1700px; margin: 0 auto; color: var(--ink-2); font-size: 12px; }
footer .sub { margin-top: 4px; }

a { color: var(--s-blue); }

/* ---------- mobile optimizations ---------- */
button, .bin-btn, .layer-btn, .chip, .src-chip { touch-action: manipulation; }

.table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: thin; }
.table-scroll .mini-table { min-width: 520px; }
.table-scroll #ensemble-table { min-width: 720px; }
.table-scroll #quality-table { min-width: 640px; }

@media (max-width: 640px) {
  body { font-size: 13px; }
  #topbar { padding: 7px 10px; gap: 10px; }
  h1 { font-size: 13px; letter-spacing: 1.2px; }
  .bolt { font-size: 20px; }
  .brand .sub { font-size: 10px; }
  #clock-utc { font-size: 15px; }
  main { padding: 10px 8px 4px; gap: 10px; }
  .card { padding: 10px; border-radius: 8px; }
  .card-head { flex-direction: column; align-items: flex-start; gap: 3px; margin-bottom: 6px; }

  /* map: viewport-relative height; controls become swipeable rows */
  #map { min-height: 52vh; }
  .bin-select, .layer-toggles {
    flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch;
    scrollbar-width: none; max-width: 100%; padding-bottom: 2px;
  }
  .bin-select::-webkit-scrollbar, .layer-toggles::-webkit-scrollbar { display: none; }
  .bin-btn { padding: 7px 11px; flex: 0 0 auto; font-size: 12px; }
  .layer-btn { padding: 6px 12px; flex: 0 0 auto; }
  .map-foot { flex-direction: column; align-items: flex-start; gap: 6px; }

  /* iOS zooms into inputs with font-size < 16px — prevent focus-zoom */
  .city-search input { font-size: 16px; padding: 8px 12px; }

  .vg-chips { gap: 4px; }
  .chip { padding: 6px 2px 5px; }
  .chip .p { font-size: 14px; }
  .chip .l { font-size: 9px; letter-spacing: 0; }

  .charts-2col { grid-template-columns: 1fr; }
  .chart-box { height: 170px; }
  .chart-box.short { height: 130px; }

  .stat-row { gap: 10px 16px; }
  .stat .v { font-size: 15px; }
  .stat .k { font-size: 9px; }
  .sources-row { gap: 6px; }
  .src-chip { font-size: 10px; padding: 3px 8px; }

  .train-state { font-size: 13px; }
  .mini-table { font-size: 11px; }
  .mini-table th, .mini-table td { padding: 3px 5px; }
  footer { padding: 8px 10px 18px; font-size: 11px; }
}

@media (max-width: 380px) {
  .vg-chips { grid-template-columns: repeat(4, 1fr); }
  .chip .p { font-size: 12.5px; }
  #clock-utc { font-size: 13px; }
}
