/* 00-basis-nav.css — Teil der Aufteilung von style.css (2026-08-10).
   Urspruenglich Zeilen 1-781 der einen Datei. Variablen, Reset, Inputs/Buttons, Navigation.
   Diese und alle anderen css/*.css-Dateien werden auf JEDER Seite
   gemeinsam geladen, in fester Reihenfolge - die Kaskade ist exakt
   dieselbe wie vorher, nur auf mehrere Dateien verteilt. */

/* Roboto liegt seit 2026-08-25 LOKAL unter www/schriften/ und wird hier
   deklariert. Vorher kam es von fonts.googleapis.com; damit ging bei jedem
   Seitenaufruf die IP-Adresse jedes Trainers, Spielers und Vorstandsmitglieds
   an Google. Das widerspricht dem, was #Inside verkauft ("Server in
   Deutschland", Auftragsverarbeitungsvertrag nach Art. 28 DSGVO), und
   entspricht der Konstellation, die das LG Muenchen 2022 als DSGVO-Verstoss
   gewertet hat (Az. 3 O 17493/20).

   Warum wieder in der CSS-Datei und nicht als <link> im <head>: Der Grund fuer
   den <link> war, den seriellen Ladeweg HTML -> CSS -> Google-Stylesheet ->
   Schriftdatei aufzubrechen. Diese Kette gibt es nicht mehr - die Datei liegt
   auf demselben Server, das mittlere Stylesheet entfaellt. Dafuer gilt die
   Deklaration wieder automatisch fuer JEDE Seite, auch fuer die sechs mit
   eigenem <head>. Genau deren stiller Rueckfall auf die Systemschrift war der
   Fehler vom 2026-08-23. header.php gibt zusaetzlich einen preload aus.

   Vier Dateien: gerade und kursiv, je latin und latin-ext. Kursiv wird
   gebraucht (8 CSS-Regeln, 23 <em> im Bestand). Zusammen rund 148 KB, einmal
   geladen und dann im Cache. */

@font-face {
    font-family: 'Roboto';
    src: url('../schriften/roboto-var-latin.woff2') format('woff2');
    font-weight: 100 900;
    font-style: normal;
    font-display: swap;
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                   U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F,
                   U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: 'Roboto';
    src: url('../schriften/roboto-var-latin-ext.woff2') format('woff2');
    font-weight: 100 900;
    font-style: normal;
    font-display: swap;
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                   U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                   U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                   U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: 'Roboto';
    src: url('../schriften/roboto-var-latin-italic.woff2') format('woff2');
    font-weight: 100 900;
    font-style: italic;
    font-display: swap;
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                   U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F,
                   U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: 'Roboto';
    src: url('../schriften/roboto-var-latin-ext-italic.woff2') format('woff2');
    font-weight: 100 900;
    font-style: italic;
    font-display: swap;
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                   U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                   U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                   U+2113, U+2C60-2C7F, U+A720-A7FF;
}

