:root {
  --blue-900: #12324a;
  --blue-700: #1f5a80;
  --blue-500: #2b7fb8;
  --blue-100: #e8f2f9;
  --ok-green: #1e8e5a;
  --warn-amber: #b5680a;
  --bg: #f4f8fb;
  --card-bg: #ffffff;
  --text: #1b2733;
  --text-muted: #5c6b78;
  --border: #dbe6ee;
  --radius: 14px;
  --shadow: 0 1px 3px rgba(18, 50, 74, 0.08), 0 8px 24px rgba(18, 50, 74, 0.06);

  /* Alarmnivåer: gul/grønn/oransje/rød. Brukes fullmettet på de små
     prikkene i config, og som lyse pastellvarianter (-bg/-text) på
     statusstripa på forsiden. */
  --alarm-lav: #e8b400;
  --alarm-normal: #2e9e56;
  --alarm-hoy: #e07b1f;
  --alarm-flom: #d13b3b;

  --alarm-lav-bg: #fbf0cf;
  --alarm-lav-text: #8a6400;
  --alarm-normal-bg: #ddf1e6;
  --alarm-normal-text: #1f6f3f;
  --alarm-hoy-bg: #fae3cc;
  --alarm-hoy-text: #9c4e0e;
  --alarm-flom-bg: #fadada;
  --alarm-flom-text: #9c2626;

  /* Rutenett i grafen (Chart.js, se app.js) og alert-boksene - egne
     variabler (ikke hardkodet i JS/her) sa mørk modus kan overstyre dem. */
  --chart-grid: #e6e6e6; /* lys grå - opak farge unngår at 1px linjer med alpha ser mørkere/svartere ut enn ventet på canvas */
  --alert-error-bg: #fdecea;
  --alert-error-text: #a4222b;
  --alert-success-bg: #e6f6ee;
  --alert-success-text: var(--ok-green);

  /* Elvetemperatur-grafens linjefarge (se renderTempChart() i app.js) -
     rødlig/varm, tydelig atskilt fra både vannstandsgrafens blå (--blue-500)
     og Espedalselva-kurvens oransje (--alarm-hoy). Samme (ikke mørk-modus-
     overstyrt) mønster som --alarm-*-fargene over. */
  --temp-color: #d1495b;
}

/* Mørk modus - av/på-bryter under "Side-innhold" i innstillingene
   (settings.dark_mode), satt som en klasse på <html> fra hver PHP-side (se
   settings_dark_mode() i includes/settings.php). Kun fargevariablene over
   overstyres her - selve layouten er identisk i begge moduser. Knappe-/
   gradientbakgrunner lenger ned i arket (.btn, .back-btn, .latest-card,
   .range-btn.active, .link-banner-btn:active) er bevisst hardkodet til de
   samme blåtonene i stedet for å bruke --blue-700/--blue-900, sa de holder
   samme fargetone i begge moduser - det frigjør --blue-900/--blue-700/
   --blue-500/--blue-100 her til å bli lyse tekst-/kant-farger i mørk modus. */
html.dark {
  --blue-900: #dce8f4;
  --blue-700: #6ab6e8;
  --blue-500: #4aa8dd;
  --blue-100: #16324a;
  --bg: #10161c;
  --card-bg: #1a232c;
  --text: #e6edf3;
  --text-muted: #93a2b0;
  --border: #2b3742;
  --shadow: 0 1px 3px rgba(0, 0, 0, 0.5), 0 8px 24px rgba(0, 0, 0, 0.4);

  --alarm-lav-bg: #453a13;
  --alarm-lav-text: #f0cc5c;
  --alarm-normal-bg: #113a25;
  --alarm-normal-text: #74d69f;
  --alarm-hoy-bg: #452c11;
  --alarm-hoy-text: #f2ab6e;
  --alarm-flom-bg: #451717;
  --alarm-flom-text: #f29a9a;

  --chart-grid: #2b3742;
  --alert-error-bg: #45201f;
  --alert-error-text: #f2a3a8;
  --alert-success-bg: #123423;
  --alert-success-text: #7ad9a5;
}

* { box-sizing: border-box; }

body {
  margin: 0;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  background: var(--bg);
  color: var(--text);
}

.page {
  max-width: 860px;
  margin: 0 auto;
  padding: 24px 20px 48px;
}

/* Fra og med nettbrett/pc-bredde: la siden bruke mesteparten av
   skjermbredden (ca 90 %, med et tak) i stedet for en fast, smal kolonne -
   moderne skjermer er ofte langt bredere enn de faste 860/980px-grensene
   som var her før. Uendret under denne grensen, sa mobilvisningen ikke
   påvirkes (der fylte siden allerede naturlig ut bredden uansett). Både
   forsiden (.page) og innstillingssiden (.page.page-wide) bruker nå NØYAKTIG
   samme bredde - se .page-wide rett under, som ikke lenger setter noen egen
   (tidligere bredere) grense. */
@media (min-width: 700px) {
  .page {
    width: 90%;
    max-width: 1400px;
  }
}

/* Innstillingssiden (config.php) hadde tidligere en egen, bredere grense enn
   resten av sitet (siden info-boksene der vises 2-i-bredden side om side) -
   nå bruker begge sidene samme bredde (se .page/@media over), sa denne
   klassen setter ikke lenger noen egen regel. Beholdt i markup (config.php)
   i tilfelle en bevisst forskjell trengs igjen senere. */
.page-wide {
}

