@charset "UTF-8";

/* ============================================================
   Freiwillige Feuerwehr Colbitz — zentrales Stylesheet
   Struktur: Tokens → Basis → Komponenten (mobile zuerst, Desktop
   je Komponente in einer nested Media Query).
   Desktop-Breakpoint überall identisch: [breakpoint-desktop] 1400px
   ============================================================ */

/* ---------- Design-Tokens ---------- */
:root {
    /* Farben */
    --c-primary: #2b5ca8;       /* Dunkelblau der Menüleiste */
    --c-primary-dark: #234b89;  /* Hover/aktiv */
    --c-accent: #c6d76f;        /* Lindgrün des Suchfelds — für FLÄCHEN */
    --c-on-accent: #1d1d1d;     /* Text auf Grün */

    /* Aufgehelltes Akzentgrün für TEXT auf blauem Grund. Das Flächen-Grün
       --c-accent erreicht auf --c-primary nur 4.17:1 und verfehlt damit
       WCAG 1.4.3 (4.5:1 für Text unter 18.66px/bold bzw. 24px). Dieser Ton
       schafft 4.78:1 auf --c-primary und 6.27:1 auf --c-primary-dark, bei
       gleichem Farbeindruck. Flächen (Notrufband, Badge, Suchfeld) behalten
       bewusst --c-accent — dort steht dunkler Text darauf (10.7:1). */
    --c-accent-text: #d5e488;
    --c-text: #222;
    --c-surface: #f4f6ea;       /* heller Fond der Inhaltssektionen */

    /* Formular-Zustände. Kontrast geprüft: Fehler 6.54:1 und Erfolg 7.87:1
       auf Weiß, Feldrahmen 4.83:1 (nötig wären 3:1 für Bedienelemente).
       Farbe ist nirgends das alleinige Unterscheidungsmerkmal — zu jedem
       Fehler gehört Klartext (WCAG 1.4.1). */
    --c-error: #b3261e;
    --c-success: #1b5e20;
    --c-field-border: #6b7280;

    /* Trennlinien im Menü */
    --nav-hairline: rgb(255 255 255 / 0.35);
    --nav-hairline-soft: rgb(255 255 255 / 0.15);

    /* Maße */
    --header-h: 110px;          /* Höhe der Menüleiste (Desktop) */
    --header-h-mobile: 68px;    /* Kopfzeile mobil: Brand-Padding (2×0.5rem) + Wappen (46px breit → ~52px hoch). Bei Änderung dort mitziehen! */
    /* Überstand des Logo-Blocks ins Hero. Bestimmt zugleich die Höhe von
       .brand (= --header-h + dieser Wert) und damit den Innenraum für
       Wappen + Wortmarke + Slogan. Nicht unter 58px senken: darunter reicht
       der Platz nicht mehr für die Unterlängen des Schreibschrift-Slogans
       (siehe Kommentar bei .brand__slogan). */
    --brand-overlap: 58px;
    --tap-target: 44px;         /* Mindestgröße interaktiver Flächen */

    /* Maximale Inhaltsbreite — gilt für JEDE Seite: Startseiten-Abschnitte,
       Meldungsübersicht, Beiträge, Rechtsseiten, Footer. Dadurch stehen alle
       Inhalte auf derselben linken und rechten Kante, und der Wechsel von der
       Startseite auf eine Unterseite lässt nichts springen (Nutzerentscheidung
       25.07.2026 — vorher lagen Startseite bei 1200px und Unterseiten bei
       960px, ein Versatz von 120px je Seite, der wie ein Fehler wirkte).
       Wird dieser Wert geändert, ändert sich die Website als Ganzes — das ist
       beabsichtigt. Ausgenommen bleiben nur Bereiche mit eigener,
       inhaltlich begründeter Breite: Leichte Sprache (kurze Zeilen sind dort
       Teil der Sprachregeln) und das Melde-Formular. */
    --breite-inhalt: 75rem;

    /* Sticky-Shrink-Kopfzeile: .site-header.is-scrolled schaltet --header-h /
       --header-h-mobile lokal auf diese Kompaktwerte um (Scoping nur im
       Header-Teilbaum — .hero rechnet weiter mit den vollen Werten) */
    --header-h-scrolled: 72px;         /* kompakte Menüleiste (Desktop) */
    --header-h-mobile-scrolled: 56px;  /* obere Schranke mobil; real ~53px (2×0.25rem Padding + Wappen 40px breit → ~45px hoch) */
    --header-scroll-threshold: 48px;   /* Scroll-Offset, ab dem geschrumpft wird (= Höhe der Messlatte aus header.js) */

    /* Animationsdauern. Achtung: --dur-panel und --dur-mega stecken
       jeweils AUCH im visibility-Delay der zugehörigen Transition —
       bei Änderung bleibt die Kopplung über den Token erhalten. */
    --dur-micro: 0.15s;         /* Hover-Farbwechsel */
    --dur-arrow: 0.18s;         /* Pfeil der Untermenü-Links */
    --dur-chevron: 0.2s;        /* Chevron-Rotation mobil */
    --dur-bar: 0.22s;           /* grüner Balken unterm Menüpunkt */
    --dur-burger: 0.25s;        /* Burger-Icon ⇄ X */
    --dur-header: 0.3s;         /* Sticky-Kopfzeile: Wechsel voll ⇄ kompakt (steckt auch im visibility-Delay des Slogans) */
    --dur-mega-fade: 0.28s;     /* Fade des Mega-Panels */
    --dur-panel: 0.3s;          /* Akkordeon mobil (grid-rows) */
    --dur-mega: 0.32s;          /* Vorhang (clip-path) des Mega-Panels */
    --dur-slide: 1s;            /* Crossfade der Hero-Slideshow (steckt auch im visibility-Delay) */

    /* Schriften */
    --font-sans: system-ui, "Segoe UI", Arial, sans-serif;
    --font-script: "Segoe Script", "Bradley Hand", "Comic Sans MS", cursive;
    /* Überschriften: DIN-1451-artig (Bahnschrift = Windows-DIN, Fallbacks je Plattform) */
    --font-title: "Bahnschrift", "DIN Alternate", "Franklin Gothic Medium", "Arial Narrow", system-ui, sans-serif;
    /* Wortmarke im Logo: humanistisch, rundere Formen (Nutzerwahl 21.07.2026 per Vergleich) */
    --font-logo: "Candara", "Corbel", "Optima", "Segoe UI", system-ui, sans-serif;
}

/* ---------- Basis ---------- */
*,
*::before,
*::after {
    box-sizing: border-box;
}

html {
    /* Sticky-Shrink: Browser-Scroll-Anchoring würde beim Schrumpfen der
       Kopfzeile den Scrollwert zurückkorrigieren → Endlos-Toggle an der
       Schwelle. Unkritisch abschaltbar: alle Bilder haben width/height,
       es gibt keine nachladenden Layout-Shift-Quellen. */
    overflow-anchor: none;
    /* Ankerziele (z. B. Skip-Link → #inhalt) nie unter der Sticky-Kopfzeile
       verstecken — bewusst die vollen :root-Höhen, nicht die kompakten */
    scroll-padding-block-start: var(--header-h-mobile);

    /* Ankersprünge (z. B. „Nach oben" im Footer) gleiten sanft — außer der
       Nutzer wünscht reduzierte Bewegung */
    @media (prefers-reduced-motion: no-preference) {
        scroll-behavior: smooth;
    }

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        scroll-padding-block-start: var(--header-h);
    }
}

/* Gegenstück zum <meta name="color-scheme">: legt die Farbwelt auch für vom
   Browser gezeichnete Teile fest (Formularfelder, Scrollbalken, Auswahlfarbe).
   Erst dadurch ist ausgeschlossen, dass ein automatischer Dunkelmodus die
   Eingabefelder des Melde-Formulars dunkel einfärbt. */
:root {
    color-scheme: light;
}

body {
    margin: 0;
    font-family: var(--font-sans);
    color: var(--c-text);
    background: #fff;
    line-height: 1.5;
}

img {
    max-width: 100%;
    height: auto;
}

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

/* Skip-Link-Ziel: Fokusring auf dem nicht-interaktiven main unterdrücken */
#inhalt:focus-visible {
    outline: none;
}

@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        transition-duration: 0.01ms !important;
        transition-delay: 0s !important;
        animation-duration: 0.01ms !important;
    }
}

.visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

.skip-link {
    position: absolute;
    inset-inline-start: -9999px;
    inset-block-start: 0;
    z-index: 100;
    background: #fff;
    color: var(--c-primary);
    font-weight: 700;
    padding: 0.75rem 1.25rem;
    text-decoration: none;

    &:focus {
        inset-inline-start: 0;
    }
}

/* ============================================================
   Kopfbereich
   ============================================================ */

/* Unsichtbare Scroll-Messlatte (fügt header.js an den Body-Anfang ein):
   verlässt sie den Viewport, wird .site-header kompakt (.is-scrolled) */
.header-sentinel {
    position: absolute;
    inset-block-start: 0;
    inset-inline-start: 0;
    width: 1px;
    height: var(--header-scroll-threshold);
    pointer-events: none;
}

.site-header {
    position: sticky;
    inset-block-start: 0;
    z-index: 2;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    /* Mobil trägt die Kopfzeile die Markenfarbe (Nutzerentscheidung 25.07.2026):
       Ein weißer Block wirkte über dem blauen Menü und dem Hero wie ein
       Fremdkörper. Mit dem Verlauf gehen Kopfzeile, aufgeklapptes Menü und
       Suchfeld ineinander über. Im Desktop-Block unten wird der Hintergrund
       wieder auf transparent gesetzt — dort trägt .brand den weißen Block mit
       der geschwungenen Unterkante, und daran ändert sich nichts. */
    background: linear-gradient(160deg, var(--c-primary) 0%, var(--c-primary-dark) 100%);
    /* Startwert mit Alpha 0, damit der Schatten weich einblenden kann */
    box-shadow: 0 6px 18px rgb(0 0 0 / 0);
    transition: box-shadow var(--dur-header) ease;

    /* Kompakt-Zustand: Höhen-Tokens NUR im Header-Teilbaum umschalten —
       Brand, Menüleiste, Suche, Mega-Panel-Offset und Panel-max-height
       folgen automatisch; .hero (Sibling) behält die vollen Werte,
       die Hero-Höhe bleibt also beim Scrollen exakt stehen */
    &.is-scrolled {
        --header-h: var(--header-h-scrolled);
        --header-h-mobile: var(--header-h-mobile-scrolled);
        --brand-overlap: 0px;
        box-shadow: 0 6px 18px rgb(0 0 0 / 0.15);
    }

    /* [breakpoint-desktop] 3-Zonen-Grid wie Vorlage; Logo- und Suchspalte
       wachsen mit dem Viewport mit, damit die Menüleiste am unteren
       Desktop-Rand nicht gequetscht wird */
    @media (min-width: 1400px) {
        display: grid;
        grid-template-columns: minmax(280px, min(21vw, 400px)) minmax(0, 1fr) minmax(250px, min(20vw, 380px));
        grid-template-rows: var(--header-h);
        align-items: start;
        background: transparent;
        transition: box-shadow var(--dur-header) ease, grid-template-rows var(--dur-header) ease;
    }
}

