/* ===== ZENTRALE TYPOGRAFIE =====
   Einheitliche Schrift-Skala mit wenigen semantischen Stufen.
   - --fs-scale: EIN Regler für die Gesamtgröße aller Texte
   - Semantische Stufen (caption…huge) definieren die echte Größe
   - Die numerischen Aliasse (--fs-10…--fs-48) mappen auf diese Stufen,
     damit bestehende Templates unverändert funktionieren.
   Zum Anpassen also nur die 8 semantischen Stufen ändern. */
:root {
  --fs-scale: 1;   /* ← Gesamtgröße aller Texte (1 = scharfe Ganzzahl-Pixel).
                        WICHTIG: nur ganzzahlige Vielfache nutzen (1, 1.25, 1.5),
                        sonst entstehen krumme px-Werte → unscharfe Schrift. */

  /* Semantische Stufen — ganzzahlige px (≈ vorheriger 1.12-Skala, aber crisp).
     calc bleibt für künftige Ganzzahl-Skalierung erhalten. */
  --fs-caption: calc(14px * var(--fs-scale));  /* Meta, Labels, Hinweise */
  --fs-small:   calc(15px * var(--fs-scale));  /* sekundärer Text */
  --fs-body:    calc(17px * var(--fs-scale));  /* Standard-Fließtext */
  --fs-medium:  calc(19px * var(--fs-scale));  /* Hervorhebung, kleine Überschrift */
  --fs-large:   calc(23px * var(--fs-scale));  /* Abschnitts-Überschrift */
  --fs-xl:      calc(28px * var(--fs-scale));  /* Karten-Titel */
  --fs-display: calc(34px * var(--fs-scale));  /* Seitentitel */
  --fs-huge:    calc(46px * var(--fs-scale));  /* große Kennzahlen */

  /* Numerische Aliasse → auf semantische Stufen gemappt (Vereinheitlichung) */
  --fs-10: var(--fs-caption);
  --fs-11: var(--fs-caption);
  --fs-12: var(--fs-caption);
  --fs-13: var(--fs-small);
  --fs-14: var(--fs-body);
  --fs-15: var(--fs-body);
  --fs-16: var(--fs-medium);
  --fs-17: var(--fs-medium);
  --fs-18: var(--fs-medium);
  --topbar-h: 74px;
  --fs-20: var(--fs-large);
  --fs-22: var(--fs-large);
  --fs-24: var(--fs-xl);
  --fs-26: var(--fs-xl);
  --fs-28: var(--fs-xl);
  --fs-32: var(--fs-display);
  --fs-48: var(--fs-huge);

  /* ===== ZENTRALE SCHRIFTDICKE ===== 3 Stufen, hier (und nur hier) ändern.
     normal = Fließtext, medium = Labels/Buttons/Badges, bold = Überschriften/Werte/Tabellenköpfe. */
  --fw-normal: 400;
  --fw-medium: 600;
  --fw-bold:   700;

  /* ===== ZENTRALE FARBPALETTE =====
     Semantische Farben — werden in CSS-Regeln und Templates per var(--c-…) genutzt.
     Hier (und NUR hier) Hex-Werte ändern, um die ganze App umzufärben. */

  /* Marke / Akzente — Marineblau, bewusst gedeckt (seriöser Behörden-/Firmenlook) */
  --c-primary:        #1e3a8a;  /* dunkelblau — Headings, aktive Tabs, Save-Btn */
  --c-primary-hover:  #172a6b;
  --c-accent:         #2f5fb3;  /* gedecktes Marineblau — Highlights, Charts */

  /* Aktions-Buttons — EIN konstantes, gedämpftes Stahlblau über alle Themes
     (weißer Text immer lesbar, nicht grell). Alle positiven Aktionen gleich. */
  --c-action:         #3b5b8c;
  --c-action-hover:   #314c75;

  /* Text */
  --c-text:           #1e293b;  /* Body */
  --c-text-strong:    #0f172a;  /* Kennzahlen */
  --c-text-muted:     #475569;  /* sekundär */
  --c-text-soft:      #64748b;  /* tertiär */
  --c-text-faint:     #94a3b8;  /* quartär */

  /* Flächen / Linien — kühler Grundton mit leichtem Blaustich */
  --c-bg:             #eef1f6;  /* Seitenhintergrund */
  --c-surface:        #ffffff;  /* Karten, Modals, Inputs */
  --c-surface-alt:    #f6f8fb;  /* Tabellen-Header, Hover, helle Inputs */
  --c-bg-soft:        #f6f8fb;  /* Alias (Kompatibilität) → surface-alt */
  --c-bg-mute:        #eff2f7;  /* neutrale Badges, hover */
  --c-border:         #dde4ee;
  --c-border-strong:  #c3cedd;

  /* Status-Chips: gedeckte, entsättigte Tints mit dunklem Text statt
     Bonbon-Pastell — wirkt ruhiger und seriöser, Semantik bleibt gleich. */

  /* Status — Erfolg / Lädt */
  --c-success:        #1d9a6c;
  --c-success-strong: #157a55;
  --c-success-hover:  #116649;
  --c-success-text:   #1c5c40;
  --c-success-bg:     #e2eee7;
  --c-success-border: #c2dbcd;

  /* Status — Gefahr / Verwaist / Offline */
  --c-danger:         #c22f2f;
  --c-danger-light:   #d64545;
  --c-danger-hover:   #a32424;
  --c-danger-strong:  #8c1f1f;
  --c-danger-bg:      #f5e2e2;
  --c-danger-bg-soft: #faf1f1;

  /* Status — Warnung / Pausiert (Auto) */
  --c-warning:        #b97a10;
  --c-warning-hover:  #9c650c;
  --c-warning-text:   #77500e;
  --c-warning-bg:     #f4edda;
  --c-warning-border: #e3d2a5;
  --c-warning-strong: #d97706;

  /* Status — Info / Angesteckt */
  --c-info:           #2b5c8a;
  --c-info-deep:      #34689a;
  --c-info-bg:        #e4ebf4;
  --c-info-bg-soft:   #f1f5fa;

  /* Status — Abschluss */
  --c-purple-text:    #55418a;
  --c-purple-bg:      #eae7f3;

  /* Transparente Akzent-Tints — funktionieren auf hellen UND dunklen Flächen.
     Für Icon-Chips, aktive Sidebar-Einträge, Status-Pills (Mockup-Look). */
  --tint-accent:        rgba(30,58,138,.08);
  --tint-accent-border: rgba(30,58,138,.22);
  --tint-success:       rgba(29,154,108,.12);
  --tint-warning:       rgba(185,122,16,.13);
  --tint-danger:        rgba(194,47,47,.12);
  --tint-info:          rgba(43,92,138,.12);

  /* Schatten — auf dunklen Themes kräftiger, sonst unsichtbar */
  --shadow-card:      0 4px 6px -1px rgba(0,0,0,0.05);
  --shadow-pop:       0 24px 60px rgba(0,0,0,0.25);
}

/* ===== FARBSCHEMAS ===== Auswahl per <html data-theme="…"> bzw. Theme-Switcher.
   6 Themes im Blau-Spektrum, dunkel → hell. Hintergrund, Karten (--c-surface),
   Text und Akzente wechseln mit. Default in :root = "marineblau" (hell) — braucht
   keinen eigenen Block. Status-Farben (success/warning/danger) bleiben semantisch;
   auf dunklen Themes werden sie über den gemeinsamen Block unten gedimmt. */

html[data-theme="tiefsee"] {
    --c-bg:             #0b1120;
    --c-surface:        #0f172a;
    --c-surface-alt:    #1e293b;
    --c-bg-soft:        #1e293b;
    --c-bg-mute:        #1e293b;
    --c-text:           #f1f5f9;
    --c-text-strong:    #f8fafc;
    --c-text-muted:     #cbd5e1;
    --c-text-soft:      #94a3b8;
    --c-text-faint:     #64748b;
    --c-border:         #1e293b;
    --c-border-strong:  #334155;
    --c-primary:        #60a5fa;
    --c-primary-hover:  #93c5fd;
    --c-accent:         #93c5fd;
}
html[data-theme="mitternacht"] {
    --c-bg:             #0f172a;
    --c-surface:        #1e293b;
    --c-surface-alt:    #334155;
    --c-bg-soft:        #334155;
    --c-bg-mute:        #334155;
    --c-text:           #f8fafc;
    --c-text-strong:    #ffffff;
    --c-text-muted:     #e2e8f0;
    --c-text-soft:      #cbd5e1;
    --c-text-faint:     #94a3b8;
    --c-border:         #334155;
    --c-border-strong:  #475569;
    --c-primary:        #7dd3fc;
    --c-primary-hover:  #bae6fd;
    --c-accent:         #bae6fd;
}
html[data-theme="stahlblau"] {
    --c-bg:             #1e293b;
    --c-surface:        #334155;
    --c-surface-alt:    #475569;
    --c-bg-soft:        #475569;
    --c-bg-mute:        #475569;
    --c-text:           #f1f5f9;
    --c-text-strong:    #f8fafc;
    --c-text-muted:     #e2e8f0;
    --c-text-soft:      #cbd5e1;
    --c-text-faint:     #94a3b8;
    --c-border:         #475569;
    --c-border-strong:  #64748b;
    --c-primary:        #bfdbfe;
    --c-primary-hover:  #dbeafe;
    --c-accent:         #dbeafe;
}
html[data-theme="himmel"] {
    --c-bg:             #eff6ff;
    --c-surface:        #ffffff;
    --c-surface-alt:    #dbeafe;
    --c-bg-soft:        #dbeafe;
    --c-bg-mute:        #dbeafe;
    --c-text:           #1e293b;
    --c-text-strong:    #0f172a;
    --c-text-muted:     #1e3a8a;
    --c-text-soft:      #475569;
    --c-text-faint:     #64748b;
    --c-border:         #bfdbfe;
    --c-border-strong:  #93c5fd;
    --c-primary:        #1d4ed8;
    --c-primary-hover:  #1e40af;
    --c-accent:         #2563eb;
}

/* Gemeinsame Overrides für alle DUNKLEN Themes:
   - Status-Chips als dunkle Variante (gleiche Semantik, kein Grellen auf dunkel)
   - kräftigere Schatten (helle Schatten sind auf dunklem BG unsichtbar) */
