/* === Basis: Icons (Lucide-Sprite) ===================================
   Gilt seitenweit für alle Elemente, die das lokale Sprite nutzen
   (files/kletterzentrum/theme/icons/lucide-sprite.svg). Kein CDN, kein
   Lucide-JS, siehe CLAUDE.md, Design-System → Icons. */

.kzc-icon {
    width: 1.1em;
    height: 1.1em;
    flex: none;
    fill: none;
    stroke: currentColor;
    stroke-width: 2;
    stroke-linecap: round;
    stroke-linejoin: round;
    vertical-align: -0.15em;
}

/* === kzc_hero – Hero-Banner (RSCE) ====================================
   Drei Layouts über die Modifier-Klasse aus dem Feld "layout":
     .kzc-hero--fullwidth  Foto flächig, Petrol-Verlauf (::before),
                           Wein-Diagonale an der schrägen Unterkante
                           (__blade per z-index übers Foto, clip-path).
                           Referenz: design-ref/KZC-hero-full-image-1.jpg.
     .kzc-hero--split      Petrol-Textspalte links, Foto rechts per
                           clip-path freigestellt, Weinrot-Klinge
                           (__blade hinter dem Foto, Spalt am Diagonal-
                           Übergang). Geometrie aus
                           KZC-Schritt5-Nav-Event.css (.hero .wine/.photo).
     .kzc-hero--plain      Kein Foto, kein Overlay. Kompaktes Petrol-Band
                           fuer Unterseiten (Seitenkopf), EXAKT dieselbe
                           Keil+Weinrot-Kante-Mechanik wie --fullwidth
                           (__blade + ::after, gemeinsam genutzte
                           Variablen --kzc-hero-cut/-edge/-foot an der
                           Basis .kzc-hero). Kundenfeedback 10.09.2026:
                           immer ein steiler roter Klingenabschluss,
                           gleiche Mechanik wie die Startseite. Seit
                           11.09.2026 Redaktionsregel: auf jede Seite mit
                           kzc_hero kommt direkt danach IMMER eine
                           kzc_notice_bar (die unterdrueckt dafuer ihre
                           eigene Oberkante, siehe ".kzc-hero +
                           .kzc-notice-bar"), kein Sonderfall "Hero ohne
                           Leiste" mehr. NICHT die helle Diagonale aus dem
                           Preise-Entwurf
                           (design-ref/KZC-Preise.html/.css
                           ".page-head::after") – erster Versuch, verworfen.
                           Eyebrow OHNE Klinge, wie bei fullwidth/split
                           (zweiter verworfener Versuch: kurzzeitig mit
                           Sektions-Kopf-Klinge, der Hero-Eyebrow hat auf
                           der Startseite aber nie eine).
   Gemeinsam: __inner (jetzt auf Projekt-Containerbreite 1320 statt der
   alten --kzc-w-content), Eyebrow, Headline (variable H-Ebene über
   RSCE-Standardfeld), Text, Button-Liste (0–4, Icon optional, Varianten
   primär Weinrot / ghost / dezent [kleine Pille, z. B. Sprungmarken]).
   Breakpoints 1024/768 (TODO 360/768/1024/1440-Angleichung, CLAUDE.md). */

.kzc-hero {
    /* Stellschrauben fuer den Diagonal-Keil + Weinrot-Kante an der
       Unterkante (__blade + ::after, siehe --fullwidth/--plain weiter
       unten – gleiche Mechanik, beide Layouts teilen sich diese drei
       Variablen, vereinheitlicht 10.09.2026):
       --kzc-hero-cut   Höhe des Keils (rechts hoch, links 0)
       --kzc-hero-edge  Stärke der Weinrot-Linie auf der Diagonale
       --kzc-hero-foot  Füllfarbe des Keils, fest --kzc-bg-band. Redaktions-
                        regel (11.09.2026, dritte Runde): auf jede Seite
                        mit kzc_hero kommt direkt danach IMMER eine
                        kzc_notice_bar, kein Sonderfall "Hero ohne
                        Leiste" mehr. Vorherige Zwischenstaende
                        (transparent, dann --kzc-white als Default mit
                        ":has(+ .kzc-notice-bar)"-Umschaltung) wieder
                        verworfen: selbst mit der Subpixel-Ueberlappung
                        weiter unten blieb am Uebergang Weiss/Wein/Petrol
                        eine sichtbare Haarlinie, und optisch ueberzeugte
                        die helle Variante ohnehin nicht. --kzc-bg-band
                        matcht die Aktuell-Leiste exakt, der Keil liest
                        sich als ihr schraeger Fortsatz. KEIN Weinrot
                        flächig (CLAUDE.md Farbeinsatz), Weinrot ist nur
                        die Kantenlinie. Split nutzt eine eigene Mechanik
                        (diagonale Klingen-Flaeche statt Unterkanten-
                        Keil) und referenziert diese Variablen nicht. */
    --kzc-hero-cut: var(--kzc-diagonal-px);
    --kzc-hero-edge: 5px;
    --kzc-hero-foot: var(--kzc-bg-band);
    position: relative;
    overflow: hidden;
    min-height: 620px;
    display: flex;
    align-items: center;
    background-color: var(--kzc-petrol);
    color: var(--kzc-white);
}

.kzc-hero__inner {
    position: relative;
    z-index: 3;
    box-sizing: border-box;
    width: 100%;
    max-width: var(--kzc-container-max);
    margin-inline: auto;
    padding-inline: var(--kzc-section-padding-x);
}

.kzc-hero__text {
    max-width: 32.5rem;
}

/* --- Split: Klinge + freigestelltes Foto rechts --- */
/* Redaktionsregel 11.09.2026: einheitliche Hoehe auf Unterseiten, egal ob
   mit Foto (Split) oder ohne (Seitenkopf) – NUR die Startseite ist hoeher
   (Vollbild, erbt die 620px-Basis oben unveraendert). Ohne dies waere
   Split (bisher 620px von der Basis geerbt) sichtbar hoeher als der
   Seitenkopf (bisher 0/content-getrieben) gewesen, siehe Kundenfeedback
   (Vergleich Klettern-&-Halle-Seite vs. Preise-Seite). */
.kzc-hero--split {
    min-height: 480px;
}

.kzc-hero--split .kzc-hero__blade {
    position: absolute;
    inset: 0;
    background-color: var(--kzc-wine);
    clip-path: polygon(54% 0, 100% 0, 100% 100%, 43% 100%);
}

.kzc-hero--split .kzc-hero__image {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    clip-path: polygon(55.8% 0, 100% 0, 100% 100%, 43% 100%);
}

/* --- Vollbild: Foto flächig, Petrol-Verlauf, Wein-Diagonale unten --- */
.kzc-hero--fullwidth {
    /* --kzc-hero-overlay  Grundton des Foto-Overlays als "R, G, B"
       (Petrol/Ink-Mischung; weniger Blau = Werte senken), Deckung steuern
       die drei Alphas im ::before. Foto-spezifisch, deshalb nicht an der
       Basis (--kzc-hero-cut/-edge/-foot dort, siehe .kzc-hero oben). */
    --kzc-hero-overlay: 22, 48, 60;
    padding-bottom: calc(var(--kzc-hero-cut) + var(--kzc-space-8));
}

.kzc-hero--fullwidth .kzc-hero__image {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* Foto-Overlay für Textlesbarkeit, links dicht -> rechts fast offen.
   Einziger im Design erlaubte Verlauf (CLAUDE.md). Dunkler, entsättigter
   Blaugrau-Ton wie in design-ref/KZC-hero-full-image-1.jpg, kein
   flächiges Petrol. */
.kzc-hero--fullwidth::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
    background: linear-gradient(
        90deg,
        rgba(var(--kzc-hero-overlay), 0.80) 0%,
        rgba(var(--kzc-hero-overlay), 0.42) 55%,
        rgba(var(--kzc-hero-overlay), 0.10) 100%
    );
}

/* Diagonal-Keil an der Unterkante: vollbreites Dreieck im Fuß-Ton (links
   0, rechts --kzc-hero-cut hoch), damit KEINE Lücke zur Aktuell-Leiste
   klafft und die Behandlung sauber ausläuft. z-index über Foto/Overlay
   (Vollbild), unter dem Inhalt. Gilt fuer --fullwidth UND --plain
   (gleiche Mechanik, vereinheitlicht 10.09.2026 – der Seitenkopf hatte
   zwischenzeitlich einen eigenen, flacheren Keil in eigenen Variablen,
   auf einer vollen Seitenbreite kaum als Diagonale erkennbar und ohne
   Weinrot-Kante an der Naht zur Aktuell-Leiste). --split bleibt aussen
   vor, eigene Klingen-Flaeche statt Unterkanten-Keil.

   Hoehe um 2px ueber --kzc-hero-cut hinaus (Befund 11.09.2026,
   Screenshot Preise-Seite): __blade und die Weinrot-Linie (::after) sind
   zwei getrennt geclippte Ebenen mit exakt gemeinsamer Diagonal-Kante –
   Browser rastern beide unabhaengig, an der gemeinsamen Kante blieb ein
   Subpixel-Spalt, durch den der Hero-Grund (Petrol) als duenne Linie
   durchschien. Bei dunkler Fuellfarbe (--kzc-bg-band, Aktuell-Leiste
   folgt) kaum sichtbar, bei Weiss (Regelfall ohne Leiste, seit heute
   Standard) deutlich. Die 2px Overlap liegen sicher unter der 5px
   breiten Linie (::after reicht bis --kzc-hero-cut + --kzc-hero-edge),
   bleiben also unsichtbar, schliessen aber die Naht. */
.kzc-hero--fullwidth .kzc-hero__blade,
.kzc-hero--plain .kzc-hero__blade {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 2;
    height: calc(var(--kzc-hero-cut) + 2px);
    background-color: var(--kzc-hero-foot);
    clip-path: polygon(0 100%, 100% 0, 100% 100%);
}

/* Weinrot-Linie auf der Diagonale ("Klinge"): gleichmäßig starkes,
   vollbreites Parallelogramm entlang der Keil-Oberkante. Nur Kante, nicht
   Fläche – Weinrot bleibt winziger Akzent (CLAUDE.md Farbeinsatz).
   ::after liegt in der Baum-Reihenfolge nach __blade, gleicher z-index,
   also darüber; der Inhalt (z-index 3) bleibt oben. Immer vorhanden, mit
   oder ohne folgende Aktuell-Leiste (Kundenfeedback 10.09.2026) – die
   Leiste unterdrueckt dafuer ihre eigene Oberkante, siehe
   ".kzc-hero + .kzc-notice-bar" weiter unten. */
.kzc-hero--fullwidth::after,
.kzc-hero--plain::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 2;
    height: calc(var(--kzc-hero-cut) + var(--kzc-hero-edge));
    background-color: var(--kzc-wine);
    clip-path: polygon(
        0 100%,
        100% var(--kzc-hero-edge),
        100% 0,
        0 var(--kzc-hero-cut)
    );
}

/* Foto-Quelle: kleine Zeile im hohen (rechten) Teil des Keils, gibt der
   Diagonale einen Zweck. Nur Vollbild (Twig rendert sie nur dort). */
.kzc-hero--fullwidth .kzc-hero__credit {
    position: absolute;
    right: var(--kzc-section-padding-x);
    bottom: calc((var(--kzc-hero-cut) - 1.4em) / 2);
    z-index: 3;
    margin: 0;
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-medium);
    letter-spacing: var(--kzc-tracking-wide);
    text-transform: uppercase;
    color: rgba(255, 255, 255, 0.55);
}

/* --- Seitenkopf: kein Foto, kompaktes Petrol-Band, gleicher Keil wie
   Vollbild (Kundenfeedback 10.09.2026: "genauso steil, gleiche
   Mechanik") --- */
.kzc-hero--plain {
    /* Fuenfte Runde (Befund "immer noch zu hoch, jetzt 740"): zwei
       Fehler uebersehen. (1) Die Basis .kzc-hero setzt min-height:620px
       – height:480px allein ueberschreibt das NICHT, min-height gewinnt
       immer, wenn es groesser ist als height. (2) Kein box-sizing:
       border-box (das Theme hat keinen globalen Reset, siehe
       colors_and_type.css) – Padding kommt bei content-box oben drauf
       statt in der Hoehe enthalten zu sein. 620px min-height + 120px
       Padding (32 oben + 56 Keil + 32 unten) = 740px, exakt der
       gemeldete Wert. Jetzt beides behoben: min-height explizit auf 0
       zurueckgesetzt, box-sizing: border-box lokal (wie bei
       kzc_split_diagonal/kzc_steps/kzc_price_overview aus demselben
       Grund), damit height:480px die GESAMTE Box inkl. Padding meint. */
    box-sizing: border-box;
    height: 480px;
    min-height: 0;
    padding-block: var(--kzc-space-6) calc(var(--kzc-hero-cut) + var(--kzc-space-6));
}

/* --- Hoehe Vollbild: Unterseite vs. Startseite (29.09.2026) ---
   Vollbild ist nicht mehr der Startseite vorbehalten. Auf Unterseiten
   gilt fuer ALLE Layouts dieselbe Hoehe wie beim Seitenkopf (480px
   Gesamtbox, border-box, gleicher Grund wie bei --plain oben), nur die
   Startseite bleibt beim grossen Hero. Unterscheidung ueber die
   Body-Klasse kzc-home aus dem eigenen Seitenlayout "Startseite"
   (tl_layout.cssClass, Contao schreibt sie in <body>), KEIN Feld am
   Element. Die kzc-home-Werte sind 1:1 die bisherigen Vollbild-Werte
   (content-box, 620/560/480px + Keil-Padding), die Startseite sieht
   also unveraendert aus. */
/* 30.09.2026: min-height statt fester height. Mit Eyebrow, zweizeiliger
   H1, Text, Eckdaten und Buttons (Einsteiger-Seite) sprengte der Inhalt
   die festen 480px, overflow:hidden schnitt die Eyebrow oben ab. Kurze
   Heroes (Kursseiten) bleiben bei 480px, lange wachsen mit. Oben
   Abstand, damit der Text nie am Header klebt. */
.kzc-hero--fullwidth {
    box-sizing: border-box;
    height: auto;
    min-height: 480px;
    padding-top: var(--kzc-space-6);
}

.kzc-home .kzc-hero--fullwidth {
    box-sizing: content-box;
    height: auto;
    min-height: 620px;
    padding-top: 0;
}

.kzc-hero--plain .kzc-hero__text {
    max-width: none;
}

.kzc-hero--plain .kzc-hero__headline {
    font-size: clamp(2.125rem, 5vw, 3.625rem);
    max-width: 20ch;
}

.kzc-hero__eyebrow {
    font-size: var(--kzc-fs-eyebrow);
    font-weight: var(--kzc-fw-semi);
    letter-spacing: var(--kzc-tracking-wide);
    text-transform: uppercase;
    color: var(--kzc-blue);
    margin: 0 0 var(--kzc-space-3);
}

/* Vollbild-Override: --kzc-blue auf hellen Fotostellen des Overlays nur
   ~2,3:1 (Test-Pass 02.09.2026, Befund 3), WCAG AA fuer Normaltext
   verfehlt. Weiss haelt in jeder Overlay-Zone sicher Kontrast. Split
   bleibt unveraendert (Textspalte auf vollflaechigem Petrol, kein
   Foto-Kontrastproblem, nicht Teil des Befunds). */
.kzc-hero--fullwidth .kzc-hero__eyebrow {
    color: var(--kzc-white);
}

/* Seitenkopf-Override: Weiss statt Blau (Befund 10.09.2026,
   Screenshot-Test) – --kzc-blue auf vollflaechigem Petrol faellt fast so
   knapp aus wie beim Vollbild-Foto-Overlay, gleiche Korrektur wie dort
   uebernommen statt neu vermessen. KEINE Klinge davor (Korrektur
   10.09.2026, zweite Runde): der Hero-Eyebrow hat auf der Startseite nie
   eine Klinge, egal welches Layout – das Sektions-Kopf-Muster mit Klinge
   gilt nur fuer Abschnitts-Ueberschriften weiter unten im Seitenfluss
   (kzc_cards/kzc_steps/etc.), nicht fuer kzc_hero. War kurzzeitig anders
   umgesetzt, wieder entfernt. */
.kzc-hero--plain .kzc-hero__eyebrow {
    color: var(--kzc-white);
}

.kzc-hero__headline {
    font-family: var(--kzc-font-sans);
    font-weight: var(--kzc-fw-xbold);
    /* Eigener, kleinerer Clamp statt --kzc-fs-display-1 (bis 96px): passt
       sonst nicht in die 520px-Textspalte, Wert 1:1 aus design-ref
       (.hero-text h1, clamp(46px, 5.2vw, 66px)). */
    font-size: clamp(2.875rem, 5.2vw, 4.125rem);
    line-height: 1;
    letter-spacing: var(--kzc-tracking-tight);
    text-transform: uppercase;
    color: var(--kzc-white);
    /* Lange deutsche Komposita (VORSTIEGSKURS) sind in 66px breiter als
       die 520px-Spalte. hyphens trennt an der Silbe (lang="de"),
       overflow-wrap bleibt nur letzter Notnagel (brach vorher mitten im
       Wort, Befund 30.09.2026). hyphenate-limit-chars: erst ab 10 Zeichen
       trennen, sonst trennte der Browser auch kurze Woerter nur zum
       Zeilenfuellen ("HÖ-HER" im Startseiten-Hero, Befund 30.09.2026). */
    hyphens: auto;
    hyphenate-limit-chars: 10 4 4;
    overflow-wrap: break-word;
    margin: 0 0 var(--kzc-space-4);
}

.kzc-hero__text-body {
    max-width: var(--kzc-w-prose);
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-normal);
    color: rgba(255, 255, 255, 0.92);
    margin: 0 0 var(--kzc-space-6);
}

.kzc-hero__buttons {
    display: flex;
    flex-wrap: wrap;
    gap: var(--kzc-space-3);
}

.kzc-hero__button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--kzc-space-2);
    font-weight: var(--kzc-fw-bold);
    font-size: var(--kzc-fs-body);
    padding: var(--kzc-space-4) var(--kzc-space-5);
    border-radius: var(--kzc-radius-md);
    border: 1.5px solid transparent;
    text-decoration: none;
    transition: transform var(--kzc-dur-fast) var(--kzc-ease-out), background-color var(--kzc-dur-base) var(--kzc-ease-out), border-color var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-hero__button-icon {
    flex: none;
}

.kzc-hero__button:hover {
    text-decoration: none;
    transform: translateY(-1px);
}

.kzc-hero__button:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
}

.kzc-hero__button--primary {
    background-color: var(--kzc-cta);
    color: var(--kzc-cta-fg);
}

.kzc-hero__button--primary:hover {
    background-color: var(--kzc-wine-hover);
    color: var(--kzc-cta-fg);
}

.kzc-hero__button--ghost {
    background-color: transparent;
    color: var(--kzc-white);
    border-color: rgba(255, 255, 255, 0.42);
}

.kzc-hero__button--ghost:hover {
    background-color: rgba(255, 255, 255, 0.1);
    border-color: var(--kzc-white);
    color: var(--kzc-white);
}

/* Dezent: kleine Pille auf dunklem Grund, fuer Sprungmarken/Sekundaer-
   links statt echter CTAs (Referenz KZC-Preise.css .page-head .quick).
   Kein translateY-Hover wie primaer/ghost, nur die Flaeche hellt auf –
   Pillen sind Navigationshilfen, keine Aktionen. */
.kzc-hero__button--quiet {
    background-color: rgba(255, 255, 255, 0.12);
    border-color: rgba(255, 255, 255, 0.24);
    color: var(--kzc-white);
    font-size: var(--kzc-fs-caption);
    padding: var(--kzc-space-3) var(--kzc-space-4);
    border-radius: var(--kzc-radius-pill);
}

.kzc-hero__button--quiet:hover {
    background-color: rgba(255, 255, 255, 0.2);
    border-color: rgba(255, 255, 255, 0.24);
    color: var(--kzc-white);
    transform: none;
}

.kzc-hero__button--quiet .kzc-hero__button-icon {
    color: var(--kzc-blue);
}

/* Eckdaten-Chips (Feld keyFacts, 29.09.2026, Referenz
   design-ref/KZC-Grundkurs.css ".k-hero .keys"): reine Info, deshalb
   KEIN Hover und kein Zeiger, sonst laesst sich der Chip mit einem
   "dezent"-Button verwechseln. Optisch Geschwister der dezenten Pille
   (gleiche Transluzenz), aber eckiger Radius statt Pill-Rundung als
   zweites Unterscheidungsmerkmal. Die weinrot gefuellte erste Pille
   aus der Referenz bewusst NICHT uebernommen: Weinrot signalisiert bei
   uns "Jetzt buchen", auf einem nicht klickbaren Chip waere das eine
   falsche Fährte. */
.kzc-hero__facts {
    display: flex;
    flex-wrap: wrap;
    gap: var(--kzc-space-2);
    list-style: none;
    margin: 0 0 var(--kzc-space-6);
    padding: 0;
}

.kzc-hero__fact {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-bold);
    line-height: 1.2;
    color: var(--kzc-white);
    background-color: rgba(255, 255, 255, 0.14);
    border: 1px solid rgba(255, 255, 255, 0.28);
    border-radius: var(--kzc-radius-sm);
    padding: var(--kzc-space-2) var(--kzc-space-3);
}

.kzc-hero__fact-icon {
    flex: none;
    width: 14px;
    height: 14px;
    /* Weiss wie in der Referenz: Blau (wie bei den dezenten Buttons)
       verschwindet auf dem Foto-Overlay im Vollbild (Befund 29.09.2026). */
    color: currentColor;
}

@media (max-width: 1024px) {
    /* Nur der Startseiten-Hero reduziert hier, alle Unterseiten-Heroes
       bleiben bei ihren 480px (siehe "Hoehe Vollbild" oben) – sonst
       wuerde die gemeinsame Unterseiten-Hoehe hier durch eine
       ungescopte Regel wieder auseinanderlaufen. */
    .kzc-home .kzc-hero--fullwidth {
        min-height: 560px;
    }
    .kzc-hero--split .kzc-hero__blade {
        clip-path: polygon(54% 0, 100% 0, 100% 100%, 42% 100%);
    }
    .kzc-hero--split .kzc-hero__image {
        clip-path: polygon(56% 0, 100% 0, 100% 100%, 42% 100%);
    }
    .kzc-hero--split .kzc-hero__text {
        max-width: 50%;
    }
}

@media (max-width: 768px) {
    /* Split stapelt: Foto oben mit eigener Diagonale, Text darunter. */
    .kzc-hero--split {
        display: block;
        min-height: 0;
    }
    .kzc-hero--split .kzc-hero__blade {
        display: none;
    }
    .kzc-hero--split .kzc-hero__image {
        position: relative;
        inset: auto;
        width: 100%;
        height: 260px;
        clip-path: polygon(0 0, 100% 0, 100% calc(100% - 46px), 0 100%);
    }
    .kzc-hero--split .kzc-hero__inner {
        padding-block: var(--kzc-space-6) var(--kzc-space-7);
    }
    .kzc-hero--split .kzc-hero__text {
        max-width: 100%;
    }

    /* Vollbild: Diagonale + Wein-Linie flacher, Hero kompakter. */
    .kzc-hero--fullwidth {
        --kzc-hero-cut: 36px;
        /* Unterseite: wie --plain unten keine harte Deckelung auf Mobil,
           langer Text wuerde sonst abgeschnitten. */
        height: auto;
    }
    .kzc-home .kzc-hero--fullwidth {
        min-height: 480px;
    }
    /* Unterseite: ohne feste Hoehe fehlte oben jeder Abstand, die Eyebrow
       klebte an der Oberkante (Befund Staging 30.09.2026). Startseite
       bleibt mittig in ihrer min-height. */
    body:not(.kzc-home) .kzc-hero--fullwidth {
        padding-top: var(--kzc-space-7);
    }
    /* Foto-Quelle ueber den Keil statt hinein: der Keil ist mobil so
       flach, dass die Zeile sonst durch die Weinrot-Linie laeuft. */
    .kzc-hero--fullwidth .kzc-hero__credit {
        bottom: calc(var(--kzc-hero-cut) + var(--kzc-space-2));
    }

    .kzc-hero__headline {
        font-size: clamp(2.125rem, 11vw, 2.875rem);
    }
    .kzc-hero__text-body {
        max-width: none;
    }
    .kzc-hero__buttons {
        flex-direction: column;
        align-items: stretch;
    }

    /* Seitenkopf: gleiche kompaktere Keil-Hoehe wie Vollbild (geteilte
       Variable, siehe .kzc-hero oben), Buttons bleiben Pillen im
       Zeilenumbruch statt gestapelt – das sind Sprungmarken, keine CTAs
       (Referenz KZC-Preise.css ".page-head .quick", kein Stack-Override
       dort). */
    .kzc-hero--plain {
        /* Feste 480px (Desktop) auf Mobil zurueck zu min-height: bei
           schmaler Spalte wickelt Eyebrow/H1/Intro auf mehr Zeilen,
           eine harte Deckelung wuerde dort eher Text abschneiden statt
           nur die Box zu strecken. */
        height: auto;
        min-height: 0;
        --kzc-hero-cut: 36px;
        padding-block: var(--kzc-space-6) calc(var(--kzc-hero-cut) + var(--kzc-space-6));
    }
    .kzc-hero--plain .kzc-hero__buttons {
        flex-direction: row;
        flex-wrap: wrap;
        align-items: center;
    }
    /* Nur Sprungmarken (alle Buttons "dezent", z. B. Klettern & Halle mit
       6 Bereichen, 01.10.2026): auch bei Vollbild/Split Pillen im
       Zeilenumbruch statt 6 gestapelter Vollbreiten-Buttons. */
    .kzc-hero__buttons:not(:has(.kzc-hero__button:not(.kzc-hero__button--quiet))) {
        flex-direction: row;
        flex-wrap: wrap;
        align-items: center;
    }
}

@media (prefers-reduced-motion: reduce) {
    .kzc-hero__button {
        transition: none;
    }

    #header,
    #header.is-scrolled {
        transition: none;
    }
}

/* === kzc_cards – Karten mit Bild ==================================
   Bild-/Icon-Karten-Raster (Kurse, Angebote, USPs, Zielgruppen,
   Buchungsanlaesse). Vorbild design-ref KZC-Schritt5-Nav-Event.css
   Abschnitt M06 ".occ" (Anlass-Band "Ideen fuer deinen Besuch").

   Sektions-Inhaltselement: KEIN eigener Zentrierungs-Wrapper, KEIN
   background-Feld. Steht zwischen kzc_section_start / kzc_section_stop,
   die .kzc-section/.kzc-section-inner (kzc-grid.css) Breite UND
   Hintergrund liefern (CLAUDE.md "Sektions-Wrapper vs. Vollbild-
   Elemente"). Grid-Breakpoints 768/1024 mobile-first wie kzc-grid.css
   (Rebuild 08.09.2026, weg von den alten 640/960).

   Ganze Karte klickbar: bei gesetztem Link deckt .kzc-cards__link per
   ::after die ganze Karte ab (ein echter <a>, Titel bleibt reine
   Ueberschrift). Diagonalschnitt am Kartenbild nur bei aktivem
   Element-Feld "diagonal", Richtung alterniert per :nth-child, greift
   nur bei Fotos (nicht bei Icon-Karten). featured = weinrote Oberkante
   + weinroter Link (Referenz .occ.feat), sparsam. */

.kzc-cards {
    --kzc-cards-cut: 22px;
    padding-block: var(--kzc-space-8);
}

.kzc-cards__head {
    max-width: var(--kzc-w-prose);
    margin-bottom: var(--kzc-space-6);
}

.kzc-cards__headline {
    font-size: var(--kzc-fs-h2);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-petrol);
    margin: var(--kzc-space-2) 0 0;
}

.kzc-cards__intro {
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-fg-mute);
    margin: var(--kzc-space-4) 0 0;
}

.kzc-cards__grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--kzc-space-5);
}

/* cols-6 = kompaktes Anlass-Band (Vorbild Wireframe v4 ".occ-grid"):
   viele schmale Karten, engerer Abstand. Stufen 2 -> 3 -> 6
   (768 / 1024 / 1280px). */
.kzc-cards--cols-6 .kzc-cards__grid {
    gap: var(--kzc-space-4);
}

@media (min-width: 768px) {
    .kzc-cards--cols-2 .kzc-cards__grid,
    .kzc-cards--cols-3 .kzc-cards__grid,
    .kzc-cards--cols-4 .kzc-cards__grid,
    .kzc-cards--cols-6 .kzc-cards__grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (min-width: 1024px) {
    .kzc-cards--cols-3 .kzc-cards__grid { grid-template-columns: repeat(3, 1fr); }
    .kzc-cards--cols-4 .kzc-cards__grid { grid-template-columns: repeat(4, 1fr); }
    .kzc-cards--cols-6 .kzc-cards__grid { grid-template-columns: repeat(3, 1fr); }
}

/* 6 Spalten ab 1280px statt 1440px (Test 02.10.2026), damit gaengige
   Laptops das Band einreihig sehen. 1280 liegt bewusst ausserhalb der
   Projekt-Breakpoints (360/768/1024/1440). */
@media (min-width: 1280px) {
    .kzc-cards--cols-6 .kzc-cards__grid { grid-template-columns: repeat(6, 1fr); }
}

.kzc-cards__card {
    position: relative;
    display: flex;
    flex-direction: column;
    background-color: var(--kzc-bg);
    border: 1px solid var(--kzc-border);
    border-radius: var(--kzc-radius-md);
    box-shadow: var(--kzc-shadow-1);
    overflow: hidden;
    transition: transform var(--kzc-dur-fast) var(--kzc-ease-out),
                box-shadow var(--kzc-dur-fast) var(--kzc-ease-out);
}

.kzc-cards__card:hover {
    transform: translateY(-2px);
    box-shadow: var(--kzc-shadow-2);
}

/* Weinrote Oberkante (Dreiecks-Clip) statt eines vollen Rahmens. */
.kzc-cards__card--featured {
    border-color: transparent;
    box-shadow: var(--kzc-shadow-2);
}

.kzc-cards__card--featured::before {
    content: "";
    position: absolute;
    inset: 0 0 auto;
    height: 7px;
    background: var(--kzc-wine);
    clip-path: polygon(0 0, 100% 0, 100% 38%, 0 100%);
    z-index: 3;
    pointer-events: none;
}

.kzc-cards__media {
    position: relative;
    overflow: hidden;
}

.kzc-cards__media picture {
    display: block;
}

.kzc-cards__image {
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: 3 / 2;
    object-fit: cover;
}

/* Diagonalschnitt: einseitig, alle Karten gleiche Richtung (wechselseitig
   war zu unruhig, Feedback 08.09.2026). Der Schnitt gibt den weissen
   Kartengrund frei und liest sich als schraege Unterkante. Nur bei Fotos. */
.kzc-cards--diagonal .kzc-cards__image {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 calc(100% - var(--kzc-cards-cut)));
}

/* Icon-Karte (kein Foto): Icon auf ruhiger, leicht getoenter Flaeche. */
.kzc-cards__media--icon {
    display: grid;
    place-items: center;
    min-height: 140px;
    background-color: var(--kzc-bg-alt);
}

.kzc-cards__icon {
    width: 48px;
    height: 48px;
    color: var(--kzc-blue);
}

/* Badge – Pille oben links auf dem Bild. Farbe je badgeType, Text bei
   blauer Fuellung dunkel (WCAG AA). pointer-events: none, damit die
   klickbare Karte darunter nicht blockiert wird. */
.kzc-cards__badge {
    position: absolute;
    left: var(--kzc-space-3);
    top: var(--kzc-space-3);
    z-index: 2;
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-1);
    padding: 5px 11px;
    border-radius: 999px;
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-bold);
    letter-spacing: var(--kzc-tracking-wide);
    text-transform: uppercase;
    pointer-events: none;
}

.kzc-cards__badge--beliebt { background: var(--kzc-wine); color: #fff; }
.kzc-cards__badge--hinweis { background: var(--kzc-success); color: #fff; }
.kzc-cards__badge--info    { background: var(--kzc-blue); color: var(--kzc-ink); }

.kzc-cards__badge-icon {
    width: 13px;
    height: 13px;
}

.kzc-cards__body {
    display: flex;
    flex-direction: column;
    flex: 1;
    padding: var(--kzc-space-5) var(--kzc-space-5) var(--kzc-space-6);
}

.kzc-cards__title {
    font-size: var(--kzc-fs-h3);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-petrol);
    margin: 0 0 var(--kzc-space-2);
}

.kzc-cards__text {
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-fg);
    margin: 0;
}

.kzc-cards__link {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    margin-top: var(--kzc-space-4);
    align-self: flex-start;
    font-weight: var(--kzc-fw-semi);
    color: var(--kzc-link);
    text-decoration: none;
}

/* deckt die ganze Karte ab -> Karte ist anklickbar */
.kzc-cards__link::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
}

/* cols-6: kompakte Karten-Innenmasse wie im Wireframe v4 (".occ"):
   flaches Bild (~2:1), enges Padding, kleinere Schrift, kleinerer Badge.
   Greift erst, wenn das Raster wirklich 6-spaltig laeuft (>= 1280px),
   darunter sind die Karten normal breit. cols-6-gescopt, 3/4-Spalten
   bleiben unangetastet. */
@media (min-width: 1280px) {
    .kzc-cards--cols-6 .kzc-cards__image {
        aspect-ratio: 2 / 1;
    }
    .kzc-cards--cols-6 .kzc-cards--diagonal .kzc-cards__image,
    .kzc-cards--diagonal.kzc-cards--cols-6 .kzc-cards__image {
        --kzc-cards-cut: 14px;
    }
    .kzc-cards--cols-6 .kzc-cards__badge {
        left: var(--kzc-space-2);
        top: var(--kzc-space-2);
        padding: 3px 8px;
        font-size: 0.6875rem; /* 11px */
    }
    .kzc-cards--cols-6 .kzc-cards__body {
        padding: var(--kzc-space-3);
    }
    .kzc-cards--cols-6 .kzc-cards__title {
        font-size: var(--kzc-fs-body-sm);
        margin-bottom: var(--kzc-space-1);
    }
    .kzc-cards--cols-6 .kzc-cards__text {
        font-size: var(--kzc-fs-caption);
        line-height: var(--kzc-lh-snug);
    }
    /* Link an die Kartenunterkante (gleiche Hoehe ueber alle Karten,
       auch bei unterschiedlich langem Text) wie im Wireframe v4. */
    .kzc-cards--cols-6 .kzc-cards__link {
        margin-top: auto;
        padding-top: var(--kzc-space-3);
        font-size: var(--kzc-fs-caption);
    }
}