/* ---------- Logo-Block ---------- */
.brand {
    display: flex;
    align-items: center;
    padding: 0.5rem 1rem;
    flex: 1 1 auto;
    min-width: 0; /* Wortmarke darf schrumpfen, statt den Menü-Button umzubrechen */
    transition: padding var(--dur-header) ease;

    /* Kompakt (mobil): flachere Leiste — ergibt real ~53px Kopfzeilenhöhe */
    .site-header.is-scrolled & {
        padding-block: 0.25rem;
    }

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        position: relative;
        z-index: 2; /* liegt wie in der Vorlage über dem Mega-Panel */
        flex-direction: column;
        justify-content: center;
        gap: 0.4rem;
        width: 100%;
        height: calc(var(--header-h) + var(--brand-overlap));
        /* Knapp bemessen: Wappen (81.6px) + gap + Slogan-Zeile müssen in den
           Innenraum passen, sonst staucht Flexbox den Slogan und overflow:hidden
           schneidet die Unterlängen ab (Fix 25.07.2026). */
        padding-block: 0.25rem 2rem;
        padding-inline: 1.75rem;
        background: #fff;
        /* Unterkante: sanft geschwungener Bogen wie in der Vorlage;
           die gerade Diagonale bleibt als Fallback für Browser ohne shape() */
        clip-path: polygon(0 0, 100% 0, 100% calc(100% - 34px), 0 100%);
        clip-path: shape(from 0 0, line to 100% 0, line to 100% calc(100% - 34px), curve to 0 100% with 55% 100%);
        transition: height var(--dur-header) ease, padding var(--dur-header) ease,
            gap var(--dur-header) ease, clip-path var(--dur-header) ease;

        /* Kompakt (Desktop): kein Überhang, flache Unterkante. WICHTIG:
           gleiche Kommandostruktur wie oben — shape()/polygon → none wäre
           nicht animierbar, degenerierte Kurve/Punkte interpolieren weich */
        .site-header.is-scrolled & {
            padding-block: 0.5rem 0.6rem;
            gap: 0;
            clip-path: polygon(0 0, 100% 0, 100% calc(100% - 0px), 0 100%);
            clip-path: shape(from 0 0, line to 100% 0, line to 100% calc(100% - 0px), curve to 0 100% with 55% 100%);
        }
    }
}

.brand__link {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    text-decoration: none;
    flex: 1;
    min-width: 0;

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        width: 100%;
    }
}

.brand__wappen {
    width: 46px;
    transition: width var(--dur-header) ease;

    /* Kompakt (mobil) */
    .site-header.is-scrolled & {
        width: 40px;
    }

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        width: 72px;

        /* Kompakt (Desktop) */
        .site-header.is-scrolled & {
            width: 44px;
        }
    }
}

/* Wortmarke als skalierendes Gesamtbild: textLength sperrt beide Zeilen
   auf exakt gleiche Breite — plattformunabhängig, egal welcher Font greift.
   aspect-ratio ist nötig, weil ein <svg> ohne width/height-Attribute
   sonst keine intrinsische Größe hat und kollabiert. */
.brand__wordmark {
    flex: 1;
    min-width: 0;
    max-width: 165px;
    height: auto;
    aspect-ratio: 240 / 58;
    transition: max-width var(--dur-header) ease;

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        /* endlicher Wert (nicht none): none → <Länge> wäre nicht animierbar.
           230px begrenzt die Wortmarke auch auf breiten Desktops (Nutzerwunsch
           „etwas kleiner", 21.07.2026) */
        max-width: 230px;

        /* Kompakt (Desktop) */
        .site-header.is-scrolled & {
            max-width: 170px;
        }
    }
}

/* Wortmarke: mobil hell auf der blauen Kopfzeile, im Desktop-Modus in den
   Markenfarben auf dem weißen Logo-Block. Kontrast geprüft — hell auf Blau
   5.49:1 (Unterzeile) bzw. 6.56:1 (COLBITZ), in beiden Verlaufsenden. */
.brand__wordmark-sub {
    font-family: var(--font-logo);
    font-size: 13px; /* viewBox-Einheiten */
    font-weight: 700;
    fill: rgb(255 255 255 / 0.88);

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        fill: var(--c-primary);
    }
}

.brand__wordmark-main {
    font-family: var(--font-logo);
    font-size: 46px; /* viewBox-Einheiten */
    font-weight: 700;
    fill: #fff;

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        fill: var(--c-primary-dark);
    }
}

/* Im Windows-Kontrastmodus werden SVG-Füllfarben nicht automatisch ersetzt —
   ohne diesen Block bliebe die Wortmarke hell auf hellem Systemhintergrund. */
@media (forced-colors: active) {
    .brand__wordmark-sub,
    .brand__wordmark-main {
        fill: CanvasText;
    }
}

.brand__slogan {
    display: none;
    margin: 0;
    font-family: var(--font-script);
    font-size: clamp(0.8rem, 0.05rem + 0.8vw, 1.05rem);
    white-space: nowrap;
    color: var(--c-primary);

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        display: block;
        /* Großzügige Zeilenhöhe: Segoe Script ragt über die normale Zeilenbox
           hinaus — ohne die Extra-Luft schneidet overflow:hidden die
           Unterlängen ab. height:1lh (= line-height) bleibt dadurch
           animierbar UND beschnittfrei. */
        line-height: 1.9;
        height: 1lh;
        overflow: hidden;
        transition: height var(--dur-header) ease, opacity var(--dur-header) ease, visibility 0s;

        /* Kompakt (Desktop): ausblenden und aus dem Accessibility-Tree nehmen;
           visibility kippt erst NACH dem Ausblenden (Delay), beim Einblenden sofort */
        .site-header.is-scrolled & {
            height: 0;
            opacity: 0;
            visibility: hidden;
            transition: height var(--dur-header) ease, opacity var(--dur-header) ease,
                visibility 0s linear var(--dur-header);
        }
    }
}

/* ---------- Burger-Button (nur mobil sichtbar): dezenter Icon-Button,
   Accessible Name „Menü" liegt im visually-hidden-Span ---------- */
.nav-toggle {
    display: inline-grid;
    place-items: center;
    margin-inline: auto 1rem;
    width: var(--tap-target);
    height: var(--tap-target);
    padding: 0;
    border: 0;
    border-radius: 0.5rem;
    background: transparent;
    /* steht auf der blauen Kopfzeile (siehe .site-header) */
    color: #fff;
    cursor: pointer;
    transition: background-color var(--dur-micro) ease;

    &:hover {
        background: rgb(255 255 255 / 0.16);
    }

    &:focus-visible {
        outline-color: #fff;
    }

    /* [breakpoint-desktop] display:none ist zugleich die Moduserkennung
       von nav.js — hier niemals einen anderen Wert verwenden */
    @media (min-width: 1400px) {
        display: none;
    }
}

.nav-toggle__icon {
    display: block;
    position: relative;
    width: 22px;
    height: 2px;
    background: currentColor;
    transition: background-color var(--dur-burger) ease;

    &::before,
    &::after {
        content: "";
        position: absolute;
        left: 0;
        width: 22px;
        height: 2px;
        background: currentColor;
        transition: top var(--dur-burger) ease, rotate var(--dur-burger) ease;
    }

    &::before { top: -7px; }
    &::after { top: 7px; }

    /* Offenes Panel → X. Zustand hängt am aria-expanded, das nav.js ohnehin
       pflegt. transparent statt visibility: das Alpha bleibt auch im
       Windows-Kontrastmodus erhalten, der Mittelbalken verschwindet dort mit */
    .nav-toggle[aria-expanded="true"] & {
        background-color: transparent;

        &::before {
            top: 0;
            rotate: 45deg;
        }

        &::after {
            top: 0;
            rotate: -45deg;
        }
    }

    /* Windows-Kontrastmodus: currentColor-Balken würden sonst verschwinden */
    @media (forced-colors: active) {
        &,
        &::before,
        &::after {
            background: ButtonText;
        }
    }
}

/* ---------- Aufklapp-Panel mit Menü + Suche (mobil) ----------
   Liegt als Overlay ÜBER dem Hero (absolut unter der Kopfzeile),
   statt den Seiteninhalt nach unten zu schieben; gleitet sanft ein.
   Geschlossen via visibility → auch aus der Tab-Reihenfolge raus. */
.header-panel {
    position: absolute;
    inset-inline: 0;
    inset-block-start: 100%;
    display: block;
    visibility: hidden;
    opacity: 0;
    translate: 0 -0.5rem;
    max-height: calc(100dvh - var(--header-h-mobile));
    overflow-y: auto;
    box-shadow: 0 12px 24px rgb(0 0 0 / 0.25);
    transition: opacity var(--dur-panel) ease, translate var(--dur-panel) ease, visibility 0s linear var(--dur-panel);

    &.is-open {
        visibility: visible;
        opacity: 1;
        translate: 0 0;
        transition: opacity var(--dur-panel) ease, translate var(--dur-panel) ease, visibility 0s;
    }

    /* [breakpoint-desktop] Panel löst sich auf, Nav + Suche werden Grid-Zellen.
       visibility MUSS hier explizit auf visible, weil es vererbt wird und der
       display:contents-Knoten sonst Nav + Suche unsichtbar machen würde. */
    @media (min-width: 1400px) {
        display: contents;
        visibility: visible;
    }
}

/* ---------- Hauptmenü ---------- */
.main-nav {
    background: var(--c-primary);

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        height: var(--header-h);
        transition: height var(--dur-header) ease;
    }
}

.main-nav__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;

    > li + li {
        border-block-start: 1px solid var(--nav-hairline);
    }

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        flex-direction: row;
        height: 100%;

        > li + li {
            border-block-start: 0;
            border-inline-start: 1px solid var(--nav-hairline);
        }
    }
}

.main-nav__item {
    display: flex;
    flex-wrap: wrap;

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        /*
         * flex-basis: auto (nicht 0) — die Punkte teilen sich die Leiste
         * NACH ihrem Textbedarf und wachsen dann gleichmäßig in den Rest.
         * Mit basis 0 bekämen alle sechs dieselbe Breite, und das längste
         * Label („Jugendfeuerwehr") bräche knapp über dem Breakpoint um,
         * während „Technik" die Hälfte seines Platzes verschenkt.
         */
        flex: 1 1 auto;
        min-width: 0;
    }
}

.main-nav__link {
    flex: 1;
    display: flex;
    align-items: center;
    min-height: var(--tap-target);
    padding-block: 0.9rem;
    padding-inline: 1.25rem;
    color: #fff;
    text-decoration: none;
    text-transform: uppercase;
    font-weight: 700;
    letter-spacing: 0.02em;
    line-height: 1.25;
    transition: background-color var(--dur-micro) ease;

    &:hover,
    &[aria-current="page"] {
        background: var(--c-primary-dark);
    }

    &:focus-visible {
        outline-color: #fff;
        outline-offset: -4px;
    }

    /* Windows-Kontrastmodus: Hintergrund-Markierung entfällt dort */
    @media (forced-colors: active) {
        &[aria-current="page"] {
            text-decoration: underline;
        }
    }

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        min-width: 0;
        position: relative;
        justify-content: center;
        text-align: center;
        padding: 0.5rem 0.75rem;
        font-size: clamp(0.8125rem, 0.55rem + 0.45vw, 1rem);
        overflow-wrap: break-word;
        hyphens: auto;

        /* Dynamischer Balken: wächst beim Hover/Fokus von links */
        &::after {
            content: "";
            position: absolute;
            inset-inline: 0;
            inset-block-end: 0;
            height: 6px;
            background: var(--c-accent);
            transform: scaleX(0);
            transform-origin: left center;
            transition: transform var(--dur-bar) ease;

            @media (forced-colors: active) {
                background: Highlight;
            }
        }

        .main-nav__item:hover > &::after,
        .main-nav__item.is-open > &::after,
        &:focus-visible::after {
            transform: scaleX(1);
        }
    }
}

/* ---------- Untermenü-Toggle (nur mobil; Desktop öffnet per Hover/Fokus) ---------- */
.submenu-toggle {
    width: 56px;
    min-height: var(--tap-target);
    border: 0;
    border-inline-start: 1px solid var(--nav-hairline);
    background: transparent;
    color: #fff;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;

    &:focus-visible {
        outline-color: #fff;
        outline-offset: -4px;
    }

    svg {
        transition: transform var(--dur-chevron) ease;
    }

    .main-nav__item.is-open > & svg {
        transform: rotate(180deg);
    }

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        display: none;
    }
}

