/* =========================================================
   SELF-HOSTED FONTS: Inter (lokal, kein Google-Server-Kontakt)
   ---------------------------------------------------------
   Dateipfade:  assets/fonts/inter/*.woff2
   Download:    node download-fonts.js   (einmalig ausführen)
   Lizenzen:    Inter — SIL Open Font License 1.1 (OFL)
                https://rsms.me/inter/
   ========================================================= */
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("../assets/fonts/inter/Inter-Regular.woff2") format("woff2");
}
@font-face {
  font-family: "Inter";
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url("../assets/fonts/inter/Inter-Regular-Italic.woff2") format("woff2");
}
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("../assets/fonts/inter/Inter-Medium.woff2") format("woff2");
}
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("../assets/fonts/inter/Inter-SemiBold.woff2") format("woff2");
}
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("../assets/fonts/inter/Inter-Bold.woff2") format("woff2");
}
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url("../assets/fonts/inter/Inter-ExtraBold.woff2") format("woff2");
}

/* Font per <link> geladen — kein @import, vermeidet CSS-Parse-Block */

/* =========================================================
   SELF-HOSTED FONTS: Lora (lokal, kein Google-Server-Kontakt)
   ---------------------------------------------------------
   Dateipfade:  assets/fonts/lora/*.woff2
   Lizenz:      SIL Open Font License 1.1 (OFL) — siehe OFL.txt im Font-Verzeichnis
                https://fonts.google.com/specimen/Lora
   Verwendung:  Nur für Display-Überschriften (H1, .page-head__title, .page-hero__title)
                weight 600 (SemiBold) — warm, ausgewogen, gute Lesbarkeit auf dunklen Flächen
   ========================================================= */
@font-face {
  font-family: "Lora";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("../assets/fonts/lora/Lora-Regular.woff2") format("woff2");
  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: "Lora";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("../assets/fonts/lora/Lora-Regular-Ext.woff2") format("woff2");
  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: "Lora";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("../assets/fonts/lora/Lora-SemiBold.woff2") format("woff2");
  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: "Lora";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("../assets/fonts/lora/Lora-SemiBold-Ext.woff2") format("woff2");
  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;
}

/* =========================================================
   KOMPONENTEN – Wiederverwendbare CSS-Klassen
   ========================================================= */

.grid {
  display: grid;
  gap: var(--space-md);
}


/* =========================================================
   UTILITIES – Hilfsstile und Fehler-Handling
   ========================================================= */

.sr-only,
.visually-hidden {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  padding: 0 !important;
  margin: -1px !important;
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0) !important;
  white-space: nowrap !important;
  border: 0 !important;
}


.error-banner {
  background: var(--color-error-bg);
  color: var(--color-error-fg);
  border-left: 4px solid var(--color-error-fg);
  padding: var(--space-md);
  margin-bottom: var(--space-md);
  border-radius: 2px;
  display: flex;
  align-items: flex-start;
  gap: 0.5rem;
  font-size: 0.95rem;
  line-height: 1.5;
}

.error-banner span:first-child {
  flex-shrink: 0;
  font-size: 1.25rem;
}

.error-banner span:last-child {
  flex: 1;
}

.success-banner {
  background: var(--color-success-bg);
  color: var(--color-success-fg);
  border-left: 4px solid var(--color-success-fg);
  padding: var(--space-md);
  margin-bottom: var(--space-md);
  border-radius: 2px;
  display: flex;
  align-items: flex-start;
  gap: 0.5rem;
  font-size: 0.95rem;
  line-height: 1.5;
}

.success-banner span:first-child {
  flex-shrink: 0;
  font-size: 1.25rem;
}

.success-banner span:last-child {
  flex: 1;
}

@media (prefers-reduced-motion: no-preference) {
  .error-banner,
  .success-banner {
    animation: slideIn 0.3s ease-out;
  }

  @keyframes slideIn {
    from {
      opacity: 0;
      transform: translateY(-10px);
    }
    to {
      opacity: 1;
      transform: translateY(0);
    }
  }
}

/* =========================================================
   Responsive CSS – Mobile First Ansatz
   ---------------------------------------------------------
   - Die Datei verwendet das Mobile First-Prinzip:  
     Basis-Styles und Variablen sind primär für die niedrigste Bildschirmbreite (320–480 px) ausgelegt.
   - Alle Größen, Abstände und Touchflächen sind dafür optimiert, dass die Seite auf Smartphones ab 320 px voll nutzbar, barrierefrei und leicht bedienbar ist.
   - Über Media Queries werden weitere Breakpoints für Tablets, kleine und große Desktops gestaffelt angepasst:
     * Ab 768 px: Tablet-Layout und größere Flächen
     * Ab 1024 px: Kleine Desktops/Laptops
     * Ab 1200 px: Große Bildschirme, angepasste Schriftgrößen und Layoutabstände
   ========================================================= */

/* Ein konsistentes Schema sieht zum Beispiel so aus:
--[element]-[property]-[breakpoint] */

/* -------------------------------------------
   Breakpoint-Legende (zahlenbasierte Postfixe)
   --------------------------------------------

   Konvention:
   - Alle responsive Variablen bekommen einen Suffix
     in der Form: -[min-width-px]
   - Beispiel: --layout-padding-768 = Wert ab 768px

   Verwendete Breakpoints:
   - 320 = ab 320px (default)

   - 481  = ab 481px
            (Smartphone-Querformat & kleine Tablets)

   - 768  = ab 768px
            (Tablet-Layout & größere Flächen)

   - 1024 = ab 1024px
            (kleine Desktops/Laptops, Navigation horizontal)

   - 1200 = ab 1200px
            (große Bildschirme, angepasste Schrift & Abstände)

   Beispiel-Variablen:
   - --layout-padding-481
   - --layout-padding-768
   - --layout-padding-1024
   - --layout-padding-1200

   - --font-size-768
   - --font-size-1024
   - --font-size-1200
-------------------------------------------- */

/* =========================================================
   DESIGN-TOKENS: Vereinsfarben, Abstände, Schatten usw.
   ========================================================= */
:root {
  /* --- Kernpalette (reduziert) --- */
  --color-primary: #322882; /* Hauptblau */
  --color-primary-strong: #241c62; /* dunkler für Hover/Fokus */
  --color-accent: #fceb19; /* Vereinslogo + Footer-Akzent */
  --color-surface: rgba(255, 255, 255, 0.06); /* Karten/Flächen — Dark Glass */
  --color-surface-muted: rgba(255, 255, 255, 0.04); /* dezente Flächen — Dark Glass */
  --color-background: #0f1b42; /* Hintergrund + Footer */
  --color-text-primary: var(--glass-text); /* Primärtext auf Dunkel */
  --color-text-secondary: var(--glass-text-dim); /* Sekundärtext auf Dunkel */
  --color-border: var(--glass-hairline); /* Trennlinien — Dark Glass */
  --color-border-strong: rgba(148, 163, 184, 0.85);

  /* Footer specific shadow token */
  --footer-shadow:      0 -18px 30px rgba(0, 0, 0, 0.25);
  /* Schatten-Tokens (ehemalige --md-shadow-*) */
  --shadow-low:         0 2px 6px rgba(15, 23, 42, 0.18);
  --shadow-elevated:    0 8px 16px rgba(15, 23, 42, 0.12);
  --shadow-hover:       0 12px 34px rgba(15, 23, 42, 0.2);
  --shadow-nav:         0 12px 32px rgba(15, 23, 42, 0.18);
  --shadow-dark-low:    0 6px 22px rgba(0, 0, 0, 0.4);
  --shadow-dark-mid:    0 12px 32px rgba(0, 0, 0, 0.45);
  --shadow-dark-high:   0 16px 40px rgba(0, 0, 0, 0.5);

  /* ── Schriftstärken ─────────────────────────────────────── */
  --fw-normal:    400;
  --fw-medium:    500;
  --fw-semibold:  600;
  --fw-bold:      700;
  --fw-extrabold: 800;
  --fw-black:     900;

  /* ── Radius-Erweiterung ────────────────────────────────────
     --radius-xs ergänzt die Skala (xs < sm < md < lg < pill)
     ──────────────────────────────────────────────────────── */
  --radius-xs:   6px;

  /* ── Glas-Ästhetik ────────────────────────────────────────
     Tokenisierte rgba()-Familie für dunkle Glasflächen.
     Deckt die häufigsten Hardcodes in site.css ab.
     ────────────────────────────────────────────────────── */
  --glass-fill:          rgba(8, 6, 30, 0.95);    /* Panel-/Overlay-Hintergrund */
  --glass-surface:       rgba(255, 255, 255, 0.07); /* Karten-Fläche */
  /* Deckende Entsprechung von --glass-surface über einer Karte. Gebraucht
     überall dort, wo Inhalt unter der Fläche durchläuft und nicht
     durchscheinen darf — dann trägt Durchsichtigkeit nichts bei, sie
     macht nur unlesbar. Herleitung:
       Karte           rgba(255,255,255,0.16) über rgb(15,27,66) → rgb(53,63,96)
       darauf 7% Weiß                                            → rgb(67,76,107) */
  /* Die Inhaltsfläche der Seite — deckend, mit fester Farbe.
     Vorher war sie durchscheinend über dem Hintergrundfoto (body::before)
     und hatte damit gar keine Farbe: gemessen von #0D0F28 bis #686678,
     je nach Bildausschnitt und Fensterbreite. Damit war weder eine
     angrenzende deckende Fläche zum Passen zu bringen — klebende
     Reiterleiste, klebende Tabellenspalten — noch der Textkontrast
     zu garantieren: bei 390 px fiel er auf 4,74:1, knapp über der
     Grenze von 4,5:1, und das rein zufällig.

     Nach Apple (Materials) und Microsoft (Acrylic/Mica) gilt: Glas
     gehört auf Chrome, das über dem Inhalt schwebt — nicht unter den
     Inhalt selbst. Das Foto bleibt als Atmosphäre um die Karte herum.

     Alles, was auf der Karte deckend sein muss, leitet sich hiervon ab. */
  /* Vertiefte Fläche für Blöcke auf einer Karte — Trainingszeiten,
     Kontaktkarten. Gemessen lagen die beiden zuvor bei 8,9 und 5,5 ΔE zur
     Karte, dazu einmal violett getönt und einmal neutral. Zwei Blöcke
     nebeneinander, die dieselbe Rolle haben, brauchen dieselbe Tiefe und
     denselben Ton. Neutral statt violett, weil eine zweite blaue Tönung
     neben der ohnehin blauen Karte nur unruhig wirkt. */
  --flaeche-vertieft: rgba(0, 0, 0, 0.10);

  --karte-rgb:     61, 71, 109;
  --karte-flaeche: rgb(var(--karte-rgb));

  /* Fläche für Bedienleisten — bewusst die Farbe der Karte selbst.
     Deckend muss sie sein, seit die Leiste klebt: Sonst läuft Inhalt
     sichtbar dahinter durch. Eine eigene Farbe braucht sie deshalb aber
     nicht. Drei Anläufe zeigten, dass jede eigene Fläche hier stört:
       gleiches Blau, 7 % heller  → verschmilzt (5,9 ΔE)
       entsättigt auf Chroma 9    → wirkt schmutzig neben Chroma 21,6
       16 % heller, Chroma 16,7   → immer noch ein blaues Band
     In einer durchgehend blauen Oberfläche kann ein Band nicht „nicht
     blau" sein, ohne fremd zu wirken. Also gar kein Band: Die Leiste
     liegt in der Karte, markiert allein durch die Haarlinien oben und
     unten und den Unterstrich am aktiven Reiter. */
  /* Deckkraft der Leiste, sobald sie klebt. Kräftig, weil dort Text
     durchläuft und nicht ein weiches Foto. */
  --leiste-deckkraft: 0.92;

  /* Aufschlag, der die Reiterleiste von der Karte abhebt. Bewusst ein
     Schleier und keine eigene Farbe: Er legt sich auf die Karte und hebt
     sie überall um denselben Betrag an — 8,1 ΔE, gleich ob das Foto
     darunter gerade hell oder dunkel ist. Eine eigene Farbe könnte das
     nicht, weil die Karte selbst keinen festen Wert hat; genau daran sind
     die früheren Versuche gescheitert. */
  --leiste-aufschlag: rgba(255, 255, 255, 0.10);
  --glass-border:        rgba(255, 255, 255, 0.08); /* Rahmen */
  --glass-surface-mid:   rgba(255, 255, 255, 0.12); /* erhöhte Fläche */
  --glass-hairline:      rgba(255, 255, 255, 0.14); /* Trennlinie / Top-Highlight */
  --glass-text:          rgba(220, 228, 255, 0.92); /* Primärtext auf Dunkel */
  --glass-text-dim:      rgba(185, 193, 235, 0.90); /* Sekundärtext auf Dunkel — WCAG AA ≥4.9:1 auf Glas-Flächen */
  --accent-tint-weak:    rgba(252, 235, 25, 0.08);  /* Pille des Gruppentrenners */
  --accent-border-weak:  rgba(252, 235, 25, 0.20);  /* Rand dieser Pille */
  --accent-tint:         rgba(252, 235, 25, 0.12);  /* Gelb-Tint dezent */
  --accent-tint-sm:      rgba(252, 235, 25, 0.14);  /* subtile Karten-Bg */
  --accent-tint-md:      rgba(252, 235, 25, 0.18);  /* Badge-Bg */
  --accent-border:       rgba(252, 235, 25, 0.25);  /* Standard-Border */
  --accent-border-md:    rgba(252, 235, 25, 0.35);  /* stärkerer Border */
  --accent-text-fade:    rgba(252, 235, 25, 0.85);  /* gedimmter Akzent-Text */
  --primary-tint:        rgba(50, 40, 130, 0.22);   /* Blau-Tint mittel */
  --primary-tint-md:     rgba(50, 40, 130, 0.28);   /* Blau-Tint stark */

  /* Fläche des ausgewählten Filterreiters. Eigenes Token statt
     --primary-tint-md, das an acht weiteren Stellen wirkt.

     Zwei Korrekturen gegenüber vorher: Auf der helleren Karte trennte der
     alte Wert nur um 10 ΔE und war kaum auszumachen — jetzt 14 ΔE. Und er
     ging in die falsche Richtung: Die Pille wurde dunkler als ihr Grund,
     während die Zähler daneben heller werden. Ausgewählt heißt angehoben,
     nicht vertieft — beide zeigen jetzt in dieselbe Richtung. */
  --tab-aktiv-flaeche:   rgba(140, 130, 235, 0.26);
  --primary-shadow:      rgba(50, 40, 130, 0.35);   /* Border + Box-Shadow */
  --primary-border-md:   rgba(50, 40, 130, 0.38);   /* stärkerer Border */
  --color-link:          rgba(191, 199, 236, 0.96);  /* Fließtext-Links auf Dunkel — WCAG AA */

  /* ── Vereinsmeisterschaft: Tabellenflächen und Podium ──────────────────
     Deckende Werte, weil Sticky-Spalten sonst durchscheinen.

     Sie sind über der Fläche einer *normalen Tabellenzelle* verrechnet, nicht
     über --glass-fill. Letzteres war zweimal falsch: erst als über Weiss
     vorberechneter Rest des hellen Themes, dann als fast schwarzes rgb(10,9,33)
     — 27 dE dunkler als die Umgebung, weshalb die Kreuztabelle zwei schwarze
     Spalten zeigte und die Rangliste ganz schwarz wirkte.
     Rang 1 ist bewusst am deutlichsten; Rang 2 und 3 treten zurück. */
  /* Kante der klebenden Spalte: zeigt, dass rechts Inhalt darunter läuft.
     Die Verlaufstechnik von .table-responsive greift bei diesen Tabellen
     nicht, weil die Zellen deckend sind und den Container verdecken. */
  --sticky-schatten: 8px 0 10px -6px rgba(0, 0, 0, 0.55);
  /* Klebende Spalten brauchen eine deckende Flaeche, sonst scheint der Inhalt
     durch, der beim Scrollen darunter durchlaeuft. Die Flaeche muss exakt dem
     entsprechen, was daneben zu sehen ist:
       Karte  rgba(255,255,255,0.16) ueber rgb(15,27,66)  -> rgb(53, 63, 96)
       Kopf   zusaetzlich rgba(255,255,255,0.04)          -> rgb(61, 71, 102)
     Eine normale Datenzelle hat gar keinen Hintergrund und zeigt die Karte. */
  /* Klebende Tabellenzellen: deckend, weil Inhalt darunter durchläuft.
     Eine normale Datenzelle hat keinen Hintergrund und zeigt die Karte;
     eine Kopfzelle liegt 4 % Weiß darüber. */
  --vm-table-solid:  var(--karte-flaeche);
  --vm-thead-solid:  rgb( 69,  78, 115);
  /* Podium. Die Zeilenflächen tragen das Metall NICHT — das ging nicht:
     Ein erkennbarer Goldton auf blauem Grund braucht 40 bis 50 % Metall-
     anteil, und dort fällt der Text auf 3,5 bis 4,1:1, also unter die
     Grenze. Die früheren Werte waren der gescheiterte Versuch: Gemessen
     hatte „Gold" Chroma 1,8 (also Grau), „Silber" den Farbton der Tabelle
     selbst und „Bronze" 321 Grad, also Magenta.

     Stattdessen: Die Fläche hebt neutral an, absteigend nach Rang, und
     das Metall sitzt in der Kante, wo es gesättigt sein darf — für
     grafische Elemente genügen 3:1. */
  --vm-rank-gold:    rgb( 90, 99, 131);  /* Fläche + 15 % Weiß */
  --vm-rank-silver:  rgb( 80, 89, 124);  /* Fläche + 10 % Weiß */
  --vm-rank-bronze:  rgb( 73, 82, 118);  /* Fläche +  6 % Weiß */
  --vm-rank-gold-line:   rgb(255, 206,  64);  /* Farbton  87 Grad, 3,99:1 */
  --vm-rank-silver-line: rgb(198, 214, 238);  /* neutral,          4,66:1 */
  --vm-rank-bronze-line: rgb(226, 150,  96);  /* Farbton  60 Grad, 3,19:1 */

  /* Reiterleiste. --glass-text-dim erfüllt AA auf Kartenflächen, auf der
     Leiste bleibt es knapp darunter — deshalb ein eigenes, etwas helleres
     Paar. Die Unterscheidung aktiv/inaktiv trägt ohnehin vor allem die
     Markierung und das Schriftgewicht, nicht die Abdunklung. */
  /* Auf --karte-flaeche: 9,38:1. */
  --tab-text:        rgb(233, 240, 255);
  --tab-text-active: var(--glass-text);
  --tab-count-text:  var(--glass-text);

  /* Marke der Fließtext-Listen. --glass-hairline ist für Trennlinien
     gedacht und lag als Marke bei 1,51:1 — praktisch unsichtbar. Dieser
     Wert erfüllt die 3:1 für grafische Elemente (WCAG 1.4.11) und bleibt
     zugleich unter dem Text, damit die Marke nicht mit ihm konkurriert. */
  --list-marker: rgba(200, 208, 240, 0.62);

  /* ── Terminkategorien (Datumskachel) ────────────────────────────────────
     Eigene, bewusst gedämpfte Skala — getrennt vom Markenakzent. Gold bleibt
     den Akzenten vorbehalten und kommt hier nicht vor. Die Kategorie wird über
     den Farbton unterschieden, nicht über die Intensität: Füllung bleibt in
     allen vier Fällen gleich zurückhaltend, Rahmen und Ziffern tragen die
     Unterscheidung. Tag- und Monatsfarben erfüllen WCAG AA auf der Kachel. */
  --ev-ps-fill:   rgba( 74,  66, 190, 0.26);  /* Punktspiel — Indigo */
  --ev-ps-line:   rgba(124, 114, 228, 0.52);
  --ev-ps-day:    rgba(198, 192, 255, 0.96);
  --ev-ps-mon:    rgba(194, 188, 252, 0.95);

  --ev-st-fill:   rgba( 26, 132, 138, 0.30);  /* Sommerturnier — Petrol */
  --ev-st-line:   rgba( 92, 182, 190, 0.52);
  --ev-st-day:    rgba(166, 224, 232, 0.96);
  --ev-st-mon:    rgba(162, 220, 228, 0.95);

  --ev-vm-fill:   rgba(168,  62, 132, 0.28);  /* Vereinsmeisterschaft — Mauve */
  --ev-vm-line:   rgba(206, 118, 176, 0.52);
  --ev-vm-day:    rgba(244, 194, 226, 0.96);
  --ev-vm-mon:    rgba(242, 192, 224, 0.95);

  --ev-other-fill: rgba(176, 184, 200, 0.20); /* Sonstiges — Schiefer */
  --ev-other-line: rgba(190, 198, 214, 0.44);
  --ev-other-day:  rgba(216, 224, 240, 0.95);
  --ev-other-mon:  rgba(212, 220, 238, 0.94);

  /* Layout & card tokens */
  /* Radius-System */
  --radius-sm: 8px;
  --radius-md: 14px;
  --radius-lg: 26px;
  --radius-pill: 999px;
  --space-xxs:  4px;
  --space-xs:   8px;
  --space-sm:  12px;
  --space-md:  16px;
  --space-lg:  20px;
  --space-xl:  24px;
  --space-2xl: 32px;

  /* Small typography tokens */
  --type-meta: 0.8rem;
  --type-body: 1rem;
  --type-small: 0.75rem;
  --type-sm: 0.875rem;

  /* Grid & timeline tokens */
  --grid-min-col: 190px;
  --timeline-border-width: 2px;
  --timeline-gap: 1.1rem;
  --timeline-dot-left: -6px;
  --timeline-dot-top: 0.4rem;
  --color-error: #b91c1c;

  --hero-bg: linear-gradient(150deg, #0f1b42 0%, #1c1055 55%, #0a1028 100%);

  /* --- Semantische Zustands-Farben --- */
  --color-error-bg: #fee2e2;
  --color-error-fg: #b91c1c;
  --color-success-bg: #dcfce7;
  --color-success-fg: #166534;

  /* timeline visuals */
  --timeline-dot-size: 13px; /* slightly larger for better visibility */
  --timeline-dot-shadow: 0 1px 3px rgba(2, 6, 23, 0.08);

  /* Typography tokens for cards and small stacks */
  --type-card-title: 0.95rem;
  --type-card-body: 0.9rem;
  --stack-gap: 0.8rem;

  /* --- Responsive Breakpoints (Mobile-First Definitionen) --- */
  /* Referenzwerte — CSS-Variablen sind in @media nicht auflösbar, Literalwerte nutzen */
  --bp-sm: 481px; /* Smartphone Querformat & kleine Tablets */
  --bp-md: 768px; /* Tablets */
  --bp-lg: 1024px; /* Desktop klein */
  --bp-xl: 1200px; /* Desktop groß */

  /* --- Root --- */
  --root-font-family: Inter, Arial, sans-serif;
  --font-display: "Lora", Georgia, "Times New Roman", serif;
  --root-font-size: 16px;

  /* --- Überschriften -------------------------------------- */
  /* H1 – Seitentitel / Page Intro */
  --h1-line-height: 1.25;
  --h1-font-weight: var(--fw-bold);
  --h1-margin-bottom: 0.8rem;

  --h1-font-size-320: 1.3rem;

  /* H2 – Abschnittsüberschriften */
  --h2-line-height: 1.3;
  --h2-font-weight: var(--fw-bold);
  --h2-margin-bottom: 0.7rem;

  --h2-font-size-320: 1.2rem;

  /* H3 – Unterüberschriften */
  --h3-line-height: 1.35;
  --h3-font-weight: var(--fw-semibold);
  --h3-margin-bottom: 0.6rem;

  --h3-font-size-320: 1.1rem;

  /* H4 – kleinere Überschriften */
  --h4-line-height: 1.4;
  --h4-font-weight: var(--fw-semibold);
  --h4-margin-bottom: 0.5rem;

  --h4-font-size-320: 1.02rem;

  /* --- Buttons (global) -------------------- */
  --btn-font-size: 0.9rem;
  --btn-primary-shadow: 0 2px 6px rgba(15, 23, 42, 0.22);

  --btn-text-color: var(--color-primary-strong);
  --btn-text-hover-decoration: underline;

  --btn-assist-text-color: var(--color-primary-strong);
  --btn-assist-bg: rgba(50, 40, 130, 0.07);
  --btn-assist-bg-hover: rgba(50, 40, 130, 0.13);
  --btn-assist-border: var(--primary-tint);
  --btn-assist-border-hover: var(--color-border-strong);
  --btn-assist-shadow: 0 1px 2px rgba(15, 23, 42, 0.12);
  --btn-assist-shadow-hover: 0 2px 5px rgba(15, 23, 42, 0.18);

  --btn-chip-bg: var(--color-surface-muted);
  --btn-chip-border-color: var(--color-border);
  --btn-chip-text-color: var(--color-text-primary);
  --btn-chip-shadow: 0 1px 2px rgba(15, 23, 42, 0.18);

  --btn-chip-selected-bg: var(--color-primary);
  --btn-chip-selected-text-color: #ffffff;
  --btn-chip-selected-border-color: transparent;
  --btn-chip-selected-shadow: 0 3px 8px rgba(15, 23, 42, 0.35);

  --btn-chip-hover-bg: var(--color-surface-muted);
  --btn-chip-hover-border-color: var(--color-border);
  --btn-chip-hover-shadow: 0 2px 6px rgba(15, 23, 42, 0.22);

  --btn-chip-check-font-size: 0.75rem;

  /* Label-/Season-Chip (nicht klickbar) — Werte für dunkle Seiten-Hintergründe */
  --chip-bg: var(--primary-tint-md);
  --chip-border-color: rgba(100, 90, 200, 0.4);
  --chip-text-color: rgba(220, 228, 255, 0.92);
  --chip-font-size: 0.85rem;
  --chip-font-weight: var(--fw-medium);
  --chip-radius: 999px;
  --chip-padding-y: 0.25rem;
  --chip-padding-x: 0.9rem;

  /* --- Tabellen (global) --------------------------------- */
  --table-bg: var(--color-surface);
  --table-header-bg: var(--color-surface-muted);
  --table-header-text-color: var(--color-text-primary);
  --table-row-bg: var(--color-surface);
  --table-row-alt-bg: var(--color-surface-muted);
  --table-row-hover-bg: rgba(255, 255, 255, 0.04);

  --table-border-color: var(--color-border);
  --table-text-color: var(--color-text-primary);

  --table-shadow: 0 4px 14px rgba(15, 23, 42, 0.14);

  --table-cell-padding-y: 0.65rem;
  --table-cell-padding-x: 1.1rem;

  --table-header-font-size: 0.9rem;
  --table-body-font-size: 0.9rem;

  /* =======================================================
     HEADER / NAVIGATION
     -------------------------------------------------------
     Konvention:  --header-<bereich>-<eigenschaft>[-<breakpoint>]
     Header-Breakpoints: 320 (Default) · 481 · 768 · 1200
     ======================================================= */

  /* Struktur & Flächen */
  --header-height: 3.75rem; /* 60px */
  --z-sticky-tabs: 900; /* unter dem Seitenkopf, ueber dem Seiteninhalt */
  /* Der Seitenkopf klebt, hatte aber nur 72 % Deckkraft und keinen
     Weichzeichner: Beim Scrollen lief der Seiteninhalt lesbar durch ihn
     hindurch. Wie bei Karte und Reiterleiste gilt auch hier — eine
     klebende Fläche braucht ein Material, keine bloße Durchsichtigkeit. */
  --header-bg-color: rgba(8, 6, 22, 0.82);
  --header-nav-panel-bg: rgba(8, 6, 22, 0.97); /* mobiles Dropdown-Panel: deckend → lesbar */
  --header-border-b-color: rgba(255, 255, 255, 0.1);
  --header-font-color: #ffffff;
  --header-shadow: 0 2px 12px rgba(0, 0, 0, 0.35);
  --header-content-wrapper-padding-v: 0;

  /* Z-Index-Stufen: Skip > Header > Dropdown > Backdrop */
  --z-skip:                1100;
  --header-z-index:        1001;
  --header-nav-z-index:    1000;
  --header-backdrop-z-index: 999;
  --header-backdrop-bg: rgba(10, 16, 40, 0.45);

  /* Motion & Tastatur-Fokus */
  --header-link-transition: color 0.2s ease, transform 0.15s ease;
  --header-link-hover-translate-y: -1px;
  --header-link-text-shadow: none;
  --header-burger-transition: transform 0.3s ease, opacity 0.2s ease;
  --header-focus-ring: #fceb19; /* Gelb = sichtbarer Fokusring auf dunklem Grund */
  --header-focus-ring-offset: 3px;

  /* Branding (Logo + Wortmarke + Akzentzeile „Abteilung Schach") */
  --header-branding-gap: 0.6rem;
  --header-logo-height: 2.4rem; /* 38px — sitzt mit Luft in der 60px-Leiste */
  --header-title-color: #ffffff;
  --header-title-font-weight: var(--fw-semibold);

  /* Schriftgrößen — Wortmarke, Akzentzeile und Nav-Links sind GETRENNTE Rollen. */
  /* Wortmarke „Krostitzer Sportverein" (einzeilig, nowrap) */
  --header-title-size-320: 0.9375rem; /* 15px — passt einzeilig auf kleine Smartphones */
  --header-title-size-481: 1.125rem;  /* 18px — ab hier konstant über alle Breakpoints */
  /* Akzentzeile „Abteilung Schach" (Eyebrow über der Wortmarke) */
  --header-kicker-color: #fceb19; /* Vereinsgelb — signalisiert Schachabteilung */
  --header-kicker-size-320: 0.625rem;  /* 10px */
  --header-kicker-size-481: 0.6875rem; /* 11px */
  --header-kicker-letter-spacing: 0.18em;
  /* Navigationslinks (eigene Skala, kompakt damit lange Labels nicht überlaufen) */
  --header-nav-link-size-320: 0.9375rem; /* 15px — Burger-Dropdown */
  --header-nav-link-size-768: 0.9rem;    /* 14,4px — horizontale Desktop-Leiste */

  /* Navigation: Links */
  --header-nav-font-weight: var(--fw-medium);
  --header-nav-link-color: rgba(255, 255, 255, 0.75);
  --header-nav-link-letter-spacing: 0.03em;
  --header-nav-link-hover-color: #ffffff;
  --header-nav-link-active-color: #ffffff;
  --header-nav-link-active-color-desktop: #ffffff;
  --header-nav-link-active-font-weight: var(--fw-bold);
  --header-nav-accent: #fceb19; /* gelber Aktiv-Unterstrich */
  --header-nav-hover-bg: rgba(255, 255, 255, 0.06);
  --header-nav-active-bg: rgba(255, 255, 255, 0.09);

  /* Navigation: Abstände — Dropdown-Container (mobil < 768px) */
  --header-nav-container-padding-v-320: 0.4rem;
  --header-nav-container-padding-h-320: 1.1rem;
  --header-nav-container-padding-v-481: 0.4rem;
  --header-nav-container-padding-h-481: 1.1rem;
  --header-nav-container-padding-v-768: 0; /* Desktop-Leiste: kein Container-Padding */
  --header-nav-container-padding-h-768: 0;

  /* Navigation: Abstände — einzelne Menüpunkte */
  --header-nav-item-padding-v-320: 0.6rem;
  --header-nav-item-padding-h-320: 1.5rem;
  --header-nav-item-padding-v-481: 0.6rem;
  --header-nav-item-padding-h-481: 1.5rem;
  --header-nav-item-padding-v-768: 1rem;
  --header-nav-item-padding-h-768: 0.45rem; /* Desktop: kompakt, lässt Platz für den vollen Vereinsnamen auf einer Zeile */

  /* Burger-Button */
  --burger-size: 2.75rem; /* 44px Touch-Target (WCAG 2.5.5) */
  --burger-menu-color: rgba(255, 255, 255, 0.85);
  --burger-line-width: 26px;
  --burger-line-height: 2px;
  --burger-line-gap: 6px;
  --burger-hover-bg: var(--glass-border);

  /* --- Footer --------------------------------------------- */
  --footer-bg-color: var(--color-background);
  --footer-font-color: rgba(255, 255, 255, 0.6);
  --footer-nav-link-color: rgba(255, 255, 255, 0.7);
  --footer-nav-link-hover-color: rgba(255, 255, 255, 1);

  --footer-content-container-padding-v: 0.8rem;

  --footer-nav-item-size: 0.8125rem;
  --footer-nav-item-min-height: 2.75rem;
  --footer-nav-item-padding-v: 0.25rem;
  --footer-nav-item-padding-h: 0.5rem;

  --footer-nav-link-letter-spacing: 0.02em;

  /* --- Responsive Inhaltscontainer ------------------------ */
  --content-container-max-width-320: 100%;
  --content-container-max-width-481: 100%;
  --content-container-max-width-768: 680px;
  --content-container-max-width-1024: 840px;
  --content-container-max-width-1200: 860px;

  --content-container-width-320: 100%;
  --content-container-width-481: 100%;
  --content-container-width-768: 90%;
  --content-container-width-1024: 80%;
  --content-container-width-1200: 72%;

  --content-container-padding-v-320: 0.5rem;
  --content-container-padding-v-481: 0.5rem;
  --content-container-padding-v-768: 2.5rem;
  --content-container-padding-v-1024: 3rem;
  --content-container-padding-v-1200: 3rem;

  --content-container-padding-h-320: 0.5rem;
  --content-container-padding-h-481: 1rem;
  --content-container-padding-h-768: 1rem;
  --content-container-padding-h-1024: 1rem;
  --content-container-padding-h-1200: 1rem;

  /* --- Cards (global) ------------------------------------- */
  --card-bg-color: var(--color-surface);
  --card-border-color: rgba(148, 163, 184, 0.18);
  --card-shadow: 0 4px 12px rgba(15, 23, 42, 0.12);
  --card-padding: 1.25rem 1.1rem;
  --card-title-font-size: 1.15rem;
  --card-title-font-weight: var(--fw-semibold);
  --card-subtitle-font-size: 0.9rem;
  --card-hint-font-size: 0.85rem;

  /* Link & focus tokens */
  --link-color: var(--btn-text-color);
  --link-hover-color: var(--header-nav-link-hover-color);
  --focus-ring-color: rgba(50, 40, 130, 0.6);
  --focus-ring-width: 5px;
  --focus-ring-outline-color: rgba(50, 40, 130, 0.85);

  /* --- Design-Tokens für Card-Varianten (optional) ------- */
  --card-inner-shadow: 0 2px 8px rgba(15, 23, 42, 0.12);

  /* --- Card Header (global) ------------------------------ */
  --card-header-border-color: rgba(148, 163, 184, 0.3);
  --card-header-gap: 12px;
  --card-header-padding-bottom: 14px;
  --page-card-section-mt: 20px;

  /* --- Filter Bar / Form Controls (global) -------------- */
  --filter-bar-gap: 0.9rem;
  --filter-bar-label-font-size: 0.9rem;
  --filter-bar-label-font-weight: var(--fw-medium);

  --filter-input-bg: rgba(255, 255, 255, 0.08);
  --filter-input-border-color: var(--glass-hairline);
  --filter-input-radius: 999px;
  --filter-input-font-size: 0.9rem;
  --filter-input-placeholder-color: var(--color-text-secondary);

  --filter-input-focus-border-color: var(--color-primary);
  --filter-input-focus-shadow: 0 0 0 2px rgba(50, 40, 130, 0.18); /* an CI anpassen */

  /* --- Pagination (global) ------------------------------ */
  --pagination-font-size: 0.9rem;
  --pagination-gap: 0.4rem;
  --pagination-margin-top: 1.6rem;

  --pagination-btn-min-width: 2.1rem;
  --pagination-btn-padding-y: 0.25rem;
  --pagination-btn-padding-x: 0.55rem;
  --pagination-btn-radius: 999px;

  --pagination-btn-color: var(--color-primary);
  --pagination-btn-bg: transparent;
  --pagination-btn-border-color: transparent;

  --pagination-btn-active-bg: var(--color-primary);
  --pagination-btn-active-color: #ffffff;
  --pagination-btn-active-border-color: transparent;

  --pagination-btn-disabled-opacity: 0.4;
}

/* =========================================================
   Shared Card Base
   - Centralized base styles for page cards and small card-like components
   - Applies to generic `.card` and common page-specific card classes
   ========================================================= */
.card,
.location-card,
.contact-card {
  padding: var(--card-padding);
  border-radius: var(--radius-sm);
  border: 1px solid var(--card-border-color);
  background-color: var(--color-surface-muted);
  box-shadow: var(--card-shadow);
}

/* Global link and focus styles */
a {
  color: var(--link-color);
  text-decoration: none;
}

a:hover {
  color: var(--link-hover-color);
  text-decoration: underline;
}

/* Prefer :focus-visible for keyboard focus outlines */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
  outline: none;
  box-shadow: 0 0 0 var(--focus-ring-width) var(--focus-ring-color);
  border-radius: var(--radius-xs);
}