/* Elve-logo øverst på siden, over overskriften. max-height/max-width sørger
   for at den skaleres fint ned uansett opprinnelig størrelse - også på
   smale mobilskjermer. */
.site-logo-wrap {
  text-align: center;
  margin-bottom: 12px;
}
.site-logo {
  max-width: 100%;
  max-height: 110px;
  width: auto;
  height: auto;
}

.topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 20px;
}

.topbar h1 {
  font-size: 3.4rem;
  font-weight: 650;
  color: var(--blue-900);
  margin: 0;
}

/* Diskré innstillinger-lenke nederst på siden (flyttet ned fra toppen,
   siden det er en sjeldent brukt lenke som ikke trenger å ta plass der). */
.gear-link {
  display: inline-block;
  color: var(--text-muted);
  font-size: 0.78rem;
  text-decoration: none;
  opacity: 0.75;
  transition: opacity 0.15s, color 0.15s;
}
.gear-link:hover { opacity: 1; color: var(--blue-700); }

/* Fiskestatus-boks øverst på siden (over den blå vannstands-boksen).
   Lys pastellbakgrunn i samme fargetone som statusstripa under - bruker de
   samme -bg/-text-variablene. Skjult (hidden-attributt) når ingen status er
   valgt i config, eller når et planlagt tidspunkt frem i tid ikke er nådd. */
.fishing-status {
  border-radius: var(--radius);
  padding: 16px 20px;
  margin-bottom: 12px;
  box-shadow: var(--shadow);
  background: var(--card-bg);
}
.fishing-status-text {
  font-weight: 700;
  font-size: 1rem;
}
.fishing-status-meta {
  margin-top: 4px;
  font-size: 0.8rem;
  font-style: italic;
  opacity: 0.85;
}
.fishing-status.lett { background: var(--alarm-lav-bg); color: var(--alarm-lav-text); }
.fishing-status.normalt { background: var(--alarm-normal-bg); color: var(--alarm-normal-text); }
.fishing-status.stengt { background: var(--alarm-flom-bg); color: var(--alarm-flom-text); }

.latest-card {
  /* Hardkodet (ikke --blue-700/--blue-500) sa gradienten holder samme
     blåfarge uansett lys/mørk modus - se kommentar ved html.dark i toppen. */
  background: linear-gradient(135deg, #1f5a80, #2b7fb8);
  color: #fff;
  border-radius: var(--radius);
  padding: 28px 24px;
  box-shadow: var(--shadow);
  margin-bottom: 12px;
}

/* Liten tekstlinje over selve tallet ("Vannstand:") - dempet, siden tallet
   under skal være det øyet fanger først. */
.latest-label {
  font-size: 0.95rem;
  font-weight: 600;
  opacity: 0.85;
  margin-bottom: 4px;
}

.latest-value {
  font-size: 3.4rem;
  font-weight: 700;
  line-height: 1;
}
.latest-unit {
  font-size: 1.1rem;
  font-weight: 500;
  margin-left: 8px;
  opacity: 0.85;
}

/* Linje 1: rå målt vannstand - normal størrelse, tydelig. */
.latest-sub {
  margin-top: 10px;
  font-size: 1rem;
  opacity: 0.95;
}

/* Linje 2: tidspunkt + status - mindre og i kursiv, siden det er sekundær info. */
.latest-meta {
  margin-top: 6px;
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 0.8rem;
  font-style: italic;
  opacity: 0.8;
}

/* Smal fargestripe under infoboksen som viser alarmnivå (vannføringsstatus)
   som tekst - samme bredde og hjørneavrunding som selve infoboksen. */
.alarm-stripe {
  border-radius: var(--radius);
  padding: 14px 20px;
  margin: 0 0 20px;
  text-align: center;
  font-weight: 700;
  font-size: 1.05rem;
  letter-spacing: 0.02em;
  color: #fff;
  box-shadow: var(--shadow);
  background: #999;
}
.alarm-stripe.lav { background: var(--alarm-lav-bg); color: var(--alarm-lav-text); }
.alarm-stripe.normal { background: var(--alarm-normal-bg); color: var(--alarm-normal-text); }
.alarm-stripe.hoy { background: var(--alarm-hoy-bg); color: var(--alarm-hoy-text); }
.alarm-stripe.flom { background: var(--alarm-flom-bg); color: var(--alarm-flom-text); }

/* Liten overskrift over nedbørsstripa - kun synlig sammen med selve stripa
   (samme hidden-styring i app.js), så den ikke henger igjen alene når
   visningen er av/uten data ennå. */
.nedbor-stripe-title {
  font-size: 0.8rem;
  font-weight: 700;
  color: var(--text-muted);
  margin: 20px 0 12px;
  text-align: center;
}

/* Nedbørsprognose-stripa (12/24/48t) - kompakte kort med ikon, SAMME
   nøytrale kort-stil som .link-banner-btn like over (var(--card-bg) +
   var(--border) i stedet for en egen mettet blåfarge) - følger dermed
   mørk/lys modus akkurat som knappene over, og virker mindre "utropende".
   Samme farge på alle tre kort uansett mengde/sannsynlighet. Kun IKONET
   varierer med meldt mengde (dråpe/regnsky/tordensky) - se
   .nedbor-window-icon under. */
.nedbor-stripe {
  display: flex;
  gap: 10px;
  margin: 0 0 20px;
}
/* [hidden] har samme spesifisitet som en klasse - uten denne regelen vinner
   "display: flex" over over nettleserens innebygde "[hidden] { display:
   none }" (motsatt av .alarm-stripe, som ikke setter display i det hele
   tatt og derfor aldri hadde dette problemet). */
.nedbor-stripe[hidden] {
  display: none;
}
.nedbor-window {
  flex: 1 1 0;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 14px;
  border-radius: 10px;
  border: 1px solid var(--border);
  background: var(--card-bg);
  color: var(--text);
  box-shadow: var(--shadow);
}

/* Alle tre ikon-varianter ligger i markup (se index.php) - kun den som
   matcher bucket-klassen på selve .nedbor-window (satt av app.js sin
   renderNedborStripe(), basert på bucket-feltet fra api.php) vises. Ingen
   ekstern ikonfont - egne, små inline SVG-er, samme "ingen eksterne
   avhengigheter"-linje som resten av siden (se pkt. 5.6 om Chart.js). */
.nedbor-window-icon {
  flex: 0 0 auto;
  width: 22px;
  height: 22px;
}
.nedbor-window-icon svg {
  display: none;
  width: 22px;
  height: 22px;
}
.nedbor-window.lys .icon-lys,
.nedbor-window.medium .icon-medium,
.nedbor-window.mork .icon-mork {
  display: block;
}

.nedbor-window-text {
  display: flex;
  flex-direction: column;
  text-align: left;
}
.nedbor-window-label {
  font-size: 0.7rem;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--text-muted);
}
.nedbor-window-value {
  font-size: 0.85rem;
  font-weight: 700;
  color: var(--text);
}
@media (max-width: 640px) {
  .nedbor-stripe {
    flex-direction: column;
  }
}