/* ---------- Untermenü ----------
   Mobil: eingerückte Liste auf dunklerem Blau, gleitet per
   0fr→1fr-Grid-Animation auf. Desktop: vollbreites Mega-Panel,
   öffnet als sanfter Vorhang (Fade + clip-path von oben).
   Geschlossene Panels sind immer gerendert und werden über visibility
   unsichtbar UND unfokussierbar gehalten — nicht auf display:none umstellen. */
.submenu {
    display: grid;
    grid-template-rows: 0fr;
    visibility: hidden;
    flex-basis: 100%;
    background: var(--c-primary-dark);
    transition: grid-template-rows var(--dur-panel) ease, visibility 0s linear var(--dur-panel);

    .main-nav__item.is-open > & {
        grid-template-rows: 1fr;
        visibility: visible;
        transition: grid-template-rows var(--dur-panel) ease, visibility 0s;
    }

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        position: absolute;
        inset-inline: 0;
        inset-block-start: var(--header-h);
        z-index: 1;
        display: block;
        opacity: 0;
        clip-path: inset(0 0 100% 0);
        flex-basis: auto;
        background: rgb(255 255 255 / 0.93);
        backdrop-filter: blur(6px);
        box-shadow: 0 18px 30px rgb(0 0 0 / 0.18);
        padding-block: 4.5rem 2.75rem;
        padding-inline: clamp(1.5rem, 5vw, 6rem);
        transition: opacity var(--dur-mega-fade) ease, clip-path var(--dur-mega) ease,
            inset-block-start var(--dur-header) ease, visibility 0s linear var(--dur-mega);

        .main-nav__item.is-open > & {
            opacity: 1;
            clip-path: inset(0 0 0 0);
            transition: opacity var(--dur-mega-fade) ease, clip-path var(--dur-mega) ease,
                inset-block-start var(--dur-header) ease, visibility 0s;
        }
    }
}

.submenu__list {
    list-style: none;
    margin: 0;
    padding: 0;
    min-height: 0;
    overflow: hidden;

    /* Luft über dem ersten/unter dem letzten Punkt als Margin der Kinder,
       NICHT als Padding der Liste: Padding ließe die geschlossene 0fr-Liste
       8px hoch bleiben — sichtbar als Streifen unter dem aktiven Punkt */
    > li:first-child {
        margin-block-start: 0.25rem;
    }

    > li:last-child {
        margin-block-end: 0.25rem;
    }

    li + li {
        border-block-start: 1px solid var(--nav-hairline-soft);
    }

    a {
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 1rem;
        min-height: var(--tap-target);
        padding-block: 0.6rem;
        padding-inline: 2rem 1.25rem;
        color: #fff;
        text-decoration: none;
        font-weight: 600;

        &::after {
            content: "\2192";
            transition: transform var(--dur-arrow) ease;
        }

        &:focus-visible {
            outline-color: #fff;
            outline-offset: -4px;
        }
    }

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
        column-gap: clamp(1.5rem, 4vw, 4.5rem);
        row-gap: 1.35rem;
        padding: 0;

        > li:first-child {
            margin-block-start: 0;
        }

        > li:last-child {
            margin-block-end: 0;
        }

        li + li {
            border-block-start: 0;
        }

        a {
            min-height: 0;
            padding-block: 0.4rem 0.8rem;
            padding-inline: 0;
            color: #232323;
            font-size: 1.0625rem;
            border-block-end: 1px solid #cfcfcf;
            transition: color var(--dur-micro) ease;

            &::after {
                color: #6f8f1f;
                font-weight: 700;
            }

            &:hover {
                color: var(--c-primary);
                border-color: var(--c-primary);
            }

            &:hover::after {
                transform: translateX(4px);
            }

            &:focus-visible {
                outline-color: var(--c-primary);
                outline-offset: 2px;
            }
        }
    }
}

/* ---------- Navigation OHNE JavaScript ----------
   Die Klasse .js setzt ein Inline-Skript im <head> (siehe header.php). Fehlt
   sie, ist kein JavaScript aktiv — dann kann der Burger-Button nichts öffnen
   und .header-panel/.submenu blieben per visibility unsichtbar UND
   unfokussierbar. Gemessen war das der Zustand: mobil 0 von 6 Hauptpunkten und
   0 von 24 Unterpunkten erreichbar, der Burger sichtbar, aber wirkungslos.
   Das widersprach dem Grundsatz „ohne JavaScript nutzbar".

   Ersatzverhalten hier: Das Menü ist dauerhaft offen. Mobil steht es im
   Textfluss unter der Kopfzeile, im Desktop öffnen die Mega-Panels rein per
   :hover / :focus-within — dafür braucht es kein Skript.

   Die Selektoren tragen html:not(.js) und damit eine Klasse mehr als die
   Regeln, die sie überschreiben (0,2,1 gegen 0,1,0). Das ist Absicht: Ohne
   den zusätzlichen Anteil gewönne bei den Desktop-Blöcken die Reihenfolge. */
html:not(.js) {
    /* Ein dauerhaft offenes Menü in einer klebenden Kopfzeile würde mobil den
       ganzen Bildschirm belegen und dort stehen bleiben. Ohne JS schrumpft die
       Kopfzeile ohnehin nicht (header.js läuft nicht) — sie darf mitscrollen. */
    .site-header {
        position: static;
    }

    .header-panel {
        position: static;
        visibility: visible;
        opacity: 1;
        translate: none;
        max-height: none;
        overflow: visible;
        box-shadow: none;
    }

    /* Beide Schalter sind ohne Skript wirkungslos. display:none nimmt sie
       zugleich aus dem Accessibility-Tree — sonst meldete ihr aria-expanded
       einen Zustand, den niemand ändern kann. */
    .nav-toggle,
    .submenu-toggle {
        display: none;
    }

    /* Mobil: Akkordeon dauerhaft aufgeklappt */
    .submenu {
        grid-template-rows: 1fr;
        visibility: visible;
    }

    /* [breakpoint-desktop] Sechs gleichzeitig offene Mega-Panels lägen
       übereinander. Deshalb hier zurück auf geschlossen und stattdessen per
       Hover/Fokus öffnen — :focus-within deckt die Tastaturbedienung ab. */
    @media (min-width: 1400px) {
        .header-panel {
            display: contents;
        }

        .submenu {
            visibility: hidden;
            opacity: 0;
            clip-path: inset(0 0 100% 0);
        }

        .main-nav__item:hover > .submenu,
        .main-nav__item:focus-within > .submenu {
            visibility: visible;
            opacity: 1;
            clip-path: inset(0 0 0 0);
        }
    }
}

/* ---------- Suchfeld ---------- */
.site-search {
    display: block;
    background: var(--c-accent);
    padding: 0.5rem 1rem;

    form {
        display: flex;
        align-items: center;
        gap: 0.5rem;
        width: 100%;
    }

    input {
        flex: 1;
        min-width: 0;
        min-height: var(--tap-target);
        border: 0;
        background: transparent;
        font: inherit;
        font-weight: 700;
        font-size: 1.0625rem;
        color: var(--c-on-accent);

        &::placeholder {
            color: var(--c-on-accent);
            opacity: 1;
        }

        &:focus-visible {
            outline-color: var(--c-on-accent);
        }
    }

    button {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        min-width: var(--tap-target);
        min-height: var(--tap-target);
        border: 0;
        background: transparent;
        color: var(--c-on-accent);
        cursor: pointer;

        &:focus-visible {
            outline-color: var(--c-on-accent);
        }
    }

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        display: flex;
        align-items: center;
        height: var(--header-h);
        padding-block: 0;
        padding-inline: 1.5rem;
        transition: height var(--dur-header) ease;
    }
}

/* ============================================================
   Hero („Superview"): füllt den Viewport immer exakt bis zur
   Unterkante — Höhe = Viewport minus Kopfzeile.

   svh, NICHT dvh (Fix 25.07.2026 — nicht zurückdrehen). dvh misst die
   ein- und ausblendenden Browserleisten mit: Beim Wischen fährt die
   Adressleiste ein, der Viewport wächst um rund 100px, der Hero wächst mit
   und schiebt alles darunter nach unten — auch weit unten bei den Kacheln
   und Meldungen, wo der Hero längst außer Sicht ist, aber weiterhin die
   Position des Inhalts darunter bestimmt. Gemessen: 100px Versatz.
   overflow-anchor:none (nötig für die schrumpfende Kopfzeile) verhindert
   zusätzlich, dass der Browser das ausgleicht.
   Preis von svh: Bei eingefahrener Leiste bleibt unter dem Hero ein Streifen
   des nächsten Abschnitts sichtbar — dafür steht die Seite still.
   In Chrome headless sind svh, dvh und lvh identisch (keine dynamische
   Leiste); der Unterschied lässt sich nur auf einem echten Mobilgerät prüfen.
   vh in der Zeile davor ist der Fallback für sehr alte Browser.
   Der Himmel-Verlauf bleibt als Platzhalter, bis das Bild geladen ist.
   ============================================================ */