/* add a high-contrast outline in addition to the shadow for clarity */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
  outline: 2px solid var(--focus-ring-outline-color);
  outline-offset: 2px;
}

/* Accessible skip link (add <a class="skip-link" href="#main">Skip to content</a> near top of body) */
.skip-link {
  position: absolute;
  left: -9999px;
  top: auto;
  width: 1px;
  height: 1px;
  overflow: hidden;
}
.skip-link:focus,
.skip-link:active {
  position: fixed;
  left: 1rem;
  top: 1rem;
  width: auto;
  height: auto;
  background: #fceb19;
  color: #0f172a;
  padding: 0.5rem 0.75rem;
  border-radius: var(--radius-xs);
  box-shadow: var(--card-shadow);
  z-index: var(--z-skip);
}

/* =========================================================
   Root-Styles (Typografie & Hintergrund)
   ---------------------------------------------------------
   - Globale Design- und Typografie-Einstellungen gelten für alle Seiteninhalte.
   - Schriftfamilie, Schriftgröße und Zeilenhöhe werden zentral per Variable gesteuert.
   - Der Seitenhintergrund nutzt Vollflächen-Farbe und Bild mit Weichzeichnung.
   - Kombinierte Background-Properties erzeugen ein markantes, aber dezent wirkendes Seitenfundament.
   - Einstellungen im html-Tag garantieren Konsistenz und einfache Anpassbarkeit im Theme.
   ========================================================= */
html {
  font-family: var(--root-font-family);
  font-size: var(--root-font-size);
  line-height: 1.4;
  color: var(--color-text-primary);
}

p {
  text-wrap: pretty; /* verhindert Orphans */
}

body {
  background-color: var(--color-background);
  position: relative;
}

/* Hintergrundbild auf ::before ausgelagert — filter:blur() statt
   backdrop-filter auf body, compositet nur das Pseudo-Element. */
body::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -1;
  background:
    linear-gradient(to bottom, rgba(12, 22, 70, 0.65), rgba(8, 14, 50, 0.75)),
    url("../assets/images/bg-image-100.jpg") 50% 60% / cover no-repeat;
  /* Grenzwert: Blur > 1.5px wirkt beim Scrollen schwindelig (vestibulär) */
  filter: blur(1.5px);
  transform: scale(1.06);
}

h1 {
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  line-height: var(--h1-line-height);
  margin-bottom: var(--h1-margin-bottom);

  font-size: clamp(1.55rem, 5vw, 2.25rem);
  text-wrap: balance;
}
h2 {
  line-height: var(--h2-line-height);
  font-weight: var(--h2-font-weight);
  margin-bottom: var(--h2-margin-bottom);

  font-size: clamp(1.25rem, 4vw, 1.75rem);
  text-wrap: balance;
}
h3 {
  line-height: var(--h3-line-height);
  font-weight: var(--h3-font-weight);
  margin-bottom: var(--h3-margin-bottom);

  font-size: clamp(1.1rem, 3vw, 1.35rem);
  text-wrap: balance;
}
h4 {
  line-height: var(--h4-line-height);
  font-weight: var(--h4-font-weight);
  margin-bottom: var(--h4-margin-bottom);

  font-size: clamp(1rem, 2.5vw, 1.15rem);
  text-wrap: balance;
}

/* =========================================================
   RESET: Browser-Defaults neutralisieren
   ---------------------------------------------------------
   - Setzt margin und padding global auf 0 für konsistente Abstände.
   - box-sizing: border-box für alle Elemente – Padding/Borders werden bei Größenberechnung berücksichtigt.
   - body erhält min-height: 100vh für eine stets volle Fensterhöhe.
   - Sorgt für gleiche Ausgangsbasis für alle Browser vor dem Custom-Design.
   ========================================================= */
*,
*::before,
*::after {
  box-sizing: border-box;
}

/* hidden muss stärker sein als jede display-Regel.

   Der Browser setzt [hidden] { display: none } in seinem eigenen Stilblatt —
   und der verliert gegen jede Klassenregel von uns. Ein Element mit
   `display: inline-flex` in der Klasse bleibt also sichtbar, obwohl das
   Attribut gesetzt ist. Aufgefallen am 26.08.2026 bei der Saisonplakette der
   Vereinsmeisterschaft: Sie stand trotz `hidden` neben dem Ausgabewähler.

   Bis dahin flickte jedes Bauteil das für sich (.nach-oben[hidden],
   .nav-backdrop[hidden]) — was den Fehler beim nächsten Bauteil wieder
   entstehen lässt. Einmal zentral, dafür mit !important: Es gibt keinen
   Fall, in dem ein als verborgen ausgezeichnetes Element sichtbar sein soll. */
[hidden] {
  display: none !important;
}

body {
  margin: 0;
  padding: 0;
  min-height: 100vh;
}

/* =========================================================
   LAYOUT: Hauptstruktur, Rahmen und Container-Logik
   ---------------------------------------------------------
   - Flexbox organisiert die Hauptbereiche vertikal und hält den Footer immer am Seitenende.
   - Außencontainer decken die volle Fensterbreite für Hintergründe und optische Separation ab.
   - Inhaltscontainer sind zentriert und begrenzt, damit alle Inhalte unabhängig vom Gerät sichtbar bleiben.
   - Einheitliche Abstände und Paddings werden per Design-Variablen gesteuert.
   ========================================================= */
body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}
/* Footer am Seitenende */
main {
  flex: 1;
}
/* Außencontainer: width:100% statt min-width:100vw, da 100vw Scrollbarbreite einschließt
   und auf Seiten mit vertikalem Scroll horizontalen Overflow verursacht */
.site-header,
.site-footer {
  width: 100%;
}
/* Inhaltscontainer */
.site-header__content-wrapper,
.main__content-wrapper,
.site-footer__content-wrapper {
  max-width: var(--content-container-max-width-320);
  width: var(--content-container-width-320);
  margin: 0 auto;
  padding: var(--content-container-padding-v-320) var(--content-container-padding-h-320);
}

/* ========================================================
   Filter Bar (z.B. News, Termine)
   --------------------------------------------------------
   - .filter-bar:   Container für eine komplette Filter-/Suchleiste
   - .filter-bar__group: logische Gruppe von Controls innerhalb der Leiste
   - .filter-bar__label: Beschriftung (z. B. "Suche:", "Jahr:")
   - .filter-bar__input-wrapper: Hülle für Textfeld mit Icon
   - .filter-bar__icon: führendes Icon im Textfeld (Lupen-Icon etc.)
   - .filter-bar__input: Textfeld (Suche, Freitextfilter)
   - .filter-bar__select: Dropdown (z. B. Jahr-/Saison-Auswahl)
   - .filter-bar__input--with-icon: Input mit zusätzlichem Platz links
   =======================================================*/

/* Gesamter Zeilen-Container für Filter/Suche
   Einsatz: Wrapper um alle Filter-Controls (Buttons, Inputs, Selects) */
.filter-bar {
  display: flex;
  flex-wrap: wrap;
  gap: var(--filter-bar-gap);
  align-items: center;
}

/* Gruppierung zusammengehöriger Controls
   Beispiel:
   - Gruppe 1: "Suche" + Suchfeld
   - Gruppe 2: "Jahr" + Select
   - Gruppe 3: "Filterlabel" + Chip-Buttons (Alle / Punktspiele / …) */
.filter-bar__group {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
}

@media (max-width: 480px) {
  .filter-bar__label {
    display: none;
  }
}

/* Variante für Gruppen, die wachsen sollen
   Einsatz: z. B. Suchfeld-Gruppe, die den verfügbaren Platz füllt */
.filter-bar__group--grow {
  flex: 1 1 230px;
}

/* Labels der Filter-Controls
   Einsatz: Beschriftung vor Input/Select („Suche:“, „Jahr:“) */
.filter-bar__label {
  font-size: var(--filter-bar-label-font-size);
  font-weight: var(--filter-bar-label-font-weight);
  color: var(--color-text-primary);
}

/* Wrapper um ein Eingabefeld
   Einsatz: wenn ein Textfeld ein Icon enthalten soll (Such-Icon etc.) */
.filter-bar__input-wrapper {
  position: relative;
  flex: 1;
}

/* Führendes Icon im Textfeld
   Einsatz: Icon links im Suchfeld, rein dekorativ (aria-hidden) */
.filter-bar__icon {
  position: absolute;
  left: 0.75rem;
  top: 50%;
  transform: translateY(-50%);
  color: var(--filter-input-placeholder-color);
  pointer-events: none;
}

/* Basistypografie und Look für Textfelder & Selects
   Einsatz: alle Filter-Inputs und -Selects (Suche, Jahr, Saison ...) */
.filter-bar__input,
.filter-bar__select {
  width: 100%;
  padding: 0.45rem 0.9rem;
  border-radius: var(--filter-input-radius);
  border: 1px solid var(--filter-input-border-color);
  background: var(--filter-input-bg);
  font-size: var(--filter-input-font-size);
  color: var(--glass-text);
}

.filter-bar__select {
  appearance: none;
  -webkit-appearance: none;
  padding-right: 2.2rem;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='rgba(220,228,255,0.7)' stroke-width='1.8' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 0.75rem center;
  cursor: pointer;
}

/* Zusätzlicher linke Innenabstand
   Einsatz: wenn ein Input ein Icon mit .filter-bar__icon nutzt */
.filter-bar__input--with-icon {
  padding-left: 2.3rem;
}

/* Platzhalter-Farbe für Textfelder
   Einsatz: alle Inputs mit Platzhaltertext („z. B. Turnier…“) */
.filter-bar__input::placeholder {
  color: var(--filter-input-placeholder-color);
}

/* Fokuszustand für Inputs & Selects
   Einsatz: Tastatur-/Mausfokus, hebt das aktuell aktive Feld hervor */
.filter-bar__input:focus,
.filter-bar__select:focus {
  outline: none;
  border-color: var(--filter-input-focus-border-color);
  box-shadow: var(--filter-input-focus-shadow);
}

/* =========================================================
   BUTTONS (GLOBAL)
   ---------------------------------------------------------
   Nutzung:
   - Immer .btn als Basis für alle interaktiven Buttons/Chips verwenden
   - Varianten werden zusätzlich angehängt:
     * .btn.btn--primary                → Hauptaktion (z.B. Formular-Submit)
     * .btn.btn--text                   → Link-/Text-Button ohne Hintergrund
     * .btn.btn--chip                   → Filter-/Tag-Button (Chip)
     * .btn.btn--chip.btn--chip-selected → ausgewählter Filter-Chip
     * .btn.btn--assist                 → „Assist“-Link/Chip, z.B. Aufstellung/Spielplan/Tabelle
   - Optionales Icon/Check in Chips:
     * .btn--chip__check                → kleines Icon im Chip; nur bei ausgewähltem Chip sichtbar
   ========================================================*/

/* Basis-Stil für alle Buttons/Chips
   Einsatz: immer zusammen mit einer Varianten-Klasse verwenden (.btn--primary, .btn--chip, ...) */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-pill);
  font-size: var(--btn-font-size);
  font-weight: var(--fw-medium);
  cursor: pointer;
  border: 1px solid transparent;
  gap: 0.35rem;
  line-height: 1.4;
  letter-spacing: 0.02em;
  transition:
    background-color 140ms ease-out,
    border-color 140ms ease-out,
    box-shadow 140ms ease-out,
    transform 100ms ease-out,
    color 100ms ease-out;
  text-decoration: none;
}

/* --- Varianten --- */

/* Primärer Button (Hauptaktion)
   Beispiel:
   <button class="btn btn--primary" type="submit">Absenden</button> */
.btn--primary {
  padding: 0.4rem 1rem;
  background: var(--color-primary);
  color: #fff;
  box-shadow: var(--btn-primary-shadow);
}

.btn--primary:hover,
.btn--primary:focus-visible {
  background: var(--color-primary-strong);
  box-shadow: 0 4px 14px var(--primary-shadow);
  transform: translateY(-1px);
  text-decoration: none;
}

.btn--primary:active {
  transform: translateY(0);
  box-shadow: var(--btn-primary-shadow);
}

/* Text-Button ohne Hintergrund (Link-Ersatz)
   Beispiel:
   <a href="..." class="btn btn--text">Alle Termine anzeigen</a> */
.btn--text {
  background: transparent;
  color: var(--btn-text-color);
  padding: 0.3rem 0;
  border: none;
  box-shadow: none;
}

/* Hover-Effekt für Text-Buttons
   Einsatz: Unterstreichung o. Ä. beim Überfahren mit der Maus */
.btn--text:hover {
  text-decoration: var(--btn-text-hover-decoration);
}

/* Modifier für dunkle Flächen — wenn der Default-Token #241c62 nicht lesbar ist */
.btn--text-on-dark {
  color: var(--color-link);
}
.btn--text-on-dark:hover {
  color: var(--color-accent);
  text-decoration: none;
}

/* Assist-Button (sekundärer Chip-Button)
   Einsatz: Links wie „Aufstellung“, „Spielplan“, „Tabelle“ unter Mannschaften/Terminen */
.btn--assist {
  padding: 0.25rem 0.85rem;
  border-radius: var(--radius-pill);
  font-size: var(--btn-font-size);
  font-weight: var(--fw-medium);
  color: var(--btn-assist-text-color);
  background: var(--btn-assist-bg);
  border: 1px solid var(--btn-assist-border-color);
  box-shadow: var(--btn-assist-shadow);
}

/* Hover-/Fokuszustand für Assist-Buttons
   Einsatz: visuelles Feedback bei Maus und Tastatur-Fokus */
.btn--assist:hover,
.btn--assist:focus-visible {
  background: var(--btn-assist-bg-hover);
  border-color: var(--btn-assist-border-color-hover);
  box-shadow: var(--btn-assist-shadow-hover);
  text-decoration: none;
}

/* Chip-Button (Filter/Tag)
   Beispiel:
   <button class="btn btn--chip" type="button">Filter</button>
   Einsatz: Filterleisten für Termine, News, ggf. weitere Listen */
.btn--chip {
  padding: 0.25rem 0.9rem;
  border-radius: var(--radius-pill);
  border: 1px solid var(--btn-chip-border-color);
  background: var(--btn-chip-bg);
  color: var(--btn-chip-text-color);
  box-shadow: var(--btn-chip-shadow);
}

/* Optionales Check-Icon im Chip
   Beispiel:
   <button class="btn btn--chip btn--chip-selected">
     <span class="btn--chip__check">✔</span>
     <span>Alle</span>
   </button>
   Einsatz: kleines Häkchen links im ausgewählten Chip anzeigen */
.btn--chip__check {
  font-size: var(--btn-chip-check-font-size);
  display: none;
  transform: translateY(0.5px);
}

/* Ausgewählter Filter-Chip
   Einsatz: aktiver Zustand in Filterleisten (z.B. „Alle“ oder „Punktspiele“ gewählt) */
.btn--chip.btn--chip-selected {
  background-color: var(--btn-chip-selected-bg);
  color: var(--btn-chip-selected-text-color);
  border-color: var(--btn-chip-selected-border-color);
  box-shadow: var(--btn-chip-selected-shadow);
}

/* Hover für nicht ausgewählte Chips
   Einsatz: visuelles Feedback beim Überfahren, aber nur wenn Chip nicht aktiv ist */
.btn--chip:hover:not(.btn--chip-selected) {
  background: var(--btn-chip-hover-bg);
  border-color: var(--btn-chip-hover-border-color);
  box-shadow: var(--btn-chip-hover-shadow);
}