.kzc-cards__card--featured .kzc-cards__link {
    color: var(--kzc-wine);
}

.kzc-cards__link:hover,
.kzc-cards__link:focus-visible {
    text-decoration: underline;
}

.kzc-cards__link-icon {
    transition: transform var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-cards__link:hover .kzc-cards__link-icon {
    transform: translateX(3px);
}

@media (prefers-reduced-motion: reduce) {
    .kzc-cards__card,
    .kzc-cards__link-icon {
        transition: none;
    }
}

/* === kzc_utility_bar – Utility-Zeile (RSCE) ==========================
   Seitenuebergreifende Petrol-Leiste ueber dem Header, gepflegt im
   Include-Artikel (siehe CLAUDE.md Abschnitt 8). Zweistufig wie
   kzc-section, aber eigenstaendig: kzc-utility-bar traegt den
   Hintergrund fullwidth, kzc-utility-bar__inner zentriert auf
   --kzc-container-max (kzc-grid.css), kein Umweg ueber section_start/stop.
   Ab 1024px ausgeblendet, wandert dort ins Burgermenue (noch nicht
   gebaut, siehe CLAUDE.md). Geometrie/Werte 1:1 aus design-ref
   KZC-Schritt5-Nav-Event.css (.util / .util-left / .util-right). */

.kzc-utility-bar {
    background-color: var(--kzc-petrol);
    color: rgba(255, 255, 255, 0.9);
    font-size: var(--kzc-fs-caption);
    visibility: visible;
    transition: visibility 0s linear 0s;
}

/* Befund 03.09.2026, Teil 4: max-height/opacity auf der Utility-Zeile
   selbst war noch immer nicht flackerfrei, weil eine Hoehenaenderung
   IMMER einen Layout-Reflow des gesamten gestickten #header auslöst
   (auf jedem Animationsframe neu, gemessen per MutationObserver +
   Pixel-Sampling in einem headless Chromium, siehe Chat). Jetzt animiert
   stattdessen NUR noch #header selbst per transform (Compositor-Property,
   kein Reflow) um exakt die Hoehe der Utility-Zeile nach oben – die Zeile
   behaelt dabei ihre normale Boxhoehe die ganze Zeit, sie wird nur aus
   dem sichtbaren Bereich herausgeschoben, kein einziges Layout-Recalc
   mehr waehrend der Animation. Hoehe kommt aus --kzc-utility-bar-h,
   von kzc-chrome.js einmalig gemessen (getBoundingClientRect) und bei
   Resize aktualisiert, nicht hart kodiert (Zeile kann durch flex-wrap
   umbrechen). visibility bleibt fuer Tab-Reihenfolge/Screenreader
   zustaendig (verzoegert bis die Transform-Animation fertig ist), hat
   selbst keinen Layout-Einfluss. */
#header.is-scrolled .kzc-utility-bar {
    visibility: hidden;
    transition: visibility 0s linear var(--kzc-dur-base);
}

.kzc-utility-bar__inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: var(--kzc-space-2);
    min-height: 40px;
    max-width: var(--kzc-container-max);
    margin-inline: auto;
    padding-inline: var(--kzc-section-padding-x);
    padding-block: var(--kzc-space-1);
}

.kzc-utility-bar__contact {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--kzc-space-1) var(--kzc-space-4);
}

/* Adresse + Telefon kommen seit 30.09.2026 aus dem eingebundenen Element
   "KZC Kontaktdaten", Optik siehe Abschnitt kzc_contact (Kontext
   .kzc-utility-bar). */

.kzc-utility-bar__links {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
}

.kzc-utility-bar__link {
    color: rgba(255, 255, 255, 0.82);
    font-weight: var(--kzc-fw-medium);
}

.kzc-utility-bar__link {
    padding-inline: var(--kzc-space-4);
    border-left: 1px solid rgba(255, 255, 255, 0.16);
}

.kzc-utility-bar__link:first-child {
    border-left: none;
    padding-inline-start: 0;
}

.kzc-utility-bar__link:hover,
.kzc-utility-bar__link:focus-visible {
    color: var(--kzc-white);
    text-decoration: none;
}

/* Weisser Ring statt globalem Blau-Ring, gleiche Loesung wie
   .kzc-hero__button:focus-visible auf dunklem Grund. */
.kzc-utility-bar__link:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
    border-radius: var(--kzc-radius-xs);
}

/* === kzc_logo – Marken-Lockup (RSCE) =================================
   Icon-Mark + zweizeilige Wortmarke, siehe rsce_kzc_logo.html.twig.
   Platzhalterform (Diamant) 1:1 aus design-ref KZC-Schritt5-Nav-Event.css
   (.brand .peak). Letter-Spacing bewusst weggelassen: design-ref nutzt
   0.02em, dafür existiert kein Token (nur -tight/-wide), siehe CLAUDE.md
   CSS-Regel "nur echte Tokens". */

.kzc-logo {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-3);
    text-decoration: none;
    flex: none;
}

.kzc-logo:hover {
    text-decoration: none;
}

/* Nur Hoehe fixieren, Breite automatisch (Test-Pass 03.09.2026): fixe
   30x23px (Seitenverhaeltnis 1.30) stauchten das tatsaechlich hochformatige
   Logo (real ~39x46, 0.85) – width:auto skaliert seitenverhaeltnis-treu zur
   fixen Hoehe, unabhaengig vom genauen Format der Bilddatei (relevant, wenn
   spaeter das PNG-Provisorium durchs echte SVG ersetzt wird). */
.kzc-logo__mark {
    flex: none;
    width: auto;
    height: 23px;
}

/* Reines CSS-Shape ohne eigenes Bild-Seitenverhaeltnis, braucht anders als
   .kzc-logo__mark oben eine feste Breite (sonst 0, leeres Block-Element). */
.kzc-logo__mark--placeholder {
    display: block;
    width: 30px;
    background-color: var(--kzc-blue);
    clip-path: polygon(0 100%, 50% 0, 70% 40%, 85% 18%, 100% 100%);
}

.kzc-logo__word {
    display: flex;
    flex-direction: column;
    font-weight: var(--kzc-fw-xbold);
    font-size: var(--kzc-fs-body-sm);
    line-height: 1;
    color: var(--kzc-petrol);
    text-transform: uppercase;
}

.kzc-logo__word-line {
    display: block;
}

/* Dunkel-Override fuer die zweite kzc_logo-Instanz im Footer (petrol-
   dunkler Grund statt Header-Weiss). Gescoped auf #footer statt einer
   Footer-internen Klasse, damit das unabhaengig von der genauen
   Grid-Struktur greift, egal wo der Redakteur die Instanz platziert. */
#footer .kzc-logo__word {
    color: var(--kzc-white);
}

/* === kzc_cta_group – CTA-Gruppe (RSCE) ================================
   Primär "Jetzt buchen" (Weinrot) + optionaler Ghost "Einsteiger"
   (Petrol-Text, grauer Rahmen). Farben/Geometrie des Ghost-Buttons 1:1
   aus design-ref KZC-Schritt5-Nav-Event.css (.head-cta .ghost), auch wenn
   die dortige HTML-Kundenansicht den Button noch nicht zeigt (siehe
   CLAUDE.md Abschnitt "Navigation und Header", mit Kunde abgestimmt).

   Mobil (<1024px, Entscheidung vom 02.09.2026): die Header-Instanz der
   CTA-Gruppe wird ausgeblendet (kein fixierter Buchen-Balken mehr, siehe
   Media-Query weiter unten). Buchen auf Mobil läuft über den Hero-Button
   und den Burger-Drawer. Die Drawer-Instanz (zweites Rendering derselben
   RSCE per Insert-Tag) ist eigener Abschnitt ".mobile_menu .kzc-cta-group"
   weiter unten, dort gestapelt mit beiden Buttons. */

.kzc-cta-group {
    display: flex;
    align-items: center;
    gap: var(--kzc-space-3);
}

.kzc-cta-group__button {
    box-sizing: border-box;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-weight: var(--kzc-fw-bold);
    font-size: var(--kzc-fs-body-sm);
    padding: var(--kzc-space-3) var(--kzc-space-4);
    border-radius: var(--kzc-radius-md);
    border: 1.5px solid transparent;
    text-decoration: none;
    white-space: nowrap;
    transition: transform var(--kzc-dur-fast) var(--kzc-ease-out), background-color var(--kzc-dur-base) var(--kzc-ease-out), border-color var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-cta-group__button:hover {
    text-decoration: none;
    transform: translateY(-1px);
}

.kzc-cta-group__button:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

.kzc-cta-group__button--primary {
    background-color: var(--kzc-cta);
    color: var(--kzc-cta-fg);
}

.kzc-cta-group__button--primary:hover {
    background-color: var(--kzc-wine-hover);
    color: var(--kzc-cta-fg);
}

.kzc-cta-group__button--ghost {
    background-color: transparent;
    color: var(--kzc-petrol);
    border-color: var(--kzc-border);
}

.kzc-cta-group__button--ghost:hover {
    background-color: var(--kzc-bg-alt);
    color: var(--kzc-petrol);
}

/* Mobil (<1024px, Entscheidung 02.09.2026): die Header-CTA-Gruppe wird
   NICHT angezeigt. Kein fixierter "Jetzt buchen"-Balken am Bildschirm-
   unterrand mehr (vorher hier), er duplizierte im sichtbaren Bereich den
   Hero-CTA und die "immer sichtbar"-Priorität war ohnehin inkonsequent
   (Einsteiger-Ghost liegt auf Mobil nur im Drawer). Buchen auf Mobil:
   Hero-Button + Drawer. Der Drawer rendert dieselbe RSCE-Instanz noch
   einmal (siehe .mobile_menu .kzc-cta-group weiter unten), die ist von
   dieser Regel ausgenommen (kein direktes Kind von .kzc-header__inner,
   und das Plugin hängt den Drawer ohnehin nach <body> um). */
@media (max-width: 1023px) {
    .kzc-header__inner > .kzc-cta-group {
        display: none;
    }
}

@media (max-width: 1023px) {
    .kzc-utility-bar {
        display: none;
    }
}

/* === kzc-header – Site-Chrome-Hauptzeile (FE-Modul-Sandwich) ==========
   Kein eigenes RSCE: drei native Contao-Module in der Layout-Modulspalte
   "header" bilden den Rahmen, siehe Chat-Absprache vom 28.08.2026 zu
   CLAUDE.md Abschnitt "Navigation und Header":
     1. HTML-Modul "Header Begin"        -> <div class="kzc-header">
     2. HTML-Modul "Include Header Navi" -> <div class="kzc-header__inner">
        + Insert-Tag auf den Include-Artikel (Artikel enthält
        rsce_kzc_logo, Inhaltselement "Modul einfügen" (Navigation,
        Kern-Modul), rsce_kzc_cta_group)
     3. HTML-Modul "Header End"          -> </div></div>

   Korrektur nach Live-Check im gerenderten HTML (28.08.2026): der
   Include-Artikel wird per Insert-Tag eingebunden, nicht über ein echtes
   Artikel-Modul, deshalb fehlt das sonst übliche .mod_article-Div (siehe
   .kzc-cards/.kzc-hero, die in einem echten Artikel stecken) als zweite
   Ebene. .kzc-header__inner übernimmt jetzt genau diese Rolle, muss aber
   im HTML-Modul "Include Header Navi" per Hand mit um den Insert-Tag
   gelegt werden (reines Textfeld, keine Datei) – ohne dieses Div wäre
   die Zweistufigkeit (voller Hintergrund außen, 1320px-Zeile innen) mit
   einer einzigen Klasse nicht möglich, siehe .kzc-section/.kzc-section-
   inner als Vorbild. Geometrie 1:1 aus design-ref KZC-Schritt5-Nav-
   Event.css (header.site / .wrap).

   Navigation und Burgermenü sind noch nicht gestylt, hier deshalb nur
   der Rahmen plus die zwei fertigen Kinder (Logo, CTA-Gruppe) als
   Referenz.

   Sticky: sitzt auf #header (Contao-Layoutsektion, direktes Kind von
   #wrapper), NICHT auf .kzc-header. Ein sticky-Element kann seinen
   Elternbereich nicht verlassen; .kzc-header steckt in
   header#header > .inside, das nur inhaltshoch ist -> praktisch kein
   Klebe-Weg, sieht aus wie nicht sticky. #header umschliesst dagegen
   die ganze Seite (header + Content + Footer). Die Utility-Zeile klebt
   dadurch mit und wird ab dem ersten Scroll ausgeblendet (Regel unten):
   am Seitenanfang zwei Baender, beim Scrollen nur die Hauptzeile.
   Referenz-Pendant: KZC-Schritt5-Nav-Event.css header.site (dort liegt
   .util ausserhalb des sticky-Headers, bei uns steckt beides in der
   einen Contao-Header-Sektion). Klasse .is-scrolled setzt
   kzc-chrome.js (scrollY > 8) auf #header. */

#header {
    position: sticky;
    top: 0;
    z-index: 60;
    transform: translateY(0);
    transition: transform var(--kzc-dur-base) var(--kzc-ease-out);
    will-change: transform;
}

/* --kzc-utility-bar-h kommt von kzc-chrome.js (0px unter 1024px, da die
   Zeile dort per display:none ohnehin keine Hoehe hat). Verschiebt den
   ganzen gestickten Header exakt um die Zeilenhoehe nach oben, siehe
   Kommentar bei .kzc-utility-bar oben. */
#header.is-scrolled {
    transform: translateY(calc(-1 * var(--kzc-utility-bar-h, 0px)));
}

.kzc-header {
    width: 100%;
    background-color: var(--kzc-white);
    border-bottom: 1px solid var(--kzc-border);
    transition: background-color var(--kzc-dur-base) var(--kzc-ease-out), box-shadow var(--kzc-dur-base) var(--kzc-ease-out);
}

#header.is-scrolled .kzc-header {
    background-color: rgba(255, 255, 255, 0.92);
    box-shadow: var(--kzc-shadow-1);
}

/* backdrop-filter komplett gestrichen (Befund 03.09.2026, Teil 3). Per
   MutationObserver + Pixel-Sampling in einem headless Chromium (siehe
   Chat) verifiziert: die .is-scrolled-Klasse kippt sauber genau einmal
   pro Scroll-Richtung, kein Nachzittern, die Utility-Zeile blendet
   messbar monoton aus/ein, keine Logikfehler mehr. Das gemeldete
   Rest-Flackern trat trotzdem weiter auf und ist damit kein Zustands-,
   sondern ein Rendering-Kostenproblem, das ein headless/Software-
   Renderer nicht zeigt: backdrop-filter erzwingt einen eigenen
   Compositing-Layer, der bei jedem Animationsframe der gleichzeitig
   hoehenaendernden Utility-Zeile (Layout-Reflow) neu aufgebaut werden
   muss – auf echter GPU/echtem Treiber sichtbar ruckelig, in der
   automatisierten Messung nicht reproduzierbar. Blur war ohnehin nur ein
   Ab-Desktop-Kosmetik-Layer (siehe alte Kommentar-Historie), kein
   Kernbestandteil des Scroll-Zustands – gestrichen statt weiter
   Transitions-Feintuning zu betreiben. Scrolled-Zustand bleibt uebers
   transluzente Weiss + Schatten oben sichtbar. */

.kzc-header__inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--kzc-space-4);
    min-height: 74px;
    max-width: var(--kzc-container-max);
    margin-inline: auto;
    padding-inline: var(--kzc-section-padding-x);
}

/* === kzc-nav – Hauptnavigation, Desktop-Instanz (Kern-Modul) ==========
   Kein eigenes Template: Contaos Standard-Navigationsmodul liefert schon
   stabile Klassen (level_1, active am aktiven <strong>, trail an den
   Vorfahren des aktiven Pfads, sibling an Geschwistern, submenu am <li>
   mit Unterseiten), verifiziert in vendor/contao/core-bundle gegen
   compileNavigationRow. .kzc-nav kommt ueber das Modul-eigene
   CSS-Klasse-Feld (tl_module) an den Standard-<nav>-Wrapper. Kein
   Item-Template-Umbau, reine CSS-Aufgabe.

   Optik: Richtung "Die Klinge" aus design-ref/KZC-Navigation-Megamenu.css
   (ergaenzend KZC-Schritt5-Nav-Event.css). Nur Praesentation, das
   Contao-Markup (level_1/level_2/level_3, submenu, trail, active) bleibt
   unveraendert. Teaser-Spalte und "Haeufig gesucht"-Zeile aus dem Entwurf
   sind bewusst NICHT uebernommen (Entscheidung 04.09.2026): das Panel
   fuellt sich allein aus dem Seitenbaum, keine redaktionell freien Bloecke,
   keine Megamenu-Extension.

   Zwei Panel-Auspraegungen aus EINEM Regelsatz, umgeschaltet per :has():
   - level_2 OHNE level_3 (aktueller Seitenbaum-Stand): kompaktes
     einspaltiges Dropdown.
   - level_2 MIT level_3 (sobald ein Nav-Punkt zwei Unterebenen bekommt
     und die Modul-Stufe im Backend hochgesetzt ist): mehrspaltiges
     Megamenu, Spaltenkopf = level_2-Eintrag, Spalteninhalt = level_3.
   Wenn die zweite Ebene dazukommt, kein Rebuild noetig, nur die
   Backend-Einstellung.

   Zurueckgestellt bis das breite Megamenu wirklich gebraucht wird (dann
   in kzc-chrome.js): Escape-/focusout-schliesst, Scrim, dynamische
   Viewport-Kanten-Erkennung. Interims-Ueberlaufschutz ohne JS: Panels
   der letzten beiden Nav-Punkte oeffnen nach rechts (siehe unten). */

.kzc-nav {
    /* Stellschrauben, damit spaetere Anpassungen an einer Stelle sitzen. */
    --kzc-nav-panel-w: 18rem;                          /* kompaktes Dropdown */
    --kzc-nav-mega-max: min(60rem, calc(100vw - 6rem)); /* Megamenu-Deckel */
    --kzc-nav-col-w: 12rem;                            /* Megamenu-Spalte */
}

.kzc-nav .level_1 {
    display: flex;
    align-items: center;
    gap: var(--kzc-space-5);
    list-style: none;
    margin: 0;
    padding: 0;
}

@media (min-width: 1440px) {
    .kzc-nav .level_1 {
        gap: var(--kzc-space-6);
    }
}

/* Hover-Bruecke (Befund 03.09.2026): das padding-bottom gehoert zur
   hoverbaren Box des <li>, damit die Maus auf dem Weg zum Panel nie den
   :hover-Zustand verliert (keine tote Zone zwischen Link und Panel). */
.kzc-nav .level_1 > li {
    position: relative;
    padding-bottom: var(--kzc-space-3);
}

.kzc-nav .level_1 > li > a,
.kzc-nav .level_1 > li > strong {
    position: relative;
    display: inline-flex;
    align-items: center;
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-semi);
    color: var(--kzc-ink);
}

/* Klingen-Underline: schraeger Hellblau-Strich, faehrt von links auf.
   Ersetzt die fruehere 2px-Border als Hover-/Aktiv-Signal. Die sichtbare
   Klinge ist selbst das farbunabhaengige zweite Signal (WCAG 1.4.1,
   Befund 4 vom 02.09.2026), der Farbwechsel auf Petrol kommt zusaetzlich.
   Blau statt Weinrot (04.09.2026): Weinrot neben dem ohnehin auf Petrol
   umschlagenden Nav-Punkt wirkte zu laut, Weinrot bleibt dem Buchen-CTA
   vorbehalten. Blau deckt sich mit den Spaltenkopf-Regeln im Megamenu. */
.kzc-nav .level_1 > li > a::after,
.kzc-nav .level_1 > li > strong::after {
    content: "";
    position: absolute;
    left: -3px;
    right: -3px;
    bottom: calc(var(--kzc-space-1) * -1);
    height: 3px;
    background-color: var(--kzc-blue);
    transform: skewX(var(--kzc-blade-skew)) scaleX(0);
    transform-origin: left center;
    transition: transform var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-nav .level_1 > li > a:hover,
.kzc-nav .level_1 > li:hover > a,
.kzc-nav .level_1 > li:focus-within > a,
.kzc-nav .level_1 > li > strong.active,
.kzc-nav .level_1 > li > a.trail {
    color: var(--kzc-petrol);
    text-decoration: none;
}

.kzc-nav .level_1 > li:hover > a::after,
.kzc-nav .level_1 > li:focus-within > a::after,
.kzc-nav .level_1 > li > strong.active::after,
.kzc-nav .level_1 > li > a.trail::after {
    transform: skewX(var(--kzc-blade-skew)) scaleX(1);
}

.kzc-nav .level_1 > li > a:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
    border-radius: var(--kzc-radius-sm);
}

/* --- Panel (level_2): gemeinsame Chrome-Optik --------------------- */
.kzc-nav .level_1 .level_2 {
    position: absolute;
    top: 100%;
    left: 0;
    z-index: 70;
    width: var(--kzc-nav-panel-w);
    margin: 0;
    padding: var(--kzc-space-3) 0;
    list-style: none;
    background-color: var(--kzc-white);
    border: 1px solid var(--kzc-grey-100);
    border-top: none;
    box-shadow: var(--kzc-shadow-3);
    opacity: 0;
    visibility: hidden;
    transform: translateY(-6px);
    transition: opacity var(--kzc-dur-base) var(--kzc-ease-out),
                transform var(--kzc-dur-base) var(--kzc-ease-out),
                visibility 0s linear var(--kzc-dur-base);
}

/* Diagonaler Hellblau-Streifen an der Oberkante (Klingen-Motiv, ersetzt
   den frueheren Verbindungspfeil). Blau statt Weinrot (04.09.2026, siehe
   Underline oben). */
.kzc-nav .level_1 .level_2::before {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    height: 6px;
    background-color: var(--kzc-blue);
    clip-path: polygon(0 0, 100% 0, 100% 35%, 0 100%);
}

.kzc-nav .level_1 > li:hover > .level_2,
.kzc-nav .level_1 > li:focus-within > .level_2 {
    opacity: 1;
    visibility: visible;
    transform: none;
    transition: opacity var(--kzc-dur-base) var(--kzc-ease-out),
                transform var(--kzc-dur-base) var(--kzc-ease-out),
                visibility 0s linear 0s;
}

/* Interims-Ueberlaufschutz ohne JS: die letzten beiden Nav-Punkte oeffnen
   ihr Panel nach rechts, sonst laeuft ein breites Megamenu rechts aus dem
   Viewport. Der dynamische Kanten-Check kommt spaeter in kzc-chrome.js. */
.kzc-nav .level_1 > li:nth-last-child(-n + 2) > .level_2 {
    left: auto;
    right: 0;
}

.kzc-nav .level_1 > li:nth-last-child(-n + 2) > .level_2::before {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 35%);
}

/* --- Auspraegung A: kompaktes Dropdown (level_2 ohne level_3) ------ */
.kzc-nav .level_1 .level_2 > li > a,
.kzc-nav .level_1 .level_2 > li > strong {
    display: block;
    padding: var(--kzc-space-2) var(--kzc-space-4);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-medium);
    color: var(--kzc-grey-700);
    line-height: var(--kzc-lh-snug);
}

/* --- Auspraegung B: mehrspaltiges Megamenu (level_2 mit level_3) --- */
.kzc-nav .level_1 .level_2:has(.level_3) {
    width: max-content;
    max-width: var(--kzc-nav-mega-max);
    padding: 0;
    display: flex;
    align-items: stretch;
}

.kzc-nav .level_1 .level_2:has(.level_3) > li {
    flex: 1 1 var(--kzc-nav-col-w);
    min-width: var(--kzc-nav-col-w);
    padding: var(--kzc-space-6) var(--kzc-space-5);
    border-left: 1px solid var(--kzc-grey-100);
}

.kzc-nav .level_1 .level_2:has(.level_3) > li:first-child {
    border-left: none;
}

/* Spaltenkopf: der level_2-Eintrag wird zum Uppercase-Label mit schraegem
   blauen Regel-Strich davor. */
.kzc-nav .level_1 .level_2:has(.level_3) > li > a,
.kzc-nav .level_1 .level_2:has(.level_3) > li > strong {
    display: flex;
    align-items: center;
    gap: var(--kzc-space-2);
    margin-bottom: var(--kzc-space-3);
    padding: 0;
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-xbold);
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--kzc-petrol);
}

.kzc-nav .level_1 .level_2:has(.level_3) > li > a::before,
.kzc-nav .level_1 .level_2:has(.level_3) > li > strong::before {
    content: "";
    flex: none;
    width: 1.5rem;
    height: 3px;
    background-color: var(--kzc-blue);
    transform: skewX(var(--kzc-blade-skew));
}

.kzc-nav .level_1 .level_3 {
    display: flex;
    flex-direction: column;
    gap: 1px;
    margin: 0;
    padding: 0;
    list-style: none;
}

.kzc-nav .level_1 .level_3 > li > a,
.kzc-nav .level_1 .level_3 > li > strong {
    display: block;
    padding: var(--kzc-space-2) var(--kzc-space-3);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-medium);
    color: var(--kzc-grey-700);
    line-height: var(--kzc-lh-snug);
}

/* --- Sub-Link-Zustaende (fuer beide Auspraegungen) ---------------- */
.kzc-nav .level_1 .level_2 a:hover,
.kzc-nav .level_1 .level_2 a.trail,
.kzc-nav .level_1 .level_2 strong.active {
    background-color: var(--kzc-off-white);
    color: var(--kzc-petrol);
    text-decoration: none;
    border-radius: var(--kzc-radius-sm);
}

.kzc-nav .level_1 .level_2 a:focus-visible {
    outline: none;
    box-shadow: inset 0 0 0 2px var(--kzc-petrol);
    border-radius: var(--kzc-radius-sm);
}

@media (prefers-reduced-motion: reduce) {
    .kzc-nav .level_1 > li > a::after,
    .kzc-nav .level_1 > li > strong::after,
    .kzc-nav .level_1 .level_2 {
        transition: none;
    }
}

@media (max-width: 1023px) {
    .kzc-nav {
        display: none;
    }
}

/* === kzc-burger / mobile_menu – Burgermenü (codefog/contao-mobile_menu)
   Fremdes Frontend-Modul, kein RSCE. Position/Slide/Größe/Sichtbarkeit
   nach Breakpoint regelt das Plugin-JS selbst (matchMedia + inline
   Styles, kein eigenes CSS @media dafür), wir stylen nur die Optik
   obendrauf, ohne die Mechanik anzufassen. Breakpoint im Modul muss auf
   1024 stehen (siehe Chat 31.08.2026), sonst Lücke zur obigen
   .kzc-nav-Regel.

   .mobile_menu/.mobile_menu_trigger/.mobile_menu_overlay sind Klassen
   des Pakets (assets/css/mobile-menu.css), .level_1/active/trail/sibling
   kommen unveraendert von Contaos Navigationsmodul, gleiches
   Scoping-Prinzip wie bei .kzc-nav oben, nur diesmal auf die zweite
   (Drawer-)Instanz gemuenzt statt auf eine eigene Klasse. */

/* Geschlossen: raus aus Tab-Reihenfolge und Accessibility-Tree
   (Test-Pass 02.09.2026, Befund 1, letzter Punkt). Das Plugin schaltet
   beim Oeffnen/Schliessen nur transform um (assets/js/mobile-menu.jquery.js,
   showMenu()/hideMenu()), nie display/visibility – ohne diese Regel bleiben
   die 4 Nav-Links + 2 CTA-Buttons permanent erreichbar, auch wenn der
   Drawer optisch zu und ausserhalb des Viewports ist (WCAG 2.4.3/2.4.11).
   visibility:hidden vererbt sich auf alle Kinder und wird von Browsern wie
   von Screenreadern zuverlaessig respektiert. */
.mobile_menu:not(.active) {
    visibility: hidden;
}

.kzc-burger {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    gap: 5px;
    width: 40px;
    height: 40px;
    padding: 0;
    background: none;
    border: 0;
    cursor: pointer;
}

.kzc-burger__bar {
    display: block;
    width: 22px;
    height: 2px;
    background-color: var(--kzc-petrol);
    border-radius: var(--kzc-radius-pill);
}

.kzc-burger:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
    border-radius: var(--kzc-radius-sm);
}

/* Panel-Optik. Position/Breite/Slide-Transform kommen als Inline-Styles
   vom Plugin-JS, hier bewusst nicht angefasst. */
.mobile_menu .inner {
    background-color: var(--kzc-petrol);
    color: var(--kzc-white);
    padding: var(--kzc-space-6) var(--kzc-space-5);
}

/* Kreuz statt Text, gleiches CSS-Balken-Prinzip wie .kzc-burger (kein
   Icon-Sprite vorhanden). "Schließen" bleibt als Accessible Name über
   .invisible erhalten (sr-only), siehe Twig-Beispiel im Chat. */
.kzc-burger-close {
    position: relative;
    width: 40px;
    height: 40px;
    margin: 0 0 var(--kzc-space-6);
    margin-inline-start: auto;
    padding: 0;
    background: none;
    border: 0;
    cursor: pointer;
}

/* top/left 50% + translate zentriert den Balken zuerst, dann erst rotieren
   – ohne die Zentrierung landen absolut positionierte Elemente auf ihrer
   Flow-Position statt in der Mitte, war der eigentliche Bug (siehe Chat). */
.kzc-burger-close__bar {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 22px;
    height: 2px;
    background-color: var(--kzc-white);
    border-radius: var(--kzc-radius-pill);
}

/* Eigene Modifier statt :first-child/:last-child: der Button hat noch
   einen dritten Kind-Span (.invisible, Accessible Name), der wäre sonst
   das eigentliche :last-child gewesen, nicht der zweite Balken (siehe
   Chat). Positionsunabhängig, bricht nicht bei Markup-Umbau. */
.kzc-burger-close__bar--1 {
    transform: translate(-50%, -50%) rotate(45deg);
}

.kzc-burger-close__bar--2 {
    transform: translate(-50%, -50%) rotate(-45deg);
}

.kzc-burger-close:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
    border-radius: var(--kzc-radius-xs);
}

/* Drawer-Kopf: Marke links, Schliessen rechts, in einer Zeile. Aufbau
   per kzc-chrome.js (Header-Logo geklont + vorhandener Schliessen-Button
   verschoben), Vorbild design-ref KZC-Navigation-Megamenu.css .mm-top.
   CLAUDE.md hatte den Logo-Block im Drawer frueher ausgeschlossen, das
   ist am 04.09.2026 zurueckgenommen (Kundenwunsch). Ohne JS sitzt der
   Schliessen-Button wie bisher allein oben. */
.mobile_menu .kzc-drawer__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--kzc-space-4);
    margin-bottom: var(--kzc-space-6);
}

.mobile_menu .kzc-drawer__head .kzc-burger-close {
    flex: none;
    margin: 0;
}

/* Geklonte Footer-Logo-Instanz: "Felsen" (Platzhalter-Raute) in Weiss
   statt Blau, Wortmarke weiss und auf EINE Zeile (Vorbild design-ref
   .mm-top .brand .name). Die getrennten word-line-Spans stehen im Markup
   ohne Trennzeichen nebeneinander, der gap liefert den Wortabstand. */
.mobile_menu .kzc-drawer__head .kzc-logo__mark--placeholder {
    background-color: var(--kzc-white);
}

.mobile_menu .kzc-drawer__head .kzc-logo__word {
    flex-direction: row;
    gap: 0.25em;
    color: var(--kzc-white);
}

.mobile_menu .level_1 {
    display: flex;
    flex-direction: column;
    gap: var(--kzc-space-2);
    list-style: none;
    margin: 0 0 var(--kzc-space-6);
    padding: 0;
}

/* Zeilen-Optik aus design-ref KZC-Navigation-Megamenu.css (.mm-row):
   17px/700, 16px Innenabstand. Auf Petrol in Weiss statt dem
   Design-Petrol (Drawer bleibt dunkel, "Petrol-Variante"). */
.mobile_menu .level_1 a,
.mobile_menu .level_1 strong {
    display: block;
    padding-block: var(--kzc-space-4);
    font-size: var(--kzc-fs-body);
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-white);
    border-bottom: 1px solid rgba(255, 255, 255, 0.16);
}

.mobile_menu .level_1 a:hover {
    color: var(--kzc-blue);
    text-decoration: none;
}

.mobile_menu .level_1 strong.active,
.mobile_menu .level_1 a.trail {
    color: var(--kzc-blue);
}

/* Weisser Ring statt globalem Blau-Ring auf Petrol (Test-Pass 02.09.2026,
   Befund 5), gleiche Loesung wie .kzc-utility-bar__link:focus-visible. */
.mobile_menu .level_1 a:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
    border-radius: var(--kzc-radius-xs);
}

/* Unterseiten im Drawer als Akkordeon (Befund/Wunsch 03.09.2026, gute
   Mobil-Usability auch bei mehreren Unterebenen). Der Umschalt-Button
   (.kzc-nav-toggle) kommt aus kzc-chrome.js, NICHT aus dem Contao-
   Template: der bestehende Link ist ein echter Link auf die Elternseite,
   darum eigener Button statt den Link doppelt zu belegen (navigieren
   vs. aufklappen). li.submenu wird zur Flex-Zeile (Link waechst, Button
   fixe Groesse), level_2 bekommt flex-basis:100% und faellt damit in
   eine eigene Zeile darunter (flex-wrap), kein Grid-Layout noetig.

   Der aktive Nav-Punkt rendert als <strong> (kein <a>), darum die
   Flex-Regel unten auch auf > strong. Zum Plugin-Konflikt (codefog
   mobile_menu bringt eine eigene, kollidierende Submenu-Mechanik mit)
   siehe Kopfkommentar in kzc-chrome.js; das display:block weiter unten
   ueberstimmt das Plugin-CSS defensiv. */