.hero {
    position: relative;
    z-index: 1;
    height: calc(100vh - var(--header-h-mobile));
    height: calc(100svh - var(--header-h-mobile));
    /* KEIN overflow:hidden hier — die Kontakt-Box ragt bewusst über die
       Unterkante hinaus; die Bilder clippt stattdessen .hero__slides */
    background: linear-gradient(to bottom, #5f9ad8 0%, #8db9e6 45%, #c9def4 100%);

    /* [breakpoint-desktop] */
    @media (min-width: 1400px) {
        height: calc(100vh - var(--header-h));
        height: calc(100svh - var(--header-h));
    }
}

.hero__slides,
.hero__slide {
    position: absolute;
    inset: 0;
}

.hero__slides {
    overflow: hidden;
}

/* Crossfade; inaktive Folien via visibility auch aus dem Accessibility-Tree */
.hero__slide {
    visibility: hidden;
    opacity: 0;
    transition: opacity var(--dur-slide) ease, visibility 0s linear var(--dur-slide);

    &.is-active {
        visibility: visible;
        opacity: 1;
        transition: opacity var(--dur-slide) ease, visibility 0s;
    }
}

.hero__img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* Schnellzugriffe (BITV-Pflichtangebote): in JEDER Viewport-Größe sichtbar —
   mobil als 2×2-Raster gleich breiter Chips, Desktop als Reihe rechts oben.
   Die Kontakt-Box dagegen ist nur im Desktop-Modus da (Nutzerentscheidung). */
.hero__quicklinks {
    /* Chip-Farbtokens (Austauschpunkt für die Farbvariante): dunkles Glas.
       Kontrast-Wache WCAG 1.4.3: Alpha des Fonds nie unter 0.75 senken,
       sonst reißt 4.5:1 für weiße Schrift über hellem Himmel */
    --chip-bg: rgb(15 20 30 / 0.88); /* Fallback ohne backdrop-filter: fast deckend */
    --chip-fg: #fff;
    --chip-border: rgb(255 255 255 / 0.25);
    --chip-bg-hover: var(--c-accent);

    position: absolute;
    z-index: 2;
    inset-block-start: 0.75rem;
    inset-inline: 0.75rem;
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0.5rem;
    /* Tablet-Breiten: Raster bleibt kompakt rechts statt bildschirmbreit */
    max-width: 30rem;
    margin-inline-start: auto;

    /* Mit Blur darf der Fond etwas transparenter werden */
    @supports (backdrop-filter: blur(1px)) {
        --chip-bg: rgb(15 20 30 / 0.78);
    }

    a {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        gap: 0.45rem;
        min-height: 40px;
        padding: 0.4rem clamp(0.5rem, 2.5vw, 0.9rem);
        border: 1px solid var(--chip-border);
        border-radius: 999px;
        background: var(--chip-bg);
        color: var(--chip-fg);
        font-weight: 600;
        font-size: 0.85rem;
        text-decoration: none;
        box-shadow: 0 2px 8px rgb(0 0 0 / 0.2);
        transition: background-color var(--dur-micro) ease, color var(--dur-micro) ease;

        @supports (backdrop-filter: blur(1px)) {
            backdrop-filter: blur(8px) saturate(1.4);
        }

        svg {
            width: 16px;
            height: 16px;
            flex: none;
        }

        &:hover {
            background: var(--chip-bg-hover);
            color: var(--c-on-accent);
        }

        /* Kontrastmodus: opaker Fond — das Alpha der Autorenfarbe bliebe
           sonst erhalten und das Foto schiene durch den Chip */
        @media (forced-colors: active) {
            background: Canvas;
            border-color: ButtonText;
            backdrop-filter: none;
        }
    }

    /* [breakpoint-desktop] einzeilige Reihe rechts oben */
    @media (min-width: 1400px) {
        inset-block-start: 1.25rem;
        inset-inline: auto 1.5rem;
        display: flex;
        flex-wrap: nowrap;
        gap: 0.6rem;
        max-width: none;

        a {
            justify-content: flex-start;
        }
    }
}

.hero__contact {
    /* Mobil und Desktop sind hier zwei grundverschiedene Layouts: unten
       angedockte Glas-Karte gegenüber rechts angeflanschter Box. Deshalb
       ausnahmsweise ein sauberer Schnitt per max-width statt der sonst
       üblichen mobile-first-Überschreibung — andernfalls müsste der
       Desktop-Block ein Dutzend Eigenschaften einzeln zurücksetzen
       (inset, border-radius, font-size …), was beim Weiterbauen leicht
       auseinanderläuft. Die beiden Bereiche überschneiden sich nicht:
       max-width 1399.98px stößt lückenlos an min-width 1400px. */
    @media (max-width: 1399.98px) {
        /* Sitzt im unteren Hero-Bereich, wo das Foto ohnehin nur Asphalt
           zeigt. Optik bewusst wie die Chips darüber (dunkles Glas, gleiche
           Rundung), damit die Formensprache im Hero durchgängig bleibt. */
        display: block;
        position: absolute;
        z-index: 2;
        inset-inline: 0.75rem;
        inset-block-end: 0.75rem;
        padding: 1rem 1.15rem;
        border: 1px solid rgb(255 255 255 / 0.25);
        border-radius: 1.25rem;
        /* Fallback ohne backdrop-filter: fast deckend. Kontrast-Wache wie bei
           den Chips — Alpha nie unter 0.75 senken (weißer Text über hellem
           Himmel). Gemessen: 11.88:1 mit Blur, 14.87:1 ohne. */
        background: rgb(15 20 30 / 0.88);
        box-shadow: 0 8px 22px rgb(0 0 0 / 0.35);
        color: #fff;
        font-size: 0.95rem;

        @supports (backdrop-filter: blur(1px)) {
            background: rgb(15 20 30 / 0.78);
            backdrop-filter: blur(8px) saturate(1.4);
        }

        h2 {
            margin: 0 0 0.25rem;
            font-family: var(--font-title);
            font-size: 1.05rem;
            letter-spacing: 0.04em;
            text-transform: uppercase;
            color: var(--c-accent-text);
        }

        p {
            margin: 0;
            line-height: 1.45;
        }

        address {
            font-style: normal;
            line-height: 1.45;
        }

        a {
            color: #fff;

            &:focus-visible {
                outline-color: #fff;
            }
        }

        hr {
            border: 0;
            border-block-start: 1px solid rgb(255 255 255 / 0.28);
            margin-block: 0.7rem;
        }

        .hero__contact-emergency {
            font-size: 1.15rem;
        }

        /* Ausbildungsdienst entfällt mobil (Nutzerentscheidung 25.07.2026):
           Die Box wird dadurch rund 80 px flacher und gibt mehr vom Hero-Foto
           frei. Notruf und Kontaktdaten bleiben — die Übungszeit steht weiter
           auf dem Desktop sowie in Leichter Sprache und in Gebärdensprache. */
        .hero__contact-training {
            display: none;
        }

        /* Social mobil in einer Reihe statt untereinander — spart gegenüber
           der Desktop-Spalte rund 90 px Höhe */
        .hero__contact-social {
            display: flex;
            gap: 1.1rem;

            a {
                min-height: var(--tap-target);
                gap: 0.4rem;
                font-size: 0.9rem;
            }
        }

        /* Flache Geräte (Landscape, kleine Displays): Der Notruf und die
           Kontaktdaten haben Vorrang vor den Social-Links, die ohnehin im
           Footer stehen. */
        @media (max-height: 700px) {
            .hero__contact-social,
            hr:last-of-type {
                display: none;
            }
        }

        /* Kontrastmodus: halbtransparenter Fond würde das Foto durchscheinen
           lassen — hier deckend wie bei den Chips */
        @media (forced-colors: active) {
            background: Canvas;
            border-color: ButtonText;
            backdrop-filter: none;
        }
    }

    /* [breakpoint-desktop] Box „angeflanscht": bündig rechts, ragt unten
       über die Hero-Kante hinaus und schließt abgerundet ab (wie Vorlage) */
    @media (min-width: 1400px) {
        display: block;
        position: absolute;
        z-index: 2;
        inset-block-start: 5.5rem;
        inset-inline-end: 0;
        width: min(400px, 30vw);
        min-block-size: calc(100% - 5.5rem + 6rem);
        padding: 1.75rem 2rem 2.5rem;
        background: var(--c-primary);
        border: 2px solid var(--c-accent);
        border-inline-end: 0;
        /* Unterkante wie Vorlage: links kleine Rundung, rechts großer
           asymmetrischer Schwung hinauf zur Viewport-Kante (elliptischer Radius) */
        border-end-start-radius: 3rem;
        border-end-end-radius: 55% 7rem;
        box-shadow: 0 14px 28px rgb(0 0 0 / 0.22);
        color: #fff;

        h2 {
            margin: 0 0 0.75rem;
            font-size: 1.4rem;
        }

        address {
            font-style: normal;
        }

        a {
            color: #fff;

            &:focus-visible {
                outline-color: #fff;
            }
        }

        hr {
            border: 0;
            border-block-start: 1px solid rgb(255 255 255 / 0.4);
            margin-block: 1.25rem;
        }
    }
}

.hero__contact-emergency {
    margin: 0;
    font-size: 1.35rem;
}

/* Social-Links in der Kontakt-Box: untereinander, Icon + Name,
   Hover färbt Icon und Text akzentgrün (Icon nutzt currentColor) */
.hero__contact-social {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;

    a {
        display: inline-flex;
        align-items: center;
        gap: 0.7rem;
        min-height: 2.75rem;
        font-weight: 600;
        text-decoration: none;
        transition: color var(--dur-micro) ease;

        svg {
            flex: none;
        }

        &:hover {
            color: var(--c-accent-text);
        }
    }
}

/* ============================================================
   Inhaltssektionen unter dem Hero
   ============================================================ */
.section-heading {
    margin: 0 0 2.5rem;
    text-align: center;
    text-transform: uppercase;
    color: var(--c-primary);
    font-size: clamp(1.6rem, 1.2rem + 1vw, 2.2rem);
    letter-spacing: 0.04em;

    /* grüner Akzentstrich wie in der Vorlage */
    &::after {
        content: "";
        display: block;
        width: 64px;
        height: 4px;
        margin: 0.75rem auto 0;
        background: var(--c-accent);
    }
}

/* Schnellzugriff: moderne Kachel-Leiste (gleiche Formensprache wie .news) */
.quick-access {
    background: #fff;
    padding-block: 3rem;
    padding-inline: 1.25rem;

    /* [breakpoint-desktop] Platz für den Überhang der Kontakt-Box lassen */
    @media (min-width: 1400px) {
        padding-block-start: 7.5rem;
    }
}

.quick-access__list {
    list-style: none;
    margin: 0 auto;
    padding: 0;
    max-width: var(--breite-inhalt);
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
    gap: 1.25rem;

    li {
        display: flex;
    }

    /* Schmale Displays: eine wischbare Reihe statt eines zweispaltigen
       Rasters (Nutzerentscheidung 25.07.2026). Spart auf dem Handy zwei
       Kartenzeilen Höhe.

       Der Schnitt liegt bei 700px, nicht am üblichen [breakpoint-desktop]:
       Darüber ergibt das auto-fit-Raster schon drei oder mehr Spalten und
       eine Scrollreihe wäre dort unnötig.

       Kartenbreite bewusst unter 50 %, damit die nächste Karte angeschnitten
       sichtbar bleibt — ohne diesen Anschnitt erkennt niemand, dass es
       weitergeht. */
    @media (max-width: 700px) {
        display: flex;
        overflow-x: auto;
        scroll-snap-type: x mandatory;
        /* verhindert, dass das Wischen am Ende die Zurück-Geste des Browsers
           auslöst oder die ganze Seite mitzieht */
        overscroll-behavior-x: contain;

        /* Keine sichtbare Bildlaufleiste — wie in nativen App-Karussells.
           Vertretbar, weil der Bereich nur unter 700px greift (praktisch nur
           Touch-Geräte) und alle Karten per Tabulator erreichbar bleiben;
           der Container scrollt beim Fokuswechsel automatisch mit. */
        scrollbar-width: none;

        &::-webkit-scrollbar {
            display: none;
        }

        /* Karten dürfen bis an den Bildschirmrand scrollen (das Padding der
           Sektion wird herausgerechnet), behalten am Anfang und Ende aber
           ihren Abstand */
        margin-inline: -1.25rem;
        padding-inline: 1.25rem;
        /* Der Wert rechts ist empfindlich und nicht frei wählbar — gemessen
           über 360/390/430 px, jeweils Anteil der bei Tastaturfokus
           vollständig sichtbaren Karten:
              6rem  -> 3/5   (zu klein: der Browser wertet eine angeschnittene
                              Karte als „sichtbar genug" und scrollt nicht)
             10rem  -> 5/5   ✓
             15rem  -> 2/5   (zu groß: in den Rest passt keine Karte mehr,
                              der Browser scrollt an unbrauchbare Stellen)
           10rem liegt genau im Fenster zwischen dem größten Anschnitt (160 px)
           und der schmalsten Karte (176 px). Bei Änderungen an der
           Kartenbreite muss dieser Wert neu geprüft werden.
           Das Einrasten bleibt unberührt: scroll-snap-align: start richtet
           sich am Anfang des Scrollbereichs aus, nicht am Ende. */
        scroll-padding-inline: 1.25rem 10rem;

        /* Breiter als zwei Rasterspalten — und das ist der Punkt: Passten
           genau zwei Karten nebeneinander, wirkte die Reihe abgeschlossen und
           niemand ahnte die restlichen drei. Bei 62 % bleibt die zweite Karte
           sichtbar angeschnitten (rund 60 % von ihr), was das Weiterwischen
           von selbst nahelegt.
           Die clamp-Grenzen fangen die Ränder ab: Auf sehr schmalen Geräten
           bliebe sonst zu wenig Platz für die Beschriftung, nahe der 700-px-
           Grenze würde eine einzelne Karte absurd breit. */
        > li {
            flex: 0 0 clamp(11rem, 62%, 15rem);

            /* ZWEI Werte, nicht einer: 'start' allein setzt beide Achsen —
               die Karten wären damit auch VERTIKALE Einrastpunkte. Beim
               Scrollen mit dem Finger zog die Seite dann von selbst zurück,
               sobald das Karussell in den Blick kam (Fix 25.07.2026).
               'none' für die Blockachse schaltet das ab, 'start' bleibt für
               die Inline-Achse und damit für das gewollte Wischen. */
            scroll-snap-align: none start;
        }
    }
}

/* Gradient-Action-Cards: Glas-Icon-Chip oben, Label unten, Eck-Pfeil ↗ */
.quick-access__card {
    position: relative;
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: space-between;
    gap: 2rem;
    min-height: 155px;
    padding: 1.3rem;
    border-radius: 1.5rem;
    background: linear-gradient(140deg, #3a71c9 0%, var(--c-primary) 45%, var(--c-primary-dark) 100%);
    color: #fff;
    text-decoration: none;
    font-weight: 700;
    font-size: 1.05rem;
    box-shadow: 0 6px 18px rgb(35 75 137 / 0.25);
    transition: translate var(--dur-chevron) ease, box-shadow var(--dur-chevron) ease;

    &:hover {
        translate: 0 -4px;
        box-shadow: 0 14px 30px rgb(35 75 137 / 0.4);

        .quick-access__arrow {
            translate: 3px -3px;
            background: var(--c-accent);
            color: #1d1d1d;
        }
    }
}

.quick-access__label {
    line-height: 1.25;
    /* „Jugendfeuerwehr" und „Ansprechpartner" sind länger als die schmalen
       Karten der mobilen Scrollreihe. Ohne Trennung liefen sie über den Rand
       hinaus; hyphens braucht das lang="de" am <html>, das gesetzt ist. */
    overflow-wrap: break-word;
    hyphens: auto;
}

.quick-access__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 52px;
    height: 52px;
    border-radius: 1rem;
    background: rgb(255 255 255 / 0.16);
    backdrop-filter: blur(4px);
    color: #fff;
}

.quick-access__arrow {
    position: absolute;
    inset-block-start: 1.1rem;
    inset-inline-end: 1.1rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    border-radius: 50%;
    background: rgb(255 255 255 / 0.16);
    transition: translate var(--dur-chevron) ease, background-color var(--dur-micro) ease, color var(--dur-micro) ease;
}

/* CTA-Karte („Mitglied werden"): Akzentgrün, dunkle Zeichen */
.quick-access__card--cta {
    background: linear-gradient(140deg, #d6e48b 0%, var(--c-accent) 50%, #aabf52 100%);
    color: #1d1d1d;
    box-shadow: 0 6px 18px rgb(140 160 60 / 0.35);

    .quick-access__icon,
    .quick-access__arrow {
        background: rgb(0 0 0 / 0.12);
        backdrop-filter: none;
        color: #1d1d1d;
    }

    &:hover {
        box-shadow: 0 14px 30px rgb(140 160 60 / 0.5);

        .quick-access__arrow {
            background: var(--c-primary);
            color: #fff;
        }
    }
}

/* Aktuelles: redaktionelles Layout — große Top-Meldung + Meldungsliste */
.news {
    background: var(--c-surface);
    padding-block: 5rem 6rem;
    padding-inline: 1.25rem;

    /* content-visibility wurde am 25.07.2026 entfernt: Beim Hereinscrollen
       ersetzte die echte Höhe die geschätzte contain-intrinsic-size, das
       Dokument wurde um 7 px kürzer und die Seite rutschte. Der Rendergewinn
       stand in keinem Verhältnis zu einem sichtbar wackelnden Layout. */
}

.news__inner {
    max-width: var(--breite-inhalt);
    margin-inline: auto;
}

.news__header {
    display: flex;
    flex-wrap: wrap;
    align-items: end;
    gap: 1rem 2rem;
    margin-block-end: 2.75rem;

    h2 {
        margin: 0;
        font-family: var(--font-title);
        text-transform: uppercase;
        letter-spacing: 0.06em;
        line-height: 1;
        font-size: clamp(2rem, 1.5rem + 1.5vw, 2.75rem);
        color: var(--c-primary);
    }
}

/* Hinweis „Beispieltexte" über den Meldungen der Startseite.
   .page-note allein reichte hier nicht: Dessen Fond ist --c-surface, und
   genau darauf steht der ganze Abschnitt .news — der Kasten wäre unsichtbar.
   Deshalb Weiß, damit er sich abhebt; der grüne Balken bleibt das
   verbindende Merkmal zu allen anderen Hinweiskästen der Website.

   BEIDE Klassen im Selektor sind nötig. .page-note steht weiter unten im
   Stylesheet; bei gleicher Spezifität gewönne sonst die Reihenfolge und der
   Kasten bekäme wieder den Fond des Abschnitts. Gemessen war das der Fall:
   Kontrast Kasten gegen Abschnitt 1.00 — also kein sichtbarer Kasten. */
.page-note.news__hinweis {
    margin-block: -1.5rem 2.5rem;
    background: #fff;
}

.news__kicker {
    flex-basis: 100%;
    margin: 0;
    text-transform: uppercase;
    letter-spacing: 0.18em;
    font-size: 0.8rem;
    font-weight: 700;
    color: #5d7717;
}

.news__all {
    margin-inline-start: auto;
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    padding: 0.55rem 1.3rem;
    border: 2px solid var(--c-primary);
    border-radius: 999px;
    color: var(--c-primary);
    font-weight: 700;
    text-decoration: none;
    transition: background-color var(--dur-micro) ease, color var(--dur-micro) ease;

    span {
        transition: translate var(--dur-chevron) ease;
    }

    &:hover {
        background: var(--c-primary);
        color: #fff;

        span {
            translate: 4px 0;
        }
    }
}

.news__layout {
    display: grid;
    gap: 2.5rem;

    @media (min-width: 900px) {
        grid-template-columns: 1.25fr 1fr;
        align-items: start;
    }
}

/* Große Top-Meldung.
   „Stretched Link": Der <a> umschließt im Markup NUR die Überschrift, ein
   ::after mit inset:0 zieht die Klickfläche über die ganze Karte. Vorher lag
   der Link um Bild, Datum, Teaser und „Weiterlesen" — Screenreader lasen den
   kompletten Block als einen einzigen Linktext vor (WCAG 2.4.4).
   Bekannter Nebeneffekt des Musters: Text innerhalb der Karte lässt sich
   nicht mehr mit der Maus markieren. */
.news-feature {
    position: relative;
    color: var(--c-text);

    /* Hover/Fokus hängt an der Karte, nicht mehr am Link */
    &:hover,
    &:has(a:focus-visible) {
        img {
            scale: 1.04;
        }

        h3 {
            color: var(--c-primary);
        }

        .news-more span {
            translate: 4px 0;
        }
    }

    h3 {
        margin: 1.25rem 0 0.5rem;
        font-size: clamp(1.4rem, 1.2rem + 0.6vw, 1.75rem);
        line-height: 1.3;
        color: #1d1d1d;
        transition: color var(--dur-micro) ease;

        a {
            color: inherit;
            text-decoration: none;

            &::after {
                content: "";
                position: absolute;
                inset: 0;
            }
        }
    }

    p {
        margin: 0 0 0.85rem;
        max-width: 60ch;
    }
}

.news-feature__media {
    display: block;
    position: relative;
    border-radius: 1.25rem;
    overflow: hidden;

    img {
        display: block;
        width: 100%;
        aspect-ratio: 16 / 10;
        object-fit: cover;
        transition: scale 0.45s ease;
    }
}

.news-badge {
    position: absolute;
    inset-block-start: 1rem;
    inset-inline-start: 1rem;
    padding: 0.35rem 0.95rem;
    border-radius: 999px;
    background: var(--c-accent);
    color: #1d1d1d;
    font-size: 0.85rem;
    font-weight: 700;
}

.news-more {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-weight: 700;
    color: var(--c-primary);

    span {
        transition: translate var(--dur-chevron) ease;
    }
}

/* Kompakte Meldungsliste — gleiches Stretched-Link-Muster wie .news-feature:
   Die Karte ist das <li>, der Link sitzt nur in der Überschrift. */
.news-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    gap: 1.25rem;

    > li {
        position: relative;
        display: grid;
        grid-template-columns: 110px 1fr;
        gap: 1.1rem;
        align-items: center;

        /* Meldungen ohne Bild bekommen die ganze Breite, statt eine leere
           110px-Spalte stehen zu lassen — sonst bricht ihr Titel unnötig um. */
        &:not(:has(img)) {
            grid-template-columns: 1fr;
        }
        padding: 0.6rem;
        border-radius: 1rem;
        background: #fff;
        color: var(--c-text);
        box-shadow: 0 1px 4px rgb(0 0 0 / 0.06);
        transition: box-shadow var(--dur-chevron) ease, translate var(--dur-chevron) ease;

        &:hover,
        &:has(a:focus-visible) {
            translate: 0 -2px;
            box-shadow: 0 8px 20px rgb(0 0 0 / 0.12);

            h3 {
                color: var(--c-primary);
            }
        }
    }

    img {
        display: block;
        width: 110px;
        aspect-ratio: 1;
        object-fit: cover;
        border-radius: 0.75rem;
    }

    h3 {
        margin: 0.2rem 0 0;
        font-size: 1.05rem;
        line-height: 1.35;
        transition: color var(--dur-micro) ease;

        a {
            color: inherit;
            text-decoration: none;

            &::after {
                content: "";
                position: absolute;
                inset: 0;
            }
        }
    }
}

.news-list__date {
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-weight: 700;
    color: #5d7717;
}

/* ---------- Inhaltsseiten & Footer ----------
   Gleiche Breite wie die Startseiten-Abschnitte (--breite-inhalt), und
   darin läuft ALLES auf dieselbe Kante — Überschriften, Text, Listen,
   Bilder. Bis zum 25.07.2026 war .page 60rem breit und begrenzte Absätze
   zusätzlich auf 65ch; dadurch sprang der Inhalt beim Wechsel von der
   Startseite um 120px nach innen und hatte je Seite mehrere rechte Kanten.
   Ausgleich für die längeren Zeilen: größerer Fließtext und mehr
   Zeilenabstand (siehe unten). */
.page {
    /* Padding aufschlagen, damit der INHALT --breite-inhalt breit ist und
       nicht der Kasten samt Innenabstand. Die Startseiten-Abschnitte tragen
       ihren seitlichen Abstand außen an der Sektion; hier sitzt er innen.
       Ohne das Aufschlagen begänne der Text 20px weiter innen als auf der
       Startseite — genau der kleine Versatz, der als „unstimmig" auffällt. */
    max-width: calc(var(--breite-inhalt) + 2 * 1.25rem);
    margin-inline: auto;
    padding: 2.5rem 1.25rem;
    /* Größer als die Grundschrift: Bei dieser Spaltenbreite wären 16px zu
       klein und die Zeilen zu schwer zu verfolgen. Mobil eine Stufe kleiner
       — dort ist die Zeile ohnehin kurz, und die volle Größe würde die
       Seite unnötig in die Länge ziehen. */
    font-size: 1.0625rem;
    /* Großzügiger Zeilenabstand: Bei dieser Spaltenbreite fasst eine Zeile
       rund 120 Zeichen (gemessen). Das liegt über der Leseempfehlung von
       45–75; ein weiter Zeilenabstand erleichtert das Zurückfinden an den
       Zeilenanfang spürbar und ist hier das wirksamste Gegenmittel, solange
       die Breite gesetzt ist. */
    line-height: 1.75;

    @media (min-width: 40rem) {
        font-size: 1.125rem;
    }

    h1,
    h2 {
        font-family: var(--font-title);
        line-height: 1.2;
        text-wrap: balance;
    }

    h1 {
        font-size: clamp(1.9rem, 4vw, 2.5rem);
        margin-block: 0 1.25rem;
    }

    h2 {
        font-size: clamp(1.35rem, 2.5vw, 1.7rem);
        margin-block: 2.25rem 0.75rem;
    }

    address {
        font-style: normal;
    }

    li + li {
        margin-block-start: 0.35rem;
    }
}

/* ============================================================
   Formulare (Melde-Formular „Barriere melden")
   Grundsatz: Fehler werden NIE allein über Farbe transportiert
   (WCAG 1.4.1) — es gibt immer Klartext, zusätzlich Rahmen und
   Position. Alle Bedienelemente halten --tap-target ein.
   ============================================================ */
.melde-form {
    max-width: 42rem;
    margin-block: 2rem 3rem;

    fieldset {
        margin: 0 0 2rem;
        padding: 1.25rem 1.5rem;
        border: 2px solid var(--c-field-border);
        border-radius: 0.75rem;
    }

    legend {
        padding-inline: 0.5rem;
        font-weight: 700;
        font-size: 1.05rem;
    }

    label {
        display: block;
        font-weight: 700;
        margin-block-end: 0.35rem;
    }

    input[type="text"],
    input[type="email"],
    textarea {
        width: 100%;
        min-height: var(--tap-target);
        padding: 0.6rem 0.75rem;
        border: 2px solid var(--c-field-border);
        border-radius: 0.5rem;
        background: #fff;
        color: var(--c-text);
        /* 1rem verhindert den Auto-Zoom von iOS beim Fokussieren */
        font: inherit;
        font-size: 1rem;
    }

    textarea {
        resize: vertical;
        line-height: 1.5;
    }

    input:focus-visible,
    textarea:focus-visible {
        outline: 3px solid var(--c-primary);
        outline-offset: 1px;
        border-color: var(--c-primary);
    }
}

.feld {
    margin-block-end: 2rem;
}

/* Hilfetext steht VOR dem Feld: Screenreader lesen ihn über aria-describedby
   ohnehin, sehende Nutzende brauchen ihn vor der Eingabe, nicht danach. */
.feld-hilfe {
    margin-block: 0 0.5rem;
    max-width: 60ch;
    font-size: 0.925rem;
    color: #4a4a4a;
}

.pflicht {
    color: var(--c-error);
    font-weight: 700;
}

.form-pflicht-hinweis {
    margin-block-end: 1.5rem;
    font-size: 0.95rem;
}

.feld-fehler {
    margin-block: 0 0.5rem;
    padding-inline-start: 0.75rem;
    border-inline-start: 4px solid var(--c-error);
    color: var(--c-error);
    font-weight: 700;
}

.hat-fehler {
    input[type="text"],
    input[type="email"],
    textarea {
        border-color: var(--c-error);
        border-width: 2px;
    }

    &:is(fieldset) {
        border-color: var(--c-error);
    }
}

.radio-zeile {
    display: flex;
    align-items: flex-start;
    gap: 0.75rem;
    /* Zeilenhöhe so, dass Kästchen und Beschriftung zusammen die
       Mindest-Zielgröße von 44 px erreichen */
    min-height: var(--tap-target);
    padding-block: 0.35rem;

    input[type="radio"] {
        flex: none;
        width: 1.5rem;
        height: 1.5rem;
        margin: 0.15rem 0 0;
        accent-color: var(--c-primary);
    }

    label {
        margin: 0;
        font-weight: 400;
        cursor: pointer;
    }
}

.form-fehler-liste {
    max-width: 42rem;
    margin-block: 1.5rem;
    padding: 1.25rem 1.5rem;
    border: 3px solid var(--c-error);
    border-radius: 0.75rem;
    background: #fff;

    h2 {
        margin-block: 0 0.75rem;
        color: var(--c-error);
        font-size: 1.25rem;
    }

    ul {
        margin: 0;
        padding-inline-start: 1.25rem;
    }

    li {
        margin-block-end: 0.5rem;
    }

    a {
        color: var(--c-error);
        font-weight: 600;
    }

    /* Der Fokus landet beim Neuladen hier — Ring nicht unterdrücken,
       aber auch nicht doppelt zeichnen */
    &:focus-visible {
        outline: 3px solid var(--c-error);
        outline-offset: 3px;
    }
}

.form-datenschutz {
    max-width: 60ch;
    margin-block: 0 2rem;
    padding: 1rem 1.25rem;
    background: var(--c-surface);
    border-radius: 0.75rem;

    h2 {
        margin-block: 0 0.5rem;
        font-size: 1.05rem;
    }

    p {
        margin: 0;
        font-size: 0.95rem;
    }
}

.form-senden {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: var(--tap-target);
    padding: 0.75rem 2rem;
    border: 0;
    border-radius: 999px;
    background: var(--c-primary);
    color: #fff;
    font: inherit;
    font-weight: 700;
    font-size: 1.05rem;
    cursor: pointer;
    transition: background-color var(--dur-micro) ease;

    &:hover {
        background: var(--c-primary-dark);
    }

    &:focus-visible {
        outline: 3px solid var(--c-primary);
        outline-offset: 3px;
    }
}

.melde-erfolg {
    max-width: 60ch;
    margin-block: 1.5rem 2rem;
    padding: 1.25rem 1.5rem;
    border: 3px solid var(--c-success);
    border-radius: 0.75rem;
    background: #fff;

    p:last-child {
        margin-block-end: 0;
    }
}

/* Honigtopf gegen Spam-Bots: aus dem Blickfeld, aus der Tab-Reihenfolge
   (tabindex="-1" im Markup) und per aria-hidden aus dem Accessibility-Tree.
   Bewusst NICHT display:none — manche Bots ignorieren solche Felder. */
.hp-feld {
    position: absolute;
    inset-inline-start: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

/* ============================================================
   Progressive Web App: Aktualisierungshinweis und Installation
   ============================================================ */

/* Schwebende Leiste, die assets/js/pwa.js einblendet, wenn eine neue Fassung
   bereitliegt. Bewusst unten und schmal: Sie soll auffallen, aber nichts
   Wichtiges verdecken. Der Abstand nach unten berücksichtigt die Gestenleiste
   moderner Telefone (safe-area). */
.pwa-hinweis {
    position: fixed;
    z-index: 50;
    inset-block-end: calc(1rem + env(safe-area-inset-bottom, 0px));
    inset-inline: 1rem;
    max-width: 32rem;
    margin-inline: auto;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem 0.75rem;
    padding: 0.9rem 1.1rem;
    border-radius: 1rem;
    background: var(--c-primary-dark);
    color: #fff;
    box-shadow: 0 10px 30px rgb(0 0 0 / 0.35);

    @media (prefers-reduced-motion: no-preference) {
        animation: pwa-einblenden var(--dur-panel) ease;
    }

    p {
        flex: 1 1 12rem;
        margin: 0;
        font-size: 0.95rem;
    }

    button {
        min-height: var(--tap-target);
        padding-inline: 1rem;
        border-radius: 999px;
        font: inherit;
        font-weight: 700;
        cursor: pointer;

        &:focus-visible {
            outline: 3px solid #fff;
            outline-offset: 2px;
        }
    }
}

@keyframes pwa-einblenden {
    from {
        opacity: 0;
        translate: 0 0.75rem;
    }
}

.pwa-hinweis__aktion {
    border: 0;
    /* Akzentgrün mit dunklem Text: 10.7:1 */
    background: var(--c-accent);
    color: var(--c-on-accent);
}

.pwa-hinweis__schliessen {
    border: 1px solid var(--nav-hairline);
    background: transparent;
    color: #fff;
}

/* Installationsknopf im Seitenfuß — bleibt verborgen, bis der Browser eine
   Installation anbietet (Attribut hidden, gesetzt in footer.php). */
.pwa-install {
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    min-height: var(--tap-target);
    padding-inline: 1rem;
    border: 1px solid var(--nav-hairline);
    border-radius: 999px;
    background: transparent;
    color: #fff;
    font: inherit;
    font-weight: 600;
    font-size: 0.95rem;
    cursor: pointer;
    transition: background-color var(--dur-micro) ease, color var(--dur-micro) ease;

    &:hover {
        background: var(--c-accent);
        border-color: transparent;
        color: var(--c-on-accent);
    }

    &:focus-visible {
        outline: 3px solid #fff;
        outline-offset: 2px;
    }

    /* hidden ohne dieses !important würde von display:inline-flex überstimmt */
    &[hidden] {
        display: none !important;
    }
}

/* ---------- Gebärdensprache-Seite ---------- */
.notruf-box {
    max-width: 65ch;
    margin-block: 2rem 3rem;
    padding: 1.5rem;
    border: 3px solid var(--c-accent);
    border-radius: 1rem;
    background: var(--c-surface);

    h2 {
        margin-block-start: 0;
    }

    dt {
        margin-block-start: 1.25rem;
        font-weight: 700;
        color: var(--c-primary-dark);
    }

    dd {
        margin-inline-start: 0;
        margin-block-start: 0.35rem;
    }
}

.dgs-thema {
    margin-block-end: 3rem;
}

.dgs-video {
    display: block;
    width: 100%;
    max-width: 45rem;
    height: auto;
    border-radius: 0.75rem;
    background: #000;
}

/* Ehrlicher Hinweis, solange das Video fehlt */
.dgs-fehlt {
    max-width: 65ch;
    padding: 1rem 1.25rem;
    border-inline-start: 4px solid var(--c-primary);
    background: var(--c-surface);
    border-start-end-radius: 0.75rem;
    border-end-end-radius: 0.75rem;
}

.dgs-transkript {
    max-width: 65ch;
    margin-block-start: 1.25rem;

    h3 {
        margin-block: 0 0.5rem;
        font-family: var(--font-title);
        font-size: 1.05rem;
        letter-spacing: 0.04em;
        text-transform: uppercase;
        color: var(--c-primary);
    }
}

/* ---------- Leichte Sprache ----------
   Eigene Typografie nach den Empfehlungen des Netzwerks Leichte Sprache:
   deutlich größere Schrift (mindestens 14 pt ≈ 18.7 px), großer Zeilen-
   abstand, kurze Zeilen, immer linksbündig (kein Blocksatz), klar
   getrennte Absätze. Die Sätze stehen im Markup einzeln in eigenen Zeilen
   (<br>) — das ist hier bewusst inhaltliche Struktur, kein Layout-Trick. */
.leichte-sprache {
    font-size: 1.25rem;
    line-height: 1.7;
    hyphens: none;      /* getrennte Wörter erschweren das Lesen */
    text-align: start;  /* niemals Blocksatz */

    p,
    ul,
    address {
        max-width: 40ch; /* kurze Zeilen; bei 1.25rem ergibt das ~500 px */
    }

    p {
        margin-block: 0 1.5rem;
    }

    h2 {
        margin-block: 2.75rem 1rem;
        font-size: clamp(1.4rem, 1.1rem + 1.2vw, 1.8rem);
        color: var(--c-primary);
    }

    ul {
        padding-inline-start: 1.5em;
        margin-block: 0 1.5rem;
    }

    li {
        margin-block-end: 0.9rem;
    }

    li + li {
        margin-block-start: 0;
    }

    a {
        color: var(--c-primary-dark);
        text-underline-offset: 0.2em;
        text-decoration-thickness: 2px;
    }

    address {
        margin-block-end: 1.5rem;
        line-height: 1.8;
    }
}

.ls-intro {
    padding: 1.25rem 1.5rem;
    background: var(--c-surface);
    border-radius: 1rem;
    font-weight: 600;
}

/* Notruf-Kasten: die wichtigste Information der ganzen Seite */
.ls-alarm {
    max-width: 40ch;
    margin-block: 2rem;
    padding: 1.5rem;
    border: 3px solid var(--c-accent);
    border-radius: 1rem;
    background: #fff;

    h2 {
        margin-block-start: 0;
    }

    p:last-child {
        margin-block-end: 0;
    }
}

.ls-nummer {
    font-size: 1.6em;
    line-height: 1.4;

    a {
        color: var(--c-primary-dark);
        letter-spacing: 0.1em;
    }
}

.ls-hinweis {
    margin-block-start: 3rem;
    padding: 1.25rem 1.5rem;
    background: var(--c-surface);
    border-radius: 1rem;
    font-size: 0.9em;
}

/* Einleitungssatz auf Inhaltsseiten — etwas größer als der Fließtext,
   damit die Seite eine erkennbare Zusammenfassung bekommt */
.page-intro {
    font-size: 1.1rem;
    line-height: 1.6;
    color: #333;
}

/* Verweise auf die übrigen Seiten desselben Bereichs (siehe geruest.php).
   Zwei Spalten ab genug Breite, damit lange Listen nicht in die Länge ziehen. */
.geruest-nachbarn {
    list-style: none;
    padding: 0;
    display: grid;
    gap: 0.25rem 1.5rem;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
    max-width: 46rem;

    a {
        display: inline-flex;
        align-items: center;
        min-height: var(--tap-target);
        color: var(--c-primary-dark);
        text-underline-offset: 0.2em;
    }
}

/* ============================================================
   Meldungen: Beitragsseite (/aktuelles/<slug>) und Übersicht
   Beide bauen auf .page auf — hier steht nur, was darüber
   hinausgeht. Kategorie und Datum stehen immer als Text da,
   Farbe trägt nirgends allein eine Information (WCAG 1.4.1).
   ============================================================ */

/* Breite und Kante kommen inzwischen vollständig aus .page — der Beitrag
   braucht dafür keine eigene Regel mehr. `.page--weit` ist entfallen, weil
   es seit der Vereinheitlichung dasselbe wäre wie `.page`. */

/* ---------- Brotkrumen ----------
   Mobil-first: Auf schmalen Bildschirmen steht hier nur „← Aktuelles".
   Die vollständige Kette braucht bei 390px drei Zeilen (gemessen 61px) und
   ihr letztes Glied wiederholt wörtlich die Überschrift darunter. Ab 40rem
   ist Platz für den ganzen Pfad. */
.beitrag__pfad {
    margin-block-end: 1rem;

    ol {
        display: flex;
        flex-wrap: wrap;
        align-items: center;
        gap: 0.25rem 0.6rem;
        margin: 0;
        padding: 0;
        list-style: none;
        font-size: 0.9rem;
        max-width: none;
    }

    li {
        display: flex;
        align-items: center;
        gap: 0.55rem;
        min-width: 0;
    }

    /* .page setzt `li + li { margin-block-start: 0.35rem }` für Listen im
       Fließtext. In der waagerechten Brotkrume schob dieser Abstand jedes
       Glied ab dem zweiten um 5,6px nach unten — „Startseite" stand dadurch
       sichtbar höher als der Rest (gemessen: Textmitte 163.98 gegenüber
       166.78). Ein einfaches `.beitrag__pfad li` genügt hier NICHT: Es ist
       weniger spezifisch als `.page li + li`. */
    li + li {
        margin-block-start: 0;
    }

    /* Startseite und aktueller Titel erst ab genug Breite */
    .beitrag__pfad-oben {
        display: none;
    }

    .beitrag__pfad-zurueck a::before {
        content: "\2190\00a0";  /* ← plus geschütztes Leerzeichen */
    }

    a {
        /* min-height 24px: WCAG 2.2 verlangt in 2.5.8 mindestens 24×24 CSS-
           Pixel für Bedienelemente. Ohne die Angabe sind die Links hier nur
           22px hoch (gemessen) — die Inline-Ausnahme des Kriteriums greift
           für eine Brotkrumen-Navigation nicht, sie steht in keinem Satz. */
        display: inline-flex;
        align-items: center;
        gap: 0.4rem;
        min-height: 24px;
        padding-inline: 0.15rem;
        border-radius: 0.4rem;
        color: var(--c-primary-dark);
        /* Wie in der Hauptnavigation ohne Dauerunterstreichung: In einer
           als <nav> ausgezeichneten Linkliste ist die Linkfunktion aus dem
           Zusammenhang erkennbar. Unterstrichen wird bei Hover und Fokus,
           damit Farbe nie das einzige Merkmal ist. */
        text-decoration: none;
        text-underline-offset: 0.2em;
        transition: color var(--dur-micro) ease;

        &:hover {
            color: var(--c-primary);
            text-decoration: underline;
        }

        &:focus-visible {
            text-decoration: underline;
        }
    }

    /* Haus-Icon vor „Startseite" */
    .beitrag__pfad-haus {
        flex: none;
        width: 1em;
        height: 1em;
        /* optischer Ausgleich: das Icon sitzt sonst eine Spur zu hoch */
        translate: 0 0.5px;
    }

    .beitrag__pfad-hier {
        color: #5a5a5a;
        min-width: 0;
    }

    @media (min-width: 40rem) {
        margin-block-end: 1.5rem;

        /* Eine Zeile, kein Umbruch: Ein langer Titel soll gekürzt werden
           (siehe unten) statt die Brotkrume auf drei Zeilen zu ziehen.
           Mit wrap würde flex ausweichen, statt das letzte Glied schrumpfen
           zu lassen — dann greift text-overflow nie. */
        ol {
            flex-wrap: nowrap;
        }

        .beitrag__pfad-oben {
            display: flex;
        }

        /* Nur das letzte Glied gibt nach; die kurzen davor bleiben ganz. */
        .beitrag__pfad-hier {
            flex: 0 1 auto;
        }

        .beitrag__pfad-oben:first-child,
        .beitrag__pfad-zurueck {
            flex: none;
        }

        .beitrag__pfad-zurueck a::before {
            content: none;
        }

        /* Chevron als Trenner: aus zwei Rändern gezeichnet statt als
           Schriftzeichen — skaliert mit der Schriftgröße, nimmt die Farbe
           von currentColor an und bleibt im Windows-Kontrastmodus sichtbar
           (Ränder werden dort durch CanvasText ersetzt, ein „/" im content
           wäre dort ein Zeichen ohne Bezug). */
        li + li::before {
            content: "";
            flex: none;
            inline-size: 0.36em;
            block-size: 0.36em;
            border-block-start: 1.5px solid #9a9a9a;
            border-inline-end: 1.5px solid #9a9a9a;
            rotate: 45deg;
            translate: 0 -0.5px;
        }

        /* Sehr lange Titel kürzen, statt die Zeile umbrechen zu lassen —
           der vollständige Titel steht direkt darunter als Überschrift.
           Das Kürzen sitzt am inneren <span>: Das <li> muss flex bleiben,
           sonst rutscht der Chevron davor aus dem Flex-Fluss. */
        .beitrag__pfad-hier > span {
            overflow: hidden;
            white-space: nowrap;
            text-overflow: ellipsis;
        }
    }
}

/* ---------- Kopf des Beitrags ----------
   Mobil bewusst gedrängt: Vorher begann der eigentliche Beitrag erst nach
   893px, also nach mehr als einer vollen Bildschirmhöhe aus Brotkrumen,
   Überschrift und Anriss. */
.page.beitrag {
    padding-block-start: 1.5rem;

    h1 {
        /* Untergrenze von 1.9rem auf 1.5rem gesenkt: Bei 390px stand der
           Titel sonst in drei Zeilen. Der Desktop-Wert bleibt unverändert. */
        font-size: clamp(1.5rem, 4.5vw, 2.5rem);
        margin-block: 0 0.85rem;
    }

    @media (min-width: 40rem) {
        padding-block-start: 2.5rem;
    }
}

.beitrag__meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.6rem 0.9rem;
    margin-block: 0 0.6rem;
    font-size: 0.9rem;
    /* 5.74:1 auf Weiß — gemessen, nicht geschätzt */
    color: #5a5a5a;
}

/* Kategorie-Chip. Fläche in --c-accent, Text in --c-on-accent (10.7:1). */
.beitrag__kategorie {
    padding: 0.3rem 0.85rem;
    border-radius: 999px;
    background: var(--c-accent);
    color: var(--c-on-accent);
    font-size: 0.8rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
}

@media (forced-colors: active) {
    .beitrag__kategorie {
        border: 1px solid ButtonText;
    }
}

.beitrag__teaser {
    /* Mobil nur wenig größer als der Fließtext — bei 1.15rem brauchte der
       Anriss vier Zeilen und schob den Beitrag nach unten. */
    font-size: 1.05rem;
    line-height: 1.55;
    color: #333;

    @media (min-width: 40rem) {
        font-size: 1.2rem;
        line-height: 1.6;
    }
}

.beitrag__bild {
    margin: 1.25rem 0 1.5rem;

    img {
        display: block;
        width: 100%;
        height: auto;
        border-radius: 1.25rem;
    }

    @media (min-width: 40rem) {
        margin: 1.75rem 0 2rem;
    }
}

/* ---------- Fließtext ---------- */
.beitrag__text {
    /* Schriftgröße und Zeilenabstand kommen aus .page — sie gelten für
       jede Inhaltsseite gleichermaßen und stehen deshalb dort. */

    p {
        margin-block: 0 1.1rem;
    }

    ul {
        margin-block: 0 1.1rem;
        padding-inline-start: 1.3rem;
    }

    /* Hinweiskästen im Text bekommen etwas Luft */
    .page-note {
        margin-block: 1.5rem;
    }
}

/* ---------- Bausteine im Fließtext ----------
   Alle laufen auf dieselbe rechte Kante wie der Text (siehe .page.beitrag).
   ---------------------------------------------------------------- */

/* Zweite Überschriftenebene — kleiner als h2, aber klar abgesetzt */
.beitrag__text h3 {
    margin-block: 1.75rem 0.5rem;
    font-family: var(--font-title);
    font-size: 1.15rem;
    line-height: 1.3;
    color: var(--c-primary-dark);
}

/* Nummerierte Abfolge (z. B. Ablauf eines Einsatzes). Eigene Zähler statt
   der Browser-Nummern, damit die Ziffer die Auszeichnungsfarbe tragen kann. */
.beitrag-nummern {
    counter-reset: schritt;
    list-style: none;
    padding-inline-start: 0;

    > li {
        counter-increment: schritt;
        position: relative;
        padding-inline-start: 2.75rem;
        min-height: 2rem;

        &::before {
            content: counter(schritt);
            position: absolute;
            inset-inline-start: 0;
            inset-block-start: 0.1em;
            display: grid;
            place-items: center;
            inline-size: 1.9rem;
            block-size: 1.9rem;
            border-radius: 50%;
            background: var(--c-primary);
            color: #fff;
            font-size: 0.95rem;
            font-weight: 700;
            line-height: 1;
        }
    }

    > li + li {
        margin-block-start: 0.85rem;
    }

    /* Im Kontrastmodus verschwindet die Füllfarbe — Rand hält die Ziffer sichtbar */
    @media (forced-colors: active) {
        > li::before {
            border: 1px solid ButtonText;
        }
    }
}

/* Faktenblock, z. B. Einsatzdaten */
.beitrag-fakten {
    margin-block: 1.75rem;
    padding: 1.1rem 1.35rem;
    border-radius: 1rem;
    background: var(--c-surface);
    border-inline-start: 4px solid var(--c-primary);

    dl {
        margin: 0;
    }
}

.beitrag-fakten__titel {
    margin-block: 0 0.75rem;
    font-family: var(--font-title);
    font-size: 1.05rem;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    color: var(--c-primary-dark);
}

.beitrag-fakten__zeile {
    display: grid;
    gap: 0 1rem;
    padding-block: 0.4rem;

    & + & {
        border-block-start: 1px solid rgb(0 0 0 / 0.08);
    }

    dt {
        font-weight: 700;
    }

    dd {
        margin-inline-start: 0;
    }

    /* Ab genug Breite Bezeichnung und Wert nebeneinander */
    @media (min-width: 34rem) {
        grid-template-columns: 12rem 1fr;
        align-items: baseline;
    }
}

/* Blockzitat.
   margin mit ausgeschriebener 0 für die Seiten: <figure> bringt vom Browser
   `margin: 1em 40px` mit. Nur margin-block zu setzen ließe die 40px stehen —
   die Figuren endeten dadurch 40px vor der Textkante (gemessen 1120 statt
   1160) und die eine Kante wäre dahin. */
.beitrag-zitat {
    margin: 1.75rem 0;
    padding-inline-start: 1.35rem;
    border-inline-start: 4px solid var(--c-accent);

    blockquote {
        margin: 0;
    }

    p {
        margin-block: 0;
        font-size: 1.2rem;
        line-height: 1.5;
        font-style: italic;
        color: #2f2f2f;
    }

    figcaption {
        margin-block-start: 0.6rem;
        font-size: 0.9rem;
        /* 5.74:1 auf Weiß */
        color: #5a5a5a;

        /* Gedankenstrich als Herkunftszeichen, nicht vorgelesen */
        &::before {
            content: "\2014\00a0";
        }
    }
}

/* Einzelbild im Text mit Bildunterschrift (margin-Seiten siehe .beitrag-zitat) */
.beitrag-figur {
    margin: 1.75rem 0;

    img {
        display: block;
        width: 100%;
        height: auto;
        border-radius: 1rem;
    }
}

/* Galerie: zwei Bilder nebeneinander, mobil untereinander
   (margin-Seiten siehe .beitrag-zitat) */
.beitrag-galerie {
    margin: 1.75rem 0;
}

.beitrag-galerie__raster {
    display: grid;
    gap: 0.75rem;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));

    img {
        display: block;
        width: 100%;
        height: auto;
        aspect-ratio: 800 / 535;
        object-fit: cover;
        border-radius: 0.85rem;
    }
}