/* Check-Icon nur beim ausgewählten Chip anzeigen
   Einsatz: Häkchen erscheint erst, wenn der Chip aktiv ist */
.btn--chip.btn--chip-selected .btn--chip__check {
  display: inline-block;
}

/* --- Zustände: disabled + loading --------------------------------- */

/* :disabled — natives HTML-Attribut; für Links: [aria-disabled="true"] */
.btn:disabled,
.btn[disabled] {
  opacity: 0.4;
  cursor: not-allowed;
}
.btn:disabled:hover,
.btn[disabled]:hover {
  transform: none;
}

/* .btn--loading — per JS gesetzt während async-Aktion läuft */
.btn--loading {
  position: relative;
  color: transparent;
  pointer-events: none;
}
.btn--loading::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 1em;
  height: 1em;
  margin-top: -0.5em;
  margin-left: -0.5em;
  border-radius: 50%;
  border: 2px solid rgba(255, 255, 255, 0.3);
  border-top-color: rgba(255, 255, 255, 0.9);
  animation: btn-spin 0.65s linear infinite;
}
@keyframes btn-spin {
  to { transform: rotate(360deg); }
}

/* =========================================
   .chip — Lebend-Status-Label (nicht interaktiv)

   Wann verwenden:
     Sichtbarer Zustand mit Punkt-Indikator (chip__dot),
     z. B. „● läuft", „● aktiv" bei laufenden Runden oder Partien.

   Nicht verwenden für:
     Saison-Metadaten       → .meta-badge
     Klickbare Filter       → .btn--chip
   ========================================= */

.chip {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding: var(--chip-padding-y) var(--chip-padding-x);
  border-radius: var(--chip-radius);
  background: var(--chip-bg);
  color: var(--chip-text-color);
  font-size: var(--chip-font-size);
  font-weight: var(--chip-font-weight);
  white-space: nowrap;
}

/* kleiner Punkt im Chip */
.chip__dot {
  width: 8px;
  height: 8px;
  border-radius: var(--radius-pill);
  background: var(--color-accent); /* Akzentpunkt auf dunklem Hintergrund */
}

/* ========== Tabellen (global) ========== */
/* Responsive Wrapper: scrollt horizontal statt den Viewport zu überschreiten */
.table-responsive {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  background:
    linear-gradient(to right, var(--card-bg-color) 30%, transparent),
    linear-gradient(to left, var(--card-bg-color) 30%, transparent) right,
    linear-gradient(to right, rgba(0, 0, 0, 0.12), transparent),
    linear-gradient(to left, rgba(0, 0, 0, 0.12), transparent) right;
  background-size:
    2rem 100%,
    2rem 100%,
    1rem 100%,
    1rem 100%;
  background-repeat: no-repeat;
  background-attachment: local, local, scroll, scroll;
}

/* Basis-Tabelle */
.table {
  width: 100%;
  border-collapse: collapse;
  border-spacing: 0;
  font-size: var(--table-body-font-size);
  color: var(--table-text-color);
}

/* Standard: alles linksbündig */
.table th,
.table td {
  text-align: left;
}

/* Variante: Tabelle in „Card”-Optik wie auf deiner HP */
.table--card {
  background: var(--table-bg);
  border-radius: var(--radius-md);
  box-shadow: var(--table-shadow);
  overflow: hidden; /* Radius auch für Header-Zeile */
}

/* Im Scroll-Container: Tabellenhintergrund transparent, damit der Scroll-Hinweis sichtbar wird */
.table-responsive .table--card {
  background: transparent;
}

/* Header */
.table thead th {
  background: var(--table-header-bg);
  color: var(--table-header-text-color);
  text-align: left;
  font-weight: var(--fw-semibold);
  font-size: var(--table-header-font-size);
  padding: var(--table-cell-padding-y) var(--table-cell-padding-x);
  border-bottom: 1px solid var(--table-border-color);
}

/* Body-Zellen */
.table tbody td {
  padding: var(--table-cell-padding-y) var(--table-cell-padding-x);
  border-bottom: 1px solid var(--table-border-color);
}

/* Nur dezenter Hover */
.table tbody tr:hover {
  background: var(--table-row-hover-bg);
}

/* =========================================================
   Pagination – global
   ---------------------------------------------------------
   - .pagination: Container (meist <nav>)
   - .pagination__btn: einzelne Seite / Prev / Next
   ========================================================= */

.pagination {
  margin-top: var(--pagination-margin-top);
  display: flex;
  justify-content: center;
  align-items: center;
  gap: var(--pagination-gap);
  font-size: var(--pagination-font-size);
  color: var(--color-text-secondary);
}

.pagination__btn {
  min-width: var(--pagination-btn-min-width);
  padding: var(--pagination-btn-padding-y) var(--pagination-btn-padding-x);
  border-radius: var(--pagination-btn-radius);
  border: 1px solid var(--pagination-btn-border-color);
  background: var(--pagination-btn-bg);
  cursor: pointer;
  font: inherit;
  color: var(--pagination-btn-color);
  line-height: 1;
  text-align: center;
}

/* Aktive Seite */
.pagination__btn--active,
.pagination__btn[aria-current="page"] {
  background: var(--pagination-btn-active-bg);
  color: var(--pagination-btn-active-color);
  border-color: var(--pagination-btn-active-border-color);
}

/* Disabled-Zustand */
.pagination__btn[disabled] {
  opacity: var(--pagination-btn-disabled-opacity);
  cursor: default;
}

/* Fokus sichtbar halten (WCAG) */
.pagination__btn:focus-visible {
  outline: 2px solid var(--color-accent);
  outline-offset: 2px;
}

/* =========================================================
   PAGE CARD LAYOUT (globales Seiten-Template)
   Nutzung:
   - Für alle Inhaltsseiten (Mannschaften, Termine, Verein...)
   - HTML-Grundstruktur:
     <section class="page-card">
       <header class="page-card__header ...">...</header>
       <!-- optional: .page-card__filter-bar -->
       <div class="page-card__body ...">...</div>
       <!-- optional: .page-card__footer -->
     </section>
========================================================= */

/* --- Basis-Card --- */
.card {
  background: var(--color-surface);
  color: var(--color-text-primary);
  border-radius: var(--radius-sm);
  padding: var(--card-padding);
  box-shadow: var(--shadow-low);
  border: 1px solid var(--color-border);
  transition:
    box-shadow 0.18s ease,
    transform 0.18s ease,
    border-color 0.18s ease,
    background-color 0.18s ease;
}

/* Generelles Hover-Verhalten für alle Cards */
.card:hover {
  box-shadow: var(--shadow-hover);
  transform: translateY(-1px);
}

/* =========================================================
   Page Card als Spezialvariante für zentrale Inhaltsbereich pro Seite
========================================================= */

/* Karte für Inhaltbereich der Seite — Glasmorphism-Design */
.page-card {
  /* Dickes Material statt dünnem Glas: 88 % deckend über dem unscharfen
     Hintergrundfoto. Das Foto moduliert die Fläche weiterhin sichtbar —
     die Karte bleibt lebendig statt als Platte hervorzustechen —, aber
     nur noch in einer Spanne von #283051 bis #384063 statt der früheren
     #0D0F28 bis #686678.

     Dass das geht, liegt an der Grundfarbe: Vorher lag helles Weiß über
     dem Foto und ließ 84 % davon durch. Jetzt liegt eine dunkle Farbe
     nahe am Foto darüber — dieselbe Wirkung, ein Zehntel der Streuung.

     Zwei Dinge werden dadurch erst möglich:
       Textkontrast garantiert — schlechtestenfalls 8,55:1 statt 4,74:1
       angrenzende deckende Flächen passen — der Untergrund wechselt
       langsam, örtlich liegen Karte und feste Nachbarfläche daher nur
       wenige ΔE auseinander.

     55 % ist gemessen gewählt. Bei 88 % schwankte die Karte über die
     ganze Seite nur um 3,5 ΔE und wirkte deckend, bei 75 % um 8,0 ΔE —
     immer noch zu wenig. Bei 55 % sind es 14,8 ΔE.

     Dass so viel Durchlässigkeit tragbar ist, liegt an der dunklen
     Verlaufsabdeckung auf body::before: Sie hält den Untergrund in
     einem engen dunklen Band, sodass der Text selbst hier noch
     6,91:1 hält — deutlich über der Grenze von 4,5:1.

     Der Weichzeichnerradius ist dabei fast wirkungslos (gemessen: 6 px
     und 26 px ergeben dasselbe Bild), weil die Abdeckung die Struktur
     des Fotos ohnehin weitgehend nimmt. Die Deckkraft ist der einzige
     wirksame Regler. */
  background: rgba(var(--karte-rgb), 0.55);
  backdrop-filter: blur(26px);
  -webkit-backdrop-filter: blur(26px);
  border: none;
  box-shadow:
    0 24px 56px rgba(0, 0, 0, 0.55),
    inset 0 1px 0 rgba(255, 255, 255, 0.18);
  border-radius: var(--radius-lg);
  padding: 0;
  overflow: hidden;
}
/* Ausnahme: Cards ohne page-card__body (z. B. 404) brauchen eigenes Padding */
.page-card--padded {
  padding: var(--card-padding);
  overflow: visible;
}

/* =========================================================
   Header der Seitenkarte
   Nutzung:
   - Immer als erster Block innerhalb .page-card
   - Variante .page-card__header--has-meta, wenn rechts
     ein Meta-Bereich (z.B. Saison) angezeigt wird.
========================================================= */

/* --- Basis-Header (ohne Meta-Bereich) --------------------- */

.page-card__header {
  padding-bottom: var(--card-header-padding-bottom);
  border-bottom: 1px solid var(--card-header-border-color);
}

/* --- Header-Layout mit Meta-Bereich ----------------------- */

/* Layout mit Titel links und Meta (Badge) rechts */
.page-card__header--has-meta {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 1rem;
}

/* Auf Mobile: Badge über den Titel stellen, volle Titelbreite */
@media (max-width: 480px) {
  .page-card__header--has-meta {
    flex-direction: column;
    gap: 0.4rem;
  }

  .page-card__header-meta {
    order: -1;
  }
}

/* Linke Spalte: Titel + Untertitel */
.page-card__header-main {
  flex: 1;
}

/* Rechte Spalte: z.B. Saison-Badge */
.page-card__header-meta {
  display: flex;
  align-items: flex-start;
}

/* --- Header-Inhalte --------------------------------------- */

/* Seitentitel  */
.page-card__title {
  margin: 0;
  font-size: clamp(1.3rem, 4vw, 1.75rem);
  font-weight: var(--fw-bold); /* Inter hat kein Gewicht 650 — nächste Stufe: 700 */
  letter-spacing: 0.01em;
  line-height: 1.3;
}

/* Untertitel / Intro-Text */
.page-card__subtitle {
  margin-top: 0.35rem;
  margin-bottom: 0;
  font-size: 0.9375rem;
  line-height: 1.5;
  color: var(--color-text-secondary);
}

/* ── .meta-badge — einzige Klasse für Saison-/Status-Label ──────────
   Wann: informatives Label ohne Interaktion, z. B. „Saison 2025/26",
         „Stichkampf". Nicht für Lebend-Status mit Punkt → .chip
   Modifier: .meta-badge--hero  (weißer Text auf Bildhintergrund)
   ------------------------------------------------------------------ */
.meta-badge {
  display: inline-flex;
  align-items: center;
  padding: 0.2rem 0.75rem;
  border-radius: var(--radius-pill);
  background: var(--accent-tint-md);
  border: 1px solid var(--accent-border-md);
  color: var(--color-accent);
  font-size: 0.79rem;
  font-weight: var(--fw-semibold);
  white-space: nowrap;
  flex-shrink: 0;
}

.meta-badge:empty { display: none; }

/* Auf Bild-/Hero-Hintergründen: Gelb ist zu grell → Weiß */
.meta-badge--hero {
  color: rgba(255, 255, 255, 0.88);
  background: var(--accent-tint-sm);
  border-color: rgba(252, 235, 25, 0.3);
  margin-bottom: 0.5rem;
}

/* --- Filter --------------------------------------- */
.page-card__filterbar {
  margin-top: var(--page-card-section-mt);
}

/* --- Page Body --------------------------------------- */
.page-card__body {
  margin-top: var(--page-card-section-mt);
  background: transparent;
  padding: 1.5rem 1.5rem 2rem;
}
@media (max-width: 480px) {
  .page-card__body {
    padding: 1rem 1.1rem 1.5rem;
  }
}
.page-card__body,
.page-card__body p,
.page-card__body h2,
.page-card__body h3,
.page-card__body h4 {
  color: var(--glass-text);
}
.page-card__body a {
  color: var(--color-link);
}
.page-card__body a:hover {
  color: #fceb19;
  text-decoration: underline;
}

/* Body-Padding-Ausnahmen (Standard-Padding steht auf .page-card__body) */
/* Listen-Seiten: kürzerer Unterabstand */
.mannschaften-card .page-card__body,
.termine-card .page-card__body {
  padding: 1rem 1.25rem 0.5rem;
}
@media (max-width: 480px) {
  .mannschaften-card .page-card__body,
  .termine-card .page-card__body {
    padding: 0.75rem 0.9rem 0.5rem;
  }
}
/* Chronik: seitliches Padding für Glasabstand, kein Top-Padding */
.chronik-card .page-card__body {
  padding: 0 0.75rem 1rem;
}

/* --- Page Footer (optional) --------------------------------------- */
.page-card__footer {
  margin-top: var(--page-card-section-mt);
  display: flex;
  justify-content: flex-end;
}

/* =========================================================
   PAGE HEAD — Kompakte Seitenkennung ohne Hero
   Ersetzt .page-hero auf Seiten ohne sinnvollen Hero-Inhalt.
   Konzept I+III: Hero nur bei echtem Inhalt (VM), sonst page-head.
   ========================================================= */
.page-head {
  padding: 1.35rem 1.5rem 1.25rem;
  background:
    linear-gradient(to bottom, rgba(30, 18, 110, 0.72), rgba(10, 14, 40, 0.88)),
    repeating-conic-gradient(rgba(255, 255, 255, 0.035) 0% 25%, transparent 0% 50%) 0 0 / 36px 36px,
    rgba(32, 26, 90, 0.82);
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.28);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
}
.page-head__title {
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  font-size: clamp(1.1rem, 3.8vw, 1.8rem); /* +Spur größer: Serif braucht etwas mehr Raum */
  color: #ffffff;
  margin: 0;
  letter-spacing: 0; /* Serifen (Lora) brauchen kein negatives Tracking */
  line-height: 1.15;
  overflow-wrap: break-word;
}
.page-head__header-main { flex: 1; min-width: 0; }
.page-head__kicker {
  font-size:      0.65rem;
  font-weight:    var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color:          rgba(252, 235, 25, 0.75);
  margin:         0 0 4px;
  width:          100%;
}
.page-head__sub {
  font-size: 0.82rem;
  color: rgba(255, 255, 255, 0.6);
  margin: 0.25rem 0 0;
  line-height: 1.5;
}
/* .page-head__badge → ersetzt durch .meta-badge (M-01) */
@media (max-width: 480px) {
  .page-head {
    padding: 1.1rem 1.1rem 1rem;
    align-items: flex-start;
  }
}

/* =========================================================
   PAGE HERO — Einheitliche Hero-Komponente für alle Seiten
   Usage: <div class="page-hero"> als erstes Kind von
          .page-card (padding:0; overflow:hidden)
   Kinder: .page-hero__badge? > .page-hero__title > .page-hero__sub?
   Die VM nutzt seit dem Umbau denselben .page-head wie alle anderen Seiten
   ========================================================= */
.page-hero {
  background-color: rgba(12, 18, 44, 0.65);
  background-image: repeating-conic-gradient(rgba(255, 255, 255, 0.035) 0% 25%, transparent 0% 50%);
  background-size: 36px 36px;
  padding: 1.35rem 1.5rem 1.3rem;
  position: relative;
  overflow: hidden;
  min-height: 4.5rem;
  border-radius: 0 0 20px 20px;
}
/* Layer 1: photo — ausgeblendet, body::before übernimmt das Hintergrundfoto */
.page-hero::before {
  display: none;
}
/* Layer 2: A2 overlay — on top of photo */
.page-hero::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(to bottom, rgba(30, 18, 110, 0.74), rgba(10, 16, 40, 0.92));
}
/* Layer 3: content above both */
.page-hero > * {
  position: relative;
  z-index: 2;
}
/* .page-hero__badge → ersetzt durch .meta-badge.meta-badge--hero (M-01) */
.page-hero__title {
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  margin: 0 0 0.35rem;
  font-size: clamp(1.35rem, 3.8vw, 1.7rem); /* leicht angehoben */
  color: #fff;
  letter-spacing: 0;
  line-height: 1.2;
  text-wrap: balance;
}
.page-hero__title:last-child {
  margin-bottom: 0;
}
.page-hero__sub {
  margin: 0;
  font-size: var(--type-sm);
  color: rgba(255, 255, 255, 0.55);
  line-height: 1.55;
  text-wrap: pretty;
}
@media (max-width: 480px) {
  .page-hero {
    padding: 1.1rem 1.2rem 1rem;
  }
}

/* ─── Team-Card Subkomponenten (Mannschaften-Seite) ─── */

/* Info-Block: Name + Liga mit sauberem Abstand */
.team-card__info {
  margin-bottom: 14px;
}

.team-card__info h3 {
  margin: 0 0 5px;
}

.team-card__info p {
  margin: 0;
}

/* Button-Zeile: flex mit wrap und gap */
.team-card__links {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

/* Kompaktere Buttons innerhalb der Kacheln — passen sicher in eine Zeile */
.team-card__links .btn--assist {
  padding: 0.2rem 0.65rem;
  font-size: 0.82rem;
}

/* =========================================================
   CARD-CONTAINER: LISTEN-LAYOUT
   Nutzung:
   - Für Listenansichten mit Cards (z.B. Termine, Tabellenzeilen)
   - Kinder bestimmen die Breite, Reihenfolge ist vertikal
========================================================= */

.card-list {
  display: block; /* Standard-Flow; Cards untereinander */
}

.card-list > .card {
  margin-bottom: 0.75rem; /* Abstand zwischen den Cards */
}

/* =========================================================
   LIST-ITEM: Zwei-spaltige Listen (generisch)
   Nutzung: Für zeitbasierte Events, Einträge mit schmalem Label + Info
            z.B. Terminliste (Datum | Event-Infos)
   Pattern:
   <ul class="list">
     <li class="list-item" data-tags="category">
       <div class="list-item__column list-item__column--narrow">Datum</div>
       <div class="list-item__column list-item__column--flexible">
         <div class="list-item__title">Titel</div>
         <div class="list-item__meta">Details</div>
       </div>
     </li>
   </ul>
========================================================= */

.list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.list-item {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
  padding: 0.75rem 0;
  border-bottom: 1px solid rgba(15, 23, 42, 0.08);
}

.list-item:last-child {
  border-bottom: none;
}

.list-item:hover {
  background-color: rgba(15, 23, 42, 0.02);
}

.list-item__column {
  display: flex;
  flex-direction: column;
}

.list-item__column--narrow {
  color: var(--color-text-secondary);
  font-size: 0.9rem;
}

.list-item__column--flexible {
  gap: 0.15rem;
}

.list-item__title {
  font-weight: var(--fw-semibold);
  color: var(--color-text-primary);
  font-size: 0.95rem;
}

.list-item__meta {
  color: var(--color-text-secondary);
  font-size: 0.85rem;
}

.list-item--highlighted {
  background: rgba(252, 235, 25, 0.09);
}

.list-item .btn--text {
  align-self: flex-start;
}

/* =========================================================
   ZENTRALE KOMPONENTEN: Tabs, Tabellen, etc.
   ========================================================= */

/* --- TAB-NAVIGATION (Material Design Primärtabs) --- */
.tabs {
  display: flex;
  flex-wrap: nowrap;
  /* Keine eigene Fläche, solange die Leiste im Fluss liegt: Dann ist sie
     die Karte, und es gibt nichts, wovon sie abweichen könnte. Markiert
     wird sie durch die Haarlinien.

     Der Grund: Leiste und Karte reagieren unterschiedlich auf das Foto
     darunter, ihr Abstand wanderte deshalb über die Seite — gemessen
     3,9 ΔE direkt unter der Leiste, 6,8 ΔE weiter unten, dazu ein
     Farbtonversatz. Ein fester Wert für die Leiste kann das nicht lösen,
     weil die Karte selbst keinen festen Wert hat.

     Erst wenn sie klebt, läuft Inhalt darunter durch und sie braucht ein
     Material — siehe .tabs.ist-geklebt. Das entspricht dem, was Apple
     „Scroll Edge Appearance" nennt. */
  background: linear-gradient(var(--leiste-aufschlag), var(--leiste-aufschlag));
  border-top: 1px solid var(--glass-border);
  border-bottom: 1px solid var(--glass-border);
  margin-top: 12px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
}

/* Scrollbar auf Mobile unsichtbar — Gradient-Hinweis übernimmt */
@media (max-width: 767px) {
  .tabs::-webkit-scrollbar {
    display: none;
  }
  .tabs {
    scrollbar-width: none;
  }
}

/* filter-bar__group innerhalb von Tabs: kein Wrap, kein Gap */
.tabs .filter-bar__group {
  flex-wrap: nowrap;
  gap: 0;
}

.tab {
  position: relative;
  flex: 0 0 auto;
  scroll-snap-align: start;
  padding: 14px 16px;
  font-size: 0.9rem;
  cursor: pointer;
  color: var(--tab-text);
  border: none;
  background: transparent;
  box-shadow: none;
  outline: none;
  transition: color 0.15s ease;
}

.tab:hover {
  color: rgba(255, 255, 255, 0.82);
}

.tab--active {
  color: var(--tab-text-active);
  font-weight: var(--fw-semibold);
  background: transparent;
  box-shadow: none;
}

.tab::after {
  content: "";
  position: absolute;
  left: 16px;
  right: 16px;
  bottom: 0;
  height: 2px;
  background-color: transparent;
  transition: background-color 0.15s ease;
}

.tab--active::after {
  background-color: var(--color-accent);
}

/* ── Zwei Ausprägungen derselben Leiste ────────────────────────────────────
   Die Form trägt die Bedeutung, nicht die Farbe:

   .tabs--filter  Filter — beantwortet „was wird gezeigt?". Der aktive Chip
                  ist gefüllt, denn ein Filter ist ein Schalter und darf
                  aussehen wie gedrückt. Trägt Zähler.
   .tabs--views   Ansichten — beantworten „welche Ansicht?". Nur ein
                  Unterstrich; der Inhalt darunter wechselt, nicht seine
                  Menge. Keine Füllung.

   Beide nutzen dieselben Farbtokens. Vorher unterschieden sich Termine und
   Vereinsmeisterschaft über Gold gegen Primärblau — also über etwas
   Beliebiges, und im VM-Fall über eine auf Dunkel unlesbare Farbe. */

/* Kreuztabelle auf kleinen Bildschirmen: kleinere Schrift = mehr Inhalt pro Zeile */
@media (max-width: 767px) {
  #tab-kreuztabelle .table {
    font-size: 0.82rem;
  }
}

/* ========== Rangliste als Liste ========== */

/* Die Tabellenfassung lief auf Telefonen über — bei 360 px um 38, bei 320 px
   um 78 Pixel — und brach jeden Namen zweizeilig um. Als Liste passt sie bei
   jeder Breite und fügt sich zu Ansetzungen und Teilnehmerliste, die auf
   dieser Seite ohnehin Listen sind. */
.rangliste {
  list-style: none;
  margin: 0;
  padding: 0;
}

/* Gemeinsame Spalten über alle Zeilen.

   Ohne dies ist jede Zeile ein eigenes Raster, und die dritte Spalte wird je
   Zeile aus ihrem breitesten Inhalt berechnet. Gemessen am Sommerturnier 2026
   ergab das fünf verschiedene linke Kanten der Punktzahl (879 bis 927 px):
   Wer keine Niederlage hat, trägt eine kürzere Kennzahl, bekommt eine
   schmalere Spalte — und seine Punktzahl rückt nach rechts. Die Zahlen
   standen also nicht untereinander, obwohl die rechte Kante bündig war.

   subgrid gibt allen Zeilen die Spalten des Elternrasters. In @supports,
   weil ohne Unterstützung sonst die Zeilen selbst zu Rasterzellen würden —
   der Rückfall ist das frühere Verhalten, nicht ein zerbrochenes Layout. */
@supports (grid-template-columns: subgrid) {
  .rangliste {
    display: grid;
    grid-template-columns: auto 1fr auto;
  }

  /* Über das Elternelement adressiert, damit die Spezifität höher liegt als
     die von .rangliste__zeile weiter unten — sonst überschriebe die dortige
     Angabe auto/1fr/auto diese hier, je nach Reihenfolge im Stilblatt. */
  .rangliste > .rangliste__zeile {
    grid-template-columns: subgrid;
    grid-column: 1 / -1;
  }
}

.rangliste__zeile {
  display: grid;
  /* Rang | Name | Punkte — die zweite Zeile spannt unter Name und Punkte */
  grid-template-columns: auto 1fr auto;
  align-items: baseline;
  column-gap: 0.75rem;
  padding: 0.55rem 0.9rem;
  border-bottom: 1px solid var(--glass-hairline);
  /* Jede Zeile trägt die Kante, auch ohne Podium — sonst rücken die
     Podiumszeilen um 4 px ein und die Ränge stehen nicht mehr bündig. */
  border-left: 4px solid transparent;
}

.rangliste__zeile:last-child {
  border-bottom: 0;
}

/* Fester Kreis mit tabular-nums: ein- und zweistellige Ränge stehen dadurch
   bündig untereinander, die Namen beginnen alle auf derselben Linie. */
.rangliste__rang {
  grid-row: 1 / span 2;
  align-self: center;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.9rem;
  height: 1.9rem;
  border-radius: 50%;
  background: linear-gradient(rgba(255, 255, 255, 0.13), rgba(255, 255, 255, 0.13));
  color: var(--glass-text);
  font-size: 0.76rem;
  font-weight: var(--fw-bold);
  font-variant-numeric: tabular-nums;
}