:root {
    /* Steuert, wie der Browser NATIVE Bedienelemente zeichnet - vor allem
       das ausgeklappte Menue eines <select>. Mit dem frueheren
       "light dark" folgte das Menue dem Betriebssystem: wer das System
       dunkel stellt, das Portal aber auf Hell, bekam ein dunkel gezeichnetes
       Menue, waehrend unsere Regeln die Optionsschrift auf --text-color
       (dann dunkelgrau) setzten - dunkel auf dunkel, praktisch unlesbar.
       Deshalb folgt color-scheme jetzt dem Portal-Theme (siehe die beiden
       Regeln bei :root[data-theme=...] weiter unten). */
    color-scheme: light;
    accent-color: var(--tigers-yellow, #fdee17);

    /* === Basis Farben === */
    --background-color: #ffffff;
    --darker-background: #f0f2f5;

    --text-color: #333333;
    --text-dark: #1a1a1a;
    --text-input: #000000;
    --text-placeholder: #666666;

    /* Weiss als SCHRIFT auf farbigem Grund. Nicht fuer Flaechen benutzen –
       dafuer gibt es --bg-flaeche (2026-07-22 bewusst getrennt gehalten). */
    --white: #ffffff;

    /* === Funktionale Farben === */
    --primary-blue: #3274d6;
    --primary-blue-hover: #2868c7;

    --danger-red: #d32f2f;
    --danger-red-hover: #b71c1c;
    --danger-red-tint: rgba(211,47,47,0.35);

    /* === Hintergründe Spezial === */
    /* Weisse Eingabe- und Kartenflaeche (frueher --bg-card-light + --bg-input-dark). */
    --bg-flaeche: #ffffff;
    --bg-input-readonly: #e9ecef;
    /* Bleibt bewusst eigenstaendig: das Unterschriftenfeld muss weiss bleiben,
       auch wenn jemand die uebrigen Flaechen umfaerbt. */
    --bg-signature: #ffffff;
    --bg-summary: #e9e9e9;
    --bg-table-header: #f8f9fa;
    --bg-table-row-dark: #f1f3f5;
    /* Hover auf dauerhaft hellen Flaechen (Bedienungsanleitung). */
    --overlay-light: rgba(0, 0, 0, 0.05);

    /* === Rahmen (Borders) === */
    --border-color: #1a1a1a;
    --border-light: #cccccc;
    --border-gray: #999999;

    /* === Formularfelder ===
       Verbindliche Hoehe fuer JEDES einzeilige Eingabefeld (Datum, Dropdown,
       Text, Zahl, Datei) und fuer Buttons, die neben Feldern stehen.
       Siehe Block "Einheitliche Feldhoehen" am Ende dieser Datei. */
    --feld-hoehe: 36px;

    /* === Tigers Vereinsfarben === */
    --tigers-black: #1a1a1a;
    --tigers-yellow: #fdee17;
    /* 9 % dunkler als die Vereinsfarbe. War bis 2026-08-24 ein fester
       Handwert (#e6d815) und damit der letzte Gelbton, den ein Verein
       einzeln haette nachstellen muessen. Gruen liegt jetzt eine von 255
       Stufen daneben - unterhalb der Wahrnehmungsschwelle. */
    --tigers-yellow-hover: #e6d815;
    --tigers-yellow-hover: color-mix(in srgb, var(--tigers-yellow) 91%, #000);
    --tigers-nav-bg: #111111;
    /* Gelb als TEXT/Icon-Farbe AUF GLAS. Reines Marken-Gelb kommt hier auf
       1,21:1 gegen Weiss und 1,11:1 gegen die Kartenflaeche - das ist nicht
       knapp daneben, das ist unlesbar.

       Bis 2026-08-23 stand hier reines Gelb plus ein dunkler Konturstrich
       (--tigers-yellow-outline). Der half der Lesbarkeit, erfuellte die Norm
       aber nicht: WCAG misst Fuellfarbe gegen Hintergrund, ein Konturstrich
       zaehlt nicht mit. Nachgemessen an den betroffenen Elementen: trotz
       Strich weiterhin 1,11:1.

       Jetzt abgedunkeltes Marken-Gelb (40 % Helligkeit): 6,55:1 auf Weiss und
       4,92:1 auf der Kartenflaeche, beides ueber den geforderten 4,5:1.
       NICHT fuer Hintergruende/Badges verwenden - dort bleibt --tigers-yellow
       korrekt, mit --tigers-black als Schrift darauf (14,4:1). */
    --tigers-yellow-text: #655f09;
    /* Der Konturstrich ist mit der Umstellung ueberfluessig geworden und wuerde
       dunkle Schrift nur verwaschen. Bleibt als Variable bestehen, damit die
       ~50 Regeln, die ihn setzen, nicht alle angefasst werden muessen und der
       Farb-Editor seinen Eintrag behaelt. */
    --tigers-yellow-outline: transparent;
    /* Schrift/Icons dort, wo Gelb auf einer HELLEN Flaeche stuende (blassgelbe
       Chips, Icon-Kacheln, Karten im Admin). Im Hellmodus dunkel, im Dunkel-
       modus das Marken-Gelb. Ersetzt den Konturstrich an diesen Stellen. */
    --tigers-yellow-ink: #1a1a1a;
    /* Gelb dort, wo es WERT bleiben muss (Kennzahlen, Summenzeilen): im
       Hellmodus dunkles Gold statt Schwarz, damit die Hervorhebung erhalten
       bleibt. 2026-08-23 nachgedunkelt - #a07b00 kam auf der Kartenflaeche nur
       auf 2,96:1 und stand damit u. a. in den Summenzeilen der Auswertungen
       unter der Grenze. Jetzt 6,17:1 auf Weiss und 4,63:1 auf der Karte. */
    --tigers-gold: #7a5d00;

    /* Gelb-Transluzenzen (Chips, Karten-Hervorhebung, Fokus-Ringe) */
    /* Aus --tigers-yellow ABGELEITET (2026-08-23), vorher acht feste Werte.
       Das war der Grund, warum ein Verein neun Farben einzeln einstellen
       musste: aendert er nur --tigers-yellow, blieben alle Toenungen
       Waiblinger Gelb. Jetzt folgen sie automatisch.
       Die erste Zeile je Token ist der Rueckfall fuer Browser ohne
       color-mix (vor 2023); die zweite gewinnt ueberall sonst. */
    --tigers-yellow-06: rgba(253,238,23,0.06);
    --tigers-yellow-06: color-mix(in srgb, var(--tigers-yellow) 6%, transparent);
    --tigers-yellow-12: rgba(253,238,23,0.12);
    --tigers-yellow-12: color-mix(in srgb, var(--tigers-yellow) 12%, transparent);
    --tigers-yellow-16: rgba(253,238,23,0.16);
    --tigers-yellow-16: color-mix(in srgb, var(--tigers-yellow) 16%, transparent);
    --tigers-yellow-22: rgba(253,238,23,0.22);
    --tigers-yellow-22: color-mix(in srgb, var(--tigers-yellow) 22%, transparent);
    --tigers-yellow-35: rgba(253,238,23,0.35);
    --tigers-yellow-35: color-mix(in srgb, var(--tigers-yellow) 35%, transparent);
    --tigers-yellow-40: rgba(253,238,23,0.4);
    --tigers-yellow-40: color-mix(in srgb, var(--tigers-yellow) 40%, transparent);
    --tigers-yellow-45: rgba(253,238,23,0.45);
    --tigers-yellow-45: color-mix(in srgb, var(--tigers-yellow) 45%, transparent);
    --tigers-yellow-50: rgba(253,238,23,0.5);
    --tigers-yellow-50: color-mix(in srgb, var(--tigers-yellow) 50%, transparent);

    /* === Layout & Schatten === */
    --navbar-height: 64px;
    --radius: 12px;
    --radius-small: 8px;
    --gap: 1rem;

    --shadow: 0 4px 12px rgba(0,0,0,0.1);
    --card-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
    --shadow-strong: 0 4px 6px rgba(0,0,0,0.15);

    /* === Status- und Meldungsfarben ===
       Eine Familie statt der frueheren zwei Praefixe (--msg-* und --status-*).
       -text = Schrift auf der getoenten Flaeche, -icon = Punkt/Symbol auf Glas,
       -bg/-border = die getoente Flaeche selbst. Die -text/-icon-Toene kippen
       mit dem Theme, weil sie im Hellmodus auf hellem Grund sitzen. */
    --ok-text: #1a7f4b;
    --ok-icon: #1a7f4b;
    /* Signalfarbe der Familie. Steckte vorher nur in den rgba-Werten unten;
       als eigener Token laesst sich die Familie mit EINEM Wert umstellen
       (2026-08-23). Entspricht dem bisherigen --ok-text des Dunkelmodus. */
    --ok-solid: #4ade80;
    --ok-bg: rgba(74,222,128,0.16);
    --ok-bg: color-mix(in srgb, var(--ok-solid) 16%, transparent);
    --ok-border: rgba(74,222,128,0.35);
    --ok-border: color-mix(in srgb, var(--ok-solid) 35%, transparent);

    --warn-text: #8a5a00;
    --warn-bg: rgba(251,191,36,0.2);
    --warn-bg: color-mix(in srgb, var(--warn-solid) 20%, transparent);
    /* Der Rahmen folgt der TEXTfarbe, nicht der Signalfarbe - und die kippt
       mit dem Theme. Dadurch stimmt diese eine Zeile in beiden Modi, und die
       Ausnahme im Dunkel-Block entfaellt (2026-08-23). */
    --warn-border: rgba(138,90,0,0.5);
    --warn-border: color-mix(in srgb, var(--warn-text) 50%, transparent);

    /* Steuer-/Freibetrags-Ton (Lachs). -text kippt mit dem Theme, weil er auf
       der eigenen Toenung sitzt; auf Weiss kam #f0997b nur auf rund 2:1. */
    --tax-text: #b04a22;
    --tax-solid: #f0997b;
    --tax-bg: rgba(240,153,123,0.18);
    --tax-bg: color-mix(in srgb, var(--tax-solid) 18%, transparent);
    --warn-solid: #fbbf24;
    --on-warn-solid: #3a2a00;

    --err-text: #a8302b;
    --err-icon: #b3221f;
    --err-solid: #e24b4a;
    --err-bg: rgba(226,75,74,0.16);
    --err-bg: color-mix(in srgb, var(--err-solid) 16%, transparent);
    --err-bg-strong: rgba(226,75,74,0.2);
    --err-bg-strong: color-mix(in srgb, var(--err-solid) 20%, transparent);
    --err-border: rgba(226,75,74,0.4);
    --err-border: color-mix(in srgb, var(--err-solid) 40%, transparent);
    --err-border-strong: rgba(226,75,74,0.45);
    --err-border-strong: color-mix(in srgb, var(--err-solid) 45%, transparent);

    /* Hallenbelegung: frei/belegt – keine Erfolgs-/Fehlermeldung, deshalb
       bewusst eine eigene Farbfamilie. */
    --status-blue: #2b6cb0;
    /* --status-blue selbst kippt mit dem Theme (hell #2b6cb0, dunkel
       #85B7EB) - es ist die Schriftfarbe. Die Flaeche braucht deshalb eine
       eigene, themeunabhaengige Signalfarbe. */
    --status-blue-solid: #85B7EB;
    --status-blue-bg: rgba(133,183,235,0.16);
    --status-blue-bg: color-mix(in srgb, var(--status-blue-solid) 16%, transparent);
    /* --status-teal ist die FLAECHE (Bestaetigen-Button) und bleibt in beiden
       Modi gleich; --status-teal-ink ist derselbe Ton als SCHRIFT auf der
       Toenung und kippt deshalb. Gleiche Trennung wie bei --ok-*. */
    --status-teal: #5DCAA5;
    --status-teal-ink: #1c7a5e;
    --status-teal-bg: rgba(93,202,165,0.18);
    --status-teal-bg: color-mix(in srgb, var(--status-teal) 18%, transparent);
    --status-teal-text: #10231c;

    /* === Stage / Glass (Hybrid) — Standardwerte = HELL ===
       "Dunkel" und "System" (bei OS-Dunkelmodus) überschreiben diese Gruppe
       unten 1:1 mit den ursprünglichen (dunklen) Werten. --ink ist die
       Text-/Tint-Farbe auf den Glasflächen: dunkel im Hellmodus, weiß im
       Dunkelmodus. Nav-Leiste, ihre Dropdowns und die reinen Recessed-
       Eingabeflächen (--glass-black-*) bleiben bewusst konstant (Marken-Chrome
       bzw. funktionieren in beiden Modi unverändert). */
    --ink: 26 26 26;
    /* Seitenhintergrund: Schleier (--stage-tint*) ueber diagonalem Streifen-
       muster (--stage-stripe-*). Bewusst in Einzelfarben zerlegt, damit sie
       im Admin (Seite & Design) einzeln einstellbar sind – --stage-bg selbst
       ist ein Verlauf und damit kein Farbwert. */
    --stage-tint: rgba(255,255,255,0.65);
    --stage-tint-2: rgba(240,242,245,0.4);
    --stage-tint-3: rgba(255,255,255,0.65);
    --stage-stripe-a: #f5f6f8;
    --stage-stripe-b: #eceef1;
    --stage-bg:
        linear-gradient(180deg, var(--stage-tint), var(--stage-tint-2) 35%, var(--stage-tint-3)),
        repeating-linear-gradient(-45deg, var(--stage-stripe-a) 0 22px, var(--stage-stripe-b) 22px 44px);
    /* Karten-/Panelflaeche. Im Hellmodus eine echte weisse Karte auf der
       getoenten Stage – ueber rgba(var(--ink)/0.11) allein waere sie dort
       kaum vom Hintergrund zu unterscheiden (2026-07-22). */
    --karte-bg: rgba(255,255,255,0.72);
    --karte-border: rgba(0,0,0,0.13);
    --glass-bg: rgba(0,0,0,0.05);
    --glass-bg-strong: rgba(0,0,0,0.08);
    --glass-border: rgba(0,0,0,0.14);
    --glass-blur: blur(20px) saturate(1.3);
    --glass-radius: 18px;
    --on-glass: rgba(0,0,0,0.87);
    --on-glass-soft: rgba(0,0,0,0.6);
    --nav-glass-bg: rgba(17,17,17,0.72);

    /* Feinere Glas-Abstufungen (aus hb-/so-/mo-/News-Komponenten übernommen) */
    --glass-06: rgba(0,0,0,0.06);
    --glass-08: rgba(0,0,0,0.08);
    --glass-12: rgba(0,0,0,0.12);
    --glass-16: rgba(0,0,0,0.16);
    --glass-22: rgba(0,0,0,0.2);
    --glass-40: rgba(0,0,0,0.32);
    --glass-45: rgba(0,0,0,0.4);
    --glass-50: rgba(0,0,0,0.45);
    --glass-55: rgba(0,0,0,0.5);
    --glass-60: rgba(0,0,0,0.55);
    --glass-70: rgba(0,0,0,0.62);
    --glass-75: rgba(0,0,0,0.68);
    --glass-90: rgba(0,0,0,0.8);

    /* Recessed Eingabeflächen (Inputs/Selects/Dropdown-Schatten) — bleiben in
       jedem Theme dunkel/grau, das funktioniert auf hellem wie dunklem Stage. */
    /* Versenkte Eingabeflaeche. Eine Vertiefung soll RELATIV zur Umgebung
       dunkler wirken – im Hellmodus also hellgrau, nicht schwarz (sonst steht
       dunkle --ink-Schrift auf dunklem Grund). */
    --feld-bg: rgba(0,0,0,0.06);
    --glass-black-30: rgba(0,0,0,0.3);
    --glass-black-55: rgba(0,0,0,0.55);
    --glass-shadow: rgba(15,15,15,0.25);
    --glass-avatar-ring: rgba(30,30,30,0.9);
}

:root[data-theme="dark"] {
    color-scheme: dark;
    --background-color: #1a1a1a;
    --darker-background: #111111;
    --text-color: rgba(255, 255, 255, 0.92);
    --text-dark: #ffffff;
    --text-input: #ffffff;
    --text-placeholder: rgba(255, 255, 255, 0.55);
    --border-color: rgba(255, 255, 255, 0.85);
    --border-light: rgba(255, 255, 255, 0.22);
    --border-gray: rgba(255, 255, 255, 0.45);
    --bg-flaeche: #242424;
    --ink: 255 255 255;
    --stage-tint: rgba(26,26,26,0.55);
    --stage-tint-2: rgba(26,26,26,0.35);
    --stage-tint-3: rgba(26,26,26,0.6);
    --stage-stripe-a: #262626;
    --stage-stripe-b: #1e1e1e;
    --stage-bg:
        linear-gradient(180deg, var(--stage-tint), var(--stage-tint-2) 35%, var(--stage-tint-3)),
        repeating-linear-gradient(-45deg, var(--stage-stripe-a) 0 22px, var(--stage-stripe-b) 22px 44px);
    --karte-bg: rgba(255,255,255,0.11);
    --karte-border: rgba(255,255,255,0.22);
    --glass-bg: rgba(255,255,255,0.10);
    --glass-bg-strong: rgba(255,255,255,0.14);
    --glass-border: rgba(255,255,255,0.20);
    --on-glass: rgba(255,255,255,0.92);
    --on-glass-soft: rgba(255,255,255,0.66);
    --glass-06: rgba(255,255,255,0.06);
    --glass-08: rgba(255,255,255,0.08);
    --glass-12: rgba(255,255,255,0.12);
    --glass-16: rgba(255,255,255,0.16);
    --glass-22: rgba(255,255,255,0.22);
    --glass-40: rgba(255,255,255,0.4);
    --glass-45: rgba(255,255,255,0.45);
    --glass-50: rgba(255,255,255,0.5);
    --glass-55: rgba(255,255,255,0.55);
    --glass-60: rgba(255,255,255,0.6);
    --glass-70: rgba(255,255,255,0.7);
    --glass-75: rgba(255,255,255,0.75);
    --glass-90: rgba(255,255,255,0.9);
    --tigers-yellow-text: #fdee17;
    --tigers-yellow-outline: transparent;
    --tigers-yellow-ink: #fdee17;
    --ok-text: #4ade80;
    --ok-icon: #2ecc71;
    --warn-text: #fbbf24;
    --err-text: #ff9b9a;
    --err-icon: #e24b4a;
    --tigers-gold: #fdee17;
    --feld-bg: rgba(0,0,0,0.3);
    --tax-text: #f0997b;
    --status-blue: #85B7EB;
    --status-teal-ink: #5DCAA5;
}

@media (prefers-color-scheme: dark) {
    :root[data-theme="system"] {
        color-scheme: dark;
        --background-color: #1a1a1a;
        --darker-background: #111111;
        --text-color: rgba(255, 255, 255, 0.92);
        --text-dark: #ffffff;
        --text-input: #ffffff;
        --text-placeholder: rgba(255, 255, 255, 0.55);
        --border-color: rgba(255, 255, 255, 0.85);
        --border-light: rgba(255, 255, 255, 0.22);
        --border-gray: rgba(255, 255, 255, 0.45);
        --bg-flaeche: #242424;
        --ink: 255 255 255;
        --stage-bg:
            linear-gradient(180deg, rgba(26,26,26,0.55), rgba(26,26,26,0.35) 35%, rgba(26,26,26,0.6)),
            repeating-linear-gradient(-45deg, #262626 0 22px, #1e1e1e 22px 44px);
        --karte-bg: rgba(255,255,255,0.11);
        --karte-border: rgba(255,255,255,0.22);
        --glass-bg: rgba(255,255,255,0.10);
        --glass-bg-strong: rgba(255,255,255,0.14);
        --glass-border: rgba(255,255,255,0.20);
        --on-glass: rgba(255,255,255,0.92);
        --on-glass-soft: rgba(255,255,255,0.66);
        --glass-06: rgba(255,255,255,0.06);
        --glass-08: rgba(255,255,255,0.08);
        --glass-12: rgba(255,255,255,0.12);
        --glass-16: rgba(255,255,255,0.16);
        --glass-22: rgba(255,255,255,0.22);
        --glass-40: rgba(255,255,255,0.4);
        --glass-45: rgba(255,255,255,0.45);
        --glass-50: rgba(255,255,255,0.5);
        --glass-55: rgba(255,255,255,0.55);
        --glass-60: rgba(255,255,255,0.6);
        --glass-70: rgba(255,255,255,0.7);
        --glass-75: rgba(255,255,255,0.75);
        --glass-90: rgba(255,255,255,0.9);
        --tigers-yellow-text: #fdee17;
        --tigers-yellow-outline: transparent;
        --tigers-yellow-ink: #fdee17;
        --ok-text: #4ade80;
        --ok-icon: #2ecc71;
        --warn-text: #fbbf24;
            --err-text: #ff9b9a;
        --err-icon: #e24b4a;
        --tigers-gold: #fdee17;
        --feld-bg: rgba(0,0,0,0.3);
        --tax-text: #f0997b;
        --status-blue: #85B7EB;
        --status-teal-ink: #5DCAA5;
    }
}


/* === Global Reset & Box Sizing === */
* {
    padding: 0;
    margin: 0;
    /* WICHTIG: Globales Box-Sizing verhindert Layout-Sprengung durch Padding */
    box-sizing: border-box;
    font-size: 1rem;
    /* Fallback-Kette statt des frueheren blossen `serif` (2026-08-23).
       Sie greift bei JEDEM Seitenaufruf sichtbar: Roboto kommt per
       display=swap nach, bis dahin zeichnet der Browser die Ersatzschrift.
       Mit `serif` war das Times New Roman - erst recht, wenn Roboto ganz
       ausfaellt (CSP-Fehler, Google nicht erreichbar, offline). Dieselbe
       Kette steht schon auf body, hier fehlte sie nur. */
    font-family: 'Roboto', system-ui, -apple-system, 'Segoe UI', Arial, sans-serif;
}

/* Textfarbe kommt jetzt ausschliesslich per Vererbung von body (setzt
   --text-color weiter unten). Grund fuer diese Aenderung (2026-08-10):
   `* { color }` traf JEDES Element direkt - auch das kleinste <i> in
   einem farbigen Badge - und schlug damit jede Vererbung von einer
   Komponente wie .qcard-ico. Jede farbige Komponente musste sich seither
   mit !important dagegen wehren; das war die "teuerste CSS-Falle" des
   Projekts. Einzige echte Luecke: Links und Formularfelder erben Farbe
   von Haus aus NICHT vom Elternelement, das gleicht dieser Block aus. */
a, button, input, select, textarea, optgroup {
    color: inherit;
}

/* Markierter Text: Vereinsfarben statt Browser-Blau. Grund: viele Texte sind
   halbtransparentes Weiss (rgba(var(--ink) / 0.6)); auf der blauen Standard-
   markierung wurden sie praktisch unlesbar. Gelb/Schwarz wie die Hervorhebung
   aktiver Menuepunkte, volle Deckkraft in beiden Designs (2026-07-30). */
::selection { background: var(--tigers-yellow); color: var(--tigers-black); }
::-moz-selection { background: var(--tigers-yellow); color: var(--tigers-black); }

/* Ausnahme fuer Auswahlfelder (2026-08-25).

   Chrome zeichnet den angezeigten Text eines FOKUSSIERTEN <select> mit der
   Markierungsfarbe. Durch die Regel darueber bekam damit jedes gerade
   angeklickte Auswahlfeld einen leuchtend gelben Balken quer durch den Wert
   und sah aus, als sei etwas kaputt. Aufgefallen am Konfessionsfeld im
   Profil, betraf aber jedes Auswahlfeld im Portal.

   In Eingabe- und Textfeldern bleibt die gelbe Markierung, dort ist sie
   gewollt und der Grund fuer die Regel oben. */
select::selection      { background: transparent; color: inherit; }
select::-moz-selection { background: transparent; color: inherit; }

/* Skip-Link: unsichtbar, bis er per Tab fokussiert wird. Springt am mehr-
   stufigen Menue vorbei direkt zum Seiteninhalt (#ti-main in header.php). */
.skip-link {
    position: absolute;
    top: 0;
    left: 0;
    transform: translateY(-100%);
    background: var(--tigers-yellow);
    color: var(--tigers-black);
    font-weight: 700;
    padding: 12px 20px;
    z-index: 10000;
    border-radius: 0 0 8px 0;
    text-decoration: none;
}
.skip-link:focus {
    transform: translateY(0);
}

/* Reduzierte Bewegung: Systemeinstellung respektieren, statt nur an
   einer Einzelstelle (van-spinner). Kuerzt Animationen/Uebergaenge auf
   nahezu null, statt sie zu entfernen - Layout-Logik, die auf ein
   transitionend wartet, bleibt dadurch funktionsfaehig. */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}

html {
    height: 100%;
    font-size: 16px;
}

body {
    min-height: 100svh;
    padding-top: env(safe-area-inset-top);
    padding-bottom: env(safe-area-inset-bottom);
    background: var(--stage-bg);
    background-attachment: scroll;
    display: flex;
    flex-direction: column;
    font-family: "Roboto", system-ui, -apple-system, "Segoe UI", Arial, sans-serif;
    color: var(--text-color);
    line-height: 1.55;
    text-rendering: optimizeLegibility;
    -webkit-font-smoothing: antialiased;
    margin: 0;
}

/* Die <main>-Landmark (header.php, geschlossen in footer.php). Sie ersetzt
   seit 2026-09-14 das leere <div id="ti-main">, das nur Sprungziel war.
   Die Flex-Spalte hier ist kein Schmuck: vorher waren .content und die
   uebrigen Inhaltsbloecke direkte Flex-Items des <body>. Als normale
   Block-Kinder einer <main>-Box verlieren sie 16px Hoehe, weil der untere
   Rand des letzten Kindes nach aussen kollabiert - nachgemessen am
   2026-09-14 auf home.php, Uebungsdatenbank und Hallenbelegung.
   display: flex stellt genau den alten Zustand wieder her. display: contents
   taete das auch, nimmt der Landmark aber unter Umstaenden die Rolle im
   Accessibility-Baum - also gerade das, wofuer sie da ist. */
#ti-main {
    display: flex;
    flex-direction: column;
}

img, svg, video, canvas {
    max-width: 100%;
    height: auto;
    display: block;
}

/* === Inputs & Buttons === */
select, input, button, textarea {
    font: inherit;
    color: var(--text-input);
    background-color: var(--bg-flaeche);
    border: 1px solid var(--border-light);
    border-radius: 10px;
    padding: 12px 14px;
    min-height: 20px;
}

button,
input[type="button"],
input[type="submit"] {
    cursor: pointer;
    transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease;
    background-color: var(--background-color);
    border: 1px solid var(--border-color);
    touch-action: manipulation;
}

button:hover,
input[type="button"]:hover,
input[type="submit"]:hover {
    transform: translateY(-1px);
    background-color: var(--bg-table-row-dark);
}

button:active,
input[type="button"]:active,
input[type="submit"]:active {
    transform: translateY(0);
}

:focus-visible {
    outline: 3px solid var(--tigers-yellow);
    outline-offset: 2px;
}

/* === Navigation === */
nav {
    position: sticky;
    top: 0;
    z-index: 1000;
    height: var(--navbar-height);
    background: var(--nav-glass-bg);
    backdrop-filter: blur(18px) saturate(1.4);
    -webkit-backdrop-filter: blur(18px) saturate(1.4);
    border-bottom: 1px solid rgba(253,238,23,0.18);
    border-bottom: 1px solid color-mix(in srgb, var(--tigers-yellow) 18%, transparent);
    display: flex;
    justify-content: space-between;
    align-items: center;
    box-shadow: 0 4px 16px rgba(0,0,0,0.4);
    padding: 0 0 0 0;
    margin-bottom: 16px;
}

/* Logo-Bereich: gelber Akzentstreifen links */
nav .loginHeader {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-shrink: 0;
    height: 100%;
    padding: 0 20px;
    background: var(--tigers-yellow);
    border-right: 3px solid #e6d815;
}

nav a.logo {
    max-height: var(--navbar-height);
    font-size: 1.1rem;
    font-weight: 900;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    text-decoration: none;
    color: var(--tigers-black);
    display: flex;
    align-items: center;
}

nav .TigersLogo,
nav .TigersLogo img {
    max-height: calc(var(--navbar-height) - 12px);
    max-width: calc(var(--navbar-height) - 12px);
}

/* Nav-Liste */
nav ul {
    height: 100%;
    display: flex;
    flex-direction: row;
    justify-content: flex-end;
    align-items: center;
    list-style: none;
    gap: 0;
}

nav li {
    height: 100%;
    min-width: auto;
    text-align: center;
    position: relative;
}

/* Browser-Vorgaben des <button> abraeumen (2026-08-23).
   Beim Menue-Umbau uebersehen: ein <button> bringt background: ButtonFace,
   einen eigenen Rahmen und border-radius mit. Die Regel darunter faerbt die
   Schrift weiss - Ergebnis waren zwei weisse Kaesten mit unsichtbarem Text.
   Muss VOR der gemeinsamen Regel stehen, damit deren border-bottom bleibt. */
nav .nav-gruppe {
    background: none;
    border: 0;
    border-radius: 0;
    font: inherit;
    text-align: inherit;
    -webkit-appearance: none;
    appearance: none;
}

nav ul a,
nav ul a:visited,
nav .expandable_li > .nav-gruppe {
    height: 100%;
    width: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 6px;
    text-decoration: none;
    color: rgba(255,255,255,0.88);
    font-size: 0.88rem;
    font-weight: 600;
    letter-spacing: 0.01em;
    text-transform: none;
    padding: 0 12px;
    transition: background 0.15s ease, color 0.15s ease;
    cursor: pointer;
    border-bottom: 3px solid transparent;
}

nav ul a i,
nav .expandable_li > .nav-gruppe i {
    color: var(--tigers-yellow);
    font-size: 0.9rem;
    transition: color 0.15s ease;
}

nav li:hover > a,
nav li:hover > a:visited,
nav li:hover > .nav-gruppe,
nav li:focus-within > .nav-gruppe {
    color: var(--tigers-yellow);
    border-bottom-color: var(--tigers-yellow);
    background: rgba(255,255,255,0.05);
}

nav li:hover > a i,
nav li:hover > .nav-gruppe i,
nav li:focus-within > .nav-gruppe i {
    color: var(--tigers-yellow);
}

/* Aktiver Nav-Link */
nav ul a.active,
nav ul a.active:visited {
    color: var(--tigers-yellow);
    border-bottom: 3px solid var(--tigers-yellow);
    font-weight: 700;
}

nav ul a.active i {
    color: var(--tigers-yellow);
}

/* Dropdown */
.dropdown {
    height: min-content;
    width: 260px;
    background: #1a1a1a;
    border: 1px solid rgba(253,238,23,0.2);
    border: 1px solid color-mix(in srgb, var(--tigers-yellow) 20%, transparent);
    border-top: 3px solid var(--tigers-yellow);
    display: none;
    flex-direction: column;
    position: absolute;
    left: 0;
    top: var(--navbar-height);
    box-shadow: 0 8px 24px rgba(0,0,0,0.5);
    border-radius: 0 0 var(--radius-small) var(--radius-small);
    overflow: hidden;
}

.dropdown li {
    height: 48px;
    width: 100%;
    border-bottom: 1px solid rgba(255,255,255,0.06);
}

.dropdown li:last-child {
    border-bottom: none;
}

.dropdown li a {
    justify-content: flex-start;
    padding: 0 18px;
    gap: 10px;
    width: 100%;
    color: rgba(255,255,255,0.75);
    font-size: 0.83rem;
    font-weight: 500;
    letter-spacing: 0.03em;
    text-transform: none;
    border-bottom: none;
    height: 100%;
}

.dropdown li a i {
    color: var(--tigers-yellow);
    font-size: 0.88rem;
}

.dropdown li:hover a {
    background: rgba(253,238,23,0.08);
    background: color-mix(in srgb, var(--tigers-yellow) 8%, transparent);
    color: var(--tigers-yellow);
    border-bottom: none;
}

.dropdown li:hover a i {
    color: var(--tigers-yellow);
}

/* Abschnitts-Label & Trenner innerhalb eines Dropdowns, z. B. "Formulare"
   unter Abrechnung & Dokumente (Menü-Konsolidierung, 2026-08-07). Gleiche
   Optik wie .npm-label/.npm-sep im Profilmenü, hier generisch fürs Dropdown. */
.dropdown li.dropdown-label {
    height: auto;
    cursor: default;
    padding: 9px 18px 4px;
    font-size: 0.68rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    /* 0,4 ergab 3,81:1 auf dem dunklen Chrome - unter den geforderten 4,5:1
       fuer diese kleine Schrift (2026-08-23 gemessen). 0,6 sind 6,4:1 und
       bleiben optisch eine zurueckgenommene Beschriftung. */
    color: rgba(255,255,255,0.6);
}

.dropdown li.dropdown-sep {
    height: 1px;
    padding: 0;
    margin: 4px 0;
    background: rgba(255,255,255,0.1);
    border: none;
}

/* :focus-within ergaenzt den Hover (2026-08-23): ohne das oeffnet sich das
   Dropdown auf dem Desktop nur mit der Maus, und die Links darin sind fuer
   die Tastatur nicht erreichbar - display:none nimmt sie aus dem Tab-Lauf. */
/* Der Klick auf den Gruppenknopf oeffnet ebenfalls - global, nicht nur
   unter 1026px. Ohne diese Regel wuerde der Knopf auf dem Desktop zwar
   aria-expanded="true" melden, aber nichts oeffnen: der gemeldete
   Zustand waere schlicht falsch. */
nav .expandable_li > .nav-gruppe[aria-expanded="true"] + .dropdown {
    display: flex;
}

nav li:hover .dropdown,
nav li:focus-within .dropdown {
    display: flex;
}

/* Der frühere Block `nav input[type="checkbox"] { display: none }` ist mit
   dem Menue-Umbau vom 2026-08-23 entfallen - es gibt keine Checkboxen mehr,
   sondern <button aria-expanded>. Genau dieses display:none war die Ursache
   dafuer, dass sich das Menue per Tastatur nicht oeffnen liess. */

.expandable_li {
    display: flex;
    justify-content: center;
    align-items: center;
}

/* Burger-Button */
.toggle_button {
    /* Balken bleiben 28x20, die Trefferflaeche wird per padding auf 44x44
       gebracht (2026-08-23). Vorher war das Ziel 28x20 und damit klar unter
       der Mindestgroesse - ausgerechnet beim einzigen Menue, das es auf dem
       Handy gibt. background/border zuruecksetzen, weil es jetzt ein
       <button> ist und keine <label> mehr. */
    width: 44px;
    height: 44px;
    padding: 12px 8px;
    background: none;
    border: 0;
    -webkit-appearance: none;
    appearance: none;
    position: absolute;
    top: 10px;
    right: 20px;
    display: none;
    flex-direction: column;
    justify-content: space-between;
    cursor: pointer;
}

.bar {
    height: 3px;
    width: 100%;
    background: var(--tigers-yellow);
    border-radius: 100px;
}

/* Responsive Navbar */
@media (max-width: 1025px) {
    .toggle_button {
        display: flex;
    }

    nav .loginHeader {
        padding: 0 14px;
    }

    nav a.logo {
        font-size: 0.85rem;
    }

    nav ul {
        height: min-content;
        width: 100%;
        background: #1a1a1a;
        display: none;
        position: absolute;
        top: var(--navbar-height);
        left: 0;
        box-shadow: 0 8px 24px rgba(0,0,0,0.5);
        gap: 0;
        flex-direction: column;
        /* Die Basisregel setzt `justify-content: flex-end` - waagerecht auf dem
           Desktop harmlos, hier aber die Hauptachse: die Eintraege wurden ans
           UNTERE Ende gedrueckt und liefen oben aus dem Kasten heraus. Was
           oberhalb des Anfangs ueberlaeuft, erreicht kein Scrollen - genau
           daran war das aufgeklappte Menue nicht zu bewegen. */
        justify-content: flex-start;
    }

    nav li {
        height: min-content;
        min-width: 100%;
        border-bottom: 1px solid rgba(255,255,255,0.06);
    }

    nav ul a,
    nav .expandable_li > .nav-gruppe {
        padding: 16px 24px;
        justify-content: flex-start;
        height: auto;
        border-bottom: none;
        border-left: 3px solid transparent;
    }

    nav ul a.active {
        border-bottom: none;
        border-left: 3px solid var(--tigers-yellow);
    }

    nav li:hover > a,
    nav li:hover > .nav-gruppe,
    nav li:focus-within > .nav-gruppe {
        border-bottom: none;
        border-left: 3px solid var(--tigers-yellow);
        background: var(--tigers-yellow-06);
    }

    .expandable_li {
        display: block;
    }

    .expandable_li .nav-gruppe {
        cursor: pointer;
        display: flex;
    }

    .dropdown {
        position: static;
        width: 100%;
        box-shadow: none;
        border: none;
        border-radius: 0;
        background: rgba(0,0,0,0.3);
    }

    .dropdown li {
        height: auto;
        border-bottom: 1px solid rgba(255,255,255,0.04);
    }

    .dropdown li a {
        padding: 13px 40px;
        justify-content: flex-start;
        width: 100%;
    }

    /* Das aufgeklappte Menue scrollt in sich selbst (2026-08-24).
       Die Liste steht auf `position: absolute` unter einer `position: sticky`
       Leiste - sie nimmt also keinen Platz im Seitenfluss ein, die Seite wird
       durch sie nicht laenger. Wer sie oeffnete und mehr Eintraege hatte, als
       auf den Bildschirm passen (Admin mit allen Gruppen, seit dem
       Erscheinungsbild-Schalter eine Zeile mehr), kam an das untere Ende
       schlicht nicht heran: Wischen bewegte die Seite dahinter, nicht das
       Menue. Deshalb eine Hoehe, die der Bildschirm hergibt, und eigener
       Scroll darin. `svh` statt `vh`, weil auf dem Handy die Adressleiste
       mitzaehlt; `overscroll-behavior` verhindert, dass die Seite dahinter
       mitrutscht, sobald das Menue am Ende ist. */
    #toggle_button[aria-expanded="true"] ~ ul {
        display: flex;
        max-height: calc(100vh - var(--navbar-height) - 2.6rem);
        max-height: calc(100svh - var(--navbar-height) - 2.6rem);
        overflow-y: auto;
        overscroll-behavior: contain;
    }

    /* Suche links, Burger aussen (2026-08-24).
       Der Burger stand absolut auf right:20px, der Suchknopf geht per
       margin-left:auto ebenfalls an den rechten Rand - beide lagen 24 von
       44 Pixeln uebereinander, und der Burger obenauf. Ein Klick auf die
       Lupe traf damit auf dem Handy IMMER das Menue; die Suche war dort
       gar nicht erreichbar. Als normales Flex-Element reiht sich der
       Burger hinter der Lupe ein, beide behalten ihre 44x44. */
    .toggle_button {
        position: static;
        top: auto;
        right: auto;
        margin-left: 4px;
    }

    /* Rechter Rand fuer den Burger, spiegelbildlich zum Logo-Abstand oben. */
    nav {
        padding-right: 14px;
    }
}