/* Bildunterschriften einheitlich */
.beitrag-figur figcaption,
.beitrag-galerie figcaption {
    margin-block-start: 0.6rem;
    font-size: 0.9rem;
    line-height: 1.45;
    /* 5.74:1 auf Weiß — erfüllt 4.5:1 auch bei dieser Größe */
    color: #5a5a5a;
}

/* ---------- Fuß: Blättern und Rückweg ---------- */
.beitrag__fuss {
    margin-block-start: 3rem;
    padding-block-start: 1.75rem;
    border-block-start: 1px solid rgb(0 0 0 / 0.12);
}

.beitrag__blaettern {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
}

.beitrag__blaettern-link {
    flex: 1 1 15rem;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    min-height: var(--tap-target);
    padding: 0.9rem 1.1rem;
    border: 1px solid rgb(0 0 0 / 0.15);
    border-radius: 1rem;
    color: var(--c-text);
    text-decoration: none;
    transition: border-color var(--dur-micro) ease, background-color var(--dur-micro) ease;

    &:hover {
        border-color: var(--c-primary);
        background: var(--c-surface);
    }

    /* Steht nur eine Nachbarmeldung zur Verfügung, rückt die „neuere"
       nach rechts, damit die Leserichtung älter ← → neuer erhalten bleibt. */
    &--rechts {
        margin-inline-start: auto;
        text-align: end;
    }
}

