/* =============================================================
   Zentrales Design-System für alle Aquarium-Rechner-Seiten.
   Referenz-Optik: Kalkmanagement. Wird auf jeder Seite als LETZTES
   Stylesheet eingebunden, damit es die alten Inline-Stile vereinheitlicht.
   Seiten-spezifische Klassen bleiben in der jeweiligen Seite.
   ============================================================= */
:root {
  /* ---- Zentrale Farb-Palette (34 Rollen) -------------------------------
     EINE Stelle für alle UI-Farben. Dark Mode = zweiter Wertesatz hier.
     Die bunten Element-Farben der C&R-Grafik sind bewusst NICHT hier
     (das ist kategoriale Datenfarbe, keine UI-Rolle). -------------------- */
  /* Struktur / Neutral */
  --bg: #f0f4f8;            /* Seitenhintergrund */
  --card: #ffffff;          /* Karten / Panels */
  --surface: #f6f8fb;       /* subtile Fläche (Zebra, Inset) */
  --border: #e1e8ed;        /* Standard-Rahmen */
  --border-strong: #ccd3da; /* kräftiger Rahmen / Placeholder */
  /* Text & Icons */
  --text: #2c3e50;          /* Überschriften / Fließtext */
  --text-mid: #5a6776;      /* Labels / sekundär */
  --text-light: #7a8896;    /* Meta / Hinweise */
  --text-faint: #9aa5b1;    /* sehr schwach */
  --icon-muted: #aab6c2;    /* graue Icons / Punkte */
  /* Blau (Marke) */
  --blue: #3498db;
  /* Textblau auf hellen Flaechen. Frueher #2980b9 — das ergab auf --blue-light
     nur 3,8:1 und auf --card 4,3:1, beides unter den 4,5:1, die kleiner Text
     braucht. Gleicher Farbton (204°) und gleiche Saettigung, 4 % dunkler:
     4,6:1 bzw. 5,1:1. */
  --blue-dark: #2574a7;
  --blue-light: #e8f4fb;
  /* Grün (Erfolg / im Bereich) */
  --green: #27ae60;
  --green-dark: #1d6a3a;
  --green-light: #e8f8ec;
  /* Orange (Aktion / Buttons) */
  --orange: #e8732a;
  --orange-dark: #c45f1f;
  --orange-light: #fff4e6;
  /* Amber (Warnung) */
  --amber: #e6a817;
  --amber-dark: #6b5900;
  --amber-light: #fff8e8;
  --yellow: var(--amber);   /* Alt-Alias (cr/spuren nutzen noch --yellow) */
  /* Rot (Gefahr / außerhalb) */
  --red: #c0392b;
  --red-dark: #7a3030;
  --red-light: #fdf2f0;
  /* ---- Gefüllte Flächen, die weiße Schrift tragen --------------------------
     Kopfbereich, Primär-Knopf, aktives Segment, Chips, Zähl-Kreise.
     Bewusst getrennt von --blue/--orange/--green: die sind im Dark Mode
     TEXTfarben auf dunklen Tint-Flächen und kippen deshalb ins Helle. Als
     Fläche ergab das einen grellen Balken mit weißer Schrift darauf —
     gemessen 2,1:1 im Kopfbereich, das Weiß löste sich fast auf.
     Diese hier bleiben Flächen: hell im Hellmodus, dunkel im Dunkelmodus,
     weiße Schrift immer ≥ 4,5:1. Die Hellmodus-Werte sind identisch mit dem
     bisherigen Aussehen — dort ändert sich nichts. ------------------------- */
  --fill-blue: #3498db;    --fill-blue-deep: #2980b9;
  --fill-orange: #e8732a;  --fill-orange-deep: #c45f1f;
  --fill-green: #27ae60;   --fill-green-deep: #2e9e5a;
  --fill-red: #c0392b;
  --fill-slate: #5a6776;   --fill-slate-deep: #3d4753;
  /* Sonstiges */
  --shadow: 0 2px 8px rgba(0,0,0,0.05);
  --radius: 12px;
}

/* ---- Dark Mode ------------------------------------------------------------
   Dieselben 34 Rollen, dunkler Wertesatz. Greift wenn <html data-theme="dark">
   ODER System = dunkel und der Nutzer nichts anderes gewählt hat.
   "-dark"-Töne (Text auf Tint-Flächen) kippen bewusst ins Helle,
   "-light"-Tints werden gedämpfte dunkle Flächen. --------------------------- */