/* Søylediagram (min./maks. nedbør pr. 6t) under prognose-kortene over -
   samme kort-stil som .chart-wrap, men lavere (enklere graf, ingen
   zoom/panorering trengs her, sa heller ikke cursor:crosshair/touch-action). */
.nedbor-chart-wrap {
  background: var(--card-bg);
  border-radius: var(--radius);
  padding: 20px 16px;
  box-shadow: var(--shadow);
  height: 220px;
  position: relative;
  margin-bottom: 20px;
}
.nedbor-chart-wrap[hidden] {
  display: none;
}

/* Samme linje, hver sin ende: mørk modus (alltid til stede) venstrejustert,
   og evt. push-varsel-bryteren (kun i markup når VAPID er satt opp, se
   index.php) høyrejustert - space-between skyver dem til hver sin kant av
   raden. flex-wrap sørger for at de stables pent under hverandre i stedet
   for å bli klemt sammen på smale mobilskjermer (space-between virker da
   ikke lenger, men hver rad havner uansett fint venstrejustert). */
.bottom-toggles {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px 20px;
  margin: 4px 0 16px;
}

.push-subscribe-wrap {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}

/* Generisk slider-bryter (brukt av både mørk modus og push-varsel-toggen
   over) - samme visuelle stil begge steder, se .toggle-switch input:checked
   under for selve fargen (følger --blue-500, altså samme aksentfarge som
   resten av siden, i begge lys/mørk-modus). */
.toggle-row {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  cursor: pointer;
  user-select: none;
}
.toggle-text {
  font-size: 0.78rem;
  color: var(--text-muted);
}
.toggle-switch {
  position: relative;
  display: inline-block;
  width: 34px;
  height: 20px;
  flex-shrink: 0;
}
.toggle-switch input {
  position: absolute;
  inset: 0;
  opacity: 0;
  margin: 0;
  cursor: pointer;
  z-index: 1;
}
.toggle-track {
  position: absolute;
  inset: 0;
  background: var(--border);
  border-radius: 999px;
  transition: background 0.15s;
}
.toggle-thumb {
  position: absolute;
  top: 2px;
  left: 2px;
  width: 16px;
  height: 16px;
  background: #fff;
  border-radius: 50%;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
  transition: transform 0.15s;
}
.toggle-switch input:checked + .toggle-track {
  background: var(--blue-500);
}
.toggle-switch input:checked + .toggle-track .toggle-thumb {
  transform: translateX(14px);
}
.toggle-switch input:focus-visible + .toggle-track {
  outline: 2px solid var(--blue-500);
  outline-offset: 2px;
}
.toggle-switch input:disabled {
  cursor: default;
}
.push-subscribe-hint {
  margin: 6px 0 0;
  font-size: 0.75rem;
  color: var(--text-muted);
  text-align: left;
}

.calib-hint {
  margin-top: 14px;
  padding: 8px 12px;
  background: rgba(255, 255, 255, 0.15);
  border-radius: 8px;
  font-size: 0.82rem;
}
.calib-hint a { color: #fff; text-decoration: underline; }

/* Gauge-visning av status-boksen (alternativ til .latest-card over) - valgt
   under "Levelsensor / graf setup" i Innstillinger. I motsetning til
   .latest-card bruker denne vanlig kort-bakgrunn (--card-bg), siden fargen nå
   sitter i selve gauge-grafen (se app.js) i stedet for kortbakgrunnen. */
.gauge-card {
  background: var(--card-bg);
  border-radius: var(--radius);
  padding: 24px 20px 20px;
  box-shadow: var(--shadow);
  margin-bottom: 12px;
  text-align: center;
}

.gauge-label {
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--text-muted);
  margin-bottom: 4px;
}

.gauge-row {
  display: flex;
  align-items: flex-start;
  justify-content: center;
  gap: 32px;
  flex-wrap: wrap;
}

.gauge-col {
  display: flex;
  flex-direction: column;
  align-items: center;
}