.beitrag__blaettern-richtung {
    font-size: 0.85rem;
    font-weight: 700;
    color: var(--c-primary-dark);
}

.beitrag__blaettern-titel {
    line-height: 1.35;
}

.beitrag__zurueck {
    margin-block: 1.75rem 0;

    a {
        display: inline-flex;
        align-items: center;
        min-height: var(--tap-target);
        color: var(--c-primary-dark);
        font-weight: 700;
        text-underline-offset: 0.2em;
    }
}

/* ---------- Übersicht /aktuelles/ ----------
   Selektor bewusst mit .page davor: .page begrenzt p/ul/address auf 65ch
   (lesbare Zeilenlänge im Fließtext). Diese Regel ist spezifischer als ein
   einzelnes .meldungsliste — ohne den Vorsatz blieben die Karten auf
   Textbreite stehen und die halbe Seite ungenutzt. */
.page .meldungsliste {
    list-style: none;
    margin: 2rem 0 0;
    padding: 0;
    display: grid;
    gap: 1.25rem;
    max-width: none;

    /* Den Fließtext-Abstand `.page li + li` abschalten: Der Abstand
       zwischen den Karten kommt aus `gap`. Sonst bekämen alle Karten außer
       der ersten zusätzliche 5,6px und die Abstände wären ungleich
       (gemessen 223px zur ersten, 224px zwischen den folgenden).
       `.meldungsliste__eintrag` allein reicht nicht — es ist weniger
       spezifisch als `.page li + li`. */
    > li + li {
        margin-block-start: 0;
    }
}