.rangliste__name {
  color: var(--glass-text);
  font-size: 0.95rem;
  min-width: 0;
  overflow-wrap: anywhere;
}

.rangliste__punkte {
  color: var(--glass-text);
  font-size: 1.05rem;
  font-weight: var(--fw-bold);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.rangliste__einheit {
  margin-left: 0.25rem;
  color: var(--glass-text-dim);
  font-size: 0.68rem;
  font-weight: var(--fw-semibold);
}

/* Zweite Zeile: links der Grund für den Rang, rechts die Kennzahl — jede
   unter dem Feld, auf das sie sich bezieht. Zuvor standen beide als ein Satz
   mit Trennzeichen nebeneinander und liefen ineinander. */
.rangliste__grund {
  grid-column: 2;
  margin-top: 0.1rem;
  color: var(--glass-text-dim);
  font-size: 0.76rem;
}

.rangliste__grund:empty {
  display: none;
}

.rangliste__kennzahl {
  grid-column: 3;
  margin-top: 0.1rem;
  /* Links bündig zur Punktzahl darüber, nicht rechts zur Kartenkante.

     Beide standen rechtsbündig — die rechte Kante stimmte also, aber der
     Text begann je nach Länge woanders: Die Punktzahl bei 912 px, die
     Buchholzzahl bei 924 bis 937. Nebeneinanderstehende Angaben derselben
     Spalte sollen an derselben Kante anfangen; die ist hier die linke, weil
     dort die Zahl steht, die man liest. */
  justify-self: start;
  color: var(--glass-text-dim);
  font-size: 0.76rem;
  white-space: nowrap;
}

/* Podium: dieselbe Abstufung und dieselben Metallkanten wie zuvor in der
   Tabelle — die Fläche hebt neutral an, das Metall sitzt in der Kante. */
.rangliste__zeile[data-rank="1"] { background: var(--vm-rank-gold);   border-left: 4px solid var(--vm-rank-gold-line); }
.rangliste__zeile[data-rank="2"] { background: var(--vm-rank-silver); border-left: 4px solid var(--vm-rank-silver-line); }
.rangliste__zeile[data-rank="3"] { background: var(--vm-rank-bronze); border-left: 4px solid var(--vm-rank-bronze-line); }

.rangliste__zeile[data-rank="1"] .rangliste__name {
  font-weight: var(--fw-bold);
}

/* ========== Zurück nach oben ========== */

/* Nur auf langen Seiten eingebunden (siehe live/js/nach-oben.js).
   Der Knopf wird per hidden geschaltet — damit ist er zugleich für
   Screenreader und für die Tabreihenfolge weg, ohne Zusatzattribute. */
.nach-oben {
  position: fixed;
  right: 1rem;
  bottom: 1rem;
  z-index: var(--z-sticky-tabs);
  width: 44px;   /* WCAG 2.5.5: Zielgröße */
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.2rem;
  line-height: 1;
  color: var(--glass-text);
  background: var(--glass-surface);
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-pill);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  cursor: pointer;
}

.nach-oben[hidden] { display: none; }

.nach-oben:hover {
  background: var(--primary-tint-md);
  border-color: var(--accent-border-weak);
}

.nach-oben:focus-visible {
  outline: 2px solid var(--color-accent);
  outline-offset: 2px;
}

/* main wird beim Sprung nach oben kurz fokussierbar gemacht, damit die
   Tastaturposition mitwandert. Es soll dabei keinen Rahmen zeigen — der
   Fokus ist hier eine Positionsangabe, kein bedienbares Element. */
main[tabindex="-1"]:focus {
  outline: none;
}

/* overflow:hidden der Karte klippt die runden Ecken — es macht die Karte
   aber auch zum Scrollcontainer, und darin kann nichts kleben. Nur die
   Karte mit Ansichtsreitern gibt das Klippen auf; die Ecken werden unten
   an ihren erstem und letztem Kind nachgezogen. */
.page-card:has(.tabs) {
  overflow: visible;
}

/* inherit statt fester Wert: die Karte ist auf schmalen Geraeten oben
   eckig und nur unten rund. Ein fester Radius wuerde dort falsch runden. */
.page-card:has(.tabs) > :first-child {
  border-top-left-radius: inherit;
  border-top-right-radius: inherit;
}

.page-card:has(.tabs) > :last-child {
  border-bottom-left-radius: inherit;
  border-bottom-right-radius: inherit;
}

/* Ansichtsreiter bleiben beim Scrollen erreichbar.
   Wer unten bei Runde 16 der Ansetzungen steht, will nicht neun Bildschirme
   zuruecklegen, nur um zur Rangliste zu wechseln. Die Leiste klebt direkt
   unter dem Seitenkopf, der selbst schon sticky ist. */
/* Beide Leisten kleben: Sie steuern, was darunter zu sehen ist. Eine
   Steuerung, die wegscrollt, zwingt zum Zurückscrollen, nur um sie wieder
   zu erreichen — bei den Terminen über drei Bildschirme, bei den
   Ansetzungen über neun. */
.tabs--views,
.tabs--filter {
  position: sticky;
  top: var(--header-height);
  z-index: var(--z-sticky-tabs);
}

@media (prefers-reduced-motion: no-preference) {
  html { scroll-behavior: smooth; }
}

/* Hinweis anstelle von Rangliste und Kreuztabelle, solange keine Partie
   gespielt ist. Beide Panels teilen ihn sich; er sitzt einmal in einem <li>
   und einmal in einer Tabellenzelle, deshalb neutral gehalten. */
.vm-leer {
  display: block;
  padding: 1rem 0.2rem;
  color: var(--glass-text-dim);
  font-size: 0.88rem;
  line-height: 1.55;
  max-width: 60ch;
  list-style: none;
}

/* Legende der Kreuztabelle.
   Jedes Paar aus Zeichen und Bedeutung ist ein eigener Listenpunkt, damit
   Screenreader sie nicht zu einem Satz verschmelzen. */
.kreuz-legende {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  gap: 0.3rem 1rem;
  margin: 0.7rem 0 0;
  padding: 0;
  color: var(--glass-text-dim);
  font-size: 0.74rem;
}

.kreuz-legende li {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
}

.kreuz-legende__sym {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 1.4rem;
  padding: 0.05rem 0.3rem;
  border-radius: var(--radius-xs);
  background: linear-gradient(rgba(255, 255, 255, 0.13), rgba(255, 255, 255, 0.13));
  color: var(--glass-text);
  font-weight: var(--fw-bold);
  font-variant-numeric: tabular-nums;
}

/* ═══════════════════════════════════════════════════════════════════
   Übersichtsseite der Turniere — die drei Serienkarten.

   Die Serienfarbe steckt in --serien-strich und kommt aus serie.json.
   Sie erscheint nur als schmaler Streifen links: In einer durchgehend
   blauen Oberfläche wirkt jede größere fremde Farbfläche aufgesetzt —
   dieselbe Erfahrung, die schon bei der Reiterleiste dazu führte, ganz
   auf ein farbiges Band zu verzichten. Ein Streifen genügt, um die
   Serie wiedererkennbar zu machen; auf ihrer eigenen Seite kehrt er
   wieder.
   ═══════════════════════════════════════════════════════════════════ */
.serien-liste {
  display: grid;
  gap: 0.85rem;
}

.serien-karte {
  display: grid;
  gap: 0.4rem;
  padding: 1rem 1.1rem 1.05rem;
  border: 1px solid var(--glass-border);
  border-left: 3px solid var(--serien-strich, var(--glass-hairline));
  border-radius: var(--radius-md);
  background: var(--flaeche-vertieft);
}

/* Das Kurzschachturnier ist das öffentliche Turnier und bekommt mehr
   Gewicht — etwas mehr Raum und einen warmen Schimmer aus dem Vereinsgelb.
   Kein zweiter Rahmen, keine zweite Farbe: Der Unterschied soll spürbar
   sein, nicht laut. */
.serien-karte--haupt {
  padding: 1.2rem 1.25rem 1.25rem;
  background:
    linear-gradient(105deg, var(--accent-tint-sm), transparent 55%),
    var(--flaeche-vertieft);
}

.serien-karte__kicker {
  margin: 0;
  font-size: 0.68rem;
  font-weight: var(--fw-bold);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--serien-strich, var(--glass-text-dim));
}

.serien-karte__titel {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  font-size: 1.1rem;
  line-height: 1.2;
  color: #ffffff;
}

.serien-karte--haupt .serien-karte__titel { font-size: 1.32rem; }

/* Der Titel ist der Verweis — für Screenreader ein sprechender Linktext.
   Sein ::after legt sich über die ganze Karte, sodass jeder Punkt darin
   anklickbar ist. Vorher war nur der Titel selbst das Ziel: „Zum Turnier →"
   unten rechts sah aus wie ein Verweis, war aber Dekoration und reagierte
   nicht. Ein Element, das wie ein Link aussieht, muss sich auch so verhalten.

   Ein zweiter echter Verweis auf dasselbe Ziel wäre die Alternative gewesen —
   für Screenreader aber nur Wiederholung. */
.serien-karte { position: relative; }

.serien-karte__verweis {
  color: inherit;
  text-decoration: none;
}

.serien-karte__verweis::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
}

.serien-karte:hover .serien-karte__verweis { text-decoration: underline; }
.serien-karte:hover { border-color: var(--glass-hairline); }

/* Der Fokusring gehört um die ganze Karte, nicht nur um den Titel — sonst
   zeigt er nicht auf die Fläche, die tatsächlich reagiert. */
.serien-karte:has(.serien-karte__verweis:focus-visible) {
  outline: 2px solid var(--color-accent);
  outline-offset: 3px;
}

.serien-karte__verweis:focus-visible { outline: none; }

.serien-karte__text {
  margin: 0;
  font-size: 0.86rem;
  color: var(--glass-text-dim);
  max-width: 56ch;
}

.serien-karte__fuss {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem 1rem;
  margin-top: 0.35rem;
  padding-top: 0.6rem;
  border-top: 1px solid var(--glass-border);
  font-size: 0.79rem;
}

.serien-karte__stand {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  color: var(--glass-text);
}

/* Der Punkt sagt „läuft" oder „ruht". Er steht immer neben dem Text, der
   dasselbe sagt — die Farbe allein trägt die Aussage nicht (WCAG 1.4.1). */
.serien-karte__stand::before {
  content: "";
  width: 0.48em;
  height: 0.48em;
  border-radius: 50%;
  background: var(--serien-strich, currentColor);
  flex: 0 0 auto;
}

.serien-karte__stand--ruht::before { background: rgba(255, 255, 255, 0.28); }
.serien-karte__stand em { font-style: normal; color: var(--glass-text-dim); }

.serien-karte__hin {
  margin-left: auto;
  color: var(--color-accent);
  font-weight: var(--fw-semibold);
  white-space: nowrap;
}

/* ── Ehrentafel und Archiv ─────────────────────────────────────────── */

.turnier-einstiege {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
  gap: 0.85rem;
  margin-top: 0.85rem;
}

.turnier-einstieg {
  padding: 0.85rem 1rem;
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-md);
  background: var(--flaeche-vertieft);
}

.turnier-einstieg__titel {
  margin: 0 0 0.15rem;
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  font-size: 0.98rem;
  color: #ffffff;
}

.turnier-einstieg__text {
  margin: 0;
  font-size: 0.79rem;
  color: var(--glass-text-dim);
}

/* Solange die Seiten fehlen, sagt die Karte das — statt einen Verweis
   anzubieten, der ins Leere führt. */
.turnier-einstieg__bald {
  margin: 0.5rem 0 0;
  font-size: 0.7rem;
  font-weight: var(--fw-bold);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--glass-text-dim);
  opacity: 0.75;
}

.lade-hinweis {
  margin: 0;
  font-size: 0.86rem;
  color: var(--glass-text-dim);
}

/* ═══════════════════════════════════════════════════════════════════
   Brotkrume im Seitenkopf der Turnierseiten.

   Vier Ebenen sind im Spiel: Abschnitt, Serie, Ausgabe, Ansicht. Die
   Ansicht trägt die Reiterleiste; die ersten drei standen vorher gar
   nicht oder verstreut da — der Abschnitt klein als Kicker, die Ausgabe
   rechts als loses Bedienelement neben der Überschrift.

   Hier stehen sie als Pfad, und das LETZTE GLIED ist der Wähler. Damit
   wird die Ausgabe dort gewechselt, wo sie in der Ordnung liegt, und
   keine Angabe steht zweimal — die Fassung mit Krume UND separatem
   Wähler hätte Serie und Saison doppelt gezeigt.

   Ohne Verweise: Eine Sammelseite für „Turniere" gibt es bewusst nicht,
   und ein Glied, das auf die eigene Seite zeigt, wäre eine Attrappe.
   ═══════════════════════════════════════════════════════════════════ */
.krume { width: 100%; }

.krume__liste {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.15rem 0.4rem;
  list-style: none;
  /* Der Abstand nach unten trennt zwei verschiedene Dinge und ist deshalb
     grösser als er beim Kicker war (0.45rem):

     Ein Kicker GEHÖRT zur Überschrift — eine Zeile, die sie einleitet, und
     enge Kopplung ist dort richtig. Eine Brotkrume ist ein eigenständiges
     Navigationselement; klebt sie an der Überschrift, liest sie sich wie
     deren erste Zeile.

     Gemessen: Die Krume hat auf dem Telefon eine 44 px hohe Zeilenbox, weil
     der Wähler darin ein Tippziel ist. Ein Abstand von 7 px darunter war
     ein Sechstel davon — die Überschrift wirkte angeklebt. */
  margin: 0 0 0.95rem;
  padding: 0;
  font-size: 0.72rem;
  line-height: 1.4;
}

.krume__glied {
  margin: 0;
  color: rgba(255, 255, 255, 0.72);
}

/* Trennzeichen als generierter Inhalt — es gehört zur Darstellung des
   Pfades, nicht zum Text der Glieder. */
.krume__glied + .krume__glied::before {
  content: "›";
  margin-right: 0.4rem;
  color: rgba(255, 255, 255, 0.38);
}

/* Das letzte Glied trägt die Ausgabe. Als Wähler bekommt es einen
   Rahmen — sonst wäre in einer Zeile aus schlichtem Text nicht zu
   erkennen, dass sich hier etwas bedienen lässt. */
.krume__glied--wahl {
  display: inline-flex;
  align-items: center;
}

.krume__marke {
  color: var(--accent-text-fade, rgba(252, 235, 25, 0.72));
  font-weight: var(--fw-semibold);
}

.krume__feld {
  appearance: none;
  -webkit-appearance: none;
  border: 1px solid rgba(255, 255, 255, 0.2);
  border-radius: var(--radius-pill);
  background-color: rgba(0, 0, 0, 0.3);
  color: #ffffff;
  font: inherit;
  font-weight: var(--fw-semibold);
  /* 44 px Tippziel nach WCAG 2.5.5. In einer 0.72rem-Zeile wäre das Feld
     sonst rund 20 px hoch — die Krume ist klein, der Wähler darin darf
     es nicht sein. Der Innenabstand trägt die Höhe, damit die Schrift
     zur übrigen Krume passt. */
  min-height: 44px;
  padding: 0 1.5rem 0 0.7rem;
  cursor: pointer;
  /* Eigener Pfeil, weil appearance:none den systemeigenen entfernt. */
  background-image:
    linear-gradient(45deg, transparent 50%, currentColor 50%),
    linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: calc(100% - 0.72rem) 55%, calc(100% - 0.44rem) 55%;
  background-repeat: no-repeat;
  background-size: 0.28rem 0.28rem, 0.28rem 0.28rem;
}

/* Die Auswahlliste zeichnet das Betriebssystem — dort gilt unser
   Weiß-auf-Schwarz nicht. */
.krume__feld option {
  background: var(--karte-flaeche);
  color: var(--glass-text);
}

.krume__feld:hover { border-color: rgba(255, 255, 255, 0.34); }

.krume__feld:focus-visible {
  outline: 2px solid var(--color-accent);
  outline-offset: 2px;
}

/* Auf dem Desktop bleibt die Zeile schlank: Dort wird gezielt, nicht
   getippt, und ein 44 px hohes Feld sprengte die Krume. */
@media (min-width: 768px) {
  .krume__feld {
    min-height: 0;
    padding: 0.1rem 1.4rem 0.14rem 0.62rem;
  }
}

/* Scroll-Pfeile der Reiterleisten.
   Sie haften per position:sticky an den Rändern der Leiste — bewusst ohne
   umhüllendes Element, damit das Kleben der Leiste selbst unberührt bleibt.
   Als Flex-Kinder nehmen sie Platz ein; passt alles ins Bild, entfallen sie
   per display:none und kosten nichts. */
.tabs__pfeil {
  position: sticky;
  z-index: 1;
  flex: 0 0 auto;
  align-self: stretch;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.9rem;
  padding: 0;
  border: 0;
  cursor: pointer;
  color: var(--tab-text);
  /* Deckend, damit die Reiter nicht darunter durchscheinen. Derselbe
     Schleier wie die Leiste, plus die Kartenfläche darunter. */
  background:
    linear-gradient(var(--leiste-aufschlag), var(--leiste-aufschlag)),
    var(--karte-flaeche);
}

.tabs__pfeil--links  { left: 0; }
.tabs__pfeil--rechts { right: 0; }

.tabs__pfeil.ist-verborgen { display: none; }

.tabs__pfeil:hover { color: var(--tab-text-active); }

.tabs__pfeil:focus-visible {
  outline: 2px solid var(--color-accent);
  outline-offset: -2px;
}

/* Weicher Übergang zu den Reitern, damit die Kante nicht hart abschneidet */
.tabs__pfeil--links::after,
.tabs__pfeil--rechts::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  width: 0.9rem;
  pointer-events: none;
}

.tabs__pfeil--links::after {
  left: 100%;
  background: linear-gradient(to right, var(--karte-flaeche), transparent);
}

.tabs__pfeil--rechts::after {
  right: 100%;
  background: linear-gradient(to left, var(--karte-flaeche), transparent);
}

/* Geklebte Leiste: erst jetzt braucht sie ein Material, weil Inhalt
   darunter durchläuft. Wird von vereinsmeisterschaft.js geschaltet. */
.tabs.ist-geklebt {
  background:
    linear-gradient(var(--leiste-aufschlag), var(--leiste-aufschlag)),
    rgba(var(--karte-rgb), var(--leiste-deckkraft));
  backdrop-filter: blur(34px);
  -webkit-backdrop-filter: blur(34px);
  box-shadow: 0 6px 16px -8px rgba(0, 0, 0, 0.55);
}

.tabs--filter .tab {
  border-radius: var(--radius-pill);
  padding: 0.5rem 0.85rem;
}
.tabs--filter .tab--active {
  background: var(--tab-aktiv-flaeche);
  color: #fff;
}
.tabs--filter .tab::after { content: none; }

.tabs--views .tab--active::after { background-color: var(--color-accent); }
.tabs--views .tab--active { background: transparent; }

.tab:focus-visible {
  box-shadow: 0 0 0 2px var(--color-accent);
  border-radius: var(--radius-pill);
}

.tabs::-webkit-scrollbar {
  height: 4px;
}

.tabs::-webkit-scrollbar-thumb {
  background-color: rgba(148, 163, 184, 0.9);
  border-radius: var(--radius-pill);
}

/* --- TAB-PANEL (Inhalte) --- */
.tab-panel {
  display: none;
  padding: 12px 12px 8px;
}

.tab-panel.tab-panel--active {
  display: block;
}

/* --- TABLES (Material Design Data Table) --- */
.table-wrapper,
.table-scroll {
  border-radius: var(--radius-sm);
  border: none;
  overflow: auto;
  background: rgba(255, 255, 255, 0.06);
  box-shadow: none;
}
/* .table-wrapper und .table-scroll führten eigene, hartkodierte Farben und
   wichen damit von .table ab. Jetzt speisen sich alle drei aus denselben
   --table-*-Tokens — eine Tabelle sieht auf jeder Seite gleich aus. */
.table-wrapper th,
.table-wrapper td,
.table-scroll th,
.table-scroll td {
  color: var(--table-text-color);
  border-color: var(--table-border-color);
}
.table-wrapper thead th,
.table-scroll thead th {
  background: var(--table-header-bg);
  color: var(--table-header-text-color);
}

.table,
table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.85rem;
}

thead {
  background-color: var(--color-surface-muted);
}

th,
td {
  padding: 8px 10px;
  text-align: left;
  border-bottom: 1px solid var(--color-border);
}

th {
  font-weight: var(--fw-semibold);
  font-size: 0.8rem;
  color: var(--color-text-secondary);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

tbody tr:hover {
  background-color: rgba(148, 163, 184, 0.12);
}

.cell-num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

.cell-self {
  background: var(--table-header-bg);
}

.cell-offen {
  background: var(--accent-tint);
}

/* Responsive Spaltenköpfe: Mobile zeigt kurzen Text, Desktop langen Text */
.th-long {
  display: none;
}
.th-short {
  display: inline;
}

@media (min-width: 768px) {
  .th-long {
    display: inline;
  }
  .th-short {
    display: none;
  }
}

/* ========== Kreuztabelle: Sticky Spalten + Scroll-Hinweis ========== */

/* ========== Teilnehmer: Nr.-Spalte kompakt ========== */

#tab-teilnehmer .table thead th:nth-child(1),
#tab-teilnehmer .table tbody td:nth-child(1) {
  width: 3rem;
  min-width: 3rem;
  text-align: center;
}

/* border-collapse:collapse + overflow:hidden auf .table--card brechen position:sticky in allen Browsern */
#tab-kreuztabelle {
  --col-nr-width: 2.5rem; /* Breite der Nr.-Spalte — als Anker für left-Offset der 2. Spalte */
}

#tab-kreuztabelle .table {
  border-collapse: separate;
  border-spacing: 0;
}

/* overflow:hidden von .table--card aufheben — sonst funktioniert sticky nie */
#tab-kreuztabelle .table--card {
  overflow: visible;
}

/* border-radius stattdessen direkt auf die Ecken der Kopfzeile legen */
#tab-kreuztabelle .table thead th:first-child {
  border-top-left-radius: var(--radius-md);
}

#tab-kreuztabelle .table thead th:last-child {
  border-top-right-radius: var(--radius-md);
}

/* Nr.-Spalte: klebt links am Rand */
#tab-kreuztabelle .table thead th:nth-child(1),
#tab-kreuztabelle .table tbody td:nth-child(1) {
  position: sticky;
  left: 0;
  z-index: 1;
  width: var(--col-nr-width);
  min-width: var(--col-nr-width);
  background: var(--vm-table-solid);
}

/* Teilnehmer-Spalte: klebt direkt nach der Nr.-Spalte */
#tab-kreuztabelle .ist-scrollbar .table thead th:nth-child(2),
#tab-kreuztabelle .ist-scrollbar .table tbody td:nth-child(2) {
  box-shadow: var(--sticky-schatten);
}

#tab-kreuztabelle .table thead th:nth-child(2),
#tab-kreuztabelle .table tbody td:nth-child(2) {
  position: sticky;
  left: var(--col-nr-width);
  z-index: 1;
  min-width: 8rem;
  background: var(--vm-table-solid);
  border-right: 2px solid var(--table-border-color);
}

/* Header-Zellen: eigene Hintergrundfarbe + höherer z-index, damit sie über Body-Zeilen liegen */
#tab-kreuztabelle .table thead th:nth-child(1),
#tab-kreuztabelle .table thead th:nth-child(2) {
  z-index: 2;
  background: var(--vm-thead-solid);
}

/* Ergebnis- und Zahlenspalten: eng und zentriert */
#tab-kreuztabelle .table .cell-num {
  text-align: center;
  padding-left: 0.3rem;
  padding-right: 0.3rem;
  min-width: 2rem;
}

/* Pkt.-Spalte: etwas breiter als Ergebnis-Spalten (Werte wie "5,5") */
#tab-kreuztabelle .table thead th:last-child,
#tab-kreuztabelle .table tbody td:last-child {
  padding-left: 0.5rem;
  padding-right: 0.5rem;
  min-width: 2.5rem;
}

/* ========== Rangliste: Sticky Spalten + Scroll-Hinweis ========== */



/* =========================================================
   SKELETON LOADING — Ladeindikator
   ========================================================= */
@keyframes skeleton-shimmer {
  0% {
    background-position: -400px 0;
  }
  100% {
    background-position: 400px 0;
  }
}