/* Faste høyder på canvas-omslaget (samme prinsipp som .chart-wrap) - Chart.js
   sin responsive-modus fyller selve elementet, sa vi trenger ikke faste
   width/height-attributter på <canvas> som ville hindret den i å skalere ned
   på smale mobilskjermer. */
.gauge-canvas-wrap {
  position: relative;
}
/* Fast (ikke prosentbasert) bredde på begge gauge-canvasene, sa de alltid
   blir NØYAKTIG like store uansett hvor bredt/smalt teksten ved siden av
   (label/verdi) gjør at .gauge-col ellers ville krympet til - med
   width:100% i stedet fikk vannstand og elvetemperatur ulik reell
   canvas-bredde (og dermed synlig ulik buestørrelse), siden .gauge-col er et
   flex-element uten egen fast bredde. max-width:100% er ren mobilsikring
   (skalerer ned på skjermer smalere enn 260px). */
.gauge-canvas-level,
.gauge-canvas-temp {
  width: 260px;
  max-width: 100%;
  height: 140px;
}
.gauge-canvas-baro {
  width: 70px;
  height: 140px;
}

.gauge-value {
  margin-top: -20px;
  font-size: 2.6rem;
  font-weight: 700;
  color: var(--blue-900);
  line-height: 1;
}
.gauge-unit {
  font-size: 1rem;
  font-weight: 500;
  margin-left: 4px;
  color: var(--text-muted);
}

/* Nivå (cm) og vannføring (m3/s) under selve %-tallet i gauge-visningen -
   se renderLevelGauge() i app.js. Ca. halv størrelse av .gauge-value
   (2.6rem), samme størrelse for begge linjene (cm og m3/s). */
.gauge-sub {
  font-size: 1.3rem;
  font-weight: 600;
  color: var(--text-muted);
  line-height: 1.3;
}

/* "Bruk Espedalselva m3/s-verdier i infobox"-valget (radioknapper under
   "Levelsensor / graf innstillinger", se FLOW_M3S_SOURCE i assets/app.js) -
   samme oransje farge som Espedalselva-kurven i grafen (--alarm-hoy, ikke
   endret i mørk modus). Brukes på både standard-infoboksens sub-linje
   (#latestSub) og gauge-visningens (#gaugeSubFlow) - må stå ETTER
   .gauge-sub over for å vinne over dens color-regel (samme spesifisitet,
   kun én klasse hver). */
.flow-espedalselva {
  color: var(--alarm-hoy, #e07b1f);
}

.gauge-value-baro {
  margin-top: 8px;
  font-size: 1rem;
  font-weight: 600;
  color: var(--text-muted);
}

/* "External" tooltip-boble for begge gauge-grafene (se gaugeTooltipHandler()
   i app.js). Tegnes som et vanlig HTML-element i stedet for Chart.js sin
   innebygde canvas-tooltip, nettopp fordi den innebygde varianten klippes til
   selve canvas-bredden - noe som gjorde den svært smale barometer-søylens
   tooltip uleselig liten. Hardkodet mørk bakgrunn/hvit tekst uansett lys/mørk
   modus (samme prinsipp som .latest-card sin gradient) - enklest å lese uansett
   hva den svever over. white-space:nowrap + width:max-content sikrer at boblen
   alltid får plass til hele teksten, uansett hvor smal .gauge-canvas-wrap er. */
.gauge-tooltip {
  position: absolute;
  transform: translate(-50%, calc(-100% - 10px));
  width: max-content;
  max-width: 220px;
  white-space: nowrap;
  background: rgba(15, 27, 38, 0.94);
  color: #fff;
  padding: 6px 10px;
  border-radius: 8px;
  font-size: 0.78rem;
  line-height: 1.5;
  text-align: center;
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.1s ease;
  z-index: 20;
  box-shadow: var(--shadow);
}

/* Kalibreringshintet under gauge-kortet trenger andre farger enn varianten i
   .latest-card - der ligger den på en mørk blå gradient (hvit, halvgjennom-
   siktig tekst), her ligger den på et lyst kort (samme farger som alert-boksene
   ellers i innstillingene). */
.calib-hint-gauge {
  margin-top: 14px;
  padding: 8px 12px;
  border-radius: 8px;
  font-size: 0.82rem;
  background: var(--alert-error-bg);
  color: var(--alert-error-text);
}
.calib-hint-gauge a { color: var(--alert-error-text); text-decoration: underline; }

.info-text {
  margin: -8px 0 20px;
  color: var(--text-muted);
  font-size: 0.95rem;
  line-height: 1.5;
}

.status-badge {
  padding: 3px 10px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.18);
  font-weight: 600;
  font-size: 0.8rem;
  letter-spacing: 0.02em;
}
.status-badge.ok { background: rgba(30, 142, 90, 0.35); }
.status-badge.warn { background: rgba(181, 104, 10, 0.4); }
.status-badge.err { background: rgba(196, 44, 44, 0.4); }
/* Rpi CPU-temperatur-alarm - avdempet rødt banner, plassert rett over
   footeren på hovedsiden (se index.php og updateCpuAlarm() i assets/app.js).
   Samme "pille"-stil (.status-badge) som den grønne OK-statusen i footeren,
   bare med en dempet rød bakgrunn i stedet for grønn/oransje. */
.status-badge.cpu-alarm { background: rgba(196, 44, 44, 0.38); }
.cpu-alarm-wrap {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 8px;
  margin: 0 0 14px;
  font-size: 0.8rem;
  color: var(--text-muted);
}
/* [hidden] har samme spesifisitet som en klasse - uten denne regelen vinner
   "display: flex" over over nettleserens innebygde "[hidden] { display:
   none }" (samme problem/løsning som .nedbor-stripe over). */