.meldungsliste__eintrag {
    /* Trägt die Klickfläche des Stretched Link (siehe h2 > a unten) */
    position: relative;
    display: grid;
    gap: 0 1.5rem;
    align-items: start;
    padding: 1.1rem;
    border-radius: 1.25rem;
    background: #fff;
    border: 1px solid rgb(0 0 0 / 0.1);
    transition: border-color var(--dur-micro) ease, box-shadow var(--dur-micro) ease;
    margin-block-start: 0;

    &:hover,
    &:has(a:focus-visible) {
        border-color: var(--c-primary);
        box-shadow: 0 6px 20px rgb(0 0 0 / 0.08);
    }

    h2 {
        /* Überschreibt den großen Abstand aus .page — in der Karte sitzt
           die Überschrift direkt unter der Datumszeile. */
        margin-block: 0 0.5rem;
        font-size: clamp(1.15rem, 2vw, 1.35rem);
    }

    /* Stretched Link: Der <a> umschließt im Markup nur die Überschrift
       (sonst läse Vorlesesoftware die ganze Karte als einen Linktext,
       WCAG 2.4.4), das ::after zieht die Klickfläche über die Karte. */
    h2 a {
        color: var(--c-primary-dark);
        text-decoration: none;

        &::after {
            content: "";
            position: absolute;
            inset: 0;
            border-radius: inherit;
        }

        &:hover {
            text-decoration: underline;
            text-underline-offset: 0.2em;
        }
    }

    /* [breakpoint-desktop] — schmaler Schnitt als sonst: Ab 40rem ist
       nebeneinander besser lesbar, das ist weit unterhalb der Menü-Grenze. */
    @media (min-width: 40rem) {
        grid-template-columns: 15rem 1fr;

        /* Meldungen ohne Bild bekommen die ganze Breite für den Text —
           dieselbe Regel wie bei .news-list auf der Startseite. */
        &:not(:has(img)) {
            grid-template-columns: 1fr;
        }
    }
}