.mobile_menu .level_1 > li.submenu {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    /* Trennlinie wandert vom <a> (unten border-bottom:none) auf das
       <li>, damit sie die volle Zeilenbreite inkl. Toggle-Button
       abdeckt statt nur unter dem schmaleren Link-Textbereich zu
       enden. Schliesst bei aufgeklapptem Zustand die ganze
       Akkordeon-Gruppe (Link + Unterliste) optisch ab. */
    border-bottom: 1px solid rgba(255, 255, 255, 0.16);
}

.mobile_menu .level_1 > li.submenu > a,
.mobile_menu .level_1 > li.submenu > strong {
    flex: 1 1 auto;
    border-bottom: none;
}

.kzc-nav-toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    width: 44px;
    height: 44px;
    margin-inline-start: var(--kzc-space-2);
    padding: 0;
    color: var(--kzc-white);
    background: none;
    border: none;
    border-radius: var(--kzc-radius-sm);
    cursor: pointer;
}

.kzc-nav-toggle:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
}

.kzc-nav-toggle .kzc-icon {
    transition: transform var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-nav-toggle[aria-expanded="true"] .kzc-icon {
    transform: rotate(90deg);
}

/* Eingeklappt: max-height/opacity animiert (kein Sticky-Vorfahre hier,
   der Drawer ist ein eigenes fixed-Overlay – im Gegensatz zum Header-
   Flackern oben ist eine Hoehenanimation innerhalb dieses isolierten
   Overlays unproblematisch, keine Reflow-Kaskade auf die restliche
   Seite). visibility verzoegert wie bei .kzc-utility-bar: Unterlinks
   sind erst nach der Animation aus der Tab-Reihenfolge, beim Aufklappen
   sofort wieder drin. */
.mobile_menu .level_1 > li.submenu > .level_2 {
    flex: 1 1 100%;
    list-style: none;
    margin: 0;
    padding-left: var(--kzc-space-4);
    /* display:block ueberstimmt das Plugin-CSS
       `li.submenu_hide > ul { display:none }` (codefog mobile_menu),
       das sonst unser max-height-Akkordeon aushebelt. kzc-chrome.js
       entfernt die Plugin-Klasse zusaetzlich. */
    display: block;
    max-height: 0;
    opacity: 0;
    visibility: hidden;
    overflow: hidden;
    transition: max-height var(--kzc-dur-base) var(--kzc-ease-out),
                opacity var(--kzc-dur-base) var(--kzc-ease-out),
                visibility 0s linear var(--kzc-dur-base);
}

.mobile_menu .level_1 > li.submenu.is-open > .level_2 {
    max-height: 400px;
    opacity: 1;
    visibility: visible;
    transition: max-height var(--kzc-dur-base) var(--kzc-ease-out),
                opacity var(--kzc-dur-base) var(--kzc-ease-out),
                visibility 0s linear 0s;
}

/* Unterpunkte aus design-ref .mm-row.sub: 15px/600, etwas gedaempft.
   Design nutzt Grau auf Weiss, hier gedaempftes Weiss auf Petrol. */
.mobile_menu .level_1 .level_2 a {
    padding-block: var(--kzc-space-3);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-semi);
    color: rgba(255, 255, 255, 0.78);
    border-bottom-color: rgba(255, 255, 255, 0.08);
}

@media (prefers-reduced-motion: reduce) {
    .kzc-nav-toggle .kzc-icon,
    .mobile_menu .level_1 > li.submenu > .level_2 {
        transition: none;
    }
}

/* CTA-Gruppe im Drawer: dieselbe RSCE-Instanz wie im Header (siehe
   rsce_kzc_cta_group), hier als gestapelte Spalte. Der Ghost-Button
   "Einsteiger" muss sichtbar bleiben, weil es im Drawer keinen eigenen
   Nav-Punkt dafür gibt (siehe CLAUDE.md Abschnitt "Navigation und Header"
   sowie Projekt-Memory burgermenu-cta-architecture). Die <1024px-Regel
   weiter oben blendet nur die Header-Instanz aus (direktes Kind von
   .kzc-header__inner), diese hier ist davon nicht betroffen. */
.mobile_menu .kzc-cta-group {
    flex-direction: column;
    align-items: stretch;
    gap: var(--kzc-space-4);
}

.mobile_menu .kzc-cta-group__button--ghost {
    display: inline-flex;
    background-color: transparent;
    color: var(--kzc-white);
    border-color: rgba(255, 255, 255, 0.42);
}

.mobile_menu .kzc-cta-group__button--ghost:hover {
    background-color: rgba(255, 255, 255, 0.1);
    border-color: var(--kzc-white);
    color: var(--kzc-white);
}

/* Weisser Ring statt globalem Blau-Ring auf Petrol (Test-Pass 02.09.2026,
   Befund 5), Radius passend zum Button (--kzc-radius-md, siehe
   .kzc-cta-group__button oben). */
.mobile_menu .kzc-cta-group__button:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
    border-radius: var(--kzc-radius-md);
}

/* === kzc_notice_bar – Aktuell-Bar (RSCE) ============================
   Schmales Hinweis-Band, EINE Meldung, per-Seite unter dem Hero
   platziert. Kein Schliessen-Button, keine Rotation (Entscheidung
   02.09.2026, siehe CLAUDE.md Abschnitt 8). Anatomie 1:1 nach
   design-ref KZC-Schritt5-Nav-Event.css .alert:
     __flag  festes "Aktuell"-Badge (Pille in Akzentfarbe) mit
             pulsierendem Punkt (__ring)
     __cat   Kategorie-Pille (Outline in Akzentfarbe), Text aus noticeType
     __text  die Meldung, nimmt den Rest der Zeile
     __link  optionaler Weiterlink mit Pfeil-Icon

   Akzentfarbe je Typ ueber die Modifier-Klasse als CSS-Variable
   --kzc-notice-accent. Kontrast: fuer die orange/gruene Fuellung weisser
   Badge-Text, fuer die blaue Fuellung dunkler Badge-Text (--kzc-blue mit
   Weiss auf ~2.5:1 wuerde WCAG AA reissen). Grund --kzc-bg-band (sehr
   dunkles Petrol statt Schwarz, CI-naeher; Signalfarben halten dort noch
   ~3:1), sonst weisser Text. Zweistufig wie .kzc-section (aussen
   Hintergrund fullwidth, innen --kzc-container-max). Diagonale hier
   bewusst nicht, der Hero direkt darueber hat schon eine Klinge. */

.kzc-notice-bar {
    --kzc-notice-accent: var(--kzc-blue);
    position: relative;
    background-color: var(--kzc-bg-band);
    color: var(--kzc-white);
    font-size: var(--kzc-fs-body-sm);
    /* 3px Weinrot-Oberkante (Klingen-Motiv), damit die Leiste auch auf
       Seiten OHNE Hero darüber einen roten Akzent hat. Idee aus
       KZC_Startseite_Wireframe_v4 (.ticker border-top). */
    border-top: 3px solid var(--kzc-wine);
}

/* Korrektur 03.09.2026: Steht die Leiste direkt hinter einem Hero (beide
   Layouts liefern schon eine eigene Weinrot-Kante: die Diagonal-Klinge bei
   --fullwidth, der Klingen-Block bei --split), verdoppelt die eigene
   Oberkante die Linie als durchgehenden geraden Streifen quer über die
   volle Breite. Aufgefallen erst nach der Verlagerung von Hero + Leiste
   aus der schmaleren Tagline-Spalte in den vollbreiten Hauptbereich
   (Screenshot 03.09.2026). Nur unterdruecken, wenn ein Hero direkt davor
   sitzt – der eingangs genannte Zweck (Akzent auf Seiten ohne Hero)
   bleibt unangetastet.

   margin-top -1px: erzwungene Ueberlappung gegen einen Sub-Pixel-Rundungs-
   spalt an der Naht (nur bei bestimmten Zoomstufen/Pixeldichten sichtbar,
   Screenshot 03.09.2026 – Hero-Box und Leiste sind zwei getrennte Elemente,
   die nur aneinanderstossen; ohne echte Ueberlappung rundet der Browser
   ihre Kanten je nach Zoom mal auf denselben, mal auf leicht
   unterschiedliche Werte, dann blitzt der weisse body-Hintergrund durch).

   Kurzzeitig (10.09.2026) auf fullwidth/split eingeschraenkt, weil das
   neue Layout --plain zwischenzeitlich einen hellen Streifen statt einer
   eigenen Weinrot-Kante hatte. Inzwischen liefert --plain dieselbe
   Keil+Kante-Mechanik wie --fullwidth (siehe kzc_hero-Abschnitt), deshalb
   wieder ungescoped fuer alle drei Layouts. */
.kzc-hero + .kzc-notice-bar {
    border-top: none;
    margin-top: -1px;
}


.kzc-notice-bar--hours,
.kzc-notice-bar--warning {
    --kzc-notice-accent: var(--kzc-warn);
}

.kzc-notice-bar--news {
    --kzc-notice-accent: var(--kzc-success);
}

.kzc-notice-bar--info {
    --kzc-notice-accent: var(--kzc-blue);
}

.kzc-notice-bar__inner {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--kzc-space-2) var(--kzc-space-4);
    min-height: 48px;
    max-width: var(--kzc-container-max);
    margin-inline: auto;
    padding-block: var(--kzc-space-2);
    padding-inline: var(--kzc-section-padding-x);
}

/* "Aktuell"-Badge: gefuellte Pille in Akzentfarbe */
.kzc-notice-bar__flag {
    flex: none;
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    padding: 6px 14px;
    border-radius: var(--kzc-radius-pill);
    background-color: var(--kzc-notice-accent);
    color: var(--kzc-white);
    font-size: var(--kzc-fs-eyebrow);
    font-weight: var(--kzc-fw-bold);
    letter-spacing: var(--kzc-tracking-wide);
    text-transform: uppercase;
}

/* Blaue Fuellung braucht dunklen Text fuer AA-Kontrast. */
.kzc-notice-bar--info .kzc-notice-bar__flag {
    color: var(--kzc-ink);
}

/* Pulsierender Punkt, Farbe = Badge-Textfarbe (currentColor). */
.kzc-notice-bar__ring {
    position: relative;
    width: 9px;
    height: 9px;
    border-radius: var(--kzc-radius-pill);
    background-color: currentColor;
    flex: none;
}

.kzc-notice-bar__ring::after {
    content: "";
    position: absolute;
    inset: 0;
    border-radius: var(--kzc-radius-pill);
    background-color: currentColor;
    animation: kzc-notice-ring 2s var(--kzc-ease-out) infinite;
}

@keyframes kzc-notice-ring {
    from { transform: scale(1); opacity: 0.7; }
    to   { transform: scale(2.6); opacity: 0; }
}

@media (prefers-reduced-motion: reduce) {
    .kzc-notice-bar__ring::after {
        animation: none;
    }
}

/* Kategorie-Pille: Outline in Akzentfarbe, heller Text */
.kzc-notice-bar__cat {
    flex: none;
    padding: 3px 11px;
    border: 1.5px solid var(--kzc-notice-accent);
    border-radius: var(--kzc-radius-pill);
    color: rgba(255, 255, 255, 0.85);
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-semi);
    letter-spacing: var(--kzc-tracking-wide);
    text-transform: uppercase;
}

.kzc-notice-bar__text {
    flex: 1 1 auto;
}

.kzc-notice-bar__link {
    flex: none;
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-1);
    white-space: nowrap;
    color: var(--kzc-white);
    font-weight: var(--kzc-fw-bold);
    text-decoration: none;
}

/* color explizit: sonst gewinnt das globale a:hover (Petrol) aus
   colors_and_type.css, unlesbar auf dem dunklen Grund (Befund 02.10.2026). */
.kzc-notice-bar__link:hover,
.kzc-notice-bar__link:focus-visible {
    color: var(--kzc-white);
    text-decoration: underline;
    text-underline-offset: 2px;
}

/* Weisser Ring auf dunklem Grund, wie .kzc-utility-bar__link. */
.kzc-notice-bar__link:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
    border-radius: var(--kzc-radius-xs);
}

.kzc-notice-bar__link-icon {
    width: 14px;
    height: 14px;
}

@media (min-width: 768px) {
    .kzc-notice-bar__inner {
        flex-wrap: nowrap;
    }
}

/* === kzc-footer – Basis-Hintergrund + Spalten-Grid ======================
   Grundton, damit die dunkel gestylten Footer-Bausteine (Adresse,
   Footer-Navs) nicht auf Weiss unsichtbar werden. Voller Ausbau (Partner-
   Leiste, Weinrot-Diagonale wie footer.site::before in der Referenz,
   Bottom-Bar) folgt separat.

   .kzc-footer__cols: eigenes, festes CSS-Grid statt Spaltenelementen
   (kein rocksolid-columns, CLAUDE.md "CSS-Struktur" – gleiches Prinzip wie
   .kzc-grid--cols-* bei kzc_cards, hier aber eigene Klasse statt des
   generischen Helpers aus kzc-grid.css, weil die Spalten NICHT gleich
   breit sind). Seitenverhaeltnis 1.4fr : 1fr : 1fr : 1fr 1:1 aus
   design-ref KZC-Schritt5-Nav-Event.css .foot-top (Adress-Spalte breiter
   als die drei Nav-Spalten), Breakpoints von Desktop-first (max-width) auf
   unser mobile-first-Schema (360/768/1024/1440) uebersetzt.

   Braucht einen manuell gesetzten Wrapper-Div um Adress-Element + die
   Footer-Nav-Module (`<div class="kzc-footer__cols">`), gleiches Muster
   wie `.kzc-header__inner` beim Header-Insert-Tag (siehe CLAUDE.md
   Abschnitt 8) – Contao fasst unabhaengige Content-Elemente/Module sonst
   nicht von selbst zu einer Grid-Zeile zusammen. */
#footer {
    position: relative;
    background-color: var(--kzc-petrol);
    color: rgba(255, 255, 255, 0.82);
    padding-block: var(--kzc-space-8);
}

/* Weinrot-Diagonale an der Oberkante, 1:1 aus footer.site::before in der
   Referenz (Klingen-Motiv, gleiche Idee wie Header/Hero/Aktuell-Leiste). */
#footer::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 8px;
    background-color: var(--kzc-wine);
    clip-path: polygon(0 0, 100% 0, 100% 40%, 0 100%);
}

/* Zentrierung: #footer ist bewusst full-bleed (Hintergrund), der Inhalt
   braucht die uebliche zweite Ebene auf Container-Breite, gleiches Muster
   wie .kzc-header__inner/.kzc-hero__inner/.kzc-section-inner. Lief vorher
   Rand-zu-Rand, weil diese Ebene hier noch fehlte (03.09.2026).

   Korrektur 03.09.2026 (zweite Runde): wieder EINE Zeile, 3 statt 4
   Spalten, Navs untereinander in einer Spalte statt nebeneinander
   gespreizt – weniger "ausladend" (Kundenwunsch, moderne Footer sind
   schlanker), behebt nebenbei auch einen eigenen Fehler: Grid platziert
   Kind-Elemente einzeln der Reihe nach, "stapelt" NICHT automatisch
   mehrere Kinder in eine Spalte (das hatte ich in der ersten Anleitung
   falsch behauptet) – deshalb jetzt zwingend ein gemeinsamer Wrapper-Div
   je Spalte (.kzc-footer__brand, .kzc-footer__links), damit jede Spalte
   wirklich nur EIN Grid-Kind ist. .kzc-footer__links stapelt seine drei
   Navs mit flex-column (kein Grid) und wird automatisch hoeher, wenn noch
   Links dazukommen (Absprache 03.09.2026: Listen sind noch nicht final) –
   keine Fixgroessen, keine Annahme ueber die Link-Anzahl. */
.kzc-footer__top {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--kzc-space-6);
    max-width: var(--kzc-container-max);
    margin-inline: auto;
    padding-inline: var(--kzc-section-padding-x);
}

@media (min-width: 768px) {
    .kzc-footer__top {
        grid-template-columns: 1fr 1fr;
        gap: var(--kzc-space-8);
    }
}

@media (min-width: 1024px) {
    .kzc-footer__top {
        /* 4 statt 3 Spalten (Kundenwunsch 03.09.2026, Platz passt): Marke+
           Kontakt | Oeffnungszeiten+Social | 2x Nav-Gruppe. Die zwei
           Nav-Spalten etwas schmaler, da je Spalte nur 1-2 Navs statt
           aller drei. */
        grid-template-columns: 1.2fr 1fr 0.9fr 0.9fr;
    }
}

.kzc-footer__brand {
    display: flex;
    flex-direction: column;
    gap: var(--kzc-space-5);
}

/* Navs (Contaos Standard-Modul "Individuelle Navigation", kein eigenes
   Modul-Template noetig, gleiches Prinzip wie .kzc-nav, CLAUDE.md
   Abschnitt 8, Korrektur 31.08.2026). Ueberschrift/Link-Farben 1:1 aus
   .foot-col in der Referenz, ABER Links in Weiss statt --kzc-blue
   (Kontrast-Korrektur, siehe Kommentar bei kzc_contact im Footer). */
.kzc-footer__links {
    display: flex;
    flex-direction: column;
    gap: var(--kzc-space-5);
}

.kzc-footer__links nav h3 {
    margin: 0 0 var(--kzc-space-2);
    font-size: var(--kzc-fs-eyebrow);
    font-weight: var(--kzc-fw-bold);
    letter-spacing: var(--kzc-tracking-wide);
    text-transform: uppercase;
    color: rgba(255, 255, 255, 0.55);
}

.kzc-footer__links nav .level_1 {
    list-style: none;
    margin: 0;
    padding: 0;
}

.kzc-footer__links nav .level_1 a {
    display: block;
    padding-block: var(--kzc-space-1);
    color: rgba(255, 255, 255, 0.85);
}

.kzc-footer__links nav .level_1 a:hover {
    color: var(--kzc-white);
    text-decoration: none;
}

.kzc-footer__links nav .level_1 a:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
    border-radius: var(--kzc-radius-xs);
}

/* Aktive Seite: Contao rendert sie als <strong class="active"> statt <a>.
   Weiss, halbfett, dazu die Klingen-Underline wie im Hauptmenue (.kzc-nav),
   hier in Weiss statt Blau: --kzc-blue auf Petrol nur 2.17:1 (Befund
   30.09.2026, aktive Seite im Footer kaum erkennbar). */
.kzc-footer__links nav .level_1 strong.active {
    position: relative;
    display: inline-block;
    margin-block: var(--kzc-space-1) var(--kzc-space-2);
    font-weight: var(--kzc-fw-semi);
    color: var(--kzc-white);
}

.kzc-footer__links nav .level_1 strong.active::after {
    content: "";
    position: absolute;
    left: -2px;
    right: -2px;
    bottom: -4px;
    height: 2px;
    background-color: var(--kzc-white);
    transform: skewX(var(--kzc-blade-skew));
}

/* Bottom-Bar (.kzc-footer-bar): Copyright-Text + Rechtliches-Nav
   (Datenschutz/Impressum), 1:1 aus .foot-bottom in der Referenz. Werte
   48px/24px/13px passen exakt auf --kzc-space-7/--kzc-space-5/
   --kzc-fs-caption, deshalb Tokens statt hartkodiert. Copyright-Text
   selbst kommt direkt aus dem HTML-Modul-Inhalt (kein Content-Element
   noetig, statischer Text), Nav wieder das Standard-Modul wie oben. */
.kzc-footer-bar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: var(--kzc-space-3);
    max-width: var(--kzc-container-max);
    margin-inline: auto;
    padding-inline: var(--kzc-section-padding-x);
    margin-top: var(--kzc-space-7);
    padding-top: var(--kzc-space-5);
    border-top: 1px solid rgba(255, 255, 255, 0.14);
    font-size: var(--kzc-fs-caption);
    color: rgba(255, 255, 255, 0.7);
}

.kzc-footer-bar nav .level_1 {
    display: flex;
    flex-wrap: wrap;
    gap: var(--kzc-space-5);
    list-style: none;
    margin: 0;
    padding: 0;
}

.kzc-footer-bar nav .level_1 a {
    color: rgba(255, 255, 255, 0.7);
}

.kzc-footer-bar nav .level_1 a:hover {
    color: var(--kzc-white);
    text-decoration: none;
}

.kzc-footer-bar nav .level_1 a:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
    border-radius: var(--kzc-radius-xs);
}

/* Footer-Kontakt (Adresse/Telefon/E-Mail): seit 30.09.2026 das Element
   "KZC Kontaktdaten", CSS im Abschnitt kzc_contact (Kontext
   .kzc-footer__brand). Kontrast-Befund (--kzc-blue auf Petrol 2.17:1,
   deshalb Links weiss) steht dort. */

/* === kzc_footer_hours – Oeffnungszeiten + Social (RSCE) ===
   03.09.2026 aus kzc_footer_address herausgeloest, damit
   Oeffnungszeiten/Social eine eigene Grid-Spalte in .kzc-footer__top
   bekommen (kzc_footer_address haette als ein Element nicht in zwei
   Spalten aufgeteilt werden koennen, siehe rsce_kzc_footer_hours_config.php).
   Aufteilung hat sich bewaehrt, kzc_footer_address ist seither wieder
   reines Kontaktelement (Adresse/Telefon/E-Mail). */
.kzc-footer-hours {
    color: rgba(255, 255, 255, 0.82);
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-normal);
}

.kzc-footer-hours__heading {
    margin: 0 0 var(--kzc-space-2);
    font-size: var(--kzc-fs-eyebrow);
    font-weight: var(--kzc-fw-bold);
    letter-spacing: var(--kzc-tracking-wide);
    text-transform: uppercase;
    color: rgba(255, 255, 255, 0.55);
}

.kzc-footer-hours__row {
    display: flex;
    justify-content: space-between;
    max-width: 22rem;
    gap: var(--kzc-space-3);
    margin: 0;
}

.kzc-footer-hours__social {
    margin-top: var(--kzc-space-5);
}

.kzc-footer-hours__social-hint {
    margin: 0 0 var(--kzc-space-3);
    font-size: var(--kzc-fs-caption);
    color: rgba(255, 255, 255, 0.7);
}

.kzc-footer-hours__social-links {
    display: flex;
    gap: var(--kzc-space-4);
}

/* Groesser + bunter (Kundenwunsch 03.09.2026, "wie auf der alten Seite"):
   40px-Kachel. Instagram/Facebook nutzen jetzt echte, selbst gehostete
   Marken-Bilder (files/kletterzentrum/theme/icons/, vom Kunden geliefert,
   eigene Rundung/Farbe schon im Bild) statt Farb-Icon – deshalb hier nur
   noch Groesse/Rahmen/Rundung als gemeinsamer Rahmen, kein
   Hintergrund/keine Farbe mehr auf der Basisklasse. YouTube hat noch kein
   Marken-Bild, faellt per Twig-Fallback auf die farbige Icon-Kachel
   zurueck (--youtube unten) – Weiss auf Markenfarbe 4.0:1, fuer ein
   Icon-Glyph ueber der 3:1-Schwelle fuer UI-Komponenten. */
.kzc-footer-hours__social-link {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border-radius: var(--kzc-radius-md);
    overflow: hidden;
    transition: transform var(--kzc-dur-fast) var(--kzc-ease-out);
}

.kzc-footer-hours__social-link img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.kzc-footer-hours__social-link:hover {
    transform: translateY(-1px);
}

.kzc-footer-hours__social-link:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
}

/* :hover mit eigener Farbe, sonst faerbt das globale a:hover (Petrol) das
   Symbol auf dem roten Grund um (Befund 02.10.2026). */
.kzc-footer-hours__social-link--youtube,
.kzc-footer-hours__social-link--youtube:hover {
    color: var(--kzc-white);
    background-color: #FF0000;
}

/* === kzc_checklist_cards – Karten mit Checkliste (RSCE) ================
   Angelegt 04.09.2026. Karten mit Eyebrow, Titel, Text, variabler
   Checkliste (▸, siehe CLAUDE.md-Konvention fuer Aufzaehlungen) und
   einem CTA-Link. Erster Einsatz: Absichts-Bloecke "Dein Einstieg"
   (design-ref/KZC-Schritt5-Nav-Event.html, Abschnitt M03; ueberarbeitet
   in KZC_Konzept-Update_v4.html zu "3 Absichts-Bloecke": Einsteiger /
   Buchen / Training). Bewusst generisch gehalten, nicht auf den
   Einstiegs-Anlass beschraenkt.

   KEIN eigener Zentrierungs-Wrapper, KEIN eigenes background-Feld
   (Befund/Entscheidung 04.09.2026, Korrektur): erste Fassung hatte einen
   __inner mit --kzc-container-max/padding-inline plus ein eigenes
   background-Feld, wie bei kzc_hero/kzc_notice_bar. Die sind aber
   eigenstaendige Vollbild-Elemente OHNE umgebende Sektion. Dieses
   Element ist wie kzc_cards fuer den Einsatz zwischen
   kzc_section_start/kzc_section_stop gedacht, die .kzc-section/
   .kzc-section-inner (kzc-grid.css) Breite UND Hintergrund schon
   liefern – ein zweiter, eigener Zentrierungs-Layer ergab doppelten
   Seitenabstand/Einzug, ein zweites Hintergrund-Feld waere redundant.
   Grid-Breakpoints 768/1024 wie kzc-grid.css (mobile-first), NICHT die
   alten 640/960 aus kzc_cards uebernommen (dortiger Rework-TODO).

   Je Karte waehlbares Farbthema (accent: neutral/blau/petrol/weinrot/
   gruen/orange) faerbt Akzentkante links, Karten-Eyebrow und Link.
   Eck-Dreieck nur bei aktivem Element-Feld "diagonal". Beides reines
   CSS ueber ::before/::after am .kzc-checklist-cards__card, kein
   zusaetzliches Markup (Vorbild design-ref .path .edge/.corner, dort
   noch als leere <span>s).

   Eyebrows nutzen die bestehende semantische .kzc-eyebrow-Klasse aus
   colors_and_type.css (CLAUDE.md: bestehende semantische Klassen
   wiederverwenden, kein BEM-Duplikat dafuer). */

.kzc-checklist-cards {
    padding-block: var(--kzc-space-8);
}

.kzc-checklist-cards__head {
    max-width: var(--kzc-w-prose);
    margin-bottom: var(--kzc-space-6);
}

.kzc-checklist-cards__headline {
    font-size: var(--kzc-fs-h2);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-petrol);
    margin: var(--kzc-space-2) 0 0;
}

.kzc-checklist-cards__intro {
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-fg-mute);
    margin: var(--kzc-space-4) 0 0;
}

.kzc-checklist-cards__grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--kzc-space-5);
}

@media (min-width: 768px) {
    .kzc-checklist-cards__grid--cols-2,
    .kzc-checklist-cards__grid--cols-3,
    .kzc-checklist-cards__grid--cols-4 {
        grid-template-columns: repeat(2, 1fr);
    }
}

/* Eine einzelne Karte nimmt die ganze Breite (06.10.2026, "Auf einen
   Blick" in einer schmalen Spalte auf Erleben & Buchen), sonst stuende
   sie bei 2 Spalten nur halb breit. */
.kzc-checklist-cards__card:only-child {
    grid-column: 1 / -1;
}

@media (min-width: 1024px) {
    .kzc-checklist-cards__grid--cols-3 {
        grid-template-columns: repeat(3, 1fr);
    }

    .kzc-checklist-cards__grid--cols-4 {
        grid-template-columns: repeat(4, 1fr);
    }
}

.kzc-checklist-cards__card {
    position: relative;
    display: flex;
    flex-direction: column;
    padding: var(--kzc-space-6) var(--kzc-space-5);
    background-color: var(--kzc-bg);
    border: 1px solid var(--kzc-border);
    border-radius: var(--kzc-radius-md);
    box-shadow: var(--kzc-shadow-1);
    overflow: hidden;
    transition: transform var(--kzc-dur-fast) var(--kzc-ease-out),
                box-shadow var(--kzc-dur-fast) var(--kzc-ease-out);
}

.kzc-checklist-cards__card:hover {
    transform: translateY(-2px);
    box-shadow: var(--kzc-shadow-2);
}

/* Akzentkante links in der Themenfarbe. "neutral" bleibt ohne (keine
   Regel unten greift), reiner Border-Rahmen wie eine normale Karte. */
.kzc-checklist-cards__card::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 4px;
}

.kzc-checklist-cards__card--blau::before    { background-color: var(--kzc-blue); }
.kzc-checklist-cards__card--petrol::before  { background-color: var(--kzc-petrol); }
.kzc-checklist-cards__card--weinrot::before { background-color: var(--kzc-wine); }
.kzc-checklist-cards__card--gruen::before   { background-color: var(--kzc-success); }
.kzc-checklist-cards__card--orange::before  { background-color: var(--kzc-warn); }

/* Eck-Dreieck, nur wenn das Element-Feld "diagonal" aktiv ist (Diagonalen-
   Motiv, CLAUDE.md: kleiner dekorativer Akzent ist erlaubt, hier keine
   Typografie/kein Bedienelement gekippt, nur eine Flaeche). */
.kzc-checklist-cards--diagonal .kzc-checklist-cards__card::after {
    content: "";
    position: absolute;
    right: 0;
    top: 0;
    width: 56px;
    height: 56px;
    clip-path: polygon(100% 0, 0 0, 100% 100%);
    opacity: 0.1;
}

.kzc-checklist-cards--diagonal .kzc-checklist-cards__card--blau::after    { background-color: var(--kzc-blue); }
.kzc-checklist-cards--diagonal .kzc-checklist-cards__card--petrol::after  { background-color: var(--kzc-petrol); }
.kzc-checklist-cards--diagonal .kzc-checklist-cards__card--weinrot::after { background-color: var(--kzc-wine); }
.kzc-checklist-cards--diagonal .kzc-checklist-cards__card--gruen::after   { background-color: var(--kzc-success); }
.kzc-checklist-cards--diagonal .kzc-checklist-cards__card--orange::after  { background-color: var(--kzc-warn); }

.kzc-checklist-cards__card-eyebrow {
    margin: 0 0 var(--kzc-space-2);
}

.kzc-checklist-cards__card--blau    .kzc-checklist-cards__card-eyebrow { color: var(--kzc-blue); }
.kzc-checklist-cards__card--petrol  .kzc-checklist-cards__card-eyebrow { color: var(--kzc-petrol); }
.kzc-checklist-cards__card--weinrot .kzc-checklist-cards__card-eyebrow { color: var(--kzc-wine); }
.kzc-checklist-cards__card--gruen   .kzc-checklist-cards__card-eyebrow { color: var(--kzc-success); }
.kzc-checklist-cards__card--orange  .kzc-checklist-cards__card-eyebrow { color: var(--kzc-warn); }

.kzc-checklist-cards__title {
    font-size: var(--kzc-fs-h3);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-petrol);
    margin: 0 0 var(--kzc-space-2);
}

.kzc-checklist-cards__text {
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-fg);
    margin: 0 0 var(--kzc-space-4);
}

.kzc-checklist-cards__list {
    list-style: none;
    margin: 0 0 var(--kzc-space-5);
    padding: 0;
}

.kzc-checklist-cards__list-item {
    position: relative;
    padding: var(--kzc-space-2) 0 var(--kzc-space-2) var(--kzc-space-5);
    font-size: var(--kzc-fs-body-sm);
    color: var(--kzc-fg);
    border-top: 1px solid var(--kzc-border);
}

.kzc-checklist-cards__list-item:first-child {
    border-top: none;
}

/* Listenpunkt = kleine Weinrot-Klinge wie bei kzc_list (Referenz
   design-ref/KZC-Grundkurs.css ".fact li::before"), seit 29.09.2026
   statt Petrol-▸ in ALLEN Checklisten-Karten: ein Listenpunkt fuer die
   ganze Website. Vertikal auf die erste Textzeile ausgerichtet. */
.kzc-checklist-cards__list-item::before {
    content: "";
    position: absolute;
    left: 0;
    top: calc(var(--kzc-space-2) + 0.6em);
    width: 12px;
    height: 4px;
    background-color: var(--kzc-wine);
    transform: skewX(var(--kzc-blade-skew));
}

.kzc-checklist-cards__link {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    margin-top: auto;
    font-weight: var(--kzc-fw-semi);
    text-decoration: none;
    color: var(--kzc-link);
}

.kzc-checklist-cards__card--blau    .kzc-checklist-cards__link { color: var(--kzc-blue); }
.kzc-checklist-cards__card--petrol  .kzc-checklist-cards__link { color: var(--kzc-petrol); }
.kzc-checklist-cards__card--weinrot .kzc-checklist-cards__link { color: var(--kzc-wine); }
.kzc-checklist-cards__card--gruen   .kzc-checklist-cards__link { color: var(--kzc-success); }
.kzc-checklist-cards__card--orange  .kzc-checklist-cards__link { color: var(--kzc-warn); }

.kzc-checklist-cards__link:hover,
.kzc-checklist-cards__link:focus-visible {
    text-decoration: underline;
}