html[data-theme="tiefsee"],
html[data-theme="mitternacht"], html[data-theme="stahlblau"] {
    /* Status-Flächen als transparente Tints (Mockup-Look) statt Vollfarben —
       leuchtende Textfarbe + dezenter Hintergrund auf dunklen Karten. */
    --c-success-bg:     rgba(16,185,129,.14);
    --c-success-text:   #6ee7b7;
    --c-success-border: rgba(16,185,129,.28);
    --c-warning-bg:     rgba(245,158,11,.14);
    --c-warning-text:   #fcd34d;
    --c-warning-border: rgba(245,158,11,.30);
    --c-warning-strong: #f59e0b;
    --c-danger-bg:      rgba(239,68,68,.14);
    --c-danger-strong:  #fca5a5;
    --c-info:           #93c5fd;
    --c-info-bg:        rgba(96,165,250,.14);
    --c-purple-text:    #d8b4fe;
    --c-purple-bg:      rgba(168,85,247,.16);

    --tint-accent:        rgba(96,165,250,.14);
    --tint-accent-border: rgba(96,165,250,.28);

    --shadow-card:      0 6px 16px -2px rgba(0,0,0,0.45);
    --shadow-pop:       0 24px 60px rgba(0,0,0,0.6);
}

* { box-sizing: border-box; }
html { height: 100%; background: var(--c-bg); }
body { min-height: 100%; }
body { font-family: 'Segoe UI', Tahoma, Arial, sans-serif; background: var(--c-bg); color: var(--c-text); margin: 0; transition: background 0.15s, color 0.15s; }
h1 { color: var(--c-text-strong); margin: 0; font-size:var(--fs-22); display: flex; align-items: center; gap: 10px; letter-spacing: -0.3px; }
h2 { color: var(--c-text); margin-top: 0; font-size:var(--fs-17); margin-bottom: 16px; display: flex; align-items: center; gap: 9px; }
h2 .icon, h1 .icon { color: var(--c-accent); }

/* ===== APP-SHELL ===== Sidebar links, Topbar + scrollender Inhalt rechts.
   <body class="app-shell"> → Sidebar (Navigation) + .main-area (Topbar/Content). */
/* Natürliches Fenster-Scrollen: der Inhalt läuft unbegrenzt nach unten (kein
   fixes 100vh + innerer Scroll mehr). Sidebar bleibt per sticky am Bildschirm. */
.app-shell { display: flex; min-height: 100vh; }
/* Sidebar fest fixiert (scrollt NICHT mit) — funktioniert auch bei CSS-Zoom,
   anders als position:sticky (das mit Zoom mitscrollt). .main-area gleicht die
   Breite per margin-left wieder aus. */
/* translateZ(0): eigene Compositing-Ebene → Chrome glättet die Schrift in
   Graustufen statt ClearType-Subpixel. Verhindert die rot/blauen Farbsäume,
   die helle Schrift auf dunklem Grund „schwammig" wirken lassen. */
.sidebar { width: 240px; flex: none; background: var(--c-surface); border-right: 1px solid var(--c-border); padding: 14px 16px 12px; display: flex; flex-direction: column; gap: 3px; position: fixed; top: 0; bottom: 0; left: 0; overflow-y: auto; z-index: 50; transform: translateZ(0); }
.brand { display: flex; align-items: center; gap: 11px; padding: 4px 8px 14px; }
.brand-logo { width: 36px; height: 36px; border-radius: 10px; background: linear-gradient(135deg, var(--c-accent), var(--c-primary)); display: inline-flex; align-items: center; justify-content: center; color: var(--c-bg); font-size: var(--fs-18); flex: none; }
/* Markentitel bewusst etwas kleiner als die fs-Variablen (min. 14px), damit
   „Ladestationen-Zentrale" einzeilig passt; Untertitel klar untergeordnet. */
.brand-name { font-size: 11px; font-weight: var(--fw-bold); line-height: 1.25; color: var(--c-text); white-space: nowrap; letter-spacing: -0.2px; }
.brand-name small { display: block; color: var(--c-text-muted); font-weight: var(--fw-medium); font-size: 10px; letter-spacing: 0; margin-top: 2px; white-space: nowrap; }
.wb-nav { display: flex; align-items: center; gap: 10px; padding: 8px 12px; white-space: nowrap; border-radius: 10px; font-size: var(--fs-14); font-weight: var(--fw-medium); cursor: pointer; transition: background .15s, color .15s; background: transparent; color: var(--c-text-soft); border: none; width: 100%; text-align: left; font-family: inherit; }
.wb-nav:hover { background: var(--c-bg-mute); color: var(--c-text-muted); }
.wb-nav.active { background: var(--tint-accent); color: var(--c-primary); box-shadow: inset 0 0 0 1px var(--tint-accent-border); }
/* Handlungsbedarf-Marker im Auswahlmenü: kleines Ausrufezeichen rechts im
   Button, Farbe = höchste offene Priorität (siehe hbNavMarker in app.js). */
.nav-alert { margin-left: auto; flex: none; width: 16px; height: 16px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 11px; font-weight: var(--fw-bold); line-height: 1; color: #fff; background: var(--c-info); box-shadow: 0 0 0 2px var(--c-surface); }
.nav-alert.mittel { background: var(--c-warning-text); }
.nav-alert.hoch { background: var(--c-danger); animation: nav-alert-puls 1.6s ease-in-out infinite; }
@keyframes nav-alert-puls { 0%, 100% { box-shadow: 0 0 0 2px var(--c-surface); } 50% { box-shadow: 0 0 0 2px var(--c-surface), 0 0 0 5px rgba(239,68,68,.25); } }
html.preload .nav-alert.hoch { animation: none; }
.sidebar-foot { margin-top: auto; background: var(--c-bg); border: 1px solid var(--c-border); border-radius: 10px; padding: 10px 12px; }
.sidebar-foot .row1 { display: flex; align-items: center; gap: 7px; font-size: var(--fs-12); color: var(--c-text-muted); font-weight: var(--fw-medium); }
.sidebar-foot .row2 { font-size: var(--fs-11); color: var(--c-text-soft); margin-top: 5px; }
/* Info-Zeilen (Angemeldet / Berechtigung / Rev.): kleinste Schrift, und es wird
   IMMER alles angezeigt — lange Namen brechen um, statt abgeschnitten zu werden. */
.sidebar-foot .row3 { font-size: var(--fs-10); color: var(--c-text-faint); margin-top: 2px;
    overflow-wrap: anywhere; line-height: 1.45; }
.led { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--c-text-faint); flex: none; }
.led.on  { background: #34d399; box-shadow: 0 0 0 3px rgba(52,211,153,.2); }
.led.off { background: #ef4444; box-shadow: 0 0 0 3px rgba(239,68,68,.2); }
.led.wait{ background: #f59e0b; box-shadow: 0 0 0 3px rgba(245,158,11,.2); }

.main-area { flex: 1; min-width: 0; margin-left: 240px; }
.main-area::-webkit-scrollbar { width: 10px; }
.main-area::-webkit-scrollbar-thumb { background: var(--c-border-strong); border-radius: 6px; border: 2px solid var(--c-bg); }

/* Globale, theme-gerechte Scrollleisten — sonst rendern dunkle Themes die
   nativen Leisten weiß/hell (z. B. Backup-Liste, Karten-Auswahl, Tabellen).
   Firefox: scrollbar-width/-color werden von html vererbt; Webkit über
   ::-webkit-scrollbar. .main-area behält durch höhere Spezifität sein Styling. */
html { scrollbar-width: thin; scrollbar-color: var(--c-border-strong) transparent; }
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--c-border-strong); border-radius: 6px; }
::-webkit-scrollbar-thumb:hover { background: var(--c-text-faint); }
.topbar { position: sticky; top: 0; z-index: 100; background: var(--c-bg); border-bottom: 1px solid var(--c-border); padding: 15px 30px; display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: nowrap; }
@supports (background: color-mix(in srgb, red 50%, transparent)) {
  .topbar { background: color-mix(in srgb, var(--c-bg) 88%, transparent); backdrop-filter: blur(8px); }
}
/* Der Titelblock darf schrumpfen, der Untertitel bricht dann um (09.09.2026). Ohne das ist
   der Block so breit wie sein laengstes Kind — bei einem langen Untertitel (Reiter
   Kilometerstaende) verdraengte er die Knopfgruppe in eine zweite Zeile, bei kurzem nicht.
   Die Anordnung sah je Reiter anders aus. min-width:0 hebt die Flex-Mindestbreite auf. */
   Basis 0 ist dabei entscheidend: mit `auto` bleibt die Inhaltsbreite die Basis, und ob eine
   Flex-Zeile umbricht, wird VOR dem Schrumpfen entschieden — der lange Untertitel schob die
   Knöpfe also weiterhin in die zweite Zeile. min-width haelt den Titel lesbar; erst darunter
   (Handy) bricht die Leiste bewusst um. */
.topbar-titel { flex: 1 1 0; min-width: 240px; }
.topbar-sub { font-size: var(--fs-13); color: var(--c-text-soft); margin-top: 2px; }
.topbar-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; flex: 0 0 auto; }
.content { padding: 24px 30px 40px; }

/* Sprungleiste am Kopf eines langen Reiters (Einstellungen). Die Karten tragen
   scroll-margin-top, sonst schiebt die sticky Topbar die Ueberschrift aus dem Bild. */
/* Bleibt beim Scrollen stehen, direkt unter der Topbar (die ist sticky, top:0, z-index 100).
   --topbar-h ist deren Höhe. Der Wert hier ist nur der Startwert: app.js MISST die Topbar
   und setzt die Variable nach. Geraten ging schief — stimmte die Zahl nicht auf den Pixel,
   sprang die Leiste beim Kleben um die Differenz nach oben und stand schief zwischen den Linien.
   Voller Inhaltsbreite (negative Ränder), damit durchgescrollter Inhalt nicht seitlich vorbeiläuft. */
.abschnittsnav { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
                 position: sticky; top: var(--topbar-h); z-index: 90;
                 /* Oben und unten gleich viel Luft: der Aussenabstand lag frueher nur oben (22 px)
                    und gehoerte nicht zum farbigen Balken — die Knoepfe sassen sichtbar zu hoch. */
                 margin: -24px -30px 0; padding: 12px 30px;
                 background: var(--c-bg); border-bottom: 1px solid var(--c-border); }
.abschnittsnav-lbl { font-size: var(--fs-11); color: var(--c-text-soft); font-weight: var(--fw-medium);
                     text-transform: uppercase; letter-spacing: .04em; margin-right: 2px; }
.abschnittsnav button { background: var(--c-surface); color: var(--c-text-muted); border: 1px solid var(--c-border);
                        border-radius: 9px; padding: 7px 13px; font-size: var(--fs-13); cursor: pointer; }
.abschnittsnav button:hover { background: var(--c-bg-mute); color: var(--c-text); }
.abschnittsnav button.aktiv { background: var(--tint-accent); color: var(--c-primary); border-color: var(--tint-accent-border); }
.abschnittsnav button.nachOben { margin-left: auto; }
/* Topbar + Sprungleiste zusammen — sonst landet die Überschrift dahinter. */
.abschnitt { scroll-margin-top: calc(var(--topbar-h) + 78px); }