.skeleton {
  background: linear-gradient(90deg, var(--color-surface-muted) 25%, #e8eaed 50%, var(--color-surface-muted) 75%);
  background-size: 800px 100%;
  animation: skeleton-shimmer 1.4s ease-in-out infinite;
  border-radius: 4px;
  display: block;
}

.skeleton-item {
  display: grid;
  grid-template-columns: minmax(0, 180px) minmax(0, 1fr);
  gap: 1rem;
  padding: 0.75rem 0;
  border-bottom: 1px solid rgba(15, 23, 42, 0.08);
}

@media (max-width: 767px) {
  .skeleton-item {
    grid-template-columns: 1fr;
    gap: 0.4rem;
  }
}

.skeleton-item:last-child {
  border-bottom: none;
}
.skeleton-line {
  height: 0.85rem;
}
.skeleton-line--short {
  width: 60%;
}
.skeleton-line--medium {
  width: 80%;
}
.skeleton-line--long {
  width: 100%;
}
.skeleton-line + .skeleton-line {
  margin-top: 0.4rem;
}

/* ###################################################################################################### */
/* =========================================================
   RESPONSIVE: Breakpoints & Gerätegrößen – Strukturprinzipien
   ---------------------------------------------------------
   - Media Queries unterteilen das Layout klar nach Gerätegrößen (Smartphone bis Desktop).
   - Schriftgrößen, Containerbreiten und Abstände passen sich stufenweise an, 
     wodurch Lesbarkeit und Layout-Dichte auf jedem Gerät optimal bleiben.
   - Wrapper-Breiten und Paddings werden je nach Breakpoint granular gesteuert, 
     damit Inhalte weder gequetscht noch zu breit erscheinen.
   - Navigation und Menüführung wechseln vom Mobil- zum Desktop-Layout: 
     Burger-Menü verschwindet zugunsten einer voll sichtbaren horizontalen Navigation.
   - Alle Werte für Container, Schrift und Navigation sind zentral steuerbar – 
     Anpassungen am Responsive-Verhalten sind gezielt und nachvollziehbar möglich.
   ========================================================= */

/* Tablet aufwärts */
@media (min-width: 768px) {
  /* INHALTSBEREICHE */
  .site-header__content-wrapper,
  .main__content-wrapper,
  .site-footer__content-wrapper {
    max-width: var(--content-container-max-width-768);
    width: var(--content-container-width-768);
    padding: var(--content-container-padding-v-768) var(--content-container-padding-h-768);
  }

  :root {
    --card-padding: 1rem 1rem;
  }

  /* PAGE-CARD */
  .page-card__title {
    font-size: 1.5rem;
  }

  .list-item {
    grid-template-columns: minmax(0, 180px) minmax(0, 1fr);
    gap: 1rem;
  }
}

/* Kleine Desktops/Laptops */
@media (min-width: 1024px) {
  /* INHALTSBEREICHE */
  .site-header__content-wrapper,
  .main__content-wrapper,
  .site-footer__content-wrapper {
    max-width: var(--content-container-max-width-1024);
    width: var(--content-container-width-1024);
    padding: var(--content-container-padding-v-1024) var(--content-container-padding-h-1024);
  }

}

/* OPTIONAL: Große Bildschirme: ab 1200px */
@media (min-width: 1200px) {
  /* INHALTSBEREICHE */
  .site-header__content-wrapper,
  .main__content-wrapper,
  .site-footer__content-wrapper {
    max-width: var(--content-container-max-width-1200);
    width: var(--content-container-width-1200);
    padding: var(--content-container-padding-v-1200) var(--content-container-padding-h-1200);
  }

  :root {
    --card-padding: 1.25rem 1.1rem;
  }

}

/* --- Responsive Table --- */
/* Mobile-First: Compact table for small screens */
:root {
  --table-font-size: 0.82rem;
  --table-padding: 6px 8px;
}

.table-wrapper {
  font-size: var(--table-font-size);
}

th,
td {
  padding: var(--table-padding);
}

/* Ab Tablet (768px): Standard table spacing */
@media (min-width: 768px) {
  :root {
    --table-font-size: 1rem;
    --table-padding: 10px 12px;
  }
}

/* =========================================================
   NEWS – Seiten-spezifische Styles
   TODO: news.html noch nicht implementiert (Navigation auskommentiert)
         CSS bleibt für spätere Migration erhalten
   ========================================================= */

.news-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-md);
  margin-top: var(--space-xl);
}

@media (min-width: 768px) {
  .news-grid {
    grid-template-columns: 1fr 1fr;
  }
}

.news-card--featured {
  background: linear-gradient(135deg, var(--color-accent), var(--color-surface));
}

.news-meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-xs);
  align-items: center;
  margin-bottom: var(--space-xxs);
  font-size: var(--type-meta);
  color: var(--color-text-secondary);
}

.news-meta__date {
  font-variant-numeric: tabular-nums;
}

.news-meta__category {
  padding: var(--space-xxs) var(--space-xs);
  border-radius: var(--chip-radius);
  background: var(--filter-input-bg);
}

/* .news-meta__badge → ersetzt durch .meta-badge (M-01) */

.news-actions {
  margin-top: auto;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--space-xs);
}

.news-year {
  font-size: var(--type-meta);
  color: var(--filter-input-placeholder-color);
}

.news-empty {
  grid-column: 1 / -1;
  color: var(--color-text-secondary);
  font-size: var(--type-body);
  padding: var(--space-md) 0;
}

.news-detail[aria-hidden="true"] {
  display: none;
}

.news-detail[aria-hidden="false"] {
  display: block;
}

/* =========================================================
   VEREIN – Seiten-spezifische Styles
   TODO: verein.html noch nicht implementiert (Navigation auskommentiert)
         CSS bleibt für spätere Migration erhalten
   ========================================================= */

.ueber-uns-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--space-xl);
  align-items: flex-start;
}

.ueber-uns-grid > * {
  min-width: 0;
}

@media (min-width: 768px) {
  .ueber-uns-grid {
    grid-template-columns: minmax(0, 2fr) minmax(0, 1.6fr);
  }
}

.timeline {
  list-style: none;
  margin: 0;
  padding: var(--space-xs) 0 0 var(--space-xxs);
  border-left: var(--timeline-border-width) solid var(--color-surface-muted);
}

.timeline__item {
  position: relative;
  padding-left: var(--space-2xl);
  margin-bottom: var(--timeline-gap);
}

.timeline__item::before {
  content: "";
  position: absolute;
  left: var(--timeline-dot-left);
  top: var(--timeline-dot-top);
  width: var(--timeline-dot-size);
  height: var(--timeline-dot-size);
  border-radius: 50%;
  background-color: var(--color-surface);
  border: var(--timeline-border-width) solid var(--color-primary);
  box-shadow: var(--timeline-dot-shadow);
}

.timeline__year {
  font-size: var(--type-meta);
  font-weight: var(--fw-semibold);
  color: var(--color-primary-strong);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  margin-bottom: var(--space-xxs);
}

.timeline__content h3 {
  margin: 0;
  font-size: var(--type-card-title);
}

.timeline__content p {
  margin: var(--space-xxs) 0 0;
  font-size: var(--type-card-body);
  color: var(--color-text-secondary);
}

.location-list {
  display: flex;
  flex-direction: column;
  gap: var(--stack-gap);
}

.location-card h3 {
  margin: 0 0 var(--space-xxs);
  font-size: var(--type-card-title);
}

.location-card p {
  margin: var(--space-xxs) 0;
  font-size: var(--type-card-body);
  color: var(--color-text-secondary);
}

.contact-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(var(--grid-min-col), 1fr));
  gap: var(--stack-gap);
}

.contact-card h3 {
  margin: 0 0 var(--space-xxs);
  font-size: var(--type-card-body);
  font-weight: var(--fw-semibold);
  color: var(--color-text-secondary);
}

.contact-card__name {
  margin: 0 0 var(--space-xxs);
  font-weight: var(--fw-semibold);
}

.contact-card a {
  text-decoration: none;
}

.contact-card a:hover {
  text-decoration: underline;
}

/* =========================================================
   VEREINSMEISTERSCHAFT – Seiten-spezifische Styles
   ========================================================= */

.section-title {
  font-size: var(--type-body);
  font-weight: var(--fw-semibold);
  margin: 0 0 var(--space-xs);
}

.section-meta {
  font-size: var(--type-meta);
  color: var(--color-text-secondary);
  margin: 0 0 var(--space-xxs);
}

.round-section {
  padding: var(--space-md) 0;
}

.round-section + .round-section {
  border-top: 1px solid var(--color-border);
}

.round-section:first-child {
  padding-top: 0;
}

.round-section__header {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin-bottom: var(--space-xs);
}

@media (min-width: 768px) {
  .round-section__header {
    flex-direction: row;
    justify-content: space-between;
    align-items: baseline;
    gap: var(--space-xs);
  }
}

.round-section__title {
  font-size: 0.9rem;
  font-weight: var(--fw-semibold);
  margin: 0;
  color: var(--color-text-primary);
}

@media (min-width: 768px) {
  .round-section__title {
    font-size: var(--card-subtitle-font-size);
  }
}

.round-section__meta {
  font-size: var(--type-small);
  color: var(--color-text-secondary);
  margin: 0;
}

/* =========================================================
   SEITEN-INTRO (chronik.html)
   TODO: chronik.html noch nicht implementiert
         CSS bleibt für spätere Migration erhalten
   ========================================================= */

.page-intro {
  background: rgba(10, 16, 40, 0.6);
  color: var(--color-surface);
  padding: var(--space-xl) 0;
}

.page-intro__content-wrapper {
  max-width: var(--content-container-max-width-1200);
  width: var(--content-container-width-1200);
  margin: 0 auto;
  padding: 0 var(--content-container-padding-h-320);
}

.page-intro__title {
  margin: 0;
  color: var(--color-surface);
}

.page-intro__subtitle {
  margin: var(--space-xs) 0 0;
  font-size: var(--type-card-title);
  color: rgba(255, 255, 255, 0.8);
}

/* =========================================================
   CARD-INHALTE (verein.html, news.html)
   ========================================================= */

.card__title {
  margin: 0 0 var(--space-xxs);
  font-size: 1rem;
  font-weight: var(--fw-semibold);
}

.card__subtitle {
  margin: 0 0 var(--space-xs);
  font-size: var(--type-card-body);
  color: var(--color-text-secondary);
}

.card__hint {
  margin: var(--space-xs) 0 0;
  font-size: var(--type-small);
  color: var(--color-text-secondary);
}

.card__actions {
  margin-top: var(--space-md);
  display: flex;
  gap: var(--space-xs);
  align-items: center;
}

/* =========================================================
   RECHTE SPALTE (verein.html)
   ========================================================= */

.right-column {
  display: flex;
  flex-direction: column;
  gap: var(--stack-gap);
}

/* =========================================================
   IMPRESSUM (impressum.html)
   ========================================================= */

.contactblock {
  font-style: normal;
  margin-bottom: var(--space-md);
}

.contactblock p {
  margin: 0 0 var(--space-xs);
}

.contact-list {
  margin: 0 0 var(--space-md);
  padding-left: var(--space-xl);
}

.contact-list li {
  margin-bottom: var(--space-xxs);
}

/* =========================================================
   LEERE ZUSTÄNDE (termine.html)
   ========================================================= */

.events__empty {
  padding: var(--space-md) 0;
  color: var(--color-text-secondary);
  font-size: var(--type-body);
}

/* ============================================================
   HEADER
   ============================================================ */
/* =========================================================
   HEADER – Flexibles, mobiles Navigations- und Branding-Element
   ---------------------------------------------------------
   - Schmale Kopfzeile mit Logo, Titel und Menü für alle Geräte.
   - Flexbox sortiert Branding und Navigation nebeneinander.
   - Navigation ist per Burger-Icon mobil als Dropdown verfügbar.
   - Alle Größen, Abstände und Farben werden über Theme-Variablen gesteuert.
   ========================================================= */
/* ---------------------------------------------------------
   1. Gerüst: Außencontainer + Inhaltszeile
   --------------------------------------------------------- */
.site-header {
  position: sticky; /* bleibt beim Scrollen sichtbar; Dropdown (position:absolute) bleibt am Header ausgerichtet */
  top: 0;
  z-index: var(--header-z-index); /* über Backdrop (999) und Dropdown (1000) */
  width: 100%;
  min-height: var(--header-height);
  height: var(--header-height);
  background: var(--header-bg-color);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  color: var(--header-font-color);
  border-bottom: 1px solid var(--header-border-b-color);
  box-shadow: var(--header-shadow);
}

.site-header__content-wrapper {
  display: flex;
  flex-wrap: nowrap; /* Burger darf nie auf eine zweite Zeile rutschen */
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  height: 100%;
  padding-block: var(--header-content-wrapper-padding-v);
}

/* ---------------------------------------------------------
   2. Branding: Logo + zweizeiliger Titel
   --------------------------------------------------------- */
.nav-branding {
  display: flex;
  align-items: center;
  gap: var(--header-branding-gap);
  min-width: 0; /* erlaubt Schrumpfen → Ellipsis bei engen Viewports */
  color: var(--header-title-color);
  font-weight: var(--header-title-font-weight);
  text-decoration: none;
  border-radius: var(--radius-xs);
}

.nav-logo {
  height: var(--header-logo-height);
  width: auto;
  display: block;
  flex-shrink: 0;
  background: rgba(255, 255, 255, 0.95);
  border-radius: var(--radius-xs);
  padding: 3px;
}

.site-title-group {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 1px;
  min-width: 0; /* Shrinking-Kontext für Ellipsis der Kinder */
}

/* Variante A — gestapeltes Lockup: Akzentzeile „Abteilung Schach" über der
   Wortmarke „Krostitzer Sportverein". Beide einzeilig (nowrap), nie abschneiden. */
.site-title {
  margin: 0;
  font-size: var(--header-title-size-320);
  font-weight: var(--header-title-font-weight);
  line-height: 1.12;
  color: var(--header-title-color);
  white-space: nowrap;
}

.site-title-kicker {
  font-size: var(--header-kicker-size-320);
  font-weight: var(--fw-bold);
  line-height: 1.25;
  letter-spacing: var(--header-kicker-letter-spacing);
  text-transform: uppercase;
  color: var(--header-kicker-color);
  white-space: nowrap;
}

/* ---------------------------------------------------------
   3. Burger-Button (nur < 768px sichtbar)
   Zustand wird ausschließlich über aria-expanded gesteuert.
   --------------------------------------------------------- */
.burger {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: var(--burger-size);
  height: var(--burger-size);
  /* schiebt den Burger an den rechten Rand — das leere <nav> (0 Breite) sitzt
     bündig dahinter, statt den space-between-Slot zu belegen */
  margin: 0 0 0 auto;
  padding: 0;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: inherit;
  cursor: pointer;
  transition: background 0.2s ease;
  -webkit-tap-highlight-color: transparent;
}

.burger:hover {
  background: var(--burger-hover-bg);
}

.burger__box {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--burger-line-gap);
}

.burger__line {
  display: block;
  width: var(--burger-line-width);
  height: var(--burger-line-height);
  border-radius: 2px;
  background: var(--burger-menu-color);
  transform-origin: center;
  transition: var(--header-burger-transition);
}

/* Burger → X, sobald geöffnet (aria-expanded=true) */
.burger[aria-expanded="true"] .burger__line:nth-child(1) {
  transform: translateY(8px) rotate(45deg);
}
.burger[aria-expanded="true"] .burger__line:nth-child(2) {
  opacity: 0;
  transform: scaleX(0);
}
.burger[aria-expanded="true"] .burger__line:nth-child(3) {
  transform: translateY(-8px) rotate(-45deg);
}

/* ---------------------------------------------------------
   4. Backdrop (per header.js erzeugt, via [hidden] gesteuert)
   --------------------------------------------------------- */
.nav-backdrop {
  position: fixed;
  inset: var(--header-height) 0 0 0;
  background: var(--header-backdrop-bg);
  z-index: var(--header-backdrop-z-index);
  cursor: pointer;
}
.nav-backdrop[hidden] {
  display: none;
}

/* ---------------------------------------------------------
   5. Navigationsliste — Mobile-First: Dropdown unter dem Header
   --------------------------------------------------------- */
.nav__list {
  z-index: var(--header-nav-z-index);
  display: none; /* eingeblendet, wenn der Burger aria-expanded=true ist */
  flex-direction: column;
  position: absolute;
  top: 100%;
  left: 0;
  width: 100%;
  margin: 0;
  padding: var(--header-nav-container-padding-v-320) var(--header-nav-container-padding-h-320);
  background: var(--header-nav-panel-bg);
  border-top: 1px solid var(--header-border-b-color);
  box-shadow: var(--shadow-nav);
  list-style: none;
  overflow: hidden;
}

/* Öffnen: Burger und Nav sind Geschwister → allgemeiner Geschwisterselektor */
.burger[aria-expanded="true"] ~ .nav__links-container .nav__list {
  display: flex;
}

@media (prefers-reduced-motion: no-preference) {
  .burger[aria-expanded="true"] ~ .nav__links-container .nav__list {
    animation: menuSlideDown 0.2s ease;
  }
}

@keyframes menuSlideDown {
  from { opacity: 0; transform: translateY(-8px); }
  to   { opacity: 1; transform: translateY(0); }
}

.nav__item {
  position: relative;
  padding: var(--header-nav-item-padding-v-320) var(--header-nav-item-padding-h-320);
  transition: background 0.15s ease;
}

.nav__link {
  display: block;
  color: var(--header-nav-link-color);
  font-size: var(--header-nav-link-size-320);
  font-weight: var(--header-nav-font-weight);
  letter-spacing: var(--header-nav-link-letter-spacing);
  text-decoration: none;
  text-shadow: var(--header-link-text-shadow);
  transition: var(--header-link-transition);
}

/* Hover/Fokus: nur Farbe + dezenter Lift — kein Unterstrich (überschreibt
   die globale a:hover-Regel) und keine letter-spacing-Reflows.
   Der Unterstrich bleibt exklusiv dem aktiven Punkt vorbehalten. */
.nav__link:hover,
.nav__link:focus-visible {
  color: var(--header-nav-link-hover-color);
  text-decoration: none;
  transform: translateY(var(--header-link-hover-translate-y));
}

.nav__link.active {
  color: var(--header-nav-link-active-color);
  font-weight: var(--header-nav-link-active-font-weight);
}

/* Sichtbarer Tastatur-Fokus für alle interaktiven Header-Elemente */
.nav-branding:focus-visible,
.burger:focus-visible,
.nav__link:focus-visible {
  outline: 2px solid var(--header-focus-ring);
  outline-offset: var(--header-focus-ring-offset);
}

/* Body-Scroll-Lock bei offenem Menü (header.js setzt die Klasse) */
body.is-nav-open {
  overflow: hidden;
}

/* Mobile: aktiver Eintrag dezent hinterlegt (kein Balken) */
/* Mobile-Dropdown: aktiver Eintrag = gelber Akzentbalken links + dezenter Tint
   (konsistent mit dem gelben Aktiv-Unterstrich auf dem Desktop). */
@media (max-width: 767px) {
  .nav__item:hover {
    background: var(--header-nav-hover-bg);
  }
  .nav__item:has(> .nav__link.active) {
    background: var(--header-nav-active-bg);
  }
  .nav__item:has(> .nav__link.active)::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 4px;
    background: var(--header-nav-accent);
    border-radius: 0 2px 2px 0;
  }
}

/* =========================================================
   HEADER · RESPONSIVE (Mobile-First, min-width)
   ========================================================= */

/* Smartphone Querformat: 481px+ */
@media (min-width: 481px) {
  .site-title {
    font-size: var(--header-title-size-481);
  }
  .site-title-kicker {
    font-size: var(--header-kicker-size-481);
  }
  .nav__list {
    padding: var(--header-nav-container-padding-v-481) var(--header-nav-container-padding-h-481);
  }
  .nav__item {
    padding: var(--header-nav-item-padding-v-481) var(--header-nav-item-padding-h-481);
  }
}

/* Desktop: 768px+ — Burger weg, Navigation wird zur horizontalen Leiste */
@media (min-width: 768px) {
  .burger {
    display: none;
  }
  /* nur die Nav-Links werden kompakter — die Wortmarke bleibt bei 18px */
  .nav__link {
    font-size: var(--header-nav-link-size-768);
  }
  .nav__list {
    display: flex;
    flex-direction: row;
    position: static;
    width: auto;
    background: transparent;
    border-top: none;
    box-shadow: none;
    overflow: visible;
    padding: var(--header-nav-container-padding-v-768) var(--header-nav-container-padding-h-768);
  }
  .nav__item {
    padding: var(--header-nav-item-padding-v-768) var(--header-nav-item-padding-h-768);
  }
  /* Aktiver Link: Text neutral, gelber Unterstrich trägt das Signal */
  .nav__link.active {
    color: var(--header-nav-link-active-color-desktop);
  }
  .nav__item:has(> .nav__link.active)::after {
    content: "";
    position: absolute;
    bottom: 0;
    left: var(--header-nav-item-padding-h-768);
    right: var(--header-nav-item-padding-h-768);
    height: 3px;
    background: var(--header-nav-accent);
    border-radius: 2px 2px 0 0;
  }
}

/* Großer Desktop: 1200px+ — keine Header-Schriftänderung mehr.
   Titel bleibt konstant 18px, Nav-Links 14,4px (siehe entkoppelte Token-Rollen). */

/* ---------------------------------------------------------
   6. Dropdown-Navigation (Konzept C: Hybrid-Leiste)
      .nav__item--has-dropdown  Listenitem mit Untermenü
      .nav__toggle              <button> als sichtbarer Trigger (ersetzt <a>)
      .nav__caret               Pfeil-Icon, dreht sich bei is-open
      .nav__dropdown            Panel, mobile inline, Desktop absolut
      .nav__dropdown-link       Eintrag im Panel (Titel + optional Beschreibung)
      .nav__dropdown-hr         Trennlinie zwischen Gruppen
      .nav__dropdown-group      Gruppen-Label (z. B. „Archiv")
   --------------------------------------------------------- */
.nav__item--has-dropdown {
  position: relative;
}

/* Toggle-Button: identisches Look-and-Feel wie .nav__link */
.nav__toggle {
  display: flex;
  align-items: center;
  gap: 0.28em;
  width: 100%;
  background: none;
  border: none;
  cursor: pointer;
  text-align: left;
  color: var(--header-nav-link-color);
  font-family: inherit;
  font-size: var(--header-nav-link-size-320);
  font-weight: var(--header-nav-font-weight);
  letter-spacing: var(--header-nav-link-letter-spacing);
  text-shadow: var(--header-link-text-shadow);
  transition: var(--header-link-transition);
  padding: 0;
}

.nav__toggle:hover,
.nav__toggle:focus-visible {
  color: var(--header-nav-link-hover-color);
  text-decoration: none;
}

.nav__toggle.active {
  color: var(--header-nav-link-active-color);
  font-weight: var(--header-nav-link-active-font-weight);
}

.nav__toggle:focus-visible {
  outline: 2px solid var(--header-focus-ring);
  outline-offset: var(--header-focus-ring-offset);
  border-radius: var(--radius-xs);
}

/* Verweis + eigener Pfeilknopf nebeneinander.

   Der ältere Entwurf ersetzte den Verweis durch einen reinen Aufklappknopf
   (.nav__toggle, unten weiterhin definiert). Damit war der Menüpunkt selbst
   kein Ziel mehr — man musste immer erst aufklappen. Auf der Seite, die
   während der Saison fünfzehnmal aufgerufen wird, ist das ein Klick zu viel.

   Deshalb hier zwei Bedienelemente: der Verweis führt zum Turnier, der Pfeil
   öffnet die Liste. Getrennt sein MÜSSEN sie, weil ein Fingertipp sonst nur
   eines von beidem auslösen könnte. */
.nav__zeile {
  display: flex;
  align-items: center;
  gap: 0.1rem;
}

.nav__zeile .nav__link { flex: 1 1 auto; }

.nav__caret-btn {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* Die Breite bleibt schmal, damit der Verweis daneben das größere Ziel
     behält — er ist der häufigere Weg. Die Mindesthöhe nach WCAG 2.5.5
     steht weiter unten und gilt nur unter 768 px: Der Header ist 60 px hoch,
     ein 44-px-Knopf plus Innenabstand des Menüpunkts sprengt ihn auf dem
     Desktop. Dort wird ohnehin mit der Maus gezielt. */
  width: 2.1rem;
  align-self: stretch;
  padding: 0;
  background: none;
  border: none;
  cursor: pointer;
  color: var(--header-nav-link-color);
  transition: var(--header-link-transition);
}

.nav__caret-btn:hover { color: var(--header-nav-link-hover-color); }

.nav__caret-btn:focus-visible {
  outline: 2px solid var(--header-focus-ring);
  outline-offset: -2px;
  border-radius: var(--radius-xs);
}

/* Der dekorative Winkel im Verweis — nur auf dem Desktop.
   Dicht am Wort (0.28em), zurückgenommen (Deckkraft 0.5): Er sagt „hier geht
   es weiter", ohne sich in den Vordergrund zu drängen. Auf dem Telefon
   entfällt er, dort ist der Knopf das sichtbare Element. */
.nav__winkel {
  display: none;
  margin-left: 0.28em;
  opacity: 0.5;
  vertical-align: 0.06em;
  transition: opacity 0.18s ease, transform 0.18s ease;
}

.nav__item--has-dropdown.is-open .nav__winkel {
  opacity: 0.9;
  transform: rotate(180deg);
}

.nav__caret {
  opacity: 0.7;
  display: inline-block;
  transition: transform 0.18s ease;
}

.nav__item--has-dropdown.is-open .nav__caret {
  transform: rotate(180deg);
}

/* Mobile: Dropdown klappt inline unter dem Toggle auf */
.nav__dropdown {
  display: none;
  flex-direction: column;
  padding: 0.2rem 0 0.15rem 1rem;
}

.nav__item--has-dropdown.is-open .nav__dropdown {
  display: flex;
}

.nav__dropdown-link {
  display: flex;
  flex-direction: column;
  gap: 1px;
  padding: 0.5rem 0.5rem;
  border-radius: var(--radius-sm);
  text-decoration: none;
  color: var(--header-nav-link-color);
  font-size: var(--type-sm);
  transition: background 0.15s ease, color 0.15s ease;
}

.nav__dropdown-link:hover,
.nav__dropdown-link:focus-visible {
  background: var(--header-nav-hover-bg);
  color: var(--header-nav-link-hover-color);
  text-decoration: none;
}

.nav__dropdown-link:focus-visible {
  outline: 2px solid var(--header-focus-ring);
  outline-offset: var(--header-focus-ring-offset);
}

.nav__dropdown-link strong {
  font-weight: var(--fw-semibold);
}

.nav__dropdown-link small {
  font-size: 0.69rem;
  opacity: 0.6;
}

.nav__dropdown-hr {
  border: none;
  border-top: 1px solid var(--header-border-b-color);
  margin: 0.3rem 0.5rem;
}

.nav__dropdown-group {
  display: block;
  font-size: 0.6rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--header-nav-link-color);
  opacity: 0.5;
  padding: 0.4rem 0.5rem 0.1rem;
}

/* Mobile: aktiver Menüpunkt — gleiches Muster wie ein flacher .nav__link */
@media (max-width: 767px) {
  /* Erst hier die Mindesthöhe nach WCAG 2.5.5: Im aufgeklappten Burger-Menü
     ist der Pfeil ein Tippziel, und die Menüpunkte stehen untereinander —
     Platz ist genug. Im 60 px hohen Desktop-Header wäre er zu hoch. */
  .nav__caret-btn { min-height: 44px; }

  .nav__item--has-dropdown:has(.nav__link.active) {
    background: var(--header-nav-active-bg);
  }
  .nav__item--has-dropdown:has(.nav__link.active)::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 4px;
    background: var(--header-nav-accent);
    border-radius: 0 2px 2px 0;
  }
  .nav__item--has-dropdown:hover {
    background: var(--header-nav-hover-bg);
  }
}