.cpu-alarm-wrap[hidden] {
  display: none;
}

/* Overskrift over periodeknappene til en graf lenger ned enn den aller
   første (f.eks. Elvetemperatur-grafen, se index.php) - selve
   vannstandsgrafen øverst har ingen tilsvarende overskrift, siden den følger
   rett etter status-/gauge-boksen og alarmstripa. */
.chart-section-title {
  font-size: 1rem;
  font-weight: 650;
  color: var(--blue-900);
  margin: 28px 0 10px;
}

.controls {
  display: flex;
  gap: 8px;
  margin-bottom: 16px;
  flex-wrap: wrap;
}

.range-btn {
  border: 1px solid var(--border);
  background: var(--card-bg);
  color: var(--text-muted);
  padding: 8px 16px;
  border-radius: 999px;
  font-size: 0.88rem;
  cursor: pointer;
  transition: all 0.15s;
}
.range-btn:hover { border-color: var(--blue-500); color: var(--blue-700); }
.range-btn.active {
  background: #1f5a80;
  border-color: #1f5a80;
  color: #fff;
}

.zoom-reset-btn {
  margin-left: auto;
}

.chart-wrap {
  background: var(--card-bg);
  border-radius: var(--radius);
  padding: 20px 16px;
  box-shadow: var(--shadow);
  height: 340px;
  position: relative;
  cursor: crosshair;
}

/* Uten dette kaprer nettleserens egen sideutzooming/panorering knip- og
   dra-gestene på mobil, i stedet for at chartjs-plugin-zoom får dem. */
#chart {
  touch-action: none;
}

.zoom-hint {
  margin: 8px 0 0;
  font-size: 0.78rem;
  font-style: italic;
  color: var(--text-muted);
  text-align: center;
}

/* Link-banner: valgfrie knapper under grafen (settes opp i "Annet" på
   config-siden). Samme bredde som resten av oppsettet (arves fra .page),
   3 like brede knapper på én linje på pc/mac, stables på mobil. */
.link-banner {
  display: flex;
  gap: 10px;
  margin-top: 16px;
}
.link-banner-btn {
  flex: 1 1 0;
  text-align: center;
  padding: 12px 14px;
  border-radius: 10px;
  border: 1px solid var(--border);
  background: var(--card-bg);
  color: var(--text);
  font-weight: 600;
  font-size: 0.92rem;
  text-decoration: none;
  box-shadow: var(--shadow);
  transition: border-color 0.15s, color 0.15s, background 0.15s;
}
.link-banner-btn:hover {
  border-color: var(--blue-500);
  color: var(--blue-700);
}
.link-banner-btn:active {
  background: #1f5a80;
  border-color: #1f5a80;
  color: #fff;
}
@media (max-width: 640px) {
  .link-banner {
    flex-direction: column;
  }
}

/* De to rekordboksene stables over hverandre på mobil, og vises side om
   side på bredere skjermer (pc). */
.records-grid {
  display: flex;
  flex-direction: column;
  gap: 14px;
  margin-top: 20px;
}
@media (min-width: 641px) {
  .records-grid {
    flex-direction: row;
  }
  .records-grid .records-card {
    flex: 1 1 0;
    min-width: 0;
  }
}
.records-card {
  background: var(--card-bg);
  border-radius: var(--radius);
  padding: 14px 16px 4px;
  box-shadow: var(--shadow);
  margin-top: 20px;
}
.records-grid .records-card {
  margin-top: 0;
}
.records-title {
  font-size: 0.88rem;
  font-weight: 650;
  color: var(--blue-900);
  margin: 0 0 4px;
}
.records-list {
  list-style: none;
  padding: 0;
  margin: 0;
}
/* Hver rekord på én linje: label til venstre, verdi og dato til høyre.
   Wrapper kun hvis skjermen er for smal til å få det til uten å klemme. */
.records-row {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  column-gap: 10px;
  row-gap: 2px;
  padding: 7px 0;
  border-bottom: 1px dashed var(--border);
  font-size: 0.8rem;
}
.records-row:last-child { border-bottom: none; }
.records-label { color: var(--text-muted); flex: 1 1 auto; }
.records-value { font-weight: 650; color: var(--text); white-space: nowrap; }
.records-sub { font-weight: 500; color: var(--text-muted); font-size: 0.74rem; }
.records-date {
  font-size: 0.68rem;
  font-style: italic;
  color: var(--text-muted);
  white-space: nowrap;
}

.chart-error {
  margin: 0;
  color: var(--warn-amber);
  font-size: 0.9rem;
  text-align: center;
  padding-top: 40px;
}

.footer {
  margin-top: 32px;
  text-align: center;
  font-size: 0.8rem;
  color: var(--text-muted);
}
.footer p { margin: 0; }

/* Rad med innstillinger-lenken og "Siste måling"-info (flyttet ned fra den
   blå infoboksen - ren info, ikke noe man trenger i det daglige). Bundet
   sammen med en tynn skillelinje så det leses som én rad, ikke to
   spredte elementer. */
.footer-top {
  display: flex;
  justify-content: center;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 10px;
}
.footer-meta {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding-left: 10px;
  border-left: 1px solid var(--border);
  font-size: 0.78rem;
  font-style: italic;
  opacity: 0.8;
}
.footer-meta .status-badge {
  padding: 2px 8px;
  font-size: 0.72rem;
  font-style: normal;
}