.kzc-checklist-cards__link-icon {
    transition: transform var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-checklist-cards__link:hover .kzc-checklist-cards__link-icon {
    transform: translateX(3px);
}

@media (prefers-reduced-motion: reduce) {
    .kzc-checklist-cards__card,
    .kzc-checklist-cards__link-icon {
        transition: none;
    }
}


/* === kzc_split_diagonal – Gegenueberstellung (RSCE) ===================
   Angelegt 08.09.2026 (Branch feature/ce-split-diagonal). Zweigeteilte
   Vollbild-Flaeche, diagonale Weinrot-Klinge als Naht. Erster Anlass:
   Startseiten-Sektion "Unterschied Klettern und Bouldern" (Seil ~2/3 zu
   Boulder ~1/3), Vorbild design-ref/KZC-Kundenansicht-Render.html M05
   (.m05 / seil-bg / wine-seam / bould-bg) und KZC_Startseite_Wireframe_v4
   (.kvb). Generisch: je Seite Eyebrow, Titel, Text, Stichpunkte, Bild,
   Farbthema, Link.

   VOLLBILD-Element wie kzc_hero: KEIN kzc_section_start/stop, traegt
   Breite + Hintergrund selbst (CLAUDE.md "Sektions-Wrapper vs.
   Vollbild-Elemente").

   Aufbau ab 768px: CSS-Grid mit zwei Spalten aus dem Ratio-Modifier
   (--kzc-split-left). Die Naht ist diagonal: die linke Seite zieht ihre
   untere rechte Ecke per clip-path um --kzc-split-cut nach innen, die
   rechte Seite ist um denselben Betrag verbreitert + nach links
   verschoben und spiegelbildlich geclippt, sodass beide Kanten exakt
   auf der Linie (--kzc-split-left, 0) -> (--kzc-split-left - cut, 100%)
   liegen. __seam ist ein schmales Weinrot-Parallelogramm ueber genau
   dieser Linie (nur Kante, nie flaechig - CLAUDE.md Farbeinsatz). Winkel
   ergibt sich aus cut ueber Sektionshoehe, bewusst NICHT im Backend
   einstellbar (CI-Diagonale). --kzc-split-cut/--kzc-split-seam ggf. im
   Browser feinjustieren.

   Unter 768px: eine Spalte, Seiten stapeln, kein clip-path; __seam wird
   zur 3px-Weinrot-Querlinie. Stapelreihenfolge ueber order (Feld
   mobileOrder -> Modifier --mobile-reversed). Ab 768px sind die Seiten
   per grid-column fest links/rechts gepinnt, order spielt dort keine
   Rolle mehr.

   Farbthema je Seite: petrol/ink dunkel (+ .kzc-on-dark aus
   colors_and_type fuer Textfarben), offwhite/weiss hell. Bild-Seiten
   bekommen ein dunkles Overlay + Weisstext (wie kzc_hero--fullwidth).
   Eyebrow bleibt auf flachem Petrol/Ink blau (wie .kzc-hero--split),
   nur auf Bild-Seiten weiss. */

.kzc-split-diagonal {
    --kzc-split-cut: var(--kzc-diagonal-px);   /* 56px horizontaler Versatz der Diagonale */
    --kzc-split-seam: 3px;                     /* Strichstaerke der Klinge */
    --kzc-split-left: 50%;                     /* vom Ratio-Modifier ueberschrieben */
    /* Aussenabstand des Textes: bis zur Seiten-Containerkante (1320) heran,
       darunter nie enger als der normale Sektions-Rand. */
    --kzc-split-edge: max(var(--kzc-section-padding-x), calc((100vw - var(--kzc-container-max)) / 2));
    position: relative;
    display: grid;
    grid-template-columns: 1fr;
    overflow: hidden;
    /* Full-Bleed: der Hintergrund (beide Seiten) laeuft immer ueber die
       ganze Fensterbreite, auch wenn das Element in einem schmaleren
       Container steckt (z. B. innerhalb kzc_section_start/stop oder
       Contaos .inside). Steht es ohnehin vollbreit, ist der Wert ~0.
       Der Text bleibt ueber --kzc-split-edge im Inhaltsbereich. */
    width: auto;
    margin-inline: calc(50% - 50vw);
}

.kzc-split-diagonal *,
.kzc-split-diagonal *::before,
.kzc-split-diagonal *::after {
    box-sizing: border-box;
}

/* Ratio-Modifier: Breite der linken Spalte (nur ab 768px wirksam) */
.kzc-split-diagonal--ratio-50-50 { --kzc-split-left: 50%; }
.kzc-split-diagonal--ratio-60-40 { --kzc-split-left: 60%; }
.kzc-split-diagonal--ratio-67-33 { --kzc-split-left: 66.6667%; }
.kzc-split-diagonal--ratio-75-25 { --kzc-split-left: 75%; }
.kzc-split-diagonal--ratio-40-60 { --kzc-split-left: 40%; }
.kzc-split-diagonal--ratio-33-67 { --kzc-split-left: 33.3333%; }
.kzc-split-diagonal--ratio-25-75 { --kzc-split-left: 25%; }

/* --- Seite --- */
.kzc-split-diagonal__side {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    justify-content: center;
    overflow: hidden;
    padding-block: clamp(2.75rem, 7vw, 5.5rem);
    padding-inline: var(--kzc-section-padding-x);
}

.kzc-split-diagonal__side--left  { order: 1; }
.kzc-split-diagonal__seam        { order: 2; }
.kzc-split-diagonal__side--right { order: 3; }

.kzc-split-diagonal--mobile-reversed .kzc-split-diagonal__side--right { order: 1; }
.kzc-split-diagonal--mobile-reversed .kzc-split-diagonal__side--left  { order: 3; }

/* Farbthemen */
.kzc-split-diagonal__side--petrol   { background-color: var(--kzc-petrol); color: var(--kzc-white); }
.kzc-split-diagonal__side--ink      { background-color: var(--kzc-ink); color: var(--kzc-white); }
.kzc-split-diagonal__side--offwhite { background-color: var(--kzc-off-white); color: var(--kzc-fg); }
.kzc-split-diagonal__side--weiss    { background-color: var(--kzc-white); color: var(--kzc-fg); }

/* Bild-Seite: Bild deckt die Flaeche, dunkles Overlay darueber, Weisstext
   (.kzc-on-dark setzt der Twig dann mit). */
.kzc-split-diagonal__side--has-image { background-color: var(--kzc-petrol); }

.kzc-split-diagonal__side > picture { display: contents; }

.kzc-split-diagonal__bg {
    position: absolute;
    inset: 0;
    z-index: -2;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.kzc-split-diagonal__side--has-image::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background: linear-gradient(180deg, rgba(18, 42, 53, 0.55), rgba(18, 42, 53, 0.80));
}

/* --- Inhalt --- */
.kzc-split-diagonal__body {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    width: 100%;
    max-width: 34rem;
}

.kzc-split-diagonal__eyebrow {
    margin: 0 0 var(--kzc-space-3);
}

.kzc-split-diagonal__side--has-image .kzc-split-diagonal__eyebrow {
    color: var(--kzc-white);
}

.kzc-split-diagonal__title {
    font-size: var(--kzc-fs-h2);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
    margin: 0 0 var(--kzc-space-4);
}

.kzc-split-diagonal__text {
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-normal);
    margin: 0 0 var(--kzc-space-5);
}

.kzc-split-diagonal__side--offwhite .kzc-split-diagonal__text,
.kzc-split-diagonal__side--weiss .kzc-split-diagonal__text {
    color: var(--kzc-grey-700);
}

.kzc-split-diagonal__points {
    list-style: none;
    margin: 0 0 var(--kzc-space-6);
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: var(--kzc-space-2);
}

/* Stichpunkt-Pill, Optik nach design-ref KZC-Schritt5-Nav-Event.css
   ".m05 .chip": subtile Fuellung + 1px Rand, radius md, KEINE Versalien.
   EIN Chip-Look fuer alle Pills (einzeilig wie "immer zu zweit" und
   zweizeilig mit --stat), kein dunkler Extra-Kasten fuer die Kennzahl
   (Feedback 08.09.2026).
     - Einzeilig (kein "|"): schlichte Tag-Pill.
     - "Wert | Bezeichnung" (--stat): erste Zeile gross + kraeftig, zweite
       Zeile klein.
   Abstufung Wert/Bezeichnung: auf hellen Seiten ueber Farbe (Petrol vs.
   Anthrazit) UND Groesse/Gewicht, auf dunklen Seiten nur ueber
   Groesse/Gewicht (beide Weiss) - Blau als Kennzahl (Referenz) reisst auf
   dem hellen Transluzent-Chip den WCAG-AA-Kontrast (~1.8:1) und ein
   dunkler Chip als Ausweg gefiel optisch nicht. */
.kzc-split-diagonal__point {
    display: inline-flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 1px;
    padding: var(--kzc-space-3) var(--kzc-space-4);
    border-radius: var(--kzc-radius-md);
    border: 1px solid var(--kzc-border);
    background-color: var(--kzc-blue-tint);
    font-size: var(--kzc-fs-caption);
}

.kzc-on-dark .kzc-split-diagonal__point {
    border-color: rgba(255, 255, 255, 0.16);
    background-color: rgba(255, 255, 255, 0.08);
}

.kzc-split-diagonal__point-value {
    font-weight: var(--kzc-fw-semi);
    line-height: 1.3;
    color: var(--kzc-petrol);
}

.kzc-on-dark .kzc-split-diagonal__point-value {
    color: var(--kzc-white);
}

/* --stat: erste Zeile als grosse Kennzahl */
.kzc-split-diagonal__point--stat .kzc-split-diagonal__point-value {
    font-size: var(--kzc-fs-body);
    font-weight: var(--kzc-fw-xbold);
}

.kzc-split-diagonal__point-label {
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-medium);
    line-height: 1.3;
    color: var(--kzc-grey-700);
}

.kzc-on-dark .kzc-split-diagonal__point-label {
    color: rgba(255, 255, 255, 0.9);
}

.kzc-split-diagonal__link {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    margin-top: var(--kzc-space-3);
    font-weight: var(--kzc-fw-semi);
    text-decoration: none;
    color: var(--kzc-link);
}

.kzc-on-dark .kzc-split-diagonal__link {
    color: var(--kzc-blue);
}

.kzc-split-diagonal__link:hover,
.kzc-split-diagonal__link:focus-visible {
    text-decoration: underline;
}

/* Bild-Seite: als schlichter Textlink verschwimmt der Link mit dem Foto.
   Deshalb hier ein voll deckender Button (weisse Flaeche, Petrol-Text) -
   eindeutig ein Bedienelement, kein Bildbestandteil. Kein Weinrot (nur
   "Jetzt buchen"), kein backdrop-filter (Projekt-Entscheidung 03.09.2026,
   siehe kzc-header). Deutlicher Abstand nach oben zum Textblock. */
.kzc-split-diagonal__side--has-image .kzc-split-diagonal__link {
    align-self: flex-start;
    margin-top: var(--kzc-space-6);
    padding: var(--kzc-space-3) var(--kzc-space-5);
    border-radius: var(--kzc-radius-md);
    background-color: var(--kzc-white);
    color: var(--kzc-petrol);
    font-weight: var(--kzc-fw-bold);
    box-shadow: var(--kzc-shadow-2);
}

.kzc-split-diagonal__side--has-image .kzc-split-diagonal__link:hover,
.kzc-split-diagonal__side--has-image .kzc-split-diagonal__link:focus-visible {
    background-color: var(--kzc-off-white);
    color: var(--kzc-petrol);
    text-decoration: none;
}

.kzc-split-diagonal__side--has-image .kzc-split-diagonal__link:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
}

.kzc-split-diagonal__link-icon {
    transition: transform var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-split-diagonal__link:hover .kzc-split-diagonal__link-icon {
    transform: translateX(3px);
}

/* --- Klinge, mobil: 3px Weinrot-Querlinie zwischen den Seiten --- */
.kzc-split-diagonal__seam {
    height: 3px;
    background-color: var(--kzc-wine);
}

/* --- ab 768px: zwei Spalten, diagonale Naht --- */
@media (min-width: 768px) {
    .kzc-split-diagonal {
        grid-template-columns: var(--kzc-split-left) 1fr;
        min-height: 460px;
    }

    .kzc-split-diagonal__side--left  { grid-column: 1; }
    .kzc-split-diagonal__side--right { grid-column: 2; }

    .kzc-split-diagonal__side--left {
        clip-path: polygon(0 0, 100% 0, calc(100% - var(--kzc-split-cut)) 100%, 0 100%);
        padding-inline-start: var(--kzc-split-edge);
        padding-inline-end: calc(var(--kzc-split-cut) + var(--kzc-space-6));
    }

    .kzc-split-diagonal__side--right {
        width: calc(100% + var(--kzc-split-cut));
        margin-inline-start: calc(-1 * var(--kzc-split-cut));
        clip-path: polygon(var(--kzc-split-cut) 0, 100% 0, 100% 100%, 0 100%);
        padding-inline-start: calc(var(--kzc-split-cut) + var(--kzc-space-6));
        padding-inline-end: var(--kzc-split-edge);
    }

    /* Klinge: schmales Weinrot-Parallelogramm ueber der Naht
       (--kzc-split-left, 0) -> (--kzc-split-left - cut, 100%). */
    .kzc-split-diagonal__seam {
        position: absolute;
        top: 0;
        bottom: 0;
        left: var(--kzc-split-left);
        z-index: 4;
        height: auto;
        width: calc(var(--kzc-split-cut) + 2px);
        margin-left: calc(-1 * var(--kzc-split-cut) - 1px);
        pointer-events: none;
        clip-path: polygon(
            100% 0,
            calc(100% - var(--kzc-split-seam)) 0,
            0 100%,
            var(--kzc-split-seam) 100%
        );
    }
}

@media (prefers-reduced-motion: reduce) {
    .kzc-split-diagonal__link-icon {
        transition: none;
    }
}

/* === kzc_stats – Zahlen-Band (RSCE) ================================
   Vollbild-Element wie kzc_notice_bar: dunkles Full-Bleed-Band mit
   2-6 Kennzahlen, Zahl + Einheit (Einheit in Blau), Uppercase-Label.
   Kein Sektions-Wrapper.

   Vorbild: design-ref/preview/comp-stats.html,
   KZC-Kundenansicht-Render.html M04, KZC-Schritt5-Nav-Event.css .stats.
   Grund bewusst --kzc-bg-band (nicht --kzc-ink/--kzc-petrol wie in der
   Referenz), liest sich als Fortsatz von Hero-Keil / Aktuell-Leiste.

   Trenner zwischen den Zahlen ab 1024px: kurze, leicht schraege 1px-Linie
   in der Spaltenluecke, rechts an jedem Item ausser dem letzten je Zeile
   (Zeilenlaenge = Spaltenzahl, daher die nth-child-Kette). Winkel flach
   ueber das Diagonalen-Motiv (--kzc-diagonal, 8deg), wie in der Referenz
   KZC-Schritt5-Nav-Event.css .stat::after. Der -26deg-Klingenwinkel
   (--kzc-blade-skew) ist fuer eine hohe, duenne Vertikale zu steil, die
   Linie kippt dann optisch weg (Feedback 09.09.2026); blade-skew bleibt
   den kurzen, breiten Akzentstrichen vorbehalten (Nav-Underline etc.).
   Feste Hoehe, vertikal auf den Zahl-plus-Label-Block zentriert.

   Bewusst KEIN blauer Diagonal-Eckakzent: den zeigt nur die
   comp-stats.html-Vorschaukarte, nicht die massgebliche Referenz
   KZC-Schritt5-Nav-Event.css (.stats). Neben den Zahlen wirkte er als
   Bildrauschen (Screenshot 09.09.2026).
=================================================================== */
.kzc-stats {
    position: relative;
    background-color: var(--kzc-bg-band);
    color: var(--kzc-white);
    overflow: hidden;
    /* Full-Bleed-Guard wie kzc_split_diagonal: Grund immer ueber die
       ganze Fensterbreite, auch wenn das Element doch mal in einem
       schmaleren Container steckt. Steht es vollbreit, ist der Wert ~0.
       (Scrollbar-Schutz html { overflow-x: clip } liegt in
       colors_and_type.css.) */
    margin-inline: calc(50% - 50vw);
}

.kzc-stats__inner {
    max-width: var(--kzc-container-max);
    margin-inline: auto;
    padding-block: var(--kzc-space-6);
    padding-inline: var(--kzc-section-padding-x);
}

.kzc-stats__head {
    margin-bottom: var(--kzc-space-5);
}

.kzc-stats__head .kzc-eyebrow {
    color: var(--kzc-blue);
}

.kzc-stats__headline {
    margin: 0;
    color: var(--kzc-white);
}

.kzc-stats__grid {
    margin: 0;
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: var(--kzc-space-6) var(--kzc-space-5);
}

.kzc-stats__item {
    position: relative;
    display: flex;
    flex-direction: column-reverse;
    align-items: flex-start;
}

.kzc-stats__label {
    margin: var(--kzc-space-3) 0 0;
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-semi);
    letter-spacing: var(--kzc-tracking-wide);
    text-transform: uppercase;
    color: rgba(255, 255, 255, 0.72);
}

.kzc-stats__value {
    margin: 0;
    font-weight: var(--kzc-fw-xbold);
    font-size: clamp(2rem, 1.35rem + 2.6vw, 2.875rem);
    line-height: 1;
    letter-spacing: -0.02em;
    font-variant-numeric: tabular-nums;
    font-feature-settings: "tnum";
}

.kzc-stats__unit {
    margin-inline-start: 0.15em;
    font-size: 0.5em;
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-blue);
}

/* --- ab 1024px: N Spalten aus der Anzahl (6 -> 3x2) ---------------- */
@media (min-width: 1024px) {
    .kzc-stats__inner {
        padding-block: var(--kzc-space-7);
    }

    .kzc-stats__grid {
        column-gap: var(--kzc-space-7);
        row-gap: var(--kzc-space-7);
    }

    .kzc-stats--items-2 .kzc-stats__grid { grid-template-columns: repeat(2, 1fr); }
    .kzc-stats--items-3 .kzc-stats__grid { grid-template-columns: repeat(3, 1fr); }
    .kzc-stats--items-4 .kzc-stats__grid { grid-template-columns: repeat(4, 1fr); }
    .kzc-stats--items-5 .kzc-stats__grid { grid-template-columns: repeat(5, 1fr); }
    .kzc-stats--items-6 .kzc-stats__grid { grid-template-columns: repeat(3, 1fr); }

    /* leicht schraeger Trenner rechts am Item, in der Spaltenluecke.
       Ragt oben ueber die Zahl und unten unter das Label hinaus (wie in
       der Referenz .stat::after, dort ueber die Zellen-Innenabstaende) –
       die negative Inset laeuft in das padding-block / row-gap des Bands,
       nicht in den Nachbar. */
    .kzc-stats__item::after {
        content: "";
        position: absolute;
        right: calc(var(--kzc-space-7) / -2);
        top: -1.25rem;
        bottom: -1.25rem;
        width: 1px;
        background-color: rgba(255, 255, 255, 0.18);
        transform: skewX(calc(-1 * var(--kzc-diagonal)));
    }

    /* jeweils letztes Item einer Zeile ohne Trenner (Zeilenlaenge = Spalten) */
    .kzc-stats--items-2 .kzc-stats__item:nth-child(2n)::after,
    .kzc-stats--items-3 .kzc-stats__item:nth-child(3n)::after,
    .kzc-stats--items-4 .kzc-stats__item:nth-child(4n)::after,
    .kzc-stats--items-5 .kzc-stats__item:nth-child(5n)::after,
    .kzc-stats--items-6 .kzc-stats__item:nth-child(3n)::after,
    .kzc-stats__item:last-child::after {
        display: none;
    }
}

/* === kzc_steps – Ablauf-Schritte (RSCE) ============================
   Nummerierter Prozess in einzelnen Boxen mit Akzentlinie links, plus
   ein Abschnitts-CTA. Sektions-Inhaltselement (kein Wrapper, gehoert
   zwischen kzc_section_start / kzc_section_stop, die den Off-White-Grund
   liefern).

   Synthese: Sec-Head (Weinrot-Klinge + Eyebrow + H2), Mono-Nummern und
   Weinrot-CTA aus M09 (KZC-Kundenansicht-Render.html /
   KZC-Schritt5-Nav-Event.css .steps); die Schritte als eigene Boxen mit
   border-left statt einer durchgehenden Grid-Oberkante aus dem
   Wireframe v4 (.step). Auf hellem Grund -> dunkle Textfarben (Petrol /
   --kzc-grey-700 statt Weiss). Box-Optik analog kzc_cards__card.

   Spaltenzahl ab 1024px aus der Anzahl (Modifier --items-N, wie
   kzc_stats): 3->3, 4->4, 5->5, 6->3x2.
=================================================================== */
/* Kein globaler box-sizing-Reset im Theme (siehe colors_and_type.css) –
   die gepolsterten Boxen wuerden auf content-box ueber ihre 1fr-Spur
   hinauslaufen. Lokal wie bei kzc_split_diagonal. */
.kzc-steps,
.kzc-steps *,
.kzc-steps *::before,
.kzc-steps *::after {
    box-sizing: border-box;
}

/* Vertikaler Abstand kommt vom Element selbst, nicht vom Sektions-Wrapper
   (der liefert nur Breite + Hintergrund) – gleiche Konvention wie
   kzc_cards / kzc_checklist_cards. */
.kzc-steps {
    padding-block: var(--kzc-space-8);
}

.kzc-steps__head {
    margin-bottom: var(--kzc-space-6);
}

/* Eyebrow-Klinge kommt aus dem uebergreifenden Sektions-Kopf-Block
   am Dateiende. */

.kzc-steps__headline {
    margin: 0;
    color: var(--kzc-petrol);
    font-size: var(--kzc-fs-h2);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
}

.kzc-steps__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--kzc-space-4);
}

.kzc-steps__step {
    position: relative;
    min-width: 0;
    background-color: var(--kzc-bg);
    border: 1px solid var(--kzc-border);
    border-left: 3px solid var(--kzc-petrol);
    border-radius: 0 var(--kzc-radius-md) var(--kzc-radius-md) 0;
    box-shadow: var(--kzc-shadow-1);
    overflow: hidden;
}

.kzc-steps__body {
    padding: var(--kzc-space-5);
}

/* Optionales Bild je Schritt (29.09.2026): buendig oben in der Box,
   3:2 wie die Kartenbilder, keine Schraege (Kundenwunsch). */
.kzc-steps__media {
    aspect-ratio: 3 / 2;
    overflow: hidden;
}

.kzc-steps__image {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.kzc-steps__step--image .kzc-steps__body {
    padding-top: var(--kzc-space-4);
}

.kzc-steps__no {
    display: block;
    font-family: var(--kzc-font-mono);
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-bold);
    letter-spacing: 0.05em;
    color: var(--kzc-petrol);
    font-variant-numeric: tabular-nums;
}

/* Mit Bild: Nummer in Weinrot wie in der Referenz
   (KZC-Grundkurs.css ".k-step .n"), kleiner Akzent. */
.kzc-steps__step--image .kzc-steps__no {
    color: var(--kzc-wine);
}

.kzc-steps__title {
    margin: var(--kzc-space-3) 0 var(--kzc-space-2);
    color: var(--kzc-petrol);
    font-size: var(--kzc-fs-h4);
    font-weight: var(--kzc-fw-xbold);
    line-height: var(--kzc-lh-snug);
}

.kzc-steps__text {
    margin: 0;
    max-width: none;
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-grey-700);
}

.kzc-steps__cta-wrap {
    margin-top: var(--kzc-space-6);
}

.kzc-steps__cta {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    padding: var(--kzc-space-4) var(--kzc-space-5);
    border-radius: var(--kzc-radius-md);
    background-color: var(--kzc-cta);
    color: var(--kzc-cta-fg);
    font-size: var(--kzc-fs-body);
    font-weight: var(--kzc-fw-bold);
    text-decoration: none;
    transition: transform var(--kzc-dur-fast) var(--kzc-ease-out),
                background-color var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-steps__cta:hover {
    background-color: var(--kzc-wine-hover);
    color: var(--kzc-cta-fg);
    text-decoration: none;
    transform: translateY(-1px);
}

.kzc-steps__cta:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

.kzc-steps__cta-icon {
    flex: none;
}

@media (min-width: 768px) {
    .kzc-steps__list {
        grid-template-columns: repeat(2, 1fr);
        gap: var(--kzc-space-5);
    }
}

@media (min-width: 1024px) {
    .kzc-steps--items-3 .kzc-steps__list { grid-template-columns: repeat(3, 1fr); }
    .kzc-steps--items-4 .kzc-steps__list { grid-template-columns: repeat(4, 1fr); }
    .kzc-steps--items-5 .kzc-steps__list { grid-template-columns: repeat(5, 1fr); }
    .kzc-steps--items-6 .kzc-steps__list { grid-template-columns: repeat(3, 1fr); }
}

@media (prefers-reduced-motion: reduce) {
    .kzc-steps__cta {
        transition: none;
    }

    .kzc-steps__cta:hover {
        transform: none;
    }
}

/* === Sektions-Kopf: Eyebrow mit Weinrot-Klinge (uebergreifend) =====
   Jeder Abschnitts-Kopf bekommt die kurze schraege Klinge vor dem
   Eyebrow – durchgaengiges sec-head-Muster der massgeblichen Referenz
   KZC-Kundenansicht-Render.html (.sec-head .row .blade-rule, in
   M03/M06/M08/M09/M10/M13). Klinge auf kurzem breiten Balken =
   sanktionierter Akzent, --kzc-blade-skew (siehe CLAUDE.md
   Diagonalen-Abschnitt).

   Scoping ueber "__head >": die karten-/item-eigenen Eyebrows
   (z. B. .kzc-checklist-cards__card-eyebrow) sitzen NICHT im __head und
   bleiben ohne Klinge. kzc_stats bleibt aussen vor (dunkles Band, kein
   sec-head in der Referenz; Weinrot auf --kzc-bg-band traegt kaum).
   kzc_hero hat sein eigenes __eyebrow, NIE mit Klinge, bei keinem der
   drei Layouts (Kundenfeedback 10.09.2026, zweite Runde: der Hero-
   Eyebrow hat auf der Startseite nie eine Klinge, das Sektions-Kopf-
   Muster gilt nur fuer Abschnitts-Ueberschriften weiter unten im
   Seitenfluss – war beim Seitenkopf-Layout kurzzeitig anders umgesetzt,
   wieder entfernt). */
.kzc-cards__head > .kzc-eyebrow,
.kzc-checklist-cards__head > .kzc-eyebrow,
.kzc-course-cards__head > .kzc-eyebrow,
.kzc-price-overview__head > .kzc-eyebrow,
.kzc-steps__head > .kzc-eyebrow,
.kzc-explain-cards__head > .kzc-eyebrow,
.kzc-list__head > .kzc-eyebrow,
.kzc-media-text__head > .kzc-eyebrow,
.kzc-section__head > .kzc-eyebrow {
    display: flex;
    align-items: center;
    gap: var(--kzc-space-3);
    max-width: none;
}

.kzc-cards__head > .kzc-eyebrow::before,
.kzc-checklist-cards__head > .kzc-eyebrow::before,
.kzc-course-cards__head > .kzc-eyebrow::before,
.kzc-price-overview__head > .kzc-eyebrow::before,
.kzc-steps__head > .kzc-eyebrow::before,
.kzc-explain-cards__head > .kzc-eyebrow::before,
.kzc-list__head > .kzc-eyebrow::before,
.kzc-media-text__head > .kzc-eyebrow::before,
.kzc-section__head > .kzc-eyebrow::before {
    content: "";
    flex: none;
    width: 60px;
    height: 5px;
    background-color: var(--kzc-wine);
    transform: skewX(var(--kzc-blade-skew));
}

/* Sektions-Kopf am Wrapper (kzc_section_start, 29.09.2026): Kopf UEBER
   allen Elementen der Sektion, fuer Abschnitte aus mehreren Elementen
   (Spalten). Optik wie die Element-Koepfe (.kzc-list__head usw.). Der
   Kopf traegt den oberen Abstand selbst, das direkt folgende Element
   (Sektions-Inhaltselement oder .rs-columns) verliert dafuer sein
   padding-top, sonst doppelter Abstand. */
.kzc-section__head {
    padding-top: var(--kzc-space-8);
    margin-bottom: var(--kzc-space-6);
}

/* Spezifitaet (0,2,0) bewusst hoeher als die Element-Bloecke
   (.kzc-price-overview usw. stehen weiter unten in dieser Datei und
   wuerden eine (0,1,0)-Regel sonst ueberschreiben). */
.kzc-section-inner > .kzc-section__head + * {
    padding-top: 0;
}

.kzc-section__headline {
    margin: 0;
    color: var(--kzc-petrol);
    font-size: var(--kzc-fs-h2);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
}

.kzc-section__intro {
    max-width: var(--kzc-w-prose);
    margin: var(--kzc-space-4) 0 0;
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-fg-mute);
}

.kzc-section.-bg-petrol .kzc-section__headline,
.kzc-section.-bg-petrol .kzc-section__intro {
    color: var(--kzc-white);
}

/* === kzc_course_cards – Kurs-Karten (RSCE) =========================
   Dreizonige Karte: Media (Foto + Level-Tag, optionaler Diagonalschnitt)
   / Body (Titel, Kurzinfo, redaktioneller Anmeldestatus, optionaler
   Kursdetails-Link) / Fuss mit Trennlinie (Preis + Buchen-Button).
   Box-Optik geteilt mit kzc_cards__card (gleiche Tokens). Referenz M08
   (KZC-Schritt5-Nav-Event.css .course). Sektions-Inhaltselement.

   Vertical Life (Briefing D1 offen): Status rein redaktionell, kein
   Live-Badge, keine Echtzeit-Behauptung – Farbe/Text kommen aus dem
   status-Feld. Buchen-Button = normaler Link auf den VL-Deep-Link.
=================================================================== */
.kzc-course-cards {
    padding-block: var(--kzc-space-8);
}

.kzc-course-cards__head {
    max-width: var(--kzc-w-prose);
    margin-bottom: var(--kzc-space-6);
}

.kzc-course-cards__headline {
    font-size: var(--kzc-fs-h2);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-petrol);
    margin: var(--kzc-space-2) 0 0;
}

.kzc-course-cards__intro {
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-fg-mute);
    margin: var(--kzc-space-4) 0 0;
}

.kzc-course-cards__grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--kzc-space-5);
}

.kzc-course-cards__card {
    position: relative;
    display: flex;
    flex-direction: column;
    background-color: var(--kzc-bg);
    border: 1px solid var(--kzc-border);
    border-radius: var(--kzc-radius-md);
    box-shadow: var(--kzc-shadow-1);
    overflow: hidden;
    transition: transform var(--kzc-dur-fast) var(--kzc-ease-out),
                box-shadow var(--kzc-dur-fast) var(--kzc-ease-out);
}

.kzc-course-cards__card:hover {
    transform: translateY(-2px);
    box-shadow: var(--kzc-shadow-2);
}

.kzc-course-cards__media {
    position: relative;
    overflow: hidden;
}

.kzc-course-cards__media picture {
    display: block;
}

.kzc-course-cards__image {
    display: block;
    width: 100%;
    height: auto;
    /* 3:2 wie kzc_cards -> nutzt dieselben Bildgroessen "KZC Karte
       2-/3-spaltig" (tl_image_size 2/3), keine eigene noetig. */
    aspect-ratio: 3 / 2;
    object-fit: cover;
}

/* Diagonalschnitt an der Bild-Unterkante (Diagonalen-Motiv, 22px wie
   kzc_cards), legt den weissen Kartengrund frei. Nur bei Fotos. */
.kzc-course-cards--diagonal .kzc-course-cards__image {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 calc(100% - 22px));
}

/* Level-Tag: Petrol-Pille oben links, immer (kein Marketing-Badge). */
.kzc-course-cards__tag {
    position: absolute;
    left: var(--kzc-space-3);
    top: var(--kzc-space-3);
    z-index: 2;
    padding: 5px 11px;
    border-radius: var(--kzc-radius-pill);
    background-color: var(--kzc-petrol);
    color: var(--kzc-white);
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-bold);
    letter-spacing: 0.06em;
    text-transform: uppercase;
}

/* Ohne Bild: Level-Pille im Fluss ueber dem Titel (07.10.2026) */
.kzc-course-cards__tag--inline {
    position: static;
    align-self: flex-start;
    margin: 0 0 var(--kzc-space-2);
}

.kzc-course-cards__body {
    display: flex;
    flex-direction: column;
    flex: 1;
    padding: var(--kzc-space-5) var(--kzc-space-5) var(--kzc-space-6);
}

.kzc-course-cards__title {
    font-size: var(--kzc-fs-h4);
    font-weight: var(--kzc-fw-xbold);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-petrol);
    margin: 0 0 var(--kzc-space-2);
}

.kzc-course-cards__meta {
    font-size: var(--kzc-fs-caption);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-grey-700);
    margin: 0;
}

/* Anmeldestatus: Punkt + Text, Farbe je Modifier. Redaktionell. */
.kzc-course-cards__status {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    margin: var(--kzc-space-4) 0 0;
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-semi);
}

.kzc-course-cards__dot {
    flex: none;
    width: 8px;
    height: 8px;
    border-radius: var(--kzc-radius-pill);
    background-color: currentColor;
}

.kzc-course-cards__status--offen      { color: var(--kzc-success); }
.kzc-course-cards__status--wenige     { color: var(--kzc-warn); }
.kzc-course-cards__status--ausgebucht { color: var(--kzc-grey-500); }

.kzc-course-cards__detail {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    align-self: flex-start;
    margin-top: var(--kzc-space-4);
    font-weight: var(--kzc-fw-semi);
    color: var(--kzc-link);
    text-decoration: none;
}

.kzc-course-cards__detail:hover,
.kzc-course-cards__detail:focus-visible {
    text-decoration: underline;
}

.kzc-course-cards__detail-icon {
    flex: none;
}

/* Fuss: Preis links, Buchen-Button rechts, oben eine Trennlinie. */
.kzc-course-cards__foot {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--kzc-space-3);
    padding: var(--kzc-space-4) var(--kzc-space-5);
    border-top: 1px solid var(--kzc-border);
}

.kzc-course-cards__price {
    font-size: var(--kzc-fs-h4);
    font-weight: var(--kzc-fw-xbold);
    color: var(--kzc-petrol);
}

.kzc-course-cards__book {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    flex: none;
    padding: var(--kzc-space-3) var(--kzc-space-4);
    border-radius: var(--kzc-radius-md);
    background-color: var(--kzc-cta);
    color: var(--kzc-cta-fg);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-bold);
    white-space: nowrap;
    text-decoration: none;
    transition: transform var(--kzc-dur-fast) var(--kzc-ease-out),
                background-color var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-course-cards__book:hover {
    background-color: var(--kzc-wine-hover);
    color: var(--kzc-cta-fg);
    text-decoration: none;
    transform: translateY(-1px);
}

.kzc-course-cards__book:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

.kzc-course-cards__book-icon {
    flex: none;
}

.kzc-course-cards__footnote {
    margin: var(--kzc-space-5) 0 0;
    font-size: var(--kzc-fs-caption);
    color: var(--kzc-grey-500);
}