/* Desktop: Dropdown als absolut positioniertes Panel */
@media (min-width: 768px) {
  .nav__toggle {
    font-size: var(--header-nav-link-size-768);
  }

  /* Kein Knopf auf dem Desktop. Das Überfahren öffnet, der Fokus öffnet —
     ein zusätzliches Bedienelement daneben hätte keine Aufgabe mehr und
     stand als abgesetzter Pfeil neben dem Wort. Chess.com zeigt neben seinen
     Menüpunkten überhaupt keinen Pfeil; lichess öffnet ebenfalls beim
     Überfahren. Geblieben ist der schmucklose Winkel IM Verweis. */
  .nav__caret-btn { display: none; }
  .nav__winkel { display: inline-block; }

  .nav__dropdown {
    position: absolute;
    top: calc(100% + 6px);
    left: 50%;
    /* Zentrierung über translate, nicht über transform.

       Das Panel wurde mit transform: translateX(-50%) zentriert, und
       menuSlideDown setzt transform: translateY(…) — das ERSETZT die
       Zentrierung, statt sie zu ergänzen. Beim Öffnen stand das Panel
       deshalb um seine halbe Breite zu weit rechts und sprang am Ende der
       Animation nach links. Genau das wirkte unruhig.

       translate ist eine eigene Eigenschaft und wird vor transform
       angewandt; beide gelten nebeneinander. */
    translate: -50% 0;
    z-index: var(--header-nav-z-index);
    min-width: 220px;
    background: var(--header-nav-panel-bg);
    border: 1px solid var(--header-border-b-color);
    border-radius: var(--radius-md);
    padding: 0.35rem;
    box-shadow: 0 16px 36px -10px rgba(0, 0, 0, 0.6);
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
  }

  .nav__item--has-dropdown.is-open .nav__dropdown {
    display: flex;
    animation: menuSlideDown 0.18s ease;
  }

  .nav__dropdown-link {
    font-size: 0.82rem;
    padding: 0.48rem 0.65rem;
  }

  /* Aktiver Menüpunkt: gelber Unterstrich unter Verweis UND Pfeil */
  /* Der Unterstrich gehört unter die Beschriftung, nicht unter den ganzen
     Menüpunkt.

     Vorher spannte er sich über das gesamte <li> — also über „Turniere",
     den Zwischenraum UND den Pfeilknopf. Das wirkte wie ein Strich, der ins
     Leere läuft: Er markiert die aktive Seite, der Pfeil ist aber ein
     Bedienelement und keine Seite. Jetzt markiert der Strich genau das, was
     er meint, und der Pfeil steht sichtbar daneben. */
  .nav__item--has-dropdown:has(.nav__link.active) .nav__link {
    position: relative;
  }

  .nav__item--has-dropdown:has(.nav__link.active) .nav__link::after {
    content: "";
    position: absolute;
    bottom: calc(var(--header-nav-item-padding-v-768, 0.5rem) * -1);
    left: 0;
    right: 0;
    height: 3px;
    background: var(--header-nav-accent);
    border-radius: 2px 2px 0 0;
  }

  /* Ein unsichtbarer Streifen überbrückt die Lücke zwischen Menüpunkt und
     Panel.

     Das Panel liegt 6 px darunter. Ohne diesen Streifen verlässt der Zeiger
     auf dem Weg nach unten kurz beide Flächen, das Menü schließt, und man
     kommt nie an den Einträgen an — der klassische Ärger mit
     Überfahr-Menüs. Der Streifen gehört zum Panel und damit zum Menüpunkt,
     also bleibt der Weg lückenlos. */
  .nav__item--has-dropdown.is-open .nav__dropdown::before {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: -8px;
    height: 8px;
  }
}

/* ============================================================
   FOOTER
   ============================================================ */
/* =========================================================
  FOOTER – Mobile First
   ---------------------------------------------------------
   - Der Footer gliedert sich klar in Info-Bereich (Copyright) und Navigation.
   - Flexbox richtet alle Inhalte zentriert und untereinander aus.
   - Navigationslinks werden als horizontale Linkgruppe mit ausreichendem Abstand ausgegeben.
   - Alle Schriftgrößen und Distanzen sind als Variablen steuerbar – Anpassung für verschiedene Geräte ist leicht möglich.
   - Hover und Fokus sichern barrierefreie Navigation und hohe Erkennbarkeit von Links.
   ========================================================= */
/* Außencontainer */
.site-footer {
  background: rgba(4, 3, 14, 0.82);
  border-top: 1px solid var(--glass-surface);
  box-shadow: none;
  color: var(--footer-font-color);
}
/* Inhaltscontainer */
.site-footer__content-wrapper {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 0.35rem;
  align-items: center;
  /* fix(weg1): feste --*-1200-Tokens entfernt → Footer folgt nun denselben
     responsiven Container-Tokens wie Header/Main (Mobile 100% … Desktop 900px)
     über die gruppierten Regeln + Breakpoint-@media. So bleibt er überall bündig. */
  margin-left: auto;
  margin-right: auto;
  padding-left: 1rem;
  padding-right: 1rem;
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
}

/* Info-Bereich (Copyright) */
.footer-copyright {
  margin: 0;
  font-size: 0.78rem;
  color: var(--footer-font-color);
}

/* Footer-Navigation (Linkgruppe) */
.footer-nav {
  display: flex;
  justify-content: center;
}
.footer-nav ul {
  display: flex;
  align-items: center;
  gap: 1.25rem;
  flex-wrap: wrap;
  list-style: none;
  margin: 0;
  padding: 0;
}
/* Link-Separator (standardmäßig ausgeblendet) */
.footer-sep {
  display: none;
}
/* Footer-Links */
.footer-nav a {
  color: var(--footer-nav-link-color);
  font-size: var(--footer-nav-item-size);
  letter-spacing: var(--footer-nav-link-letter-spacing);
  min-height: var(--footer-nav-item-min-height);
  padding: var(--footer-nav-item-padding-v) var(--footer-nav-item-padding-h);
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-color: rgba(255, 255, 255, 0.3);
  transition:
    color 0.2s ease,
    text-decoration-color 0.2s ease,
    transform 0.15s ease;
  display: inline-flex;
  align-items: center;
}
/* Effekt bei Maus oder Tastaturfokus */
.footer-nav a:hover,
.footer-nav a:focus-visible {
  color: var(--footer-nav-link-hover-color);
  text-decoration-color: rgba(255, 255, 255, 0.6);
  transform: translateY(var(--header-link-hover-translate-y));
}

/* =========================================================
   RESPONSIVE – Mobile First (min-width only)
   ========================================================= */

/* Smartphones Querformat: 481px+ — Separator einblenden */
@media (min-width: 481px) {
  .footer-sep {
    display: inline-block;
    user-select: none;
    color: var(--footer-font-color);
    opacity: 0.5;
  }
}

/* Tablets: 768px+ — Footer einzeilig, Split-Layout */
@media (min-width: 768px) {
  .site-footer__content-wrapper {
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
    text-align: left;
    gap: 0;
  }
  .footer-nav {
    justify-content: flex-end;
  }
}

/* Desktop: 1024px+ */
@media (min-width: 1024px) {
  .site-footer__content-wrapper {
    padding: var(--footer-content-container-padding-v) var(--content-container-padding-h-1024);
  }
}

/* Maus/Trackpad: kein Touch-Target-Minimum nötig, unabhängig von der Viewport-Breite */
@media (pointer: fine) {
  .footer-nav a {
    min-height: auto;
  }
}

/* ═══════════════════════════════════════════════════════════════
   GLASFELD DESIGN — Glasmorphism-Komponenten
   Listen, Zeilen, Beschriftungen, Text-Seiten
   ═══════════════════════════════════════════════════════════════ */

/* ── Mannschaften-/Termine-Liste ─────────────────────────────── */
.team-list {
  background: transparent;
  border: none;
  box-shadow: none;
}

.team-row {
  background: transparent;
  border: none;
  border-bottom: 1px solid var(--glass-hairline);
  border-radius: 0;
  margin-bottom: 0;
  box-shadow: none;
}

.team-row:last-child {
  border-bottom: none;
  border-radius: 0;
}

.mannschaften-card .team-row__name {
  color: var(--glass-text);
}

.mannschaften-card .team-row__liga {
  color: rgba(185, 195, 235, 0.9);
}

.mannschaften-card .team-row__badge {
  background: rgba(50, 40, 130, 0.25);
  border-color: var(--primary-border-md);
  color: rgba(190, 182, 255, 0.96);
}

.mannschaften-card .team-row__badge--youth {
  background: var(--accent-tint);
  border-color: var(--accent-border);
  color: rgba(255, 240, 80, 0.98);
}

.mannschaften-card .btn--assist,
.termine-card .btn--assist {
  background: var(--glass-surface);
  border-color: var(--glass-surface-mid);
  color: rgba(175, 185, 225, 0.75);
  box-shadow: none;
}

.mannschaften-card .btn--assist:hover,
.termine-card .btn--assist:hover {
  background: var(--glass-surface-mid);
  border-color: rgba(255, 255, 255, 0.18);
  color: rgba(210, 218, 250, 0.9);
}

/* ── Termin-Items ─────────────────────────────────────────────── */
.ev-item {
  background: transparent;
  border-radius: 0;
  margin-bottom: 0;
  box-shadow: none;
  border-bottom: 1px solid var(--glass-hairline);
}

.ev-item:last-child {
  border-bottom: none;
}

/* Letzter Termin eines Monats: der folgende Monats-Trenner setzt die Linie
   bereits — eine zweite Trennlinie direkt darüber wäre doppelt. */
.ev-item:has(+ .ev-msep) {
  border-bottom: none;
}

/* ── Sektions-Labels und Trennlinie ──────────────────────────── */
/* „Erwachsene" und „Jugend". Seit sie h2 sind (WCAG 1.3.1: optisch Über-
   schriften, im Markup vorher Absätze), müssen Größe, Gewicht, Zeilenhöhe und
   Abstand ausdrücklich stehen — sonst greift die globale h2-Regel und macht
   aus 16 px/400 plötzlich 28 px/700. Die Werte sind die des früheren Absatzes,
   das Aussehen bleibt damit unverändert. */
.team-section__label,
.page-card__body .team-section__label {
  color:         var(--accent-text-fade);
  font-size:     1rem;
  font-weight:   var(--fw-regular);
  line-height:   1.4;
  margin-bottom: 16px;
}

/* ── Text-Seiten (Impressum, Datenschutz, Verein) ────────────── */
.ds-section {
  padding-top: 2rem;
}

.ds-section:first-child {
  padding-top: 0;
}

.ds-section h2 {
  font-size: 1.05rem;
  font-weight: var(--fw-bold);
  color: var(--glass-text);
  margin: 0 0 var(--space-sm);
  letter-spacing: 0.01em;
}

/* ds-content: kein eigener visueller Container — page-card ist die einzige Ebene */
.ds-content {
  max-width: 68ch;
}

.ds-item {
  margin-bottom: var(--space-sm);
}

.ds-item:last-child {
  margin-bottom: 0;
}

.ds-content h3 {
  font-size: 1rem;
  font-weight: var(--fw-semibold);
  color: var(--glass-text);
  margin: 0 0 0.4rem;
  line-height: 1.3;
  text-wrap: balance;
}

/* Ein Block, der mit einer Zwischenüberschrift beginnt, bekommt mehr Luft
   nach oben als ein reiner Folgeabsatz — so bindet der Abstand die
   Überschrift an den Text darunter statt an den davor.
   Padding statt margin, weil zusammenfallende Ränder sonst nur das
   Maximum nehmen und der Zuwachs verpuffen würde. */
.page-card__body .ds-content .ds-item:has(> h3) {
  padding-top: 0.6rem;
}

.page-card__body .ds-content .ds-item:first-child {
  padding-top: 0;
}

.page-card__body .ds-content p,
.page-card__body .ds-section > p {
  font-size: 0.9rem;
  color: rgba(192, 202, 240, 0.92);
  line-height: 1.65;
  margin: 0 0 var(--space-sm);
  text-wrap: pretty;
  max-width: 68ch;
}

.page-card__body .ds-content p:last-child,
.page-card__body .ds-section > p:last-child {
  margin-bottom: 0;
}

.ds-contact {
  font-style: normal;
  margin-bottom: var(--space-md);
}

.ds-contact strong {
  display: block;
  font-size: var(--type-sm);
  font-weight: var(--fw-bold);
  color: rgba(200, 205, 240, 0.9);
  margin-bottom: 0.5rem;
}

.page-card__body .ds-contact p {
  font-size: var(--type-sm);
  color: rgba(200, 210, 248, 0.92);
  margin: 0 0 0.35rem;
  line-height: 1.6;
}

.ds-contact p:last-child {
  margin-bottom: 0;
}

.ds-contact a {
  color: var(--color-link);
}

/* Aufzählungen im Fließtext.
   Ohne Punkte — die Website verwendet nirgends Listenpunkte. Der Einzug
   und ein zurückgenommener Strich übernehmen die Gliederung. Typografie
   identisch zum Fließtext, damit der Rhythmus nicht bricht.

   Gilt für die Rechtsseiten und für die Ausschreibung der
   Vereinsmeisterschaft. Letztere stand vorher in einzelnen umrandeten
   Kästen — eine Form, die auf dieser Website für Karten reserviert ist und
   die bei 32 bis 251 Zeichen langen Regeln eine Gleichrangigkeit
   behauptete, die der Inhalt nicht hat. */
.page-card__body .ds-content ul,
/* Einleitender Absatz eines Abschnitts — etwas kleiner als Fliesstext,
   damit er den Regeln darunter nicht die Aufmerksamkeit nimmt. */
.abschnitt-text {
  margin: 0 0 var(--space-sm);
  font-size: 0.9rem;
  line-height: 1.65;
  color: var(--glass-text-dim);
  max-width: 62ch;
  text-wrap: pretty;
}

/* Eckdaten einer Ausschreibung: Zeit, Modus, Bedenkzeit.

   Eine Beschreibungsliste, weil es genau das ist — Begriff und Erklärung.
   Auf schmalen Geräten stapeln sie sich, sonst stünden zwei Spalten von je
   wenigen Zeichen nebeneinander. */
.eckdaten {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 0.3rem 0.9rem;
  margin: 0 0 var(--space-sm);
  font-size: 0.9rem;
}

.eckdaten dt {
  color: var(--glass-text-dim);
  font-weight: var(--fw-semibold);
  white-space: nowrap;
}

.eckdaten dd {
  margin: 0;
  color: var(--glass-text);
}

@media (max-width: 26rem) {
  .eckdaten {
    grid-template-columns: 1fr;
    gap: 0.05rem;
  }
  .eckdaten dd { margin-bottom: 0.45rem; }
}

/* Regelliste einer Ausschreibung. War an die ID des VM-Panels gebunden;
   seit das Sommerturnier dieselbe Darstellung braucht, eine Klasse. */
.regelliste {
  list-style: none;
  margin: 0 0 var(--space-sm);
  padding: 0;
}

.page-card__body .ds-content ul:last-child,
.regelliste:last-child {
  margin-bottom: 0;
}

.page-card__body .ds-content li,
.regelliste li {
  position: relative;
  padding-left: 1.1rem;
  font-size: 0.9rem;
  color: rgba(192, 202, 240, 0.92);
  line-height: 1.65;
  text-wrap: pretty;
}

.page-card__body .ds-content li + li,
.regelliste li + li {
  margin-top: 0.35rem;
}

.page-card__body .ds-content li::before,
.regelliste li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.68em;
  width: 0.5rem;
  height: 2px;
  border-radius: 1px;
  background: var(--list-marker);
}

.ds-contact-list {
  list-style: none;
  margin: 0;
  padding: 0;
}

.ds-contact-list li {
  font-size: var(--type-sm);
  color: rgba(185, 195, 235, 0.88);
  line-height: 1.6;
  padding: 0.15rem 0;
}

.ds-contact-list a {
  color: var(--color-link);
}

.ds-footnote {
  font-size: 0.86rem;
  color: rgba(255, 255, 255, 0.5);
  padding: var(--space-lg) 0 var(--space-xs);
  border-top: 1px solid var(--glass-hairline);
  max-width: 68ch;
}



/* ══════════════════════════════════════════════════════
   MOBILE GLOBAL — Edge-to-edge + Konsistente Abstände
   Gilt für alle Seiten automatisch.
   Einzelne Seiten-Overrides (VM, Mannschaften) können
   damit entfernt werden.
══════════════════════════════════════════════════════ */
@media (max-width: 480px) {
  /* Content-Wrapper: kein horizontales Padding */
  .main__content-wrapper {
    padding-inline: 0;
  }

  /* page-card: volle Breite, Oberkante bündig, Unterkante gerundet */
  .page-card {
    border-radius: 0 0 16px 16px; /* Unterkante bleibt gerundet — floating-Card Metapher */
    margin-inline: 0;
  }

  /* Vertikale Abstände: Card direkt an Header und Footer */
  .main__content-wrapper {
    padding-block: 0;
    gap: 0.5rem;
  }

  /* Tabs: horizontal scrollbar, kein Abschneiden */
  .filter-bar,
  .page-card__filterbar {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
    flex-wrap: nowrap;
  }
  .filter-bar::-webkit-scrollbar,
  .page-card__filterbar::-webkit-scrollbar {
    display: none;
  }
  .filter-bar__group {
    flex-wrap: nowrap;
  }
  /* Overflow-Hint: Fade signalisiert scrollbaren Inhalt */
  .page-card__filterbar {
    mask-image: linear-gradient(to right, black 75%, transparent 100%);
    -webkit-mask-image: linear-gradient(to right, black 75%, transparent 100%);
  }
}


/* ══════════════════════════════════════════════════════
   404 — Fehlerseite
══════════════════════════════════════════════════════ */
.error-card {
  text-align: center;
  padding: 3rem 2rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.25rem;
}
.error-card__code {
  font-size: clamp(4rem, 18vw, 7rem);
  font-weight: var(--fw-extrabold);
  letter-spacing: -0.04em;
  line-height: 1;
  color: var(--color-accent);
  position: relative;
  display: inline-block;
}
.error-card__code::after {
  content: "";
  display: block;
  height: 4px;
  background: var(--color-accent);
  border-radius: 2px;
  margin-top: 0.3rem;
}
.error-card__title {
  font-size: clamp(1.1rem, 4vw, 1.5rem);
  font-weight: var(--fw-bold);
  margin: 0;
  color: var(--glass-text);
}
.error-card__body {
  font-size: 0.95rem;
  color: var(--glass-text-dim);
  line-height: 1.6;
  max-width: 38ch;
  margin: 0;
}
.error-card__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.65rem;
  justify-content: center;
  margin-top: 0.5rem;
}
.error-card__chess {
  font-size: 2.5rem;
  line-height: 1;
  opacity: 0.25;
  letter-spacing: 0.1em;
  user-select: none;
  margin-bottom: -0.5rem;
}


/* ══════════════════════════════════════════════════════
   CHRONIK — Magazin-Layout
══════════════════════════════════════════════════════ */
/* Chronik-Sektion-Hero (extends .page-hero — siehe HTML: class="page-hero chronik-hero") */
.chronik-hero {
  /* Resets der .page-hero-Defaults */
  background-image: none;
  min-height: 0;
  border-radius: 0;
  /* Chronik-spezifisch */
  background: var(--color-primary);
  padding: 1.75rem 1.6rem 1.5rem;
  margin: 0 -0.75rem;
}
.chronik-hero::after {
  content: "\2659";
  position: absolute;
  right: -12px;
  bottom: -18px;
  font-size: 120px;
  opacity: 0.055;
  line-height: 1;
  pointer-events: none;
}
.chronik-eyebrow {
  font-size: 0.7rem;
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: rgba(255, 255, 255, 0.5);
  margin: 0 0 0.35rem;
}
.chronik-headline {
  font-size: clamp(1.7rem, 4vw, 2.2rem);
  font-weight: var(--fw-extrabold);
  line-height: 1.08;
  letter-spacing: -0.03em;
  color: #fff;
  margin: 0 0 0.5rem;
  text-wrap: balance;
}
.chronik-headline em {
  font-style: normal;
  color: var(--color-accent);
}
.chronik-lead {
  font-size: var(--type-sm);
  color: rgba(255, 255, 255, 0.7);
  margin: 0;
  line-height: 1.55;
  max-width: 52ch;
}
.chronik-stats {
  display: flex;
  gap: 1.75rem;
  margin-top: 1.2rem;
  flex-wrap: wrap;
}
.chronik-stat__val {
  font-size: 1.6rem;
  font-weight: var(--fw-extrabold);
  color: var(--color-accent);
  letter-spacing: -0.03em;
  line-height: 1;
}
/* 0.65 statt 0.5: Bei 9,92 px hielt der frühere Wert nur 4,22:1, die Grenze
   liegt bei 4,5:1. Jetzt 6,10:1. */
.chronik-stat__lbl {
  font-size: 0.62rem;
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: rgba(255, 255, 255, 0.65);
  margin-top: 0.2rem;
}
.chronik-cols {
  display: grid;
  grid-template-columns: 1fr 220px;
  gap: 1.75rem;
  align-items: start;
  background: transparent;
  border-radius: 0;
  padding: 1.25rem 0 1rem;
  margin-top: 0.75rem;
}
@media (max-width: 680px) {
  .chronik-cols { grid-template-columns: 1fr; }
  .chronik-sidebar {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.65rem;
  }
  .chronik-story { grid-column: 1 / -1; }
}
.chronik-main h3 {
  font-size: 0.95rem;
  font-weight: var(--fw-bold);
  color: rgba(235, 240, 255, 0.98);
  margin: 1.6rem 0 0.45rem;
  padding-top: 1.4rem;
  border-top: 1px solid var(--glass-border);
  letter-spacing: -0.01em;
}
.chronik-main h3:first-child {
  margin-top: 0;
  padding-top: 0;
  border-top: none;
}
.chronik-main p {
  font-size: 0.84rem;
  color: rgba(192, 202, 240, 0.90);
  line-height: 1.7;
  margin: 0 0 0.85rem;
  text-wrap: pretty;
}
.chronik-main p:last-child { margin-bottom: 0; }
.pull-quote {
  background: rgba(50, 40, 130, 0.18);
  border-left: 3px solid rgba(120, 110, 220, 0.55);
  border-radius: 0 8px 8px 0;
  padding: 0.9rem 1rem;
  margin: 1rem 0;
  font-size: 0.84rem;
  font-style: italic;
  color: rgba(200, 205, 240, 0.85);
  line-height: 1.55;
}
.chronik-sidebar {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}
.fact-card {
  background: var(--glass-surface);
  border: 1px solid rgba(255, 255, 255, 0.09);
  border-radius: var(--radius-md);
  padding: 0.9rem 1rem;
  box-shadow: none;
}
.fact-card__yr {
  font-size: 1.55rem;
  font-weight: var(--fw-extrabold);
  /* Aufgehellt von rgba(140,130,220,0.90): Das hielt nur 2,64:1 und lag damit
     unter der Grenze von 3:1, die für Schrift dieser Größe gilt. Betroffen
     waren vier der sieben Karten — darunter 1957, das Gründungsjahr.
     Jetzt 5,50:1, also nah an den 6,08:1 der goldenen Variante: Beide sind
     gleich gut lesbar und unterscheiden sich nur im Farbton. */
  color: rgb(196, 190, 245);
  letter-spacing: -0.03em;
  line-height: 1;
  margin-bottom: 0.25rem;
}
.fact-card__yr--accent { color: var(--accent-text-fade); }
.fact-card__h {
  font-size: 0.78rem;
  font-weight: var(--fw-bold);
  color: rgba(235, 240, 255, 0.96);
  margin-bottom: 0.2rem;
}
.fact-card__p {
  font-size: 0.72rem;
  color: rgba(185, 195, 235, 0.88);
  line-height: 1.5;
}
.chronik-story {
  background: var(--color-primary);
  border-radius: var(--radius-md);
  padding: 0.9rem 1rem;
}
.chronik-story__lbl {
  font-size: 0.6rem;
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: rgba(255, 255, 255, 0.5);
  margin-bottom: 0.4rem;
}
.chronik-story__text {
  font-size: 0.76rem;
  color: rgba(255, 255, 255, 0.88);
  line-height: 1.55;
  font-style: italic;
}
.chronik-story__text em {
  font-style: normal;
  color: var(--color-accent);
  font-weight: var(--fw-semibold);
}
.sidebar-rule {
  border: none;
  border-top: 1px solid var(--glass-border);
  margin: 0.25rem 0;
}


/* ══════════════════════════════════════════════════════
   TERMINE — Seiten-spezifische Styles
══════════════════════════════════════════════════════ */
.ev-cnt {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 1.2rem;
  height: 1.2rem;
  border-radius: var(--radius-pill);
  font-size: 0.68rem;
  font-weight: var(--fw-bold);
  margin-left: 0.3rem;
  padding: 0 0.25rem;
  /* Gekräftigt für die hellere Karte: 8,1 ΔE gegen ihren Grund statt 6,0,
     Text weiß statt gedämpft — bei 0.68rem ist das kein Ort für
     Zurückhaltung. Eine zweite, vollständig überschriebene Fassung dieser
     Regel stand weiter oben in der Datei und ist entfernt. */
  background: rgba(255, 255, 255, 0.13);
  color: #fff;
  vertical-align: middle;
}
.tab--active .ev-cnt {
  background: rgba(50, 40, 130, 0.55);
  color: #fff;
}
/* Rangliste — Podium.
   Die Fläche trägt den Rang dezent, die farbige Kante links trägt ihn
   deutlich. Alle Werte kommen aus den --vm-*-Tokens und sind deckend, damit
   die Sticky-Spalten beim seitlichen Scrollen nichts durchscheinen lassen. */
#tournament__rangliste tr[data-rank="1"] td { background: var(--vm-rank-gold); }
#tournament__rangliste tr[data-rank="2"] td { background: var(--vm-rank-silver); }
#tournament__rangliste tr[data-rank="3"] td { background: var(--vm-rank-bronze); }