/* Trefferflaechen im Menue auf dem Handy (2026-08-23).
   Beim Menue-Umbau mitgemessen: der Burger war 28x20 und ist jetzt 44x44,
   die Eintraege im Profil-Dropdown lagen aber bei 21px Hoehe - Logout auf
   dem Handy war damit ein 215x21-Ziel. Nur Hoehe, keine Optik. */
@media (max-width: 1025px) {
    nav .npm-item,
    nav .npm-role {
        min-height: 44px;
        align-items: center;
    }
}

.ti-cmdk-trigger {
    min-width: 44px;
    min-height: 44px;
}

section {
    background: var(--darker-background);
    background-size: cover;
    height: calc(100vh - 80px);
}

h1 {
    font-size: 2.5rem;
    color: var(--border-color);
}

/* === Modern Web Guidance 2026: Typografie, Textumbruch & Icon-Zentrierung === */
h1, h2, h3, h4, h5, h6 {
    text-wrap: balance;
}

p, li, blockquote, .baustein-text, .baustein-box, .baustein-karten, td, th {
    text-wrap: pretty;
    overflow-wrap: anywhere;
    word-break: break-word;
}

/* Exakte vertikale & horizontale Zentrierung von Symbolen/Icons in Kästchen & Buttons */
.btn-icon, .icon-box, .icon-btn, .action-btn, button i, a.btn i, .baustein-actions button, .baustein-actions a, .icon-container {
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

/* Interaktives Formular-Feedback erst nach Benutzereingabe */
input:user-invalid, select:user-invalid, textarea:user-invalid {
    border-color: var(--err-border-strong, #a8302b) !important;
    background-color: var(--err-bg, rgba(226,75,74,0.16));
}