@media (min-width: 768px) {
    .kzc-course-cards--cols-2 .kzc-course-cards__grid,
    .kzc-course-cards--cols-3 .kzc-course-cards__grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (min-width: 1024px) {
    .kzc-course-cards--cols-3 .kzc-course-cards__grid {
        grid-template-columns: repeat(3, 1fr);
    }
}

@media (prefers-reduced-motion: reduce) {
    .kzc-course-cards__card,
    .kzc-course-cards__book {
        transition: none;
    }

    .kzc-course-cards__card:hover,
    .kzc-course-cards__book:hover {
        transform: none;
    }
}

/* --- Erweiterung 05.10.2026 (Seite Kurse & Camps) ----------------------
   Referenz design-ref/KZC-Kurse-Camps.css (.kc-card, .kc-st, .kc-path).
   Kurzinfo als Icon-Liste, Status als Pille, Titel als Link,
   Display-Titel fuer Jahres-Events, Anfrage-Button in Petrol (Weinrot
   bleibt Buchen/Camp-Anmeldung, Entscheidung 05.10.2026) und der
   Lernweg-Modus (--path). */
.kzc-course-cards__title-link {
    color: inherit;
    text-decoration: none;
}

.kzc-course-cards__title-link:hover {
    text-decoration: underline;
}

.kzc-course-cards__title-link:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
    border-radius: var(--kzc-radius-xs);
}

/* Display-Titel: Versalien, Zeile 2 in Blau (ab 22px Bold = Grossschrift,
   AA fuer Blau auf Weiss erfuellt). */
.kzc-course-cards__title--display {
    font-size: clamp(1.375rem, 2vw, 1.6875rem);
    line-height: 1.05;
    text-transform: uppercase;
}

.kzc-course-cards__title-accent {
    display: block;
    color: var(--kzc-blue);
}

/* Status als Pille: gefuellter Punkt = offen/wenige, Ring = ausgebucht/
   folgt. Farbe nur als Zusatz, der Text traegt die Aussage. */
.kzc-course-cards__status {
    align-self: flex-start;
    margin: var(--kzc-space-1) 0 var(--kzc-space-3);
    padding: 3px 10px 3px 8px;
    border: 1px solid var(--kzc-border);
    border-radius: var(--kzc-radius-pill);
    background-color: var(--kzc-white);
}

.kzc-course-cards__status--ausgebucht { color: var(--kzc-warn); }
.kzc-course-cards__status--folgt      { color: var(--kzc-grey-700); }

.kzc-course-cards__status--ausgebucht .kzc-course-cards__dot,
.kzc-course-cards__status--folgt .kzc-course-cards__dot {
    box-sizing: border-box;
    background-color: transparent;
    border: 2px solid currentColor;
}

/* Kurzinfo als Liste mit Icons */
.kzc-course-cards__facts {
    display: flex;
    flex-direction: column;
    gap: var(--kzc-space-1);
    margin: var(--kzc-space-1) 0 0;
    padding: 0;
    list-style: none;
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-grey-700);
}

.kzc-course-cards__fact {
    display: flex;
    align-items: flex-start;
    gap: var(--kzc-space-2);
}

.kzc-course-cards__fact-icon {
    flex: none;
    margin-top: 1px;
    color: var(--kzc-petrol);
}

/* Preis-Zusatz klein unter dem Betrag (Template trennt am ersten "€") */
.kzc-course-cards__price-unit {
    display: block;
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-semi);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-grey-700);
}

/* Kursdetails in Petrol statt --kzc-link (Blau reisst AA fuer kleinen
   Text auf Weiss, Befund 05.10.2026). */
.kzc-course-cards__detail {
    color: var(--kzc-petrol);
}

/* Anfrage-Button: Petrol statt Weinrot */
.kzc-course-cards__book--request {
    background-color: var(--kzc-petrol);
    color: var(--kzc-white);
}

.kzc-course-cards__book--request:hover {
    background-color: var(--kzc-petrol-hover);
    color: var(--kzc-white);
}

/* Lernweg (Feld "Als Lernweg darstellen"): echte <ol>, je Stufe Kopf mit
   Nummer (dekorativ, aria-hidden; die Reihenfolge traegt die Liste).
   Mobil/Tablet senkrechte Zeitleiste, ab 1024px ansteigende Treppe mit
   Pfeilen. Treppe ueber nth-last-child, damit 2 bis 4 Stufen passen. */
.kzc-course-cards--path .kzc-course-cards__grid {
    position: relative;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--kzc-space-6);
    margin: 0;
    padding: 0 0 0 52px;
    list-style: none;
}

.kzc-course-cards--path .kzc-course-cards__grid::before {
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    left: 19px;
    width: 3px;
    background-color: var(--kzc-blue);
    opacity: 0.5;
}

.kzc-course-cards__step {
    position: relative;
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.kzc-course-cards__step > .kzc-course-cards__card {
    flex: 1;
}

.kzc-course-cards__stage {
    display: flex;
    align-items: center;
    gap: var(--kzc-space-3);
    min-height: 40px;
    margin: 0 0 var(--kzc-space-3);
}

.kzc-course-cards__stage-num {
    position: absolute;
    top: 0;
    left: -52px;
    display: grid;
    place-items: center;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background-color: var(--kzc-petrol);
    color: var(--kzc-white);
    font-size: 0.9375rem;
    font-weight: var(--kzc-fw-xbold);
}

.kzc-course-cards__stage-label {
    font-size: 0.75rem;
    font-weight: var(--kzc-fw-xbold);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--kzc-petrol);
}

.kzc-course-cards__stage-label strong {
    display: block;
    font-size: var(--kzc-fs-body-sm);
    letter-spacing: 0;
    text-transform: none;
    color: var(--kzc-ink);
}

@media (min-width: 768px) {
    .kzc-course-cards--path .kzc-course-cards__grid {
        grid-template-columns: minmax(0, 1fr);
        padding-left: 76px;
    }

    .kzc-course-cards--path .kzc-course-cards__grid::before {
        left: 27px;
    }

    .kzc-course-cards__stage {
        min-height: 56px;
    }

    .kzc-course-cards__stage-num {
        left: -76px;
        width: 56px;
        height: 56px;
        font-size: 1.25rem;
    }

    /* Tablet: Karte quer, Foto links */
    .kzc-course-cards--path .kzc-course-cards__card:has(.kzc-course-cards__media) {
        display: grid;
        grid-template-columns: 2fr 3fr;
        grid-template-rows: 1fr auto;
    }

    .kzc-course-cards--path .kzc-course-cards__media {
        grid-row: 1 / span 2;
    }

    .kzc-course-cards--path .kzc-course-cards__media picture,
    .kzc-course-cards--path .kzc-course-cards__image {
        height: 100%;
    }

    .kzc-course-cards--path .kzc-course-cards__image {
        aspect-ratio: auto;
        min-height: 220px;
        clip-path: none;
    }

    .kzc-course-cards--path .kzc-course-cards__body,
    .kzc-course-cards--path .kzc-course-cards__foot {
        grid-column: 2;
    }
}

@media (min-width: 1024px) {
    .kzc-course-cards--path .kzc-course-cards__grid {
        align-items: start;
        gap: var(--kzc-space-7);
        padding-left: 0;
    }

    .kzc-course-cards--path.kzc-course-cards--items-2 .kzc-course-cards__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .kzc-course-cards--path.kzc-course-cards--items-3 .kzc-course-cards__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .kzc-course-cards--path.kzc-course-cards--items-4 .kzc-course-cards__grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }

    .kzc-course-cards--path .kzc-course-cards__grid::before {
        content: none;
    }

    .kzc-course-cards__step:nth-last-child(2) { margin-top: 56px; }
    .kzc-course-cards__step:nth-last-child(3) { margin-top: 112px; }
    .kzc-course-cards__step:nth-last-child(4) { margin-top: 168px; }

    /* Pfeil zur naechsten Stufe, in der Spaltenluecke auf Hoehe der Nummer */
    .kzc-course-cards__step:not(:last-child)::after {
        content: "";
        position: absolute;
        top: 17px;
        right: -27px;
        width: 22px;
        height: 22px;
        background-color: var(--kzc-petrol);
        -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14'/%3E%3Cpath d='m12 5 7 7-7 7'/%3E%3C/svg%3E") center / contain no-repeat;
        mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14'/%3E%3Cpath d='m12 5 7 7-7 7'/%3E%3C/svg%3E") center / contain no-repeat;
    }

    .kzc-course-cards__stage-num {
        position: static;
        display: inline;
        width: auto;
        height: auto;
        border-radius: 0;
        background: none;
        color: var(--kzc-blue);
        font-size: 3.5rem;
        line-height: 1;
        letter-spacing: -0.02em;
    }

    /* Desktop: Karte wieder hochkant */
    .kzc-course-cards--path .kzc-course-cards__card:has(.kzc-course-cards__media) {
        display: flex;
    }

    .kzc-course-cards--path .kzc-course-cards__image {
        aspect-ratio: 3 / 2;
        min-height: 0;
        height: auto;
    }

    .kzc-course-cards--path.kzc-course-cards--diagonal .kzc-course-cards__image {
        clip-path: polygon(0 0, 100% 0, 100% 100%, 0 calc(100% - 22px));
    }
}


/* === kzc_price_overview – Preis-Uebersicht (RSCE) ==================
   Tarif-Umschalter (Tabs) mit je einem Raster aus Preis-Karten
   (Bezeichnung / Betrag / Zusatz). Referenz M10
   (KZC-Schritt5-Nav-Event.css .ptabs/.ptier) + zentrierter Kopf/Karten
   aus Wireframe v4 (.prices). Helle Variante (Kunden-Entscheidung
   09.09.2026), Sektions-Inhaltselement (kein Wrapper).

   Kein blauer Diagonal-Eckakzent (anders als die Schritt-5-.ptier):
   wie bei kzc_stats ist die grosse Zahl der Fokus, das Eck-Dreieck
   davor waere Bildrauschen. Entscheidung Claude, 09.09.2026.

   Label + Betrag in --kzc-petrol, NICHT im Referenz-Blau (.ptier .pt /
   .pp nutzen --kzc-blue): Blau auf Weiss reisst WCAG AA fuer kleinen
   Text (~2.8:1). Gleiche bewusste Abweichung wie bei kzc_split_diagonal
   (Kennzahl-Chip). Hierarchie kommt ueber Groesse/Gewicht.

   Tabs = progressive enhancement (kzc-components.js): ohne JS ist die
   Tab-Leiste [hidden] und alle Panels stehen sichtbar untereinander,
   jedes mit dem Tarif-Namen als Ueberschrift. Mit JS: Leiste sichtbar,
   nur aktives Panel, Panel-Titel aus (Container-Klasse is-enhanced).
   Spaltenzahl der Karten aus der Anzahl je Tarif (--items-N).
=================================================================== */
/* Kein globaler box-sizing-Reset im Theme – gepolsterte Boxen wuerden
   auf content-box ueber ihre Spur hinauslaufen. Lokal wie kzc_steps. */
.kzc-price-overview,
.kzc-price-overview *,
.kzc-price-overview *::before,
.kzc-price-overview *::after {
    box-sizing: border-box;
}

/* Vertikaler Abstand vom Element selbst, nicht vom Sektions-Wrapper. */
.kzc-price-overview {
    padding-block: var(--kzc-space-8);
}

/* Sec-Head linksbuendig wie bei jedem anderen Element (kzc_cards /
   kzc_course_cards / kzc_steps / kzc_stats). Die zentrierte Kopfzeile
   aus dem Wireframe v4 wurde verworfen – nur diese eine Ueberschrift
   mittig waere im Seitenfluss inkonsistent (Feedback 09.09.2026). Aus
   v4 bleibt nur die Grundfarbe-Entscheidung (hell), nicht das Layout. */
.kzc-price-overview__head {
    max-width: var(--kzc-w-prose);
    margin: 0 0 var(--kzc-space-6);
}

.kzc-price-overview__headline {
    margin: var(--kzc-space-2) 0 0;
    color: var(--kzc-petrol);
    font-size: var(--kzc-fs-h2);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
}

.kzc-price-overview__intro {
    max-width: none;
    margin: var(--kzc-space-4) 0 0;
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-fg-mute);
}

.kzc-price-overview__pagelink {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    margin-top: var(--kzc-space-4);
    color: var(--kzc-petrol);
    font-weight: var(--kzc-fw-semi);
    text-decoration: none;
}

.kzc-price-overview__pagelink:hover {
    color: var(--kzc-petrol);
    text-decoration: underline;
    text-underline-offset: 3px;
}

.kzc-price-overview__pagelink:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
    border-radius: var(--kzc-radius-xs);
}

.kzc-price-overview__pagelink-icon {
    flex: none;
}

/* --- Tab-Leiste (aus M10 .ptabs), linksbuendig ------------------- */
.kzc-price-overview__tabs {
    display: inline-flex;
    flex-wrap: wrap;
    max-width: 100%;
    gap: 4px;
    margin-bottom: var(--kzc-space-6);
    padding: 6px;
    border: 1px solid var(--kzc-border);
    border-radius: var(--kzc-radius-md);
    background-color: var(--kzc-white);
}

.kzc-price-overview__tab {
    appearance: none;
    border: 0;
    border-radius: var(--kzc-radius-sm);
    background-color: transparent;
    padding: 11px 22px;
    font: inherit;
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-grey-500);
    cursor: pointer;
    transition: background-color var(--kzc-dur-base) var(--kzc-ease-out),
                color var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-price-overview__tab:hover {
    color: var(--kzc-petrol);
}

.kzc-price-overview__tab.is-active {
    background-color: var(--kzc-petrol);
    color: var(--kzc-white);
}

.kzc-price-overview__tab:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

/* --- Panels ----------------------------------------------------- */
.kzc-price-overview__panel:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
    border-radius: var(--kzc-radius-md);
}

/* Ohne JS stehen die Panels untereinander, jedes mit Tarif-Titel. */
.kzc-price-overview__panel + .kzc-price-overview__panel {
    margin-top: var(--kzc-space-7);
}

.kzc-price-overview__panel-title {
    margin: 0 0 var(--kzc-space-5);
    color: var(--kzc-petrol);
    font-size: var(--kzc-fs-h4);
    font-weight: var(--kzc-fw-xbold);
    line-height: var(--kzc-lh-snug);
}

/* Mit JS ersetzt der aktive Tab den Titel. */
.kzc-price-overview__tabswrap.is-enhanced .kzc-price-overview__panel-title {
    display: none;
}

.kzc-price-overview__tabswrap.is-enhanced .kzc-price-overview__panel + .kzc-price-overview__panel {
    margin-top: 0;
}

/* --- Karten-Raster (aus M10 .pcards / .ptier), linksbuendig ------ */
.kzc-price-overview__grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--kzc-space-3);
    max-width: 920px;
}

.kzc-price-overview__grid--items-1 {
    grid-template-columns: minmax(0, 320px);
}

.kzc-price-overview__card {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 4px;
    padding: var(--kzc-space-6) var(--kzc-space-5);
    border: 1px solid var(--kzc-border);
    border-radius: var(--kzc-radius-md);
    box-shadow: var(--kzc-shadow-1);
    background-color: var(--kzc-white);
}

.kzc-price-overview__label {
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-bold);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--kzc-petrol);
}

.kzc-price-overview__price {
    margin-top: var(--kzc-space-2);
    font-size: clamp(1.75rem, 1.2rem + 2vw, 2.5rem);
    font-weight: var(--kzc-fw-xbold);
    line-height: 1;
    letter-spacing: -0.01em;
    color: var(--kzc-petrol);
    font-variant-numeric: tabular-nums;
}

.kzc-price-overview__note {
    font-size: var(--kzc-fs-caption);
    color: var(--kzc-grey-500);
}

.kzc-price-overview__tier-note,
.kzc-price-overview__footnote {
    color: var(--kzc-grey-500);
}

.kzc-price-overview__tier-note {
    max-width: 60ch;
    margin-top: var(--kzc-space-4);
    font-size: var(--kzc-fs-body-sm);
}

.kzc-price-overview__footnote {
    max-width: 70ch;
    margin-top: var(--kzc-space-6);
    font-family: var(--kzc-font-mono);
    font-size: var(--kzc-fs-caption);
    line-height: var(--kzc-lh-normal);
}

@media (min-width: 768px) {
    .kzc-price-overview__grid {
        gap: var(--kzc-space-4);
    }

    .kzc-price-overview__grid--items-3,
    .kzc-price-overview__grid--items-5,
    .kzc-price-overview__grid--items-6 {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }

    .kzc-price-overview__grid--items-4,
    .kzc-price-overview__grid--items-7,
    .kzc-price-overview__grid--items-8 {
        grid-template-columns: repeat(4, minmax(0, 1fr));
    }
}

@media (min-width: 1024px) {
    .kzc-price-overview__grid--items-4 {
        grid-template-columns: repeat(4, minmax(0, 1fr));
        max-width: 1100px;
    }

    .kzc-price-overview__grid--items-5 {
        grid-template-columns: repeat(5, minmax(0, 1fr));
        max-width: 1200px;
    }

    .kzc-price-overview__grid--items-6 {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }

    .kzc-price-overview__grid--items-7,
    .kzc-price-overview__grid--items-8 {
        grid-template-columns: repeat(4, minmax(0, 1fr));
        max-width: 1100px;
    }
}

/* Karten-Darstellung bei 9-12 Eintraegen (Limit seit 25.09.2026 12). */
@media (min-width: 768px) {
    .kzc-price-overview__grid--items-9 {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }

    .kzc-price-overview__grid--items-10,
    .kzc-price-overview__grid--items-11,
    .kzc-price-overview__grid--items-12 {
        grid-template-columns: repeat(4, minmax(0, 1fr));
    }
}

@media (min-width: 1024px) {
    .kzc-price-overview__grid--items-10,
    .kzc-price-overview__grid--items-11,
    .kzc-price-overview__grid--items-12 {
        max-width: 1100px;
    }
}

/* --- Listen-Darstellung (Modifier --list, Feld "display") ---------
   Kompakte Zeilen: Bezeichnung + Zusatz links, Betrag rechts. Fuer
   viele aehnliche Positionen (Verleih), wo grosse Preis-Karten zu
   schwer wirken. Referenz design-ref/KZC-Preise.html/.css ".rent" /
   ".rent-item". Betrag in --kzc-ink wie in der Referenz (die grossen
   Karten-Betraege bleiben Petrol). Spalten: mobil 1, ab 768px 2, ab
   1024px 3 (9 -> 3x3, 6 -> 3x2, 12 -> 3x4); 2 und 4 Eintraege bleiben
   2-spaltig, damit keine einzelne Zeile allein unten haengt. */
.kzc-price-overview__list {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--kzc-space-3);
    margin: 0;
    padding: 0;
    list-style: none;
}

.kzc-price-overview__item {
    box-sizing: border-box;
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--kzc-space-4);
    padding: var(--kzc-space-4) var(--kzc-space-5);
    border: 1px solid var(--kzc-border);
    border-radius: var(--kzc-radius-md);
    box-shadow: var(--kzc-shadow-1);
    background-color: var(--kzc-white);
}

.kzc-price-overview__item-name {
    display: flex;
    flex-direction: column;
    gap: var(--kzc-space-1);
    min-width: 0;
}

.kzc-price-overview--list .kzc-price-overview__label {
    font-size: var(--kzc-fs-body-sm);
    letter-spacing: 0;
    text-transform: none;
    line-height: var(--kzc-lh-snug);
}

.kzc-price-overview--list .kzc-price-overview__note {
    font-family: var(--kzc-font-mono);
    letter-spacing: 0.02em;
}

.kzc-price-overview--list .kzc-price-overview__price {
    margin-top: 0;
    font-size: 1.375rem;
    color: var(--kzc-ink);
    white-space: nowrap;
}

@media (min-width: 768px) {
    .kzc-price-overview__list {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: var(--kzc-space-4);
    }

    .kzc-price-overview__list--items-1 {
        grid-template-columns: minmax(0, 420px);
    }
}

@media (min-width: 1024px) {
    .kzc-price-overview__list {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }

    .kzc-price-overview__list--items-2,
    .kzc-price-overview__list--items-4 {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        max-width: 920px;
    }
}

@media (prefers-reduced-motion: reduce) {
    .kzc-price-overview__tab {
        transition: none;
    }
}

/* === kzc_explain_cards – Erklär-Karten (RSCE) ========================
   Kurze Icon-Karten fuer haeufige Fragen/Erklaerungen: Icon-Box, Titel,
   Text, optionale gedaempfte Zusatzzeile. Kein Bild, kein Link. Referenz
   design-ref/KZC-Preise.html/.css ".band .explain"/".exp". Sektions-
   Inhaltselement (kein Wrapper, gehoert zwischen kzc_section_start /
   kzc_section_stop, die Off-White-Grund + Breite liefern).

   Diagonale Oberkante je Karte (::before, wie kzc_cards__card--featured)
   in Petrol (Standard) oder Weinrot (Modifier --wine, Feld "accent"),
   1:1 aus der Referenz (".exp::before" petrol, ".exp.acc::before" wein).

   Spaltenzahl ab 1024px aus der Anzahl (Modifier --items-N, wie
   kzc_stats/kzc_steps): 2->2, 3->3, 4->4, 5->5, 6->3x2. */
.kzc-explain-cards,
.kzc-explain-cards *,
.kzc-explain-cards *::before,
.kzc-explain-cards *::after {
    box-sizing: border-box;
}

.kzc-explain-cards {
    padding-block: var(--kzc-space-8);
}

.kzc-explain-cards__head {
    margin-bottom: var(--kzc-space-6);
}

/* Eyebrow-Klinge kommt aus dem uebergreifenden Sektions-Kopf-Block
   am Dateiende. */

.kzc-explain-cards__headline {
    margin: 0;
    color: var(--kzc-petrol);
    font-size: var(--kzc-fs-h2);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
}

.kzc-explain-cards__intro {
    max-width: var(--kzc-w-prose);
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-fg-mute);
    margin: var(--kzc-space-4) 0 0;
}

.kzc-explain-cards__grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--kzc-space-5);
}

.kzc-explain-cards__card {
    position: relative;
    min-width: 0;
    background-color: var(--kzc-bg);
    border: 1px solid var(--kzc-border);
    border-radius: var(--kzc-radius-md);
    box-shadow: var(--kzc-shadow-1);
    overflow: hidden;
    padding: var(--kzc-space-6) var(--kzc-space-5) var(--kzc-space-5);
}

/* Diagonale Oberkante, 6px, Petrol Standard. Gleiche Geometrie wie
   .kzc-cards__card--featured::before, andere Farblogik (hier je Karte
   waehlbar statt an ein "featured"-Flag gekoppelt). */
.kzc-explain-cards__card::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    height: 6px;
    background-color: var(--kzc-petrol);
    clip-path: polygon(0 0, 100% 0, 100% 40%, 0 100%);
}

.kzc-explain-cards__card--wine::before {
    background-color: var(--kzc-wine);
}

.kzc-explain-cards__icon-box {
    display: grid;
    place-items: center;
    width: 38px;
    height: 38px;
    background-color: var(--kzc-off-white);
    color: var(--kzc-petrol);
    border-radius: var(--kzc-radius-sm);
    margin-bottom: var(--kzc-space-4);
}

.kzc-explain-cards__title {
    margin: 0 0 var(--kzc-space-2);
    color: var(--kzc-petrol);
    font-size: var(--kzc-fs-h4);
    font-weight: var(--kzc-fw-xbold);
    line-height: var(--kzc-lh-snug);
}

.kzc-explain-cards__text {
    margin: 0;
    max-width: none;
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-grey-700);
}

.kzc-explain-cards__note {
    margin: var(--kzc-space-2) 0 0;
    font-size: var(--kzc-fs-caption);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-grey-500);
}

/* Optionaler Textlink (29.09.2026), Optik wie .kzc-checklist-cards__link.
   Petrol statt Blau: kleiner Text auf Weiss (WCAG AA). */
.kzc-explain-cards__link {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    margin-top: var(--kzc-space-4);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-semi);
    color: var(--kzc-petrol);
    text-decoration: none;
    overflow-wrap: anywhere;
}

.kzc-explain-cards__link:hover {
    text-decoration: underline;
}

.kzc-explain-cards__link-icon {
    flex: none;
}

/* Kicker ueber dem Titel und "ganze Karte klickbar" (05.10.2026, Seite
   Kurse & Camps, Orientierung). Klickbar per ::after ueber die ganze
   Karte (Muster kzc_cards), der Link bleibt der einzige echte Link. */
/* Ueberschrift als H3 (Unterabschnitt in einer Sektion, z. B. „Danach
   moeglich“ auf Kurse & Camps): kleiner als die H2-Groesse des Kopfes. */
h3.kzc-explain-cards__headline {
    font-size: var(--kzc-fs-h4);
}

.kzc-explain-cards__kicker {
    margin: 0 0 var(--kzc-space-1);
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-grey-700);
}

.kzc-explain-cards__card--clickable {
    display: flex;
    flex-direction: column;
    transition: transform var(--kzc-dur-fast) var(--kzc-ease-out), box-shadow var(--kzc-dur-fast) var(--kzc-ease-out);
}

.kzc-explain-cards__card--clickable .kzc-explain-cards__link {
    align-self: flex-start;
    margin-top: auto;
    padding-top: var(--kzc-space-4);
}

.kzc-explain-cards__card--clickable .kzc-explain-cards__link::after {
    content: "";
    position: absolute;
    inset: 0;
}

.kzc-explain-cards__card--clickable:hover {
    transform: translateY(-2px);
    box-shadow: var(--kzc-shadow-2);
}

.kzc-explain-cards__card--clickable:has(.kzc-explain-cards__link:focus-visible) {
    box-shadow: var(--kzc-ring-focus);
}

.kzc-explain-cards__card--clickable .kzc-explain-cards__link:focus-visible {
    outline: none;
}

@media (prefers-reduced-motion: reduce) {
    .kzc-explain-cards__card--clickable {
        transition: none;
    }

    .kzc-explain-cards__card--clickable:hover {
        transform: none;
    }
}

@media (min-width: 768px) {
    .kzc-explain-cards__grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (min-width: 1024px) {
    .kzc-explain-cards--items-2 .kzc-explain-cards__grid { grid-template-columns: repeat(2, 1fr); }
    .kzc-explain-cards--items-3 .kzc-explain-cards__grid { grid-template-columns: repeat(3, 1fr); }
    .kzc-explain-cards--items-4 .kzc-explain-cards__grid { grid-template-columns: repeat(4, 1fr); }
    .kzc-explain-cards--items-5 .kzc-explain-cards__grid { grid-template-columns: repeat(5, 1fr); }
    .kzc-explain-cards--items-6 .kzc-explain-cards__grid { grid-template-columns: repeat(3, 1fr); }
}

/* === kzc_photo_teaser – Foto-Teaser (RSCE) ==========================
   Vollbild-Baustein fuer EIN Thema mit Foto. Diagonale 1:1 aus
   .kzc-hero--split uebernommen (__blade/__image-Polygone identisch,
   "kleiner Bruder" des Hero, Befund/Wunsch 11.09.2026: "so etwas wie
   die geteilte Klinge im Hero"). Foto rechts, Text/Pillen links auf der
   Flaeche. Anders als kzc_split_diagonal (eigener Winkel, Ratio-System,
   fuer den Vergleich ZWEIER Themen) bewusst nur EIN Thema, keine zweite
   Seite, kein Ratio-Feld.

   Flaeche PETROL, nicht Weinrot (Korrektur 11.09.2026, Kundenfeedback):
   der Textbereich (0-54%) ist normale dunkle Textflaeche (CLAUDE.md
   Farbeinsatz: Weinrot nur CTA/winzige Akzente, nie flaechig). Die
   Klinge selbst bleibt aber WEINROT, exakt wie bei .kzc-hero--split:
   __blade (54% -> 100%, Weinrot) liegt UNTER __image (55.8% -> 100%,
   Foto) – der natuerliche Spalt dazwischen (54% bis 55.8%, keine feste
   Pixelbreite, sondern echte 1,8 Prozentpunkte des Elements) bleibt
   unbedeckt Weinrot sichtbar und IST die Klinge. Kein separates
   duennes Seam-Element mehr (Zwischenstand verworfen, Befund
   11.09.2026 zweite Runde: "es ist immer noch eine Linie" – eine fest
   breite Linie sieht neben dieser breiteren, echten Vorlage duenn aus,
   der natuerliche Spalt IST bereits die richtige Breite).

   Vollbild-Element (kein Sektions-Wrapper), full-bleed wie
   kzc_split_diagonal (margin-inline: calc(50% - 50vw), Scrollbar-Guard
   html { overflow-x: clip } liegt schon in colors_and_type.css). */
.kzc-photo-teaser {
    position: relative;
    overflow: hidden;
    min-height: 480px;
    display: flex;
    align-items: center;
    background-color: var(--kzc-petrol);
    color: var(--kzc-white);
    margin-inline: calc(50% - 50vw);
}

.kzc-photo-teaser__blade {
    position: absolute;
    inset: 0;
    background-color: var(--kzc-wine);
    clip-path: polygon(54% 0, 100% 0, 100% 100%, 43% 100%);
}

.kzc-photo-teaser__image {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: 50% 20%;
    clip-path: polygon(55.8% 0, 100% 0, 100% 100%, 43% 100%);
}

.kzc-photo-teaser__inner {
    position: relative;
    z-index: 2;
    box-sizing: border-box;
    width: 100%;
    max-width: var(--kzc-container-max);
    margin-inline: auto;
    padding-inline: var(--kzc-section-padding-x);
}

.kzc-photo-teaser__text {
    max-width: 28rem;
}

.kzc-photo-teaser__eyebrow {
    font-size: var(--kzc-fs-eyebrow);
    font-weight: var(--kzc-fw-semi);
    letter-spacing: var(--kzc-tracking-wide);
    text-transform: uppercase;
    color: var(--kzc-white);
    margin: 0 0 var(--kzc-space-3);
}

.kzc-photo-teaser__headline {
    font-family: var(--kzc-font-sans);
    font-weight: var(--kzc-fw-xbold);
    font-size: clamp(2rem, 4vw, 2.75rem);
    line-height: 1.05;
    letter-spacing: var(--kzc-tracking-tight);
    text-transform: uppercase;
    color: var(--kzc-white);
    margin: 0 0 var(--kzc-space-4);
}

.kzc-photo-teaser__text-body {
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-normal);
    color: rgba(255, 255, 255, 0.92);
    margin: 0 0 var(--kzc-space-5);
}

.kzc-photo-teaser__perks {
    list-style: none;
    margin: 0 0 var(--kzc-space-5);
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--kzc-space-2);
}

.kzc-photo-teaser__perk {
    position: relative;
    padding: var(--kzc-space-3) var(--kzc-space-4) var(--kzc-space-3) calc(var(--kzc-space-4) + 1em);
    background-color: rgba(255, 255, 255, 0.14);
    border-radius: var(--kzc-radius-md);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-medium);
    color: var(--kzc-white);
}

.kzc-photo-teaser__perk::before {
    content: "▸";
    position: absolute;
    left: var(--kzc-space-4);
    color: var(--kzc-blue);
}

/* Weinrot gefuellt statt weiss (Korrektur 11.09.2026, passend zur
   Petrol-Flaeche): gleiche Primaer-CTA-Optik wie ueberall sonst im
   Projekt (--kzc-cta/--kzc-cta-fg, z. B. .kzc-hero__button--primary). */
.kzc-photo-teaser__button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background-color: var(--kzc-cta);
    color: var(--kzc-cta-fg);
    font-weight: var(--kzc-fw-bold);
    font-size: var(--kzc-fs-body);
    padding: var(--kzc-space-4) var(--kzc-space-5);
    border-radius: var(--kzc-radius-md);
    text-decoration: none;
    transition: transform var(--kzc-dur-fast) var(--kzc-ease-out), background-color var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-photo-teaser__button:hover {
    background-color: var(--kzc-wine-hover);
    color: var(--kzc-cta-fg);
    text-decoration: none;
    transform: translateY(-1px);
}

.kzc-photo-teaser__button:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
}

/* Button-Art "Anfrage" (Feld buttonStyle, 06.10.2026, Erlebnismobil auf
   Erleben & Buchen): weiss gefuellt, Petrol-Schrift. Weinrot bleibt
   Buchen vorbehalten, Petrol gefuellt traegt auf dem dunklen Foto nicht. */
.kzc-photo-teaser .kzc-photo-teaser__button--request,
.kzc-photo-teaser .kzc-photo-teaser__button--request:hover {
    background-color: var(--kzc-white);
    color: var(--kzc-petrol);
}

.kzc-photo-teaser .kzc-photo-teaser__button--request:hover {
    background-color: var(--kzc-off-white);
}

@media (max-width: 1024px) {
    .kzc-photo-teaser {
        min-height: 440px;
    }
    .kzc-photo-teaser__blade {
        clip-path: polygon(54% 0, 100% 0, 100% 100%, 42% 100%);
    }
    .kzc-photo-teaser__image {
        clip-path: polygon(56% 0, 100% 0, 100% 100%, 42% 100%);
    }
    .kzc-photo-teaser__text {
        max-width: 50%;
    }
}

@media (max-width: 768px) {
    .kzc-photo-teaser {
        display: block;
        min-height: 0;
    }
    .kzc-photo-teaser__blade {
        display: none;
    }
    .kzc-photo-teaser__image {
        position: relative;
        inset: auto;
        width: 100%;
        height: 260px;
        clip-path: polygon(0 0, 100% 0, 100% calc(100% - 46px), 0 100%);
    }
    .kzc-photo-teaser__inner {
        padding-block: var(--kzc-space-6) var(--kzc-space-7);
    }
    .kzc-photo-teaser__text {
        max-width: 100%;
    }
}

@media (prefers-reduced-motion: reduce) {
    .kzc-photo-teaser__button {
        transition: none;
    }
}

/* --- Erweiterung 05.10.2026 (Seite Kurse & Camps, Camp-Teaser) ---------
   Referenz design-ref/KZC-Kurse-Camps.css (.kc-teaser). Gilt fuer beide
   Layouts: zweite Titelzeile, Status-Pille, Pillen mit Icon, zweiter
   Link. Dazu Layout "Vollbild" (--fullwidth) analog .kzc-hero--fullwidth:
   Foto ueber die ganze Flaeche, dunkler Verlauf, schraege Oberkante mit
   5px Weinrot-Linie. Die Flaeche ueber der Schraege hat die Farbe der
   Sektion davor (Standard weiss, nach einer Off-White-Sektion Off-White). */