#tournament__rangliste tr[data-rank="1"] td:first-child { border-left: 4px solid var(--vm-rank-gold-line); }
#tournament__rangliste tr[data-rank="2"] td:first-child { border-left: 4px solid var(--vm-rank-silver-line); }
#tournament__rangliste tr[data-rank="3"] td:first-child { border-left: 4px solid var(--vm-rank-bronze-line); }
#tournament__rangliste tr[data-rank="1"] td:nth-child(2) { font-weight: var(--fw-bold); }

/* Ein hervorgehobenes Wort im Seitentitel der Vereinsmeisterschaft.
   Der Titel selbst nutzt .page-head__title wie jede andere Seite; nur
   dieses eine Wort trägt den Akzent. */
/* Gruppentrenner — Linie, Beschriftung, Linie.
   Gliedert die Monate auf der Terminseite und die Runden der
   Vereinsmeisterschaft. Eine Definition für beide, damit die Seiten nicht
   auseinanderlaufen. Die Beschriftung braucht bei .vm-runde die
   Klassenverdopplung, weil sie dort ein h3 ist und die globale
   Überschriftenregel sonst Farbe und Größe überschreibt. */
.ev-msep,
.vm-runde {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 1.1rem 0 0.4rem;
}

.ev-msep__line,
.vm-runde__linie {
  flex: 1;
  height: 1px;
  background: var(--glass-hairline);
}

.ev-msep__lbl,
.vm-runde__label.vm-runde__label {
  flex-shrink: 0;
  margin: 0;
  font-size: 0.65rem;
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.09em;
  color: var(--accent-text-fade);
  background: var(--accent-tint-weak);
  border: 1px solid var(--accent-border-weak);
  border-radius: var(--radius-pill);
  padding: 0.15rem 0.62rem;
}
.ev-item {
  display: flex;
  gap: 0.85rem;
  align-items: flex-start;
  padding: 0.9rem 0.85rem;
}
/* Vier Kategorien, vier Farbtöne aus der eigenen Terminskala (siehe :root).
   Bewusst gedämpft und ohne Gold — das bleibt den Akzenten vorbehalten. */
.ev-item--ps .ev-tile {
  background: var(--ev-ps-fill);
  border-color: var(--ev-ps-line);
}
.ev-item--ps .ev-tile__d { color: var(--ev-ps-day); }
.ev-item--ps .ev-tile__m { color: var(--ev-ps-mon); }

.ev-item--st .ev-tile {
  background: var(--ev-st-fill);
  border-color: var(--ev-st-line);
}
.ev-item--st .ev-tile__d { color: var(--ev-st-day); }
.ev-item--st .ev-tile__m { color: var(--ev-st-mon); }

.ev-item--vm .ev-tile {
  background: var(--ev-vm-fill);
  border-color: var(--ev-vm-line);
}
.ev-item--vm .ev-tile__d { color: var(--ev-vm-day); }
.ev-item--vm .ev-tile__m { color: var(--ev-vm-mon); }

.ev-item--other .ev-tile {
  background: var(--ev-other-fill);
  border-color: var(--ev-other-line);
}
.ev-item--other .ev-tile__d { color: var(--ev-other-day); }
.ev-item--other .ev-tile__m { color: var(--ev-other-mon); }
.ev-tile {
  flex-shrink: 0;
  width: 44px;
  height: 44px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  background: var(--primary-tint);
  border: 1px solid rgba(80, 65, 180, 0.3);
  border-radius: 9px;
}
.ev-tile__d {
  font-size: 1.2rem;
  font-weight: var(--fw-extrabold);
  color: rgba(190, 182, 255, 0.96);
  line-height: 1;
  letter-spacing: -0.03em;
}
.ev-tile__m {
  font-size: 0.52rem;
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.07em;
  color: var(--glass-text-dim);
}
.ev-body {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 0.18rem;
}
.ev-team {
  font-size: 0.68rem;
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.07em;
  color: var(--glass-text-dim);
  display: block;
}
.ev-title {
  font-size: 0.95rem;
  font-weight: var(--fw-semibold);
  color: var(--glass-text);
  line-height: 1.3;
}
/* Paarung „Heim – Gast" unter dem Titel — nur bei Punktspielen */
.ev-pairing {
  font-size: 0.9rem;
  color: var(--glass-text);
  line-height: 1.35;
  margin-top: 0.1rem;
}
.ev-loc {
  font-size: 0.82rem;
  color: var(--glass-text-dim);
  display: flex;
  gap: 0.22rem;
  align-items: flex-start;
}
.ev-time {
  font-size: 0.78rem;
  color: var(--glass-text-dim);
}
.ev-link {
  margin-top: 0.35rem;
  align-self: flex-start;
}
.events__empty {
  padding: 2.5rem 0;
  text-align: center;
}
.events__empty-h {
  font-size: 1rem;
  font-weight: var(--fw-semibold);
  color: var(--glass-text);
  margin: 0 0 0.5rem;
}
.events__empty-p {
  font-size: 0.85rem;
  color: var(--glass-text-dim);
  margin: 0 auto;
  line-height: 1.65;
  max-width: 44ch;
  text-wrap: pretty;
}
/* Vorher als #termine-tabs gesetzt. Ein ID-Selektor schlägt jede
   Variantenklasse — dadurch liess sich die Filterleiste gar nicht mehr
   gestalten. Jetzt an der Variantenklasse. */
.tabs--filter {
  padding: 0.45rem 0.5rem;
  gap: 0.35rem;
}
.termine-card .page-card__body { padding-top: 0.25rem; }

/* Responsive Tab-Label: visuell "VM" auf engen Screens, voll auf breiten.
   aria-label="Vereinsmeisterschaft" am Button hält den a11y-Namen immer korrekt. */
.tab__label-short { display: none; }
@media (max-width: 440px) {
  .tab__label-short { display: inline; }
  .tab__label-full  { display: none; }
}

@media (max-width: 600px) {
  .tabs { overflow-x: auto; scrollbar-width: none; }
  .tabs::-webkit-scrollbar { display: none; }
  .tabs .tab { flex-shrink: 0; }
}


/* ══════════════════════════════════════════════════════
   VEREIN — Layout & Komponenten
══════════════════════════════════════════════════════ */
.verein-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0;
}
.verein-col { padding: 1.25rem 1.5rem 1.5rem; }
.verein-col + .verein-col {
  border-left: 1px solid var(--glass-border);
}
/* Abschnittsbeschriftungen.
   Die Beschriftungen sind h2, nicht p: Optisch waren sie längst Überschriften,
   im Markup aber Absätze — die Seite hatte damit genau eine Überschrift und ließ
   sich per Screenreader nicht überspringen (WCAG 1.3.1). Der obere Abstand ist
   ausdrücklich gesetzt, damit er nicht aus der Browser-Voreinstellung für h2
   kommt.

   Die Farbe stand zuvor als rgba(252, 235, 25, 0.70) in dieser Klasse, war aber
   nie zu sehen: .page-card__body p beziehungsweise h2 hat die höhere Spezifität
   und überschrieb sie. Deshalb der wiederholte Selektor — dieselbe Lösung, die
   .team-section__label auf der Mannschaftsseite schon nutzt. Damit tragen beide
   Seiten dieselbe Beschriftung.

   0.85 statt 0.70: Der frühere Wert hätte nur 4,26:1 ergeben, die Grenze für
   diese Schriftgröße liegt bei 4,5:1. Mit --accent-text-fade sind es 4,90:1. */
/* Abschnittsbeschriftung innerhalb einer Karte — kleine Versalien in
   gedaempftem Vereinsgelb.

   Hiess bis zum 27.08.2026 .abschnitt-label. Das war ein seitenspezifischer
   Name fuer ein allgemeines Bauteil: Das Sommerturnier braucht dieselbe
   Beschriftung fuer „Ausschreibung" und „Ergebnisse", und eine zweite,
   fast gleiche Klasse waere Verdopplung. */
.abschnitt-label,
.page-card__body .abschnitt-label {
  margin-top: 0.65rem;
  font-size: 0.65rem;
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--accent-text-fade);
  margin-bottom: 14px;
}
.verein-training {
  background:    var(--flaeche-vertieft);
  border:        1px solid var(--glass-border);
  border-radius: var(--radius-md);
  padding:       1rem 1.1rem;
  margin-bottom: 12px;
  position:      relative;
  overflow:      hidden;
}
.verein-training::after {
  content: "\2659";
  position: absolute;
  right: -6px;
  bottom: -14px;
  font-size: 72px;
  opacity: 0.06;
  line-height: 1;
  pointer-events: none;
}
.verein-training__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 10px;
}
.verein-training__title {
  font-size: 0.72rem;
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.09em;
  color: rgba(255, 255, 255, 0.50);
}
.verein-training__badge {
  background:    var(--accent-tint-sm);
  border:        1px solid rgba(252, 235, 25, 0.28);
  border-radius: var(--radius-pill);
  padding:       2px 10px;
  font-size:     0.70rem;
  font-weight:   var(--fw-bold);
  color:         #fceb19;
  white-space:   nowrap;
}
.verein-training .table--card { background: transparent !important; }
.verein-training th,
.verein-training td {
  border-bottom: 1px solid rgba(255, 255, 255, 0.07) !important;
}
.verein-training .table thead th {
  background:    rgba(10, 6, 40, 0.55) !important;
  color:         rgba(220, 228, 255, 0.85) !important;
  border-bottom: 1px solid rgba(255, 255, 255, 0.12) !important;
}
.verein-training .table tbody td {
  color:         rgba(220, 228, 255, 0.90) !important;
  border-bottom: 1px solid rgba(255, 255, 255, 0.07) !important;
}
.verein-training .table tbody tr:last-child td { border-bottom: none !important; }
/* Trainingszeiten als Liste.
   Als Tabelle mit vier Spalten war sie 399 px breit; die Spalte „Ort" endete
   bei x = 442 und war auf allen geprüften Telefonbreiten (320 bis 430 px)
   abgeschnitten — wegen overflow:hidden am Elternbereich nicht einmal
   erreichbar. Wo trainiert wird, ist einer der Hauptgründe für diese Seite.

   Ab 640 px liegen Zeit und Ort nebeneinander, darunter untereinander. */
.trainingsliste {
  list-style: none;
  margin: 0;
  padding: 0;
}

.trainingsliste__zeile {
  display: grid;
  gap: 0.1rem 0.9rem;
  padding: 0.6rem 0;
  border-bottom: 1px solid var(--glass-hairline);
}

.trainingsliste__zeile:last-child {
  border-bottom: 0;
  padding-bottom: 0.2rem;
}

.trainingsliste__gruppe {
  color: var(--glass-text);
  font-weight: var(--fw-bold);
  font-size: 0.88rem;
}

.trainingsliste__zeit {
  color: var(--glass-text);
  font-size: 0.84rem;
  font-variant-numeric: tabular-nums;
}

.trainingsliste__ort {
  color: var(--glass-text-dim);
  font-size: 0.82rem;
}

@media (min-width: 640px) {
  .trainingsliste__zeile {
    grid-template-columns: minmax(8rem, auto) 1fr;
    align-items: baseline;
  }
  .trainingsliste__gruppe { grid-row: 1 / span 2; }
}

.verein-training__hint {
  font-size:   0.72rem;
  color:       rgba(185, 193, 235, 0.88);
  margin-top:  8px;
  line-height: 1.5;
}
.verein-loc-item {
  display:        flex;
  flex-direction: column;
  gap:            3px;
  padding:        10px 0;
  border-bottom:  1px solid var(--glass-surface);
}
.verein-loc-item:last-child { border-bottom: none; }
.verein-loc-item__name {
  font-size:   0.88rem;
  font-weight: var(--fw-bold);
  color:       var(--glass-text);
}
.verein-loc-item__addr {
  font-size: 0.80rem;
  color:     var(--glass-text-dim);
}
.verein-loc-item__desc {
  font-size: 0.75rem;
  color:     rgba(185, 193, 235, 0.88);
}
.verein-loc-item__map {
  font-size:       0.72rem;
  color:           var(--color-link);
  text-decoration: none;
  margin-top:      2px;
  display:         inline-flex;
  align-items:     center;
  gap:             4px;
}
.verein-loc-item__map:hover { color: #fceb19; }
.verein-contact-card {
  /* Abdunkelnd statt aufhellend. Die frühere Aufhellung um 6 % Weiß hob den
     Grund auf #4E5170 — der gedämpfte Text darauf hielt nur 3,86:1 und die
     Rollenzeile 3,85:1, beide unter der Grenze von 4,5:1. Betroffen waren
     ausgerechnet Telefonnummern und E-Mail-Adressen.

     Korrigiert wird der Grund, nicht die Schrift: So trägt die vorhandene
     Farbskala wieder, ohne eigene Textfarben für diese eine Stelle. Die Karte
     liest sich jetzt als vertiefte Fläche — die Abgrenzung übernimmt weiterhin
     der Rahmen. */
  background:    var(--flaeche-vertieft);
  border:        1px solid var(--glass-border);
  border-radius: var(--radius-md);
  padding:       0.9rem 1rem;
  margin-bottom: 6px;
}
.verein-contact-card__role {
  font-size:      0.65rem;
  font-weight:    var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.10em;
  color:          rgba(185, 193, 235, 0.88);
  margin-bottom:  3px;
}
.verein-contact-card__name {
  font-size:     0.92rem;
  font-weight:   var(--fw-bold);
  color:         var(--glass-text);
  margin-bottom: 5px;
}
.verein-contact-card__detail {
  font-size:   0.78rem;
  color:       var(--glass-text-dim);
  line-height: 1.6;
}
.verein-contact-card__detail a {
  color:           var(--color-link);
  text-decoration: none;
}
.verein-contact-card__detail a:hover { color: #fceb19; }
.verein-chronik-teaser {
  background:      linear-gradient(135deg, #1a0e5a 0%, #322882 100%);
  border-radius:   var(--radius-sm);
  padding:         1rem 1.1rem;
  margin-top:      12px;
  display:         flex;
  align-items:     center;
  justify-content: space-between;
  gap:             12px;
}
.verein-chronik-teaser__text {
  font-size:   0.85rem;
  color:       rgba(255, 255, 255, 0.75);
  line-height: 1.5;
}
.verein-chronik-teaser__text strong {
  color:         var(--glass-text);
  display:       block;
  font-size:     0.90rem;
  margin-bottom: 2px;
}
.verein-chronik-teaser__link {
  flex-shrink:     0;
  font-size:       0.75rem;
  padding:         5px 12px;
  border-radius:   20px;
  background:      var(--accent-tint);
  border:          1px solid var(--accent-border);
  color:           #fceb19;
  font-weight:     var(--fw-semibold);
  text-decoration: none;
  white-space:     nowrap;
}
.verein-chronik-teaser__link:hover { background: rgba(252, 235, 25, 0.20); }
.verein-card { padding: 0; overflow: hidden; }
.verein-card__body { padding: 0; }
.abschnitt-label--spaced { margin-top: 16px; }
.verein-col-intro {
  font-size:   0.80rem;
  color:       rgba(185, 193, 235, 0.80);
  line-height: 1.55;
  margin:      0 0 12px;
}
@media (max-width: 640px) {
  .verein-grid { grid-template-columns: 1fr; }
  .verein-col + .verein-col {
    border-left: none;
    border-top: 1px solid var(--glass-border);
  }
}


/* ══════════════════════════════════════════════════════
   TURNIERE — Info-Cards & Link-Liste
══════════════════════════════════════════════════════ */
.info-card {
  background:    var(--glass-surface);
  border:        1px solid var(--glass-border);
  border-radius: var(--radius-md);
  overflow:      hidden;
}
.info-card--highlight {
  background:    var(--primary-tint);
  border-color:  rgba(80, 65, 180, 0.4);
}
.info-card--spaced { margin-bottom: 1.5rem; }
.info-card__body { padding: 1.2rem 1.4rem; }
.info-card__kicker {
  font-size:      0.65rem;
  font-weight:    var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color:          rgba(252, 235, 25, 0.75);
  margin:         0 0 6px;
}
.info-card__title {
  font-family: var(--font-display);
  font-size:   1.15rem;
  font-weight: var(--fw-semibold);
  color:       var(--glass-text);
  margin:      0 0 8px;
  line-height: 1.25;
}
.info-card__text {
  font-size:   0.88rem;
  color:       var(--glass-text-dim);
  line-height: 1.6;
  margin:      0;
}
.info-card__btn { margin-top: 0.75rem; display: inline-block; }
.link-list {
  list-style: none;
  margin:     0;
  padding:    0;
}
.link-list__item + .link-list__item {
  border-top: 1px solid var(--glass-hairline);
}
.link-list__link {
  display:         flex;
  align-items:     baseline;
  gap:             0.5rem;
  padding:         0.8rem 0;
  text-decoration: none;
  color:           inherit;
  transition:      background 0.1s;
}
.link-list__link:hover .link-list__title { color: #fceb19; }
.link-list__title {
  font-weight: var(--fw-semibold);
  font-size:   0.95rem;
  color:       var(--glass-text);
  flex-shrink: 0;
}
.link-list__desc {
  font-size: 0.82rem;
  color:     var(--glass-text-dim);
  flex:      1;
}
.link-list__ext {
  font-size:   0.8rem;
  color:       var(--glass-text-dim);
  flex-shrink: 0;
}

/* ══════════════════════════════════════════════════════
   MANNSCHAFTEN — Team-Zeilen-Layout
══════════════════════════════════════════════════════ */
.team-section { margin-bottom: 1.5rem; }
.team-section:last-child { margin-bottom: 0; }
.team-section + .team-section {
  margin-top: 0.25rem;
  padding-top: 1rem;
  border-top: 1px solid var(--glass-hairline);
}
.team-row {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 0.9rem 1.1rem;
  transition: background 0.12s ease;
}
.team-row:hover { background: rgba(255, 255, 255, 0.06); }
.team-row__badge {
  flex-shrink: 0;
  width: 2.8rem;
  height: 2.8rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-sm);
  font-weight: var(--fw-extrabold);
  font-size: 0.92rem;
  font-family: inherit;
  background: rgba(50, 40, 130, 0.3);
  color: rgba(200, 192, 255, 0.98);
  border: 1px solid rgba(80, 65, 180, 0.5);
}
.team-row__badge--youth {
  background:   rgba(252, 235, 25, 0.22);
  color:        rgba(255, 244, 100, 0.99);
  border-color: rgba(252, 235, 25, 0.52);
}
.team-row__info { flex: 1; min-width: 0; }
.team-row__name {
  margin: 0;
  font-weight: var(--fw-bold);
  font-size: 1.05rem;
  color: rgba(242, 245, 255, 0.99);
  line-height: 1.3;
}
.team-row__liga {
  margin: 4px 0 0;
  font-size: 0.88rem;
  color: rgba(200, 210, 248, 0.88);
  line-height: 1.3;
}
.team-row__links { display: flex; gap: 0.4rem; flex-shrink: 0; }

/* Auf sehr schmalen Geräten ragten die „Tabelle"-Knöpfe über die Karte
   hinaus und wurden abgeschnitten — die Zeile ist flex und die Knöpfe
   schrumpfen nicht. Ab hier rücken sie in eine eigene Zeile unter den
   Namen, eingerückt auf Höhe der Ordinalzahl. */
@media (max-width: 400px) {
  .team-row {
    flex-wrap: wrap;
    row-gap: 0.6rem;
  }
  .team-row__links {
    /* Volle Breite ohne Einrückung: Bei 320 px kosten 3,8 rem Einzug so viel,
       dass der dritte Knopf nicht mehr passt. flex-shrink und min-width
       müssen mit — sonst wächst der Behälter über seine Basis hinaus,
       statt umzubrechen. */
    flex-basis: 100%;
    margin-left: 0;
    flex-wrap: wrap;
    flex-shrink: 1;
    min-width: 0;
  }
}
/* Spezifitaet 0,2,0 ueberschreibt .btn--assist (0,1,0) ohne !important */
.team-row__links .btn--assist {
  min-height:  44px;
  padding:     0 1rem;
  background:  var(--glass-hairline);
  border:      1px solid rgba(255, 255, 255, 0.3);
  color:       rgba(228, 235, 255, 0.96);
  border-radius: var(--radius-sm);
  font-size:   0.82rem;
  font-weight: var(--fw-medium);
  transition:  background 0.12s, border-color 0.12s, color 0.12s;
}
.team-row__links .btn--assist:hover {
  background:   rgba(255, 255, 255, 0.22);
  border-color: rgba(255, 255, 255, 0.46);
  color:        rgba(245, 248, 255, 1);
  box-shadow:   none;
}
/* Expliziter Fokusring — höhere Spezifität (0,3,0) sichert Sichtbarkeit */
.team-row__links .btn--assist:focus-visible {
  outline:        2px solid var(--color-accent);
  outline-offset: 2px;
  border-color:   rgba(252, 235, 25, 0.5);
}
@media (max-width: 480px) {
  .team-row { flex-wrap: wrap; gap: 0.6rem; padding: 0.8rem 0.9rem; }
  .team-row__links { flex: 1 0 100%; }
  .team-row__links .btn--assist { flex: 1; justify-content: center; }
}


/* ══════════════════════════════════════════════════════
   INDEX (Startseite) — Homepage-Layout & Widgets
══════════════════════════════════════════════════════ */
.hp-wrap {
  max-width: 1140px;
  margin:    0 auto;
  padding:   20px 20px 28px;
  display:   flex;
  flex-direction: column;
  gap: 14px;
}
.hp-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 300px;
  gap: 14px;
  align-items: start;
}
.hp-main    { display: flex; flex-direction: column; gap: 14px; }
.hp-sidebar { display: flex; flex-direction: column; gap: 14px; }

/* Glaswidget-Basis */
.hw {
  background:              rgba(255, 255, 255, 0.13);
  backdrop-filter:         blur(26px);
  -webkit-backdrop-filter: blur(26px);
  border-radius:           var(--radius-md);
  overflow:                hidden;
  box-shadow:              var(--shadow-dark-high),
                           inset 0 1px 0 var(--glass-hairline);
}
.hw-head {
  padding:       10px 18px;
  background:    rgba(8, 6, 22, 0.85);
  border-bottom: 1px solid var(--glass-border);
  display:       flex;
  align-items:   center;
  justify-content: space-between;
}
.hw-head h2 {
  color:       var(--glass-text);
  font-size:   0.88rem;
  font-weight: var(--fw-bold);
  margin:      0;
}
.hw-head a,
.hw-head span {
  color:           rgba(252,235,25,0.65);
  font-size:       0.75rem;
  font-weight:     var(--fw-semibold);
  text-decoration: none;
}
.hw-head a:hover { color: var(--color-accent); }
.hw-body        { padding: 10px 16px 14px; }
.hw-body--flush { padding: 0; }

/* Hero-Widget (extends .page-hero — siehe HTML: class="page-hero hp-hero") */
.hp-hero {
  /* Resets der .page-hero-Defaults */
  background-color: transparent;
  background-image: none;
  min-height: 0;
  border-radius: var(--radius-md);
  /* Homepage-spezifisch */
  background: linear-gradient(135deg, #1c1060 0%, #2a1880 50%, #1a1050 100%);
  padding: 22px 28px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 20px;
  box-shadow: var(--shadow-dark-high), inset 0 1px 0 var(--glass-hairline);
}
.hp-hero::after {
  content: "\2659";
  position: absolute;
  right: 20px;
  bottom: -20px;
  font-size: 160px;
  opacity: 0.04;
  line-height: 1;
  pointer-events: none;
}
.hp-hero__eyebrow {
  font-size: 0.65rem;
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(255,255,255,0.42);
  margin-bottom: 6px;
}
.hp-hero__title {
  font-size: clamp(1.5rem, 3vw, 2rem);
  font-weight: var(--fw-black);
  color: #fff;
  line-height: 1.1;
  letter-spacing: -0.025em;
  margin: 0 0 6px;
}
.hp-hero__title em { font-style: normal; color: var(--color-accent); }
.hp-hero__sub {
  font-size: 0.84rem;
  color: rgba(255,255,255,0.50);
  line-height: 1.5;
  max-width: 40ch;
  margin: 0 0 16px;
}
.hp-hero__cta { display: flex; gap: 8px; flex-wrap: wrap; }
.hp-hero__btn {
  /* Abweichungen vom globalen .btn: Hero nutzt eckigen Radius + eigene Größe */
  font-size:     0.84rem;
  padding:       8px 18px;
  border-radius: var(--radius-sm);
}
.hp-hero__btn--primary   { background: var(--color-accent); border-color: transparent; color: var(--color-text-primary); box-shadow: none; }
.hp-hero__btn--secondary { background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.42); color: rgba(255,255,255,0.92); }
.hp-hero__stats  { display: flex; flex-direction: column; gap: 10px; flex-shrink: 0; }
.hp-hero__stat {
  background:  var(--glass-surface);
  border:      1px solid rgba(255,255,255,0.10);
  border-radius: var(--radius-md);
  padding:     10px 18px;
  text-align:  center;
  min-width:   88px;
}
.hp-hero__stat-val {
  font-size:      1.5rem;
  font-weight:    var(--fw-black);
  color:          var(--color-accent);
  line-height:    1;
  letter-spacing: -0.02em;
}
.hp-hero__stat-lbl {
  font-size:      0.58rem;
  font-weight:    var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color:          rgba(255,255,255,0.38);
  margin-top:     3px;
}

/* Mannschaften-Widget im teams-grid */
#teams-grid .team-section__label { padding: 0 16px; }
#teams-grid .team-list  { padding: 0 16px; }
#teams-grid .team-row   { padding: 10px 0; }
#teams-grid .team-section { margin-bottom: 14px; padding-top: 10px; }

/* Karten auf dunklem Glas — ID-Spezifitaet (1,1,0) ersetzt !important */
#teams-grid .card {
  background:   transparent;
  border-color: var(--glass-border);
  box-shadow:   none;
}
#teams-grid .card h3,
#teams-grid .card p,
#teams-grid .card .card__title,
#teams-grid .card .card__subtitle {
  color: var(--glass-text);
}
#teams-grid .card .card__hint,
#teams-grid .card .team-row__liga {
  color: var(--glass-text-dim);
}
#teams-grid .card__actions .btn--assist {
  background:   var(--glass-surface);
  border-color: var(--glass-surface-mid);
  color:        rgba(175,185,225,0.75);
  box-shadow:   none;
}
#teams-grid .team-row__name { color: var(--glass-text); }
#teams-grid .team-row__liga { color: var(--glass-text-dim); }
#teams-grid .team-row__nr {
  background:    rgba(50,40,130,0.25);
  border-color:  var(--primary-border-md);
  color:         rgba(140,130,220,0.90);
  border-radius: var(--radius-xs);
  font-weight:   var(--fw-extrabold);
}
#teams-grid .team-row--jugend .team-row__nr {
  background:   var(--accent-tint);
  border-color: var(--accent-border);
  color:        rgba(252,235,25,0.88);
}
#teams-grid .btn--assist {
  background:   var(--glass-surface);
  border-color: var(--glass-surface-mid);
  color:        rgba(175,185,225,0.75);
  box-shadow:   none;
}
#teams-grid .btn--assist:hover {
  background: var(--glass-surface-mid);
  color:      rgba(210,218,250,0.90);
}