.credit {
  margin: 8px 0 0;
  font-size: 0.75rem;
  color: var(--text-muted);
}
.credit a { color: var(--text-muted); text-decoration: underline; }
.credit a:hover { color: var(--blue-700); }

/* Config / login pages */
.auth-card, .settings-card {
  background: var(--card-bg);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 28px 24px;
  max-width: 420px;
  margin: 60px auto;
}

.settings-card { max-width: 480px; margin: 24px auto 32px; }

.settings-card + .settings-card { margin-top: 20px; }

/* Overskrift for hele innstillingssiden (config.php), utenfor selve
   boksene - erstatter det som før var en <h1> inni den øverste kortet. */
.page-title {
  font-size: 1.5rem;
  font-weight: 650;
  color: var(--blue-900);
  margin: 0 0 20px;
}

/* Gruppeoverskrifter mellom rekkene av infobokser (f.eks. "Varslinger",
   "Info") - tydelig, men et hakk mindre enn selve sideoverskriften. */
.page-section-title {
  font-size: 1.2rem;
  font-weight: 650;
  color: var(--blue-900);
  margin: 36px 0 16px;
  padding-top: 4px;
  border-top: 1px solid var(--border);
}
/* Rekker av infobokser på innstillingssiden: 2 bokser side om side, så
   videre nedover til neste rad. Kortene er collapsible (se .settings-details
   under), så høyden varierer mye avhengig av hva som er åpent - derfor
   align-items: start i stedet for stretch (et åpent kort skal ikke tvinge
   nabokortet til å strekke seg til samme høyde). Beholdes 2 kolonner også på
   mobil (se media query lenger ned) - det er et bevisst valg for denne
   siden, i motsetning til resten av sitet. */
.settings-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 20px;
  margin: 0 0 8px;
  align-items: start;
}
.settings-grid .settings-card {
  max-width: none;
  width: 100%;
  margin: 0;
}
.settings-grid .settings-card + .settings-card {
  margin-top: 0;
}

/* På mobil/smale skjermer brytes hver rad om til 1 kolonne - boksene
   stables oppå hverandre i stedet for å klemmes side om side. 2 kolonner
   beholdes fra og med nettbrett-bredde og oppover. */
@media (max-width: 700px) {
  .settings-grid {
    grid-template-columns: 1fr;
    gap: 16px;
  }
}

/* Sticky hurtignav øverst på innstillingssiden - hopper til hvert kort
   (matchende id på .settings-card). Samme bakgrunnsfarge som <body> så den
   glir sømløst inn når siden scrolles under den, i stedet for å se ut som en
   svevende stripe. */
.settings-nav {
  position: sticky;
  top: 0;
  z-index: 20;
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding: 10px 0;
  margin: 0 0 20px;
  background: var(--bg);
  border-bottom: 1px solid var(--border);
}
.settings-nav a {
  padding: 6px 12px;
  border-radius: 999px;
  background: var(--card-bg);
  border: 1px solid var(--border);
  color: var(--text-muted);
  font-size: 0.8rem;
  font-weight: 500;
  text-decoration: none;
  white-space: nowrap;
  transition: border-color 0.15s, color 0.15s;
}
.settings-nav a:hover {
  border-color: var(--blue-500);
  color: var(--blue-700);
}

/* Collapsible innstillingskort: hver .settings-card sin tittel er nå en
   <summary> inni en <details>, sa kortet kan klappes sammen/ut. Kollapset er
   standard for de fleste - unntak er kortet som nettopp ble lagret til
   (åpnes automatisk av PHP via open-attributtet, se config.php) og de rene
   info-boksene nederst. */
.settings-details > summary {
  cursor: pointer;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}
.settings-details > summary::-webkit-details-marker {
  display: none;
}
.settings-details > summary::after {
  content: "▸";
  flex: none;
  font-size: 1.5rem;
  line-height: 1;
  color: var(--text-muted);
  transition: transform 0.15s;
}
.settings-details[open] > summary::after {
  transform: rotate(90deg);
}
/* Luft mellom tittelen og resten av innholdet når kortet er åpent - uten
   dette klemmes description/skjema for tett inntil summary. */
.settings-details[open] > summary {
  margin-bottom: 4px;
}

.section-title {
  font-size: 1.05rem;
  font-weight: 650;
  color: var(--blue-900);
  margin: 0 0 4px;
}

.section-desc {
  font-size: 0.85rem;
  color: var(--text-muted);
  margin: 0 0 4px;
  line-height: 1.4;
}

.subsection-title {
  font-size: 1.15rem;
  font-weight: 700;
  color: var(--blue-900);
  margin: 0 0 10px;
}

.section-divider {
  border: none;
  border-top: 1px solid var(--border);
  margin: 28px 0 22px;
}

.dot {
  display: inline-block;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  margin-right: 5px;
  vertical-align: middle;
}
.dot-lav { background: var(--alarm-lav); }
.dot-normal { background: var(--alarm-normal); }
.dot-hoy { background: var(--alarm-hoy); }
.dot-flom { background: var(--alarm-flom); }

textarea {
  width: 100%;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: 8px;
  font-size: 0.95rem;
  font-family: inherit;
  resize: vertical;
  min-height: 80px;
}
textarea:focus { outline: 2px solid var(--blue-500); outline-offset: 1px; }

.calib-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0 14px;
}

/* Kalibreringsgrid med tre kolonner (cm / % / m³/s) - se "Kalibrering" under
   "Levelsensor / graf setup" i config.php. */