.kzc-photo-teaser__headline-accent {
    display: block;
    /* Auf Petrol (Geteilt) reisst reines Blau AA auch fuer Grossschrift
       (~2:1), deshalb aufgehellt (~3.6:1). Vollbild: reines Blau. */
    color: color-mix(in srgb, var(--kzc-blue) 55%, var(--kzc-white));
}

.kzc-photo-teaser__status {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    margin: 0 0 var(--kzc-space-4);
    padding: 4px 12px 4px 10px;
    border-radius: var(--kzc-radius-pill);
    background-color: var(--kzc-white);
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-bold);
}

.kzc-photo-teaser__dot {
    flex: none;
    box-sizing: border-box;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background-color: currentColor;
}

.kzc-photo-teaser__status--offen      { color: var(--kzc-success); }
.kzc-photo-teaser__status--wenige     { color: var(--kzc-warn); }
.kzc-photo-teaser__status--ausgebucht { color: var(--kzc-warn); }
.kzc-photo-teaser__status--folgt      { color: var(--kzc-grey-700); }

.kzc-photo-teaser__status--ausgebucht .kzc-photo-teaser__dot,
.kzc-photo-teaser__status--folgt .kzc-photo-teaser__dot {
    background-color: transparent;
    border: 2px solid currentColor;
}

.kzc-photo-teaser__perk--icon {
    display: flex;
    align-items: center;
    gap: var(--kzc-space-2);
    padding-left: var(--kzc-space-4);
}

.kzc-photo-teaser__perk--icon::before {
    content: none;
}

.kzc-photo-teaser__perk-icon {
    flex: none;
}

.kzc-photo-teaser__actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--kzc-space-3) var(--kzc-space-5);
}

.kzc-photo-teaser__link {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    min-height: 44px;
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-white);
    text-decoration: none;
}

.kzc-photo-teaser__link:hover {
    color: var(--kzc-white);
    text-decoration: underline;
}

.kzc-photo-teaser__link:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
    border-radius: var(--kzc-radius-xs);
}

/* Layout Vollbild */
.kzc-photo-teaser--fullwidth {
    --kzc-pt-cut: var(--kzc-diagonal-px);
    --kzc-pt-edge: 5px;
    --kzc-pt-overlay: 22, 48, 60; /* wie --kzc-hero-overlay */
    min-height: 560px;
    background-color: var(--kzc-white);
}

.kzc-section.-bg-offwhite + .kzc-photo-teaser--fullwidth {
    background-color: var(--kzc-off-white);
}

.kzc-photo-teaser--fullwidth .kzc-photo-teaser__blade {
    display: block;
    z-index: 2;
    clip-path: polygon(0 var(--kzc-pt-cut), 100% 0, 100% var(--kzc-pt-edge), 0 calc(var(--kzc-pt-cut) + var(--kzc-pt-edge)));
}

/* Foto und Verlauf 1px unter die Linie gezogen (Subpixel-Nahtfix wie beim
   Hero). Grundfarbe dunkel, falls das Foto noch laedt. */
.kzc-photo-teaser--fullwidth .kzc-photo-teaser__image,
.kzc-photo-teaser--fullwidth::before {
    clip-path: polygon(0 calc(var(--kzc-pt-cut) + var(--kzc-pt-edge) - 1px), 100% calc(var(--kzc-pt-edge) - 1px), 100% 100%, 0 100%);
}

.kzc-photo-teaser--fullwidth .kzc-photo-teaser__image {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-position: 70% 40%;
    background-color: var(--kzc-bg-band);
}

.kzc-photo-teaser--fullwidth::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
    background: linear-gradient(
        90deg,
        rgba(var(--kzc-pt-overlay), 0.92) 0%,
        rgba(var(--kzc-pt-overlay), 0.72) 45%,
        rgba(var(--kzc-pt-overlay), 0.25) 100%
    );
}

.kzc-photo-teaser--fullwidth .kzc-photo-teaser__inner {
    padding-block: calc(var(--kzc-pt-cut) + var(--kzc-space-8)) var(--kzc-space-8);
}

.kzc-photo-teaser--fullwidth .kzc-photo-teaser__text {
    max-width: 36rem;
}

.kzc-photo-teaser--fullwidth .kzc-photo-teaser__headline {
    font-size: clamp(2.625rem, 5.6vw, 4.875rem);
    line-height: 0.98;
}

.kzc-photo-teaser--fullwidth .kzc-photo-teaser__headline-accent {
    color: var(--kzc-blue);
}

.kzc-photo-teaser--fullwidth .kzc-photo-teaser__perks {
    flex-direction: row;
    flex-wrap: wrap;
}

.kzc-photo-teaser--fullwidth .kzc-photo-teaser__perk {
    padding: 6px 12px;
    border: 1px solid rgba(255, 255, 255, 0.3);
    border-radius: var(--kzc-radius-pill);
    background-color: rgba(255, 255, 255, 0.08);
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-bold);
}

.kzc-photo-teaser--fullwidth .kzc-photo-teaser__perk:not(.kzc-photo-teaser__perk--icon) {
    padding-left: calc(12px + 1em);
}

.kzc-photo-teaser--fullwidth .kzc-photo-teaser__perk:not(.kzc-photo-teaser__perk--icon)::before {
    left: 12px;
}

@media (max-width: 1024px) {
    .kzc-photo-teaser--fullwidth .kzc-photo-teaser__text {
        max-width: 36rem;
    }
}

@media (max-width: 768px) {
    .kzc-photo-teaser--fullwidth {
        --kzc-pt-cut: 28px;
        display: flex;
        min-height: 0;
    }

    .kzc-photo-teaser--fullwidth .kzc-photo-teaser__blade {
        display: block;
    }

    .kzc-photo-teaser--fullwidth .kzc-photo-teaser__image {
        position: absolute;
        height: 100%;
    }

    .kzc-photo-teaser--fullwidth::before {
        background: linear-gradient(180deg, rgba(var(--kzc-pt-overlay), 0.78) 0%, rgba(var(--kzc-pt-overlay), 0.9) 100%);
    }

    .kzc-photo-teaser--fullwidth .kzc-photo-teaser__inner {
        padding-block: calc(var(--kzc-pt-cut) + var(--kzc-space-7)) var(--kzc-space-7);
    }

    .kzc-photo-teaser--fullwidth .kzc-photo-teaser__button {
        width: 100%;
    }
}

/* === kzc_list – Aufzählung (RSCE) ====================================
   Abschnittskopf (Eyebrow mit Klinge aus dem Sektions-Kopf-Block,
   Ueberschrift, Intro) + einfache Liste, Listenpunkt = kurze Weinrot-
   Klinge (--kzc-blade-skew). Referenz design-ref/KZC-Preise.html/.css
   ".proof-list". Sektions-Inhaltselement, oft in RockSolid Columns neben
   kzc_note_box. Listen-Spalten per Feld listColumns (1/2, ab 768px). */
.kzc-list,
.kzc-list * {
    box-sizing: border-box;
}

.kzc-list {
    padding-block: var(--kzc-space-8);
}

.kzc-list__head {
    margin-bottom: var(--kzc-space-5);
}

.kzc-list__headline {
    margin: 0;
    color: var(--kzc-petrol);
    font-size: var(--kzc-fs-h2);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
}

.kzc-list__intro {
    max-width: var(--kzc-w-prose);
    margin: var(--kzc-space-4) 0 0;
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-fg-mute);
}

.kzc-list__items {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    column-gap: var(--kzc-space-5);
    margin: 0;
    padding: 0;
    list-style: none;
}

.kzc-list__item {
    display: flex;
    align-items: baseline;
    gap: var(--kzc-space-3);
    padding-block: var(--kzc-space-3);
    border-bottom: 1px solid var(--kzc-border);
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-fg);
}

.kzc-list__item::before {
    content: "";
    flex: none;
    position: relative;
    top: -3px;
    width: 14px;
    height: 4px;
    background-color: var(--kzc-wine);
    transform: skewX(var(--kzc-blade-skew));
}

/* Begriff | Erklaerung (Definitionsliste), Referenz KZC-Preise.css
   ".rules": Begriff fett Petrol mit Trennlinie oben, Erklaerung grau.
   Grid zeilenweise (1, 2 / 3, 4), jede Kachel ein <div> im <dl>. */
.kzc-list__items--terms {
    column-gap: var(--kzc-space-7);
}

.kzc-list__term {
    padding-top: var(--kzc-space-4);
    border-top: 1px solid var(--kzc-border);
}

.kzc-list__term dt {
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-xbold);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-petrol);
}

.kzc-list__term dd {
    margin: var(--kzc-space-2) 0 var(--kzc-space-5);
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-grey-700);
}

.kzc-list__note {
    max-width: 76ch;
    margin: var(--kzc-space-6) 0 0;
    font-family: var(--kzc-font-mono);
    font-size: var(--kzc-fs-caption);
    line-height: var(--kzc-lh-relaxed);
    color: var(--kzc-grey-500);
}

/* Optionaler Textlink (30.09.2026), Optik wie .kzc-note-box__link */
.kzc-list__link {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    margin-top: var(--kzc-space-5);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-semi);
    color: var(--kzc-petrol);
    text-decoration: none;
}

.kzc-list__link:hover {
    text-decoration: underline;
}

.kzc-list__link-icon {
    flex: none;
}

/* Einspaltige Punkt-Liste auf Lesebreite (20.10.2026): ueber die volle
   Sektionsbreite liefen die Trennlinien sonst ueber 1320px (Kurse &
   Camps, Liste unter den Trainingsgruppen-Karten). Begriff-Listen und
   zweispaltige Listen bleiben breit. */
ul.kzc-list__items:not(.kzc-list__items--cols-2) {
    max-width: var(--kzc-w-prose);
}

@media (min-width: 768px) {
    .kzc-list__items--cols-2 {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

/* === kzc_note_box – Hinweis-Kasten (RSCE) ============================
   Abgesetzter Kasten mit Titel + Text und 6px-Kante links. Referenz
   design-ref/KZC-Preise.html/.css ".proof-note" (dunkel, blaue Kante).
   Zwei Ebenen: .kzc-note-box traegt den vertikalen Abstand wie jedes
   Sektions-Inhaltselement (in RockSolid Columns genullt), __box ist der
   sichtbare Kasten. Varianten: --dark (--kzc-bg-band wie die Aktuell-
   Leiste statt Ink aus der Referenz, Kundenwunsch 25.09.2026; blaue
   Kante – Blau
   ist hier nur Flaeche, kein Text) / --light (Off-White, Petrol-Kante,
   fuer weissen Grund). */
.kzc-note-box,
.kzc-note-box * {
    box-sizing: border-box;
}

.kzc-note-box {
    padding-block: var(--kzc-space-8);
}

.kzc-note-box__box {
    position: relative;
    overflow: hidden;
    padding: var(--kzc-space-6) var(--kzc-space-6) var(--kzc-space-6) calc(var(--kzc-space-6) + 6px);
    border-radius: var(--kzc-radius-md);
}

.kzc-note-box__box::before {
    content: "";
    position: absolute;
    inset: 0 auto 0 0;
    width: 6px;
}

.kzc-note-box__title {
    margin: 0 0 var(--kzc-space-3);
    font-size: var(--kzc-fs-h4);
    font-weight: var(--kzc-fw-xbold);
    line-height: var(--kzc-lh-snug);
}

.kzc-note-box__text {
    margin: 0;
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-relaxed);
}

.kzc-note-box__text + .kzc-note-box__text {
    margin-top: var(--kzc-space-3);
}

.kzc-note-box--dark .kzc-note-box__box {
    background-color: var(--kzc-bg-band);
    color: var(--kzc-fg-on-dark);
}

.kzc-note-box--dark .kzc-note-box__box::before {
    background-color: var(--kzc-blue);
}

.kzc-note-box--dark .kzc-note-box__title {
    color: var(--kzc-fg-on-dark);
}

.kzc-note-box--light .kzc-note-box__box {
    background-color: var(--kzc-off-white);
    border: 1px solid var(--kzc-border);
    color: var(--kzc-fg);
}

.kzc-note-box--light .kzc-note-box__box::before {
    background-color: var(--kzc-petrol);
}

.kzc-note-box--light .kzc-note-box__title {
    color: var(--kzc-petrol);
}

/* Eyebrow (29.09.2026): Farbe wie alle Eyebrows der Website (Blau,
   .kzc-eyebrow aus colors_and_type.css), keine Sonderfarbe. */
.kzc-note-box__eyebrow {
    margin: 0 0 var(--kzc-space-2);
    max-width: none;
}

/* Ecke als Wiedererkennungsmerkmal der hellen Variante (29.09.2026,
   Kundenwunsch, Referenz ".starter::after"): blasses blaues Dreieck oben
   rechts, rein dekorativ. Bewusst NUR hier, bei kzc_stats /
   kzc_price_overview weiterhin keine Ecke (dort lenkt sie von der Zahl
   ab). */
.kzc-note-box--light .kzc-note-box__box::after {
    content: "";
    position: absolute;
    top: 0;
    right: 0;
    width: 64px;
    height: 64px;
    background-color: var(--kzc-blue);
    opacity: 0.12;
    clip-path: polygon(100% 0, 0 0, 100% 100%);
    pointer-events: none;
}

/* Optionaler Textlink (29.09.2026). Hell: Petrol (AA auf Off-White),
   dunkel: Weiss, Unterstreichung als Link-Hinweis. */
.kzc-note-box__link {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    margin-top: var(--kzc-space-4);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-semi);
    text-decoration: none;
}

.kzc-note-box__link:hover {
    text-decoration: underline;
}

.kzc-note-box__link-icon {
    flex: none;
}

.kzc-note-box--light .kzc-note-box__link {
    color: var(--kzc-petrol);
}

.kzc-note-box--dark .kzc-note-box__link {
    color: var(--kzc-white);
}

/* === kzc_cta_band – Aktions-Band (RSCE) ==============================
   Petrol-Band ueber die volle Breite, schraege Weinrot-Oberkante (links
   10px, rechts 4px, Klingen-Motiv), grosse Ueberschrift in Versalien,
   kurzer Text, bis zu zwei Buttons rechts. Referenz design-ref/
   KZC-Preise.html/.css ".price-cta". Vollbild-Element wie kzc_stats
   (Full-Bleed per margin-inline, eigener Grund + Zentrierung).
   Buttons: hell gefuellt (Petrol-Text) / Ghost – bewusst kein Weinrot-
   Button auf Petrol, die Kante traegt den Akzent. Unter 1024px stehen
   Text und Buttons untereinander (wie Referenz). */
.kzc-cta-band,
.kzc-cta-band * {
    box-sizing: border-box;
}

.kzc-cta-band {
    position: relative;
    overflow: hidden;
    margin-inline: calc(50% - 50vw);
    background-color: var(--kzc-petrol);
    color: var(--kzc-fg-on-dark);
}

.kzc-cta-band::before {
    content: "";
    position: absolute;
    inset: 0 0 auto 0;
    height: 10px;
    background-color: var(--kzc-wine);
    clip-path: polygon(0 0, 100% 0, 100% 40%, 0 100%);
}

.kzc-cta-band__inner {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: var(--kzc-space-6);
    max-width: var(--kzc-container-max);
    margin-inline: auto;
    padding-block: var(--kzc-space-8);
    padding-inline: var(--kzc-section-padding-x);
}

.kzc-cta-band__headline {
    max-width: 22ch;
    margin: 0;
    color: var(--kzc-fg-on-dark);
    font-size: var(--kzc-fs-h2);
    font-weight: var(--kzc-fw-xbold);
    line-height: var(--kzc-lh-tight);
    letter-spacing: -0.01em;
    text-transform: uppercase;
}

.kzc-cta-band__lead {
    max-width: 46ch;
    margin: var(--kzc-space-3) 0 0;
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-normal);
    color: rgba(255, 255, 255, 0.85);
}

.kzc-cta-band__buttons {
    display: flex;
    flex-wrap: wrap;
    gap: var(--kzc-space-3);
    flex: none;
}

.kzc-cta-band__button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--kzc-space-2);
    padding: var(--kzc-space-4) var(--kzc-space-5);
    border: 1.5px solid transparent;
    border-radius: var(--kzc-radius-md);
    font-size: var(--kzc-fs-body);
    font-weight: var(--kzc-fw-bold);
    text-decoration: none;
    transition: transform var(--kzc-dur-fast) var(--kzc-ease-out), background-color var(--kzc-dur-base) var(--kzc-ease-out), border-color var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-cta-band__button-icon {
    flex: none;
}

.kzc-cta-band__button:hover {
    text-decoration: none;
    transform: translateY(-1px);
}

.kzc-cta-band__button:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
}

.kzc-cta-band__button--light {
    background-color: var(--kzc-white);
    color: var(--kzc-petrol);
}

.kzc-cta-band__button--light:hover {
    background-color: var(--kzc-off-white);
    color: var(--kzc-petrol);
}

.kzc-cta-band__button--ghost {
    background-color: transparent;
    border-color: rgba(255, 255, 255, 0.42);
    color: var(--kzc-white);
}

.kzc-cta-band__button--ghost:hover {
    background-color: rgba(255, 255, 255, 0.1);
    border-color: var(--kzc-white);
    color: var(--kzc-white);
}

/* Farbe Off-White (Feld theme, 30.09.2026): fuer Baender direkt vor einer
   dunklen Flaeche (Footer). Kante Petrol statt Weinrot (gleiche Form),
   damit der Weinrot-Button der einzige Weinrot-Akzent im Band bleibt
   (Kundenfeedback 30.09.2026). Schrift Petrol/Ink, Ghost als Petrol-
   Kontur, "Buchen" als Weinrot-Button (auf hellem Grund erlaubt,
   CLAUDE.md Farbeinsatz). */
.kzc-cta-band--offwhite {
    background-color: var(--kzc-off-white);
    color: var(--kzc-fg);
}

.kzc-cta-band--offwhite::before {
    background-color: var(--kzc-petrol);
}

.kzc-cta-band--offwhite .kzc-cta-band__headline {
    color: var(--kzc-petrol);
}

.kzc-cta-band--offwhite .kzc-cta-band__lead {
    color: var(--kzc-grey-700);
}

.kzc-cta-band--offwhite .kzc-cta-band__button:focus-visible {
    box-shadow: var(--kzc-ring-focus);
}

.kzc-cta-band--offwhite .kzc-cta-band__button--light {
    border-color: var(--kzc-border);
}

.kzc-cta-band--offwhite .kzc-cta-band__button--light:hover {
    background-color: var(--kzc-white);
    border-color: var(--kzc-petrol);
}

.kzc-cta-band--offwhite .kzc-cta-band__button--ghost {
    border-color: var(--kzc-petrol);
    color: var(--kzc-petrol);
}

.kzc-cta-band--offwhite .kzc-cta-band__button--ghost:hover {
    background-color: var(--kzc-white);
    border-color: var(--kzc-petrol);
    color: var(--kzc-petrol);
}

.kzc-cta-band__button--book {
    background-color: var(--kzc-wine);
    color: var(--kzc-white);
}

.kzc-cta-band__button--book:hover {
    background-color: var(--kzc-wine-hover);
    color: var(--kzc-white);
}

@media (min-width: 1024px) {
    .kzc-cta-band__inner {
        flex-direction: row;
        align-items: center;
        justify-content: space-between;
        gap: var(--kzc-space-7);
    }
}

/* Kante unten (Feld edge, 06.10.2026): gleiche Form, vertikal
   gespiegelt (links 10px, rechts 4px). Fuer Baender direkt unter einer
   dunklen Flaeche (Aktuell-Leiste), die Kante schliesst dann zum
   hellen Inhalt darunter ab. */
.kzc-cta-band--edge-bottom::before {
    inset: auto 0 0 0;
    clip-path: polygon(0 0, 100% 60%, 100% 100%, 0 100%);
}

/* Ueberschrift Zeile 2 (Feld headlineAccent): eigene Zeile. Auf Off-
   White Zeile 1 Ink, Zeile 2 Petrol – Blau wie im Hero reisst auf Off-
   White auch fuer grosse Schrift AA (~2.9:1). Auf Petrol bleibt beides
   weiss (Blau auf Petrol ~2:1), dort wirkt nur der Umbruch. */
.kzc-cta-band__headline-accent {
    display: block;
}

.kzc-cta-band--offwhite .kzc-cta-band__headline:has(.kzc-cta-band__headline-accent) {
    color: var(--kzc-ink);
}

.kzc-cta-band--offwhite .kzc-cta-band__headline-accent {
    color: var(--kzc-petrol);
}

/* Foto (Feld image): kleines Parallelogramm, Schraege ueber
   --kzc-cta-band-slant. Mobil flacher Streifen ueber dem Text (steht im
   DOM zuerst), ab 1024px rechte Spalte neben Text und Buttons. Der
   Ausschnitt kommt aus object-fit, die Bildgroesse liefert nur die
   Aufloesung. */
.kzc-cta-band__media {
    --kzc-cta-band-slant: 20px;
    align-self: stretch;
    aspect-ratio: 3 / 1;
    overflow: hidden;
    background-color: var(--kzc-bg-band);
    clip-path: polygon(var(--kzc-cta-band-slant) 0, 100% 0, calc(100% - var(--kzc-cta-band-slant)) 100%, 0 100%);
}

.kzc-cta-band__media picture,
.kzc-cta-band__image {
    display: block;
    width: 100%;
    height: 100%;
}

.kzc-cta-band__image {
    object-fit: cover;
}

.kzc-cta-band--has-image .kzc-cta-band__inner {
    padding-block: var(--kzc-space-7);
}

@media (min-width: 1024px) {
    .kzc-cta-band--has-image .kzc-cta-band__inner {
        display: grid;
        grid-template-columns: minmax(0, 1fr) auto clamp(260px, 26vw, 380px);
        grid-template-areas: "text buttons media";
        align-items: center;
        gap: var(--kzc-space-7);
    }

    .kzc-cta-band--has-image .kzc-cta-band__text {
        grid-area: text;
    }

    .kzc-cta-band--has-image .kzc-cta-band__buttons {
        grid-area: buttons;
    }

    .kzc-cta-band__media {
        --kzc-cta-band-slant: 36px;
        grid-area: media;
        aspect-ratio: 2 / 1;
    }
}

@media (prefers-reduced-motion: reduce) {
    .kzc-cta-band__button {
        transition: none;
    }

    .kzc-cta-band__button:hover {
        transform: none;
    }
}


/* === kzc-breadcrumb – Navigationspfad (Kern-Modul) =====================
   Contao-Modul "Navigationspfad" (CSS-Klasse kzc-breadcrumb, Template-
   Erweiterung templates/mod_breadcrumb.html.twig), sitzt im Layout-
   Bereich Tagline nach dem Header-Artikel (Hero + Aktuell-Leiste), siehe
   templates/fe_page_kzc.html5. Startseite: eigenes Layout ohne Modul.
   Schmale helle Zeile mit 1px-Unterkante als Abschluss zum Inhalt
   (sonst verschwimmt sie mit einem folgenden weissen Abschnitt), kein
   eigener dunkler Grund (die dunkle Zone Keil + Leiste wuerde sonst
   noch hoeher). Referenz design-ref/KZC-Grundkurs.css ".crumbs".
   Zweistufig wie .kzc-section: <nav> volle Breite, <ul> Inhaltsbreite.
   ====================================================================== */
.kzc-breadcrumb {
    background-color: var(--kzc-bg);
    border-bottom: 1px solid var(--kzc-border);
}

.kzc-breadcrumb ul {
    box-sizing: border-box;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--kzc-space-1) 0;
    max-width: var(--kzc-container-max);
    margin: 0 auto;
    padding: var(--kzc-space-3) var(--kzc-section-padding-x);
    list-style: none;
    font-size: var(--kzc-fs-caption);
    line-height: 1.4;
    color: var(--kzc-fg-mute);
}

.kzc-breadcrumb li {
    display: inline-flex;
    align-items: center;
}

/* Trenner als CSS-Inhalt, nicht im Markup: wird von Screenreadern
   nicht als eigener Eintrag vorgelesen. */
.kzc-breadcrumb li + li::before {
    content: "/";
    margin-inline: var(--kzc-space-2);
    color: var(--kzc-grey-300);
}

.kzc-breadcrumb a {
    color: var(--kzc-fg-mute);
    text-decoration: none;
}

.kzc-breadcrumb a:hover {
    color: var(--kzc-petrol);
    text-decoration: underline;
}

.kzc-breadcrumb .active {
    color: var(--kzc-petrol);
    font-weight: var(--kzc-fw-semi);
}


/* === content-text – Contao-Text-Element (Kern, kein RSCE) ==============
   Contaos eigenes Element "Text" (TinyMCE, Markup: .content-text >
   [h2] + .rte > p/ul/ol), fuer Fliesstext in Sektionen (29.09.2026,
   erster Einsatz Grundkurs-Intro). Verhaelt sich wie ein Sektions-
   Inhaltselement: traegt den vertikalen Abstand selbst (in RockSolid
   Columns genullt, siehe kzc-grid.css), keine eigene Breite.
   Links in Petrol mit Unterstreichung statt dem globalen --kzc-link
   (Blau, reisst AA fuer kleinen Text auf Weiss). Listen mit Petrol-▸
   (CLAUDE.md Icons/Aufzaehlungen).
   Einleitungston: CSS-Klasse "kzc-lead" am Element (Backend: Experten-
   Einstellungen > CSS-ID/Klasse), vergroessert den ersten Absatz,
   Fettes darin in Petrol (Referenz ".k-intro .lead strong").
   Link-Farbe: Petrol. Ausnahme Buchungs-Sprunglinks (z. B. "#buchen"):
   CSS-Klasse "kzc-link-book" am <a> im Editor ODER automatisch fuer
   Links, die auf "#buchen" enden -> Weinrot, weil sie zur Buchung fuehren
   (CLAUDE.md Farbeinsatz, Entscheidung 29.09.2026). Anker im Editor immer
   als {{link_url::ID}}#buchen eintragen, ein nacktes "#buchen" zeigt
   wegen <base href> auf die Startseite (01.10.2026).
   ====================================================================== */
.content-text {
    padding-block: var(--kzc-space-8);
}

.content-text > h2,
.content-text > h3 {
    margin-bottom: var(--kzc-space-5);
}

.content-text .rte > :last-child {
    margin-bottom: 0;
}

.content-text .rte p,
.content-text .rte li {
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-relaxed);
    color: var(--kzc-fg);
}

.content-text .rte a {
    color: var(--kzc-petrol);
    font-weight: var(--kzc-fw-semi);
    text-decoration: underline;
    text-decoration-thickness: 1px;
}

.content-text .rte a:hover {
    color: var(--kzc-link-hover);
    text-decoration-thickness: 2px;
}

.content-text .rte ul {
    max-width: var(--kzc-w-prose);
    margin: 0 0 var(--kzc-space-4);
    padding: 0;
    list-style: none;
}

.content-text .rte ul > li {
    position: relative;
    padding-left: var(--kzc-space-5);
}

.content-text .rte ul > li + li {
    margin-top: var(--kzc-space-2);
}

.content-text .rte ul > li::before {
    /* Weinrot-Klinge wie kzc_list / Checklisten-Karten (29.09.2026) */
    content: "";
    position: absolute;
    left: 0;
    top: 0.72em;
    width: 12px;
    height: 4px;
    background-color: var(--kzc-wine);
    transform: skewX(var(--kzc-blade-skew));
}

.content-text .rte ol {
    max-width: var(--kzc-w-prose);
    margin: 0 0 var(--kzc-space-4);
    padding-left: var(--kzc-space-5);
}

.content-text.kzc-lead .rte strong {
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-petrol);
}

.content-text .rte a[href$="#buchen"],
.content-text .rte a.kzc-link-book {
    color: var(--kzc-wine);
}

.content-text .rte a[href$="#buchen"]:hover,
.content-text .rte a.kzc-link-book:hover {
    color: var(--kzc-wine-hover);
}

.content-text.kzc-lead .rte > p:first-child {
    font-size: var(--kzc-fs-h4);
    line-height: var(--kzc-lh-normal);
    font-weight: var(--kzc-fw-regular);
    color: var(--kzc-ink);
}


/* --- kzc_price_overview: Kartenfarbe dunkel (29.09.2026) ---------------
   Referenz design-ref/KZC-Grundkurs.css ".fact.price": Petrol-Flaeche,
   weisse Schrift, 6px schraege Weinrot-Oberkante (gleiche Geometrie wie
   .kzc-explain-cards__card::before, Weinrot = kleiner Akzent). Nur fuer
   Darstellung "Karten". Betrag groesser als bei hellen Karten, weil die
   dunkle Box meist allein steht (Kursseite). */
.kzc-price-overview--dark .kzc-price-overview__card {
    position: relative;
    overflow: hidden;
    background-color: var(--kzc-petrol);
    border-color: var(--kzc-petrol);
    color: var(--kzc-white);
    padding-top: calc(var(--kzc-space-6) + 6px);
}

.kzc-price-overview--dark .kzc-price-overview__card::before {
    content: "";
    position: absolute;
    inset: 0 0 auto 0;
    height: 6px;
    background-color: var(--kzc-wine);
    clip-path: polygon(0 0, 100% 0, 100% 40%, 0 100%);
}

.kzc-price-overview--dark .kzc-price-overview__label,
.kzc-price-overview--dark .kzc-price-overview__price {
    color: var(--kzc-white);
}

.kzc-price-overview--dark .kzc-price-overview__price {
    font-size: clamp(2.5rem, 1.6rem + 3vw, 3.75rem);
    letter-spacing: -0.02em;
}

.kzc-price-overview--dark .kzc-price-overview__note {
    color: rgba(255, 255, 255, 0.82);
    font-size: var(--kzc-fs-body-sm);
}

/* === Gleich hohe Spalten (.kzc-columns-equal): Element-Anteil ==========
   Gegenstueck zu .kzc-columns-equal in kzc-grid.css. Dort fuellt das
   Element die Spalte, hier strecken sich die Karten mit. Nur fuer
   Elemente mit genau EINER Kartenreihe sinnvoll:
   - kzc_price_overview mit einem Tarif (Grundkurs: Preiskarte links),
   - kzc_checklist_cards (Grid-Zeilen teilen sich die Hoehe ohnehin).
   ====================================================================== */
.kzc-columns-equal .kzc-price-overview,
.kzc-columns-equal .kzc-price-overview__tabswrap,
.kzc-columns-equal .kzc-price-overview__panel:not([hidden]) {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
}

.kzc-columns-equal .kzc-price-overview__grid {
    flex: 1 1 auto;
}

/* Einzelne Preiskarte ist sonst auf 320px begrenzt (--items-1), hier
   fuellt sie die Spalte. */
.kzc-columns-equal .kzc-price-overview__grid--items-1 {
    grid-template-columns: minmax(0, 1fr);
}

.kzc-columns-equal .kzc-checklist-cards {
    display: flex;
    flex-direction: column;
}

.kzc-columns-equal .kzc-checklist-cards__grid {
    flex: 1 1 auto;
}


/* === kzc_cta_box – Aktions-Kasten (RSCE) ===============================
   Heller Kasten im Abschnitt: Titel + Text links, EIN Weinrot-Button
   rechts (Buchen-Rolle, CLAUDE.md Farbeinsatz), optionale Hinweiszeile.
   Referenz design-ref/KZC-Grundkurs.css ".book-row" / ".book-vl" /
   ".vl-note". Sektions-Inhaltselement, traegt padding-block selbst.
   Box-Optik wie die Karten (--kzc-bg, 1px --kzc-border, shadow-1).
   Der gruene Punkt vor der Hinweiszeile aus der Referenz (".pulse")
   bewusst NICHT uebernommen: Gruen heisst bei uns "freie Plaetze"
   (Signalfarbe), ohne Live-Feed waere das eine falsche Aussage
   (Vertical Life, Briefing D1).
   Mobile Buchungsleiste (__sticky, Referenz ".k-sticky"): siehe unten.
   ====================================================================== */
.kzc-cta-box,
.kzc-cta-box * {
    box-sizing: border-box;
}

.kzc-cta-box {
    padding-block: var(--kzc-space-8);
}

.kzc-cta-box__box {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: var(--kzc-space-5);
    padding: var(--kzc-space-5);
    background-color: var(--kzc-bg);
    border: 1px solid var(--kzc-border);
    border-radius: var(--kzc-radius-md);
    box-shadow: var(--kzc-shadow-1);
}

.kzc-cta-box__body {
    min-width: 0;
}

.kzc-cta-box__title {
    margin: 0;
    font-size: var(--kzc-fs-h4);
    font-weight: var(--kzc-fw-xbold);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-petrol);
}

.kzc-cta-box__text {
    margin: var(--kzc-space-1) 0 0;
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-grey-700);
}

.kzc-cta-box__button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--kzc-space-2);
    padding: var(--kzc-space-4) var(--kzc-space-6);
    border-radius: var(--kzc-radius-md);
    background-color: var(--kzc-cta);
    color: var(--kzc-cta-fg);
    font-size: var(--kzc-fs-body);
    font-weight: var(--kzc-fw-bold);
    text-decoration: none;
    transition: background-color var(--kzc-dur-base) var(--kzc-ease-out), transform var(--kzc-dur-fast) var(--kzc-ease-out);
}

.kzc-cta-box__button:hover {
    background-color: var(--kzc-wine-hover);
    color: var(--kzc-cta-fg);
    text-decoration: none;
    transform: translateY(-1px);
}

.kzc-cta-box__button:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

.kzc-cta-box__button-icon {
    flex: none;
}

.kzc-cta-box__hint {
    margin: var(--kzc-space-3) 0 0;
    font-size: var(--kzc-fs-caption);
    color: var(--kzc-grey-500);
}

@media (min-width: 768px) {
    .kzc-cta-box__box {
        flex-direction: row;
        align-items: center;
        justify-content: space-between;
        gap: var(--kzc-space-6);
        padding: var(--kzc-space-5) var(--kzc-space-6);
    }
    .kzc-cta-box__button {
        flex: none;
    }
}

/* Eyebrow und Anfrage-Button (05.10.2026, Trainerstunde auf Kurse &
   Camps): Petrol statt Weinrot, wenn der Button nur zum Kontaktformular
   fuehrt (Weinrot = Buchen). */