/* Termine-Widget Leer-Zustand */
.hp-termine-empty { padding: 16px; text-align: center; }
.hp-termine-empty p {
  color:       var(--glass-text-dim);
  font-size:   0.85rem;
  line-height: 1.55;
}
.hp-termine-empty strong {
  color:         rgba(220,228,255,0.80);
  display:       block;
  margin-bottom: 4px;
  font-size:     0.88rem;
}

/* Chronik-Widget */
.hp-chronik {
  background:  linear-gradient(135deg, #1a0e5a 0%, #322882 100%);
  border-radius: var(--radius-md);
  padding:     18px;
  box-shadow:  var(--shadow-dark-mid), inset 0 1px 0 var(--glass-surface-mid);
}
.hp-chronik__eyebrow {
  font-size:      0.62rem;
  font-weight:    var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color:          rgba(255,255,255,0.40);
  margin-bottom:  6px;
}
.hp-chronik__title {
  font-size:      1.35rem;
  font-weight:    var(--fw-black);
  color:          #fff;
  line-height:    1.1;
  letter-spacing: -0.02em;
  margin:         0 0 8px;
}
.hp-chronik__title em { font-style: normal; color: #fceb19; }
.hp-chronik__sub {
  font-size:   0.78rem;
  color:       rgba(255,255,255,0.45);
  line-height: 1.55;
  margin:      0 0 14px;
}
.hp-chronik__link {
  display:         inline-flex;
  font-size:       0.78rem;
  padding:         5px 12px;
  border-radius:   20px;
  background:      var(--accent-tint);
  border:          1px solid var(--accent-border);
  color:           #fceb19;
  font-weight:     var(--fw-semibold);
  text-decoration: none;
  cursor:          pointer;
}
.hp-chronik__link:hover { background: rgba(252,235,25,0.20); }

/* Verein-Widget Links */
.hp-verein-link {
  display:         flex;
  justify-content: space-between;
  align-items:     center;
  padding:         10px 16px;
  border-bottom:   1px solid var(--glass-surface);
  text-decoration: none;
  cursor:          pointer;
}
.hp-verein-link:last-child { border-bottom: none; }
.hp-verein-link span:first-child {
  color:       rgba(220,228,255,0.88);
  font-size:   0.84rem;
  font-weight: var(--fw-semibold);
}
.hp-verein-link span:last-child {
  color:     rgba(252,235,25,0.55);
  font-size: 0.80rem;
}
.hp-verein-link:hover span:first-child { color: #fff; }
.hp-verein-link:hover span:last-child  { color: #fceb19; }

/* 767px, nicht 768: Bei genau 768 px griffen sonst diese Regeln und die
   min-width-Regeln gleichzeitig. */
@media (max-width: 767px) {
  .hp-wrap  { padding: 12px 12px 20px; }
  .hp-grid  { grid-template-columns: 1fr; }
  .hp-hero  { flex-direction: column; align-items: flex-start; }
  .hp-hero__stats { flex-direction: row; flex-wrap: wrap; }
  .hp-hero::after { display: none; }
}
@media (max-width: 480px) {
  .hp-wrap { padding: 10px 0 16px; gap: 10px; }
  .hp-hero { border-radius: 0; }
  .hw      { border-radius: var(--radius-md); }
}

/* Homepage: main__content-wrapper-Constraint aufheben — hp-wrap übernimmt Zentrierung */
.main--home {
  max-width: none;
  width:     100%;
  padding:   0;
}

/* Stat-Labels: Kontrast auf ~4.5:1 angehoben (von 0.38 → 0.62) */
.hp-hero__stat-lbl {
  color: rgba(255,255,255,0.62);
}
/* Hero-Subtext: von 0.50 → 0.70 */
.hp-hero__sub {
  color: rgba(255,255,255,0.70);
}
/* Hero-Eyebrow: von 0.42 → 0.58 */
.hp-hero__eyebrow {
  color: rgba(255,255,255,0.58);
}


/* ══════════════════════════════════════════════════════
   NEWS — Seiten-spezifische Styles
══════════════════════════════════════════════════════ */
.news-page-card {
  border-top: none;
}
.news-bar {
  display: flex;
  flex-wrap: wrap;
  gap: 0.65rem;
  align-items: center;
  padding: 0.85rem 1.6rem;
  border-bottom: 1px solid var(--glass-hairline);
  background: rgba(255, 255, 255, 0.05);
}
.news-bar__search { flex: 1; min-width: 160px; }
.news-bar .filter-bar__input,
.news-bar .filter-bar__select {
  background:   rgba(255, 255, 255, 0.08);
  border-color: rgba(255, 255, 255, 0.15);
  color:        var(--glass-text);
}
.news-bar .filter-bar__input::placeholder { color: var(--glass-text-dim); }
.news-bar .filter-bar__icon              { color: var(--glass-text-dim); }
.news-tab-cnt {
  font-size:   0.72rem;
  font-weight: var(--fw-semibold);
  color:       var(--glass-text-dim);
  margin-left: 0.28rem;
}
.tab--active .news-tab-cnt { color: var(--glass-text); }
.news-bar__year { width: auto; flex-shrink: 0; }
.news-stats {
  display:       flex;
  gap:           1.4rem;
  flex-wrap:     wrap;
  padding:       0.55rem 1.6rem;
  border-bottom: 1px solid var(--glass-hairline);
  background:    rgba(255, 255, 255, 0.03);
}
.news-stat__label {
  display:        block;
  font-size:      0.6rem;
  font-weight:    var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color:          var(--glass-text-dim);
}
.news-stat__value {
  display:     block;
  font-size:   0.9rem;
  font-weight: var(--fw-bold);
  color:       var(--glass-text);
  line-height: 1.2;
}
.news-body { padding: 1.25rem 1.6rem 1.75rem; }
.news-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1rem;
}
@media (max-width: 580px)  { .news-grid { grid-template-columns: 1fr; } }
@media (max-width: 767px) {
  .news-bar   { padding: 0.75rem 1.1rem; }
  .news-body  { padding: 1rem 1.1rem 1.5rem; }
  .news-stats { padding: 0.55rem 1.1rem; gap: 1rem; }
  .news-hero  { padding: 1.1rem 1.2rem 1rem; }
}
.news-card {
  display:        flex;
  flex-direction: column;
  border-radius:  var(--card-inner-radius);
  background:     rgba(255, 255, 255, 0.08);
  border:         1px solid var(--glass-border);
  box-shadow:     0 2px 8px rgba(0, 0, 0, 0.2);
  overflow:       hidden;
  cursor:         pointer;
  transition:     box-shadow 160ms ease, transform 130ms ease, background 160ms ease;
  text-align:     left;
}
.news-card:hover {
  background:  rgba(255, 255, 255, 0.13);
  box-shadow:  var(--shadow-dark-low);
  transform:   translateY(-2px);
}
.news-card:focus-visible {
  outline:        2px solid var(--color-primary);
  outline-offset: 2px;
}
.news-card__stripe          { height: 3px; flex-shrink: 0; }
.news-card__stripe--turnier   { background: var(--color-primary); }
.news-card__stripe--sonstiges { background: var(--color-accent); }
.news-card__body {
  display:        flex;
  flex-direction: column;
  flex:           1;
  padding:        0.95rem 1.05rem 0.9rem;
  gap:            0.42rem;
}
.news-card__meta { display: flex; align-items: center; gap: 0.4rem; }
.news-card__badge {
  display:       inline-flex;
  align-items:   center;
  padding:       0.14rem 0.62rem;
  border-radius: var(--radius-pill);
  font-size:     0.71rem;
  font-weight:   var(--fw-bold);
  white-space:   nowrap;
  letter-spacing: 0.01em;
}
.news-card__badge--turnier {
  background: var(--primary-tint-md);
  border:     1px solid rgba(80, 65, 180, 0.4);
  color:      rgba(190, 182, 255, 0.96);
}
.news-card__badge--sonstiges {
  background: var(--accent-tint-sm);
  border:     1px solid rgba(252, 235, 25, 0.3);
  color:      rgba(252, 235, 25, 0.9);
}
.news-card__year {
  font-size:   0.68rem;
  font-weight: var(--fw-semibold);
  color:       var(--glass-text-dim);
  margin-left: auto;
}
.news-card__content {
  flex:           1;
  display:        flex;
  flex-direction: column;
  gap:            0.38rem;
}
.news-card__title {
  font-size:   0.92rem;
  font-weight: var(--fw-bold);
  color:       var(--glass-text);
  line-height: 1.35;
  text-wrap:   pretty;
}
.news-card__teaser {
  font-size:              0.8rem;
  color:                  var(--glass-text-dim);
  line-height:            1.52;
  display:                -webkit-box;
  -webkit-line-clamp:     3;
  -webkit-box-orient:     vertical;
  overflow:               hidden;
}
.news-card__footer {
  display:         flex;
  justify-content: space-between;
  align-items:     center;
  gap:             0.5rem;
  padding-top:     0.6rem;
  margin-top:      0.4rem;
  border-top:      1px solid var(--glass-hairline);
  flex-shrink:     0;
}
.news-card__date {
  font-size: 0.71rem;
  color:     var(--glass-text-dim);
}
.news-card__cta {
  font-size:   0.78rem;
  font-weight: var(--fw-bold);
  white-space: nowrap;
  color:       var(--color-link);
}
.news-card__cta--ext { color: var(--accent-text-fade); }
.news-empty {
  grid-column: 1 / -1;
  text-align:  center;
  padding:     3rem 1rem;
  color:       var(--glass-text-dim);
  font-size:   0.95rem;
}
.news-skeleton {
  border-radius: var(--card-inner-radius);
  height:        190px;
  background:    linear-gradient(
    90deg,
    rgba(255, 255, 255, 0.05) 25%,
    rgba(255, 255, 255, 0.12) 50%,
    rgba(255, 255, 255, 0.05) 75%
  );
  background-size: 800px 100%;
  animation: skeleton-shimmer 1.4s ease-in-out infinite;
}
@keyframes skeleton-shimmer {
  0%   { background-position: -800px 0; }
  100% { background-position:  800px 0; }
}
.news-modal {
  display:         none;
  position:        fixed;
  inset:           0;
  z-index:         500;
  align-items:     flex-start;
  justify-content: center;
}
.news-modal[aria-hidden="false"] { display: flex; }
.news-modal__overlay {
  position:              absolute;
  inset:                 0;
  background:            rgba(10, 16, 40, 0.72);
  backdrop-filter:       blur(4px);
  -webkit-backdrop-filter: blur(4px);
}
.news-modal__panel {
  position:       relative;
  z-index:        1;
  display:        flex;
  flex-direction: column;
  background:     rgba(12, 8, 40, 0.97);
  border-radius:  18px;
  max-width:      720px;
  width:          calc(100% - 2rem);
  max-height:     calc(100vh - 3rem);
  overflow-y:     auto;
  margin:         1.5rem auto;
  box-shadow:
    0 32px 80px rgba(0, 0, 0, 0.7),
    0 0 0 1px rgba(255, 255, 255, 0.1);
}
.news-modal__head {
  background:  var(--color-primary);
  padding:     1.3rem 1.5rem 1.2rem;
  flex-shrink: 0;
  position:    relative;
}
.news-modal__close {
  position:      absolute;
  top:           1rem;
  right:         1rem;
  width:         34px;
  height:        34px;
  border-radius: 50%;
  border:        1px solid rgba(255, 255, 255, 0.25);
  background:    var(--glass-surface-mid);
  color:         #fff;
  font-size:     1rem;
  cursor:        pointer;
  display:       flex;
  align-items:   center;
  justify-content: center;
  font-family:   inherit;
  transition:    background 130ms;
}
.news-modal__close:hover { background: rgba(255, 255, 255, 0.24); }
.news-modal__close:focus-visible {
  outline:        2px solid var(--color-accent);
  outline-offset: 2px;
}
.news-modal__meta { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem; }
.news-modal__cat {
  display:       inline-flex;
  align-items:   center;
  padding:       0.14rem 0.65rem;
  border-radius: var(--radius-pill);
  background:    var(--accent-tint-md);
  border:        1px solid rgba(252, 235, 25, 0.38);
  color:         var(--color-accent);
  font-size:     0.73rem;
  font-weight:   var(--fw-bold);
}
.news-modal__date-label { font-size: 0.8rem; color: rgba(255, 255, 255, 0.5); }
.news-modal__title {
  margin:         0;
  font-size:      clamp(1.05rem, 3vw, 1.3rem);
  font-weight:    var(--fw-extrabold);
  color:          #fff;
  line-height:    1.22;
  letter-spacing: -0.015em;
  text-wrap:      balance;
  padding-right:  2.5rem;
}
.news-modal__body { padding: 1.4rem 1.6rem 0.5rem; flex: 1; }
.news-modal__body p {
  font-size:     0.91rem;
  color:         var(--glass-text-dim);
  line-height:   1.72;
  margin-bottom: 0.9rem;
  text-wrap:     pretty;
}
.news-modal__body p:last-child { margin-bottom: 0; }
.news-modal__body strong { color: var(--glass-text); font-weight: var(--fw-bold); }
.news-modal__body em     { font-style: italic; }
.news-modal__body a {
  color:                var(--color-link);
  text-decoration:      underline;
  text-underline-offset: 2px;
}
.news-modal__body a:hover { color: #fceb19; }
.news-modal__figure {
  margin:        1rem 0;
  border-radius: var(--radius-md);
  overflow:      hidden;
  border:        1px solid var(--glass-border);
}
.news-modal__figure img { width: 100%; height: auto; display: block; }
.news-modal__figure figcaption {
  padding:     0.5rem 0.9rem;
  font-size:   0.78rem;
  color:       var(--glass-text-dim);
  background:  rgba(255, 255, 255, 0.05);
  border-top:  1px solid var(--glass-hairline);
  font-style:  italic;
}
.news-modal__links {
  display:     flex;
  flex-wrap:   wrap;
  gap:         0.6rem;
  margin-top:  1.1rem;
  padding-top: 1rem;
  border-top:  1px solid var(--glass-hairline);
}
.news-modal__link-btn {
  display:         inline-flex;
  align-items:     center;
  gap:             0.35rem;
  padding:         0.38rem 0.95rem;
  border-radius:   var(--radius-pill);
  background:      var(--btn-assist-bg);
  border:          1px solid var(--btn-assist-border);
  color:           var(--btn-assist-text-color);
  font-size:       0.84rem;
  font-weight:     var(--fw-semibold);
  text-decoration: none;
  transition:      background 130ms;
}
.news-modal__link-btn:hover {
  background:      var(--btn-assist-bg-hover);
  text-decoration: none;
  color:           var(--btn-assist-text-color);
}
.news-modal__nav {
  display:         flex;
  justify-content: space-between;
  gap:             1rem;
  padding:         0.85rem 1.6rem;
  margin-top:      1rem;
  border-top:      1px solid var(--glass-hairline);
  background:      rgba(255, 255, 255, 0.04);
  flex-shrink:     0;
}
.news-modal__nav-btn {
  font-size:   0.82rem;
  font-weight: var(--fw-semibold);
  color:       var(--color-link);
  background:  none;
  border:      none;
  cursor:      pointer;
  padding:     0;
  font-family: inherit;
  transition:  opacity 130ms;
}
.news-modal__nav-btn:disabled { opacity: 0.3; cursor: default; }
body.modal-open { overflow: hidden; }

/* Pagination im News-Kontext — überschreibt Light-Theme-Tokens */
.news-body .pagination        { color: var(--glass-text-dim); }
.news-body .pagination__btn {
  background:   rgba(255, 255, 255, 0.07);
  border-color: var(--glass-border);
  color:        var(--glass-text);
}
.news-body .pagination__btn:hover:not([disabled]) {
  background:   rgba(255, 255, 255, 0.14);
  border-color: rgba(255, 255, 255, 0.28);
}
.news-body .pagination__btn--active,
.news-body .pagination__btn[aria-current="page"] {
  background:   var(--color-primary);
  border-color: var(--color-primary);
  color:        #fff;
}
.news-body .pagination__info { color: var(--glass-text-dim); }
@media (max-width: 600px) {
  .news-modal[aria-hidden="false"] { align-items: flex-end; }
  .news-modal__panel {
    border-radius: 18px 18px 0 0;
    margin:        0;
    max-height:    88vh;
    width:         100%;
  }
}


/* ══════════════════════════════════════════════════════
   VEREINSMEISTERSCHAFT — Hero, Rangliste, Teilnehmer
══════════════════════════════════════════════════════ */
.vm-page-card { border-top: none; }
.vm-page-card .page-card__filterbar { padding-left: 1.1rem; padding-right: 1.1rem; }
.vm-page-card .page-card__body { padding: 0 1.1rem 1.25rem; }

/* Hinweis auf seitliches Scrollen. Wird von vereinsmeisterschaft.js nur
   gesetzt, wenn die Tabelle tatsächlich breiter ist als ihr Container —
   sonst bleibt er leer und nimmt keinen Platz ein. */
.tabellen-hinweis {
  font-size:   0.78rem;
  color:       var(--glass-text-dim);
  margin:      0.5rem 0 0;
  text-align:  right;
}

.tabellen-hinweis:empty { display: none; }

/* Verlaufskante am rechten Rand: das deutlichste Zeichen dafuer, dass es
   seitlich weitergeht — der Inhalt laeuft sichtbar aus dem Bild heraus,
   statt scharf abzuschneiden. Sie verschwindet, sobald das Ende erreicht
   ist, und ist damit zugleich eine Fortschrittsanzeige.
   Liegt ueber den Zellen, weil diese teils deckend sind. */
.tabelle-umschlag {
  position: relative;
}

.tabelle-umschlag::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  width: 2.5rem;
  pointer-events: none;
  background: linear-gradient(to left, var(--vm-table-solid), transparent);
  opacity: 0;
}

.tabelle-umschlag.zeigt-mehr::after {
  opacity: 1;
}

@media (prefers-reduced-motion: no-preference) {
  .tabelle-umschlag::after {
    transition: opacity 0.18s ease;
  }
}

/* Ziehbare Tabelle: der Greifzeiger sagt vor dem ersten Versuch, dass man
   hier ziehen kann. Nur wenn tatsaechlich Ueberlauf besteht. */
.table-responsive.ist-scrollbar { cursor: grab; }
.table-responsive.zieht { cursor: grabbing; user-select: none; }

/* Kreuztabelle: offene Felder neutral */
#tab-kreuztabelle .cell-offen {
  background: transparent !important;
  color:       var(--color-text-secondary);
  font-style:  italic;
  font-size:   0.8rem;
  letter-spacing: 0.02em;
}
#tab-kreuztabelle .cell-offen::before { content: "\2013"; }

/* Pip: kein Pulsieren — blasses Gelb für offene Partien */

/* ══════════════════════════════════════════════════════════════════════
   Ansetzungen — Rundentrenner und Paarungsliste

   Ersetzt das frühere Akkordeon aus 16 aufklappbaren Karten. Das zeigte im
   Startzustand 851 px Balken ohne einen einzigen Inhalt, hielt den Inhalt
   doppelt im DOM (Tabelle für Desktop, Karten für Mobil) und legte über die
   Reiterleiste eine dritte Bedienebene.

   Der Trenner ist derselbe wie der Monats-Trenner der Terminseite: Linie,
   Beschriftung, Linie — ohne Rahmen und Fläche. Die Paarungen darunter sind
   eine Liste, keine Tabelle in einer Karte.
   ══════════════════════════════════════════════════════════════════════ */
.vm-runde__zusatz {
  flex-shrink: 0;
  font-size: 0.72rem;
  color: var(--glass-text-dim);
}

.vm-runde__chip { flex-shrink: 0; }

/* Eine Zeile je Paarung. Bei schmalen Breiten rutscht das Ergebnis unter die
   Namen, statt sie zusammenzuquetschen. */
.vm-paarung {
  display: grid;
  grid-template-columns: 1.6rem minmax(0, 1fr) auto;
  align-items: baseline;
  gap: 0.5rem;
  padding: 0.32rem 0;
  font-size: 0.88rem;
  line-height: 1.45;
  color: var(--glass-text);
}

.vm-paarung + .vm-paarung {
  border-top: 1px solid var(--glass-surface);
}

/* Der Stichkampf kennt keine Brettnummern */
.vm-paarung--sk { grid-template-columns: minmax(0, 1fr) auto; }

.vm-paarung__brett {
  font-size: 0.7rem;
  font-weight: var(--fw-bold);
  color: var(--glass-text-dim);
  font-variant-numeric: tabular-nums;
  text-align: right;
}

.vm-paarung__namen {
  min-width: 0;
  overflow-wrap: anywhere;
}

.vm-paarung__vs {
  color: var(--glass-text-dim);
  padding: 0 0.35rem;
}

/* Punktestand vor der Runde, direkt am Namen. Zurückgenommen, damit er den
   Namen nicht überlagert — vorher standen die Punkte in eigenen Spalten
   neben dem Ergebnis und luden zum Verwechseln mit dem Partieergebnis ein. */
.vm-paarung__pkt {
  color: var(--glass-text-dim);
  font-size: 0.78rem;
  font-variant-numeric: tabular-nums;
  margin-left: 0.28rem;
  white-space: nowrap;
}

.vm-paarung__erg {
  font-size: 0.82rem;
  font-weight: var(--fw-semibold);
  font-variant-numeric: tabular-nums;
  text-align: right;
  white-space: nowrap;
}

/* Spielfrei und gestrichen tragen ihre Bedeutung über das Wort und die
   Durchstreichung — nicht über eine gedimmte Farbe, die unter AA fällt. */
.vm-paarung__erg--frei {
  font-weight: var(--fw-regular, 400);
  color: var(--glass-text-dim);
}

.vm-paarung__erg--canc {
  font-weight: var(--fw-regular, 400);
  text-decoration: line-through;
  color: var(--glass-text-dim);
}

.vm-paarung__erg--offen { color: var(--accent-text-fade); }

@media (max-width: 560px) {
  .vm-paarung {
    grid-template-columns: 1.4rem minmax(0, 1fr);
    row-gap: 0.1rem;
  }
  .vm-paarung--sk { grid-template-columns: minmax(0, 1fr); }
  .vm-paarung__erg {
    grid-column: 2;
    text-align: left;
    color: var(--glass-text-dim);
  }
  .vm-paarung--sk .vm-paarung__erg { grid-column: 1; }
  .vm-runde__zusatz { display: none; }
}

/* Starterliste — Teilnehmer der Vereinsmeisterschaft.
   Vorher eine <table>, die per display:block/none/grid/flex und sechs
   !important zu einem Kachelraster umgebogen wurde, mit einem Kasten je
   Name: 15 Kästen, 60 Rahmenkanten, 190 Zeichen Inhalt — die Textfläche
   machte 26 % der Kastenfläche aus, das Raster gewann gegen die Namen.

   Jetzt eine schlichte Liste. Die Struktur trägt der Nummern-Chip, die
   Spalten entstehen durch Abstand. Die Spaltenzahl richtet sich nach der
   verfügbaren Breite, nicht nach der Teilnehmerzahl — vorher war
   grid-template-rows auf genau 15 Teilnehmer gerechnet, bei 16 entstand
   eine vierte, schmalere Spalte. */
.starterliste {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));
  gap: 0.15rem 1.5rem;
}

.starterliste li {
  display: flex;
  align-items: baseline;
  gap: 0.55rem;
  padding: 0.3rem 0;
  font-size: 0.9rem;
  line-height: 1.5;
  color: var(--table-text-color);
}

/* Startnummer im Kreis. Die Fläche ist ein Schleier, keine eigene Farbe:
   So liegt sie überall gleich weit über der Karte (10,8 ΔE), gleich wie
   das Foto darunter gerade steht. Die frühere feste Tönung war für eine
   dunklere Karte kalibriert und verschwand auf der helleren fast. */
.starterliste__nr {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.6rem;
  height: 1.6rem;
  border-radius: 50%;
  background: linear-gradient(rgba(255, 255, 255, 0.13), rgba(255, 255, 255, 0.13));
  color: var(--glass-text);
  font-size: 0.72rem;
  font-weight: var(--fw-bold);
  font-variant-numeric: tabular-nums;
}

.starterliste__name {
  min-width: 0;
  overflow-wrap: anywhere;
}

@media (max-width: 767px) { .col-dv { display: none !important; } }


/* Mobile ≤ 560px */
@media (max-width: 560px) {
  .vm-page-card .page-card__body {
    padding-left:  0.5rem !important;
    padding-right: 0.5rem !important;
  }
}

/* =========================================================
   Barrierefreiheit: Blur reduzieren bei prefers-reduced-transparency
   Ergibt dasselbe Aussehen (solid composited color), ohne
   teuren backdrop-filter auf schwachen Geräten.
   ========================================================= */
@media (prefers-reduced-transparency: reduce) {
  .page-card {
    backdrop-filter:         none;
    -webkit-backdrop-filter: none;
    /* Mittelwert dessen, was das Material sonst ergibt — nicht mehr ein
       eigener Wert, der von der Karte abweicht. */
    background:              var(--karte-flaeche);
  }
  .hw {
    backdrop-filter:         none;
    -webkit-backdrop-filter: none;
    background:              rgb(42, 47, 68);
  }
}