/* Topbar-Buttons (Aktualisieren / Farbschema) */
.top-btn { background: var(--c-surface); color: var(--c-text-muted); border: 1px solid var(--c-border); border-radius: 9px; padding: 9px 14px; font-size: var(--fs-13); font-weight: var(--fw-medium); cursor: pointer; display: inline-flex; align-items: center; gap: 7px; font-family: inherit; }
.top-btn:hover { background: var(--c-bg-mute); color: var(--c-text); }
.top-btn.accent { background: var(--tint-accent); color: var(--c-primary); border-color: var(--tint-accent-border); }
/* Zoom-Knopf: Vorschlags-Menü mit festen Größen beim Überfahren.
   Der äußere #zoomMenu ist transparent und beginnt direkt am Knopf (kein
   Hover-Loch auf dem Weg nach unten); die Karte selbst ist der innere Kern. */
.zoom-waehler { position: relative; }
#zoomMenu { display: none; position: absolute; top: 100%; right: 0; z-index: 700; padding-top: 6px; }
.zoom-waehler:hover #zoomMenu { display: block; }
#zoomMenu .zoom-menu-kern { background: var(--c-surface); border: 1px solid var(--c-border-strong);
    border-radius: 10px; box-shadow: var(--shadow-pop); padding: 6px; min-width: 210px; }
#zoomMenu button { display: block; width: 100%; text-align: left; background: none; border: none;
    color: var(--c-text); font-size: var(--fs-12); padding: 6px 10px; border-radius: 7px;
    cursor: pointer; font-family: inherit; white-space: nowrap; }
#zoomMenu button:hover { background: var(--c-bg-mute); }
#zoomMenu button.aktiv { background: var(--tint-accent); color: var(--c-primary); font-weight: var(--fw-medium); }

/* Hilfe-Knopf im eingeschalteten Zustand: deutlich grün (grün = an) + EIN-Marke */
#helpBtn.accent { background: var(--c-success-bg); color: var(--c-success-text);
    border-color: var(--c-success); font-weight: var(--fw-bold); }
#helpBtn .ein-marke { background: var(--c-success); color: #fff; border-radius: 7px;
    padding: 1px 7px; font-size: var(--fs-10); font-weight: var(--fw-bold);
    letter-spacing: .04em; line-height: 1.5; }

/* Icon-Chip — kleines, rundes Icon-Quadrat (KPI-Karten, Karten-Titel) */
.icon-chip { width: 28px; height: 28px; border-radius: 8px; display: inline-flex; align-items: center; justify-content: center; flex: none; }
.icon-chip.lg { width: 36px; height: 36px; border-radius: 9px; }
.icon-chip.xl { width: 42px; height: 42px; border-radius: 11px; }
.chip-accent  { background: var(--tint-accent);  color: var(--c-accent); }
.chip-success { background: var(--tint-success); color: var(--c-success); }
.chip-warning { background: var(--tint-warning); color: var(--c-warning); }
.chip-danger  { background: var(--tint-danger);  color: var(--c-danger-light); }
.chip-info    { background: var(--tint-info);    color: var(--c-info); }
/* Inter rendert fett (700/800) auf dunklem Grund schnell „dick & weich".
   Bold-Texte daher auf 600 (Semibold) → bleibt klar fett, aber scharf. */
b, strong { font-weight: var(--fw-medium); }

/* ===== ICONS ===== Inline-SVG (Feather/Lucide-Stil), erben Größe (1em) und
   Farbe (currentColor) vom umgebenden Text → automatisch theme-konform.
   Verwendung: <svg class="icon"><use href="#i-zap"></use></svg> */
.icon { width: 1em; height: 1em; display: inline-block; flex: none; vertical-align: -0.14em;
        stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; fill: none; }
.i-lead { margin-right: 0.45em; }
.tab button .icon { stroke-width: 2; }

/* STATUS GRID — im neuen Layout ein vertikaler Stapel in der linken
   Dashboard-Spalte (Mockup: „Ladestationen"-Liste). */
/* Stationen als Hero-Reihe oben: nebeneinander, umbrechend (statt gestapelt). */
/* 255 px, nicht 230 (09.09.2026): darunter passte „Ladestation 3" nicht mehr neben ein
   langes Abzeichen wie „Wallbox pausiert" — seit die Kopfzeile nicht mehr umbricht,
   verlor der Name dann seine Nummer. Lieber eine Karte weniger je Reihe. */
.status-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(255px, 1fr)); gap: 12px; align-items: start; }
/* tabular-nums: gleichbreite Ziffern, damit Werte wie "5.1" → "10.5" nicht das Layout verschieben.
   contain: layout style → interne Aenderungen propagieren nicht nach aussen.
   align-items: start (statt stretch) — Kompaktkarten sollen nicht auf die Hoehe
   einer aufgeklappten Nachbarkarte gedehnt werden. */
.status-card { min-width: 0; padding: 8px 12px; border-radius: 12px; background: var(--c-surface); border: 1px solid var(--c-border); border-left: 4px solid var(--c-border-strong); font-variant-numeric: tabular-nums; contain: layout style; overflow-wrap: break-word; }

/* Kompaktkarte v2: genau zwei Zeilen je Karte.
   Zeile 1 (.sc-kopf): Name + Zustands-Badge.
   Zeile 2 (<summary> von .sc-mehr): links Ladeinfo ohne eigenen Kasten,
   rechts "Details" — die ganze Zeile klappt die Einzelheiten auf.
   Ergebnis: alle Karten gleich hoch, nichts bricht um, nichts wird abgeschnitten
   (lange Namen enden in einer Ellipse, der Rest steht im Tooltip/Details). */
/* KEIN Umbruch (09.09.2026): rutschte das Zustands-Abzeichen in eine zweite Zeile,
   war genau diese Karte hoeher als alle anderen — im Raster faellt das sofort auf.
   Jetzt gibt der Name nach und endet in einer Ellipse; die vollstaendige Kennung
   steht im Aufklapper darunter, es geht also nichts verloren. */
.sc-kopf { display: flex; align-items: center; justify-content: space-between; gap: 8px 10px;
    flex-wrap: nowrap; min-width: 0; }
.sc-kopf > .cp-ident { min-width: 0; overflow: hidden; }
.sc-kopf-badges { display: inline-flex; align-items: center; gap: 6px; flex: none; white-space: nowrap; }
.sc-kopf-badges .badge-pill { font-size: var(--fs-10); padding: 1px 7px; }
/* Zeile 2: Info in voller Breite. min-height haelt alle Karten gleich hoch,
   auch wenn eine Saeule frei ist (leere Zeile). */
.sc-info { display: flex; align-items: center; gap: 7px; min-width: 0; font-size: var(--fs-10);
    margin-top: 4px; min-height: 15px; overflow: hidden; white-space: nowrap; }
/* Zeile 3: Ladewerte links, "Details" rechts — beides in der Aufklapp-Zeile */
.sc-mehr { margin-top: 2px; }
.sc-mehr > summary { display: flex; align-items: center; justify-content: space-between; gap: 10px;
    cursor: pointer; list-style: none; user-select: none; min-height: 16px; }