:root[data-theme="dark"] {
  /* Sagt dem Browser, dass native Bedienelemente dunkel rendern sollen —
     ohne das bleiben leere Checkboxen, Radios und Scrollbars grell weiß. */
  color-scheme: dark;
  --bg:#12171d; --card:#1b222b; --surface:#232c37; --border:#313b47; --border-strong:#414d5b;
  --text:#e7ecf1; --text-mid:#b4bec9; --text-light:#8b98a6; --text-faint:#67727e; --icon-muted:#566373;
  --blue:#4aa5e2; --blue-dark:#74baec; --blue-light:#17303f;
  --green:#34c46e; --green-dark:#6ed898; --green-light:#143021;
  --orange:#f0864a; --orange-dark:#f0a577; --orange-light:#3a2715;
  --amber:#edc149; --amber-dark:#e1c560; --amber-light:#322912;
  --red:#e6604f; --red-dark:#f0a198; --red-light:#3a1d19;
  --fill-blue:#2a6f9e; --fill-blue-deep:#1b4d73;
  --fill-orange:#ad5a1c; --fill-orange-deep:#8f4310;
  --fill-green:#1f7a45; --fill-green-deep:#196b3b;
  --fill-red:#b83c2c;
  --fill-slate:#566373; --fill-slate-deep:#3d4753;
  --shadow:0 2px 8px rgba(0,0,0,0.4);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;
    --bg:#12171d; --card:#1b222b; --surface:#232c37; --border:#313b47; --border-strong:#414d5b;
    --text:#e7ecf1; --text-mid:#b4bec9; --text-light:#8b98a6; --text-faint:#67727e; --icon-muted:#566373;
    --blue:#4aa5e2; --blue-dark:#74baec; --blue-light:#17303f;
    --green:#34c46e; --green-dark:#6ed898; --green-light:#143021;
    --orange:#f0864a; --orange-dark:#f0a577; --orange-light:#3a2715;
    --amber:#edc149; --amber-dark:#e1c560; --amber-light:#322912;
    --red:#e6604f; --red-dark:#f0a198; --red-light:#3a1d19;
    --fill-blue:#2a6f9e; --fill-blue-deep:#1b4d73;
    --fill-orange:#ad5a1c; --fill-orange-deep:#8f4310;
    --fill-green:#1f7a45; --fill-green-deep:#196b3b;
    --fill-red:#b83c2c;
    --fill-slate:#566373; --fill-slate-deep:#3d4753;
    --shadow:0 2px 8px rgba(0,0,0,0.4);
  }
}
* { margin:0; padding:0; box-sizing:border-box; }

/* ---- Verstecken: EIN Weg fuer alles ---------------------------------------
   Vorher gab es vier: eine .hidden-Klasse mit !important, ein .is-hidden am
   Anmelde-Chip, das [hidden]-Attribut im Spurenrechner und rund 60 Stellen,
   die direkt element.style.display schrieben. Letzteres ist der teuerste
   Weg: ein Inline-Stil schlaegt jede Regel aus dem Stylesheet, damit sind
   solche Elemente fuer Media-Queries und den Dunkelmodus nicht mehr
   erreichbar — und genau daran ist in dieser Ecke schon mehrfach etwas
   haengengeblieben.

   Jetzt gilt ueberall `el.hidden = true/false` bzw. das Attribut im Markup.
   Das ist nebenbei das, was Screenreader auswerten.

   Das !important ist hier bewusst gesetzt und die Ausnahme, die die Regel
   traegt: der Browser bringt zwar `[hidden] { display:none }` mit, aber mit
   Spezifitaet (0,1,0) — jedes `.karte { display:flex }` schlaegt es. Eine
   Hilfsregel, die IMMER gewinnen muss, ist der eine legitime Fall. Nicht zu
   verwechseln mit einem !important, das gegen einen Inline-Stil kaempft; das
   ist immer ein Symptom. */
[hidden] { display: none !important; }
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button { -webkit-appearance:none; margin:0; }
input[type="number"] { -moz-appearance:textfield; }
/* Eingabefelder: Hintergrund/Text über Tokens, damit sie im Dark Mode nicht
   weiß/schwarz bleiben. Nur Farbe — Padding/Rahmen setzen die spezifischeren Regeln. */
input[type="text"], input[type="number"], input[type="date"], input[type="email"],
input[type="password"], input[type="search"], input[type="tel"], input[type="url"],
textarea, select {
  background-color: var(--card);
  color: var(--text);
}
input::placeholder, textarea::placeholder { color: var(--text-faint); opacity: 1; }
body { font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif; background:var(--bg); color:var(--text); line-height:1.5; }