.kzc-cta-box__eyebrow {
    margin: 0 0 var(--kzc-space-1);
}

.kzc-cta-box__button--request {
    background-color: var(--kzc-petrol);
    color: var(--kzc-white);
}

.kzc-cta-box__button--request:hover {
    background-color: var(--kzc-petrol-hover);
    color: var(--kzc-white);
}

/* Icon vor dem Titel (Feld "Icon", 06.10.2026, Wetter-Hinweis auf
   Erleben & Buchen). Feld wie die Icon-Box der Erklaer-Karten, etwas
   groesser. Der Text-Block nimmt den Platz zwischen Icon und Button. */
.kzc-cta-box__icon {
    display: grid;
    flex: none;
    place-items: center;
    width: 48px;
    height: 48px;
    background-color: var(--kzc-off-white);
    color: var(--kzc-petrol);
    border-radius: var(--kzc-radius-sm);
}

@media (min-width: 768px) {
    .kzc-cta-box__icon + .kzc-cta-box__body {
        flex: 1 1 auto;
    }
}

/* Mobile Buchungsleiste: nur unter 1024px. Ausgangszustand im Markup
   [hidden] (ohne JS nie sichtbar). kzc-components.js entfernt [hidden]
   und schaltet .is-visible; unsichtbar = visibility:hidden, damit die
   Leiste dann auch nicht per Tab erreichbar ist. z-index 50: unter dem
   Sticky-Header (60) und dem Burgermenue-Drawer (99/100). Platz unten
   reserviert body.kzc-has-cta-sticky (Klasse setzt das JS). */
.kzc-cta-box__sticky {
    display: none;
}

@media (max-width: 1023px) {
    .kzc-cta-box__sticky:not([hidden]) {
        display: flex;
        position: fixed;
        inset: auto 0 0;
        z-index: 50;
        padding: var(--kzc-space-3) var(--kzc-section-padding-x) calc(var(--kzc-space-3) + env(safe-area-inset-bottom));
        background-color: rgba(255, 255, 255, 0.96);
        border-top: 1px solid var(--kzc-border);
        box-shadow: var(--kzc-shadow-2);
        visibility: hidden;
        transform: translateY(100%);
        transition: transform var(--kzc-dur-base) var(--kzc-ease-out), visibility 0s linear var(--kzc-dur-base);
    }
    .kzc-cta-box__sticky.is-visible {
        visibility: visible;
        transform: none;
        transition: transform var(--kzc-dur-base) var(--kzc-ease-out), visibility 0s;
    }
    .kzc-cta-box__button--sticky {
        flex: 1 1 auto;
        padding: var(--kzc-space-3) var(--kzc-space-4);
    }
    body.kzc-has-cta-sticky {
        padding-bottom: 76px;
    }
}

@media (prefers-reduced-motion: reduce) {
    .kzc-cta-box__button,
    .kzc-cta-box__sticky,
    .kzc-cta-box__sticky.is-visible {
        transition: none;
    }
    .kzc-cta-box__button:hover {
        transform: none;
    }
}


/* === kzc_media_text – Bild mit Text (RSCE) =============================
   Foto neben kurzem Textblock, Referenz design-ref/KZC-Grundkurs.css
   ".trainer". Sektions-Inhaltselement (padding-block selbst). Bild 3:2
   wie die Kartenbilder, dezenter Diagonalschnitt an der Unterkante
   (22px wie --kzc-cards-cut). Mobil: eine Spalte, Bild oben. Ab 768px
   zwei Spalten (Bild etwas schmaler als Text, wie Referenz), Modifier
   --image-right tauscht die Seiten nur optisch (DOM bleibt Bild, Text).
   ====================================================================== */
.kzc-media-text,
.kzc-media-text * {
    box-sizing: border-box;
}

.kzc-media-text {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--kzc-space-6);
    align-items: center;
    padding-block: var(--kzc-space-8);
}

.kzc-media-text__media {
    overflow: hidden;
    border-radius: var(--kzc-radius-md);
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 calc(100% - 22px));
}

.kzc-media-text__image {
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: 3 / 2;
    object-fit: cover;
}

.kzc-media-text__body {
    min-width: 0;
}

.kzc-media-text__eyebrow {
    margin: 0 0 var(--kzc-space-2);
}

.kzc-media-text__headline {
    margin: 0 0 var(--kzc-space-4);
    color: var(--kzc-petrol);
}

.kzc-media-text__text {
    margin: 0;
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-relaxed);
    color: var(--kzc-fg);
}

.kzc-media-text__text + .kzc-media-text__text {
    margin-top: var(--kzc-space-3);
}

.kzc-media-text__link {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    margin-top: var(--kzc-space-5);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-petrol);
    text-decoration: none;
}

.kzc-media-text__link:hover {
    text-decoration: underline;
}

/* Link 1 als Buchen-Button (Feld linkStyle, 05.10.2026, Eltern sichern
   Kinder auf Kurse & Camps). Weinrot nur fuer Buchungen. Neben einem
   Textlink (link2) per align-items mittig. */
.kzc-media-text__links:has(.kzc-media-text__book) {
    align-items: center;
}

.kzc-media-text__book {
    display: inline-flex;
    align-items: center;
    gap: var(--kzc-space-2);
    margin-top: var(--kzc-space-5);
    min-height: 48px;
    padding: 0 var(--kzc-space-5);
    border-radius: var(--kzc-radius-md);
    background-color: var(--kzc-cta);
    color: var(--kzc-cta-fg);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-bold);
    text-decoration: none;
    transition: background-color var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-media-text__book:hover {
    background-color: var(--kzc-wine-hover);
    color: var(--kzc-cta-fg);
}

.kzc-media-text__book:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

.kzc-media-text__fact-icon {
    flex: none;
    margin-right: 6px;
}

.kzc-media-text__link-icon {
    flex: none;
}

@media (min-width: 768px) {
    .kzc-media-text--single {
        grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr);
        gap: var(--kzc-space-7);
    }
    .kzc-media-text--image-right {
        grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
    }
    .kzc-media-text--image-right .kzc-media-text__media {
        order: 2;
    }
    /* Ohne Bild (06.10.2026, Abschnittskopf mit Pillen auf Erleben &
       Buchen): eine Spalte, Text auf Lesebreite wie ein Sektions-Kopf. */
    .kzc-media-text--single:not(:has(> .kzc-media-text__media)) {
        grid-template-columns: minmax(0, 1fr);
    }
    .kzc-media-text--single:not(:has(> .kzc-media-text__media)) .kzc-media-text__body {
        max-width: var(--kzc-w-prose);
    }
}

/* --- Erweiterung 01.10.2026: Pillen, Zusatzzeilen, zwei Links, Layouts
   "split" (Text neben 2 versetzten Fotos) und "row" (Text oben, Fotoreihe
   aus 2 bis 4 Fotos). Referenz design-ref/KZC-Klettern-Halle.css
   ".kh-block". Seitenverhaeltnisse fest je Layout und Position, die
   Bildgroesse liefert nur Aufloesung (object-fit). Mobil (<768px) werden
   die Fotos zur wischbaren Reihe (scroll-snap, 80 % Breite, 4:5), die
   ueber den Sektionsrand bis an die Bildschirmkante laeuft. Unter
   1024px stehen Text und Fotos untereinander. */

.kzc-media-text__facts {
    display: flex;
    flex-wrap: wrap;
    gap: var(--kzc-space-2);
    margin: var(--kzc-space-5) 0 0;
    padding: 0;
    list-style: none;
}

.kzc-media-text__fact {
    display: inline-flex;
    align-items: center;
    padding: 7px 13px;
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-bold);
    line-height: 1.3;
    color: var(--kzc-petrol);
    background: var(--kzc-white);
    border: 1px solid color-mix(in srgb, var(--kzc-blue) 45%, transparent);
    border-radius: var(--kzc-radius-pill);
}

/* Zusatzzeilen (05.10.2026 umgestellt auf das Muster .kh-dl aus
   design-ref/KZC-Kurse-Camps): <dl>, Begriff mit Weinrot-Klinge in
   Petrol, ab 768px Begriff und Text nebeneinander mit Trennlinien. */
.kzc-media-text__extras {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    margin: var(--kzc-space-5) 0 0;
    border-top: 1px solid var(--kzc-border);
}

.kzc-media-text__extra-label {
    display: flex;
    align-items: center;
    gap: 10px;
    margin: 0;
    padding: 12px 0 0;
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-bold);
    line-height: 1.5;
    color: var(--kzc-petrol);
}

.kzc-media-text__extra-label::before {
    content: "";
    flex: none;
    width: 14px;
    height: 4px;
    background-color: var(--kzc-wine);
    transform: skewX(var(--kzc-blade-skew));
}

.kzc-media-text__extra-text {
    margin: 0;
    padding: 4px 0 12px;
    border-bottom: 1px solid var(--kzc-border);
    font-size: var(--kzc-fs-body-sm);
    line-height: 1.5;
    color: var(--kzc-fg);
}

.kzc-media-text__extra-text--full {
    padding-top: 12px;
}

@media (min-width: 768px) {
    .kzc-media-text__extras {
        grid-template-columns: auto minmax(0, 1fr);
        column-gap: var(--kzc-space-5);
    }

    .kzc-media-text__extra-label,
    .kzc-media-text__extra-text {
        padding: 12px 0;
        border-bottom: 1px solid var(--kzc-border);
    }

    .kzc-media-text__extra-text--full {
        grid-column: 1 / -1;
    }
}

.kzc-media-text__links {
    display: flex;
    flex-wrap: wrap;
    gap: 0 var(--kzc-space-6);
}

.kzc-media-text--split,
.kzc-media-text--row {
    gap: var(--kzc-space-7) var(--kzc-space-8);
}

.kzc-media-text--split .kzc-media-text__headline,
.kzc-media-text--row .kzc-media-text__headline {
    margin-bottom: var(--kzc-space-4);
}

.kzc-media-text__text {
    max-width: 56ch;
}

/* Fotos: Grundzustand = Handy, wischbare Reihe bis an den Rand */
.kzc-media-text__gallery {
    display: flex;
    gap: var(--kzc-space-3);
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    margin-inline: calc(-1 * var(--kzc-section-padding-x));
    padding-inline: var(--kzc-section-padding-x);
    scroll-padding-inline: var(--kzc-section-padding-x);
    scrollbar-width: none;
}

.kzc-media-text__gallery::-webkit-scrollbar {
    display: none;
}

.kzc-media-text__gallery:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

.kzc-media-text__fig {
    flex: 0 0 80%;
    min-width: 0;
    aspect-ratio: 4 / 5;
    overflow: hidden;
    border-radius: var(--kzc-radius-md);
    scroll-snap-align: start;
}

.kzc-media-text__fig picture {
    display: block;
    height: 100%;
}

.kzc-media-text__gallery-image {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

@media (min-width: 768px) {
    .kzc-media-text__gallery {
        display: grid;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: var(--kzc-space-4);
        overflow: visible;
        margin-inline: 0;
        padding-inline: 0;
    }
    .kzc-media-text__fig {
        aspect-ratio: 4 / 3;
    }

    /* split: groesseres erstes Foto, zweites versetzt */
    .kzc-media-text--split .kzc-media-text__gallery {
        grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr);
        align-items: end;
    }
    .kzc-media-text--split .kzc-media-text__fig:first-child {
        aspect-ratio: 16 / 10;
    }

    /* row: Spalten aus der Anzahl */
    .kzc-media-text--items-3 .kzc-media-text__gallery {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

@media (min-width: 1024px) {
    .kzc-media-text--split {
        grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
        align-items: center;
    }
    .kzc-media-text--split.kzc-media-text--image-left {
        grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
    }
    .kzc-media-text--image-left .kzc-media-text__gallery {
        order: -1;
    }
    .kzc-media-text--split .kzc-media-text__fig:nth-child(2) {
        margin-bottom: var(--kzc-space-7);
    }

    .kzc-media-text--row .kzc-media-text__body {
        display: grid;
        grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
        gap: var(--kzc-space-2) var(--kzc-space-8);
        align-items: start;
    }
    .kzc-media-text--row .kzc-media-text__headline {
        margin-bottom: 0;
    }
    .kzc-media-text--items-4 .kzc-media-text__gallery {
        grid-template-columns: repeat(4, minmax(0, 1fr));
    }
    .kzc-media-text--items-4 .kzc-media-text__fig {
        aspect-ratio: 4 / 5;
    }
}


/* === Sektions-Rhythmus: mehrere Elemente in EINER Sektion ==============
   Jedes Sektions-Inhaltselement traegt padding-block space-8 selbst
   (CLAUDE.md). Stehen mehrere in derselben Sektion untereinander (z. B.
   Grundkurs "Kursdaten": Spalten, Aktions-Kasten, Erklaer-Karten),
   addierten sich unten + oben zu 128px. Jetzt: zwischen zwei Elementen
   derselben Sektion space-6 (nur das untere behaelt einen reduzierten
   Abstand, das obere des Folgeelements entfaellt), an den Sektions-
   Raendern bleibt space-8. Spezifitaet (0,2,0), weil kzc-grid.css im
   Layout NACH components.css geladen wird und .rs-columns dort sein
   eigenes padding-block setzt. Der Sektions-Kopf (.kzc-section__head)
   regelt seinen Anschluss selbst (siehe Sektions-Kopf-Block). */
/* Vollbild-Elemente in einer Sektion (z. B. Foto-Teaser zwischen zwei
   Preis-Uebersichten auf der Preise-Seite) sind ausgenommen: das Element
   danach und davor behaelt seinen vollen Abstand, das Vollbild-Element
   selbst bleibt unangetastet (sonst Befund Staging 30.09.2026: Eyebrow
   klebte direkt unter dem Foto-Teaser, Teaser bekam 24px Petrol extra). */
.kzc-section .kzc-section-inner > :not(.kzc-section__head, .kzc-photo-teaser, .kzc-split-diagonal, .kzc-stats, .kzc-cta-band) + :not(.kzc-photo-teaser, .kzc-split-diagonal, .kzc-stats, .kzc-cta-band) {
    padding-top: 0;
}

.kzc-section .kzc-section-inner > :not(.kzc-section__head, .kzc-photo-teaser, .kzc-split-diagonal, .kzc-stats, .kzc-cta-band):has(+ :not(.kzc-photo-teaser, .kzc-split-diagonal, .kzc-stats, .kzc-cta-band)) {
    padding-bottom: var(--kzc-space-6);
}


/* === kzc-faq – FAQ-Seite als Akkordeon (Kern-Modul "FAQ-Seite") =======
   Modul aus contao/faq-bundle, Template templates/mod_faqpage.html.twig
   (30.09.2026, Seite "Häufige Fragen"). Referenz design-ref/
   KZC-Haeufige-Fragen.html + KZC-FAQ.css (.qa). Markup je Frage wie
   Contaos Inhaltselement "Akkordeon" (handorgel__*), handorgel.min.css
   laedt das Template, hier nur die Optik darueber. Initialisierung in
   kzc-components.js, die setzt .kzc-faq--js am Modul: erst dann klappen
   die Antworten zu, ohne Script bleibt alles offen lesbar.
   Kategorie-Kopf: Weinrot-Klinge ueber der H2 (wie der Sektions-Kopf,
   ohne Nummer, Entscheidung 30.09.2026). Sprungmarken als helle Pillen
   ohne Zaehler. Plus/Minus-Knopf rechts per Hintergrund-Verlauf (zwei
   Balken), offen blau gefuellt.
   Links in Antworten Petrol; Links auf den Vertical-Life-Kalender/
   Zeitslots Weinrot (fuehren zur Buchung, CLAUDE.md Farbeinsatz). */
.mod_faqpage {
    padding-block: var(--kzc-space-8);
}

.kzc-faq__jump-list {
    display: flex;
    flex-wrap: wrap;
    gap: var(--kzc-space-2);
    margin: 0 0 var(--kzc-space-8);
    padding: 0;
    list-style: none;
}

.kzc-faq__jump-link {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    padding: 0 var(--kzc-space-4);
    border: 1px solid var(--kzc-border);
    border-radius: 999px;
    background-color: var(--kzc-off-white);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-semi);
    color: var(--kzc-petrol);
    text-decoration: none;
    transition: border-color var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-faq__jump-link:hover {
    border-color: var(--kzc-petrol);
    text-decoration: none;
}

.kzc-faq__jump-link:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

.kzc-faq__category,
.kzc-faq__item {
    scroll-margin-top: 7.5rem;
}

.kzc-faq__category + .kzc-faq__category {
    margin-top: var(--kzc-space-8);
}

.kzc-faq__headline {
    margin: 0 0 var(--kzc-space-5);
    font-size: var(--kzc-fs-h2);
    font-weight: var(--kzc-fw-xbold);
    line-height: var(--kzc-lh-tight);
    color: var(--kzc-petrol);
}

.kzc-faq__headline::before {
    content: "";
    display: block;
    width: 60px;
    height: 5px;
    margin-bottom: var(--kzc-space-4);
    background-color: var(--kzc-wine);
    transform: skewX(var(--kzc-blade-skew));
}

.kzc-faq__items {
    display: flex;
    flex-direction: column;
    gap: var(--kzc-space-3);
}

.kzc-faq__item {
    border: 1px solid var(--kzc-border);
    border-radius: var(--kzc-radius-md);
    background-color: var(--kzc-off-white);
    transition: border-color var(--kzc-dur-base) var(--kzc-ease-out);
}

.kzc-faq__item:has(.handorgel__header--open) {
    border-color: color-mix(in srgb, var(--kzc-blue) 45%, transparent);
}

.kzc-faq__items .handorgel__header {
    margin: 0;
    font-size: inherit;
}

.kzc-faq__items .handorgel__header__button {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--kzc-space-4);
    width: 100%;
    min-height: 60px;
    padding: var(--kzc-space-3) var(--kzc-space-4) var(--kzc-space-3) var(--kzc-space-5);
    border: 0;
    border-radius: var(--kzc-radius-md);
    background-color: transparent;
    font-family: inherit;
    font-size: var(--kzc-fs-body);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-ink);
    text-align: left;
}

.kzc-faq__items .handorgel__header__button::after {
    content: "";
    flex: none;
    width: 32px;
    height: 32px;
    border: 1px solid var(--kzc-border);
    border-radius: 999px;
    background:
        linear-gradient(var(--kzc-petrol), var(--kzc-petrol)) center / 12px 2px no-repeat,
        linear-gradient(var(--kzc-petrol), var(--kzc-petrol)) center / 2px 12px no-repeat,
        var(--kzc-white);
}

.kzc-faq__items .handorgel__header__button:hover,
.kzc-faq__items .handorgel__header--open .handorgel__header__button {
    color: var(--kzc-petrol);
}

.kzc-faq__items .handorgel__header--open .handorgel__header__button::after {
    border-color: var(--kzc-blue);
    background:
        linear-gradient(var(--kzc-white), var(--kzc-white)) center / 12px 2px no-repeat,
        var(--kzc-blue);
}

.kzc-faq__items .handorgel__header__button:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

.kzc-faq__items .handorgel__content {
    border-top: 1px solid var(--kzc-border);
    border-radius: 0 0 var(--kzc-radius-md) var(--kzc-radius-md);
    background-color: var(--kzc-white);
}

.kzc-faq__items .handorgel__content__inner {
    padding: var(--kzc-space-5);
}

/* Ohne Script: alles offen, kein Knopf (handorgel.min.css blendet die
   Antworten sonst dauerhaft aus). */
.mod_faqpage:not(.kzc-faq--js) .handorgel__content {
    display: block;
    height: auto;
    overflow: visible;
}

.mod_faqpage:not(.kzc-faq--js) .handorgel__content__inner {
    opacity: 1;
}

.mod_faqpage:not(.kzc-faq--js) .handorgel__header__button {
    cursor: default;
}

.mod_faqpage:not(.kzc-faq--js) .handorgel__header__button::after {
    display: none;
}

/* Antwort-Text (TinyMCE-Feld "Antwort") */
.kzc-faq__answer > :first-child {
    margin-top: 0;
}

.kzc-faq__answer > :last-child {
    margin-bottom: 0;
}

.kzc-faq__answer p,
.kzc-faq__answer li {
    max-width: var(--kzc-w-prose);
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-relaxed);
    color: var(--kzc-fg);
}

.kzc-faq__answer p {
    margin: 0 0 var(--kzc-space-3);
}

.kzc-faq__answer strong {
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-petrol);
}

.kzc-faq__answer h4 {
    margin: var(--kzc-space-5) 0 var(--kzc-space-2);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-xbold);
    letter-spacing: var(--kzc-tracking-wide);
    text-transform: uppercase;
    color: var(--kzc-petrol);
}

.kzc-faq__answer ul {
    margin: 0 0 var(--kzc-space-3);
    padding: 0;
    list-style: none;
}

.kzc-faq__answer ul > li {
    position: relative;
    padding-left: var(--kzc-space-5);
}

.kzc-faq__answer ul > li + li {
    margin-top: var(--kzc-space-1);
}

.kzc-faq__answer ul > li::before {
    /* Weinrot-Klinge wie im Text-Element (ein Listenpunkt fuer die Website) */
    content: "";
    position: absolute;
    left: 0;
    top: 0.72em;
    width: 12px;
    height: 4px;
    background-color: var(--kzc-wine);
    transform: skewX(var(--kzc-blade-skew));
}

.kzc-faq__answer a,
.kzc-faq__enclosure a {
    color: var(--kzc-petrol);
    font-weight: var(--kzc-fw-semi);
    text-decoration: underline;
    text-decoration-thickness: 1px;
}

.kzc-faq__answer a:hover,
.kzc-faq__enclosure a:hover {
    color: var(--kzc-link-hover);
    text-decoration-thickness: 2px;
}

.kzc-faq__answer a[href*="vertical-life.info"] {
    color: var(--kzc-wine);
}

.kzc-faq__answer a[href*="vertical-life.info"]:hover {
    color: var(--kzc-wine-hover);
}

.kzc-faq__enclosure {
    margin: var(--kzc-space-4) 0 0;
    padding: 0;
    list-style: none;
}

@media (prefers-reduced-motion: reduce) {
    /* Nicht "none": handorgel wartet auf transitionend, sonst bliebe die
       Antwort unsichtbar. */
    .kzc-faq__items .handorgel__content,
    .kzc-faq__items .handorgel__content__inner {
        transition-duration: 1ms;
        transition-delay: 0s;
    }
}


/* === kzc_contact – Kontaktdaten (RSCE, eine Stelle fuer NAP) ==========
   30.09.2026, ersetzt kzc_footer_address und die Adress-/Telefonfelder
   der Service-Leiste. Das Element gibt nur eine schlichte Liste aus
   (Adresse, Telefon, E-Mail je mit Icon), das Aussehen haengt am Ort:
   - Service-Leiste: eine Zeile, E-Mail ausgeblendet
   - Footer (.kzc-footer__brand): Liste untereinander, Links weiss
     (--kzc-blue auf Petrol nur 2.17:1, reisst AA; Weiss 6.9:1)
   - Hinweis-Kasten (.kzc-note-box__contact): Zeilen mit Icon-Feld und
     Trennlinie wie .ask-card in design-ref/KZC-FAQ.css, nur Telefon und
     E-Mail (Adresse ausgeblendet, wie in der Referenz). */
.kzc-contact__list {
    margin: 0;
    padding: 0;
    list-style: none;
}

.kzc-contact__item {
    display: flex;
    align-items: center;
    gap: var(--kzc-space-2);
}

.kzc-contact__icon {
    flex: none;
}

.kzc-contact a:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
    border-radius: var(--kzc-radius-xs);
}

/* Service-Leiste (Petrol, schmale Zeile) */
.kzc-utility-bar .kzc-contact__list {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--kzc-space-1) var(--kzc-space-4);
}

.kzc-utility-bar .kzc-contact__item {
    gap: var(--kzc-space-1);
}

.kzc-utility-bar .kzc-contact__item--address {
    color: rgba(255, 255, 255, 0.75);
}

.kzc-utility-bar .kzc-contact__item--email {
    display: none;
}

.kzc-utility-bar .kzc-contact__icon {
    width: 14px;
    height: 14px;
    opacity: 0.8;
}

.kzc-utility-bar .kzc-contact a {
    color: rgba(255, 255, 255, 0.82);
    font-weight: var(--kzc-fw-medium);
}

.kzc-utility-bar .kzc-contact a:hover,
.kzc-utility-bar .kzc-contact a:focus-visible {
    color: var(--kzc-white);
    text-decoration: none;
}

.kzc-utility-bar .kzc-contact a:focus-visible,
.kzc-footer__brand .kzc-contact a:focus-visible {
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
}

/* Footer (Petrol) */
.kzc-footer__brand .kzc-contact__list {
    display: flex;
    flex-direction: column;
    gap: var(--kzc-space-2);
    color: rgba(255, 255, 255, 0.82);
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-normal);
}

.kzc-footer__brand .kzc-contact__icon {
    color: rgba(255, 255, 255, 0.55);
}

.kzc-footer__brand .kzc-contact a {
    color: var(--kzc-white);
}

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

/* Hinweis-Kasten */
.kzc-note-box__contact {
    margin-top: var(--kzc-space-4);
    border-top: 1px solid var(--kzc-border);
}

.kzc-note-box__contact .kzc-contact__item--address {
    display: none;
}

.kzc-note-box__contact .kzc-contact__item {
    gap: var(--kzc-space-3);
    min-height: 52px;
    border-bottom: 1px solid var(--kzc-border);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-bold);
    overflow-wrap: anywhere;
}

.kzc-note-box__contact .kzc-contact__icon {
    box-sizing: content-box;
    padding: 9px;
    border-radius: var(--kzc-radius-sm);
    background-color: var(--kzc-white);
    color: var(--kzc-petrol);
}

.kzc-note-box__contact .kzc-contact a {
    color: var(--kzc-ink);
    text-decoration: none;
}

.kzc-note-box__contact .kzc-contact a:hover {
    color: var(--kzc-petrol);
    text-decoration: underline;
}

.kzc-note-box--dark .kzc-note-box__contact,
.kzc-note-box--dark .kzc-note-box__contact .kzc-contact__item {
    border-color: rgba(255, 255, 255, 0.16);
}

.kzc-note-box--dark .kzc-note-box__contact .kzc-contact__icon {
    background-color: rgba(255, 255, 255, 0.1);
    color: var(--kzc-white);
}

.kzc-note-box--dark .kzc-note-box__contact .kzc-contact a {
    color: var(--kzc-white);
}



/* === kzc-embed – eingebettete Fremdinhalte (HTML-Element) ==============
   01.10.2026, Routenbau-Seite: Vertical-Life-Routenuebersicht als iframe,
   Template-Variante content_element/unfiltered_html/verticallife. Der
   iframe zeigt zuerst die Sperrseite der Cookiebar (eigenes Template
   templates/ccb/element_blocker.html.twig), nach Zustimmung den Inhalt.
   Steht als Sektions-Inhalt zwischen kzc_section_start/_stop und traegt
   padding-block selbst wie die RSCE-Elemente. Hoehe fest, weil der
   Fremdinhalt seine Hoehe nicht meldet (Referenz design-ref/
   KZC-Routenbau.html ".kh-embed", alte Seite 100vh). */
.kzc-embed {
    padding-block: var(--kzc-space-8);
}

.kzc-embed iframe {
    display: block;
    width: 100%;
    height: clamp(560px, 80vh, 900px);
    border: 1px solid var(--kzc-border);
    border-radius: var(--kzc-radius-md);
    background: var(--kzc-off-white);
}

/* Karte (05.10.2026, Kontaktseite): Template-Variante
   content_element/unfiltered_html/openstreetmap, Cookiebar-Typ
   "openstreetmap". Kopfzeile + Flaeche mit festem Seitenverhaeltnis
   (mobil 4:5, Tablet 3:2, Desktop 2:1), Sperrseite und geladene Karte gleich gross, kein
   Layout-Sprung. Referenz design-ref/KZC-Kontakt.html ".kh-embed.ko-map".
   Weisse Kopfzeile, damit der Kasten auch auf Off-White-Grund steht. */
.kzc-embed--map .kzc-embed__bar {
    display: flex;
    align-items: center;
    gap: var(--kzc-space-2);
    max-width: none;
    margin: 0;
    padding: 14px 18px;
    border: 1px solid var(--kzc-border);
    border-bottom: 0;
    border-radius: var(--kzc-radius-md) var(--kzc-radius-md) 0 0;
    background: var(--kzc-white);
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-petrol);
}

.kzc-embed--map iframe {
    height: auto;
    aspect-ratio: 4 / 5;
    border-radius: 0 0 var(--kzc-radius-md) var(--kzc-radius-md);
}

@media (min-width: 768px) {
    .kzc-embed--map iframe {
        aspect-ratio: 3 / 2;
    }
}

/* Ab 1024px laeuft die Karte ueber die volle Inhaltsbreite (eigene
   Sektion, nicht in der Spalte wie im Entwurf), 3:2 waere dort ~790px
   hoch. Deshalb flacher. */
@media (min-width: 1024px) {
    .kzc-embed--map iframe {
        aspect-ratio: 2 / 1;
    }
}


/* Google-Bewertungen (12.10.2026, Ueber uns & Info): Template-Variante
   content_element/unfiltered_html/trustindex. Vor der Zustimmung ein
   Hinweis im Look der Cookiebar-Sperrseite (templates/ccb/
   element_blocker.html.twig), danach das Trustindex-Widget, das seine
   Optik selbst mitbringt. Steht direkt unter dem Sektionskopf, deshalb
   oben kein eigener Abstand. */
.kzc-embed--reviews {
    padding-top: 0;
}

.kzc-embed__consent {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: var(--kzc-space-8) var(--kzc-space-5);
    border: 1px solid var(--kzc-border);
    border-radius: var(--kzc-radius-md);
    background: var(--kzc-off-white);
    text-align: center;
}

.kzc-embed__consent-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 52px;
    height: 52px;
    margin-bottom: var(--kzc-space-3);
    border: 1px solid var(--kzc-border);
    border-radius: 50%;
    background: var(--kzc-white);
    color: var(--kzc-petrol);
}

.kzc-embed__consent-title {
    margin: 0 0 var(--kzc-space-2);
    font-size: 1.125rem;
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-petrol);
}

.kzc-embed__consent-text {
    max-width: 46ch;
    margin: 0 0 var(--kzc-space-5);
    font-size: var(--kzc-fs-body-sm);
    line-height: 1.6;
}

.kzc-embed__consent-text a {
    color: var(--kzc-petrol);
}

.kzc-embed__consent-button {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    padding: 0 22px;
    border: 0;
    border-radius: var(--kzc-radius-pill);
    background: var(--kzc-petrol);
    font: inherit;
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-white);
    cursor: pointer;
}

.kzc-embed__consent-button[hidden] {
    display: none;
}

.kzc-embed__consent-button:hover {
    background: var(--kzc-ink);
}

.kzc-embed__consent-button:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}


/* === Sprungmarken-Ziele (01.10.2026)===================================
   Abschnitte mit Anker (CSS-ID am Sektions-Anfang oder am Element, z. B.
   #seil, #boulder, #buchen) halten beim Sprung Abstand zum klebenden
   Header, gleicher Wert wie die FAQ-Anker (.kzc-faq__item). */
.kzc-section[id],
.kzc-section-inner > [id],
.kzc-photo-teaser[id] {
    scroll-margin-top: 7.5rem;
}


/* === cookiebar (oveleon/contao-cookiebar, 02.10.2026) ===================
   Banner im Theme-Look. Das Paket-CSS (bundles/contaocookiebar/
   default.css) bleibt geladen und liefert Mechanik (Schalter, Details
   aufklappen, Animation), hier nur die Optik: zuerst ueber die Paket-
   Variablen (--ccb-*), dann gezielte Regeln. Das Paket-CSS laedt VOR
   components.css, gleiche Spezifitaet reicht deshalb.
   Ablehnen und Akzeptieren sehen bewusst gleich aus (Petrol gefuellt),
   Speichern als Rahmen-Button: Ablehnen darf nicht schwaecher wirken als
   Zustimmen. Kein Weinrot (= Buchen). Im Backend Farbschema "neutral",
   damit die Paket-Klasse .highlight nicht greift. Reihenfolge der Buttons
   kommt aus templates/cookiebar/default/deny.html.twig. Mobil (<768px)
   volle Breite am unteren Rand, darueber Kasten unten mittig. */
.contao-cookiebar {
    --ccb-clr: var(--kzc-fg);
    --ccb-text: var(--kzc-fg);
    --ccb-bg: var(--kzc-white);
    --ccb-bdr: var(--kzc-border);
    --ccb-cookies-bg: var(--kzc-off-white);
    --ccb-cookies-bdr: var(--kzc-border);
    --ccb-info-bg: var(--kzc-white);
    --ccb-info-bdr: var(--kzc-border);
    --ccb-detail-clr: var(--kzc-petrol);
    --ccb-detail-clr-hvr: var(--kzc-petrol-hover);
    --ccb-checked-clr: var(--kzc-petrol);
    --ccb-checked-bg: var(--kzc-off-white);
    --ccb-unchecked-clr: var(--kzc-grey-500);
    --ccb-disabled-clr: var(--kzc-grey-300);
    --ccb-disabled-bg: var(--kzc-grey-100);
    --ccb-max-width: 640px;
    padding: 0;
    font-size: var(--kzc-fs-body-sm);
}

.contao-cookiebar .cc-inner {
    width: 100%;
    padding: var(--kzc-space-5);
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-normal);
    border-top: 4px solid var(--kzc-petrol);
    border-radius: var(--kzc-radius-md) var(--kzc-radius-md) 0 0;
    box-shadow: var(--kzc-shadow-3);
}

.contao-cookiebar .cc-head p {
    margin: 0 0 var(--kzc-space-4);
}

/* Gruppen: Titel Petrol, Detail-Knopf als Textlink */
.contao-cookiebar .cc-group {
    border-radius: var(--kzc-radius-md);
    margin-bottom: var(--kzc-space-3);
}

.contao-cookiebar label.group {
    font-weight: var(--kzc-fw-semi);
    color: var(--kzc-petrol);
}