.sc-mehr > summary::-webkit-details-marker { display: none; }
.sc-fuss { display: flex; align-items: center; gap: 7px; min-width: 0; flex: 1; font-size: var(--fs-10); }
.sc-aktiv { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
.sc-a-name { color: var(--c-text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
/* Kennzeichen: kurz und identifizierend — wird NIE gekuerzt. Wird der Platz
   knapp, geben stattdessen die kWh-Werte nach (Ellipse); Details/Tooltip
   tragen ohnehin alles. */
.sc-a-fest { color: var(--c-text-muted); white-space: nowrap; flex: none; }
.sc-a-werte { white-space: nowrap; min-width: 0; overflow: hidden; text-overflow: ellipsis; font-size: 0.92em; }
.sc-warte { color: var(--c-warning-text, var(--c-warning)); font-size: var(--fs-10); white-space: nowrap;
    overflow: hidden; text-overflow: ellipsis; }
.sc-mehr-tag { flex: none; font-size: var(--fs-10); color: var(--c-text-faint); }
.sc-mehr-tag::after { content: "\203A"; margin-left: 4px; display: inline-block; transition: transform .15s; }
.sc-mehr[open] .sc-mehr-tag::after { transform: rotate(90deg); }
.sc-mehr > summary:hover .sc-mehr-tag { color: var(--c-text-muted); }
/* Aufgeklappte Einzelheiten: nichts abschneiden, keine Scrollleiste. Vorher stand
   hier nowrap + overflow-x:auto — zu lange Zeilen ("Verbunden seit: …") liefen aus
   der Karte heraus und waren nur ueber einen Balken erreichbar. Jetzt umbricht die
   Zeile; Beschriftung und Wert bleiben dabei je fuer sich zusammen, damit kein
   Datum mitten in der Zahl auseinanderfaellt. */
.sc-mehr-inhalt { margin-top: 5px; font-size: var(--fs-11); color: var(--c-text-muted); line-height: 1.65;
    white-space: normal; overflow: visible; overflow-wrap: break-word; }
.sc-mehr-inhalt b { white-space: nowrap; }
/* Zeitstempel und IP nicht mitten in der Zahl trennen: auf schmalen Schirmen
   brach sonst "2026-09-01 13:44" in zwei Zeilen. Namen duerfen weiter umbrechen —
   ein langer Fahrername muss sich sonst aus der Karte schieben. */
.sc-mehr-inhalt [data-bind-text$=".conn_since"],
.sc-mehr-inhalt [data-bind-text$=".last_hb"],
.sc-mehr-inhalt [data-bind-text$=".ip"] { white-space: nowrap; }
/* Karte mit aufgeklappter Kennung ueber die Nachbarn heben: contain:layout macht
   jede Karte zum eigenen Stapelkontext, sonst laege das Kennungs-Overlay unter
   der naechsten Karte. z-index wirkt hier direkt, weil die Karten Grid-Kinder sind. */
.status-card:has(.cp-ident[open]) { z-index: 50; }
.status-online { border-left-color: #34d399; }
.status-offline { border-left-color: #ef4444; opacity: .85; }

/* Ladesäulen-Karte: Anzeigename aufklappbar. Darunter steht die vollständige OCPP-Kennung,
   also das, was die Box tatsächlich sendet (konfigurierter Pfad + eigene Kennung). Wird bei
   der Fehlersuche gebraucht — der Anzeigename allein sagt nichts über die echte Kennung. */
.cp-ident { margin: 0; position: relative; }
/* Der Anzeigename bleibt einzeilig — er ist die Ueberschrift der Karte und muss
   auf einen Blick lesbar sein. Die vollstaendige Kennung steht ohnehin im Aufklapper. */
.cp-ident > summary { display: flex; align-items: center; gap: 6px; cursor: pointer;
    font-size: var(--fs-12); font-weight: var(--fw-bold); list-style: none;
    white-space: nowrap; word-break: normal; overflow-wrap: normal;
    min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.cp-ident > summary::-webkit-details-marker { display: none; }
.cp-ident > summary::after { content: "\203A"; display: inline-block; font-weight: var(--fw-normal);
    color: var(--c-text-muted); transition: transform .15s ease; }
.cp-ident[open] > summary::after { transform: rotate(90deg); }
.cp-ident > summary:focus-visible { outline: 2px solid var(--c-accent); outline-offset: 2px; border-radius: 4px; }
/* Die volle Kennung schwebt als Overlay ÜBER dem Karteninhalt (position:absolute
   unter dem Namen), statt ihn nach unten zu schieben — die Karte behält beim
   Aufklappen ihre Höhe, im Raster verrutscht nichts. Der Schatten hebt das Feld
   vom Inhalt darunter ab. */
.cp-ident .cp-ident-voll { display: block; position: absolute; top: 100%; left: 0; z-index: 40;
    margin-top: 4px; padding: 6px 9px; border-radius: 6px; min-width: 230px; max-width: 340px;
    background: var(--c-surface); border: 1px solid var(--c-border-strong); color: var(--c-text-soft);
    font-size: var(--fs-12); font-family: ui-monospace, Consolas, monospace;
    user-select: all; word-break: break-all; box-shadow: var(--shadow-pop); }
@media (prefers-reduced-motion: reduce) { .cp-ident > summary::after { transition: none; } }

/* Dashboard-Hauptraster: links Ladestationen, rechts letzte Ladevorgänge */
/* Stationen oben, Tabelle darunter — beide über die volle Breite gestapelt. */
.dash-grid { display: grid; grid-template-columns: 1fr; gap: 22px; align-items: start; }
/* Grid-/Flex-Elemente dürfen schrumpfen, damit breite Tabellen/Karten darin
   in den Bildschirm passen statt das Layout aus dem Bild zu schieben
   (min-width:auto-Falle). Gilt für Dashboard- und Benutzer-Layout. */
.dash-grid > * { min-width: 0; }
.user-layout > * { min-width: 0; }
/* Abschnitts-Titel über Listen (Icon + Titel + Meta) */
.sec-title { display: flex; align-items: center; gap: 9px; margin: 0 0 13px; font-size: var(--fs-15); font-weight: var(--fw-bold); color: var(--c-text); }
.sec-title .icon { color: var(--c-accent); font-size: var(--fs-18); }
.sec-title .meta { font-size: var(--fs-12); color: var(--c-text-soft); font-weight: var(--fw-normal); }

/* Auch in Tabellen Tabellen-Ziffern verwenden, damit kWh/EUR-Spalten nicht wackeln */
table { font-variant-numeric: tabular-nums; }

/* TABS — Inhalte werden weiter per openTab() geschaltet; die Navigation
   selbst sitzt jetzt als .wb-nav-Buttons in der Sidebar. */
/* Während des (Neu-)Ladens keine Übergänge/Animationen — verhindert das Einblende-
   Flackern (Nav-Markierung, Tab-Fade) bei jedem Reload. Nach 'load' wieder aktiv. */
html.preload *, html.preload *::before, html.preload *::after { transition: none !important; animation: none !important; }
.tabcontent { display: none; animation: fadeEffect 0.3s; }
@keyframes fadeEffect { from {opacity: 0; transform: translateY(5px);} to {opacity: 1; transform: translateY(0);} }

/* FILTER BAR — kompakte Chips in der Topbar (Mockup) */
.filter-bar { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin: 0; }
.filter-group { display: inline-flex; align-items: center; gap: 8px; background: var(--c-surface); border: 1px solid var(--c-border); border-radius: 9px; padding: 4px 6px 4px 13px; }
.filter-group label { font-size: var(--fs-13); font-weight: var(--fw-normal); color: var(--c-text-soft); display: inline-flex; align-items: center; white-space: nowrap; }
.filter-group label .icon { color: var(--c-accent); }
.filter-group select { padding: 6px 4px; font-size: var(--fs-13); border-radius: 6px; border: none; background: transparent; cursor: pointer; font-weight: var(--fw-medium); color: var(--c-text-muted); max-width: 190px; font-family: inherit; }
.filter-group select:hover { color: var(--c-text); }
.filter-group select:focus { outline: none; }
.filter-group select option { background: var(--c-surface); color: var(--c-text); }

/* Globale Filterleiste im Inhaltsbereich (aus der Topbar verschoben).
   Karten-Look passend zum übrigen Dashboard; die Filter-Pills sitzen darin. */
.filterbar-card { position: relative; z-index: 20; display: flex; align-items: center; gap: 14px; flex-wrap: wrap; background: var(--c-surface); border: 1px solid var(--c-border); border-radius: 12px; box-shadow: var(--shadow-card); padding: 12px 16px; margin-bottom: 18px; }
.filterbar-inline { position: relative; z-index: 20; }

/* Eigenes Dropdown (ersetzt natives <select> in der Filterleiste) — kein Flackern, volle Kontrolle. */
.dd { position: relative; display: inline-flex; }
.dd.open { z-index: 100; }
.dd-btn { display: inline-flex; align-items: center; gap: 8px; background: var(--c-bg-mute); border: 1px solid var(--c-border-strong); border-radius: 9px; padding: 7px 12px; font-size: var(--fs-13); font-weight: var(--fw-medium); color: var(--c-text); cursor: pointer; font-family: inherit; white-space: nowrap; }
.dd-btn .icon { color: var(--c-accent); }
.dd-btn .dd-chev { margin-left: 4px; color: var(--c-text-soft); font-size: var(--fs-11); }
.dd-menu { position: absolute; top: calc(100% + 5px); left: 0; min-width: 100%; max-height: 300px; overflow-y: auto; background: var(--c-surface); border: 1px solid var(--c-border-strong); border-radius: 10px; box-shadow: var(--shadow-pop); padding: 6px; z-index: 101; display: none; }
.dd.open .dd-menu { display: block; }
.dd-opt { display: block; width: 100%; text-align: left; background: transparent; border: none; border-radius: 6px; padding: 8px 12px; font-size: var(--fs-13); color: var(--c-text); cursor: pointer; font-family: inherit; white-space: nowrap; }
.dd-opt:hover { background: var(--c-bg-mute); }
.dd-opt.active { background: var(--tint-accent); color: var(--c-primary); font-weight: var(--fw-medium); }

/* Eigener Datums-Picker (ersetzt natives <input type=date>) — voll theme-konform. */
.datepick { position: relative; }
.datepick.open { z-index: 300; }
.dp-field { display: flex; align-items: center; justify-content: space-between; gap: 8px; width: 100%; padding: 9px 12px; background: var(--c-bg-mute); border: 1px solid var(--c-border-strong); border-radius: 8px; color: var(--c-text); font-size: var(--fs-13); font-family: inherit; cursor: pointer; box-sizing: border-box; }
.dp-field .dp-val.empty { color: var(--c-text-faint); }
.dp-field .icon { color: var(--c-text-soft); flex: none; }
.dp-cal { position: absolute; top: calc(100% + 6px); left: 0; z-index: 301; display: none; background: var(--c-surface); border: 1px solid var(--c-border-strong); border-radius: 12px; box-shadow: var(--shadow-pop); padding: 12px; min-width: 268px; }
.datepick.open .dp-cal { display: block; }
.dp-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
.dp-title { font-weight: var(--fw-medium); color: var(--c-text); font-size: var(--fs-14); }
.dp-nav { background: var(--c-bg-mute); border: 1px solid var(--c-border); border-radius: 6px; width: 28px; height: 28px; cursor: pointer; color: var(--c-text); font-size: var(--fs-16); line-height: 1; }
.dp-nav:hover { background: var(--c-surface-alt); }
.dp-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
.dp-wd { text-align: center; font-size: var(--fs-11); color: var(--c-text-soft); padding: 4px 0; }
.dp-day { background: transparent; border: none; border-radius: 6px; padding: 7px 0; font-size: var(--fs-13); color: var(--c-text); cursor: pointer; font-family: inherit; }
.dp-day:hover { background: var(--c-bg-mute); }
.dp-day.today { box-shadow: inset 0 0 0 1px var(--c-border-strong); }
.dp-day.sel { background: var(--c-action); color: #fff; font-weight: var(--fw-medium); }
.dp-foot { display: flex; justify-content: space-between; margin-top: 8px; }
.dp-clear, .dp-today { background: transparent; border: none; color: var(--c-primary); font-size: var(--fs-12); cursor: pointer; font-family: inherit; padding: 4px; }
.dp-clear:hover, .dp-today:hover { text-decoration: underline; }
.filterbar-title { display: inline-flex; align-items: center; gap: 7px; font-size: var(--fs-13); font-weight: var(--fw-medium); color: var(--c-text-soft); white-space: nowrap; padding-right: 14px; border-right: 1px solid var(--c-border); }
.filterbar-title .icon { color: var(--c-accent); }
/* Eingebettete Variante: Filter als Toolbar oben IN einer Karte (z.B. über der
   Ladevorgänge-Tabelle) — kein eigener Karten-Hintergrund, nur Trennlinie zur Liste. */
.filterbar-inline { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; padding: 2px 0 14px 0; margin-bottom: 14px; border-bottom: 1px solid var(--c-border); }
.filterbar-card .filter-group, .filterbar-inline .filter-group { background: var(--c-bg-mute); }
@media (max-width: 720px) {
    .filterbar-title { border-right: none; padding-right: 0; width: 100%; }
}

/* KPIs & METRIKEN — Karten mit Label oben links + Icon-Chip rechts (Mockup) */
/* KPI-Fußleiste: sekundäre Kennzahlen, bewusst schlank + gedämpft, damit
   Stationen + Tabelle im Vordergrund stehen. Eine flache Bar mit Trennstrichen
   statt großer Karten. (Mobile-Override weiter unten greift weiterhin.) */
.kpi-foot-label { font-size: var(--fs-11); text-transform: uppercase; letter-spacing: 0.5px; color: var(--c-text-faint); margin: 0 0 6px 2px; font-weight: var(--fw-bold); }
.kpi-row { display: grid; grid-template-columns: repeat(3, 1fr) 1.5fr; gap: 0; margin: 0; background: var(--c-surface); border: 1px solid var(--c-border); border-radius: 10px; padding: 4px 6px; }
.metric { background: transparent; padding: 9px 16px; border: none; border-right: 1px solid var(--c-border); border-radius: 0; font-variant-numeric: tabular-nums; contain: layout style; text-align: left; }
.metric:last-child { border-right: none; }
.metric .metric-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.metric .icon-chip { display: none; }  /* in der schlanken Fußleiste keine Icon-Chips */
.metric p { margin: 0; color: var(--c-text-faint); font-size:var(--fs-10); font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: 0.4px; }
.metric span { display: block; font-size:var(--fs-17); font-weight: var(--fw-bold); margin-top: 2px; color: var(--c-text-muted); }
.metric span small { font-size: var(--fs-11); color: var(--c-text-faint); font-weight: var(--fw-medium); }

/* ===== Sticky-Kennzahlen-Band oben in der Topbar (immer sichtbar, auf jedem Tab) ===== */
.kpi-bar { width:100%; margin:13px -30px -15px; padding:8px 30px; border-top:1px solid var(--c-border); display:flex; align-items:center; flex-wrap:wrap; gap:4px 0; }
.kpi-bar .kpi-item { display:flex; align-items:center; gap:9px; padding:3px 20px; border-right:1px solid var(--c-border); }
.kpi-bar .kpi-item:first-child { padding-left:0; }
.kpi-bar .kpi-item:last-child { border-right:none; }
.kpi-bar .kpi-ic { width:24px; height:24px; border-radius:7px; display:inline-flex; align-items:center; justify-content:center; flex:none; }
.kpi-bar .kpi-lbl { font-size:var(--fs-11); text-transform:uppercase; letter-spacing:0.4px; color:var(--c-text-soft); font-weight:var(--fw-medium); }
.kpi-bar .kpi-val { font-size:var(--fs-15); font-weight:var(--fw-bold); color:var(--c-text-strong); white-space:nowrap; }
.kpi-bar .kpi-val small { font-size:var(--fs-11); font-weight:var(--fw-medium); color:var(--c-text-soft); }
/* Inline-Variante: als Karte im Inhalt (zwischen Ladestationen und Ladevorgängen),
   ohne die Topbar-Negativränder. */
.kpi-bar.kpi-bar-inline { margin:0; padding:11px 18px; border-top:none; border:1px solid var(--c-border); border-radius:12px; background:var(--c-surface); box-shadow:var(--shadow-card); }
@media screen and (max-width: 900px) {
  .kpi-bar { margin:10px -12px -12px; padding:8px 12px; overflow-x:auto; flex-wrap:nowrap; }
  .kpi-bar .kpi-item { padding:3px 12px; }
}

/* ===== Info-Punkt + Legende (Status-Spalte im Dashboard / Eichrecht-Spalte) ===== */
.legend-wrap { position:relative; display:inline-flex; vertical-align:middle; }
/* HILFE-MODUS: bewusst OHNE "?"-Marker und OHNE Hilfe-Cursor — eingeschaltet
   heißt ausschließlich: Beim Überfahren einer Stelle mit hinterlegter Erklärung
   (title/data-tip/data-legend) erscheint der Text als Tooltip. Sonst ändert
   sich optisch nichts. */
/* Spaltenköpfe mit hinterlegter Legende: Hover-Farbe als dezente Rückmeldung */
html[data-help="1"] .hat-legende:hover { color: var(--c-accent); }
.legend-pop { display:none; position:absolute; zoom: var(--chart-unzoom, 1); top:calc(100% + 8px); right:0; z-index:600; width:320px; max-width:86vw; background:var(--c-surface); border:1px solid var(--c-border-strong); border-radius:12px; box-shadow:var(--shadow-pop); padding:15px 16px; text-align:left; text-transform:none; letter-spacing:normal; font-weight:var(--fw-normal); }
.legend-pop.show { display:block; }
.legend-close { position:absolute; top:6px; right:10px; background:none; border:none; color:var(--c-text-faint); font-size:var(--fs-22); line-height:1; cursor:pointer; padding:0 2px; }
.legend-close:hover { color:var(--c-text); }
.legend-pop h4 { margin:0 0 6px; font-size:var(--fs-13); color:var(--c-text); }
.legend-row { display:flex; gap:10px; align-items:flex-start; margin-top:9px; font-size:var(--fs-12); color:var(--c-text-muted); line-height:1.45; }
.legend-ic { flex:none; margin-top:2px; font-size:var(--fs-14); }

.main-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(450px, 100%), 1fr)); gap: 12px; margin-bottom: 12px; align-items: stretch; }
.main-grid > .card { margin-bottom: 0; display: flex; flex-direction: column; }
/* Diagramme gegen den App-Zoom neutralisieren (Chart.js-Tooltips bleiben korrekt).
   Bei 100 % ist --chart-unzoom = 1 → kein Effekt. Beim Zoomen werden die Charts
   zusätzlich neu gezeichnet (siehe base.html), damit sie scharf bleiben. */
.dual-chart { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.export-cards { position: relative; z-index: 5; display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 12px; }
.chart-wrap { position: relative; width: 100%; height: 260px; min-height: 260px; flex: 1; zoom: var(--chart-unzoom, 1); }
.chart-wrap canvas { position: absolute; inset: 0; width: 100% !important; height: 100% !important; }
.card { background: var(--c-surface); padding: 20px; border-radius: 14px; border: 1px solid var(--c-border); box-shadow: none; margin-bottom: 16px; contain: layout style; }

/* TABELLEN — randlos, ruhige Trennlinien, Uppercase-Kopf ohne Flächenfüllung (Mockup) */
table { width: 100%; border-collapse: separate; border-spacing: 0; margin-top: 8px; }
th, td { padding: 12px; text-align: left; border-bottom: 1px solid var(--c-border); font-size:var(--fs-14); }
th { background: transparent; color: var(--c-text-soft); font-size:var(--fs-11); text-transform: uppercase; font-weight: var(--fw-bold); letter-spacing: 0.4px; border-top: none; }
/* Halbtransparenter Akzent-Tint: hebt sich auf hellen UND dunklen Zeilen
   (Zebra) sichtbar ab, unabhängig vom Theme. !important schlägt das inline
   gesetzte Zebra-Background auf <tr>. */
tr:hover td { background: rgba(96, 165, 250, 0.10) !important; }
.badge { padding: 4px 11px; border-radius: 999px; font-size:var(--fs-12); font-weight: var(--fw-medium); background: var(--c-bg-mute); color: var(--c-text-muted); white-space: nowrap; display: inline-block; }
.badge-live { background: var(--c-success-bg); color: var(--c-success-text); border: 1px solid var(--c-success-border); animation: pulse 2s infinite; }
@keyframes pulse { 0% { opacity: 1; } 50% { opacity: 0.6; } 100% { opacity: 1; } }

/* ===== Status-Badges (Connector-Zustände) =====
   Inhalt ist Emoji+Text im Template, Farbe + Bedeutung hier zentral. */
.badge-charging    { background: var(--c-success-bg); color: var(--c-success-text); }
.badge-paused-ev   { background: var(--c-warning-bg); color: var(--c-warning-text); }
.badge-paused-evse { background: var(--c-danger-bg);  color: var(--c-danger-strong); }
.badge-preparing   { background: var(--c-info-bg);    color: var(--c-info); }
.badge-finishing   { background: var(--c-purple-bg);  color: var(--c-purple-text); }
.badge-available   { background: var(--c-bg-mute);    color: var(--c-text-muted); }
/* Stoerung: bewusst der kraeftigste Badge der Palette — ein Fehler an der Saeule
   soll aus jeder Kartenreihe herausspringen, nicht im Grau untergehen. */
.badge-faulted     { background: var(--c-danger);      color: #fff; }
.badge-unavailable { background: var(--c-warning-bg);  color: var(--c-warning-text); }
.badge-reserved    { background: var(--c-info-bg);     color: var(--c-info); }
.badge-orphan      { background: var(--c-danger-bg);  color: var(--c-danger-strong); }
.badge-offline     { background: var(--c-danger-bg);  color: var(--c-danger-strong); }

/* Inline-Pill-Variante mit kleinerem Padding (für die Wallbox-Karten) */
.badge-pill { padding: 3px 10px; border-radius: 999px; font-size: var(--fs-11); font-weight: var(--fw-medium); display: inline-block; white-space: nowrap; }

/* Kleiner Aktions-Button (z.B. „Verwaiste Sitzung schließen") */
.btn-mini-danger {
    background: var(--c-danger); color: white; border: none;
    padding: 3px 9px; border-radius: 6px; cursor: pointer;
    font-size: var(--fs-11); font-weight: var(--fw-medium);
}
.btn-mini-danger:hover { background: var(--c-danger-hover); }

/* ===== THEME-SWITCHER (Galerie) ===== */
.theme-switcher { position: relative; display: inline-block; }
.theme-gallery {
    display: none; position: absolute; top: calc(100% + 6px); right: 0;
    background: var(--c-surface); border: 1px solid var(--c-border); border-radius: 12px;
    padding: 12px; box-shadow: var(--shadow-pop);
    width: 360px; max-width: 90vw; z-index: 1000;
    grid-template-columns: repeat(3, 1fr); gap: 10px;
}
.theme-gallery.show { display: grid; }
.theme-tile {
    background: var(--c-surface); border: 2px solid var(--c-border); border-radius: 10px;
    padding: 8px; cursor: pointer; user-select: none;
    transition: border-color 0.15s, transform 0.15s, box-shadow 0.15s;
}
.theme-tile:hover { border-color: var(--c-primary); transform: translateY(-2px); box-shadow: 0 8px 16px rgba(0,0,0,0.12); }
.theme-tile.active { border-color: var(--c-primary); box-shadow: 0 0 0 3px rgba(96,165,250,0.25); }
.theme-tile .preview {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 3px;
    height: 32px; border-radius: 5px; overflow: hidden;
    border: 1px solid var(--c-border); margin-bottom: 6px;
}
.theme-tile .preview span { display: block; height: 100%; }
.theme-tile .tile-name { font-size: var(--fs-12); font-weight: var(--fw-bold); color: var(--c-text); text-align: center; }
/* "Standard"-Marke am voreingestellten Farbprofil (Mitternacht): klein in der
   Kachel-Ecke, absolut positioniert — verändert die Kachelgröße nicht. */
.theme-tile { position: relative; }
.theme-tile .tile-standard { position: absolute; top: 4px; right: 4px; padding: 0 6px;
    border: 1px solid var(--c-border-strong); border-radius: 8px; line-height: 1.5;
    font-size: var(--fs-10); font-weight: var(--fw-medium);
    color: var(--c-text-soft); background: var(--c-surface); opacity: .95; }

/* BUTTONS */
/* Grundmass aller Knoepfe. Bewusst so gewaehlt, dass sie auf dieselbe Hoehe kommen
   wie .f-ctl (36px) — Knopf und Eingabefeld nebeneinander schliessen damit buendig ab.
   Vorher 12px/18px bei Schriftgroesse 14: das ergab rund 45px und wirkte klobig. */
.btn { display: inline-block; padding: 9px 16px; border-radius: 8px; font-weight: var(--fw-medium); cursor: pointer; border: none; font-size:var(--fs-13); transition: 0.2s; text-decoration: none; text-align: center; font-family: inherit; }
.btn-save { background: var(--c-action); color: #fff; width: 100%; margin-top: 20px; }
.btn-save:hover { background: var(--c-action-hover); }
.btn-export { background: var(--c-action); color: #fff; display: inline-block; margin-top: 15px; margin-right: 15px; }
.btn-export:hover { background: var(--c-action-hover); }
.btn-pdf { background: var(--c-bg-mute); color: var(--c-text); border: 1px solid var(--c-border-strong); display: inline-block; margin-top: 15px; }
.btn-pdf:hover { background: var(--c-surface-alt); }
.btn-import { background: var(--c-danger); color: #fff; width: 100%; margin-top: 15px; }
.btn-import:hover { background: var(--c-danger-hover); }
.btn-warning { background: var(--c-action); color: #fff; width: 100%; margin-top: 15px; }
.btn-warning:hover { background: var(--c-action-hover); }
.btn-danger { background: var(--c-danger); color: #fff; width: 100%; margin-top: 15px; }
.btn-danger:hover { background: var(--c-danger-hover); }

.btn-icon { padding: 0; width: 32px; height: 32px; display: inline-flex; align-items: center; justify-content: center; border-radius: 7px; border: none; cursor: pointer; font-size:var(--fs-15); margin-right: 5px; transition: 0.2s; }
.btn-edit { background: var(--c-bg-mute); color: var(--c-accent); }
.btn-edit:hover { background: var(--tint-accent); }
.btn-delete { background: var(--c-danger-bg); color: var(--c-danger-strong); }
.btn-delete:hover { background: var(--c-danger); color: #fff; }

input[type="text"], input[type="file"], input[type="date"], input[type="number"] { width: 100%; padding: 11px 12px; margin: 8px 0 16px 0; border: 1px solid var(--c-border-strong); border-radius: 8px; box-sizing: border-box; background: var(--c-bg); color: var(--c-text); font-size:var(--fs-14); font-family: inherit; }
input[type="text"]:focus, input[type="number"]:focus { outline: none; border-color: var(--c-primary); background: var(--c-surface-alt); }
/* Datei-Auswahl-Button (z. B. DB-Import) an das Theme anpassen — der native
   Button ist sonst weiß und sticht auf dunklen Themes heraus. Standard- und
   Webkit-Pseudo-Element als GETRENNTE Regeln (kombiniert würde ein Browser,
   der eines nicht kennt, den ganzen Selektor verwerfen). */
input[type="file"]::file-selector-button {
    margin-right: 10px; padding: 8px 14px; border: 1px solid var(--c-border-strong);
    border-radius: 6px; background: var(--c-bg-mute); color: var(--c-text);
    font-family: inherit; font-size: var(--fs-13); font-weight: var(--fw-medium);
    cursor: pointer; transition: 0.15s;
}
input[type="file"]::file-selector-button:hover { background: var(--c-surface-alt); border-color: var(--c-primary); }
input[type="file"]::-webkit-file-upload-button {
    margin-right: 10px; padding: 8px 14px; border: 1px solid var(--c-border-strong);
    border-radius: 6px; background: var(--c-bg-mute); color: var(--c-text);
    font-family: inherit; font-size: var(--fs-13); font-weight: var(--fw-medium);
    cursor: pointer; transition: 0.15s;
}
input[type="file"]::-webkit-file-upload-button:hover { background: var(--c-surface-alt); border-color: var(--c-primary); }
/* color-scheme:dark auf dunklen Themes für native Steuerelemente:
   - Datumsfeld: macht das Kalender-Symbol hell + das Kalender-Popup dunkel.
   - Select: rendert die aufklappende Optionsliste dunkel mit heller Schrift
     (sonst schwarz auf weiß) und färbt den Aufklapp-Pfeil hell.
   Helle Themes (default, himmel) bleiben unverändert. */
html[data-theme="tiefsee"] input[type="date"],
html[data-theme="mitternacht"] input[type="date"],
html[data-theme="stahlblau"] input[type="date"],
html[data-theme="tiefsee"] select,
html[data-theme="mitternacht"] select,
html[data-theme="stahlblau"] select { color-scheme: dark; }
select { font-family: inherit; color: var(--c-text); }

/* ===== Filterleiste in Karten (Audit-Protokoll, Handlungsbedarf) =====
   Eigene Klassen, weil die globalen Eingabefeld-Regeln oben nur text/date/
   file/number treffen: ein <select> bekaeme gar kein Rahmen/Hintergrund, ein
   <input type="search"> bliebe im Browser-Weiss stehen, und date-Felder
   braechten ihren 16px-Aussenabstand mit. Ergebnis waere eine Leiste mit vier
   verschiedenen Hoehen und Farben.
   .f-ctl steht bewusst als input.f-ctl/select.f-ctl da: nur so schlaegt es die
   Typ-Selektoren weiter oben (gleiche Spezifitaet, aber spaeter). */
.f-bar { display: flex; flex-wrap: wrap; gap: 10px 12px; align-items: flex-end;
         padding: 14px; border: 1px solid var(--c-border); border-radius: 10px;
         background: var(--c-surface-alt); }
.f-feld { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.f-feld > span { font-size: var(--fs-11); text-transform: uppercase; letter-spacing: .04em;
                 color: var(--c-text-soft); font-weight: var(--fw-medium); }
/* Erklaerung oder Wertanzeige unter einem Feld — KEINE Beschriftung. Ohne diese
   Klasse erbt jeder direkte <span> im .f-feld die Beschriftungs-Optik oben, und
   ganze Saetze stuenden in Grossbuchstaben (war bis 29.08.2026 so). */
.f-feld > span.f-hinweis { text-transform: none; letter-spacing: normal;
                 font-weight: var(--fw-normal); font-size: var(--fs-11);
                 color: var(--c-text-faint); line-height: 1.45; }
.f-feld > span.f-wert { text-transform: none; letter-spacing: normal;
                 font-weight: var(--fw-normal); font-size: var(--fs-13);
                 color: var(--c-text-soft); }
input.f-ctl, select.f-ctl, .f-ctl {
    height: 36px; padding: 0 10px; margin: 0; box-sizing: border-box;
    border: 1px solid var(--c-border-strong); border-radius: 8px;
    background: var(--c-bg-mute); color: var(--c-text);
    font-family: inherit; font-size: var(--fs-13); width: 100%;
}
input.f-ctl:focus, select.f-ctl:focus { outline: none; border-color: var(--c-primary); }
input.f-ctl::placeholder { color: var(--c-text-faint); }

/* Knopf-Varianten. .btn allein bringt KEINEN Hintergrund mit — ohne Variante
   rendert der Browser einen weissen Standardknopf, der auf dunklen Themes
   heraussticht. */
.btn-primary { background: var(--c-action); color: #fff; }
.btn-primary:hover { background: var(--c-action-hover); }
.btn-neutral { background: var(--c-bg-mute); color: var(--c-text); border: 1px solid var(--c-border-strong); }
.btn-neutral:hover { background: var(--c-surface-alt); border-color: var(--c-primary); }
.btn-gefahr { background: var(--c-danger); color: #fff; }
.btn-gefahr:hover { background: var(--c-danger-hover); }
/* Knopf auf Feldhoehe — passt in eine Filterleiste neben .f-ctl */
.btn-klein { padding: 0 14px; height: 36px; font-size: var(--fs-13); border-radius: 8px; }
/* Akzentfarbe der nativen Steuerelemente (ausgewählter Tag im Datums-Picker,
   Checkboxen, Radios) an die App-Aktionsfarbe angleichen — sonst nutzt der
   Browser sein eigenes Blau, das nicht zum Theme passt. accent-color wird
   vererbt, daher genügt die Regel auf html. */
html { accent-color: var(--c-action); }
/* Text-Markierung (Auswahl) in der App-Farbe statt im Browser-Blau. */
::selection { background: var(--c-action); color: #fff; }
::-moz-selection { background: var(--c-action); color: #fff; }
/* Runde Wallbox-Auswahl (Toggle als Nummern-Badge, wie die Anzeige-Badges) —
   versteckt die native Checkbox, das <span> ist der runde Button. */
.wb-pick { display: inline-flex; cursor: pointer; }
.wb-pick input { position: absolute; opacity: 0; width: 0; height: 0; }
.wb-pick > span { display: inline-flex; align-items: center; justify-content: center; min-width: 26px; height: 26px; padding: 0 7px; border-radius: 50%; font-size: var(--fs-12); font-weight: var(--fw-medium); font-variant-numeric: tabular-nums; border: 1px dashed var(--c-border-strong); background: transparent; color: var(--c-text-faint); opacity: .55; transition: .12s; }
.wb-pick input:checked + span { background: var(--c-action); color: #fff; border: 1px solid transparent; box-shadow: 0 0 0 2px var(--c-info-bg); font-weight: var(--fw-bold); opacity: 1; }
.wb-pick:hover > span { border-color: var(--c-primary); color: var(--c-text-muted); opacity: 1; }
.wb-pick input:checked:focus-visible + span,
.wb-pick input:focus-visible + span { outline: 2px solid var(--c-primary); outline-offset: 2px; }
label { font-size:var(--fs-14); font-weight: var(--fw-bold); color: var(--c-text-muted); display: block; }
/* Checkbox-/Radio-Optionen (Label umschließt das Input) sind keine Feld-Labels →
   normales Gewicht + Theme-Textfarbe, damit sie nicht fett/unscharf wirken. */
label:has(> input[type="checkbox"]), label:has(> input[type="radio"]) { font-weight: var(--fw-normal); color: var(--c-text); }
.warning-text { color: var(--c-danger-strong); font-size:var(--fs-13); font-weight: var(--fw-medium); margin-bottom: 16px; display: block; background: var(--c-danger-bg); padding: 13px 15px; border-radius: 9px; border: 1px solid var(--c-danger-bg); }
.info-text { color: var(--c-info); font-size:var(--fs-13); font-weight: var(--fw-medium); margin-bottom: 16px; display: block; background: var(--c-info-bg); padding: 13px 15px; border-radius: 9px; border: 1px solid var(--c-info-bg); }

/* STATS */
.stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 15px; margin-bottom: 25px; }
.stat-card { background: var(--c-bg); border: 1px solid var(--c-border); padding: 16px; border-radius: 10px; text-align: center; }
.stat-card .label { font-size:var(--fs-11); color: var(--c-text-soft); text-transform: uppercase; font-weight: var(--fw-medium); margin-bottom: 6px; }
.stat-card .value { font-size:var(--fs-20); font-weight: var(--fw-bold); color: var(--c-text-strong); }
.stat-card .unit { font-size:var(--fs-12); color: var(--c-text-soft); font-weight: var(--fw-medium); }
.stat-card.highlight { background: var(--tint-accent); border: 1px solid var(--tint-accent-border); }

/* HEATMAP */
.heatmap { display: grid; grid-template-columns: repeat(24, 1fr); gap: 3px; flex: 1; align-content: center; }
.heat-cell { height: 40px; border-radius: 3px; position: relative; box-shadow: inset 0 0 0 1px var(--c-border); }
.heat-cell:hover::after { content: attr(data-tooltip); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: #1e293b; color: white; padding: 4px 8px; border-radius: 4px; font-size:var(--fs-11); white-space: nowrap; z-index: 10; }
/* Heatmap-Spektrum kalt → heiß: leer = gedämpfter Hintergrund, dann
   Blau (wenig) → Grün → Gelb → Orange → Rot (am häufigsten).
   Kräftige, klar unterscheidbare Farben — funktioniert auf hellen und dunklen Themes. */
.heat-0 { background: var(--c-bg-mute); }
.heat-1 { background: #3b82f6; }
.heat-2 { background: #22c55e; }
.heat-3 { background: #eab308; }
.heat-4 { background: #f97316; }
.heat-5 { background: #ef4444; }

/* TOP-LISTE */
.top-list { list-style: none; padding: 0; margin: 0; }
.top-list li { display: flex; align-items: center; padding: 12px 0; border-bottom: 1px solid var(--c-border); }
.top-list li:last-child { border-bottom: none; }
.top-rank { width: 28px; height: 28px; border-radius: 50%; background: var(--c-bg-mute); display: flex; align-items: center; justify-content: center; font-weight: var(--fw-bold); font-size:var(--fs-13); color: var(--c-text-soft); margin-right: 12px; }
.top-rank.gold { background: #fef3c7; color: #d97706; }
.top-rank.silver { background: #e2e8f0; color: #64748b; }
.top-rank.bronze { background: #fed7aa; color: #c2410c; }
.top-info { flex: 1; }
.top-name { font-weight: var(--fw-medium); font-size:var(--fs-14); color: var(--c-text); }
.top-detail { font-size:var(--fs-12); color: var(--c-text-soft); }
.top-value { font-weight: var(--fw-bold); color: var(--c-success-strong); font-size:var(--fs-15); }

/* DRUCK-LAYOUT */
@media print {
    @page { margin: 15mm; }
    * { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; box-sizing: border-box !important; }
    /* Helle Palette fürs Drucken/PDF: Theme-Variablen auf hell zwingen (!important
       schlägt die dunklen Theme-Werte). Karten werden weiß, Texte dunkel, Badges hell —
       die farbigen Diagramm-Balken (blau/grün/orange) kommen auf Weiß klar zur Geltung. */
    html {
        --c-bg: #ffffff !important; --c-surface: #ffffff !important;
        --c-surface-alt: #f4f6f9 !important; --c-bg-soft: #f4f6f9 !important; --c-bg-mute: #eef1f5 !important;
        --c-text: #1a1a1a !important; --c-text-strong: #000000 !important; --c-text-muted: #333333 !important;
        --c-text-soft: #555555 !important; --c-text-faint: #777777 !important;
        --c-border: #dddddd !important; --c-border-strong: #cccccc !important;
        --c-primary: #1e3a8a !important; --c-accent: #2563eb !important;
        --c-info: #1e40af !important; --c-info-bg: #dbeafe !important;
        --c-success: #16a34a !important; --c-success-strong: #15803d !important;
        --c-success-text: #15803d !important; --c-success-bg: #dcfce7 !important;
        color-scheme: light !important;
    }
    body, .app-shell { display: block !important; height: auto !important; overflow: visible !important; background: white !important; margin: 0 !important; padding: 10mm !important; font-size: 10pt !important; max-width: 100% !important; }
    .main-area { overflow: visible !important; margin-left: 0 !important; }
    .content { padding: 0 !important; }
    .sidebar, .topbar, .filter-bar, .filterbar-card, .filterbar-inline, .btn, form, .status-grid, .no-print,
    input[type="search"], .tabcontent { display: none !important; visibility: hidden !important; height: 0 !important; max-height: 0 !important; margin: 0 !important; padding: 0 !important; overflow: hidden !important; }
    /* Befund 38: nur der aktive Reiter (Klasse tab-aktiv, gesetzt in openTab) wird gedruckt — vorher
       druckte jeder Reiter die Statistik mit, deren Diagramme leer waren, wenn sie nie geoeffnet war. */
    .tabcontent.tab-aktiv { display: block !important; padding: 0 !important; visibility: visible !important; max-width: 100% !important; }
    .main-grid { display: block !important; padding: 0 !important; margin: 0 !important; max-width: 100% !important; }
    .card { box-shadow: none !important; border: none !important; padding: 10px 0 !important; margin-bottom: 15px !important; page-break-inside: avoid; max-width: 100% !important; overflow: hidden !important; }
    .card.no-print { display: none !important; }
    /* Diagramme im Druck: feste, unverzerrte Größe. Der Donut braucht einen
       quadratischen Rahmen, sonst wird der Kreis zum Oval. (Die Diagramme werden
       per JS beim Drucken neu gezeichnet — siehe beforeprint in statistics.html.) */
    .chart-wrap { height: 300px !important; position: relative !important; }
    .chart-wrap canvas { position: absolute !important; inset: 0 !important; width: 100% !important; height: 100% !important; }
    .chart-doughnut { width: 340px !important; height: 340px !important; max-width: 340px !important; margin: 0 auto !important; }
    /* Sicherheitsnetz: falls das Canvas-Bild doch nicht exakt quadratisch ist,
       Seitenverhältnis erhalten statt zu strecken (Donut bleibt rund). */
    .chart-doughnut canvas { object-fit: contain !important; }
    .dual-chart { display: grid !important; grid-template-columns: 1fr 1fr !important; gap: 14px !important; }
    table { width: 100% !important; max-width: 100% !important; border-collapse: collapse; margin-top: 10px; table-layout: fixed !important; }
    th, td { padding: 8px 6px !important; font-size: 10pt !important; border-bottom: 1px solid #ddd !important; word-wrap: break-word !important; overflow: hidden !important; }
    th { color: #000; border-bottom: 2px solid #999 !important; background: #f5f5f5 !important; }
    h2 { font-size: 12pt !important; margin-bottom: 10px; padding-bottom: 5px; border-bottom: 2px solid #1e3a8a; color: #1e3a8a; }
    .stats-grid { display: block !important; max-width: 100% !important; }
    .stat-card { display: inline-block !important; width: 23% !important; margin: 1% !important; vertical-align: top !important; }
}

/* TOAST — folgt dem Theme: Karten-Fläche + Theme-Textfarbe, farbiger Rand zeigt den Typ. */
.toast { background: var(--c-surface); color: var(--c-text); padding: 15px 20px; border-radius: 10px; box-shadow: var(--shadow-pop); min-width: 280px; max-width: 400px; opacity: 0; transform: translateX(100px); transition: all 0.3s ease; font-size:var(--fs-14); line-height: 1.5; border: 1px solid var(--c-border); border-left: 4px solid var(--c-text-soft); }
.toast small { color: var(--c-text-soft); }
.toast-info { border-left-color: var(--c-accent); }
.toast-success { border-left-color: var(--c-success); }
.toast-error { border-left-color: var(--c-danger-light); }
.toast-warning { border-left-color: var(--c-warning); }

/* MOBILE — Sidebar wird zur horizontalen Leiste oben */
@media screen and (max-width: 900px) {
    /* Am Handy keinen horizontalen Überlauf zulassen (kein heller Streifen rechts).
       overflow-x:clip bricht – anders als hidden – kein position:sticky. */
    html, body { overflow-x: clip; max-width: 100%; }
    .app-shell { flex-direction: column; height: auto; overflow: visible; max-width: 100%; }
    .sidebar { width: 100%; flex-direction: row; align-items: center; gap: 4px; padding: 8px 10px; border-right: none; border-bottom: 1px solid var(--c-border); position: static; height: auto; align-self: auto; overflow-x: auto; overflow-y: hidden; -webkit-overflow-scrolling: touch; }
    .brand { padding: 0 8px 0 0; }
    .brand-name { display: none; }
    .wb-nav { width: auto; white-space: nowrap; padding: 9px 11px; flex: 0 0 auto; }
    /* Live-LED und Online-Zaehler bleiben am Handy sichtbar (Befund 42) — kompakt am
       rechten Rand der Leiste; nur die Angemeldet-/Berechtigungszeilen entfallen. */
    .sidebar-foot { margin: 0 0 0 auto; padding: 4px 8px; border: none; background: transparent; flex: 0 0 auto; }
    .sidebar-foot .row3 { display: none; }
    .main-area { overflow: visible; margin-left: 0; }
    .topbar { position: static; padding: 12px 12px; flex-wrap: wrap; }
    /* Topbar scrollt am Handy mit, die Leiste klebt also ganz oben; Ränder wie .content */
    .abschnittsnav { top: 0; margin: -12px -12px 0; padding-left: 12px; padding-right: 12px; }
    .abschnitt { scroll-margin-top: 78px; }
    .content { padding: 12px 12px 30px; }
}
@media screen and (max-width: 768px) {
    h1 { font-size:var(--fs-18); }
    h2 { font-size:var(--fs-16); }
    .status-card { padding: 14px 16px; }
    .filter-bar { gap: 8px; }
    .filter-group select { max-width: 140px; }
    .kpi-row { grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 15px; }
    .metric { padding: 14px 16px; min-width: 0; border-right: none; }
    .metric span { font-size:var(--fs-22); }
    /* Ø-Kachel (3 Werte) am Handy über die volle Breite, sonst läuft sie über */
    .kpi-row .metric:last-child { grid-column: 1 / -1; }
    .stats-grid { grid-template-columns: repeat(2, 1fr); gap: 8px; margin-bottom: 15px; }
    .stat-card { padding: 12px; }
    .stat-card .value { font-size:var(--fs-22); }
    .main-grid { grid-template-columns: 1fr !important; gap: 15px; margin-bottom: 15px; }
    .card { padding: 18px; margin-bottom: 15px; }
    table { font-size:var(--fs-13); display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }
    th, td { padding: 10px 8px; font-size:var(--fs-12); white-space: nowrap; }
    th { font-size:var(--fs-11); }
    .btn { padding: 12px 16px; font-size:var(--fs-14); }
    .user-layout { grid-template-columns: 1fr !important; display: flex !important; flex-direction: column !important; }
    .user-sidebar { position: relative !important; top: auto !important; }
    .heatmap { grid-template-columns: repeat(12, 1fr); }
    input[type="text"], input[type="file"], input[type="date"] { padding: 10px; font-size:var(--fs-14); }
    .toast { min-width: auto; max-width: 90vw; font-size:var(--fs-13); }
    .header { margin-bottom: 15px; }
    #refreshDropdown { right: 0; min-width: 130px; }

    /* Fix 2: Statistik-Diagramme + Export-Karten untereinander statt nebeneinander */
    .dual-chart { grid-template-columns: 1fr; }
    .export-cards { grid-template-columns: 1fr; }

    /* Stationskarten am Handy einspaltig (sonst läuft die 2. Spalte aus dem Bild) */
    .status-grid { grid-template-columns: 1fr; }

    /* Fix 3: Topbar aufgeräumter — Filter + Aktionen über die volle Breite.
       Der Zoom-Knopf bleibt auch am Handy (Befund 42): Pinch-Zoom ist seit 09.09.2026
       wieder erlaubt (viewport ohne user-scalable=no), beides darf es geben. */
    .topbar-actions { width: 100%; }
    .filter-bar { width: 100%; flex-wrap: wrap; }
    .filter-group { flex: 1 1 auto; }
    .filter-group select { max-width: none; flex: 1; }

    /* Fix 1: Benutzer-Tabelle als gestapelte Karten (statt horizontalem Scrollen).
       Jede Zelle zeigt ihren Spaltennamen über data-label. */
    #Tab2 table { display: block; overflow: visible; }
    #Tab2 thead { display: none; }
    #Tab2 tbody { display: block; }
    #Tab2 tbody tr { display: block; border: 1px solid var(--c-border); border-radius: 10px; background: var(--c-surface); margin-bottom: 12px; padding: 6px 12px; }
    #Tab2 tbody td { display: flex; justify-content: space-between; align-items: center; gap: 12px; width: 100%; border: none !important; padding: 7px 0 !important; white-space: normal !important; }
    #Tab2 tbody td::before { content: attr(data-label); font-weight: var(--fw-medium); color: var(--c-text-soft); font-size: var(--fs-12); flex: 0 0 auto; }
    #Tab2 tbody td:not([data-label])::before { content: none; }
}

@media screen and (max-width: 400px) {
    .stats-grid { grid-template-columns: 1fr; }
    .stat-card .value { font-size:var(--fs-20); }
    .metric span { font-size:var(--fs-24); }
    h1 { font-size:var(--fs-18); }
    .tab button { padding: 10px 10px; font-size:var(--fs-12); }
}
/* ===== Einheitliche, größere Tooltips =====
   Native title-Tooltips sind winzig und nicht stylbar. app.js wandelt title beim
   Überfahren in dieses Element um (gilt automatisch für ALLE Elemente mit title).
   Kontrast: auf dunklen Themes hell mit Akzent-Rand, auf hellen Themes dunkel —
   hebt sich so immer deutlich von Karten und Buttons ab.
   zoom: --chart-unzoom neutralisiert den App-Zoom, damit die per getBoundingClientRect
   ermittelte Position stimmt (gleiches Prinzip wie bei den Chart-Tooltips). */
:root { --tip-bg: #0f172a; --tip-fg: #ffffff; --tip-border: #3b82f6; }
html[data-theme="tiefsee"], html[data-theme="mitternacht"], html[data-theme="stahlblau"] {
  --tip-bg: #f8fafc; --tip-fg: #0f172a; --tip-border: #60a5fa;
}
.ui-tip {
  position: fixed; z-index: 99999; display: none; pointer-events: none;
  zoom: var(--chart-unzoom, 1);
  background: var(--tip-bg); color: var(--tip-fg);
  border: 2px solid var(--tip-border);
  padding: 9px 13px; border-radius: 9px;
  font-size: 15px; line-height: 1.45; font-weight: 500;
  max-width: 380px; white-space: normal;
  box-shadow: 0 10px 30px rgba(0,0,0,.45), 0 0 0 1px rgba(0,0,0,.25);
}
.ui-tip::after {
  content: ""; position: absolute; left: var(--tip-arrow, 50%); top: -7px;
  transform: translateX(-50%);
  border: 7px solid transparent; border-top: none; border-bottom-color: var(--tip-border);
}
.ui-tip.above::after { top: auto; bottom: -7px; border-bottom: none; border-top: 7px solid var(--tip-border); }

/* ===== Meldungen (Toasts) im selben Stil wie die Erklaer-Tooltips =====
   Heller Grund, kraeftiger Rand, Pfeil zur ausloesenden Schaltflaeche. Die Randfarbe
   traegt die Art der Meldung; --toast-rand faerbt Rand und Pfeil gemeinsam. */
.toast {
  --toast-rand: var(--tip-border);
  background: var(--tip-bg); color: var(--tip-fg);
  border: 2px solid var(--toast-rand); border-radius: 9px;
  font-weight: 500;
  box-shadow: 0 10px 30px rgba(0,0,0,.45), 0 0 0 1px rgba(0,0,0,.25);
}
.toast small { color: inherit; opacity: .72; }
.toast b { color: inherit; }
.toast-info    { --toast-rand: var(--tip-border); }
.toast-success { --toast-rand: var(--c-success); }
.toast-error   { --toast-rand: var(--c-danger); }
.toast-warning { --toast-rand: var(--c-warning); }
.toast::after {
  content: ""; position: absolute; left: var(--tip-arrow, 50%); transform: translateX(-50%);
  border: 8px solid transparent; bottom: -8px; border-bottom: none;
  border-top-color: var(--toast-rand);
}
.toast.unten::after { bottom: auto; top: -8px; border-top: none; border-bottom: 8px solid var(--toast-rand); }
.toast.ohne-pfeil::after { display: none; }

/* ===== Reiter Logs & Fehler (Tab13) =====
   Rohtext-Ansicht der Logdateien: Monospace, dunkler Grund, neueste Zeilen
   unten (die Ansicht scrollt beim Laden ans Ende). Warnungen/Fehler farbig. */
.log-ansicht {
    background: var(--c-bg-mute); border: 1px solid var(--c-border);
    border-radius: 10px; padding: 12px 14px;
    max-height: 65vh; overflow: auto;
    font-family: Consolas, "Cascadia Mono", monospace;
    font-size: var(--fs-12); line-height: 1.45;
}
.log-zeile { white-space: pre-wrap; word-break: break-word; color: var(--c-text-soft); }
.log-zeile.log-warnung { color: var(--c-warning-text, var(--c-warning)); }
.log-zeile.log-fehler  { color: var(--c-danger-text, var(--c-danger)); font-weight: var(--fw-medium); }
/* Zweizeilige Logzeile: Kopf (Zeit/Stufe/Modul) gedaempft, Meldung eingerueckt
   darunter. Die Einrueckung macht auf einen Blick sichtbar, wo ein Eintrag
   anfaengt — vorher lief alles in einer sehr breiten Zeile durch. */
.log-zeile { padding: 2px 0; border-bottom: 1px solid transparent; }
.log-zeile + .log-zeile { border-top: 1px solid var(--c-border); }
.log-kopf { display: block; font-size: var(--fs-11); color: var(--c-text-faint); letter-spacing: .02em; }
.log-text { display: block; padding-left: 16px; }
.log-zeile.log-warnung .log-kopf,
.log-zeile.log-fehler  .log-kopf { color: inherit; opacity: .8; }

/* Protokoll- und Verlaufs-Ansichten (Audit, Anmelde-Protokoll, Befehls-Historie,
   Mail-Verlauf, km-Verlauf) in derselben Schrift, Größe und mit denselben
   Abständen wie der Logs-Reiter — Spalten stehen zeichengenau untereinander.
   !important bei den Abständen: die Zellen tragen historisch Inline-Paddings. */
.protokoll-schrift, .protokoll-schrift th, .protokoll-schrift td {
    font-family: Consolas, "Cascadia Mono", monospace;
    font-size: var(--fs-12);
    line-height: 1.45;
}
.protokoll-schrift th, .protokoll-schrift td { padding: 4px 8px !important; }

/* ===== Streifen "Neue Karte erkannt" (base.html) =====
   Liegt ueber dem Reiterinhalt, auf jedem Reiter. Er geht NICHT von selbst weg:
   Eine Einblendung nach 12 Sekunden hatte niemand gesehen, der gerade an der
   Ladesaeule stand. Weg ist er erst, wenn die Karte zugeordnet oder verworfen
   wurde — dann steht sie nicht mehr in den Daten, aus denen er sich baut. */
/* ZUERST das Verstecken: `display: flex` schlaegt sonst die Browser-Grundregel
   `[hidden] { display: none }`, und `box.hidden = true` bliebe wirkungslos —
   der Streifen stand dann auch im Reiter Benutzer neben demselben Kasten. */
.nk-banner[hidden] { display: none; }
.nk-banner {
  display: flex; align-items: center; gap: 14px;
  margin: 0 0 18px; padding: 13px 16px;
  background: var(--c-warning-bg); color: var(--c-warning-text);
  border: 1px solid var(--c-warning-border); border-radius: 10px;
}
.nk-banner .nk-icon { width: 20px; height: 20px; flex: none; }
.nk-banner .nk-text { flex: 1 1 auto; min-width: 0; }
.nk-titel { font-size: var(--fs-14); font-weight: var(--fw-medium); }
.nk-titel .nk-nr { font-family: monospace; word-break: break-all; }
.nk-sub { font-size: var(--fs-12); color: var(--c-text-soft); margin-top: 2px; }
.nk-aktionen { display: flex; flex-wrap: wrap; gap: 7px; flex: none; }
.nk-aktionen button {
  padding: 6px 11px; border-radius: 6px; border: 1px solid var(--c-border-strong);
  background: var(--c-surface); color: var(--c-text); cursor: pointer;
  font-size: var(--fs-12); display: inline-flex; align-items: center; gap: 5px;
  white-space: nowrap;
}
.nk-aktionen button:hover { background: var(--c-bg-mute); }
.nk-aktionen button.nk-haupt { background: var(--c-action); border-color: var(--c-action); color: #fff; }
@media (max-width: 780px) {
  .nk-banner { flex-wrap: wrap; }
  .nk-aktionen { flex: 1 1 100%; }
}