header { background:linear-gradient(135deg,var(--fill-blue),var(--fill-blue-deep)); color:#fff; padding:1.5rem 2rem; text-align:center; position:relative; margin-bottom:1.5rem; border-radius:var(--radius); }
header h1 { font-size:1.6rem; font-weight:700; }
header p { opacity:0.85; font-size:0.9rem; margin-top:0.25rem; }
footer { text-align:center; padding:1.5rem; font-size:0.8rem; color:var(--text-light); }
footer a { color:var(--blue); }
.back-btn { position:absolute; top:1rem; left:1rem; width:36px; height:36px; display:flex; flex-direction:column; justify-content:center; align-items:center; gap:5px; background:rgba(255,255,255,0.15); border:none; border-radius:8px; cursor:pointer; padding:0; text-decoration:none; transition:background 0.15s; z-index:2; }
.back-btn:hover { background:rgba(255,255,255,0.28); }
.back-btn span { display:block; width:18px; height:2px; background:#fff; border-radius:2px; }

/* Hover-Navigationsmenü am ☰-Button — Inhalt/Verhalten zentral aus /assets/nav-menu.js */
.nav-dropdown { position:absolute; top:1rem; left:1rem; z-index:20; }
.nav-dropdown .back-btn { position:static; }   /* Position übernimmt jetzt der Wrapper */
.nav-dropdown::after {                          /* unsichtbare Brücke über den Spalt zum Menü */
  content:""; position:absolute; top:100%; left:0; width:220px; max-width:70vw; height:10px;
}
.nav-menu {
  position:absolute; top:calc(100% + 6px); left:0; min-width:220px;
  background:var(--card); border:1px solid var(--border); border-radius:10px;
  box-shadow:0 10px 30px rgba(0,0,0,0.18); padding:0.35rem;
  opacity:0; visibility:hidden; transform:translateY(-6px); pointer-events:none;
  transition:opacity 0.15s, transform 0.15s, visibility 0.15s;
}
.nav-dropdown:hover .nav-menu, .nav-dropdown:focus-within .nav-menu {
  opacity:1; visibility:visible; transform:translateY(0); pointer-events:auto;
}
/* Beim Scrollen zugeklappt. Auf dem Handy bleibt nach einem Tipp sowohl der
   :hover- als auch der :focus-within-Zustand haengen — das Menue scrollte
   einfach mit und ging erst weg, wenn man irgendwohin tippte. Gesetzt und
   wieder entfernt wird die Klasse in nav-menu.js.
   Gleiche Spezifitaet wie die Regel darueber (0,3,0), steht aber spaeter und
   gewinnt deshalb — gegen :hover wie gegen :focus-within. */
.nav-dropdown.zugeklappt .nav-menu {
  opacity:0; visibility:hidden; transform:translateY(-6px); pointer-events:none;
}
.nav-menu-item {
  display:block; padding:0.55rem 0.8rem; border-radius:7px; text-decoration:none;
  color:var(--text); font-size:0.9rem; font-weight:600; white-space:nowrap;
}
.nav-menu-item:hover { background:var(--blue-light); color:var(--blue-dark); }
.nav-menu-item.current { background:var(--fill-blue); color:#fff; }
.nav-menu-item.overview { color:var(--text-light); border-bottom:1px solid var(--border); border-radius:0; margin-bottom:0.25rem; padding-bottom:0.6rem; }
.nav-menu-item.overview:hover { color:var(--blue-dark); background:var(--blue-light); }

main { max-width:1000px; margin:0 auto; padding:1.5rem 1rem 3rem; }
.card { background:var(--card); border-radius:var(--radius); box-shadow:var(--shadow); padding:1.5rem; margin-bottom:1.5rem; }
.card h2 { font-size:1.15rem; color:var(--blue); margin-bottom:1rem; padding-bottom:0.5rem; border-bottom:2px solid var(--blue-light); display:flex; justify-content:space-between; align-items:center; gap:0.5rem; }
.card h3 { font-size:0.95rem; color:var(--text-light); margin:1rem 0 0.5rem; text-transform:uppercase; letter-spacing:0.05em; }

.center-state { text-align:center; padding:2rem 1rem; color:var(--text-light); }
.center-state .icon { font-size:3rem; margin-bottom:0.5rem; }
.center-state h3 { color:var(--text); margin-bottom:0.5rem; text-transform:none; letter-spacing:0; font-size:1.15rem; }
.center-state p { max-width:380px; margin:0 auto 0.6rem; line-height:1.5; }

.btn { padding:0.6rem 1.2rem; border:none; border-radius:8px; font-size:0.95rem; font-weight:600; cursor:pointer; font-family:inherit; transition:transform 0.15s, box-shadow 0.15s; }
.btn-primary { background:linear-gradient(135deg,var(--fill-blue),var(--fill-blue-deep)); color:#fff; box-shadow:0 4px 12px rgba(52,152,219,0.3); }
.btn-primary:not(:disabled):hover { transform:translateY(-1px); box-shadow:0 6px 16px rgba(52,152,219,0.4); }
.btn-ghost { background:var(--card); border:2px solid var(--border); color:var(--text); }
.btn-danger { background:var(--card); border:2px solid var(--red); color:var(--red); }
/* --blue-light als Flaeche, --blue-dark als Schrift — dasselbe Paar wie beim
   Navi-Hover, den Badges und dem Info-Banner. Mit --blue war der Text im
   hellen Modus zu blass (2,8:1). */
.btn-secondary { background:var(--blue-light); color:var(--blue-dark); }
.btn-secondary:hover { background:var(--blue-light); }
/* Gesperrter Button: ohne das sieht ein disabled-Button aus wie ein klickbarer.
   Das Anheben beim Hover ist oben per :not(:disabled) ausgeschlossen — ein
   pauschales box-shadow:none hier wuerde dem .btn-primary beim Ueberfahren
   seinen Grundschatten wegnehmen und flackern. */
.btn:disabled { opacity:0.5; cursor:not-allowed; }
.btn-row { display:flex; gap:0.5rem; flex-wrap:wrap; margin-top:1rem; }
/* Großer Aktions-CTA (Berechnen) – orange, zentriert */
.btn-calculate { display:block; width:100%; max-width:340px; margin:1rem auto; padding:0.85rem 2rem; background:linear-gradient(135deg,var(--fill-orange),var(--fill-orange-deep)); color:#fff; border:none; border-radius:10px; font-size:1.05rem; font-weight:700; cursor:pointer; font-family:inherit; box-shadow:0 4px 12px rgba(232,115,42,0.3); transition:transform 0.15s, box-shadow 0.15s; }
.btn-calculate:hover { transform:translateY(-1px); box-shadow:0 6px 16px rgba(232,115,42,0.4); }
/* Nebenaktionen im selben Knopf-Format. Standen vorher als Inline-Verlauf am
   Element und waren damit blind fürs Farbschema: im Dunkelmodus blieben sie
   im Hellmodus-Ton stehen. */
.btn-calculate.gruen { background:linear-gradient(135deg,var(--fill-green),var(--fill-green-deep)); }
.btn-calculate.grau  { background:linear-gradient(135deg,var(--fill-slate),var(--fill-slate-deep)); }
/* Info-/Hilfe-Punkt (rundes „i" bzw. „?") – einheitlich auf allen Seiten */
.info-i { display:inline-flex; align-items:center; justify-content:center; width:16px; height:16px; border-radius:50%; background:var(--fill-slate); color:#fff; font-size:10px; font-weight:700; font-style:normal; text-transform:none; line-height:1; cursor:pointer; border:none; padding:0; margin-left:5px; vertical-align:middle; flex:none; transition:background 0.15s; }
.info-i:hover { background:var(--fill-blue); color:#fff; }
.info-i.danger { background:var(--red-light); color:var(--red-dark); }
.info-i.danger:hover { background:var(--fill-red); color:#fff; }

/* Tabellen-Aktions-Icons (rund): bearbeiten / speichern / löschen — einheitlich */
.row-action { width:28px; height:28px; border-radius:50%; border:none; cursor:pointer; font-size:0.95rem; line-height:1; font-weight:700; display:inline-flex; align-items:center; justify-content:center; transition:filter 0.15s; font-family:inherit; padding:0; }
.row-action.edit { background:var(--blue-light); color:var(--text-mid); }
.row-action.danger { background:var(--red-light); color:var(--red-dark); }
.row-action.save { background:var(--green-light); color:var(--green-dark); }
.row-action:hover { filter:brightness(0.92); }

/* Collapsible — gemeinsamer Auf-/Zuklapp-Body */
.collapsible-body { display:none; }
.collapsible.open .collapsible-body { display:block; }

/* Pumpen-Kalibrier-Wizard (kalk + nutrient) */
.pump-cal { border:1px solid var(--border); border-radius:10px; padding:1rem; margin-bottom:0.7rem; }
.pump-cal-head { display:flex; justify-content:space-between; align-items:center; gap:1rem; flex-wrap:wrap; }
.pump-cal-name { font-weight:700; font-size:1rem; }
.pump-cal-meta { font-size:0.78rem; color:var(--text-light); margin-top:0.15rem; }
.pump-cal-current { font-family:monospace; font-size:0.85rem; color:var(--text); background:var(--bg); padding:0.2rem 0.5rem; border-radius:4px; }
.pump-cal-wizard { display:none; margin-top:1rem; padding:1rem; background:var(--bg); border-radius:8px; }
.pump-cal-wizard.open { display:block; }
.pump-cal-row { display:flex; gap:0.7rem; align-items:flex-end; flex-wrap:wrap; }
.pump-cal-row .form-row { margin-bottom:0; flex:1 1 140px; }
.pump-cal-row input { padding:0.55rem 0.7rem; border:2px solid var(--border); border-radius:8px; font-size:0.95rem; font-family:inherit; width:100%; }
.pump-cal-step { padding:0.7rem 0.9rem; background:var(--card); border-radius:6px; margin-bottom:0.7rem; }
.pump-cal-step.active { border-left:3px solid var(--blue); background:var(--blue-light); }
.pump-cal-step.done { border-left:3px solid var(--green); }
.pump-cal-step .num { display:inline-block; width:22px; height:22px; line-height:22px; text-align:center; background:var(--fill-blue); color:#fff; border-radius:50%; font-size:0.78rem; font-weight:700; margin-right:0.5rem; }
.pump-cal-step.done .num { background:var(--fill-green); }
.pump-cal-step.idle .num { background:var(--icon-muted); }
.cal-progress { height:6px; background:var(--surface); border-radius:3px; overflow:hidden; margin:0.5rem 0; }
.cal-progress-fill { height:100%; background:linear-gradient(90deg,var(--blue),var(--blue-dark)); transition:width 0.3s; width:0%; }

/* Formular */
.form-row { display:flex; flex-direction:column; gap:0.3rem; margin-bottom:0.9rem; }
.form-row label { font-size:0.8rem; font-weight:600; color:var(--text-mid); }
.form-row .hint { font-size:0.72rem; color:var(--text-light); font-weight:400; }
.form-row input[type=text], .form-row input[type=number] { padding:0.6rem 0.7rem; border:2px solid var(--border); border-radius:8px; font-size:0.95rem; font-family:inherit; }
.form-row input[type=text]:focus, .form-row input[type=number]:focus { outline:none; border-color:var(--blue); }
.form-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:0.9rem 1.2rem; align-items:end; }
.form-grid .form-row { justify-content:flex-end; }

/* Spalten-Gruppen: thematisch zusammengehörige Felder vertikal gestapelt,
   mit feiner (nicht voll durchgehender) Trennlinie zwischen den Spalten. */
.col-groups { display:grid; grid-template-columns:repeat(3,1fr); }
.col-group { position:relative; padding:0 1.6rem; }
.col-group:first-child { padding-left:0; }
.col-group:last-child { padding-right:0; }
.col-group + .col-group::before { content:""; position:absolute; left:0; top:0.4rem; bottom:0.9rem; width:1px; background:var(--blue-light); }
.col-group .form-row:last-child { margin-bottom:0; }
@media (max-width:760px) {
  .col-groups { grid-template-columns:1fr; }
  .col-group { padding:0; }
  .col-group + .col-group { margin-top:0.9rem; padding-top:0.9rem; border-top:1px solid var(--blue-light); }
  .col-group + .col-group::before { display:none; }
}
/* Zwei Eingaben (min / max) nebeneinander — schrumpfen sauber in ihre Spalte */
.minmax { display:flex; gap:0.4rem; }
.minmax input { flex:1; min-width:0; width:100%; }
/* Schalter: Kästchen + Beschriftung, dazu optional Hinweis oder Info-Punkt.
   Beschriftung und Beiwerk stehen in .form-toggle-text; diese Spalte nimmt den
   Rest der Zeile. Das <label> selbst bleibt inline und damit genau so groß wie
   sein Text: nur Text und Kästchen schalten — nicht die leere Fläche rechts
   daneben, nicht der Hinweis, nicht der Info-Punkt. Vorher war das Label das
   Flex-Kind mit flex:1 samt Hinweis darin, und ein Klick irgendwo in der Zeile
   kippte den Haken. */
.form-toggle { display:flex; align-items:center; gap:0.6rem; padding:0.5rem 0; }
.form-toggle input { width:18px; height:18px; cursor:pointer; flex-shrink:0; }
.form-toggle-text { flex:1; min-width:0; }
.form-toggle label { font-weight:600; font-size:0.88rem; cursor:pointer; }
.section-title { font-size:0.78rem; font-weight:700; color:var(--blue-dark); text-transform:uppercase; letter-spacing:0.06em; margin:1.3rem 0 0.7rem; padding-bottom:0.3rem; border-bottom:1px solid var(--blue-light); }
.section-title:first-child { margin-top:0; }

/* Segmented-Control: mehrere Optionen sichtbar nebeneinander, genau eine aktiv */
.segmented { display:flex; flex-wrap:wrap; gap:0; border:2px solid var(--border); border-radius:10px; overflow:hidden; background:var(--card); }
.segmented button { flex:1 1 0; min-width:110px; padding:0.6rem 0.6rem; border:none; border-right:1px solid var(--border); background:var(--card); color:var(--text); font-family:inherit; font-size:0.9rem; font-weight:600; line-height:1.25; cursor:pointer; transition:background 0.15s,color 0.15s; }
.segmented button:last-child { border-right:none; }
.segmented button:hover:not(.active) { background:var(--bg); }
.segmented button.active { background:linear-gradient(135deg,var(--fill-blue),var(--fill-blue-deep)); color:#fff; }
.segmented button .seg-sub { display:block; font-size:0.72rem; font-weight:500; opacity:0.75; margin-top:0.15rem; }
.kh-mode-detail { margin-top:1rem; }
.save-status { font-size:0.78rem; color:var(--green); opacity:0; transition:opacity 0.2s; margin-left:0.5rem; }
.save-status.show { opacity:1; }
.hint { font-size:0.72rem; color:var(--text-light); font-weight:400; }
/* Hinweis unter der Beschriftung statt dahinter. Als eigene Klasse und nicht
   als `.form-toggle .hint`, weil in denselben Schaltern auch Hinweise stehen,
   die bewusst in der Zeile bleiben. */
.hint.eigene-zeile { display:block; }
.muted { color:var(--text-light); }
/* Einleitungssatz unter einer Überschrift. Stand auf mehreren Seiten als
   derselbe Inline-Stil. Bewusst ohne font-size: der Salz-Rechner setzt dort
   0.9rem und soll seine Optik behalten. */
.lead { color:var(--text-light); margin-bottom:1rem; }
/* Zusatz hinter einer Abschnitts-Überschrift: "KH-Messungen (12)" */
.anzahl { font-weight:400; color:var(--text-light); font-size:0.82rem; }

/* Tabellen */
.data-table { width:100%; border-collapse:collapse; font-size:0.88rem; }
.data-table th { text-align:left; padding:0.5rem 0.7rem; background:var(--bg); color:var(--text-light); font-weight:600; font-size:0.75rem; text-transform:uppercase; letter-spacing:0.04em; border-bottom:2px solid var(--border); }
.data-table th.num, .data-table td.num { text-align:right; font-variant-numeric:tabular-nums; }
.data-table th.act, .data-table td.act { text-align:center; width:60px; }
.data-table td { padding:0.5rem 0.7rem; border-bottom:1px solid var(--border); }
.data-table tr:hover td { background:var(--surface); }
.data-table .empty { text-align:center; color:var(--text-light); padding:1.5rem !important; font-style:italic; }

/* Mess-Sektion: Tabelle mit Kopfzeile; mit .collapse3 zugeklappt nur letzte 3 Zeilen */
.meas-section { border:1px solid var(--border); border-radius:8px; margin-bottom:0.8rem; overflow:hidden; }
.meas-head { padding:0.6rem 1rem; background:var(--bg); display:flex; justify-content:space-between; align-items:center; font-weight:600; font-size:0.92rem; }
.meas-toggle { background:none; border:none; color:var(--blue); cursor:pointer; font-size:0.82rem; font-weight:600; font-family:inherit; padding:0.2rem 0.4rem; }
.meas-toggle:hover { text-decoration:underline; }
.meas-section.collapse3:not(.expanded) tbody tr:nth-child(n+4) { display:none; }

/* Chart-Container */
.chart-box { background:var(--card); border:1px solid var(--border); border-radius:10px; padding:0.8rem 1rem; margin-bottom:1rem; }
.chart-box svg { width:100%; height:auto; display:block; }
.chart-title { font-size:0.85rem; font-weight:600; color:var(--text-light); margin-bottom:0.4rem; display:flex; justify-content:space-between; align-items:center; }
.chart-legend { display:flex; gap:1rem; font-size:0.78rem; color:var(--text-light); }
.chart-legend-item { display:flex; align-items:center; gap:0.35rem; }
.chart-legend-swatch { width:14px; height:3px; border-radius:2px; }

/* ---- Hover-Verlauf an Tabellenkoepfen --------------------------------------
   Die kleine Karte, die beim Ueberfahren eines Elements seinen Verlauf zeigt.
   Stand zweimal da: als Klassensatz im Spurenrechner und noch einmal als
   cssText-Zeile im C&R-Rechner — gleiche Optik, zwei Quellen. Wer die eine
   anfasste, aenderte die andere nicht mit.

   Die Vorgabe verankert die Karte an der Seite (position:absolute); wer sie
   setzt, rechnet mit scrollX/scrollY. .fest verankert sie am Bildschirm, fuer
   Aufrufer, die direkt mit getBoundingClientRect arbeiten — und liegt bewusst
   hoeher, weil sie dort ueber einem Hilfe-Fenster stehen muss.
   Der Grundwert 300 bleibt unter den Modalen (1000), damit die Vorschau nicht
   durch einen offenen Dialog stoesst. */
.chart-tooltip { position:absolute; z-index:300; background:var(--card); border:1px solid var(--border); border-radius:10px; box-shadow:0 8px 24px rgba(0,0,0,0.18); padding:0.5rem 0.6rem 0.4rem; pointer-events:none; display:none; }
.chart-tooltip.show { display:block; }
.chart-tooltip.fest { position:fixed; z-index:1300; font-size:0.75rem; }
.chart-tooltip .ct-title { font-size:0.85rem; font-weight:700; margin-bottom:0.25rem; color:var(--text); }
.chart-tooltip .ct-fuss { color:var(--text-light); text-align:right; margin-top:0.2rem; }
.chart-tooltip .ct-legend { display:flex; gap:0.75rem; font-size:0.7rem; color:var(--text-light); margin-top:0.2rem; justify-content:center; }
.chart-tooltip .ct-legend span { display:inline-flex; align-items:center; gap:0.25rem; }
.chart-tooltip .ct-swatch { display:inline-block; width:10px; height:3px; border-radius:2px; }

/* ---- Gerüst der Diagramme: Achsen, Gitter, Beschriftungen ------------------
   Standen in den erzeugten SVGs als feste Werte in fill=/stroke= — und zwar
   als die HELLmodus-Werte der Tokens: #e1e8ed ist --border, #7a8896 ist
   --text-light. Im Dunkelmodus wurden Gitterlinien dadurch fast weiß auf der
   dunklen Karte gezeichnet.

   Als CSS-Regel statt als Attribut, weil der Browser den Themenwechsel dann
   selbst umrechnet: das SVG muss nicht neu gezeichnet werden, und es gibt
   keine zweite Farbtabelle im JavaScript, die man mitpflegen müsste. CSS
   schlägt Präsentations-Attribute, die Klasse gewinnt also auch dort, wo im
   Markup noch ein fill= steht. */
svg .dia-gitter { stroke: var(--border); }
svg .dia-text   { fill: var(--text-light); }
svg .dia-flaeche { fill: var(--surface); stroke: var(--border); }
svg .dia-trend  { stroke: var(--text); }
/* Linie und Punkt getrennt: eine Regel, die beides setzt, wuerde das
   fill="none" der Linie ueberschreiben — die Kurve waere dann eine Flaeche. */
svg .dia-linie  { stroke: var(--blue); fill: none; }
svg .dia-punkt  { fill: var(--blue); }

/* Dashboard-Stats */
.stat-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:1rem; }
.stat-box { background:var(--bg); border-radius:10px; padding:1rem; text-align:center; }
.stat-label { font-size:0.75rem; color:var(--text-light); text-transform:uppercase; letter-spacing:0.05em; font-weight:600; }
.stat-value { font-size:1.8rem; font-weight:700; color:var(--blue-dark); margin:0.4rem 0 0.2rem; font-variant-numeric:tabular-nums; }
.stat-meta { font-size:0.72rem; color:var(--text-light); }

/* Container / Füllstände */
.container-item { border:1px solid var(--border); border-radius:10px; padding:1rem; margin-bottom:0.8rem; }
.container-head { display:flex; justify-content:space-between; align-items:center; margin-bottom:0.8rem; gap:1rem; flex-wrap:wrap; }
.container-head .name { font-weight:700; font-size:1rem; }
.container-bar { background:var(--bg); border-radius:4px; height:8px; overflow:hidden; margin:0.3rem 0; }
.container-bar-fill { background:linear-gradient(90deg,var(--green),var(--blue)); height:100%; transition:width 0.3s; }
.container-bar-fill.low { background:linear-gradient(90deg,var(--orange),var(--red)); }
.container-meta { font-size:0.78rem; color:var(--text-light); margin-bottom:0.6rem; }

/* Tab-Leiste (einheitliches oberes Auswahlmenü) */
.tabs { display:flex; gap:0; margin-bottom:1.5rem; background:var(--card); border-radius:var(--radius); box-shadow:var(--shadow); overflow-x:auto; overflow-y:hidden; }
.tab-btn { flex:1 0 auto; min-width:max-content; padding:0.85rem 1rem; border:none; background:var(--card); color:var(--text-light); font-size:0.95rem; font-weight:600; cursor:pointer; border-bottom:3px solid transparent; transition:all 0.2s; font-family:inherit; white-space:nowrap; }
.tab-btn.active { color:var(--blue); border-bottom-color:var(--blue); }
.tab-btn:hover:not(.active) { background:var(--bg); }
.tab-content { display:none; }
.tab-content.active { display:block; }

/* Toast / Banner */
.toast { position:fixed; bottom:1rem; left:50%; transform:translateX(-50%); background:#2c3e50; color:#fff; padding:0.7rem 1.2rem; border-radius:8px; font-size:0.9rem; z-index:1001; transition:opacity 0.3s; }
.toast.error, .toast.err { background:var(--fill-red); }
.toast.success, .toast.ok { background:var(--fill-green); }

/* Info-Popover (rundes „i" neben Einstellungen — Overlay + Karte) */
.info-pop-back { position:fixed; inset:0; z-index:99; }
.info-pop { position:fixed; z-index:100; max-width:290px; background:var(--card); border:1px solid var(--border); border-radius:10px; box-shadow:0 10px 30px rgba(0,0,0,.18); padding:0.75rem 0.85rem; font-size:0.82rem; line-height:1.45; color:var(--text); text-transform:none; font-weight:400; letter-spacing:normal; }
.info-pop .ttl { font-weight:700; color:var(--blue-dark); margin-bottom:0.25rem; }
.info-banner { background:var(--blue-light); border-left:4px solid var(--blue); padding:0.8rem 1rem; border-radius:6px; font-size:0.88rem; color:var(--blue-dark); margin-bottom:1rem; }
.info-banner strong { color:var(--text); }

/* Select im gleichen Stil wie die Text-/Zahlenfelder (native Chrome/Safari-Optik ersetzt).
   Als `select.app-select` geschrieben, damit es lokale Regeln wie `.field select`
   (gleiche Spezifität, aber vor app.css geladen) sicher schlägt — v. a. das
   Chevron-Hintergrundbild, das eine `background:`-Kurzschreibweise sonst zurücksetzt. */
select.app-select {
  -webkit-appearance:none; -moz-appearance:none; appearance:none;
  width:100%; box-sizing:border-box;
  padding:0.6rem 2.1rem 0.6rem 0.7rem;
  border:2px solid var(--border); border-radius:8px;
  font-size:0.95rem; font-family:inherit; line-height:1.2;
  color:var(--text); background-color:var(--card);
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path fill='none' stroke='%235a6776' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M1 1.5 6 6.5l5-5'/></svg>");
  background-repeat:no-repeat; background-position:right 0.7rem center;
  cursor:pointer;
}
select.app-select:focus { outline:none; border-color:var(--blue); }

/* =============================================================
   Schmale Bildschirme — gemeinsame Regeln
   =============================================================
   Gebaut wird am Desktop, geprüft wurde bei 375 px. Alles hier ist
   Ergebnis dieser Prüfung und gilt bewusst global: dieselbe Ursache
   trat auf mehreren Seiten auf, und drei Kopien einer Regel driften
   auseinander. */

/* Seitwärts scrollen statt die Seite verschieben.
   Für alles, was schmaler nicht sinnvoll ist: breite Tabellen und
   Diagramme. Wichtig ist `max-width:100%` — ohne das wächst der
   Container mit seinem Inhalt und der Scroll läuft ins Leere. */
.scroll-x {
  overflow-x: auto;
  max-width: 100%;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-x: contain;   /* kein versehentliches Zurückwischen */
}
/* Ein SVG in .scroll-x soll seine Lesbarkeit behalten statt zu schrumpfen.
   Unterhalb dieser Breite wird die Beschriftung unleserlich. Gemessen an der
   groessten Grafik (viewBox 960, kleinste Schrift 9 px):
     291 px Darstellung -> 2,7 px Schrift   unlesbar
     700 px             -> 6,6 px           grenzwertig
     860 px             -> 8,1 px           lesbar
   860 px kostet auf einem 375-px-Schirm gut zwei Wischer — vertretbar
   dafuer, dass die Beschriftung ueberhaupt etwas aussagt. */
.scroll-x > svg { min-width: 860px; display: block; }
@media (min-width: 760px) {
  .scroll-x > svg { min-width: 0; width: 100%; }
}

/* Ein <select> ist so breit wie seine längste Option und schrumpft in
   Flex-/Grid-Containern nicht von selbst — `min-width:auto` verhindert
   das. Ohne diese Regel sprengte die Auswahl im Spurenrechner die Seite
   (232 px Feld in 95 px Spalte). */
select { min-width: 0; max-width: 100%; }

/* `1fr` heißt `minmax(auto, 1fr)`: die Spalte kann nicht unter ihre
   Mindestinhaltsbreite. Bei zwei Spalten in einer schmalen Karte ergab
   das 326 px in einem 295-px-Container. `minmax(0,1fr)` erlaubt das
   Schrumpfen — als Hilfsklasse, damit die Absicht am Aufrufort steht. */
.grid-schrumpfbar { grid-auto-columns: minmax(0, 1fr); }
.grid-schrumpfbar > * { min-width: 0; }

/* Tippziele: Apple empfiehlt 44 px, Google 48 px. Vergrößert wird über
   den Innenabstand, damit die Optik gleich bleibt. */
@media (max-width: 760px) {
  footer a { display: inline-block; padding: 0.5rem 0.3rem; }
  .info-i { width: 22px; height: 22px; font-size: 12px; }
}

/* Kopfbereich: Menü-Knopf und Anmelde-Chip liegen absolut über der
   zentrierten Überschrift und reservieren deshalb keinen Platz. Auf breiten
   Schirmen geht das gut, schmal läuft der Titel darunter durch — gemessen
   kollidiert der Chip bis 520 px, und bei kurzen Titeln zusätzlich der
   Menü-Knopf.

   Statt an Breiten zu feilen (Titellänge und Anmeldename sind beide
   variabel) bekommen die Bedienelemente hier schlicht ihre eigene Zeile:
   Sie sitzen bei top:1rem und sind 36 px hoch, der Titel beginnt darunter. */
@media (max-width: 640px) {
  header { padding-top: 3.75rem; }
  header h1 { font-size: 1.35rem; }
}

/* =============================================================
   Kopfbereich und Tab-Leiste kleben oben
   =============================================================
   Die Tab-Leiste scrollte weg, fuer jeden Seitenwechsel musste man erst
   wieder ganz nach oben. Beides bleibt jetzt stehen — auf jeder Breite.

   Auf schmalen Schirmen schrumpft der Kopf dabei zusaetzlich auf eine
   Zeile zusammen, weil dort jeder Pixel zaehlt:

       ☰    Ueberschrift    (M)

   Am Desktop bleibt er in voller Groesse; dort ist Platz genug, und ein
   wechselndes Aussehen waere nur unruhig.

   Zum Weg: naheliegend waeren scroll-gesteuerte Animationen
   (`animation-timeline: scroll()`) oder `@container scroll-state(stuck: top)`.
   Beide scheiden aus demselben Grund aus — die Tab-Leiste muss exakt unter
   dem Kopf kleben, dessen Hoehe je nach Titellaenge zwischen 142 und 164 px
   liegt. Das ist keine Zahl fuers Stylesheet. sticky-kopf.js misst sie und
   setzt `top` entsprechend. */
header {
  position: sticky;
  top: 0;
  z-index: 30;
}
.tabs {
  position: sticky;
  /* sticky-kopf.js misst die Kopfhoehe und schreibt sie als --kopfhoehe an
     :root. Nur die Zahl kommt von dort — die Regel, was damit passiert, steht
     hier. Vorher setzte das Modul `top` direkt als Inline-Stil ans Element;
     damit lag ein Stueck Layout im JavaScript und war von hier aus nicht mehr
     zu ueberschreiben. */
  top: var(--kopfhoehe, 0px);
  z-index: 25;
  box-shadow: var(--shadow), 0 6px 12px -8px rgba(0,0,0,0.35);
}

/* --- Zusammengeschrumpfter Kopf, nur auf schmalen Schirmen --- */
@media (max-width: 760px) {
  header { transition: padding 0.18s ease, margin-bottom 0.18s ease; }
  header h1 { transition: font-size 0.18s ease; }
  header p  { overflow: hidden; max-height: 4rem;
              transition: max-height 0.18s ease, opacity 0.14s ease, margin-top 0.18s ease; }
  .as-btn-label { display: inline-block; overflow: hidden; max-width: 120px;
                  transition: max-width 0.18s ease, opacity 0.14s ease; }
  .back-btn, .nav-dropdown, .as-btn { transition: top 0.18s ease; }

  header.kopf-kompakt { padding-top: 1rem; padding-bottom: 1rem; margin-bottom: 0.75rem; }
  header.kopf-kompakt h1 { font-size: 1.05rem; }
  header.kopf-kompakt p { max-height: 0; opacity: 0; margin-top: 0; }
  header.kopf-kompakt .as-btn-label { max-width: 0; opacity: 0; }

  /* Alle drei auf eine Linie. Die Bedienelemente liegen absolut und sassen
     bei top:1rem — dadurch stand die Ueberschrift 6 px hoeher als ☰ und (M).
     Auf die Mitte des Kopfes bezogen stimmt es unabhaengig von Schriftgroesse
     und Zeilenhoehe. */
  header.kopf-kompakt .nav-dropdown,
  header.kopf-kompakt .back-btn:not(.nav-dropdown .back-btn),
  header.kopf-kompakt .as-btn {
    top: 50%;
    transform: translateY(-50%);
  }

  /* Ohne den Namen soll der Chip ein Quadrat um den Kreis sein. Vorher blieben
     Innenabstand und die Luecke zum eingeklappten Namen stehen: 50 x 36 px mit
     10 px links und 16 px rechts vom Kreis — sichtbar aus der Mitte. */
  header.kopf-kompakt .as-btn {
    width: 36px;
    padding: 0;
    gap: 0;
    justify-content: center;
  }
}

@media (prefers-reduced-motion: reduce) {
  header, header h1, header p, .as-btn-label,
  .back-btn, .nav-dropdown, .as-btn { transition: none; }
}