.calib-grid-3 {
  grid-template-columns: 1fr 1fr 1fr;
}
.calib-grid-head {
  font-size: 0.78rem;
  font-weight: 650;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.02em;
}

/* Bredere variant av .settings-card for "Levelsensor / graf installasjon" -
   den dynamiske kalibreringstabellen (4 felt + tre knapper pr. rad) trenger
   mer bredde enn standard 480px for a ikke bli for trang. */
.settings-card-wide { max-width: 720px; }

/* Dynamisk kalibreringstabell (rå/aktiv sensorverdi, %, m³/s) under
   "Levelsensor / graf installasjon" - se JS nederst i config.php. Hver rad
   er sitt eget lille kort med opp/ned/fjern-knapper, i stedet for det
   tidligere faste rutenettet med 20 alltid-synlige rader. */
.calib-rows {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin: 12px 0;
}
.calib-row {
  display: flex;
  align-items: flex-end;
  gap: 10px;
  padding: 10px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--bg);
}
.calib-row-fields {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0 10px;
  flex: 1;
  min-width: 0;
}
/* Hver felt-celle er sin egen kolonne-flex slik at input alltid havner
   nederst, uavhengig av om labelen over (f.eks. "Rå sensorverdi (cm)")
   brekker om til flere linjer enn en kortere label (f.eks. "%"). Uten
   dette havner input-boksene i ulik hoyde nar labelene har ulikt antall
   linjer, siden grid-cellene stretches til samme hoyde men innholdet
   flyter fra toppen som standard. */
.calib-row-fields > div {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
}
.calib-row-fields label {
  font-size: 0.72rem;
  color: var(--text-muted);
  margin-bottom: 2px;
}
.calib-aktiv-display {
  background: var(--card-bg);
  color: var(--text-muted);
}
.calib-row-actions {
  display: flex;
  flex-direction: column;
  gap: 3px;
  flex: none;
}
.calib-btn {
  width: 30px;
  height: 24px;
  padding: 0;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--card-bg);
  color: var(--text-muted);
  font-size: 0.78rem;
  line-height: 1;
  cursor: pointer;
}
.calib-btn:hover { border-color: var(--blue-500); color: var(--blue-700); }
.calib-btn-remove:hover { border-color: #c0392b; color: #c0392b; }
.calib-toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 4px 0 6px;
}
.calib-toolbar .btn { margin-top: 0; width: auto; }

/* Smale skjermer: felt-rutenettet i hver rad går fra 4 til 2 kolonner, og
   knappene (opp/ned/fjern) legger seg under i stedet for til høyre. */
@media (max-width: 560px) {
  .calib-row { flex-direction: column; align-items: stretch; }
  .calib-row-fields { grid-template-columns: 1fr 1fr; gap: 8px; }
  .calib-row-actions { flex-direction: row; }
}

/* PT100 temperaturmodul: 4 faste kanal-rader (navn/rå/offset/sensorverdi) -
   samme kort/grid-oppbygning som .calib-row over, men uten opp/ned/fjern-
   knapper siden antall kanaler er fast (4), ikke dynamisk. */
.pt100-rows {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin: 12px 0;
}
.pt100-row {
  padding: 10px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--bg);
}
.pt100-row .subsection-title {
  margin: 0 0 8px;
}
.pt100-row-fields {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0 10px;
}
.pt100-row-fields > div {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
}
.pt100-row-fields label {
  font-size: 0.72rem;
  color: var(--text-muted);
  margin-bottom: 2px;
}
.pt100-raw-display, .pt100-sensorverdi-display {
  background: var(--card-bg);
  color: var(--text-muted);
}

@media (max-width: 560px) {
  .pt100-row-fields { grid-template-columns: 1fr 1fr; gap: 8px; }
}

/* Vannføringskurve (cm -> m³/s) under "Levelsensor / graf setup". */
.flow-curve-wrap {
  position: relative;
  height: 220px;
  margin: 8px 0 4px;
}

/* Uten dette kaprer nettleserens egen sideutzooming/panorering knip- og
   dra-gestene på mobil for Vannføringskurven, i stedet for at
   chartjs-plugin-zoom får dem (samme løsning som #chart for hovedgrafen). */
#flowCurveChart {
  touch-action: none;
}

/* Kalkulator: %-andel av maks vannføring, rett over Vannføringskurve-grafen
   under "Levelsensor / graf installasjon" - ren klient-side hjelperegner,
   lagres ikke og påvirker ikke selve kalibreringen eller settings.json. */
.flow-calc-card {
  padding: 10px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--bg);
  margin: 8px 0 4px;
}
.flow-calc-fields {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 0 10px;
}
.flow-calc-fields > div {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
}
.flow-calc-fields label {
  font-size: 0.72rem;
  color: var(--text-muted);
  margin-bottom: 2px;
}
.flow-calc-result {
  /* Fast mørk bakgrunn + hvit tekst uavhengig av lys/mørk tema, siden
     nettleserens egen dimming av disabled/readonly-felt gjorde
     var(--text) nesten usynlig mot var(--card-bg) (spesielt i lys tema). */
  background: #24303a;
  color: #f4f8fb;
  -webkit-text-fill-color: #f4f8fb;
  opacity: 1;
  font-weight: 650;
}
@media (max-width: 560px) {
  .flow-calc-fields { grid-template-columns: 1fr; gap: 8px; }
}

.field-hint {
  font-size: 0.78rem;
  color: var(--text-muted);
  margin-top: 4px;
}