.contao-cookiebar .cc-detail-btn,
.contao-cookiebar .cc-detail-btn-details {
    font-family: inherit;
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-semi);
    text-decoration: underline;
    text-underline-offset: 2px;
}

.contao-cookiebar .cc-cookies {
    border-radius: 0 0 var(--kzc-radius-md) var(--kzc-radius-md);
}

.contao-cookiebar .cc-cookies > p,
.contao-cookiebar .cc-cookie p,
.contao-cookiebar .cc-cookie-info {
    font-size: var(--kzc-fs-caption);
}

.contao-cookiebar .cc-cookie-info {
    border-radius: var(--kzc-radius-sm);
}

/* Buttons: Ablehnen + Akzeptieren gleich, Speichern Rahmen */
.contao-cookiebar .cc-footer {
    display: flex;
    flex-direction: column;
    gap: var(--kzc-space-2);
    margin-top: var(--kzc-space-4);
}

.contao-cookiebar .cc-btn {
    margin: 0;
    padding: var(--kzc-space-3) var(--kzc-space-4);
    font-family: inherit;
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-bold);
    line-height: 1.2;
    color: var(--kzc-white);
    background: var(--kzc-petrol);
    border: 1.5px solid var(--kzc-petrol);
    border-radius: var(--kzc-radius-md);
    transition: background-color var(--kzc-dur-base) var(--kzc-ease-out), border-color var(--kzc-dur-base) var(--kzc-ease-out);
}

.contao-cookiebar .cc-btn:hover,
.contao-cookiebar .cc-btn:focus {
    background: var(--kzc-petrol-hover);
    border-color: var(--kzc-petrol-hover);
}

.contao-cookiebar .cc-btn.save {
    color: var(--kzc-petrol);
    background: transparent;
    border-color: var(--kzc-border);
}

.contao-cookiebar .cc-btn.save:hover,
.contao-cookiebar .cc-btn.save:focus {
    background: var(--kzc-bg-alt);
    border-color: var(--kzc-border);
}

/* Fokus wie im Rest der Seite statt gestrichelter Paket-Linie */
.contao-cookiebar .cc-focus:not(.cc-hide-focus):focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

.contao-cookiebar input:focus-visible:not(.cc-hide-focus) + label::before {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

/* Links zu Datenschutz/Impressum */
.contao-cookiebar .cc-info {
    margin-top: var(--kzc-space-4);
}

.contao-cookiebar .cc-info > a {
    font-size: var(--kzc-fs-caption);
    color: var(--kzc-petrol);
    text-decoration: underline;
    text-underline-offset: 2px;
}

.contao-cookiebar .cc-info > a:hover {
    color: var(--kzc-petrol-hover);
}

.contao-cookiebar .cc-info > a + a::before {
    margin-inline: var(--kzc-space-2);
    text-decoration: none;
}

@media (min-width: 768px) {
    .contao-cookiebar {
        padding: var(--kzc-space-5);
    }
    .contao-cookiebar .cc-inner {
        padding: var(--kzc-space-6);
        border-radius: var(--kzc-radius-md);
    }
    .contao-cookiebar .cc-footer {
        flex-direction: row;
        justify-content: center;
    }
    .contao-cookiebar .cc-btn {
        flex: 1 1 0;
    }
}

/* Paket setzt bei reduzierter Bewegung 2s (langsamer statt ruhiger) */
@media (prefers-reduced-motion: reduce) {
    .contao-cookiebar {
        --ccb-anim-duration: 1ms;
    }
}

/* "Cookie-Einstellungen" in der Footer-Zeile (FE-Modul cookiebar_opener,
   tl_module 20, im HTML-Modul "Include Footer Bar" neben der
   Rechtliches-Navigation), Optik wie deren Links. */
.kzc-footer-bar__links {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--kzc-space-5);
}

.kzc-footer-bar a.ccb-trigger {
    color: rgba(255, 255, 255, 0.7);
}

.kzc-footer-bar a.ccb-trigger:hover {
    color: var(--kzc-white);
    text-decoration: none;
}

.kzc-footer-bar a.ccb-trigger:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85);
    border-radius: var(--kzc-radius-xs);
}


/* === kzc-hours – Oeffnungszeiten im Inhaltsbereich (05.10.2026) ========
   Kein eigenes Element: Contao-Element "Tabelle" (Kern) mit der Klasse
   "kzc-hours" (Experten-Einstellungen > CSS-ID/Klasse) und der Option
   "Erste Spalte als Ueberschrift" (-> <th scope="row">). Die
   Zusammenfassung wird zur <caption>, hier nur fuer Screenreader.
   Regelzeiten: Tage | Uhrzeit. Sonderzeiten: zusaetzlich die Klasse
   "kzc-hours--special", drei Spalten Datum | Anlass | Uhrzeit, Ueberschrift
   des Elements als H3 mit Weinrot-Klinge, gestrichelte Trennlinien.
   Pflege von Hand (vergangene Zeilen loeschen), die Footer-Oeffnungszeiten
   (kzc_footer_hours) sind ein eigener Datensatz und bleiben getrennt.
   Mobil bleibt es eine echte Tabelle (kein display:grid an tr/td, das
   kostet in Safari die Tabellen-Semantik), der Anlass bricht um.
   Satz zu Social Media darunter: Contao-Element "Text" mit Klasse
   "kzc-hours-note". Referenz design-ref/KZC-Kontakt.css ".ko-hours" /
   ".ko-special". */
.kzc-hours {
    max-width: 620px;
}

.kzc-hours table {
    width: 100%;
    border-collapse: collapse;
    border-top: 1px solid var(--kzc-grey-100);
}

.kzc-hours caption {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
}

.kzc-hours th,
.kzc-hours td {
    padding: 15px 0;
    border-bottom: 1px solid var(--kzc-grey-100);
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-snug);
    vertical-align: baseline;
}

.kzc-hours th {
    padding-right: var(--kzc-space-4);
    text-align: left;
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-petrol);
}

.kzc-hours td {
    text-align: right;
    font-weight: var(--kzc-fw-semi);
    color: var(--kzc-ink);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* Sonderzeiten */
.kzc-hours--special > h3 {
    display: flex;
    align-items: center;
    gap: 12px;
    margin: 0 0 6px;
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-xbold);
    color: var(--kzc-petrol);
}

.kzc-hours--special > h3::before {
    content: "";
    flex: none;
    width: 14px;
    height: 4px;
    background: var(--kzc-wine);
    transform: skewX(var(--kzc-blade-skew));
}

.kzc-hours--special table {
    border-top: 0;
}

.kzc-hours--special th,
.kzc-hours--special td {
    padding-block: 11px;
    border-bottom: 1px dashed var(--kzc-grey-300);
    font-size: var(--kzc-fs-body-sm);
}

/* Datum in Mono/Petrol. Die Off-White-Pille aus dem Entwurf entfaellt:
   die Kern-Zelle hat kein inneres Element, ein Hintergrund am th
   faerbte die ganze Zelle. */
.kzc-hours--special th {
    width: 1%;
    padding-right: 14px;
    white-space: nowrap;
    font-family: var(--kzc-font-mono);
    font-size: var(--kzc-fs-caption);
    color: var(--kzc-petrol);
}

.kzc-hours--special td {
    text-align: left;
    font-weight: var(--kzc-fw-regular);
    white-space: normal;
}

.kzc-hours--special td:last-child {
    padding-left: 14px;
    text-align: right;
    font-weight: var(--kzc-fw-semi);
    white-space: nowrap;
}

.kzc-hours-note .rte p {
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-relaxed);
    color: var(--kzc-grey-700);
}

.kzc-hours-note .rte a {
    font-weight: var(--kzc-fw-bold);
}

/* Abstaende in der Spalte (kzc-grid.css setzt --kzc-space-6 zwischen
   Elementen und laedt NACH dieser Datei, deshalb hoehere Spezifitaet). */
.rs-columns > .rs-column > .kzc-hours + .kzc-hours--special {
    margin-top: 28px;
}

.rs-columns > .rs-column > .kzc-hours + .content-text.kzc-hours-note {
    margin-top: 14px;
}

/* Hinweis-Kasten mit Adresse: Klasse "kzc-contact-address" am Kasten
   blendet die sonst versteckte Adresszeile der Kontaktdaten ein
   (Kontaktseite, Entwurf ".ko-ask" mit Adresse). */
.kzc-note-box.kzc-contact-address .kzc-note-box__contact .kzc-contact__item--address {
    display: flex;
}


/* === kzc-form – Formulare (Contao-Formulargenerator, 05.10.2026) =======
   Optik fuer ALLE Formulare (Element "Formular" .ce_form, Modul .mod_form)
   nach design-ref/KZC-Kontakt.css ".kf-*" / KZC-Kontakt-Formular.html.
   Reines CSS auf Contaos Standard-Markup, keine eigenen Feld-Templates
   (Entscheidung F1, 05.10.2026). Folgen: Fehlermeldung steht im DOM VOR
   dem Feld (optisch per order darunter), kein aria-invalid, kein Icon im
   Absende-Button, Meldungstexte Contao-Standard.
   Steuerung ueber das Feld "Klasse" am Formularfeld (landet am Wrapper
   .widget UND am Feld):
   - kzc-half        halbe Breite ab 768px (Name, Telefon, E-Mail, Betreff)
   - kzc-form-legend Zeile "Felder mit * sind Pflichtfelder."
   - kzc-form-hint   kleine Zeile unter dem Absende-Button
   - kzc-checkbox-group  Checkbox-Menue mit sichtbarer Legende (07.10.2026)
   - kzc-submit-book     Absende-Button Weinrot, nur Camp-Anmeldung (07.10.2026)
   Absende-Button Petrol, NICHT Weinrot (Absenden ist keine Buchung).
   Ausnahme Camp-Anmeldung (Farbregel 05.10.2026: Weinrot = Buchen und
   Camp-Anmeldung), per Klasse kzc-submit-book am Absende-Feld.
   Fieldset-Start/-Ende (Contao-Feldtypen) gruppieren Felder, z. B.
   „Elternteil“ / „Kind“ in der Camp-Anmeldung, das Fieldset uebernimmt
   das Zwei-Spalten-Raster.
   Ladezustand: Contao setzt beim Ajax-Absenden data-ajax-form="loading"
   am <form> (form_wrapper.html5). */
:is(.ce_form, .mod_form) .formbody {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 20px;
    padding: 24px 18px;
    border: 1px solid var(--kzc-grey-100);
    border-radius: var(--kzc-radius-md);
    background: var(--kzc-white);
    box-shadow: var(--kzc-shadow-1);
}

@media (min-width: 768px) {
    :is(.ce_form, .mod_form) .formbody {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: 24px;
        padding: 36px;
    }

    :is(.ce_form, .mod_form) .widget {
        grid-column: 1 / -1;
    }

    :is(.ce_form, .mod_form) .widget.kzc-half {
        grid-column: auto;
    }
}

:is(.ce_form, .mod_form) .widget {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

/* Erklaerungs-Zeilen */
:is(.ce_form, .mod_form) .widget-explanation p {
    margin: 0;
    font-size: var(--kzc-fs-body-sm);
    color: var(--kzc-grey-700);
}

:is(.ce_form, .mod_form) .kzc-form-hint {
    margin-top: -8px;
}

:is(.ce_form, .mod_form) .kzc-form-hint p {
    font-size: var(--kzc-fs-caption);
}

/* Labels */
:is(.ce_form, .mod_form) .widget > label {
    order: 0;
    margin-bottom: var(--kzc-space-2);
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
    /* Petrol wie Begriffe/Tagesnamen (kzc_list dt, kzc-hours th) */
    color: var(--kzc-petrol);
}

:is(.ce_form, .mod_form) span.mandatory {
    margin-left: 2px;
    color: var(--kzc-wine);
}

/* Eingabefelder */
:is(.ce_form, .mod_form) input.text,
:is(.ce_form, .mod_form) textarea {
    order: 1;
    box-sizing: border-box;
    width: 100%;
    min-height: 52px;
    margin: 0;
    padding: 12px 14px;
    border: 1.5px solid var(--kzc-grey-500);
    border-radius: var(--kzc-radius-sm);
    background: var(--kzc-white);
    font-family: inherit;
    font-size: 1rem; /* 16px, verhindert Zoom auf iOS */
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-ink);
    transition: border-color var(--kzc-dur-base) var(--kzc-ease-out), box-shadow var(--kzc-dur-base) var(--kzc-ease-out);
}

:is(.ce_form, .mod_form) textarea {
    min-height: 184px;
    resize: vertical;
}

:is(.ce_form, .mod_form) input.text:hover,
:is(.ce_form, .mod_form) textarea:hover {
    border-color: var(--kzc-petrol);
}

:is(.ce_form, .mod_form) input.text:focus,
:is(.ce_form, .mod_form) textarea:focus {
    outline: none;
    border-color: var(--kzc-petrol);
    box-shadow: 0 0 0 1px var(--kzc-petrol), var(--kzc-ring-focus);
}

:is(.ce_form, .mod_form) input.text:disabled,
:is(.ce_form, .mod_form) textarea:disabled {
    border-style: dashed;
    border-color: var(--kzc-grey-300);
    background: var(--kzc-off-white);
    color: var(--kzc-grey-500);
    cursor: not-allowed;
}

/* Fehler: Contao setzt .error an Wrapper und Feld und gibt <p class="error">
   VOR dem Feld aus; per order unter das Feld, Icon per Maske (Farbe aus
   dem Token, nicht im SVG). Nie nur ueber Farbe: Text + Icon. */
:is(.ce_form, .mod_form) p.error {
    order: 2;
    display: flex;
    align-items: flex-start;
    gap: var(--kzc-space-2);
    margin: var(--kzc-space-2) 0 0;
    font-size: 0.875rem;
    font-weight: var(--kzc-fw-semi);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-danger);
}

:is(.ce_form, .mod_form) p.error::before {
    content: "";
    flex: none;
    width: 16px;
    height: 16px;
    margin-top: 1px;
    background-color: currentColor;
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' x2='12' y1='8' y2='12'/%3E%3Cline x1='12' x2='12.01' y1='16' y2='16'/%3E%3C/svg%3E") center / contain no-repeat;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' x2='12' y1='8' y2='12'/%3E%3Cline x1='12' x2='12.01' y1='16' y2='16'/%3E%3C/svg%3E") center / contain no-repeat;
}

:is(.ce_form, .mod_form) input.text.error,
:is(.ce_form, .mod_form) textarea.error {
    border: 2px solid var(--kzc-danger);
}

:is(.ce_form, .mod_form) input.text.error:focus,
:is(.ce_form, .mod_form) textarea.error:focus {
    box-shadow: 0 0 0 3px rgba(139, 26, 42, 0.18);
}

/* Auswahlfeld (06.10.2026, Gruppen-Anfrage): gleiche Optik wie die
   Textfelder, eigener Pfeil per Maske statt Browser-Pfeil. */
:is(.ce_form, .mod_form) select {
    order: 1;
    box-sizing: border-box;
    width: 100%;
    min-height: 52px;
    margin: 0;
    padding: 12px 44px 12px 14px;
    border: 1.5px solid var(--kzc-grey-500);
    border-radius: var(--kzc-radius-sm);
    background: var(--kzc-white) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231C6080' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") right 14px center / 18px no-repeat;
    font-family: inherit;
    font-size: 1rem;
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-ink);
    appearance: none;
    cursor: pointer;
    transition: border-color var(--kzc-dur-base) var(--kzc-ease-out), box-shadow var(--kzc-dur-base) var(--kzc-ease-out);
}

:is(.ce_form, .mod_form) select:hover {
    border-color: var(--kzc-petrol);
}

:is(.ce_form, .mod_form) select:focus {
    outline: none;
    border-color: var(--kzc-petrol);
    box-shadow: 0 0 0 1px var(--kzc-petrol), var(--kzc-ring-focus);
}

:is(.ce_form, .mod_form) select.error {
    border: 2px solid var(--kzc-danger);
}

/* Hilfetext am Feld (Feld "Hilfetext", Contao gibt p.help NACH dem Feld
   aus und verknuepft es per aria-describedby). */
:is(.ce_form, .mod_form) .widget p.help {
    order: 3;
    margin: var(--kzc-space-2) 0 0;
    font-size: var(--kzc-fs-caption);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-grey-700);
}

/* Checkbox (Datenschutz): Fieldset ohne Rahmen, Legende nur fuer
   Screenreader (der Satz am Kaestchen sagt alles), eigene 24px-Box. */
:is(.ce_form, .mod_form) fieldset.checkbox_container {
    display: flex;
    flex-direction: column;
    min-width: 0;
    margin: 0;
    padding: 0;
    border: 0;
}

:is(.ce_form, .mod_form) .checkbox_container > legend {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
}

:is(.ce_form, .mod_form) .checkbox_container > span {
    order: 1;
    display: flex;
    align-items: flex-start;
    gap: 14px;
    min-height: 44px;
    padding-block: 10px;
    box-sizing: border-box;
}

:is(.ce_form, .mod_form) .checkbox_container > p.error {
    order: 2;
    margin-top: 0;
}

:is(.ce_form, .mod_form) input.checkbox {
    flex: none;
    appearance: none;
    -webkit-appearance: none;
    width: 24px;
    height: 24px;
    margin: 0;
    border: 2px solid var(--kzc-grey-500);
    border-radius: var(--kzc-radius-sm);
    background: var(--kzc-white) center / 16px no-repeat;
    cursor: pointer;
    transition: border-color var(--kzc-dur-base) var(--kzc-ease-out), background-color var(--kzc-dur-base) var(--kzc-ease-out);
}

:is(.ce_form, .mod_form) input.checkbox:hover {
    border-color: var(--kzc-petrol);
}

:is(.ce_form, .mod_form) input.checkbox:checked {
    border-color: var(--kzc-petrol);
    background-color: var(--kzc-petrol);
    /* Haken weiss: einzige feste Farbe, Weiss auf Petrol */
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E");
}

:is(.ce_form, .mod_form) input.checkbox:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

:is(.ce_form, .mod_form) .widget-checkbox.error input.checkbox {
    border-color: var(--kzc-danger);
}

:is(.ce_form, .mod_form) .checkbox_container label {
    font-size: var(--kzc-fs-body-sm);
    line-height: var(--kzc-lh-normal);
    color: var(--kzc-ink);
    cursor: pointer;
}

:is(.ce_form, .mod_form) .checkbox_container label a {
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-petrol);
}

/* Checkbox-Menue mit mehreren Optionen (Klasse kzc-checkbox-group, z. B.
   Ferienwoche der Camp-Anmeldung): Legende sichtbar wie ein Label. */
:is(.ce_form, .mod_form) .checkbox_container.kzc-checkbox-group > legend {
    position: static;
    width: auto;
    height: auto;
    overflow: visible;
    clip-path: none;
    white-space: normal;
    margin-bottom: var(--kzc-space-1);
    padding: 0;
    font-size: var(--kzc-fs-body-sm);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
    color: var(--kzc-petrol);
}

/* Fieldset-Gruppe (Feldtyp Fieldset-Start): volle Breite im Raster der
   .formbody, darin dasselbe Raster. Legende als kleine Zwischenzeile mit
   Linie, wie die Gruppen im Entwurf (KZC-Klettercamps.html). */
:is(.ce_form, .mod_form) .formbody > fieldset:not(.checkbox_container) {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 20px;
    grid-column: 1 / -1;
    min-width: 0;
    margin: 0;
    padding: 0;
    border: 0;
}

:is(.ce_form, .mod_form) .formbody > fieldset:not(.checkbox_container) > legend {
    width: 100%;
    margin-bottom: 20px;
    padding: 0 0 var(--kzc-space-2);
    border-bottom: 1px solid var(--kzc-grey-100);
    font-size: var(--kzc-fs-caption);
    font-weight: var(--kzc-fw-bold);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--kzc-petrol);
}

@media (min-width: 768px) {
    :is(.ce_form, .mod_form) .formbody > fieldset:not(.checkbox_container) {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: 24px;
    }

    :is(.ce_form, .mod_form) .formbody > fieldset:not(.checkbox_container) > legend {
        margin-bottom: 24px;
    }
}

/* Spamschutz (Altcha, Contao-Kern): Optik ueber die Variablen des
   Widgets (contao-components/altcha). */
:is(.ce_form, .mod_form) .widget-altcha {
    --altcha-border-width: 1.5px;
    --altcha-border-radius: var(--kzc-radius-sm);
    --altcha-color-base: var(--kzc-white);
    --altcha-color-border: var(--kzc-grey-500);
    --altcha-color-text: var(--kzc-ink);
    --altcha-color-border-focus: var(--kzc-petrol);
    --altcha-color-error-text: var(--kzc-danger);
    --altcha-max-width: 320px;
    font-family: inherit;
}

:is(.ce_form, .mod_form) .widget-altcha altcha-widget {
    order: 1;
}

/* Absenden: Aktionszeile mit Linie, Petrol-Button */
:is(.ce_form, .mod_form) .widget-submit {
    padding-top: 24px;
    border-top: 1px solid var(--kzc-grey-100);
    margin-top: 4px;
}

:is(.ce_form, .mod_form) button.submit {
    align-self: stretch;
    min-height: 52px;
    padding: 14px 26px;
    border: 0;
    border-radius: var(--kzc-radius-sm);
    background: var(--kzc-petrol);
    font-family: inherit;
    font-size: 1rem;
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-white);
    cursor: pointer;
    transition: background-color var(--kzc-dur-base) var(--kzc-ease-out);
}

@media (min-width: 768px) {
    :is(.ce_form, .mod_form) button.submit {
        align-self: flex-start;
    }
}

:is(.ce_form, .mod_form) button.submit:hover {
    background: var(--kzc-petrol-hover);
}

:is(.ce_form, .mod_form) button.submit:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

/* Camp-Anmeldung: Weinrot (Klasse kzc-submit-book am Absende-Feld) */
:is(.ce_form, .mod_form) button.submit.kzc-submit-book {
    background: var(--kzc-cta);
    color: var(--kzc-cta-fg);
}

:is(.ce_form, .mod_form) button.submit.kzc-submit-book:hover {
    background: var(--kzc-wine-hover);
}

:is(.ce_form, .mod_form) form[data-ajax-form="loading"] button.submit {
    background: var(--kzc-grey-100);
    color: var(--kzc-grey-500);
    cursor: wait;
    pointer-events: none;
}

/* Bestaetigung nach dem Absenden (form_message.html5: .form-confirmation,
   Inhalt = Feld "Bestaetigungsnachricht" im Formular). Gruener Kreis mit
   Haken nur als Status (Gruen = Bestaetigung), letzter Link als
   Ghost-Button ("Neue Nachricht schreiben"). */
:is(.ce_form, .mod_form) .form-confirmation {
    padding: 32px 24px;
    border: 1px solid var(--kzc-grey-100);
    border-radius: var(--kzc-radius-md);
    background: var(--kzc-white);
    box-shadow: var(--kzc-shadow-1);
}

:is(.ce_form, .mod_form) .form-confirmation::before {
    content: "";
    display: block;
    width: 56px;
    height: 56px;
    margin-bottom: var(--kzc-space-4);
    border-radius: 50%;
    background: var(--kzc-success) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E") center / 28px no-repeat;
}

:is(.ce_form, .mod_form) .form-confirmation h3 {
    margin: 0 0 var(--kzc-space-2);
    font-size: clamp(1.375rem, 2vw, 1.625rem);
    font-weight: var(--kzc-fw-xbold);
    color: var(--kzc-petrol);
}

:is(.ce_form, .mod_form) .form-confirmation p {
    margin: 0;
}

:is(.ce_form, .mod_form) .form-confirmation p + p {
    margin-top: var(--kzc-space-5);
}

:is(.ce_form, .mod_form) .form-confirmation p:last-child a {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    padding: 0 20px;
    border: 1.5px solid var(--kzc-grey-300);
    border-radius: var(--kzc-radius-sm);
    font-weight: var(--kzc-fw-bold);
    color: var(--kzc-petrol);
    text-decoration: none;
}

:is(.ce_form, .mod_form) .form-confirmation p:last-child a:hover {
    border-color: var(--kzc-petrol);
}

@media (min-width: 768px) {
    :is(.ce_form, .mod_form) .form-confirmation {
        padding: 40px 36px;
    }
}

@media (prefers-reduced-motion: reduce) {
    :is(.ce_form, .mod_form) input.text,
    :is(.ce_form, .mod_form) textarea,
    :is(.ce_form, .mod_form) select,
    :is(.ce_form, .mod_form) input.checkbox,
    :is(.ce_form, .mod_form) button.submit {
        transition: none;
    }
}


/* === kzc-button-request – Contao-Element "Hyperlink" als Anfrage-Button =
   (06.10.2026, Erleben & Buchen) Redakteursklasse kzc-button-request am
   Kern-Element "Hyperlink" (Wrapper .content-hyperlink, darin ein <a>).
   Ein Petrol-Button unter einem Raster, z. B. "Gruppe anfragen" unter
   den Paket-Karten. Petrol = Anfrage, Weinrot bleibt Buchen. Abstand wie
   ein Sektions-Inhaltselement (der Sektions-Rhythmus-Block kuerzt ihn
   zwischen zwei Elementen). */
.content-hyperlink.kzc-button-request {
    padding-block: var(--kzc-space-8);
}

.content-hyperlink.kzc-button-request a {
    box-sizing: border-box; /* kein globaler Reset, sonst 48px + Padding */
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--kzc-space-2);
    min-height: 48px;
    padding: var(--kzc-space-4) var(--kzc-space-6);
    border-radius: var(--kzc-radius-md);
    background-color: var(--kzc-petrol);
    color: var(--kzc-white);
    font-size: var(--kzc-fs-body);
    font-weight: var(--kzc-fw-bold);
    line-height: var(--kzc-lh-snug);
    text-decoration: none;
    transition: background-color var(--kzc-dur-base) var(--kzc-ease-out), transform var(--kzc-dur-fast) var(--kzc-ease-out);
}

.content-hyperlink.kzc-button-request a:hover {
    background-color: var(--kzc-petrol-hover);
    color: var(--kzc-white);
    text-decoration: none;
    transform: translateY(-1px);
}

.content-hyperlink.kzc-button-request a:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

@media (max-width: 767px) {
    .content-hyperlink.kzc-button-request a {
        width: 100%;
    }
}

@media (prefers-reduced-motion: reduce) {
    .content-hyperlink.kzc-button-request a {
        transition: none;
    }

    .content-hyperlink.kzc-button-request a:hover {
        transform: none;
    }
}

/* === kzc-logos – Logo-Reihe (Contao-Element „Bilder“, 07.10.2026) =====
   Redakteursklasse kzc-logos am Contao-Element „Bilder“ (Galerie).
   Erster Einsatz: Caterer-Logos auf der Seite Kindergeburtstag, gedacht
   auch fuer Partner (siehe Kundenfrage 35). Logos in einheitlicher Hoehe
   nebeneinander, kein Raster, keine Lightbox („Grossansicht“ aus). Einen
   Link je Logo setzt die Redaktion in der Dateiverwaltung (Metadaten,
   Feld „Link“), Contao verlinkt das Bild dann ohne eigenes Template.
   Sektions-Inhaltselement: padding-block wie die KZC-Elemente, der
   Sektions-Rhythmus-Block kuerzt den Abstand zum Element davor. */
.kzc-logos {
    padding-block: var(--kzc-space-8);
}

.kzc-logos ul {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--kzc-space-5) var(--kzc-space-8);
    margin: 0;
    padding: 0;
    list-style: none;
}

.kzc-logos figure {
    margin: 0;
}

.kzc-logos img {
    display: block;
    width: auto;
    max-width: 100%;
    height: 56px;
    object-fit: contain;
}

.kzc-logos a:focus-visible {
    outline: none;
    box-shadow: var(--kzc-ring-focus);
}

/* Partner-Abschnitt (Über uns & Info, 19.10.2026): je Gruppe ein Text-
   Element (H3 + Satz) direkt über seiner Logo-Reihe. Der Sektions-
   Rhythmus setzt zwischen zwei Elementen space-6, hier rückt die Reihe
   enger an ihren Text, damit Text und Logos als Gruppe lesbar bleiben.
   Gleiche Spezifität wie der Rhythmus-Block (0,4,0), gewinnt, weil sie
   später in der Datei steht. */
.kzc-section .kzc-section-inner > .content-text:has(+ .kzc-logos) {
    padding-bottom: var(--kzc-space-4);
}

/* Seit 20.10.2026 stehen die drei Gruppen in Spalten (Umschlag 3, je
   „Spalte Anfang/Ende“). Dort setzt kzc-grid.css space-6 zwischen zwei
   Elementen einer Spalte, die Reihe rückt auch hier enger an ihren Text. */
.rs-columns > .rs-column > .content-text + .kzc-logos {
    margin-top: var(--kzc-space-4);
}

/* === avalex – Rechtstexte (Impressum, Datenschutz, 12.10.2026) ========
   Contao-Elemente aus avalexgmbh/contao (Markup: .content-avalex-<typ> >
   h1 aus dem Feld „Überschrift“ + avalex-HTML mit h2/h3/p/ul/a). Die
   Texte kommen per API, deshalb nur Grundtypografie auf Lesebreite,
   Optik wie das Text-Element (content-text): Links Petrol unterstrichen,
   Listen mit Weinrot-Klinge. Sektions-Inhaltselement: steht zwischen
   kzc_section_start/_stop, traegt padding-block selbst. */
.content-avalex-imprint,
.content-avalex-privacy-policy {
    padding-block: var(--kzc-space-8);
    max-width: var(--kzc-w-prose);
    overflow-wrap: anywhere;
}

.content-avalex-imprint > h1,
.content-avalex-privacy-policy > h1 {
    margin: 0 0 var(--kzc-space-6);
    color: var(--kzc-petrol);
}

.content-avalex-imprint h2,
.content-avalex-privacy-policy h2 {
    margin: var(--kzc-space-7) 0 var(--kzc-space-3);
    font-size: var(--kzc-fs-h3);
    color: var(--kzc-petrol);
    scroll-margin-top: var(--kzc-space-10);
}

.content-avalex-imprint h3,
.content-avalex-privacy-policy h3,
.content-avalex-imprint h4,
.content-avalex-privacy-policy h4 {
    margin: var(--kzc-space-5) 0 var(--kzc-space-2);
    font-size: var(--kzc-fs-h4);
    color: var(--kzc-ink);
}

.content-avalex-imprint p,
.content-avalex-privacy-policy p,
.content-avalex-imprint li,
.content-avalex-privacy-policy li {
    font-size: var(--kzc-fs-body);
    line-height: var(--kzc-lh-relaxed);
    color: var(--kzc-fg);
}

.content-avalex-imprint a,
.content-avalex-privacy-policy a {
    color: var(--kzc-petrol);
    font-weight: var(--kzc-fw-semi);
    text-decoration: underline;
    text-decoration-thickness: 1px;
}

.content-avalex-imprint a:hover,
.content-avalex-privacy-policy a:hover {
    color: var(--kzc-link-hover);
    text-decoration-thickness: 2px;
}

.content-avalex-imprint ul,
.content-avalex-privacy-policy ul {
    margin: 0 0 var(--kzc-space-4);
    padding: 0;
    list-style: none;
}

.content-avalex-imprint ul > li,
.content-avalex-privacy-policy ul > li {
    position: relative;
    padding-left: var(--kzc-space-5);
}

.content-avalex-imprint ul > li + li,
.content-avalex-privacy-policy ul > li + li {
    margin-top: var(--kzc-space-2);
}

.content-avalex-imprint ul > li::before,
.content-avalex-privacy-policy ul > li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0.72em;
    width: 12px;
    height: 4px;
    background-color: var(--kzc-wine);
    transform: skewX(var(--kzc-blade-skew));
}

/* === kzc-toplink – „Nach oben“ am Footer (20.10.2026) =================
   Frontend-Modul „Nach oben“ (tl_module 21, Eigener HTML-Code), per
   {{insert_module::21}} oben im HTML-Modul „Include Footer“ (15), gilt
   damit in beiden Layouts. Kein Contao-Element: „Nach oben“ gibt es nur
   als Inhaltselement, das hier niemand pflegen soll. Link auf
   {{env::request}}#top (body-id von Contao), sonst springt er wegen
   <base href> auf die Startseite. Pfeil als Inline-SVG (Lucide
   chevron-up), nicht aus dem Sprite: im HTML-Modul gaebe es keinen
   versionierten Sprite-Pfad. Vorbild RockSolid-Themes: Kachel mittig,
   halb ueber der Footer-Oberkante. Weich statt eckig (Feedback Nutzerin
   20.10.2026): runde Ecken, weicher Schatten, hebt sich beim Hover. */
.kzc-toplink {
    position: absolute;
    top: 0;
    left: 50%;
    z-index: 2;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 52px;
    height: 52px;
    border-radius: var(--kzc-radius-md);
    background-color: var(--kzc-blue);
    color: var(--kzc-white);
    box-shadow: var(--kzc-shadow-3);
    transform: translate(-50%, -50%);
    transition: transform 0.25s ease, background-color 0.25s ease, box-shadow 0.25s ease;
}

/* color explizit: sonst faerbt das globale a:hover (Petrol) den Pfeil. */
.kzc-toplink:hover {
    color: var(--kzc-white);
    background-color: color-mix(in srgb, var(--kzc-blue) 85%, var(--kzc-ink));
    box-shadow: var(--kzc-shadow-2);
    transform: translate(-50%, calc(-50% - 4px));
}

/* Fokus: der Standard-Ring ist selbst blau und verschwaende auf der
   blauen Flaeche. Doppelter Ring Weiss + Ink, sichtbar auf hellem Inhalt
   (obere Haelfte) wie auf Petrol (untere Haelfte). */
.kzc-toplink:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px var(--kzc-white), 0 0 0 6px var(--kzc-ink);
}

.kzc-toplink__icon {
    display: block;
}

/* Sanftes Scrollen fuer alle Sprungmarken der Seite (Nach oben, Hero-
   Sprungmarken, FAQ-Anker), nur ohne „Bewegung reduzieren“. */
@media (prefers-reduced-motion: no-preference) {
    html {
        scroll-behavior: smooth;
    }
}

@media (prefers-reduced-motion: reduce) {
    .kzc-toplink,
    .kzc-toplink:hover {
        transition: none;
        transform: translate(-50%, -50%);
    }
}