.meldungsliste__bild {
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: 800 / 535;
    object-fit: cover;
    border-radius: 0.85rem;
    margin-block-end: 0.9rem;

    @media (min-width: 40rem) {
        margin-block-end: 0;
    }
}

/* Ebenfalls mit .page davor — siehe Hinweis bei .page .meldungsliste */
.page .meldungsliste__meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem 0.8rem;
    margin-block: 0 0.5rem;
    max-width: none;
    font-size: 0.85rem;
    color: #5a5a5a;
}

.page .meldungsliste__teaser {
    margin-block: 0;
    max-width: 65ch;
    line-height: 1.6;
}

/* Hinweiskasten auf Inhaltsseiten (z. B. Notruf-Hinweis im Impressum) */
.page-note {
    padding: 0.85rem 1.1rem;
    background: var(--c-surface);
    border-inline-start: 4px solid var(--c-accent);
    border-start-end-radius: 0.75rem;
    border-end-end-radius: 0.75rem;
}

/* Footer: Notruf-Band, 4 Spalten (Marke / Kontakt / Platzhalter-Links /
   Pflicht-Links), Bottom-Bar. Spalten fließen ohne Media Query über
   auto-fit von 1 (mobil) bis 4 (Desktop). Die Spalte .site-footer__nav
   MUSS erhalten bleiben (BITV: Erklärung + Barriere melden von jeder
   Seite erreichbar, siehe CLAUDE.md). */
.site-footer {
    background: linear-gradient(160deg, var(--c-primary) 0%, var(--c-primary-dark) 70%);
    color: #fff;
    font-size: 0.95rem;

    a {
        color: #fff;

        &:focus-visible {
            outline-color: #fff;
        }
    }
}

.site-footer__emergency {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 0.25rem 0.4rem;
    margin: 0;
    padding: 0.6rem 1.25rem;
    background: var(--c-accent);
    color: var(--c-on-accent);
    text-align: center;
}

.site-footer__grid {
    /* Padding aufgeschlagen wie bei .page — sonst stünde der Footer 20px
       weiter innen als der Seiteninhalt darüber. */
    max-width: calc(var(--breite-inhalt) + 2 * 1.25rem);
    margin-inline: auto;
    padding: 2.75rem 1.25rem 2.25rem;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr));
    gap: 2.25rem 2.5rem;

    address {
        font-style: normal;
        line-height: 1.7;
        margin-block-end: 0.4rem;
    }
}

.site-footer__brand {
    display: grid;
    gap: 0.9rem;
    justify-items: start;
    align-content: start;
}

.footer-wordmark {
    width: 180px;
    height: auto;
    aspect-ratio: 240 / 58;
}

.footer-wordmark__sub {
    font-family: var(--font-logo);
    font-size: 13px; /* viewBox-Einheiten */
    font-weight: 700;
    fill: rgb(255 255 255 / 0.85);
}

.footer-wordmark__main {
    font-family: var(--font-logo);
    font-size: 46px; /* viewBox-Einheiten */
    font-weight: 700;
    fill: #fff;
}

.site-footer__slogan {
    margin: 0;
    font-family: var(--font-script);
    font-size: 1rem;
    color: var(--c-accent-text);
}

.site-footer__heading {
    margin: 0 0 0.9rem;
    font-family: var(--font-title);
    font-size: 0.95rem;
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--c-accent-text);
}

.site-footer__list {
    list-style: none;
    margin: 0;
    padding: 0;

    a {
        display: inline-flex;
        align-items: center;
        min-height: 2.5rem;
        text-decoration: underline;
        text-decoration-color: transparent;
        text-underline-offset: 0.2em;
        transition: color var(--dur-micro) ease, text-decoration-color var(--dur-micro) ease;

        &:hover {
            color: var(--c-accent-text);
            text-decoration-color: currentColor;
        }
    }
}

.site-footer__bottom {
    border-block-start: 1px solid var(--nav-hairline-soft);
}

.site-footer__bottom-inner {
    max-width: calc(var(--breite-inhalt) + 2 * 1.25rem);
    margin-inline: auto;
    padding: 0.9rem 1.25rem;
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: center;
    gap: 0.75rem 1.5rem;

    p {
        margin: 0;
    }
}

.site-footer__social {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    gap: 0.6rem;

    a {
        display: grid;
        place-items: center;
        width: var(--tap-target);
        height: var(--tap-target);
        border: 1px solid var(--nav-hairline);
        border-radius: 50%;
        transition: background-color var(--dur-micro) ease, color var(--dur-micro) ease,
            border-color var(--dur-micro) ease;

        &:hover {
            background: var(--c-accent);
            border-color: transparent;
            color: var(--c-on-accent);
        }
    }
}

.site-footer__top {
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    min-height: var(--tap-target);
    font-weight: 600;
    text-decoration: none;
    transition: color var(--dur-micro) ease;

    &:hover {
        color: var(--c-accent-text);
    }
}