.radio-row {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 0.92rem;
  font-weight: 500;
  color: var(--text);
  margin: 10px 0;
  cursor: pointer;
}
.radio-row input[type="radio"], .radio-row input[type="checkbox"] {
  width: auto;
  margin: 0;
  cursor: pointer;
}

.auth-card h1, .settings-card h1 {
  font-size: 1.3rem;
  color: var(--blue-900);
  margin-top: 0;
}

label {
  display: block;
  font-size: 0.85rem;
  font-weight: 600;
  color: var(--text-muted);
  margin: 16px 0 6px;
}

input[type="password"], input[type="text"] {
  width: 100%;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: 8px;
  font-size: 1rem;
}
input:focus { outline: 2px solid var(--blue-500); outline-offset: 1px; }

.btn {
  margin-top: 20px;
  width: 100%;
  padding: 11px;
  border: none;
  border-radius: 8px;
  background: #1f5a80;
  color: #fff;
  font-size: 1rem;
  font-weight: 600;
  cursor: pointer;
}
.btn:hover { background: #12324a; }

.btn-secondary {
  background: transparent;
  color: var(--text-muted);
  border: 1px solid var(--border);
}
.btn-secondary:hover { background: var(--blue-100); color: var(--blue-700); }

.logo-preview-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
  margin: 12px 0;
  padding: 10px;
  background: var(--bg);
  border-radius: 10px;
}
.logo-preview-img {
  max-width: 100%;
  max-height: 80px;
  width: auto;
  height: auto;
  border-radius: 6px;
}
.logo-preview-row form { margin: 0; }
.logo-preview-row .btn { margin-top: 0; width: auto; }

/* Opplastingsmodal for logo - enkel overlay + boks, ren CSS/vanilla JS. */
.modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(18, 50, 74, 0.55);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
  z-index: 100;
}
/* Uten denne overstyrer display:flex over den innebygde [hidden]-oppførselen
   til nettleseren (author-CSS slår alltid UA-stilarket, uansett spesifisitet)
   - modalen ville da vist seg med det samme og ikke la seg lukke. */
.modal-overlay[hidden] {
  display: none;
}
.modal-box {
  background: var(--card-bg);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 24px;
  max-width: 420px;
  width: 100%;
  max-height: 90vh;
  overflow-y: auto;
}
.modal-box h2 {
  font-size: 1.2rem;
  color: var(--blue-900);
  margin: 0 0 4px;
}
.modal-actions {
  display: flex;
  justify-content: flex-end;
  gap: 10px;
  margin-top: 20px;
}
.modal-actions .btn { margin-top: 0; width: auto; }
.logo-modal-preview {
  display: block;
  max-width: 100%;
  max-height: 160px;
  width: auto;
  height: auto;
  margin: 14px auto 0;
  border-radius: 8px;
}

.alert {
  padding: 10px 14px;
  border-radius: 8px;
  font-size: 0.88rem;
  margin-top: 16px;
}
.alert-error { background: var(--alert-error-bg); color: var(--alert-error-text); }
.alert-success { background: var(--alert-success-bg); color: var(--alert-success-text); }

.info-list {
  list-style: none;
  padding: 0;
  margin: 16px 0;
  font-size: 0.9rem;
  color: var(--text-muted);
}
.info-list li { padding: 6px 0; border-bottom: 1px dashed var(--border); display: flex; justify-content: space-between; gap: 12px; }
.info-list li:last-child { border-bottom: none; }
.info-list b { color: var(--text); font-weight: 600; }

/* Lesbare lenkefarger i begge fargemoduser - brukes av loggfil-lenker
   (view_log.php og config.php sin "Se datalogger"-boks m.fl.) */
.info-list a,
.log-file-list a {
  color: var(--blue-700);
  text-decoration: underline;
}
.info-list a:visited,
.log-file-list a:visited { color: var(--blue-700); }
.info-list a:hover,
.log-file-list a:hover { color: var(--blue-500); }

/* "Se datalogger" i config.php - loggfiler gruppert (webserver / Raspberry
   Pi) som kort i stedet for en flat liste, sa det er lettere a skille
   filnavn fra beskrivelse pa flere linjer. */
.log-list {
  list-style: none;
  padding: 0;
  margin: 0 0 8px;
}
.log-list li {
  padding: 10px 12px;
  margin-bottom: 6px;
  border-radius: 8px;
  background: var(--bg);
  transition: background 0.15s;
}
.log-list li:last-child { margin-bottom: 0; }
.log-list li:hover { background: var(--blue-100); }
.log-list li.is-selected { background: var(--blue-100); }
.log-list li.is-selected .log-link { text-decoration: underline; }
.log-link {
  display: inline-block;
  font-weight: 600;
  font-size: 0.92rem;
  color: var(--blue-700);
  text-decoration: none;
}
.log-link:visited { color: var(--blue-700); }
.log-link:hover { color: var(--blue-500); text-decoration: underline; }
.log-list .field-hint { margin-top: 4px; margin-bottom: 0; }

.top-actions {
  display: flex;
  justify-content: space-between;
  align-items: center;
  max-width: 480px;
  margin: 24px auto 40px;
}

.back-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 11px 20px;
  border-radius: 8px;
  background: #1f5a80;
  color: #fff;
  font-weight: 600;
  font-size: 0.92rem;
  text-decoration: none;
  transition: background 0.15s;
}
.back-btn:hover { background: #12324a; }

.logout-link {
  color: var(--text-muted);
  font-size: 0.85rem;
  text-decoration: none;
}
.logout-link:hover { color: var(--blue-700); }