/* ============================================================
   Cavallearn Design System — Dark Premium
   Navy/Gold palette, glassmorphism, Apple Fitness aesthetic
   cl-* prefix — extends Bootstrap 5
   ============================================================ */

/* ============================================================
   WELCHE SCHNITTE ES GIBT (13.08.2026)

   DM Sans liegt in 400, 500, 600 und 700. MEHR NICHT. Die Dateien stehen in
   Cavallearn.Schrift (_content/Cavallearn.Schrift/cav-schrift.css); der Stapel
   kommt ueber --cav-schrift-grund herein.

   ES GIBT KEINE 800. Bis heute stand sie an 13 Stellen — 11 in dieser Datei,
   dazu StoryPlayerPage.razor und AngebotsListe.razor. Sie war nie wirksam:
   liegt kein 800er-Gesicht vor, zeichnet der Browser das naechstbeste, und das
   ist das 700er. Nachgemessen am 13.08.2026, "Sitzanalyse Handgelenk" bei
   40px: 700 und 800 waren beide 464,81 px breit, auf das Hundertstel gleich.
   Alle 13 stehen jetzt auf 700 — die Regel sagt, was passiert, statt eine
   Abstufung zuzusagen, die es nicht gibt.

   ES GIBT AUCH KEINEN KURSIVSCHNITT. An 5 Stellen steht font-style: italic
   (FlashcardPlayer, AnnotationSession, CtaBlockView, FrageBlockView,
   ModulListe). Die bleiben, aber sie sind synthetisch: der Browser neigt das
   aufrechte Gesicht. Bewusst so entschieden — eine eigene Datei fuer fuenf
   Hinweiszeilen lohnt nicht.

   WER EIN GEWICHT BRAUCHT, DAS ES NICHT GIBT, holt zuerst die Datei. Ein Test
   haelt das fest: SchriftAusEinerQuelleTests.Kein_Gewicht_ohne_Datei sammelt
   jedes font-weight in den eigenen Stilblaettern ein und prueft es gegen die
   in cav-schrift.css deklarierten @font-face-Bloecke.
   ============================================================ */

/* --- Design Tokens ----------------------------------------- */
:root {
    /* Core palette */
    --cl-navy-dark:    #0E1A2B;
    --cl-navy:         #16263F;
    --cl-navy-light:   #1E3352;
    --cl-navy-lighter: #263D5C;
    --cl-gold:         #C8952A;
    --cl-gold-light:   #E8B84B;
    --cl-gold-pale:    #F5E0A0;
    --cl-gold-dark:    #A07620;
    --cl-white:        #FFFFFF;

    /* Text */
    --cl-text:         rgba(255, 255, 255, 0.92);
    --cl-text-muted:   rgba(255, 255, 255, 0.55);
    --cl-text-subtle:  rgba(255, 255, 255, 0.35);

    /* Status */
    --cl-success:      #34D399;
    --cl-warning:      #FBBF24;
    --cl-danger:       #F87171;

    /* BAU P12e — DER GRUND EINES BLATTES.
       Bis P12e gab es diese Marke in cavallearn.css NICHT. Sie fehlte nicht
       nur — ich hatte in Bau P12 zwei Namen ERFUNDEN, die es nie gab
       (--cl-surface, --cl-surface-2), und eine undefinierte Custom Property
       macht die ganze background-Deklaration ungueltig. Ergebnis: das
       Aktionsmenue lag auf der Dialogebene, fing seine Tipper und war
       DURCHSICHTIG. Am Geraet gesehen am 02.09.2026.

       Der Wert ist der aus horses.css (--hrs-blatt-grund, Bau P6), nur in
       Navy statt Schwarz: 0.96 statt 0.92, weil ein Menue hier kleiner ist
       als ein Blatt ueber den halben Schirm und jeder Schimmer darunter als
       Unschaerfe gelesen wird.

       EINE ZAHL, ZWEI NAMEN: horses.css liest sie von hier
       (--hrs-blatt-grund: var(--cl-blatt-grund, …)), genau wie --hrs-accent
       schon immer --cl-gold liest. Richtung Host -> Modul, nie umgekehrt. */
    --cl-blatt-grund:  rgba(15, 26, 44, 0.96);

    /* PAKET 2 — DER PAPIERTON DER KASTNER-ZEICHNUNGEN.
       Er gehoert NICHT zum Schema, sondern zur Vorlage: die Zeichnungen sind
       Strichgrafik auf hellem Papier, und der Grund unter ihnen muss dieselbe
       Farbe haben, sonst steht ein weisses Rechteck in einem dunklen Bild. Er
       geht die Hell-Umschaltung deshalb ausdruecklich NICHT mit. */
    --cl-papier:       #f4f1ea;

    /* Glass */
    --cl-glass-bg:     rgba(255, 255, 255, 0.05);
    --cl-glass-border: rgba(255, 255, 255, 0.08);
    --cl-glass-hover:  rgba(255, 255, 255, 0.08);
    --cl-glass-blur:   blur(12px);

    /* Gold glow */
    --cl-gold-glow:       rgba(200, 149, 42, 0.15);
    --cl-gold-border:     rgba(200, 149, 42, 0.35);
    --cl-gold-border-dim: rgba(200, 149, 42, 0.15);

    /* --- BAU 49b (D) — BEREICHSFARBEN --------------------------------------
       VIER TOENE, EINE ZUORDNUNG, ZWEI ANWENDUNGSSTELLEN je Block: eine 3px
       breite Marke am linken Kartenrand und die Kicker-Zeile samt Icon.
       Kein farbiger Rahmen, kein farbiger Hintergrund — die Karte bleibt
       dunkel und ruhig.

       WARUM ES DIESE TOKENS VORHER NICHT GAB: es gab im Projekt keine
       Zuordnung Farbe -> Bereich. Die bestehende Unterscheidung laeuft ueber
       ICONS (bi-heart, bi-camera-video, bi-activity, bi-mortarboard) und ueber
       Gold fuer den aktiven Nav-Eintrag. Die Toene hier ergaenzen die Icons,
       sie ersetzen sie nicht.

       GRENZEN, die eingehalten sind:
         GOLD bleibt Aktionen vorbehalten (Knoepfe, aktiver Eintrag) — kein
           Bereich bekommt Gold.
         ROT und ORANGE sind tabu (Fehler, Warnung, Umgebungsband).
         Entsaettigt (S 19-34 %), damit es Zugehoerigkeit sagt und nicht Alarm.

       GEMESSEN auf dem Kartengrund (#182B45) und auf dem Seitengrund
       (#0E1A2B), Kontrast nach WCAG:
         Pferde   #7FA88B  5.36:1 / 6.56:1   H 138
         Webinare #6E9EB8  4.93:1 / 6.03:1   H 201
         Training #9B8CC4  4.72:1 / 5.78:1   H 256
         Lernen   #B48EA6  5.01:1 / 6.13:1   H 322
       Alle vier ueber 4.5:1, Farbwinkel 55-66 Grad auseinander — bei 3px
       Breite unterscheidbar. Zum Vergleich: Gold liegt bei 5.30:1.

       VORSCHLAG, aenderbar an DIESER Stelle und sonst nirgends. */
    /* BAU P8 — HIER STAND #7FA88B, EIN GEDECKTES GRUEN. Es war die einzige
       gruene Farbe der Anwendung: sie trug den Balken am Pferdeblock und die
       Zeile "{Name} · Der Anfang" und stand damit neben Gold, Blau, Violett
       und Altrosa als fuenfter Ton ohne Verwandtschaft. Der Pferdebereich ist
       der Kern dieser Anwendung; ihm gehoert die Hausfarbe.

       ABER NICHT DAS AKTIONSGOLD. Bau 49b haelt fest: "Gold gehoert den
       Aktionen. Kein Bereich darf es tragen — sonst ist der Knopf nicht mehr
       als Knopf erkennbar." Diese Regel bleibt gueltig. Deshalb der HELLE
       Goldton (--cl-gold-pale, #F5E0A0) statt #C8952A: fuer das Auge Gold, und
       trotzdem nicht die Farbe, an der man den Knopf erkennt. Beide Zusagen
       stehen damit nebeneinander, statt dass eine die andere ueberschreibt. */
    --cl-bereich-pferde:   #F5E0A0;
    --cl-bereich-webinare: #6E9EB8;
    --cl-bereich-training: #9B8CC4;
    --cl-bereich-lernen:   #B48EA6;

    /* --- LERNBEREICH (09.09.2026, Paket 1) --------------------------------
       DREI MARKEN, DIE ES VORHER NICHT GAB. Sie stehen hier und nicht am
       Bauteil, weil sie an mehr als einer Stelle gebraucht werden und weil
       eine Zahl, die nur im Markup steht, beim naechsten Bauteil neu erfunden
       wird — genau das ist mit 1.25rem passiert (elfmal als Literal in den
       Blockansichten).

       --cl-warning-wash: DIE FLAECHE ZUM WARNTON. --cl-warning gab es, aber
         nur als Vollton fuer Text und Rahmen. Die Fehlerbox braucht zusaetzlich
         einen Grund, und der stand bis heute als rgba(245,158,11,.08) im
         C#-Switch von ProseBlockView — ein roher Wert, der die Hell-Umschaltung
         nicht mitgemacht hat. Die Deckung ist bewusst niedrig: der Kasten soll
         warnen, nicht alarmieren; Rot bleibt den Fehlerzustaenden der
         Anwendung vorbehalten.

       --cl-lesebreite: WIE BREIT EINE ZEILE WERDEN DARF. In ch und nicht in
         Pixel, weil das Mass die Zeichenzahl meint und nicht die Geraetebreite:
         68ch traegt rund 70-80 Zeichen, und das ist die Spanne, in der ein
         Auge die naechste Zeile ohne Suchen findet. Ein Pixelwert saehe bei
         geaenderter Schriftgroesse anders aus, ohne dass jemand etwas geaendert
         haette.

       --cl-block-abstand: DER VERTIKALE RHYTHMUS zwischen zwei Bloecken. */
    --cl-warning-wash: rgba(251, 191, 36, 0.10);
    --cl-lesebreite:   68ch;
    --cl-block-abstand: 1.25rem;

    /* --- LERNBEREICH, Paket 2 (09.09.2026) --------------------------------
       --cl-dialog-figur: DIE BREITE DER FIGURENSPALTE. Sie stand als
         width/height an .cl-dialog-figur und in zwei Medienabfragen — drei
         Zahlen an drei Stellen. Seit die FOLGE-REPLIK buendig unter dem ersten
         Beitrag nachrueckt, wird dieselbe Zahl ein VIERTES Mal gebraucht (als
         Einzug), und dann muessen alle vier zusammen wandern. Genau dafuer ist
         es eine Marke: sie wird in den Medienabfragen NEU GESETZT, und der
         Einzug folgt von selbst.

       --cl-dialog-blase: wie breit eine Sprechblase werden darf. Kuerzer als
         die Lesebreite des Fliesstexts, und das ist Absicht — eine Sprechzeile
         ist kein Absatz. Sie stand als max-width:520px im Bauteil. */
    --cl-dialog-figur: 104px;
    --cl-dialog-blase: 32rem;

    /* --- LERNBEREICH, Paket 3 (09.09.2026) --------------------------------
       --cl-szenenabstand: DER ABSTAND UM EINE DIALOGFOLGE HERUM.

       Die Leiter dieser Datei, von eng nach weit:
           0.30rem  innerhalb einer Folge-Replik
           0.45rem  zwischen zwei Sprechzeilen
           0.70rem  zwischen zwei Gliedern einer Abschnittsfolge
           1.25rem  zwischen zwei Bloecken   (--cl-block-abstand)
           2.00rem  ueber der Abschlusskarte
           2.50rem  vor dem Seitenende

       Die Stufen wachsen um Faktor 1.5 bis 1.8 (0.30->0.45 = 1.5;
       0.45->0.70 = 1.56; 0.70->1.25 = 1.79). Die naechste Stufe ueber dem
       Blockabstand liegt damit zwischen 1.9 und 2.2 — darunter waere es keine
       eigene Stufe mehr, sondern Rauschen: ein Abstand, den man neben 1.25
       nicht zuverlaessig unterscheidet, kostet Platz und sagt nichts.

       2rem UND NICHT 1.9: die Zahl gibt es in dieser Datei schon als „eine
       Stufe groesser als ein Block, aber kein Seitenende" (der Abstand ueber
       der Abschlusskarte). Eine vierte Groesse zu erfinden, wo eine passende
       dasteht, macht die Leiter nur laenger.

       Ein Gespraech ist ein SZENENWECHSEL — und der ist beim Betreten
       derselbe Vorgang wie beim Verlassen. Deshalb gilt der Wert in beide
       Richtungen. */
    --cl-szenenabstand: 2rem;

    /* --cl-aufzaehlung-spalte: die Breite, in der die haengende Ziffer steht.
       Sie ist gleichzeitig der Einzug des Textes daneben — eine Zahl, zwei
       Verwendungen, damit Ziffer und Text nicht auseinanderlaufen koennen. */
    --cl-aufzaehlung-spalte: 2.4rem;

    /* Geometry */
    --cl-radius:       12px;
    --cl-radius-lg:    16px;
    --cl-radius-xl:    20px;
    --cl-radius-pill:  50px;

    /* Shadows */
    --cl-shadow-sm:    0 1px 4px rgba(0, 0, 0, 0.25);
    --cl-shadow:       0 4px 16px rgba(0, 0, 0, 0.3);
    --cl-shadow-lg:    0 8px 32px rgba(0, 0, 0, 0.4);
    --cl-shadow-gold:  0 0 24px rgba(200, 149, 42, 0.15);

    /* Motion */
    --cl-ease:         cubic-bezier(0.4, 0, 0.2, 1);
    --cl-duration:     200ms;
    --cl-duration-slow: 350ms;

    /* Layout */
    --cl-sidebar-w:    240px;
    --cl-navbar-h:     56px;
    --cl-bottombar-h:  64px;

    /* 07.09.2026 (Paket 1c) — WIE HOCH DIE KOPFLEISTE WIRKLICH IST.
       --cl-navbar-h ist ihr INHALT, seit Paket 1b liegt darueber noch der
       obere Geraeterand: die Grid-Zeile ist navbar-h + env(top) hoch. Wer
       Platz UNTER dem Kopf berechnet, braucht diese Summe und nicht
       --cl-navbar-h; drei Stellen haben bis hierher mit der falschen Zahl
       gerechnet und lagen damit um den Rand daneben.
       ES BLEIBEN ZWEI TOKEN und nicht eines: --cl-navbar-h ist weiterhin die
       Hoehe, in der die Symbole stehen (die Grid-Zeile leitet sich davon ab),
       --cl-navbar-total die Hoehe, die sie im Fenster belegt.
       WENN DAS UMGEBUNGSBAND STEHT, wird der Wert weiter unten auf
       --cl-navbar-h zurueckgesetzt: dann polstert das Band den Rand, nicht
       der Kopf. */
    --cl-navbar-total: calc(var(--cl-navbar-h) + env(safe-area-inset-top, 0px));

    /* ─── BAU P6: DIE EBENEN. VIER STUFEN, EINE STELLE ──────────────────────

       BEFUND (31.08.2026): es gab keine gemeinsame Festlegung. Jede Datei und
       fast jeder Baustein vergab eine eigene Zahl — 100 (Navigation, untere
       Leiste), 1000/1001 (Popover), 1040/1050 (Mehr-Blatt, Benachrichtigungen),
       1050 (Fokusdialog, horses.css), 1060 (Pferdewechsel, horses.css), 2000
       (Umgebungsband), 9999 (Hinweisstreifen). Zwei Stylesheets, kein
       gemeinsamer Massstab, und ein Kommentar am Umgebungsband, der von
       "Navigation (1000)" spricht, waehrend die Navigation auf 100 steht.

       DAS WAR NICHT DIE URSACHE DES GEMELDETEN FEHLERS — der lag an
       pointer-events, siehe .hrs-wechsel__hintergrund. Aber es ist der Grund,
       warum niemand vorher sagen konnte, ob ein Blatt ueber der Leiste liegt:
       man musste zwei Dateien lesen und Zahlen vergleichen.

       VIER STUFEN, mehr braucht diese Anwendung nicht:
         inhalt  alles, was mitscrollt
         leiste  Navigation oben und unten — bleibt stehen, gehoert aber
                 zur Seite
         blatt   was sich UEBER die Seite legt und sie verdeckt
         dialog  was sich ueber ein Blatt legt (Fokusdialog aus dem Hero)

       Ein Blatt liegt damit IMMER ueber der Leiste, und zwar ohne dass jemand
       nachrechnen muss. Sitzt eine Flaeche als GESCHWISTER ueber ihrem
       Hintergrund (Mehr-Blatt, Benachrichtigungen, Popover), bekommt sie
       calc(... + 1) — dieselbe Stufe, eine Lage darueber.

       Die Abstaende sind grosszuegig, damit ein spaeterer Zwischenwert nicht
       sofort die naechste Stufe beruehrt. */
    --cl-ebene-inhalt: 1;
    --cl-ebene-leiste: 100;
    --cl-ebene-blatt: 1000;
    --cl-ebene-dialog: 1100;

    /* --- Schrift (13.08.2026) ---------------------------------------------
       DM Sans kommt aus Cavallearn.Schrift; --cav-schrift-grund ist dort
       gesetzt (_content/Cavallearn.Schrift/cav-schrift.css, in index.html
       vor dieser Datei geladen).

       HIER STEHT KEIN SCHRIFTSTAPEL, sondern nur der Zeiger auf den einen.
       Zwei Leitungen fuehren in dieser Anwendung zur Grundschrift, und beide
       muessen auf dasselbe Token zeigen, sonst sieht man den Unterschied nur
       an einer Stelle:

         1. `body { font-family: … }` weiter unten — das ist DIE Stelle, an
            der die Grundschrift der Anwendung gesetzt wird.
         2. Bootstraps eigener Kanal. bootstrap.min.css setzt
            `body { font-family: var(--bs-body-font-family) }`, und
            --bs-body-font-family zeigt auf --bs-font-sans-serif. Regel 1
            gewinnt gegen den body-Teil (gleiche Spezifitaet, spaeter
            geladen) — aber --bs-font-sans-serif steht ausserdem an
            .tooltip und .popover, und die erreicht Regel 1 nicht.
            Deshalb wird die WURZEL umgebogen und nicht der body-Fall.

       Wer eine dritte Leitung aufmacht, macht sie an genau dieser Stelle
       auf, nicht am Bauteil. */
    --bs-font-sans-serif: var(--cav-schrift-grund, system-ui, -apple-system, "Segoe UI", sans-serif);
}

/* --- Light Theme ------------------------------------------- */
[data-theme="light"] {
    --cl-navy-dark:    #F5F3EF;
    --cl-navy:         #FFFFFF;
    --cl-navy-light:   #F0EDE7;
    --cl-navy-lighter: #E8E4DC;
    --cl-gold:         #B8860B;
    --cl-gold-light:   #C8952A;
    --cl-gold-pale:    #5C4300;
    --cl-gold-dark:    #8B6914;
    --cl-white:        #FFFFFF;

    --cl-text:         rgba(0, 0, 0, 0.87);
    --cl-text-muted:   rgba(0, 0, 0, 0.55);
    --cl-text-subtle:  rgba(0, 0, 0, 0.35);

    --cl-success:      #16A34A;
    --cl-warning:      #CA8A04;
    --cl-danger:       #DC2626;

    /* Dieselbe Rolle wie im Dunkeln, aus dem hellen Warnton gemischt. Die
       Deckung bleibt bei 0.10: auf hellem Grund traegt ein dunklerer Ton
       schon bei gleicher Deckung mehr, deshalb wird sie NICHT erhoeht. */
    --cl-warning-wash: rgba(202, 138, 4, 0.10);

    --cl-glass-bg:     rgba(0, 0, 0, 0.03);
    --cl-glass-border: rgba(0, 0, 0, 0.08);
    --cl-glass-hover:  rgba(0, 0, 0, 0.05);
    --cl-glass-blur:   blur(12px);

    --cl-gold-glow:       rgba(184, 134, 11, 0.1);
    --cl-gold-border:     rgba(184, 134, 11, 0.3);
    --cl-gold-border-dim: rgba(184, 134, 11, 0.12);

    --cl-shadow-sm:    0 1px 3px rgba(0, 0, 0, 0.08);
    --cl-shadow:       0 2px 8px rgba(0, 0, 0, 0.1);
    --cl-shadow-lg:    0 4px 20px rgba(0, 0, 0, 0.12);
    --cl-shadow-gold:  0 0 20px rgba(184, 134, 11, 0.1);
}

/* Light overrides for components that use hardcoded colors */
[data-theme="light"] .cl-sidebar .cl-nav-item.active {
    background: linear-gradient(135deg, rgba(184, 134, 11, 0.12) 0%, rgba(184, 134, 11, 0.04) 100%);
    color: var(--cl-gold);
}
[data-theme="light"] .cl-auth-card .form-control {
    background: var(--cl-white);
    color: var(--cl-text);
}
[data-theme="light"] .cl-auth-card .form-control:focus {
    background: var(--cl-white);
}
[data-theme="light"] .cl-status-dot--green  { box-shadow: 0 0 6px rgba(22, 163, 74, 0.3); }
[data-theme="light"] .cl-status-dot--yellow { box-shadow: 0 0 6px rgba(202, 138, 4, 0.3); }
[data-theme="light"] .cl-status-dot--red    { box-shadow: 0 0 6px rgba(220, 38, 38, 0.3); }
[data-theme="light"] .cl-btn-pill-gold {
    background: linear-gradient(135deg, var(--cl-gold) 0%, var(--cl-gold-light) 100%);
    color: var(--cl-white);
}

/* --- Gutachten Zone (Bronze/Kupfer) -------------------------
   H1c — swap the SURFACE, keep the accents. A CONTEXT zone (by route), not a
   role colour. One wrapper class (.cl-zone-gutachten on .cl-app, set by
   MainLayout from the route) re-points ONLY the navy surface tokens to a warm
   bronze/sand. --cl-gold* are deliberately LEFT UNTOUCHED → buttons, icons,
   active states and the brand stay gold. Every .cl-* component inherits the new
   surface automatically — NO component is duplicated or recoloured individually.
   Warm (hue ~30°): not red (= error), not green (= "Kräftigen"). */
.cl-app.cl-zone-gutachten {
    --cl-navy-dark:    #1B1710;  /* warm espresso — page bg (as dark as navy, warm) */
    --cl-navy:         #262019;  /* cards / navbar / sidebar */
    --cl-navy-light:   #322A20;
    --cl-navy-lighter: #3E3528;
}

/* Light mode: warm sand instead of cream — reads as a different room without
   pre-empting the later full light-mode redesign. */
[data-theme="light"] .cl-app.cl-zone-gutachten {
    --cl-navy-dark:    #F2E9DC;  /* warm sand — page bg */
    --cl-navy:         #FBF6EE;  /* cards */
    --cl-navy-light:   #EDE1D0;
    --cl-navy-lighter: #E4D5C0;
}

/* --- Sidebar groups (real headings replace blank <hr>, H1c) - */
.cl-nav-group + .cl-nav-group { margin-top: .5rem; }
.cl-nav-group-title {
    padding: .5rem .9rem .25rem;
    font-size: .68rem;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--cl-text-subtle);
}

/* --- BAUSCHRITT 3, ABSCHLUSS (01.09.2026): "Neue Analyse für {Name}" -----
   NUR DER ABSTAND. Der Knopf selbst traegt hrs-btn hrs-btn--ghost aus
   horses.css — das liegt im geteilten Modul Modules.Horses.Contracts und wird
   fuer eine Cavallearn-Seite nicht erweitert. Was hier fehlte, ist einzig die
   Luft zwischen Bild und Zahlenzeile; die gehoert dem Client. */
.cl-pferdaktion {
    margin: 1rem 0 1.25rem;
}

/* --- BAUSCHRITT 3 (01.09.2026): DER LEERE BETREUUNGSBLOCK ----------------
   EINE ZEILE, KEIN KASTEN. Der Leerzustand ist der Normalfall — fast niemand
   wird betreut — und er sitzt ueber dem Zweck der Seite „Trainer fragen".
   Als .cl-card-glass mit Symbol war er das groesste Ding auf einem Weg, der
   von etwas anderem handelt.

   NEUE KLASSE, KEINE UMDEFINITION: .cl-text-muted traegt weiter die Farbe,
   hier kommt nur die Breite und der Abstand dazu. Die Zeile begrenzt sich auf
   Lesebreite, damit sie auf dem Desktop nicht ueber die halbe Seite laeuft. */
.cl-betreuungsblock__leer {
    max-width: 56ch;
    margin: 0 0 1.25rem;
    font-size: .875rem;
    line-height: 1.5;
}

/* --- BAU 1 (01.09.2026): DIE BEREICHSZEILE IST DER LINK ------------------
   NEUE KLASSEN, KEINE UMDEFINITION. .cl-nav-item und .cl-bottom-tab bleiben
   unangetastet — die traegt der Admin-Bereich mit, und dort wird gerade
   parallel gebaut. Was hier steht, greift NUR, wenn NavMenu die Zusatzklasse
   setzt, also nur bei LandungIstGruppe.
   (Hier stand .cl-area-switch als dritte. Die Klasse ist am 01.09.2026 mit
   dem Pillen-Umschalter entfallen; der Rollenwechsel liegt seither hinter
   dem Avatar.)

   WARUM DIE ZEILE NICHT MEHR AUSSIEHT WIE EINE UEBERSCHRIFT: sie ist keine
   mehr. 0.68rem in Grossbuchstaben und gedaempfter Farbe sagt „Rubrik, nicht
   anfassen"; seit sie das Ziel ist, muss sie wie ein Weg aussehen und sich
   treffen lassen (44 px, dieselbe Trefferflaeche wie ein Unterpunkt).

   DIE EINRUECKUNG TRAEGT DIE HIERARCHIE: die Kinder ruecken um die Breite des
   Elternsymbols ein, damit ihre Beschriftungen unter der des Elternteils
   beginnen. Das gilt unveraendert — die RANGORDNUNG kommt aus Einzug und
   Gewicht, nicht aus Farbe.

   HIER STAND „nicht ein Strich und keine zweite Farbe", und seit dem
   01.09.2026 steht links der Kinder ein Strich. Der Satz ist nicht falsch
   gewesen, er ist abgeloest — beides gehoert festgehalten:

   WARUM ER DAMALS RICHTIG WAR: es gab nichts zu tragen. Die Bereichsfarbe sass
   auf der Schrift der Elternzeile (Bau 49b), und eine Linie haette dieselbe
   Zugehoerigkeit ein zweites Mal behauptet. Ein Strich ohne eigene Aussage ist
   Zierrat, und Zierrat in einem Menue kostet Aufmerksamkeit, die der aktive
   Eintrag braucht.

   WAS IHN ABGELOEST HAT: die Farbe MUSSTE von der Schrift herunter. Seit Bau 1
   ist die Elternzeile ein Ziel und kein Rubriktitel mehr; dort liest sich
   Farbe als Zustand, und Zustand ist Gold (die ausfuehrliche Begruendung steht
   im Bau-49b-Block, weiter unten in dieser Datei). Die Farbe braucht also
   einen anderen Traeger, und die Linie ist der leiseste, den es gibt: eine
   duenne Flaeche kann keinen Zustand behaupten.

   DAMIT SAGT DER STRICH ETWAS, DAS DIE EINRUECKUNG NICHT SAGEN KANN — welcher
   Bereich das ist. Die Einrueckung sagt nur, dass es tiefer liegt. Zwei
   verschiedene Auskuenfte, zwei verschiedene Mittel; keine davon ist doppelt.
   Faellt die Bereichsfarbe eines Tages ganz weg, faellt die Linie mit ihr, und
   der Satz von Bau 1 gilt wieder woertlich. */
.cl-nav-group-title--link {
    display: flex;
    align-items: center;
    gap: .75rem;
    padding: .65rem .85rem;
    border-radius: var(--cl-radius);
    text-decoration: none;
    color: var(--cl-text);
    font-size: .9rem;
    font-weight: 600;
    /* Die drei Zeilen nehmen die Ueberschriftenform zurueck, die
       .cl-nav-group-title vorgibt — sie bleibt fuer jede Gruppe OHNE
       LandungIstGruppe unveraendert in Kraft. */
    letter-spacing: normal;
    text-transform: none;
    min-height: 44px;
    transition: all var(--cl-duration) var(--cl-ease);
}
.cl-nav-group-title--link i { font-size: 1.15rem; width: 1.25rem; text-align: center; }
.cl-nav-group-title--link:hover {
    background: var(--cl-glass-bg);
    color: var(--cl-text);
}
/* Gold heisst „hier bist du" — dieselbe Aussage wie beim Unterpunkt, damit
   niemand zwei Sprachen fuer denselben Zustand lernen muss. */
.cl-nav-group-title--link.active {
    background: linear-gradient(135deg, rgba(200, 149, 42, 0.15) 0%, rgba(200, 149, 42, 0.05) 100%);
    color: var(--cl-gold);
    border: 1px solid var(--cl-gold-border-dim);
}
/* Und dieselbe Aussage auch in einer gefaerbten Gruppe. Bau 49b (D4) faerbt
   die Gruppenueberschrift mit `.cl-nav-group.cl-bereich > .cl-nav-group-title`
   (drei Klassen, weiter unten in dieser Datei) — solange die Zeile kein Link
   war, konnte sie nie aktiv sein, und die Frage stellte sich nicht. Jetzt
   stellt sie sich, und die Bereichsfarbe wuerde das Gold schlucken. Vier
   Klassen, damit die Reihenfolge in der Datei keine Rolle spielt.
   NICHT als Aenderung an der Regel von Bau 49b: die gilt fuer jede Gruppe
   OHNE LandungIstGruppe unveraendert weiter. */
.cl-nav-group.cl-bereich > .cl-nav-group-title--link.active { color: var(--cl-gold); }

/* Das Kind unter einer klickbaren Bereichszeile. Der Einzug ist Symbolbreite
   (1.25rem) plus Abstand (.75rem); der Innenabstand links wird um denselben
   Betrag gekuerzt, damit die Zeile nicht breiter wird als ihr Elternteil.
   MIT .cl-sidebar .cl-nav-group DAVOR UND OHNE !important: die Grundform
   steht als `.cl-sidebar .cl-nav-item` (zwei Klassen) WEITER UNTEN in dieser
   Datei. Eine einklassige Regel hier oben verloere gegen sie, ohne dass es
   jemand saehe — die Zeile waere schlicht nicht eingerueckt. Drei Klassen
   gewinnen unabhaengig von der Reihenfolge.

   01.09.2026 — DAZUGEKOMMEN IST DIE LINIE, und der Einzug ist um ihre Breite
   gekuerzt (2rem - 2px): der TEXT steht damit auf denselben Pixel wie vorher,
   die Linie belegt die zwei Pixel davor. Ohne die Kuerzung waere die ganze
   Kindzeile um zwei Pixel nach rechts gewandert.

   SIE IST DURCHGEHEND, ohne dass jemand ein Huellelement braucht: die Kinder
   liegen als Bloecke direkt untereinander. Der Abstand von 2px in
   `.cl-sidebar .cl-nav` gilt zwischen den GRUPPEN, nicht innerhalb einer —
   `.cl-nav-group` ist ein gewoehnliches div ohne flex und ohne gap. Waere das
   anders, saehe man eine gestrichelte Linie.

   DAS AKTIVE KIND UNTERBRICHT SIE, und das ist gewollt. `.cl-sidebar
   .cl-nav-item.active` setzt einen vollen Rahmen in Gold (drei Klassen, weiter
   unten) und schlaegt diese Regel damit auf allen vier Seiten. Der laufende
   Eintrag tritt aus der Linie heraus — dieselbe Aussage wie das Gold selbst.

   EINE SPUR KLEINER UND LEICHTER als die Zeile darueber (.82rem statt .9rem,
   400 statt 500). Die Farbe bleibt, wo sie war: der Unterschied soll aus dem
   Gewicht kommen, nicht aus einem zweiten Grauton. */
/* 02.09.2026 — DIE LINIE HAENGT AN DER HUELLE, NICHT AM KIND.

   SIE WAR IN SEGMENTE ZERTEILT, und der Grund war weder Abstand noch gap:
   jedes Kind traegt border-radius: 12px (.cl-sidebar .cl-nav-item, weiter
   unten). Ein linker Rand auf einem abgerundeten Kasten kruemmt sich oben und
   unten je 12 px von der Kante weg — zwischen zwei Zeilen klaffte damit rund
   24 px. Die Kaesten selbst liegen lueckenlos untereinander; die Rundung hat
   die Linie zerschnitten.

   Ich hatte am 01.09. das Gegenteil behauptet („sie ist durchgehend, die
   Kinder liegen als Bloecke direkt untereinander"). Der erste Teil stimmte,
   der Schluss nicht — ich habe an die Kastengrenzen gedacht und nicht an
   ihre Ecken. Das Bild von DEV hat es gezeigt.

   DIE HUELLE HAT KEINE RUNDUNG und keine Zeilengrenzen: ihr Rand laeuft von
   der Oberkante des ersten bis zur Unterkante des letzten Kindes. Und sie
   liegt HINTER den Kindern — der Goldrahmen des aktiven Kindes legt sich
   darauf, statt die Linie zu unterbrechen. */
.cl-sidebar .cl-nav-group .cl-nav-kinder {
    margin-left: calc(2rem - 2px);
    border-left: 2px solid var(--cl-bereich-gruppe, var(--cl-glass-border));
}

/* Das Kind traegt seither KEINEN Rand mehr. Der Einzug ist von 2rem auf .35rem
   geschrumpft — die 2rem stehen jetzt an der Huelle, und der TEXT landet auf
   demselben Pixel wie vorher: Huelle 2rem-2px + Rand 2px + Innenabstand
   .35rem. */
.cl-sidebar .cl-nav-group .cl-nav-item--kind {
    padding-left: .35rem;
    font-size: .82rem;
    font-weight: 400;
}
/* Eingeklappte Seitenleiste: dort steht nur noch das Symbol, ein Einzug haette
   nichts, wovon er einruecken koennte — und eine Linie, die nichts einrueckt,
   haengt frei am Rand. Beides faellt weg. */
.cl-sidebar--collapsed .cl-nav-group .cl-nav-kinder { margin-left: 0; border-left: none; }
.cl-sidebar--collapsed .cl-nav-group .cl-nav-item--kind { padding-left: 0; }
.cl-sidebar--collapsed .cl-nav-group-title--link { justify-content: center; padding-left: 0; padding-right: 0; }
.cl-sidebar--collapsed .cl-nav-group-title--link span { display: none; }

/* ── 03.09.2026 — DIE GRUPPEN OHNE EIGENE LANDUNG ─────────────────────────

   BEFUND. Die Regel darueber blendet nur das <span> aus, und nur in der
   LINK-Variante. Eine Gruppe ohne eigene Landung rendert NavMenu.razor aber
   als
       <div class="cl-nav-group-title">@g.Label</div>
   — ohne span und ohne Symbol. In der schmalen Leiste blieb ihr Text stehen
   und brach um: aus „Mappen-Bewertung" wurde „MA BEW".

   WIE VIELE. Von 32 Gruppen tragen nur drei LandungIstGruppe (Training,
   Lernen, Profil). Die anderen 29 sind betroffen — Gutachten, Inhalte,
   Admin, Sattler, Ausbilder, also praktisch die ganze Anwendung ausser dem
   Reiterbereich.

   WARUM AUSBLENDEN UND NICHT EIN SYMBOL NACHRUESTEN. Ein Symbol im Markup
   nachzuruesten waere die groessere Aenderung: sie traefe JEDE Seite der
   Anwendung und liefe gegen mehrere Bestandswaechter, die dieses Markup
   lesen. Ausgeblendet bleibt die Leiste das, was sie eingeklappt sein soll —
   ein Symbolstreifen; die Kinder tragen ihre Symbole selbst. Der Strich
   darunter haelt die Gruppen auseinander, damit sie nicht zu einer Kette
   verschmelzen. */
.cl-sidebar--collapsed .cl-nav-group-title:not(.cl-nav-group-title--link) {
    height: 0;
    padding: 0;
    margin: .4rem 0;
    overflow: hidden;
    border-top: 1px solid rgba(255, 255, 255, .12);
}

/* --- Bottom-nav centre HORSE slot (H1d) -------------------- */
/* A destination avatar (active horse), NOT a "+" action FAB. */
.cl-bottom-horse {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    width: 52px;
    height: 52px;
    margin-top: -14px;
    border-radius: 50%;
    overflow: hidden;
    background: var(--cl-navy-lighter);
    border: 2px solid var(--cl-gold-border);
    color: var(--cl-gold-light);
    box-shadow: var(--cl-shadow);
    font-weight: 700;
    font-size: 1.15rem;
    text-decoration: none;
}
/* BAU P3a — DIE HUELLE VON PferdAvatar VERSCHWINDET AUS DEM LAYOUT.

   Ueberall sonst traegt PferdAvatar selbst die Kreisklasse. Hier nicht: der
   Kreis ist der NavLink, und der Avatar sitzt darin. Ohne diese Regel stuende
   zwischen Kreis und Bild ein <span> ohne Groesse — das Bild fuellte den Kreis
   nicht mehr, weil "height: 100%" sich auf einen Inline-Kasten ohne Hoehe
   bezoege.

   display:contents statt einer nachgebauten Groesse: der Kasten faellt aus dem
   Layout, seine Kinder ruecken an seine Stelle. Damit gilt .cl-bottom-horse img
   unveraendert weiter. */
.cl-avatar-durchreichen { display: contents; }

.cl-bottom-horse img { width: 100%; height: 100%; object-fit: cover; }

/* BAU P8 — DAS WAPPEN IM MITTELKNOPF, bei mehreren Pferden.
   Es FUELLT den Kreis nicht wie ein Foto, sondern sitzt mit Luft darin: ein
   Zeichen, kein Bild. object-fit:contain statt cover, damit nichts
   abgeschnitten wird. */
.cl-bottom-wappen {
    width: 70%; height: 70%;
    object-fit: contain;
}
.cl-bottom-horse.active { border-color: var(--cl-gold); box-shadow: var(--cl-shadow), var(--cl-shadow-gold); }
/* Bau 35f — im Pferdebereich wird der Mittelplatz zur Hauptaktion der Seite
   (Muster aus Worklino/PageActionService). Ausserhalb bleibt er das aktive
   Pferd: dort ist er ein ZIEL, kein Knopf. Farben ueber die bestehenden
   Marken, keine neuen festen Werte. */
.cl-bottom-horse--aktion {
    border-color: var(--cl-gold);
    background: var(--cl-gold);
    color: var(--cl-bg, #14161a);
    font-size: 1.25rem;
    cursor: pointer;
}

/* --- Bottom-tab highlight by group membership (H1d) -------- */
.cl-bottom-tab.cl-tab-active { color: var(--cl-gold); }

/* --- Landing pages (H1d) ----------------------------------- */
.cl-landing { max-width: 760px; }
.cl-landing-head { margin-bottom: 1rem; }
.cl-landing-title { font-size: 1.35rem; font-weight: 700; margin: 0; }
.cl-landing-sub { color: var(--cl-text-muted); margin: .25rem 0 0; font-size: .9rem; }
.cl-landing-intro { margin-bottom: 1.25rem; }
.cl-landing-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: .75rem; }
.cl-landing-tile {
    display: flex; align-items: center; gap: .75rem;
    padding: 1rem;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
    color: var(--cl-text);
    text-decoration: none;
    transition: background var(--cl-duration) var(--cl-ease), border-color var(--cl-duration) var(--cl-ease);
}
.cl-landing-tile:hover { background: var(--cl-glass-hover); border-color: var(--cl-gold-border); }
.cl-landing-tile-icon {
    display: flex; align-items: center; justify-content: center;
    width: 40px; height: 40px; flex: 0 0 auto;
    border-radius: 10px;
    background: var(--cl-gold-glow); color: var(--cl-gold-light); font-size: 1.15rem;
}
.cl-landing-tile-label { font-weight: 600; }
.cl-landing-tile-chevron { margin-left: auto; color: var(--cl-text-subtle); }

/* Training loop cards */
.cl-loop { display: flex; flex-direction: column; gap: .6rem; }
.cl-loop-card {
    display: flex; align-items: center; gap: .8rem;
    padding: .9rem 1rem;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
    color: var(--cl-text); text-decoration: none;
}
.cl-loop-card:hover { border-color: var(--cl-gold-border); }
.cl-loop-card > .bi:first-child { font-size: 1.3rem; color: var(--cl-gold-light); flex: 0 0 auto; }
.cl-loop-card--action { border-color: var(--cl-gold-border); background: var(--cl-gold-glow); }
.cl-loop-card-body { display: flex; flex-direction: column; gap: .1rem; min-width: 0; }
.cl-loop-card-title { font-weight: 700; overflow-wrap: anywhere; }
.cl-loop-card-sub { font-size: .82rem; color: var(--cl-text-muted); overflow-wrap: anywhere; }
.cl-loop-card .bi-chevron-right { margin-left: auto; color: var(--cl-text-subtle); }
.cl-loop-cta { align-self: flex-start; margin-top: .25rem; }

/* Build J — rider plan catalog */
.cl-plan-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: .85rem; }
.cl-plan-card { display: flex; flex-direction: column; gap: .6rem; }
.cl-plan-card-head { display: flex; flex-direction: column; gap: .4rem; }
.cl-plan-card-title { font-weight: 700; font-size: 1.05rem; overflow-wrap: anywhere; }
.cl-plan-ex-list { margin: 0; padding-left: 1.1rem; display: flex; flex-direction: column; gap: .15rem; font-size: .85rem; }
.cl-plan-ex-list li { color: var(--cl-text); overflow-wrap: anywhere; }

/* Horse landing hero + switcher */
.cl-horse-hero { display: flex; align-items: center; gap: 1rem; margin-bottom: 1.25rem; }
.cl-horse-hero-avatar {
    display: flex; align-items: center; justify-content: center;
    width: 72px; height: 72px; flex: 0 0 auto;
    border-radius: 50%; overflow: hidden;
    background: var(--cl-navy-lighter); border: 2px solid var(--cl-gold-border);
    color: var(--cl-gold-light); font-size: 1.8rem; font-weight: 700;
}
.cl-horse-hero-avatar img { width: 100%; height: 100%; object-fit: cover; }
.cl-horse-actions { display: flex; flex-wrap: wrap; gap: .6rem; }
.cl-horse-switch { display: flex; flex-direction: column; gap: .4rem; }
.cl-horse-switch-item {
    display: flex; align-items: center; gap: .7rem;
    padding: .55rem .75rem;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
    color: var(--cl-text); cursor: pointer; text-align: left;
    transition: border-color var(--cl-duration) var(--cl-ease);
}
.cl-horse-switch-item:hover { border-color: var(--cl-gold-border); }
.cl-horse-switch-item.active { border-color: var(--cl-gold); background: var(--cl-gold-glow); }
.cl-horse-switch-avatar {
    display: flex; align-items: center; justify-content: center;
    width: 36px; height: 36px; flex: 0 0 auto;
    border-radius: 50%; overflow: hidden;
    background: var(--cl-navy-lighter); color: var(--cl-gold-light); font-weight: 700;
}
.cl-horse-switch-avatar img { width: 100%; height: 100%; object-fit: cover; }
.cl-horse-switch-name { font-weight: 600; }

/* Home active-horse anchor */
.cl-home-horse { display: flex; align-items: center; gap: .8rem; padding: .8rem 1rem; text-decoration: none; color: var(--cl-text); margin-bottom: 1rem; }
.cl-home-horse-avatar {
    display: flex; align-items: center; justify-content: center;
    width: 48px; height: 48px; flex: 0 0 auto;
    border-radius: 50%; overflow: hidden;
    background: var(--cl-navy-lighter); border: 2px solid var(--cl-gold-border);
    color: var(--cl-gold-light); font-weight: 700;
}
.cl-home-horse-avatar img { width: 100%; height: 100%; object-fit: cover; }
.cl-home-horse-body { display: flex; flex-direction: column; }
.cl-home-horse-lead { font-size: .75rem; color: var(--cl-text-muted); }
.cl-home-horse-name { font-weight: 700; font-size: 1.05rem; }
.cl-home-horse .bi-chevron-right { margin-left: auto; color: var(--cl-text-subtle); }

/* Profile cards */
.cl-profile-card { max-width: 520px; margin-bottom: 1.25rem; }
.cl-profile-card-title { font-size: 1rem; font-weight: 700; margin: 0 0 .75rem; display: flex; align-items: center; gap: .5rem; }
.cl-profile-card-title .bi { color: var(--cl-gold-light); }
.cl-profile-row { display: flex; justify-content: space-between; gap: 1rem; padding: .4rem 0; border-top: 1px solid var(--cl-glass-border); }
.cl-profile-row:first-of-type { border-top: none; }
.cl-profile-row-label { color: var(--cl-text-muted); font-size: .9rem; }
.cl-profile-row-value { font-weight: 600; text-align: right; }
.cl-profile-links { display: flex; flex-direction: column; }
.cl-profile-links a { display: flex; align-items: center; gap: .4rem; padding: .5rem 0; color: var(--cl-text); text-decoration: none; border-top: 1px solid var(--cl-glass-border); }
.cl-profile-links a:first-child { border-top: none; }
.cl-profile-links a .bi { color: var(--cl-text-subtle); font-size: .8rem; }

/* --- H1e polish utilities (token-based, reused across pages) - */
/* Elegant empty state — reads as an invitation, not an error. */
.cl-empty {
    display: flex; flex-direction: column; align-items: center; text-align: center;
    gap: .6rem; padding: 2.25rem 1.5rem;
    background: var(--cl-glass-bg);
    border: 1px dashed var(--cl-gold-border-dim);
    border-radius: var(--cl-radius-lg);
}
.cl-empty-icon {
    display: flex; align-items: center; justify-content: center;
    width: 56px; height: 56px; border-radius: 50%;
    background: var(--cl-gold-glow); color: var(--cl-gold-light); font-size: 1.6rem;
}
.cl-empty-title { font-weight: 700; font-size: 1.05rem; }
.cl-empty-sub { color: var(--cl-text-muted); font-size: .88rem; max-width: 36ch; }
.cl-empty .cl-btn-pill { margin-top: .35rem; }

/* Inline button row — buttons size to content, wrap on narrow (NOT full-width). */
.cl-btn-row { display: flex; flex-wrap: wrap; gap: .6rem; align-items: center; }
/* Compact secondary pill (smaller than the 48px hero button). */
.cl-btn-sm { padding: 8px 16px; min-height: 40px; font-size: .88rem; }

/* Responsive table — horizontal scroll with a clear edge on phones. */
.cl-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; border-radius: var(--cl-radius); }
.cl-table-wrap > table { min-width: 560px; }

/* Readable page container — keeps desktop content from stretching thin.
   POSTEN C1: das "margin: 0 auto" fehlte, weshalb die Klasse zwar die Breite
   begrenzte, den Inhalt aber links kleben liess. Sie war bis dahin von keiner
   Seite benutzt; die Kapitelansicht ist die erste. Dieselbe Breite und
   dieselbe Zentrierung wie .cl-dashboard — kein neuer Wert. */
.cl-page { max-width: 880px; margin: 0 auto; }

/* --- Bau 46 (B) / BAU 5 (29.08.2026) — die zweite Ebene am Telefon ---

   AUS DEM KACHELRASTER IST EINE ZEILE GEWORDEN. Zwei Spalten mal drei Reihen
   nahmen auf /training die halbe erste Bildschirmhoehe, bevor irgendein Inhalt
   kam — ein Menue, das sich wie Inhalt auffuehrt. Jetzt: eine waagrecht
   scrollbare Zeile, dasselbe Muster wie .cl-pferdestreifen weiter unten.

   NUR SCHMAL, unveraendert. Der Umbruch ist derselbe wie der Layoutwechsel in
   app.css (991.98px): oberhalb steht die Seitenleiste daneben, und dieselbe
   Liste zweimal ist keine Hilfe, sondern eine Frage.

   WELCHE Eintraege drinstehen, entscheidet LeistenRegel und nicht dieses
   Formular. */
.cl-gruppenleiste {
    position: relative;
    margin: 0 0 1rem;
}

/* Das Scrollen bleibt IM Element (overflow-x hier, nicht am Body) — die Seite
   selbst laeuft am Telefon nicht waagrecht. Wortgleich zur Begruendung am
   Pferdestreifen. */
.cl-gruppenleiste__spur {
    display: flex; gap: .5rem;
    overflow-x: auto; overflow-y: hidden;
    padding-bottom: .2rem;
    scroll-snap-type: x proximity;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
}
/* Kein Rollbalken: er kostet am Telefon Hoehe und traegt nichts — die
   Verlaufskante sagt dasselbe und nimmt keinen Platz. */
.cl-gruppenleiste__spur::-webkit-scrollbar { display: none; }

/* KEIN GOLD ALS FLAECHE. Gold traegt auf einem Schirm genau eine Aussage —
   "hier ist die Handlung" —, und die gehoert dem einen Knopf. Die Leiste ist
   Navigation: neutraler Haarstrich, das Symbol in Gold. */
.cl-gruppenpille {
    flex: 0 0 auto;
    display: inline-flex; align-items: center; gap: .4rem;
    padding: .5rem .85rem;
    min-height: 40px;
    border-radius: var(--cl-radius-pill);
    border: 1px solid var(--cl-glass-border);
    background: transparent;
    color: var(--cl-text); text-decoration: none;
    font-size: .85rem; font-weight: 600;
    white-space: nowrap;                   /* kein Umbruch: eine Pille, ein Wort */
    scroll-snap-align: start;
}
.cl-gruppenpille i { color: var(--cl-gold-light); font-size: 1rem; }
.cl-gruppenpille:hover {
    border-color: var(--cl-gold-border);
    color: var(--cl-text);
}
/* Der Fokusring liegt AUSSERHALB der Pille (outline-offset) — sonst
   verschwindet er beim waagrechten Scrollen unter dem Nachbarn. */
.cl-gruppenpille:focus-visible {
    outline: 2px solid var(--cl-gold);
    outline-offset: 2px;
}

/* DIE VERLAUFSKANTE. Sie haengt an einer Klasse, die JavaScript setzt, wenn
   scrollWidth > clientWidth — passt alles ins Bild, gibt es sie nicht. Ohne
   JavaScript gibt es sie auch nicht; die Leiste selbst funktioniert weiter.

   ALS MASKE UND NICHT ALS FARBVERLAUF DARUEBER: ein Verlauf muesste die
   Hintergrundfarbe der Seite kennen, und die gibt es in zwei Fassungen (dunkel
   und hell, siehe Tokenblock oben). Die Maske blendet den INHALT aus und
   braucht keine Farbe — sie stimmt in beiden. */
.cl-gruppenleiste--laeuft .cl-gruppenleiste__spur {
    -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 36px), transparent);
            mask-image: linear-gradient(to right, #000 calc(100% - 36px), transparent);
}
/* Ganz rechts angekommen: die Kante verschwindet. Sonst deutete sie auf
   Inhalt, den es nicht mehr gibt. */
.cl-gruppenleiste--ende .cl-gruppenleiste__spur {
    -webkit-mask-image: none;
            mask-image: none;
}

@media (min-width: 992px) {
    .cl-gruppenleiste { display: none; }
}

/* --- Reset & Global ---------------------------------------- */
body {
    margin: 0;
    /* DIE Stelle fuer die Grundschrift der Anwendung. Bis zum 13.08.2026 stand
       hier ein Systemstapel (-apple-system, BlinkMacSystemFont, "SF Pro
       Display", …) — die Anwendung hatte gar keine eigene Schrift, waehrend
       cavallearn.com seit Bau B DM Sans traegt. Der Ausweichwert im Token ist
       derselbe Gedanke wie vorher: faellt die Datei aus, bleibt Text lesbar.
       Begruendung und die zweite Leitung (--bs-font-sans-serif): oben im
       :root-Block. */
    font-family: var(--cav-schrift-grund, system-ui, -apple-system, "Segoe UI", sans-serif);
    background: var(--cl-navy-dark);
    color: var(--cl-text);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

a { color: var(--cl-gold-light); }
a:hover { color: var(--cl-gold-pale); }

/* H1f — Focus handling (Bug 4). Kill the browser-default (blue) focus box
   everywhere, but keep a clearly visible KEYBOARD focus in brand gold via
   :focus-visible (accessibility preserved). Programmatic/mouse focus shows no
   ring; only keyboard navigation does. */
:focus { outline: none; }
:focus-visible {
    outline: 2px solid var(--cl-gold);
    outline-offset: 2px;
    border-radius: 3px;
}

::selection {
    background: var(--cl-gold);
    color: var(--cl-navy-dark);
}

/* Scrollbar */
::-webkit-scrollbar { width: 6px; }
::-webkit-scrollbar-track { background: var(--cl-navy-dark); }
::-webkit-scrollbar-thumb { background: var(--cl-navy-light); border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: var(--cl-navy-lighter); }

/* --- Glass Cards ------------------------------------------- */
.cl-card-glass {
    background: var(--cl-glass-bg);
    backdrop-filter: var(--cl-glass-blur);
    -webkit-backdrop-filter: var(--cl-glass-blur);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius-lg);
    padding: 1.25rem;
    transition: background var(--cl-duration) var(--cl-ease),
                border-color var(--cl-duration) var(--cl-ease);
}
.cl-card-glass:hover {
    background: var(--cl-glass-hover);
    border-color: rgba(255, 255, 255, 0.12);
}

.cl-card-gold-border {
    background: var(--cl-glass-bg);
    backdrop-filter: var(--cl-glass-blur);
    -webkit-backdrop-filter: var(--cl-glass-blur);
    border: 1px solid var(--cl-gold-border);
    border-radius: var(--cl-radius-lg);
    padding: 1.25rem;
    box-shadow: var(--cl-shadow-gold);
    transition: box-shadow var(--cl-duration) var(--cl-ease),
                border-color var(--cl-duration) var(--cl-ease);
}
.cl-card-gold-border:hover {
    border-color: var(--cl-gold);
    box-shadow: 0 0 32px rgba(200, 149, 42, 0.25);
}

/* Solid card on navy */
.cl-card {
    background: var(--cl-navy);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius-lg);
    padding: 1.25rem;
    transition: background var(--cl-duration) var(--cl-ease);
}
.cl-card:hover { background: var(--cl-navy-light); }

/* --- Buttons ----------------------------------------------- */

/* Base button reset */
.cl-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
    border: none; cursor: pointer;
    font-family: inherit;
    font-weight: 600;
    transition: all var(--cl-duration) var(--cl-ease);
}
.cl-btn:focus-visible {
    outline: 2px solid var(--cl-gold);
    outline-offset: 2px;
}

/* Standard buttons */
.cl-btn-primary {
    composes: cl-btn;
    padding: .5rem 1.25rem;
    background: var(--cl-gold);
    color: var(--cl-navy-dark);
    font-weight: 700;
    border: none; border-radius: var(--cl-radius);
}
.cl-btn-primary:hover  { background: var(--cl-gold-light); box-shadow: var(--cl-shadow-gold); }
.cl-btn-primary:active { background: var(--cl-gold-dark); }

.cl-btn-secondary {
    padding: .5rem 1.25rem;
    background: transparent;
    color: var(--cl-gold);
    font-weight: 600;
    border: 2px solid var(--cl-gold-border); border-radius: var(--cl-radius);
}
.cl-btn-secondary:hover  { background: rgba(200, 149, 42, 0.1); border-color: var(--cl-gold); }
.cl-btn-secondary:active { background: rgba(200, 149, 42, 0.2); }

/* Pill buttons — hero CTAs */
.cl-btn-pill {
    display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
    padding: 14px 28px;
    border-radius: var(--cl-radius-pill);
    font-weight: 700;
    font-size: 1rem;
    cursor: pointer;
    transition: all var(--cl-duration) var(--cl-ease);
    min-height: 48px;
    text-decoration: none;
}
.cl-btn-pill:focus-visible {
    outline: 2px solid var(--cl-gold);
    outline-offset: 2px;
}

.cl-btn-pill-gold {
    background: linear-gradient(135deg, var(--cl-gold) 0%, var(--cl-gold-light) 100%);
    color: var(--cl-navy-dark);
    border: none;
    box-shadow: 0 4px 16px rgba(200, 149, 42, 0.3);
}
.cl-btn-pill-gold:hover {
    box-shadow: 0 6px 24px rgba(200, 149, 42, 0.45);
    transform: translateY(-1px);
}
.cl-btn-pill-gold:active { transform: translateY(0); }

.cl-btn-pill-outline {
    background: transparent;
    color: var(--cl-gold-pale);
    border: 2px solid var(--cl-gold-border);
}
.cl-btn-pill-outline:hover {
    background: rgba(200, 149, 42, 0.1);
    border-color: var(--cl-gold);
    color: var(--cl-white);
}

/* --- Badge ------------------------------------------------- */
.cl-badge {
    display: inline-flex; align-items: center;
    padding: .2rem .6rem;
    background: var(--cl-gold);
    color: var(--cl-navy-dark);
    font-size: .75rem; font-weight: 700;
    border-radius: 999px;
    line-height: 1;
}
.cl-badge--outline {
    background: transparent;
    border: 1.5px solid var(--cl-gold-border);
    color: var(--cl-gold);
}
.cl-badge--glass {
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    color: var(--cl-text);
}

/* --- Navbar (top) ------------------------------------------ */
.cl-navbar {
    display: flex; align-items: center;
    height: var(--cl-navbar-h); padding: 0 1.25rem;
    background: transparent;
    color: var(--cl-white);
    z-index: var(--cl-ebene-leiste);
    border-bottom: 1px solid var(--cl-glass-border);
}
.cl-navbar-logo      { height: 32px; margin-right: .75rem; }
.cl-navbar-title     { font-weight: 700; font-size: 1.1rem; color: var(--cl-gold-pale); letter-spacing: .02em; }
.cl-navbar-right     { margin-left: auto; display: flex; gap: .75rem; align-items: center; min-width: 0; }

/* H1f — condense the header on phones (Bugs 1+2): the area-switch stays
   reachable; the brand text and the (long) display name drop out so nothing —
   especially the logout button — is clipped off the right edge. */
@media (max-width: 640px) {
    .cl-navbar { padding: 0 .75rem; gap: .25rem; }
    .cl-navbar-title { display: none; }
    .cl-navbar-right { gap: .4rem; }
    .cl-navbar-right .cl-text-muted { display: none; } /* the display name */
    /* 01.09.2026 — und das Wort neben dem Preisschild. Dieselbe Schwelle,
       damit im Kopf nur EINE Zahl entscheidet: seit die Pillen entfallen
       sind, ist 640 px die einzige. */
    .cl-navbar-angebote__wort { display: none; }
    .cl-navbar-angebote { padding: .35rem; }
}
.cl-navbar-icon {
    background: none; border: none; color: var(--cl-text-muted);
    font-size: 1.25rem; cursor: pointer; padding: .35rem;
    border-radius: 8px;
    transition: color var(--cl-duration) var(--cl-ease),
                background var(--cl-duration) var(--cl-ease);
}
.cl-navbar-icon:hover { color: var(--cl-gold-light); background: var(--cl-glass-bg); }

/* Notification bell */
.cl-notif-bell { position: relative; }
.cl-notif-badge {
    position: absolute; top: 0; right: 0;
    min-width: 16px; height: 16px;
    background: var(--cl-gold);
    color: var(--cl-navy-dark);
    font-size: .6rem; font-weight: 700;
    border-radius: 999px;
    display: flex; align-items: center; justify-content: center;
    padding: 0 4px;
    line-height: 1;
}

/* --- Sidebar (desktop) ------------------------------------- */
.cl-sidebar {
    background: var(--cl-navy);
    border-right: 1px solid var(--cl-glass-border);
    padding-top: 1.25rem;
    overflow-y: auto;
}
.cl-sidebar .cl-nav {
    display: flex; flex-direction: column; gap: 2px;
    padding: 0 .75rem;
}
.cl-sidebar .cl-nav-item {
    display: flex; align-items: center; gap: .75rem;
    padding: .65rem .85rem; border-radius: var(--cl-radius);
    text-decoration: none;
    color: var(--cl-text-muted);
    font-size: .9rem; font-weight: 500;
    transition: all var(--cl-duration) var(--cl-ease);
    min-height: 44px; /* touch target */
}
.cl-sidebar .cl-nav-item:hover {
    background: var(--cl-glass-bg);
    color: var(--cl-text);
}
.cl-sidebar .cl-nav-item.active {
    background: linear-gradient(135deg, rgba(200, 149, 42, 0.15) 0%, rgba(200, 149, 42, 0.05) 100%);
    color: var(--cl-gold);
    border: 1px solid var(--cl-gold-border-dim);
}
.cl-sidebar .cl-nav-item i { font-size: 1.15rem; width: 1.25rem; text-align: center; }

/* --- Skeleton Overlay -------------------------------------- */
.cl-video-frame {
    position: relative;
    width: 100%;
    max-width: 800px;
    background: #000;
    border-radius: var(--cl-radius);
    overflow: hidden;
}
.cl-video-frame > video { width: 100%; display: block; }
.cl-video-frame:fullscreen,
.cl-video-frame:-webkit-full-screen {
    max-width: 100vw;
    width: 100vw;
    height: 100vh;
    border-radius: 0;
    display: flex;
    align-items: center;
    justify-content: center;
}
.cl-video-frame:fullscreen > video,
.cl-video-frame:-webkit-full-screen > video {
    max-height: 100vh;
    width: auto;
    height: 100%;
    object-fit: contain;
}
.cl-video-frame__loading {
    position: absolute; inset: 0;
    display: flex; align-items: center; justify-content: center; gap: .5rem;
    color: var(--cl-text-muted);
    background: rgba(0,0,0,.55);
    font-size: .85rem;
}
.cl-video-frame__fullscreen {
    position: absolute;
    bottom: 8px;
    right: 8px;
    z-index: 5;
    width: 32px;
    height: 32px;
    padding: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: rgba(0, 0, 0, 0.55);
    color: #fff;
    border: 1px solid rgba(255, 255, 255, 0.2);
    border-radius: 4px;
    cursor: pointer;
    font-size: .9rem;
    transition: background var(--cl-duration) var(--cl-ease),
                border-color var(--cl-duration) var(--cl-ease);
}
.cl-video-frame__fullscreen:hover {
    background: rgba(0, 0, 0, 0.8);
    border-color: rgba(255, 255, 255, 0.4);
}
.cl-video-frame:fullscreen .cl-video-frame__fullscreen,
.cl-video-frame:-webkit-full-screen .cl-video-frame__fullscreen {
    bottom: 24px;
    right: 24px;
    width: 40px;
    height: 40px;
    font-size: 1.1rem;
}
.cl-skeleton-overlay {
    position: absolute; inset: 0;
    width: 100%; height: 100%;
    pointer-events: none;
}
.cl-skeleton-overlay__hint {
    position: absolute;
    left: .5rem; bottom: .5rem;
    padding: .25rem .55rem;
    border-radius: 999px;
    background: rgba(0, 0, 0, .65);
    color: var(--cl-text-muted);
    font-size: .72rem;
    pointer-events: none;
}
/* S6-UX: point placement layer — same inset:0 box as the skeleton overlay
   so both share one coordinate base. Click-through unless active. */
.cl-point-placement {
    position: absolute; inset: 0;
    pointer-events: none;
    z-index: 6;
}
.cl-point-placement--active {
    pointer-events: auto;
    cursor: crosshair;
}
/* B2.1: JS-managed mapping box (full element box in legacy mode, the rendered
   object-fit:contain rectangle in content-rect mode). Markers, lens and the
   click handler live inside it — one shared transform base. */
.cl-point-placement__content {
    position: absolute;
    inset: 0;
}
.cl-point-placement__marker {
    position: absolute;
    transform: translate(-50%, -50%);
    pointer-events: none;
    /* Size the marker to the CROSS only (single flex item) so translate
       (-50%,-50%) centers the CROSS on the coordinate. The label is taken out
       of flow (position:absolute below) — otherwise it was part of the centered
       flex column and pushed the cross up by ~half the label height (the
       constant vertical offset). */
    display: flex;
}
.cl-point-placement__cross {
    position: relative;
    width: 18px; height: 18px;
    filter: drop-shadow(0 0 2px rgba(0, 0, 0, .8));
}
.cl-point-placement__cross::before,
.cl-point-placement__cross::after {
    content: "";
    position: absolute;
    background: currentColor;
}
.cl-point-placement__cross::before {
    left: 50%; top: 0; bottom: 0;
    width: 2px; margin-left: -1px;
}
.cl-point-placement__cross::after {
    top: 50%; left: 0; right: 0;
    height: 2px; margin-top: -1px;
}
.cl-point-placement__label {
    /* Below the cross, out of the centered flex flow so it never shifts the
       cross off the coordinate. */
    position: absolute;
    top: 100%;
    left: 50%;
    transform: translateX(-50%);
    margin-top: 3px;
    font-size: .6rem;
    color: #fff;
    background: rgba(0, 0, 0, .65);
    padding: 1px 6px;
    border-radius: 999px;
    white-space: nowrap;
}
/* S6b: magnifier lens — display-only, never a coordinate source. */
.cl-point-placement__lens {
    position: absolute;
    display: none;
    width: 132px; height: 132px;
    border-radius: 50%;
    overflow: hidden;
    border: 2px solid rgba(184, 145, 58, .9);
    box-shadow: 0 2px 12px rgba(0, 0, 0, .6);
    background: #000;
    pointer-events: none;
    z-index: 7;
}
.cl-point-placement__lens canvas {
    position: absolute;
    left: 0; top: 0;
}
.cl-point-placement__lens-cross {
    position: absolute; inset: 0;
    color: rgba(255, 255, 255, .85);
}
.cl-point-placement__lens-cross::before,
.cl-point-placement__lens-cross::after {
    content: "";
    position: absolute;
    background: currentColor;
}
.cl-point-placement__lens-cross::before {
    left: 50%; top: 0; bottom: 0;
    width: 1px;
}
.cl-point-placement__lens-cross::after {
    top: 50%; left: 0; right: 0;
    height: 1px;
}
.cl-video-toolbar {
    display: flex; align-items: center; gap: .5rem;
    margin-top: .35rem;
}
.cl-video-toolbar__toggle {
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    color: var(--cl-text);
    padding: .3rem .65rem;
    border-radius: 999px;
    font-size: .8rem;
    cursor: pointer;
    display: inline-flex; align-items: center; gap: .35rem;
    transition: border-color var(--cl-duration) var(--cl-ease);
}
.cl-video-toolbar__toggle:hover:not(:disabled) { border-color: var(--cl-gold-border-dim); }
.cl-video-toolbar__toggle:disabled {
    opacity: 0.4;
    cursor: not-allowed;
}
.cl-video-toolbar__toggle--active {
    border-color: var(--cl-gold);
    color: var(--cl-gold-pale);
}
.cl-video-toolbar__toggle--horse.cl-video-toolbar__toggle--active {
    border-color: #5cd35c;
    color: #5cd35c;
}
.cl-video-toolbar__toggle--rider.cl-video-toolbar__toggle--active {
    border-color: #22d3ee;
    color: #22d3ee;
}

/* --- Session Dashboard ------------------------------------- */
.cl-dashboard { max-width: 880px; margin: 0 auto; }
.cl-dashboard__video { margin-bottom: 1rem; }
.cl-dashboard__meta {
    display: flex; flex-wrap: wrap; align-items: center;
    gap: .65rem .85rem;
    margin-top: .65rem;
    font-size: .85rem;
}
.cl-dashboard__action {
    display: flex; align-items: center; gap: 1rem;
    padding: .85rem 1rem;
    margin-bottom: 1rem;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-gold-border-dim);
    border-radius: var(--cl-radius);
}
.cl-dashboard__status {
    display: flex; align-items: center; gap: .5rem;
    flex: 1;
    font-size: .9rem; color: var(--cl-text);
}
.cl-dashboard__cta { white-space: nowrap; }
@media (max-width: 639.98px) {
    .cl-dashboard__action { flex-direction: column; align-items: stretch; }
    .cl-dashboard__cta { width: 100%; justify-content: center; }
}
.cl-back-link {
    display: inline-flex; align-items: center; gap: .35rem;
    color: var(--cl-gold-light); text-decoration: none;
    margin-bottom: 1rem; font-size: .9rem;
}
.cl-back-link:hover { color: var(--cl-gold); }

/* --- Saddle Anchor Canvas ---------------------------------- */
.cl-saddle-canvas-wrap {
    display: flex; flex-direction: column; gap: .75rem;
    max-width: 800px;
}
.cl-saddle-canvas-instructions {
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
    padding: .65rem .85rem;
    font-size: .85rem; color: var(--cl-text);
}
.cl-saddle-canvas-instructions b { color: var(--cl-gold-pale); }
.cl-saddle-canvas {
    position: relative;
    overflow: hidden;
    border-radius: var(--cl-radius);
}
.cl-saddle-canvas--marking video { cursor: crosshair; }
.cl-saddle-marker {
    position: absolute;
    width: 14px; height: 14px; border-radius: 50%;
    transform: translate(-50%, -50%);
    pointer-events: none;
    box-shadow: 0 0 0 2px rgba(0,0,0,.6), 0 0 10px rgba(0,0,0,.5);
}
.cl-saddle-marker--pommel { background: #3b82f6; }
.cl-saddle-marker--cantle { background: #ef4444; }
.cl-saddle-line {
    position: absolute; inset: 0;
    width: 100%; height: 100%;
    pointer-events: none;
}
.cl-saddle-canvas-status {
    display: flex; gap: 1.25rem;
    font-size: .85rem; font-weight: 500;
}
.cl-saddle-canvas-status .cl-text-success { color: var(--cl-success); }
.cl-saddle-canvas-actions {
    display: flex; gap: .5rem;
    flex-wrap: wrap;
}
.cl-saddle-canvas-error {
    background: rgba(220, 38, 38, .08);
    border: 1px solid rgba(220, 38, 38, .3);
    color: var(--cl-danger);
    border-radius: var(--cl-radius);
    padding: .5rem .75rem;
    font-size: .85rem;
}

/* --- Gait Badge -------------------------------------------- */
.cl-gait-badge {
    display: inline-flex; align-items: center; gap: .4rem;
    padding: .25rem .65rem;
    border-radius: 999px;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    font-size: .82rem;
    color: var(--cl-text);
}
.cl-gait-badge__dot {
    width: 8px; height: 8px; border-radius: 50%;
    flex-shrink: 0;
}
.cl-gait-badge__dot--green  { background: var(--cl-success); }
.cl-gait-badge__dot--yellow { background: var(--cl-warning); }
.cl-gait-badge__dot--red    { background: var(--cl-danger); }
.cl-gait-badge__text b { font-weight: 700; color: var(--cl-gold-pale); }
.cl-gait-badge__conf { color: var(--cl-text-muted); font-size: .75rem; }
.cl-gait-badge__warn {
    color: #f59e0b; /* amber */
    margin-left: .15rem;
    cursor: help;
    display: inline-flex; align-items: center;
}

/* --- Metric Info Popover ----------------------------------- */
.cl-info-popover-backdrop {
    position: fixed; inset: 0; z-index: var(--cl-ebene-blatt);
    background: transparent; /* invisible — only catches click-outside */
}
.cl-info-popover {
    position: fixed; z-index: calc(var(--cl-ebene-blatt) + 1);
    max-width: 360px;
    background: var(--cl-navy);
    border: 1px solid var(--cl-gold-border);
    border-radius: var(--cl-radius-lg);
    padding: .85rem 1rem;
    box-shadow: var(--cl-shadow-lg);
    color: var(--cl-text);
}
@media (max-width: 639.98px) {
    .cl-info-popover {
        left: 1rem !important; right: 1rem;
        top: auto !important; bottom: 1rem;
        max-width: none;
    }
}
.cl-info-popover__head {
    display: flex; align-items: center; gap: .5rem;
    margin-bottom: .35rem;
}
.cl-info-popover__title {
    font-weight: 700; font-size: 1rem;
    color: var(--cl-gold-pale);
    flex: 1;
}
.cl-info-popover__close {
    background: none; border: none; cursor: pointer;
    color: var(--cl-text-muted);
    padding: 0 .25rem;
    font-size: .85rem;
}
.cl-info-popover__close:hover { color: var(--cl-gold-light); }
.cl-info-popover__short {
    margin: .35rem 0 .65rem;
    font-size: .9rem; line-height: 1.4;
}
.cl-info-popover__expand-toggle {
    background: none; border: none; cursor: pointer;
    color: var(--cl-gold-light); font-size: .85rem;
    padding: .25rem 0;
    display: flex; align-items: center; gap: .35rem;
}
.cl-info-popover__expand-toggle:hover { color: var(--cl-gold); }
.cl-info-popover__tech {
    margin-top: .5rem;
    padding-top: .5rem;
    border-top: 1px solid var(--cl-glass-border);
    font-size: .85rem; line-height: 1.45;
    color: var(--cl-text);
}
.cl-info-popover__keypoints {
    margin-top: .5rem;
    font-size: .75rem; color: var(--cl-text-muted);
}
.cl-info-popover__keypoints-label { font-weight: 600; margin-right: .35rem; }
.cl-info-popover__footer {
    margin-top: .65rem;
    padding-top: .5rem;
    border-top: 1px solid var(--cl-glass-border);
    display: flex; justify-content: space-between; align-items: center;
    font-size: .7rem; color: var(--cl-text-subtle);
}
.cl-info-popover__footer code {
    background: var(--cl-glass-bg);
    padding: 1px 6px;
    border-radius: 4px;
}
.cl-info-popover__footer a {
    color: var(--cl-gold-light); text-decoration: none;
    display: inline-flex; align-items: center; gap: .25rem;
}

/* --- Metric Pill ------------------------------------------- */
.cl-metric-pill-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: .65rem;
}
@media (max-width: 1023.98px) {
    .cl-metric-pill-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 639.98px) {
    .cl-metric-pill-grid { grid-template-columns: 1fr; }
}
.cl-metric-pill {
    background: var(--cl-navy);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
    padding: .65rem .8rem;
    cursor: pointer;
    transition: border-color var(--cl-duration) var(--cl-ease),
                background var(--cl-duration) var(--cl-ease);
}
.cl-metric-pill:hover { border-color: var(--cl-gold-border-dim); background: var(--cl-glass-hover); }
.cl-metric-pill--expanded {
    border-color: var(--cl-gold-border);
    grid-column: 1 / -1;
}
.cl-metric-pill__header { display: flex; align-items: center; gap: .35rem; }
.cl-metric-pill__id { font-weight: 700; color: var(--cl-gold); font-size: .85rem; }
.cl-metric-pill__sep { color: var(--cl-text-subtle); }
.cl-metric-pill__value { font-weight: 700; color: var(--cl-text); font-size: .95rem; }
.cl-metric-pill__info {
    background: none; border: none; cursor: pointer;
    color: var(--cl-text-muted);
    margin-left: auto;
    padding: 2px 4px;
    transition: color var(--cl-duration) var(--cl-ease);
}
.cl-metric-pill__info:hover { color: var(--cl-gold-light); }
.cl-metric-pill__name {
    font-size: .8rem;
    color: var(--cl-text-muted);
    margin-top: .15rem;
}
.cl-metric-pill__detail {
    margin-top: .6rem;
    padding-top: .6rem;
    border-top: 1px solid var(--cl-glass-border);
}
.cl-metric-pill__stats {
    display: flex; flex-wrap: wrap; gap: .65rem .9rem;
    font-size: .8rem; color: var(--cl-text-muted);
    margin-bottom: .5rem;
}
.cl-metric-pill__stats b { color: var(--cl-text); font-weight: 600; margin-right: .25rem; }
.cl-metric-pill__tech {
    font-size: .85rem; line-height: 1.45;
    color: var(--cl-text);
    margin: .5rem 0;
}
.cl-metric-pill__version {
    font-size: .7rem;
    color: var(--cl-text-subtle);
    margin-top: .35rem;
}
.cl-metric-pill__version code {
    background: var(--cl-glass-bg);
    padding: 1px 6px;
    border-radius: 4px;
    font-size: .7rem;
}

/* --- Metric Accordion -------------------------------------- */
.cl-metric-accordion {
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
    margin-bottom: .75rem;
    overflow: hidden;
    transition: border-color var(--cl-duration) var(--cl-ease);
}
.cl-metric-accordion--open {
    border-color: var(--cl-gold-border-dim);
}
.cl-metric-accordion__header {
    display: flex; align-items: center; gap: .65rem;
    width: 100%;
    padding: .85rem 1rem;
    background: none; border: none;
    color: var(--cl-text);
    font-size: .95rem; font-weight: 600;
    text-align: left;
    cursor: pointer;
    transition: background var(--cl-duration) var(--cl-ease);
}
.cl-metric-accordion__header:hover { background: var(--cl-glass-hover); }
.cl-metric-accordion__chevron {
    width: 1rem; text-align: center;
    color: var(--cl-gold-light);
    transition: transform var(--cl-duration) var(--cl-ease);
}
.cl-metric-accordion__title { flex: 1; }
.cl-metric-accordion__tag {
    font-size: .7rem; font-weight: 500;
    color: var(--cl-text-muted);
    padding: 2px 8px;
    border-radius: 999px;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
}
.cl-metric-accordion__count {
    font-size: .75rem; font-weight: 700;
    color: var(--cl-gold);
    background: var(--cl-gold-glow);
    padding: 2px 8px;
    border-radius: 999px;
    min-width: 24px; text-align: center;
}
.cl-metric-accordion__body {
    padding: .75rem 1rem 1rem;
    border-top: 1px solid var(--cl-glass-border);
}

/* --- Bottom Nav (mobile) ----------------------------------- */
.cl-bottom-nav {
    display: none;
    position: fixed; bottom: 0; left: 0; right: 0;
    /* 07.09.2026 (Paket 1) — DIE HOEHE TRAEGT DEN iOS-RAND MIT.
       Bootstrap setzt box-sizing: border-box, also lag die Polsterung von
       env(safe-area-inset-bottom) INNERHALB der 64px: die Leiste blieb gleich
       hoch, ihre Symbole rutschten in den verbleibenden Rest. Bis heute fiel
       das nicht auf, weil ohne viewport-fit=cover jedes env() null war
       (index.html). Seit es misst, muss die Leiste um denselben Betrag
       WACHSEN — dann behaelt ihr Inhalt seine 64px und liegt ueber dem
       Home-Indikator statt darin.
       Alle Stellen, die Platz fuer die Leiste freihalten, rechnen bereits
       "Leistenhoehe + Rand" und passen damit ohne Aenderung. */
    height: calc(var(--cl-bottombar-h) + env(safe-area-inset-bottom, 0px));
    background: var(--cl-navy);
    border-top: 1px solid var(--cl-glass-border);
    z-index: var(--cl-ebene-leiste);
    justify-content: space-around; align-items: center;
    padding-bottom: env(safe-area-inset-bottom, 0);
}
.cl-bottom-tab {
    display: flex; flex-direction: column; align-items: center;
    text-decoration: none;
    color: var(--cl-text-muted);
    font-size: .65rem; font-weight: 500; gap: 3px;
    padding: 6px 12px;
    border-radius: 12px;
    min-width: 48px; min-height: 44px;
    justify-content: center;
    transition: color var(--cl-duration) var(--cl-ease);
}
.cl-bottom-tab i { font-size: 1.35rem; }
.cl-bottom-tab:hover { color: var(--cl-gold-light); }
.cl-bottom-tab.active { color: var(--cl-gold); }

/* --- Typography -------------------------------------------- */
.cl-hero-title {
    font-size: clamp(2.5rem, 8vw, 5rem);
    font-weight: 700;
    color: var(--cl-gold-pale);
    line-height: 1.05;
    letter-spacing: -0.02em;
}

.cl-section-title {
    font-size: 1.15rem;
    font-weight: 700;
    color: var(--cl-text);
    padding-bottom: .4rem;
    margin-bottom: 1rem;
    border-bottom: 2px solid var(--cl-gold);
    display: inline-block;
}

.cl-subtitle {
    font-size: .9rem;
    color: var(--cl-text-muted);
    font-weight: 400;
    line-height: 1.5;
}

/* --- Metrics (analysis) ------------------------------------ */
.cl-metric-value {
    font-size: 2.25rem;
    font-weight: 700;
    color: var(--cl-gold);
    line-height: 1;
    font-variant-numeric: tabular-nums;
}
.cl-metric-label {
    font-size: .75rem;
    color: var(--cl-text-muted);
    text-transform: uppercase;
    letter-spacing: .06em;
    font-weight: 600;
}

/* Metric ring placeholder (SVG-based, data later) */
.cl-metric-ring {
    position: relative;
    width: 100px; height: 100px;
    display: flex; align-items: center; justify-content: center;
}
.cl-metric-ring svg {
    width: 100%; height: 100%;
    transform: rotate(-90deg);
}
.cl-metric-ring__track {
    fill: none;
    stroke: var(--cl-glass-border);
    stroke-width: 6;
}
.cl-metric-ring__fill {
    fill: none;
    stroke: var(--cl-gold);
    stroke-width: 6;
    stroke-linecap: round;
    transition: stroke-dashoffset 600ms var(--cl-ease);
}
.cl-metric-ring__value {
    position: absolute;
    font-size: 1.25rem;
    font-weight: 700;
    color: var(--cl-gold-pale);
}

/* --- Status indicators ------------------------------------- */
.cl-status-green  { color: var(--cl-success); }
.cl-status-yellow { color: var(--cl-warning); }
.cl-status-red    { color: var(--cl-danger); }

.cl-status-dot {
    display: inline-block;
    width: 8px; height: 8px;
    border-radius: 50%;
}
.cl-status-dot--green  { background: var(--cl-success); box-shadow: 0 0 8px rgba(52, 211, 153, 0.4); }
.cl-status-dot--yellow { background: var(--cl-warning); box-shadow: 0 0 8px rgba(251, 191, 36, 0.4); }
.cl-status-dot--red    { background: var(--cl-danger);  box-shadow: 0 0 8px rgba(248, 113, 113, 0.4); }

.cl-status-badge {
    display: inline-flex; align-items: center; gap: .35rem;
    padding: .2rem .6rem;
    border-radius: 999px;
    font-size: .75rem; font-weight: 600;
}
.cl-status-badge--green  { background: rgba(52, 211, 153, 0.15); color: var(--cl-success); }
.cl-status-badge--yellow { background: rgba(251, 191, 36, 0.15); color: var(--cl-warning); }
.cl-status-badge--red    { background: rgba(248, 113, 113, 0.15); color: var(--cl-danger); }

/* --- Quick-Access Card (icon + label) ---------------------- */
.cl-quick-card {
    display: flex; flex-direction: column; align-items: center;
    gap: .75rem; padding: 1.25rem;
    text-decoration: none;
    color: var(--cl-text);
    min-height: 120px;
    justify-content: center;
}
.cl-quick-card:hover { color: var(--cl-white); }
.cl-quick-card__icon {
    width: 48px; height: 48px;
    display: flex; align-items: center; justify-content: center;
    border-radius: 14px;
    background: rgba(200, 149, 42, 0.12);
    color: var(--cl-gold);
    font-size: 1.4rem;
    transition: background var(--cl-duration) var(--cl-ease),
                transform var(--cl-duration) var(--cl-ease);
}
.cl-quick-card:hover .cl-quick-card__icon {
    background: rgba(200, 149, 42, 0.2);
    transform: scale(1.05);
}
.cl-quick-card__label {
    font-size: .85rem;
    font-weight: 600;
    text-align: center;
}
.cl-quick-card__sub {
    font-size: .75rem;
    color: var(--cl-text-muted);
}

/* --- Auth layout ------------------------------------------- */
/* 07.09.2026 (Paket 1c) — DIE SCHALE DER ELF ANMELDESEITEN.

   Sie traegt Login, Registrieren, Konto aktivieren, Passwort vergessen /
   setzen / zuruecksetzen, den Kaufweg und die Rechtstexte /agb und
   /datenschutz. Sie hat KEINE Kopfleiste, also auch nichts, was den oberen
   Geraeterand fuer sie abraeumt — .cl-app tut das seit Paket 1b, diese Schale
   ist aber ihr Geschwister und nicht ihr Kind.

   ZWEI AENDERUNGEN, ZWEI GRUENDE:

   1. min-height BEKOMMT DEN dvh-RUECKFALL, den .cl-app schon hat. 100vh misst
      auf iOS mit EINGEFAHRENEN Browserleisten und ist damit groesser als das
      Sichtbare; 100dvh folgt ihnen. Die 100vh-Zeile bleibt als Rueckfall fuer
      Browser ohne dvh stehen — die Reihenfolge ist die Aussage.

   2. align-items: center WIRD ZU flex-start, und die Karte bekommt
      stattdessen automatische Raender oben und unten. Das ist derselbe
      Anblick, solange die Karte hineinpasst (automatische Raender verteilen
      freien Platz genauso wie die Zentrierung), UND es behebt den Fall, in
      dem sie es nicht tut: bei align-items: center waechst eine zu hohe Karte
      nach OBEN aus dem Behaelter heraus, und dorthin laesst sich nicht
      scrollen — der Anfang eines Vertragstextes war schlicht nicht
      erreichbar. Bei negativem freien Platz rechnen automatische Raender auf
      null, die Karte beginnt an der Oberkante, und alles ist erreichbar.

   DIE POLSTERUNG ist der Geraeterand an allen vier Kanten. Mit
   box-sizing: border-box (Bootstrap) liegt sie INNERHALB der Mindesthoehe,
   die Karte zentriert also im sicheren Rechteck. Steht das Umgebungsband
   darueber, wird der obere Anteil weiter unten zurueckgesetzt - sonst waere
   er doppelt gerechnet. */
.cl-auth-layout {
    display: flex; align-items: flex-start; justify-content: center;
    min-height: 100vh;
    min-height: 100dvh;
    padding: env(safe-area-inset-top, 0px) env(safe-area-inset-right, 0px)
             env(safe-area-inset-bottom, 0px) env(safe-area-inset-left, 0px);
    background: var(--cl-navy-dark);
}
.cl-auth-card {
    background: var(--cl-navy);
    border: 1px solid var(--cl-glass-border);
    border-top: 3px solid var(--cl-gold);
    border-radius: var(--cl-radius-lg);
    padding: 2rem;
    box-shadow: var(--cl-shadow-lg);
    width: 100%; max-width: 420px; margin: 1rem;
    /* 07.09.2026 (Paket 1c) — die Zentrierung, die vorher am Behaelter hing.
       Sie steht jetzt HIER, weil ein automatischer Rand bei zu wenig Platz auf
       null faellt, waehrend align-items: center die Karte oben aus dem Bild
       schiebt. Die 1rem daneben bleiben als seitlicher Abstand stehen. */
    margin-top: auto;
    margin-bottom: auto;
}
.cl-auth-logo     { text-align: center; margin-bottom: 1.5rem; }
.cl-auth-logo img { height: 48px; }
.cl-auth-logo h1  { font-size: 1.5rem; margin-top: .5rem; color: var(--cl-gold-pale); }

/* ── Bau 21e (15.08.2026) — RECHTSTEXT IN DER AUTH-SCHALE ────────────────────

   /agb zeigt seit heute den gespeicherten Vertragstext statt einer
   Weiterleitung. Ohne Anmeldung erreichbar heisst im Bestand AuthLayout (wie
   Login, Registrieren, /kauf/start) — deren Karte ist aber auf 420px ausgelegt,
   also auf ein Formular mit sechs Feldern. Ein Vertrag von 14.500 Zeichen darin
   ergibt bei 2rem Innenabstand rund 45 Zeichen je Zeile; das liest niemand
   freiwillig, und schon gar nicht pruefend.

   Die Karte wird deshalb NUR DANN breiter, wenn ein Rechtstext darin steht.
   :has() statt einer zweiten Schale oder einer Aenderung an AuthLayout — das
   Layout traegt Login, Registrierung und den Kaufweg, und dort etwas zu
   verstellen, um eine Leseseite zu bekommen, waere der teurere Eingriff.

   FAELLT :has() AUS (sehr alter Browser), bleibt die Karte bei 420px: schmal,
   aber vollstaendig und lesbar. Kein Ausfall, nur weniger bequem. */
/* 07.09.2026 (Paket 1c) — DIESE ZEILE BLEIBT, WIE SIE IST, und das ist eine
   Entscheidung: der feste Rand von 2rem schlaegt (spaeter und spezifischer)
   die automatischen Raender der Karte darueber. Genau richtig fuer einen
   Vertragstext — er ist immer hoeher als der Bildschirm, soll also nicht
   zentriert werden, sondern oben beginnen. Zusammen mit align-items:
   flex-start ist sein Anfang ab jetzt erreichbar. Ein Formular bleibt
   zentriert, weil es diese Klasse nicht traegt. */
.cl-auth-card:has(.cl-legal-doc) {
    max-width: 48rem;
    margin: 2rem auto;
}

/* Der Rechtstext selbst. Zeilenlaenge begrenzt (ca. 70 Zeichen), Abstaende
   zwischen den Abschnitten so, dass die Gliederung beim Ueberfliegen traegt —
   ein Vertrag wird gesucht, nicht von vorne gelesen. */
.cl-legal-doc__titel {
    font-size: 1.35rem;
    color: var(--cl-gold-pale);
    margin-bottom: .25rem;
}

.cl-legal-doc__fassung {
    font-size: .82rem;
    color: var(--cl-text-muted);
    margin-bottom: 1.75rem;
}

.cl-legal-doc__laden {
    display: flex;
    align-items: center;
    color: var(--cl-text-muted);
    padding: 1rem 0;
}

.cl-legal-doc__text {
    max-width: 40rem;
    font-size: .95rem;
    line-height: 1.7;
    color: var(--cl-text);
    overflow-wrap: anywhere;    /* lange Adressen brechen um statt zu scrollen */
}

.cl-legal-doc__text h2 {
    font-size: 1.1rem;
    color: var(--cl-gold-pale);
    margin: 2.25rem 0 .75rem;
}

.cl-legal-doc__text h3 {
    font-size: .98rem;
    color: var(--cl-gold-light);
    margin: 1.5rem 0 .5rem;
}

.cl-legal-doc__text p { margin: 0 0 .85rem; }

/* Die Trennlinien zwischen den Abschnitten (--- im Markdown) sind die
   Gliederung des Dokuments und nicht Zierrat. Sie duerfen sichtbar sein. */
.cl-legal-doc__text hr {
    border: 0;
    border-top: 1px solid var(--cl-glass-border);
    margin: 2rem 0;
}

.cl-legal-doc__text strong { color: var(--cl-text); }
.cl-legal-doc__text ol,
.cl-legal-doc__text ul { padding-left: 1.25rem; margin: 0 0 .85rem; }
.cl-legal-doc__text li { margin-bottom: .35rem; }

/* Auth form overrides */
.cl-auth-card .form-label { color: var(--cl-text-muted); font-weight: 500; font-size: .875rem; }
.cl-auth-card .form-control {
    background: var(--cl-navy-dark);
    border: 1px solid var(--cl-glass-border);
    color: var(--cl-text);
    border-radius: var(--cl-radius);
}
.cl-auth-card .form-control:focus {
    background: var(--cl-navy-dark);
    border-color: var(--cl-gold-border);
    color: var(--cl-text);
    box-shadow: 0 0 0 3px rgba(200, 149, 42, 0.15);
}
.cl-auth-card .form-check-label { color: var(--cl-text-muted); }
.cl-auth-card .form-check-input {
    background-color: var(--cl-navy-dark);
    border-color: var(--cl-glass-border);
}
.cl-auth-card .form-check-input:checked {
    background-color: var(--cl-gold);
    border-color: var(--cl-gold);
}
.cl-auth-card .btn-primary {
    background: var(--cl-gold);
    border-color: var(--cl-gold);
    color: var(--cl-navy-dark);
    font-weight: 700;
}
.cl-auth-card .btn-primary:hover { background: var(--cl-gold-light); border-color: var(--cl-gold-light); }
.cl-auth-card .alert-danger {
    background: rgba(248, 113, 113, 0.1);
    border: 1px solid rgba(248, 113, 113, 0.2);
    color: var(--cl-danger);
}
.cl-auth-card .alert-success {
    background: rgba(52, 211, 153, 0.1);
    border: 1px solid rgba(52, 211, 153, 0.2);
    color: var(--cl-success);
}
.cl-auth-card a { color: var(--cl-gold-light); }

/* --- Utility ----------------------------------------------- */
.cl-text-gold     { color: var(--cl-gold) !important; }
.cl-text-gold-pale { color: var(--cl-gold-pale) !important; }
.cl-text-muted    { color: var(--cl-text-muted) !important; }
.cl-text-white    { color: var(--cl-white) !important; }
.cl-bg-navy       { background-color: var(--cl-navy) !important; }
.cl-bg-navy-dark  { background-color: var(--cl-navy-dark) !important; }

/* --- Mobile responsive ------------------------------------- */
@media (max-width: 991.98px) {
    .cl-bottom-nav { display: flex; }
    .cl-main { padding-bottom: calc(var(--cl-bottombar-h) + 1rem); }

    .cl-btn-pill {
        padding: 12px 24px;
        font-size: .9rem;
        width: 100%;
    }
}

/* --- Home Page --------------------------------------------- */
/* Bau 45 (B) — margin:auto ergaenzt. Die Startseite liegt seit Bau 45 in
   .cl-page (880 px, zentriert); ihre eigene, schmalere Spalte klebte darin
   weiterhin links. Die BREITE bleibt bei 720 px — sie ist fuer eine einspaltige
   Startseite bewusst enger als die Lesebreite der Inhaltsseiten. */
.cl-home { max-width: 720px; margin: 0 auto; }

.cl-home-welcome {
    margin-bottom: 1.5rem;
}
.cl-home-welcome__name {
    font-size: 1.75rem;
    font-weight: 700;
    /* BAU 2 — kein Gold. Ein Name ist keine Handlung, und Gold gehoert auf
       dieser Seite ausschliesslich dem einen Knopf des Helden. */
    color: var(--cl-text);
    margin: 0;
    line-height: 1.2;
}

.cl-home-ctas {
    display: flex; gap: 1rem;
    margin-bottom: 2rem;
}

/* 25.08.2026 - DIE LEISEN NEBENWEGE UNTER DEM HAUPTKNOPF.

   Kaeufe und Rechnungen standen bis dahin nur im Menue unter "Profil"; vom
   Dashboard fuehrte kein Weg dorthin. Als Knoepfe in .cl-home-ctas haetten
   sie dasselbe Gewicht wie "Zum Training" bekommen - hier haben sie es
   nicht, und genau so ist es gemeint. */
.cl-home-nebenwege {
    margin: -1.25rem 0 2rem;
    font-size: .85rem;
}

/* BAU 2 — kein Gold. Es sind die Wege, die man einmal im Monat geht. */
.cl-home-nebenwege a {
    color: var(--cl-text-muted);
    text-decoration: none;
}

.cl-home-nebenwege a:hover,
.cl-home-nebenwege a:focus-visible {
    text-decoration: underline;
}

.cl-home-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 1rem;
}

.cl-home-stats {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 1rem;
}
.cl-home-stat {
    display: flex; flex-direction: column;
    align-items: center; gap: .35rem;
    padding: 1rem;
    text-align: center;
}

@media (max-width: 767.98px) {
    .cl-home-ctas { flex-direction: column; }
    .cl-home-grid { grid-template-columns: 1fr; }
    .cl-home-stats { grid-template-columns: repeat(3, 1fr); }
}

/* --- BAU 49b (D2): DIE BEREICHSMARKE -------------------------------------
   GENAU ZWEI STELLEN je Block, wie festgelegt: die 3px-Marke links und die
   Kicker-Zeile samt Icon. Nichts sonst wird eingefaerbt. */
.cl-bereich { border-left: 3px solid var(--cl-bereich, transparent); }
.cl-bereich .cl-bereich__kicker,
.cl-bereich .cl-bereich__symbol { color: var(--cl-bereich, var(--cl-gold)); }

/* Die Handlungskarte bringt einen eigenen Rahmen mit (Goldschimmer). Zwei
   Klassen schlagen eine — deshalb hier ausdruecklich, statt sich auf die
   Reihenfolge im Stylesheet zu verlassen. */
.cl-jetzt.cl-bereich {
    border-left-width: 3px;
    border-left-color: var(--cl-bereich);
}

/* D4 — dieselben Toene in der Seitenleiste. Nur Ueberschrift und Symbol; die
   Zeile selbst bleibt neutral, und der aktive Eintrag bleibt gold. In der
   Seitenleiste gibt es KEINE Randmarke — dort ist der linke Rand schon die
   Kante des Menues. */
.cl-nav-group.cl-bereich { border-left: none; }
.cl-nav-group.cl-bereich > .cl-nav-group-title { color: var(--cl-bereich); }

/* --- 01.09.2026: DIE BEREICHSFARBE SITZT WOANDERS ------------------------
   VERSCHOBEN, NICHT WEGGENOMMEN. Die Zuordnung von D4 gilt unveraendert —
   dieselben vier Toene, dieselbe Quelle (BereichsFarbe -> cl-bereich--*).
   Was sich aendert, ist die FLAECHE, die sie traegt.

   WARUM. D4 faerbte eine RUBRIK: 0.68rem, Grossbuchstaben, gedaempft, nicht
   anklickbar. Eine Rubrik kann nicht aktiv sein, also war Farbe dort
   harmlos — sie konnte mit keinem Zustand verwechselt werden.
   Seit Bau 1 (01.09.2026) ist dieselbe Zeile ein ZIEL: 0.9rem, halbfett, mit
   Symbol und Trefferflaeche, in jeder Hinsicht wie ein Menuepunkt. Damit
   liest sich die Farbe nicht mehr als Zuordnung, sondern als ZUSTAND. Im
   Reiter-Bereich tragen drei der fuenf Zeilen eine Bereichsfarbe; auf /home
   sahen also drei Zeilen dauerhaft hervorgehoben aus, waehrend genau eine es
   war.

   GOLD SAGT „HIER STEHST DU", BEREICHSFARBE SAGT „DAS IST TRAINING". Die
   beiden duerfen nicht auf derselben Flaeche stehen. Gold gewinnt, weil es
   die Frage beantwortet, die man beim Hinsehen wirklich hat.

   WOHIN SIE GEHT: auf die senkrechte Linie links der Kinder (der Block
   „Das Kind unter einer klickbaren Bereichszeile", weiter oben). Eine duenne
   Flaeche kann keinen Zustand behaupten — sie ist zu leise, um mit Gold
   verwechselt zu werden, und sie steht neben genau den Zeilen, die zur
   Gruppe gehoeren.

   VIER KLASSEN, damit die Reihenfolge in dieser Datei keine Rolle spielt: die
   Regel darueber hat drei. Und im Kontext .cl-sidebar, weil nur dort eine
   Bereichszeile steht — auf der Startseite faerbt D4 unveraendert weiter.

   :not(.active) IST NICHT KOSMETIK, SONDERN NOETIG. Ohne die Einschraenkung
   haette diese Regel dieselbe Staerke wie die Gold-Regel aus Bau 1
   (`.cl-nav-group.cl-bereich > .cl-nav-group-title--link.active`, ebenfalls
   vier Klassen) — und sie stuende WEITER UNTEN in der Datei, also haette sie
   gewonnen. Die aktive Zeile waere neutral geworden statt gold: genau das
   Gegenteil dessen, was dieser Schritt will, und im Ruhezustand nicht zu
   sehen. Mit :not(.active) greift sie nur dort, wo Gold nichts zu sagen hat. */
.cl-sidebar .cl-nav-group.cl-bereich > .cl-nav-group-title--link:not(.active) {
    color: var(--cl-text);
}

/* 02.09.2026 — UND DER BALKEN, DEN 6a9db864 UEBERSEHEN HAT.

   DER BEFUND KAM AUS EINEM BILD VON DEV: die Elternzeile trug weiter einen
   farbigen Strich links. Der Zug vom 01.09. hat nur die SCHRIFT neutralisiert
   und den Rand nicht gesehen.

   WOHER ER KOMMT: `.cl-bereich { border-left: 3px solid var(--cl-bereich) }`
   (eine Klasse, weiter oben in diesem Block) gilt fuer JEDES Element mit der
   Klasse. Bau 49b hat ihn fuer zwei Faelle wieder abgeraeumt —
   `.cl-nav-group.cl-bereich` und `.cl-nav-item.cl-bereich`. Die Elternzeile
   ist WEDER das eine noch das andere: sie traegt
   `cl-nav-group-title cl-nav-group-title--link cl-bereich cl-bereich--*`.
   Sie fiel durch beide Ausnahmen hindurch, weil es sie zu Bau 49b noch nicht
   gab — damals war die Zeile ein <div> ohne Bereichsklasse.

   DERSELBE GRUND WIE BEI DER SCHRIFT: die Zeile ist seit Bau 1 ein ZIEL, und
   auf einem Ziel liest sich Farbe als Zustand. Gold sagt „hier stehst du";
   ein bunter Strich daneben sagt es ein zweites Mal und meint etwas anderes.
   Die Bereichsfarbe steht jetzt an der Linie unter der Zeile, wo sie eine
   ZUGEHOERIGKEIT zeigt und keinen Zustand.

   AUCH IM AKTIVEN ZUSTAND: anders als bei der Schrift gibt es hier nichts zu
   erhalten — der aktive Zustand traegt seinen eigenen Rahmen
   (.cl-nav-group-title--link.active), und ein zweiter Strich davor waere
   auch dort zuviel. Deshalb ohne :not(.active). */
.cl-sidebar .cl-nav-group.cl-bereich > .cl-nav-group-title--link {
    border-left: none;
}

/* DIE FARBE DER GRUPPE, NICHT DIE DES KINDES.

   Ein Kind traegt seine EIGENE Bereichsklasse, wenn seine Route eine hat —
   „Webinare" unter „Lernen" ist der Fall, den es heute wirklich gibt (blau
   unter altrosa). Auf dem Symbol ist das seit D4 richtig und bleibt es: das
   Symbol gehoert dem Eintrag. Die LINIE gehoert der Gruppe, und sie soll
   ueber alle Kinder hinweg EINE Farbe haben.

   `var(--cl-bereich)` direkt auf dem Kind zu lesen ginge schief: die
   Eigenschaft wird dort ausgewertet, wo sie angewendet wird, und das Kind
   ueberschreibt sie mit seiner eigenen. Deshalb reicht die GRUPPE ihren Ton
   unter einem zweiten Namen weiter — ausgewertet auf der Gruppe, wo
   --cl-bereich noch ihr eigener ist. Kinder setzen --cl-bereich-gruppe nie,
   also erben sie ihn unveraendert.

   KEINE ZWEITE ZUORDNUNG: hier steht kein Farbwert, nur eine Weitergabe.
   Wer einen Ton aendert, aendert ihn weiterhin an genau einer Stelle. */
.cl-nav-group.cl-bereich { --cl-bereich-gruppe: var(--cl-bereich); }
.cl-nav-item.cl-bereich { border-left: none; }
.cl-sidebar .cl-nav-group.cl-bereich .cl-nav-item:not(.active) i,
.cl-sidebar .cl-nav-item.cl-bereich:not(.active) i { color: var(--cl-bereich); opacity: .9; }

/* 02.09.2026 — IN DER SEITENLEISTE SAGT DIE LINIE ES SCHON.

   Die Regel darueber faerbt die Symbole der Kinder in der Bereichsfarbe. Das
   war richtig, solange die Farbe NUR dort sass; seit sie an der Linie neben
   denselben Zeilen steht, sagt dasselbe Signal zweimal dasselbe. Drei bunte
   Symbole an einer bunten Linie machen aus einer ruhigen Gruppe ein Muster,
   und die Aufmerksamkeit, die das kostet, braucht der aktive Eintrag.

   NUR IN DER SEITENLEISTE UND NUR UNTER EINER BEREICHSZEILE: die zweite
   Haelfte der Regel oben (.cl-nav-item.cl-bereich) gilt fuer Eintraege
   AUSSERHALB einer gefaerbten Gruppe und bleibt unberuehrt. Auf der
   Startseite faerbt Bau 49b (D2) unveraendert weiter — dort gibt es keine
   Linie, die es sagen koennte.

   DAS AKTIVE KIND BLEIBT GOLD, Symbol eingeschlossen: die Regel oben nimmt
   es mit :not(.active) ohnehin aus, und diese hier tut es auch. Gold gilt
   fuer die ganze Zeile.

   VIER KLASSEN, damit die Reihenfolge in der Datei keine Rolle spielt: die
   Regel darueber hat drei. */
.cl-sidebar .cl-nav-group.cl-bereich .cl-nav-item--kind:not(.active) i {
    color: inherit;
    opacity: 1;
}

.cl-bereich--pferde   { --cl-bereich: var(--cl-bereich-pferde); }
.cl-bereich--webinare { --cl-bereich: var(--cl-bereich-webinare); }
.cl-bereich--training { --cl-bereich: var(--cl-bereich-training); }
.cl-bereich--lernen   { --cl-bereich: var(--cl-bereich-lernen); }

/* --- BAU 49b (A1): DIE ZEILE MIT KNOPF ----------------------------------
   DIE URSACHE, an EINER Stelle behoben.

   Unter 992 px macht die Mobilregel weiter oben aus JEDEM .cl-btn-pill einen
   Knopf mit `width: 100%`. Das ist fuer einen alleinstehenden Knopf richtig
   und fuer einen Knopf IN EINER ZEILE falsch: er verlangt die volle Breite des
   Flex-Behaelters, der Text daneben wird auf null gedrueckt, und der Knopf
   liegt ueber ihm. Sichtbar ab 991.98 px abwaerts — nicht erst am Telefon,
   dort nur am deutlichsten.

   `.cl-zeile` markiert eine solche Zeile. Sie nimmt die Mobilregel fuer ihre
   eigenen Knoepfe zurueck und erlaubt den Umbruch: wird es zu eng, rutscht der
   Knopf unter den Text, statt ihn zu verdecken. */
.cl-zeile { flex-wrap: wrap; row-gap: .6rem; }

/* Der Text darf schrumpfen, aber nicht unter ~11rem — darunter bricht die
   Zeile um. min-width:0 allein reicht nicht: es erlaubt das Schrumpfen bis 0,
   und genau das war das Bild. */
.cl-zeile__text { flex: 1 1 11rem; min-width: 0; }

/* Der Knopf behaelt seine Groesse und draengt sich nicht vor. */
.cl-zeile .cl-btn-pill {
    width: auto;
    flex: 0 0 auto;
    max-width: 100%;
}

/* Wenn die Zeile umbricht, sitzt der Knopf links unter dem Text und nicht
   verloren in der Mitte. */
@media (max-width: 575.98px) {
    .cl-zeile .cl-btn-pill { margin-left: auto; }
}

/* --- BAU 49: die fuenf Bloecke der Startseite ---------------------------- */

/* BAU 49b (C1/C2) — ZWEI SPALTEN AB DEM BESTEHENDEN UMBRUCH (992 px).

   VORHER: eine 720px-Saeule mit vier Bloecken untereinander, auf 1900 px steht
   rechts und links nichts. Der INHALT war richtig — es sind wenige Bloecke,
   weil es nicht mehr gibt. Also wird nichts dazuerfunden, sondern der
   vorhandene Inhalt in zwei Spalten gelegt.

   DIE BREITE: 1080 px ab 992 px, darunter unveraendert 720 px.
   BEGRUENDUNG: 1080 = zwei Spalten von je ~516 px plus 48 px Rinne. 516 px ist
   die Breite, bei der eine Karte mit Text und Knopf ohne Umbruch auskommt;
   schmaler waere die zweispaltige Ansicht enger als die einspaltige und damit
   sinnlos. Breiter geht auch nicht: bei 1200 px+ steht in jeder Spalte eine
   Zeile mit sehr langer Zeilenlaenge, und der Blick verliert den Anschluss.

   ZAEHLUNG DER BREITEN IM PROJEKT: es bleiben ZWEI Werte — .cl-page mit 880 px
   fuer Inhaltsseiten und .cl-home mit 720/1080 px fuer die Startseite. Die
   beiden Werte von .cl-home sind ein Behaelter in zwei Zustaenden an EINEM
   Umbruch, kein dritter Wert. Die Startseite liegt dafuer NICHT mehr in
   .cl-page — sonst deckelte deren 880 px die zweite Spalte. */
.cl-home-raster { display: block; }
.cl-home-spalte { display: block; }

@media (min-width: 992px) {
    .cl-home { max-width: 1080px; }

    /* BAU 2 — 60/40 STATT 50/50.
       Zwei gleiche Spalten behaupten zwei gleich wichtige Haelften. Rechts
       steht aber nichts, worauf jemand die Seite aufschlaegt: dort ist
       Kontext, links die Sache. Derselbe Grund, aus dem die Startseite
       ueberhaupt einen Helden bekommt. */
    .cl-home-raster {
        display: grid;
        grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
        gap: 0 3rem;
        align-items: start;
    }

    /* C3 — faellt eine Spalte ganz weg, wird die andere nicht zur haelfte
       leeren Flaeche: das Raster geht auf eine Spalte zurueck. Heute kann das
       nicht eintreten (jeder Block hat in jedem Zustand etwas zu sagen); die
       Regel steht da, damit ein spaeter entfernter Block kein Loch hinterlaesst. */
    .cl-home-raster--einspaltig { grid-template-columns: minmax(0, 1fr); max-width: 620px; }
}

/* C4 — die Vorlesereihenfolge ist die Reihenfolge im Markup: Pferde, Webinar,
   Handlung, Lernen. Die Spalten sind zwei Behaelter in genau dieser Folge; es
   gibt kein `order`, kein `grid-row`, keine Umsortierung. Wer mit der Tastatur
   geht, geht dieselbe Reihe wie am Telefon. */

/* ── BAU 2 (29.08.2026): DER HELDENBLOCK ──────────────────────────────────
   EINE Karte, fuenf Gestalten, dieselbe Form. Ruhiger Grund, Bereichsmarke
   links, und der EINZIGE goldene Knopf der Seite. Alles andere auf dieser
   Seite hat in diesem Bau sein Gold verloren. */
.cl-held {
    background: var(--cl-glass-bg);
    backdrop-filter: var(--cl-glass-blur);
    -webkit-backdrop-filter: var(--cl-glass-blur);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius-lg);
    padding: 1.35rem 1.35rem 1.15rem;
    margin-bottom: 1.5rem;
}
.cl-held__kopfzeile {
    display: flex; align-items: center; gap: .6rem;
    flex-wrap: wrap; margin-bottom: .5rem;
}
.cl-held__kicker { font-size: .68rem; letter-spacing: .09em; text-transform: uppercase; font-weight: 700; }
.cl-held__titel {
    font-size: 1.45rem; font-weight: 700; line-height: 1.25;
    margin: 0 0 .45rem; color: #fff;
}
.cl-held__text { font-size: .95rem; margin: 0 0 .6rem; color: var(--cl-text); }
.cl-held__meta { font-size: .85rem; margin: 0 0 .6rem; color: var(--cl-text-muted); }
.cl-held__knopf { margin-top: .35rem; min-height: 48px; }

/* Die Fusszeile traegt den Textlink „Später". Er ist ausdruecklich KEIN
   zweiter Knopf — zwei Knoepfe waeren zwei gleich schwere Angebote. */
.cl-held__fuss { font-size: .8rem; margin: .8rem 0 0; }
.cl-held__spaeter {
    background: none; border: none; padding: 0;
    color: var(--cl-text); font: inherit; cursor: pointer;
    text-decoration: underline; text-underline-offset: 2px;
}
.cl-held__spaeter:hover { color: #fff; }

/* DER AUSWEG IM WILLKOMMENSSCHIRM — „Ich reite (noch) kein eigenes Pferd".

   DIESELBE FORM WIE .cl-held__spaeter UND EINE EIGENE KLASSE. Dieselbe Form,
   weil beide dasselbe sind: eine Bedienung, die ausdruecklich KEIN zweiter
   Knopf sein soll. Eine eigene Klasse, weil die andere zum Heldenblock der
   Startseite gehoert — sie dort mitzubenutzen hiesse, dass eine Aenderung am
   Helden still den Willkommensschirm mitbewegt.

   LEISER, ABER NICHT VERSTECKT: fuer den Schulpferd- und
   Reitbeteiligungs-Weg ist das der einzige Ausgang. Deshalb muted statt
   unsichtbar, mit Unterstreichung und sichtbarem Fokus. */
.cl-onboarding__ausweg {
    background: none; border: none; padding: .25rem;
    color: var(--cl-text-muted); font: inherit; font-size: .85rem; cursor: pointer;
    text-decoration: underline; text-underline-offset: 2px;
}
.cl-onboarding__ausweg:hover,
.cl-onboarding__ausweg:focus-visible { color: var(--cl-text); }
.cl-onboarding__ausweg:disabled { opacity: .6; cursor: default; }

/* ZEHN PLAETZE, KEIN BALKEN. Gezaehlte Plaetze, von denen welche belegt sind —
   kein Prozentwert und keine Aussage ueber Qualitaet. */
.cl-held__plaetze { display: flex; gap: .3rem; margin: 0 0 .7rem; }
.cl-held__platz {
    flex: 1 1 0; height: 6px; border-radius: 3px;
    background: rgba(255,255,255,.10);
}
.cl-held__platz--belegt { background: var(--cl-bereich-training); }

@media (min-width: 992px) {
    .cl-held { padding: 1.75rem 1.9rem 1.5rem; }
    .cl-held__titel { font-size: 1.75rem; }
}
@media (max-width: 575.98px) {
    .cl-held__knopf { width: 100%; }
}

/* ── BAU 3 (29.08.2026): DIE FUSSLEISTE „NOCH OFFEN" ──────────────────────
   Unter dem Helden, klein, ohne Kasten, ohne Gold, ohne Knopf. Sie traegt
   kein Gewicht: der Held hat genau eine Antwort, und das hier ist keine
   zweite. Der Kreis ist ein Zeichen und keine Bedienung. */
.cl-nochoffen {
    margin: -0.6rem 0 1.5rem;
    padding-left: .1rem;
}
.cl-nochoffen__marke {
    font-size: .68rem; letter-spacing: .09em; text-transform: uppercase;
    font-weight: 700; color: var(--cl-text-subtle);
    margin-bottom: .35rem;
}
.cl-nochoffen__zeile {
    display: flex; align-items: baseline; gap: .5rem;
    padding: .3rem 0;
    text-decoration: none; color: var(--cl-text-muted);
    font-size: .85rem;
}
.cl-nochoffen__zeile:hover { color: var(--cl-text); }
.cl-nochoffen__kreis {
    flex: 0 0 auto;
    width: 9px; height: 9px; border-radius: 50%;
    border: 1.5px solid var(--cl-text-subtle);
    position: relative; top: 1px;
}
.cl-nochoffen__zeile:hover .cl-nochoffen__kreis { border-color: var(--cl-text-muted); }
.cl-nochoffen__text { display: flex; flex-wrap: wrap; gap: .1rem .45rem; min-width: 0; }
.cl-nochoffen__was { font-weight: 600; color: var(--cl-text); }
.cl-nochoffen__zusatz { color: var(--cl-text-muted); }

/* ── BAU 2: DIE STATUSMARKE ───────────────────────────────────────────────
   Aufklappbar, damit der erklaerende Satz dazugehoert, ohne in jeder Ansicht
   zu stehen. Kein Gold, keine Warnfarbe: es ist eine Einordnung, kein Alarm. */
.cl-statusmarke { display: inline-block; }
/* BAU P6 — display GEHOERT NICHT AUF EIN <summary>. Es ist von Haus aus
   list-item; ein anderes display nimmt ihm in WebKit die Aufklapp-Rolle. Das
   Ausrichten passiert jetzt in .cl-statusmarke__zeile darin. Der Rest der
   Marke — Rahmen, Rundung, Farbe — bleibt hier, denn er gehoert der
   Trefferflaeche. */
.cl-statusmarke__zeile {
    display: inline-flex; align-items: center; gap: .3rem;
}
.cl-statusmarke__marke {
    padding: .15rem .55rem;
    border: 1px solid var(--cl-glass-border);
    border-radius: 999px;
    background: var(--cl-glass-bg);
    color: var(--cl-text-muted);
    font-size: .68rem; font-weight: 600; letter-spacing: .04em;
    cursor: pointer; list-style: none;
}
.cl-statusmarke__marke::-webkit-details-marker { display: none; }
.cl-statusmarke__marke:hover { color: var(--cl-text); }
.cl-statusmarke__satz {
    font-size: .8rem; color: var(--cl-text-muted);
    margin: .5rem 0 0; max-width: 44ch;
}

/* ── BAU 2: DIE FUSSZEILE DER STARTSEITE ─────────────────────────────── */
.cl-home-fuss {
    font-size: .78rem; text-align: center;
    margin: 2.5rem 0 0;
}

/* Der Seitenkopf (D5) — dieselbe Form wie auf den anderen Landings. */
.cl-home-kopf { margin-bottom: 1.25rem; }
.cl-home-kopf__titel {
    font-size: 1.6rem; font-weight: 700; margin: 0 0 .35rem 0; color: #fff;
    display: flex; align-items: center; gap: .55rem;
}
.cl-home-kopf__unter { font-size: .95rem; margin: 0; }

/* Der Fehlerzustand eines Blocks (A2). Ruhig, kein Rot ueber die ganze Karte —
   ein Ausfall ist ein Zustand, kein Alarm. Der rohe Ausnahmetext kommt hier
   nicht vor. */
.cl-block-fehler {
    display: flex; align-items: center; gap: .9rem;
    padding: .9rem 1.15rem; margin-bottom: 1rem;
    border-color: rgba(255,255,255,.14);
}
.cl-block-fehler .bi-cloud-slash { font-size: 1.35rem; color: var(--cl-text-muted); flex-shrink: 0; }
/* flex kommt aus .cl-zeile__text (Bau 49b) — hier nur noch das Eigene. */
.cl-block-fehler__text { min-width: 0; }
.cl-block-fehler__satz { color: #fff; font-weight: 600; font-size: .95rem; }
.cl-block-fehler__zusatz { font-size: .8rem; }
.cl-block-fehler__knopf {
    padding: 6px 16px; font-size: .8rem; white-space: nowrap;
    background: transparent; border: 1px solid rgba(200,160,0,.4);
    color: var(--cl-gold-light);
}

/* A4 — ruhige Flaeche waehrend des Ladens statt leerer Felder, die
   nacheinander vollaufen. KEIN Vollbild-Spinner: die Begruessung steht sofort
   und bleibt lesbar. */
.cl-home-platzhalter {
    height: 84px; margin-bottom: 1rem; border-radius: 14px;
    background: rgba(255,255,255,.04);
}

.cl-home-fehlerzeile {
    padding: .75rem 1rem; margin-bottom: 1rem; color: #e05555;
}

/* F1 — MEHRERE PFERDE: waagrecht scrollbarer Streifen.
   ENTSCHEIDUNG UND BEGRUENDUNG: Karten gleicher Groesse, und der Block waechst
   nicht in die Hoehe, sobald jemand vier Pferde hat. Das Scrollen bleibt IM
   Streifen (overflow-x hier, nicht am Body) — die Seite selbst laeuft am
   Telefon nicht waagrecht. Bei einem einzigen Pferd ist davon nichts zu sehen. */
/* BAU 1 (29.08.2026) — die Zeile, wenn die faelligen Termine ausgefallen sind.
   Leise: dieselbe Groesse wie eine Terminzeile auf der Karte, keine Farbe,
   kein Rahmen, kein Knopf. Die Pferde selbst sind da; es fehlt eine
   Zusatzangabe, und das soll dastehen, ohne die Seite zu beherrschen. */
.cl-pferdestreifen__hinweis {
    display: flex; align-items: center; gap: .35rem;
    font-size: .78rem;
    margin-bottom: .5rem;
}

/* BAU P8 — DER EINSTIEG BEI GENAU EINEM PFERD.
   Volle Breite, festes Verhaeltnis, Name und Zeile AUF dem Bild. Dieselbe
   Form wie der Hero auf der Pferdeseite, nur kleiner — wer ein Pferd hat,
   soll es hier sehen und nicht als Briefmarke. */
.cl-pferdeinstieg {
    position: relative;
    display: block;
    width: 100%;
    aspect-ratio: 16 / 9;
    max-height: 40vh;
    border-radius: var(--cl-radius);
    overflow: hidden;
    margin-bottom: 1.25rem;
    text-decoration: none;
    background: var(--cl-glass-bg);
}
.cl-pferdeinstieg__bild {
    display: flex; align-items: center; justify-content: center;
    width: 100%; height: 100%;
}
.cl-pferdeinstieg__bild img { width: 100%; height: 100%; object-fit: cover; }
.cl-pferdeinstieg__bild i { font-size: 2.4rem; color: var(--cl-text-muted); }

/* Der Verlauf endet DURCHSICHTIG — liefe er bis zur Unterkante dunkel aus,
   stuende ein schwarzes Band auf der Bildkante. Dieselbe Begruendung wie am
   Hero (Bau 35i). */
.cl-pferdeinstieg__verlauf {
    position: absolute; left: 0; right: 0; bottom: 0;
    display: flex; flex-direction: column; gap: .15rem;
    padding: 2.5rem .9rem .8rem;
    background: linear-gradient(transparent 0%, rgba(0,0,0,.72) 65%, rgba(0,0,0,.78) 100%);
}
.cl-pferdeinstieg__name {
    font-size: 1.35rem; font-weight: 700; color: #fff;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.cl-pferdestreifen {
    display: flex; gap: .75rem;
    overflow-x: auto; overflow-y: hidden;
    margin-bottom: 1.25rem; padding-bottom: .35rem;
    scroll-snap-type: x proximity;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: thin;
}
.cl-pferdekarte {
    flex: 0 0 auto; width: 156px;
    display: flex; flex-direction: column; gap: .5rem;
    padding: .75rem; text-decoration: none; color: var(--cl-text);
    scroll-snap-align: start;
}
.cl-pferdekarte:hover { border-color: rgba(200,160,0,.45); }
.cl-pferdekarte__bild {
    width: 100%; aspect-ratio: 4 / 3; border-radius: 10px; overflow: hidden;
    background: rgba(255,255,255,.06);
    display: flex; align-items: center; justify-content: center;
}
.cl-pferdekarte__bild img { width: 100%; height: 100%; object-fit: cover; }
/* BAU 2 — kein Gold: eine Initiale ist ein Platzhalter fuer ein fehlendes
   Foto, keine Aktion. Sie traegt jetzt den Bereichston der Pferde. */
/* BAU 2 — kein Gold: eine Initiale ist ein Platzhalter fuer ein fehlendes
   Foto, keine Aktion.
   BAU P8 — DESHALB STEHT HIER JETZT EIN EIGENER, GEDAEMPFTER TON. Bis P8 las
   die Regel den Bereichston der Pferde, und der war gruen; seit der Bereich
   die Hausfarbe traegt, waere sie golden geworden — und damit genau das, was
   Bau 2 ausgeschlossen hat. */
.cl-pferdekarte__initiale {
    font-size: 1.6rem; font-weight: 700; color: var(--cl-text-muted);
}
.cl-pferdekarte__name {
    font-weight: 700; font-size: .98rem; color: #fff;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Kein Termin -> diese Zeile gibt es nicht. Kein Platzhalter, kein Strich. */
.cl-pferdekarte__termin {
    font-size: .78rem; color: var(--cl-text-muted);
    display: flex; align-items: center; gap: .3rem;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* BAU 2 — kein Gold. Die Dringlichkeit steht im WORT („überfällig", „heute");
   eine goldene Zeile daneben las sich wie ein Angebot zum Antippen. */
.cl-pferdekarte__termin--faellig { color: var(--cl-text); font-weight: 600; }

/* Der naechste Webinarabend. */
.cl-home-abend {
    display: flex; align-items: center; gap: .9rem;
    padding: 1rem 1.2rem; margin-bottom: 1.25rem;
    text-decoration: none; color: var(--cl-text);
}
/* BAU 2 — die Farbe ist ENTFALLEN, nicht ersetzt: das Element traegt
   zugleich .cl-bereich__symbol, und dessen Regel (0,2,0) hat diese hier
   (0,1,0) ohnehin ueberstimmt. Sie stand seit Bau 49b wirkungslos da. */
.cl-home-abend__symbol { font-size: 1.4rem; flex-shrink: 0; }
.cl-home-abend__body { display: flex; flex-direction: column; flex: 1; min-width: 0; }
.cl-home-abend__lead {
    font-size: .72rem; text-transform: uppercase; letter-spacing: .05em;
    color: var(--cl-text-muted);
}
.cl-home-abend__titel { font-weight: 700; font-size: 1rem; color: #fff; }
.cl-home-abend__reihe { font-size: .8rem; color: var(--cl-text-muted); }
.cl-home-abend .bi-chevron-right { color: var(--cl-text-subtle); }

/* Bau 49b (E4) — der Reihenhinweis. Sichtbar ruhiger als alles darueber:
   keine Bereichsmarke, kein Goldknopf, gedaempfter Text. Es ist ein Hinweis
   und keine Handlung. */
.cl-webinartipp {
    display: flex; align-items: center; gap: .9rem;
    padding: .9rem 1.15rem; margin-bottom: 1.25rem;
    text-decoration: none; color: var(--cl-text-muted);
    border-color: rgba(255,255,255,.10);
}
.cl-webinartipp:hover { color: var(--cl-text); }
.cl-webinartipp__symbol { font-size: 1.2rem; color: var(--cl-text-subtle); flex-shrink: 0; }
.cl-webinartipp__body { display: flex; flex-direction: column; flex: 1; min-width: 0; }
.cl-webinartipp__lead {
    font-size: .7rem; text-transform: uppercase; letter-spacing: .05em;
    color: var(--cl-text-subtle);
}
.cl-webinartipp__titel { font-weight: 600; font-size: .95rem; color: var(--cl-text); }
.cl-webinartipp__zeile { font-size: .8rem; overflow-wrap: anywhere; }
/* BAU 2 — kein Gold. 49b hatte fuer diesen Block ausdruecklich „kein
   Goldknopf" festgelegt; der Verweis war der Rest davon. */
.cl-webinartipp__weg { font-size: .82rem; white-space: nowrap; color: var(--cl-text-muted); }

/* Weitermachen im Lernen — EINE Zeile plus Knopf, keine Modulliste. */
.cl-home-lernen {
    display: flex; align-items: center; gap: .9rem;
    padding: 1rem 1.2rem; margin-bottom: 1.25rem;
    text-decoration: none; color: var(--cl-text);
}
/* BAU 2 — im Lernblock war diese Farbe wirkungslos (cl-bereich gewinnt), im
   LetzterKaufBlock wirkte sie: dort stand ein goldenes Symbol ohne Aktion.
   Jetzt gedaempft, und der Bereichston gewinnt weiterhin, wo einer gesetzt ist. */
.cl-home-lernen__symbol { font-size: 1.4rem; color: var(--cl-text-muted); flex-shrink: 0; }
/* flex kommt aus .cl-zeile__text (Bau 49b). */
.cl-home-lernen__body { display: flex; flex-direction: column; min-width: 0; }
.cl-home-lernen__lead {
    font-size: .72rem; text-transform: uppercase; letter-spacing: .05em;
    color: var(--cl-text-muted);
}
.cl-home-lernen__titel {
    font-weight: 700; font-size: 1rem; color: #fff;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cl-home-lernen__knopf { padding: 7px 18px; font-size: .82rem; white-space: nowrap; }

/* 09.09.2026 — DIE BETONTE FASSUNG. Auf /lernen/module ist dieser Block die
   eine Handlung der Seite und traegt deshalb das Gold; auf der Startseite
   gehoert es dem Helden (Bau 2), dort bleibt der Umriss.
   NUR Rand, Schatten und Symbolton -- Fuellung, Radius und Polsterung kommen
   weiter aus .cl-card-glass, damit es keine zweite Kartendefinition gibt. */
.cl-home-lernen--betont {
    border-color: var(--cl-gold-border);
    box-shadow: var(--cl-shadow-gold);
}
.cl-home-lernen--betont:hover {
    border-color: var(--cl-gold);
    box-shadow: 0 0 32px rgba(200, 149, 42, 0.25);
}
.cl-home-lernen--betont .cl-home-lernen__symbol { color: var(--cl-gold); }

/* Bau 49b (A2): am schmalen Geraet darf der Titel umbrechen statt zu kuerzen.
   Ein abgeschnittener Kapitelname ist auf 320 px keine Auskunft mehr. */
@media (max-width: 575.98px) {
    .cl-home-lernen__titel { white-space: normal; overflow: visible; overflow-wrap: anywhere; }
}

@media (max-width: 575.98px) {
    /* Am Telefon etwas schmaler, damit die zweite Karte sichtbar ANGESCHNITTEN
       ist — sonst sieht der Streifen aus wie eine einzelne Karte, und niemand
       wischt. */
    .cl-pferdekarte { width: 138px; }
    .cl-home-lernen__knopf { padding: 6px 14px; font-size: .78rem; }
}

/* --- Culture Selector --------------------------------------- */
.cl-culture-selector {
    display: flex; gap: 2px;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: 8px;
    padding: 2px;
}
.cl-culture-btn {
    background: transparent; border: none;
    color: var(--cl-text-muted);
    font-size: .75rem; font-weight: 700;
    padding: 4px 10px; border-radius: 6px;
    cursor: pointer;
    transition: all var(--cl-duration) var(--cl-ease);
}
.cl-culture-btn:hover { color: var(--cl-text); }
.cl-culture-btn.active {
    background: var(--cl-gold);
    color: var(--cl-navy-dark);
}

/* --- Upload Zone ------------------------------------------- */
.cl-upload-zone {
    display: flex; flex-direction: column; align-items: center;
    gap: .5rem; padding: 2rem;
    border: 2px dashed var(--cl-glass-border);
    border-radius: var(--cl-radius-lg);
    cursor: pointer;
    transition: border-color var(--cl-duration) var(--cl-ease),
                background var(--cl-duration) var(--cl-ease);
    text-align: center;
}
.cl-upload-zone:hover {
    border-color: var(--cl-gold-border);
    background: var(--cl-glass-bg);
}

/* --- Metric Chips (annotation UI) -------------------------- */
.cl-metric-chip {
    display: inline-flex; align-items: center;
    padding: 2px 10px;
    border: 1px solid var(--cl-gold);
    border-radius: 20px;
    font-size: .6875rem; /* 11px */
    color: var(--cl-gold-pale);
    font-variant-numeric: tabular-nums;
    line-height: 1.4;
    cursor: default;
    white-space: nowrap;
}
.cl-metric-chip b { font-weight: 700; margin-right: 2px; }

/* With value — subtle gold fill */
.cl-metric-chip--value {
    background: rgba(200, 149, 42, 0.12);
}

/* Without value — graceful degradation */
.cl-metric-chip--empty {
    border-color: var(--cl-glass-border);
    color: var(--cl-text-subtle);
    background: transparent;
}

/* ONNX status hint */
.cl-metrics-hint {
    font-size: .6875rem;
    color: var(--cl-text-muted);
    margin-top: .25rem;
}

/* --- Annotation split-screen (desktop ≥ 1200px) --------------- */
@media (min-width: 1200px) {
    .cl-annotation-split {
        display: grid;
        grid-template-columns: 3fr 2fr;
        gap: 1.5rem;
        align-items: start;
    }
    .cl-annotation-split__video {
        position: sticky;
        top: 0;
    }
    .cl-annotation-split__video video {
        max-height: none !important;
        width: 100%;
        border-radius: var(--cl-radius-lg);
    }
    .cl-annotation-split__panel {
        /* 1c: --cl-navbar-total statt --cl-navbar-h. Abgezogen gehoert die
           Hoehe, die der Kopf im Fenster BELEGT, nicht die seines Inhalts. */
        max-height: calc(100vh - var(--cl-navbar-total) - 3rem);
        overflow-y: auto;
        padding-right: .5rem;
    }
}
@media (max-width: 1199.98px) {
    .cl-annotation-split__video {
        position: sticky;
        top: 0;
        z-index: var(--cl-ebene-leiste);
        background: var(--cl-navy-dark);
        padding-bottom: .5rem;
    }
}

/* ===== MySessionDetail Premium ===== */
.cl-session-layout {
    display: grid;
    grid-template-columns: 52% 1fr;
    gap: 1.5rem;
    align-items: start;
}
@media (max-width: 991px) {
    .cl-session-layout {
        display: flex;
        flex-direction: column;
    }
}
.cl-video-panel {
    position: sticky;
    top: 72px;
}
.cl-video-wrapper {
    position: relative !important;
    border-radius: 14px;
    overflow: hidden;
    background: #000;
    aspect-ratio: 16/9;
    box-shadow: 0 8px 40px rgba(0,0,0,0.5);
    border: 1px solid rgba(184,145,58,0.25);
}
.cl-video-wrapper video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: contain;
    z-index: 1;
}
.cl-video-wrapper canvas {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    z-index: 2;
    pointer-events: none;
    transition: opacity 0.3s ease;
}
.cl-skeleton-toggle {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.625rem;
    justify-content: flex-end;
}
.cl-skeleton-toggle button {
    background: rgba(184,145,58,0.12);
    border: 1px solid rgba(184,145,58,0.3);
    border-radius: 20px;
    color: #b8913a;
    font-size: 0.75rem;
    font-weight: 600;
    padding: 0.25rem 0.875rem;
    cursor: pointer;
    transition: background 0.2s;
    display: flex;
    align-items: center;
    gap: 0.35rem;
}
.cl-skeleton-toggle button:hover {
    background: rgba(184,145,58,0.22);
}
.cl-skeleton-toggle button.active {
    background: rgba(184,145,58,0.25);
    border-color: #b8913a;
}
.cl-category-card {
    background: rgba(255,255,255,0.04);
    border: 1px solid rgba(255,255,255,0.09);
    border-radius: 14px;
    padding: 1.25rem;
    margin-bottom: 0.875rem;
    transition: border-color 0.2s, box-shadow 0.2s;
}
.cl-category-card:hover {
    border-color: rgba(184,145,58,0.35);
    box-shadow: 0 4px 20px rgba(184,145,58,0.08);
}
.cl-category-header {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    margin-bottom: 0.625rem;
}
.cl-category-title {
    font-weight: 600;
    font-size: 1rem;
    color: #fff;
}
.cl-category-subtitle {
    font-size: 0.78rem;
    color: rgba(255,255,255,0.45);
    margin-top: 2px;
}
.cl-trainer-info-bar {
    display: flex;
    align-items: center;
    gap: 1rem;
    background: rgba(184,145,58,0.07);
    border: 1px solid rgba(184,145,58,0.18);
    border-radius: 12px;
    padding: 0.875rem 1.25rem;
    margin-bottom: 1.25rem;
}
.cl-comment-list {
    margin-top: 0.75rem;
    padding-top: 0.75rem;
    border-top: 1px solid rgba(255,255,255,0.07);
    display: flex;
    flex-direction: column;
    gap: 0.375rem;
}
.cl-comment-item {
    display: flex;
    gap: 0.5rem;
    align-items: flex-start;
    font-size: 0.83rem;
    color: rgba(255,255,255,0.75);
    line-height: 1.5;
}
.cl-comment-timestamp {
    background: rgba(184,145,58,0.15);
    color: #b8913a;
    border: 1px solid rgba(184,145,58,0.3);
    border-radius: 5px;
    padding: 1px 6px;
    font-size: 0.7rem;
    font-weight: 700;
    white-space: nowrap;
    cursor: pointer;
    flex-shrink: 0;
    margin-top: 3px;
    display: inline-block;
    font-family: monospace;
}
.cl-comment-timestamp:hover {
    background: rgba(184,145,58,0.28);
}
/* BAU 0 (29.08.2026) — HIER STANDEN .cl-score-bar-track UND .cl-score-bar-fill.
   Sie trugen einen Balken auf der Aufnahmeseite, der vier benannte Notenstufen
   als 100/75/50/25 Prozent zeichnete. Die Prozentzahl stammte aus keiner
   Quelle. Balken, Klassen und die beiden Methoden dahinter sind entfallen;
   die Begruendung steht in MySessionDetail.razor an der Stelle des Balkens. */
.cl-exercise-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    background: rgba(184,145,58,0.1);
    border: 1px solid rgba(184,145,58,0.28);
    border-radius: 20px;
    padding: 0.25rem 0.7rem;
    font-size: 0.78rem;
    color: #b8913a;
    margin: 0.15rem;
}
.cl-section-divider {
    height: 1px;
    background: linear-gradient(90deg,
        transparent, rgba(184,145,58,0.3), transparent);
    margin: 1.25rem 0;
}
/* Category Card Highlight (Timestamp-Click) */
@keyframes cl-card-pulse {
    0%   { box-shadow: 0 0 0 0 rgba(184,145,58,0.0);
           border-color: rgba(255,255,255,0.09); }
    30%  { box-shadow: 0 0 0 6px rgba(184,145,58,0.25);
           border-color: rgba(184,145,58,0.7); }
    100% { box-shadow: 0 4px 20px rgba(184,145,58,0.08);
           border-color: rgba(184,145,58,0.35); }
}
.cl-category-card.cl-highlight {
    animation: cl-card-pulse 1.8s ease forwards;
}
/* Toast Notification */
.cl-toast {
    position: fixed;
    bottom: 2rem;
    left: 50%;
    transform: translateX(-50%) translateY(20px);
    background: rgba(15,30,56,0.95);
    border: 1px solid rgba(184,145,58,0.4);
    border-radius: 10px;
    padding: 0.625rem 1.25rem;
    color: #fff;
    font-size: 0.83rem;
    display: flex;
    align-items: center;
    gap: 0.625rem;
    z-index: 9999;
    opacity: 0;
    transition: opacity 0.25s, transform 0.25s;
    pointer-events: none;
    backdrop-filter: blur(8px);
}
.cl-toast.visible {
    opacity: 1;
    transform: translateX(-50%) translateY(0);
}
.cl-toast-icon { color: #b8913a; font-size: 0.9rem; }
.cl-toast-cat { color: #b8913a; font-weight: 600; }
/* Skeleton Section (dual-view) */
.cl-skeleton-section {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1rem;
    margin-top: 1rem;
}
.cl-skeleton-card {
    background: linear-gradient(135deg, #0d1b35 0%, #1a2744 100%);
    border: 1px solid rgba(184,145,58,0.2);
    border-radius: 12px;
    padding: 1rem;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
}
.cl-skeleton-card canvas {
    border-radius: 8px;
}
.cl-skeleton-label {
    font-size: 0.72rem;
    color: rgba(255,255,255,0.4);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-weight: 600;
}
.cl-legend-row {
    display: flex;
    gap: 0.75rem;
    justify-content: center;
    margin-top: 0.25rem;
    flex-wrap: wrap;
}
.cl-legend-dot {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.68rem;
    color: rgba(255,255,255,0.5);
}
.cl-legend-dot::before {
    content: '';
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--dot-color);
    display: inline-block;
}
/* BAU 0b (29.08.2026) — „ohne Note" ist HOHL, nicht nur grau.

   Der Ton allein traegt die Unterscheidung schon (er ist keine der vier
   Notenfarben), aber ein gefuellter Punkt liest sich als Aussage, egal welche
   Farbe er hat. Hohl heisst: hier steht nichts. Dieselbe Form benutzt die
   Punktueberlagerung auf dem Video. */
.cl-legend-dot--hohl::before {
    background: transparent;
    border: 1.5px solid var(--dot-color);
}
/* Skeleton card canvas responsive */
.cl-skeleton-card {
    overflow: hidden;
}
.cl-skeleton-card canvas {
    max-width: 100%;
    height: auto;
    display: block;
}
/* Mobile layout */
@media (max-width: 575px) {
    .cl-skeleton-section {
        grid-template-columns: 1fr 1fr;
        gap: 0.5rem;
    }
    .cl-skeleton-card canvas {
        width: 100% !important;
        height: auto !important;
        max-height: 160px;
    }
    .cl-skeleton-card {
        padding: 0.5rem;
    }
    .cl-skeleton-label {
        font-size: 0.65rem;
    }
    .cl-session-layout {
        display: flex !important;
        flex-direction: column !important;
    }
    .cl-video-panel {
        position: static !important;
    }
}
/* ===== END MySessionDetail ===== */

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

/* =================================================================
   CompetencyCheck — global token mapping
   ----------------------------------------------------------------
   The Contracts components (.cc-summary, .cc-step, .cc-intro,
   .cc-result, .cc-cmp, .cc-progress) expose CSS custom properties
   for theming. Mapping them here at the global level — instead of
   inside scoped .razor.css with ::deep — avoids the Blazor scope-
   identifier mismatch between Contracts and Cavallearn.Client.
   ================================================================= */

.cc-summary,
.cc-intro,
.cc-step,
.cc-result,
.cc-cmp {
    --cc-summary-bg: var(--cl-navy);
    --cc-summary-border: rgba(200, 149, 42, 0.18);
    --cc-summary-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
    --cc-summary-text: var(--cl-white, #ffffff);
    --cc-summary-muted: rgba(255, 255, 255, 0.62);

    --cc-intro-card-bg: var(--cl-navy);
    --cc-intro-card-border: rgba(200, 149, 42, 0.18);
    --cc-intro-card-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
    --cc-intro-text-color: var(--cl-white, #ffffff);
    --cc-intro-muted-color: rgba(255, 255, 255, 0.62);
    --cc-intro-accent-color: var(--cl-gold);
    --cc-intro-accent-fg-color: #0e1a2b;

    --cc-step-card-bg: var(--cl-navy);
    --cc-step-card-border: rgba(200, 149, 42, 0.18);
    --cc-step-card-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
    --cc-step-text-color: var(--cl-white, #ffffff);
    --cc-step-muted-color: rgba(255, 255, 255, 0.62);
    --cc-step-accent-color: var(--cl-gold);
    --cc-step-accent-fg-color: #0e1a2b;
    --cc-step-row-bg: rgba(255, 255, 255, 0.05);
    /* Radio-pill colours on dark navy surfaces — variables consumed by the
       Contracts component's scoped CSS (--cc-step-pill-bg / -fg / -border)
       so the dark theme survives the scoped-stylesheet specificity tie. */
    --cc-step-option-bg: rgba(255, 255, 255, 0.04);
    --cc-step-option-fg: rgba(255, 255, 255, 0.92);
    --cc-step-option-border: rgba(255, 255, 255, 0.18);
    --cc-step-option-selected-bg: rgba(200, 149, 42, 0.22);
    --cc-step-option-selected-fg: var(--cl-white, #ffffff);

    --cc-result-text-color: var(--cl-white, #ffffff);
    --cc-result-muted-color: rgba(255, 255, 255, 0.62);
    --cc-result-accent-color: var(--cl-gold);
    --cc-result-accent-fg-color: #0e1a2b;
    --cc-result-border-color: rgba(200, 149, 42, 0.18);

    --cc-cmp-card-bg: var(--cl-navy);
    --cc-cmp-card-border: rgba(200, 149, 42, 0.18);
    --cc-cmp-card-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
    --cc-cmp-text-color: var(--cl-white, #ffffff);
    --cc-cmp-muted-color: rgba(255, 255, 255, 0.62);
    --cc-cmp-divergent-bg-color: rgba(251, 191, 36, 0.18);
    --cc-cmp-divergent-border-color: rgba(251, 191, 36, 0.45);
    --cc-cmp-divergent-fg-color: var(--cl-gold-light, #e8b84b);

    --cc-cta-bg: var(--cl-gold);
    --cc-cta-fg: #0e1a2b;
    --cc-cta-bg-hover: var(--cl-gold-light, #e8b84b);

    --cc-pers-trainer-bg: rgba(29, 78, 216, 0.22);
    --cc-pers-trainer-fg: #93c5fd;
    --cc-pers-selbst-bg: rgba(200, 149, 42, 0.22);
    --cc-pers-selbst-fg: var(--cl-gold-light, #e8b84b);

    --cc-progress-track: rgba(255, 255, 255, 0.12);
    --cc-progress-color: var(--cl-gold);
    --cc-progress-label-fg: rgba(255, 255, 255, 0.7);
}

/* Standalone progress bar (used inside .cc-wizard, no parent .cc-* wrapper). */
.cc-progress {
    --cc-progress-track: rgba(255, 255, 255, 0.12);
    --cc-progress-color: var(--cl-gold);
    --cc-progress-label-fg: rgba(255, 255, 255, 0.7);
}

/* =================================================================
   Home dashboard — Sitz-Selbstcheck hint card
   ================================================================= */
.cl-home-selfcheck {
    display: flex;
    align-items: center;
    gap: 1rem;
    padding: 1rem 1.25rem;
    margin: 1.25rem 0;
    text-decoration: none;
    color: var(--cl-white, #ffffff);
    background: linear-gradient(135deg,
        color-mix(in srgb, var(--cl-gold) 12%, var(--cl-navy)),
        var(--cl-navy));
    transition: transform 180ms ease, box-shadow 180ms ease;
}

.cl-home-selfcheck:hover {
    transform: translateY(-2px);
    box-shadow: 0 12px 28px rgba(200, 149, 42, 0.18);
}

.cl-home-selfcheck__icon {
    flex-shrink: 0;
    width: 2.75rem;
    height: 2.75rem;
    border-radius: 50%;
    background: rgba(200, 149, 42, 0.18);
    color: var(--cl-gold-light, #e8b84b);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.3rem;
}

.cl-home-selfcheck__body {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    flex: 1 1 auto;
    min-width: 0;
}

.cl-home-selfcheck__lead {
    font-weight: 700;
    font-size: 1rem;
    line-height: 1.25;
}

.cl-home-selfcheck__sub {
    font-size: 0.82rem;
    color: rgba(255, 255, 255, 0.7);
}

.cl-home-selfcheck__cta {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.45rem 0.95rem;
    border-radius: 999px;
    background: var(--cl-gold);
    color: #0e1a2b;
    font-weight: 700;
    font-size: 0.85rem;
    flex-shrink: 0;
    transition: background 160ms ease;
}

.cl-home-selfcheck:hover .cl-home-selfcheck__cta {
    background: var(--cl-gold-light, #e8b84b);
}

@media (max-width: 540px) {
    .cl-home-selfcheck {
        flex-wrap: wrap;
    }

    .cl-home-selfcheck__body {
        flex-basis: calc(100% - 3.75rem);
    }

    .cl-home-selfcheck__cta {
        margin-left: auto;
    }
}

/* Radio-pill theme overrides live as CSS variables on .cc-step above —
   the component's scoped CSS now consumes them via var() with fallbacks,
   so we no longer need a parallel class-level override here. */

/* ─────────────────────────────────────────────────────────────────────
   Mobile Bottom-Nav "Mehr"-Drawer. Ported from Worklino's bottom-sheet
   pattern (Worklino.Client/Layout/MainLayout.razor + worklino.css). Same
   slide-up motion, same close-on-backdrop / close-on-route. Theme tokens
   swapped to Cavallearn navy/gold.
   ───────────────────────────────────────────────────────────────────── */

button.cl-bottom-tab {
    appearance: none;
    background: transparent;
    border: 0;
    cursor: pointer;
    font-family: inherit;
    color: inherit;
    -webkit-tap-highlight-color: transparent;
}

.cl-mehr-sheet-backdrop {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.55);
    z-index: var(--cl-ebene-blatt);
    animation: cl-mehr-fade 180ms ease both;
}

@keyframes cl-mehr-fade {
    from { opacity: 0; }
    to   { opacity: 1; }
}

.cl-mehr-sheet {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: calc(var(--cl-ebene-blatt) + 1);
    background: var(--cl-navy);
    border-top: 1px solid rgba(200, 149, 42, 0.25);
    border-top-left-radius: 18px;
    border-top-right-radius: 18px;
    box-shadow: 0 -10px 32px rgba(0, 0, 0, 0.45);
    padding: 0.5rem 0 calc(env(safe-area-inset-bottom, 0) + 0.75rem);
    max-height: 80vh;
    overflow-y: auto;
    animation: cl-mehr-slide 220ms cubic-bezier(0.22, 0.61, 0.36, 1) both;
    color: var(--cl-text, #fff);
}

@keyframes cl-mehr-slide {
    from { transform: translateY(100%); }
    to   { transform: translateY(0); }
}

.cl-mehr-sheet-handle {
    width: 40px;
    height: 4px;
    background: rgba(255, 255, 255, 0.18);
    border-radius: 999px;
    margin: 0.5rem auto 0.25rem;
}

.cl-mehr-sheet-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0.5rem 1rem 0.75rem;
    border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}

.cl-mehr-sheet-title {
    font-size: 1rem;
    font-weight: 700;
}

.cl-mehr-sheet-close {
    appearance: none;
    background: transparent;
    border: 0;
    color: rgba(255, 255, 255, 0.7);
    font-size: 1.1rem;
    padding: 0.4rem 0.55rem;
    border-radius: 0.5rem;
    cursor: pointer;
    transition: background 0.15s, color 0.15s;
    -webkit-tap-highlight-color: transparent;
}

.cl-mehr-sheet-close:hover,
.cl-mehr-sheet-close:focus-visible {
    background: rgba(255, 255, 255, 0.08);
    color: var(--cl-text, #fff);
    outline: none;
}

.cl-mehr-sheet-items {
    list-style: none;
    margin: 0;
    padding: 0.25rem 0;
}

.cl-mehr-sheet-items li {
    margin: 0;
}

.cl-mehr-sheet-sep {
    height: 1px;
    background: rgba(255, 255, 255, 0.08);
    margin: 0.5rem 1rem;
}

.cl-mehr-sheet-item {
    display: flex;
    align-items: center;
    gap: 0.85rem;
    width: 100%;
    padding: 0.85rem 1rem;
    color: inherit;
    font-size: 0.95rem;
    font-weight: 500;
    text-decoration: none;
    background: transparent;
    border: 0;
    cursor: pointer;
    text-align: left;
    transition: background 0.15s;
    -webkit-tap-highlight-color: transparent;
}

.cl-mehr-sheet-item:hover,
.cl-mehr-sheet-item:focus-visible {
    background: rgba(200, 149, 42, 0.12);
    color: inherit;
    outline: none;
    text-decoration: none;
}

.cl-mehr-sheet-item-danger {
    color: #ff7a7a;
}

.cl-mehr-sheet-item-danger:hover {
    background: rgba(204, 76, 76, 0.18);
    color: #ff9a9a;
}

.cl-mehr-sheet-icon {
    width: 36px;
    height: 36px;
    border-radius: 10px;
    background: rgba(200, 149, 42, 0.14);
    color: var(--cl-gold);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 1.05rem;
    flex-shrink: 0;
}

.cl-mehr-sheet-item-danger .cl-mehr-sheet-icon {
    background: rgba(204, 76, 76, 0.18);
    color: #ff7a7a;
}

.cl-mehr-sheet-label {
    flex: 1;
    min-width: 0;
}

.cl-mehr-sheet-chevron {
    color: rgba(255, 255, 255, 0.4);
    font-size: 0.85rem;
    flex-shrink: 0;
}

/* Sitz-Check status pills on the MySessions list tile. Self vs Trainer
   each gets its own colour so the rider can tell at a glance which
   perspectives have been filled. */
.cl-check-pill {
    display: inline-flex;
    align-items: center;
    gap: .25rem;
    padding: .15rem .5rem;
    border-radius: 999px;
    font-size: .7rem;
    font-weight: 600;
    line-height: 1;
}

.cl-check-pill--self {
    background: rgba(63, 164, 90, 0.18);
    color: #6fd590;
    border: 1px solid rgba(63, 164, 90, 0.35);
}

.cl-check-pill--trainer {
    background: rgba(200, 149, 42, 0.18);
    color: var(--cl-gold);
    border: 1px solid rgba(200, 149, 42, 0.35);
}

/* --- Notification panel (C5b-2) ------------------------------
   One responsive element: bottom-sheet on mobile (mirrors the
   Mehr-Drawer), dropdown under the bell on desktop (>=768px). */
.cl-notif-backdrop {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.55);
    z-index: var(--cl-ebene-blatt);
    animation: cl-mehr-fade 180ms ease both;
}

.cl-notif-panel {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: calc(var(--cl-ebene-blatt) + 1);
    background: var(--cl-navy);
    border-top: 1px solid rgba(200, 149, 42, 0.25);
    border-top-left-radius: 18px;
    border-top-right-radius: 18px;
    box-shadow: 0 -10px 32px rgba(0, 0, 0, 0.45);
    padding: 0.5rem 0 calc(env(safe-area-inset-bottom, 0) + 0.75rem);
    max-height: 70vh;
    overflow-y: auto;
    animation: cl-mehr-slide 220ms cubic-bezier(0.22, 0.61, 0.36, 1) both;
}

@media (min-width: 768px) {
    .cl-notif-backdrop { background: transparent; }
    .cl-notif-panel {
        left: auto;
        right: 12px;
        bottom: auto;
        top: calc(var(--cl-navbar-total) + 6px);
        width: 380px;
        max-height: min(520px, calc(100vh - var(--cl-navbar-total) - 24px));
        border: 1px solid var(--cl-glass-border);
        border-radius: 14px;
        box-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);
        padding: 0.25rem 0 0.5rem;
        animation: cl-mehr-fade 150ms ease both;
    }
    .cl-notif-panel-handle { display: none; }
}

/* --- Area switch (header, H1c) ------------------------------ */
/* 02.09.2026 — WOERTLICH ZURUECK AUS a09bf3b4, mit EINER Auslassung: die
   600er-Media-Regel, die hier die Beschriftungen ausblendete, kommt NICHT
   wieder. Unterhalb der Schwelle gibt es die Pillen gar nicht mehr — der
   Avatar traegt dort den Wechsel —, also gibt es auch nichts auszublenden.
   Genau das war der Vorwurf an die alte Fassung: sechs namenlose Symbole. */
.cl-area-switch {
    display: flex;
    gap: .15rem;
    margin-left: 1rem;
    padding: .2rem;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius-pill);
}
.cl-area-switch-btn {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    padding: .3rem .7rem;
    font-size: .8rem;
    font-weight: 600;
    color: var(--cl-text-muted);
    background: transparent;
    border: none;
    border-radius: var(--cl-radius-pill);
    cursor: pointer;
    white-space: nowrap;
    transition: color var(--cl-duration) var(--cl-ease), background var(--cl-duration) var(--cl-ease);
}
.cl-area-switch-btn:hover { color: var(--cl-text); }
.cl-area-switch-btn.active { color: var(--cl-navy-dark); background: var(--cl-gold); }
/* Gutachten pill hints bronze even before entering the zone */
.cl-area-switch-btn--gutachten.active { background: #BE7B4F; color: #1B1710; }

/* 02.09.2026 — UNTERHALB 1024 PX NUR DIE SYMBOLE.

   Das ist die alte 600er-Idee an einer anderen Zahl: a09bf3b4 hatte sie
   geloescht („sechs namenlose Symbole"), und das war der richtige Vorwurf
   an eine Schwelle von 600 px — dort standen die Woerter schon lange davor
   im Weg. Bei 1024 traegt der Kopf die Beschriftung, solange sie passt, und
   gibt sie genau dann ab, wenn sie es nicht mehr tut. Die Rechnung steht
   weiter unten beim Grundzustand.

   .98 UND NICHT 1024: der Bereich muss luekenlos an die min-width-Regel
   anschliessen, sonst gaebe es bei genau 1024.0 px eine Breite, in der
   keine der beiden greift. Dieselbe Schreibweise wie beim Layoutumbruch in
   app.css (991.98px). */
@media (max-width: 1023.98px) {
    .cl-area-switch { margin-left: .4rem; }
    .cl-area-switch-btn { padding: .3rem .5rem; }
    .cl-area-switch-btn span { display: none; }
}

/* --- 01.09.2026: DER EINSTIEG ZU DEN ANGEBOTEN ----------------------------
   Ein Weg, kein Knopf: darum ein <a> und die ruhige Textfarbe der Nachbarn.
   Gold bekommt er nicht — der eine goldene Knopf je Schirm gehoert dem, was
   auf der SEITE zu tun ist, und der Kopf ist keine Seite. */
.cl-navbar-angebote {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    padding: .35rem .6rem;
    border-radius: 8px;
    color: var(--cl-text-muted);
    text-decoration: none;
    font-size: .85rem;
    white-space: nowrap;
    transition: color var(--cl-duration) var(--cl-ease),
                background var(--cl-duration) var(--cl-ease);
}
.cl-navbar-angebote i { font-size: 1.25rem; }
.cl-navbar-angebote:hover {
    color: var(--cl-gold-light);
    background: var(--cl-glass-bg);
}

/* --- 02.09.2026: DIE PILLEN GELTEN IN JEDER BREITE ------------------------
   AB 1024 PX mit Beschriftung, DARUNTER nur die Symbole. EIN Bedienelement
   in jeder Breite, nicht zwei.

   HIER STANDEN ZWEI BLOECKE: die Klassen des Kopf-Avatars und die
   Umschaltung zwischen ihm und den Pillen. Beide sind entfallen. Der Avatar
   hatte genau eine Aufgabe — den Bereichswechsel am schmalen Schirm zu
   tragen —, und die tragen jetzt wieder die Pillen. Ein Knopf, der nur eine
   Sache kann, verschwindet mit ihr.

   DIE BESCHRIFTUNG FAELLT BEI 1024 PX, und das ist dieselbe Zahl, die
   6ce26041 als Umschaltschwelle gesetzt hatte — mit derselben Rechnung, nur
   jetzt fuer eine andere Frage. Sechs BESCHRIFTETE Pillen (ein Admin)
   brauchen rund 606 px, der uebrige Kopf bei dieser Breite rund 377; das
   sind rund 983 px, und darunter wuerde .cl-navbar rechts abschneiden, wo
   das Abmelden steht.

   NEU GERECHNET FUER DIE SYMBOLFASSUNG, mit den engeren Abstaenden aus der
   alten 600er-Regel (padding .3rem .5rem, margin-left .4rem):
     je Pille   Symbol 12.8 + Innenabstand 16          ≈  28.8 px
     sechs      6 × 28.8                               ≈ 173 px
     dazwischen 5 × 2.4                                ≈  12 px
     Rahmen     2 × 3.2                                ≈   6 px
     Abstand links                                     ≈   6 px
     LEISTE                                            ≈ 198 px
   Der uebrige Kopf bei 360 px (unterhalb 640, also ohne Markentext, ohne
   Anzeigename, ohne das Wort „Angebote"):
     Aussenabstand 2 × 12                              ≈  24 px
     Logo 32 + 12                                      ≈  44 px
     rechts: Angebote 31, Glocke 31, Abmelden 31,
             zwei Zwischenraeume 12.8                  ≈ 106 px
     SUMME                                             ≈ 174 px
   ZUSAMMEN ≈ 372 px auf 360 px Breite — rund zwoelf zuviel.

   ▶ DAS IST GESCHAETZT UND KNAPP. Die Zahl haengt an der Schriftart, die der
   Browser waehlt; zwoelf Pixel sind innerhalb des Fehlers. Wenn es am Geraet
   nicht passt, ist der naechste Schritt der Innenabstand: .4rem statt .5rem
   bringt die Leiste auf rund 178 px und die Summe auf rund 352. Ich habe die
   Werte der alten 600er-Regel genommen, weil sie im Bestand erprobt sind —
   nicht, weil die Rechnung sie traegt.

   NUR SECHS PILLEN SIND SO ENG. Ein Reitlehrer hat drei (rund 100 px), ein
   Sattler zwei. Der Admin ist der Fall, an dem es sich entscheidet. */
/* --- 01.09.2026: DIE BEREICHSLISTE IM BLATT -------------------------------
   Sie zeigt, was die Pillen zeigten — mit Beschriftung, die es unter 600 px
   gerade nicht gab. Der laufende Bereich traegt einen Haken und Gold: die
   gleiche Aussage wie ueberall sonst in dieser Oberflaeche. */
.cl-bereichsliste { display: flex; flex-direction: column; padding: .35rem; }
.cl-bereichsliste__zeile {
    display: flex;
    align-items: center;
    gap: .75rem;
    width: 100%;
    min-height: 44px;
    padding: .5rem .75rem;
    border: 0;
    border-radius: var(--cl-radius);
    background: transparent;
    color: var(--cl-text-muted);
    font-size: .9rem;
    text-align: left;
    cursor: pointer;
    transition: background var(--cl-duration) var(--cl-ease),
                color var(--cl-duration) var(--cl-ease);
}
.cl-bereichsliste__zeile i { font-size: 1.15rem; width: 1.25rem; text-align: center; }
.cl-bereichsliste__zeile:hover { background: var(--cl-glass-bg); color: var(--cl-text); }
.cl-bereichsliste__zeile--hier { color: var(--cl-gold); }
.cl-bereichsliste__haken { margin-left: auto; font-size: .9rem; }

/* --- 01.09.2026: DAS BLATT (Shared/Blatt.razor) ---------------------------
   DIESELBE BAUFORM WIE DAS BENACHRICHTIGUNGSFELD DARUEBER, mit derselben
   Schwelle (768 px) und denselben Ebenen. Es ist bewusst eine Kopie der
   WERTE und keine Wiederverwendung der Klassen: .cl-notif-panel traegt
   Eigenes (Breite 380px, Position unter der Glocke), und ein gemeinsamer
   Selektor haette beide aneinandergebunden. Zwei Bauteile, zwei Klassen,
   eine Bauform.

   GETEILT WERDEN NUR .cl-mehr-sheet-handle und .cl-mehr-sheet-close — die
   benutzt das Benachrichtigungsfeld bereits, und sie bleiben unberuehrt.

   Z-INDEX: gleichauf mit dem Feld. Wer beide zugleich offen haben koennte,
   entscheidet im Aufrufer, nicht hier (Begruendung in Blatt.razor). */
.cl-blatt-hintergrund {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.55);
    z-index: var(--cl-ebene-blatt);
    animation: cl-mehr-fade 180ms ease both;
    border: 0;
}

.cl-blatt {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: calc(var(--cl-ebene-blatt) + 1);
    background: var(--cl-navy);
    border-top: 1px solid rgba(200, 149, 42, 0.25);
    border-top-left-radius: 18px;
    border-top-right-radius: 18px;
    box-shadow: 0 -10px 32px rgba(0, 0, 0, 0.45);
    padding: 0.5rem 0 calc(env(safe-area-inset-bottom, 0) + 0.75rem);
    max-height: 70vh;
    overflow-y: auto;
    animation: cl-mehr-slide 220ms cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
/* Der Rahmen traegt tabindex="-1", damit er den Fokus annehmen kann. Der
   Umriss, den der Browser dafuer zeichnet, gehoert dem, was man ANKLICKT —
   hier ist er nur der Landeplatz. Die Eintraege darin behalten ihren. */
.cl-blatt:focus { outline: none; }

/* 02.09.2026 — DIESE 768 IST NICHT DIE 1024 DES BEREICHSWECHSELS.
   Sie entscheidet, WIE das Blatt erscheint: darunter als Sheet von unten,
   darueber als Dropdown unter dem Ausloeser. Ob der Wechsel ueberhaupt ueber
   den Avatar laeuft oder ueber die Pillen, entscheidet die 1024 bei
   .cl-area-switch. Zwei Fragen, zwei Zahlen — nicht zusammenziehen.
   Zwischen 768 und 1024 gilt beides zugleich: der Avatar traegt den Wechsel,
   und sein Blatt erscheint als Dropdown. Das ist kein Widerspruch, sondern
   der Bereich, in dem ein Zeigegeraet auf einen schmalen Schirm trifft. */
@media (min-width: 768px) {
    .cl-blatt-hintergrund { background: transparent; }
    .cl-blatt {
        left: auto;
        right: 12px;
        bottom: auto;
        top: calc(var(--cl-navbar-total) + 6px);
        width: 280px;
        max-height: min(520px, calc(100vh - var(--cl-navbar-total) - 24px));
        border: 1px solid var(--cl-glass-border);
        border-radius: 14px;
        box-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);
        padding: 0.25rem 0 0.5rem;
        animation: cl-mehr-fade 150ms ease both;
    }
    .cl-blatt__griff { display: none; }
}

.cl-blatt__kopf {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0.5rem 1rem 0.75rem;
    border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}

.cl-blatt__titel { font-size: 1rem; font-weight: 700; }

.cl-notif-panel-header {
    display: flex;
    align-items: center;
    gap: .75rem;
    padding: .5rem 1rem;
    border-bottom: 1px solid var(--cl-glass-border);
}

.cl-notif-panel-title {
    font-weight: 700;
    color: var(--cl-gold-pale);
    margin-right: auto;
}

.cl-notif-markall {
    background: none;
    border: none;
    color: var(--cl-gold);
    font-size: .8rem;
    font-weight: 600;
    cursor: pointer;
    padding: .25rem .4rem;
    border-radius: 8px;
}
.cl-notif-markall:hover { background: var(--cl-glass-bg); }

.cl-notif-empty {
    padding: 1.5rem 1rem;
    text-align: center;
    color: var(--cl-text-muted);
    font-size: .9rem;
}

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

.cl-notif-item {
    display: flex;
    flex-direction: column;
    gap: .15rem;
    width: 100%;
    text-align: left;
    background: none;
    border: none;
    border-bottom: 1px solid var(--cl-glass-border);
    padding: .65rem 1rem;
    cursor: pointer;
    color: var(--cl-text-muted);
}
.cl-notif-item:hover { background: var(--cl-glass-bg); }
.cl-notif-list li:last-child .cl-notif-item { border-bottom: none; }

.cl-notif-item--unread { border-left: 3px solid var(--cl-gold); }
.cl-notif-item--unread .cl-notif-item-title { color: var(--cl-gold-pale); }

.cl-notif-item-title {
    font-weight: 600;
    color: var(--cl-white);
    font-size: .9rem;
}

.cl-notif-item-msg {
    font-size: .82rem;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.cl-notif-item-time {
    font-size: .72rem;
    color: var(--cl-text-muted);
    opacity: .8;
}

/* ==========================================================================
   Build E — Trainingspläne UI (catalog + editor + recommendation panels).
   Reuses the existing tokens (--cl-gold*, --cl-danger, --cl-success, --cl-radius)
   and card/button/badge language. No new design system.
   ========================================================================== */

/* Small square icon button + danger variant (reuse the pill visual language). */
.cl-icon-btn {
    display: inline-flex; align-items: center; justify-content: center;
    width: 30px; height: 30px; padding: 0;
    background: transparent; color: var(--cl-gold);
    border: 1.5px solid var(--cl-gold-border); border-radius: 8px;
    cursor: pointer; transition: background .15s, border-color .15s, opacity .15s;
    font-size: .85rem;
}
.cl-icon-btn:hover:not(:disabled) { background: var(--cl-gold-glow); border-color: var(--cl-gold); }
.cl-icon-btn:disabled { opacity: .35; cursor: not-allowed; }
.cl-icon-btn--danger { color: var(--cl-danger); border-color: rgba(248,113,113,0.35); }
.cl-icon-btn--danger:hover:not(:disabled) { background: rgba(248,113,113,0.12); border-color: var(--cl-danger); }

/* Danger modifier for the pill buttons. */
.cl-btn-pill-danger { color: var(--cl-danger); border-color: rgba(248,113,113,0.4); }
.cl-btn-pill-danger:hover { background: rgba(248,113,113,0.1); border-color: var(--cl-danger); }

/* Inline feedback banners (match ExercisesAdmin success/error look). */
.cl-feedback { border-radius: var(--cl-radius); padding: .6rem .75rem; font-size: .85rem; margin: .5rem 0; }
.cl-feedback--ok  { background: rgba(52,211,153,0.1); border: 1px solid rgba(52,211,153,0.3); color: var(--cl-success); }
.cl-feedback--err { background: rgba(248,113,113,0.1); border: 1px solid rgba(248,113,113,0.25); color: var(--cl-danger); }

/* Meta chips. */
.cl-chip-row { display: flex; flex-wrap: wrap; gap: .4rem; align-items: center; }
.cl-chip {
    display: inline-flex; align-items: center; gap: .3rem;
    padding: 2px 10px; border-radius: 999px; font-size: .74rem; line-height: 1.6;
    background: var(--cl-gold-glow); color: var(--cl-gold);
    border: 1px solid var(--cl-gold-border-dim); cursor: default;
}
.cl-chip--muted { background: rgba(255,255,255,0.04); color: var(--cl-text-muted); border-color: rgba(255,255,255,0.08); }
.cl-chip--finding { background: rgba(248,113,113,0.12); color: var(--cl-danger); border-color: rgba(248,113,113,0.3); }
/* Bau 41 (B) — Marke an einem Link, der die Zone wechselt. Bewusst leise:
   sie kuendigt an, sie wirbt nicht. Gleiche Form wie die uebrigen Chips. */
.cl-zonenwechsel {
    background: rgba(255,255,255,0.04); color: var(--cl-text-muted);
    border-color: rgba(255,255,255,0.10); font-size: .72rem; padding: 1px 8px 1px 4px;
}
.cl-zonenwechsel i { font-size: 1rem; margin-right: -.15rem; }

/* Selectable chip (error-class checkboxes rendered as chips). */
label.cl-chip { cursor: pointer; transition: background .15s, border-color .15s; }
label.cl-chip input { margin-right: .35rem; accent-color: var(--cl-gold); }
label.cl-chip.cl-chip--active { background: var(--cl-gold); color: #1a1207; border-color: var(--cl-gold); font-weight: 600; }

/* ---- Catalog ---- */
.cl-catalog { max-width: 960px; }
.cl-catalog__head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; gap: 1rem; }
.cl-catalog__head h3 { margin: 0; }
.cl-catalog__filters { display: flex; flex-wrap: wrap; gap: .6rem; margin-bottom: 1rem; }
.cl-catalog__filters .cl-field { display: flex; flex-direction: column; gap: .2rem; font-size: .72rem; color: var(--cl-text-muted); }
.cl-catalog__filters select { min-width: 150px; }
.cl-catalog__list { display: flex; flex-direction: column; gap: .85rem; }
.cl-catalog-card { padding: 1rem 1.15rem; }
.cl-catalog-card__head { display: flex; align-items: center; gap: .6rem; margin-bottom: .5rem; }
.cl-catalog-card__head strong { font-size: 1.02rem; }
.cl-catalog-card__meta { margin: .35rem 0 .6rem; }
.cl-catalog-card ol { margin: .35rem 0 .6rem 1.1rem; padding: 0; display: flex; flex-direction: column; gap: .15rem; }
.cl-catalog-card ol li { font-size: .85rem; }
.cl-catalog-card__actions { display: flex; gap: .5rem; }

/* ---- Editor ---- */
.cl-editor { max-width: 1040px; }
/* L2a — labelled reps/note fields per plan exercise */
.cl-editor__field { display: flex; flex-direction: column; gap: .15rem; }
.cl-editor__field-label { font-size: .7rem; color: var(--cl-text-muted); }
.cl-editor__head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; gap: 1rem; }
.cl-editor__head h3 { margin: 0; }
.cl-editor__note { background: var(--cl-gold-glow); border: 1px solid var(--cl-gold-border-dim);
    color: var(--cl-gold); border-radius: var(--cl-radius); padding: .5rem .75rem; font-size: .8rem; margin-bottom: 1rem; }
.cl-editor__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: .85rem; margin-bottom: 1.25rem; }
.cl-editor__grid label { display: flex; flex-direction: column; gap: .3rem; font-size: .78rem; color: var(--cl-text-muted); }
.cl-editor__check { display: inline-flex; align-items: center; gap: .4rem; font-size: .85rem; color: var(--cl-text); }
.cl-editor__cols { display: grid; grid-template-columns: 1.1fr 1fr 1fr; gap: 1.25rem; align-items: start; }
@media (max-width: 900px) { .cl-editor__cols { grid-template-columns: 1fr; } }
.cl-editor__col h5 { margin: 0 0 .6rem; font-size: .95rem; }
.cl-editor__selected { list-style: decimal; margin: 0; padding-left: 1.3rem; display: flex; flex-direction: column; gap: .4rem; }
.cl-editor__selected li { display: flex; justify-content: space-between; align-items: center; gap: .5rem;
    padding: .35rem .5rem; background: rgba(255,255,255,0.03); border-radius: 8px; }
.cl-editor__ex-actions { display: inline-flex; gap: .3rem; flex-shrink: 0; }
.cl-editor__picker { margin-top: .5rem; max-height: 340px; overflow-y: auto; display: flex; flex-direction: column; gap: .3rem; }
.cl-editor__pick-row { display: flex; justify-content: space-between; align-items: center; gap: .5rem;
    padding: .35rem .5rem; border: 1px solid rgba(255,255,255,0.06); border-radius: 8px; transition: background .12s, border-color .12s; }
.cl-editor__pick-row:hover { background: var(--cl-gold-glow); border-color: var(--cl-gold-border); }
.cl-editor__chip-grid { display: flex; flex-wrap: wrap; gap: .4rem; }
.cl-editor__footer { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; margin-top: 1.5rem;
    padding-top: 1rem; border-top: 1px solid rgba(255,255,255,0.08); }

/* Dark-theme legibility for the plain form controls used in these pages. */
.cl-editor .form-control, .cl-editor .form-select,
.cl-catalog .form-select {
    background: rgba(255,255,255,0.04); color: var(--cl-text);
    border: 1px solid var(--cl-gold-border-dim); border-radius: 8px;
}
.cl-editor .form-control:focus, .cl-editor .form-select:focus,
.cl-catalog .form-select:focus { border-color: var(--cl-gold); box-shadow: 0 0 0 2px var(--cl-gold-glow); }
.cl-editor .form-select option, .cl-catalog .form-select option { background: #1e1710; color: var(--cl-text); }

/* ---- Recommendation panels (trainer + rider) ---- */
.cl-reco-panel__title, .cl-assigned-panel .cl-reco-panel__title { font-size: 1rem; margin: 0 0 .6rem; }
.cl-reco-finding { padding: .85rem 1rem; margin-bottom: .75rem; }
.cl-reco-finding__head { display: flex; align-items: center; gap: .5rem; margin-bottom: .4rem; flex-wrap: wrap; }
.cl-reco-badge { display: inline-flex; padding: 2px 9px; border-radius: 999px; font-size: .7rem;
    background: var(--cl-gold-glow); color: var(--cl-gold); border: 1px solid var(--cl-gold-border-dim); }
.cl-reco-code { font-size: .72rem; color: var(--cl-text-muted); }
.cl-reco-sub { font-size: .78rem; color: var(--cl-text-muted); margin: .5rem 0 .2rem; text-transform: uppercase; letter-spacing: .03em; }
.cl-reco-list { margin: 0 0 .3rem 1.1rem; padding: 0; display: flex; flex-direction: column; gap: .2rem; }
.cl-reco-list li { font-size: .86rem; }
.cl-reco-muted { color: var(--cl-text-muted); font-size: .8rem; }
.cl-reco-vid { color: var(--cl-gold); margin-left: .35rem; }
.cl-reco-plan { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; padding: .3rem 0; }
.cl-reco-assign { margin-left: auto; }
.cl-reco-toast { margin-top: .6rem; }

/* 05.09.2026 — DER KATALOGKASTEN DES UEBUNGSSATZES.
   Er stand bis dahin als Inline-Stil in Bewertung.razor. Mit dem gemeinsamen
   Bauteil (Uebungssatzblock) gilt er fuer zwei Seiten und gehoert deshalb
   hierher, zu den uebrigen .cl-reco-Regeln — nicht in ein scoped Blatt, denn
   das Bauteil hat keines und benutzt durchgehend diese Klassen. */
.cl-uebung-katalog { display: flex; gap: .5rem; flex-wrap: wrap; align-items: center; margin-top: .5rem; }
.cl-uebung-katalog__wahl { flex: 1; min-width: 200px; }

/* 10.09.2026 — DIE AUFKLAPPBARE ZEILE UND DIE OFFENE KATALOGLISTE.
   Dasselbe Bauteil traegt sie auf beiden Seiten; es hat kein scoped Blatt,
   also gehoeren sie hierher wie der Katalogkasten darueber. */
.cl-reco-plan--auf { flex-wrap: wrap; }
.cl-reco-plan__kopf {
    display: flex; align-items: center; gap: .4rem;
    flex: 1 1 auto; min-width: 0;
    padding: 0; border: none; background: none; color: inherit; font: inherit;
    font-size: .86rem; text-align: left; cursor: pointer;
}
.cl-reco-plan__kopf:hover { color: var(--cl-gold-light, #e6c98a); }
.cl-reco-plan__uebungen {
    flex: 1 1 100%;
    margin: .25rem 0 .5rem 1.35rem; padding-left: .9rem;
    border-left: 1px solid rgba(255, 255, 255, .1);
    list-style: none; font-size: .8rem; line-height: 1.5;
}
.cl-uebung-suche { margin: .5rem 0 .35rem; }
.cl-uebung-suche .cl-input { width: 100%; }

/* 13.09.2026 - DIE UEBUNGSARTEN ALS KNOPFREIHE.

   Muster wie .cl-gut__mat-filter der Werkbank, aber hier: der Uebungssatzblock
   ist ein eigenes Bauteil und erreicht die Bereichsmarke jener Datei nicht.
   Deshalb steht die Reihe hier, wo auch .cl-reco-plan und .cl-uebung-suche
   stehen - beim Bauteil, nicht bei einer seiner zwei Seiten.

   NIE GRAU GEFUELLT (Mockup v4): umrandet, und gewaehlt gold. */
.cl-uebung-arten { display: flex; flex-wrap: wrap; gap: .3rem; margin: 0 0 .5rem; }
.cl-uebung-art {
    font: inherit;
    font-size: .72rem;
    padding: .2rem .6rem;
    border-radius: 999px;
    background: transparent;
    border: 1px solid rgba(255, 255, 255, .18);
    color: var(--cl-text-muted);
    cursor: pointer;
}
.cl-uebung-art:hover { border-color: var(--cl-gold); color: var(--cl-text); }
.cl-uebung-art--an {
    background: rgba(200, 149, 42, .14);
    border-color: var(--cl-gold);
    color: var(--cl-gold-light, #e6c98a);
}
.cl-uebung-arten-hinweis {
    margin: -.25rem 0 .5rem;
    font-size: .7rem;
    color: var(--cl-text-subtle, #8a8479);
}

/* 10.09.2026 — WAS NACH DEM LIEFERN IST, STEHT NEBEN DEM KNOPF. */
.cl-liefern__tat { display: flex; align-items: center; flex-wrap: wrap; gap: .5rem; }
.cl-liefern__folge { font-size: .78rem; color: var(--cl-text-muted); }

/* ==========================================================================
   Build G — Mitmach-Player (mobile-first). Full-width video, thumb-friendly
   controls pinned to the bottom. Reuses existing tokens only.
   ========================================================================== */
/* 07.09.2026 (Paket 1) — env() ERGAENZT. Der Player haelt selbst Platz frei
   (Leiste + 5rem fuer die fixierte Steuerzeile darueber); seit viewport-fit=cover
   den iOS-Rand messbar macht, gehoert dieser Rand in dieselbe Rechnung wie in
   .cl-main und .cl-klebeleiste-platz. Ohne ihn liegt die letzte Zeile des
   Uebungstextes hinter der Steuerzeile. */
.cl-player { max-width: 720px; margin: 0 auto; padding-bottom: calc(var(--cl-bottombar-h) + 5rem + env(safe-area-inset-bottom, 0px)); }
.cl-player__top { padding: .75rem 1rem .25rem; }
.cl-player__progress-text { font-size: .8rem; color: var(--cl-text-muted); margin-bottom: .35rem; }
.cl-player__bar { height: 6px; border-radius: 999px; background: rgba(255,255,255,0.08); overflow: hidden; }
.cl-player__bar-fill { height: 100%; background: linear-gradient(90deg, var(--cl-gold), var(--cl-gold-light)); transition: width .25s; }
.cl-player__body { padding: .5rem 1rem 1rem; }
.cl-player__headline { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; margin: .5rem 0 .35rem; }
.cl-player__headline h3 { margin: 0; font-size: 1.35rem; }
.cl-player__media { margin-top: .85rem; display: flex; flex-direction: column; gap: .75rem; }
.cl-player__label { font-size: .74rem; text-transform: uppercase; letter-spacing: .04em; color: var(--cl-text-muted); }
.cl-player__video { width: 100%; max-height: 60vh; background: #000; border-radius: var(--cl-radius); }
.cl-player__wide { width: 100%; }
.cl-player__reps { padding: 1.75rem 1rem; text-align: center; }
.cl-player__reps-big { font-size: 2rem; font-weight: 700; color: var(--cl-gold); }
.cl-player__note { font-size: .9rem; color: var(--cl-text-muted); margin-top: .6rem; }

/* Build K — instruction card (video-less exercise) + stopwatch */
.cl-player__card { padding: 1.25rem; display: flex; flex-direction: column; gap: .85rem; }
.cl-player__section p { margin: .2rem 0 0; line-height: 1.5; color: var(--cl-text); overflow-wrap: anywhere; }
.cl-player__section--how p { font-size: 1.05rem; }
.cl-player__section--how .cl-player__label { color: var(--cl-gold-light); }
.cl-player__timer { display: flex; align-items: center; gap: .6rem; margin-top: .25rem; flex-wrap: wrap; }
.cl-player__timer-val { font-variant-numeric: tabular-nums; font-size: 1.5rem; font-weight: 700; color: var(--cl-gold-light); min-width: 4.5rem; }
.cl-player__done { text-align: center; padding: 3rem 1.5rem; }
.cl-player__done i { font-size: 3rem; color: var(--cl-success); }
.cl-player__done h3 { margin: .75rem 0 .25rem; }

/* Build I — pre/end-check comparison (real self-check dimensions, no score) */
.cl-compare { display: flex; flex-direction: column; gap: .4rem; margin-bottom: 1rem; }
.cl-compare-row { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.cl-compare-dim { min-width: 7rem; font-size: .85rem; color: var(--cl-text-muted); }

/* Pinned control bar — large touch targets, always reachable at the bottom. */
/* Pinned above the app bottom-nav on mobile (bottom-nav is fixed at bottom:0,
   ≤991.98px); the player bar must not hide behind it. On desktop (≥992px, no
   bottom-nav) it becomes an in-flow sticky bar. */
.cl-player__controls {
    /* 07.09.2026 (Paket 1) — der iOS-Rand gehoert in die Ablage. Die Leiste
       darunter ist seit heute "Leistenhoehe + Rand" hoch; eine Steuerzeile bei
       genau var(--cl-bottombar-h) saesse sonst um diesen Betrag zu tief und
       verschwaende hinter der Navigation. */
    position: fixed; left: 0; right: 0;
    bottom: calc(var(--cl-bottombar-h) + env(safe-area-inset-bottom, 0px)); z-index: 90;
    display: flex; gap: .5rem; align-items: center;
    padding: .6rem .75rem;
    background: rgba(20, 15, 8, 0.95); backdrop-filter: blur(8px);
    border-top: 1px solid var(--cl-gold-border-dim);
}
.cl-player__controls .cl-btn-pill { padding: 14px 18px; font-size: .95rem; min-height: 50px; }
.cl-player__next { margin-left: auto; }
@media (min-width: 992px) {
    .cl-player { padding-bottom: 1.5rem; }
    .cl-player__controls {
        position: sticky; bottom: 0;
        border-radius: var(--cl-radius); margin-top: 1rem;
        padding-bottom: calc(.6rem + env(safe-area-inset-bottom, 0px));
    }
}

/* ============================================================
   Bau 21 — Umgebungs-Kennzeichen.

   Ein Streifen am oberen Rand, der auf JEDER Seite steht. Nur
   sichtbar, wenn Environment:Label gesetzt und nicht "Produktion"
   ist — markiert wird die TESTumgebung, nicht die produktive.
   Wer nichts sieht, ist im Ernstfall.

   position:sticky statt fixed: das Band soll Platz einnehmen und
   den Inhalt nach unten schieben, nicht darueberliegen. Ein
   ueberlagerndes Band verdeckt auf 360px die oberste Zeile — und
   die oberste Zeile ist meistens die Ueberschrift.
   ============================================================ */

.cl-umgebungsband {
  position: sticky;
  top: 0;
  z-index: 2000;               /* ueber der Navigation (1000) */
  display: flex;
  align-items: center;
  justify-content: center;
  gap: .5rem;
  flex-wrap: wrap;
  padding: .3rem .75rem;
  background: repeating-linear-gradient(
      45deg, #8a5a00, #8a5a00 12px, #a06a00 12px, #a06a00 24px);
  color: #fff;
  font-size: .78rem;
  font-weight: 700;
  letter-spacing: .04em;
  text-align: center;
  line-height: 1.3;
  /* Lange Namen brechen um, statt die Seite breiter zu machen. */
  overflow-wrap: anywhere;
  /* Bau 21b — im Flex-Stapel von #app behaelt der Streifen seine eigene Hoehe,
     auch wenn der Name auf 360px in zwei Zeilen umbricht. */
  flex: 0 0 auto;
}

/* ── Bau 21b (15.08.2026) — der Platz fuer das Band ──────────────────────────

   position:sticky hat NICHT gereicht, und der Grund steht nicht in dieser
   Datei: .cl-app ist 100dvh hoch (app.css) und ein GESCHWISTER des Bandes,
   kein Kind. Beide zusammen sind also 100dvh + Bandhoehe — die Seite wird
   scrollbar, .cl-app faehrt beim Scrollen unter dem klebenden Band durch, und
   ab dem ersten Pixel Scroll liegt das Band mit z-index 2000 auf der Navigation
   (Logo, Bereichsumschalter, Glocke, Abmelden). Genau das war in PROD zu sehen.

   Die Loesung nimmt dem Band den Platz nicht weg, sondern gibt ihn ihm: #app
   wird ein senkrechter Stapel, und die Anwendung darunter fuellt den REST.
   Weil das Band bei ausgeblendetem Zustand gar nicht im DOM steht, greift der
   Geschwister-Wahl (~) dann nicht — .cl-app behaelt seine 100dvh, und es
   entsteht KEIN Leerraum oben. Eine Klasse am Body, die jemand setzen und
   vergessen kann, braucht es dafuer nicht: das DOM selbst ist der Schalter. */
#app {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  min-height: 100dvh;
}

.cl-umgebungsband ~ .cl-app,
.cl-umgebungsband ~ .cl-auth-layout {
  height: auto;
  min-height: 0;
  flex: 1 1 auto;
}

.cl-umgebungsband__punkt {
  width: .55rem;
  height: .55rem;
  border-radius: 50%;
  background: #fff;
  flex: 0 0 auto;
}

.cl-umgebungsband__text {
  text-transform: uppercase;
}

/* Der Zusatz erklaert den Streifen beim ersten Mal. Auf sehr schmalen
   Schirmen faellt er weg — der Name allein traegt die Aussage. */
.cl-umgebungsband__zusatz {
  font-weight: 400;
  letter-spacing: 0;
  opacity: .9;
}

@media (max-width: 359px) {
  .cl-umgebungsband__zusatz { display: none; }
}

/* ── Bau 30: Admin-Formularraster ─────────────────────────────────────────────
   Eine Spalte bis 560px, zwei darueber. Mobil zuerst, weil dieser Bildschirm im
   Zweifel am Stand auf einem Telefon ausgefuellt wird: zwei Spalten auf 360px
   erzeugen Felder, in die man nicht tippen kann. */
.cl-form-grid { display: grid; grid-template-columns: 1fr; gap: .7rem; }
.cl-form-grid > label { display: flex; flex-direction: column; gap: .25rem; font-size: .82rem; font-weight: 600; }
.cl-form-grid > label > input,
.cl-form-grid > label > select { font-weight: 400; }

@media (min-width: 560px) {
  .cl-form-grid { grid-template-columns: 1fr 1fr; }
}

/* Zwischenüberschrift innerhalb einer Seite — kleiner als .cl-section-title. */
.cl-section-subtitle { font-size: 1rem; font-weight: 700; margin: 0 0 .6rem; }

/* ── Bau 30: Bottom-Nav mit sechs Tabs (Admin-Bereich) ────────────────────────
   Der Admin-Bereich hat mehr Einträge als jeder andere. Auf 360px reichen die
   Tabs zwar (min-width 48px x 6), die LABELS tun es nicht — "Rechnungssteller"
   sprengt sonst die Zeile. Deshalb wird die Beschriftung geklammert statt die
   Leiste umzubrechen: ein umbrechendes Bottom-Nav verschiebt den Inhalt darüber
   und trifft jede Seite, nicht nur diese eine. */
.cl-bottom-tab span {
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.cl-bottom-tab { max-width: 22vw; padding-left: 6px; padding-right: 6px; }


/* Bau 35g — Aufklapp-Zeile im Eintragsformular. Unaufdringlich: eine Zeile,
   kein zweites Bedienelement. Farben ueber die bestehenden Marken. */
.hrs-entry-mehr {
    background: none;
    border: none;
    padding: .2rem 0;
    color: var(--cl-gold);
    font-size: .82rem;
    cursor: pointer;
    text-align: left;
}


/* =================================================================
   POSTEN C2 — Abschlusskarte des Kapitels
   ----------------------------------------------------------------
   Einmalig, kurz, kein Dauerzustand. Die Karte faehrt beim Erscheinen
   von unten ein und wird sichtbar; das Haekchen kommt einen Tick
   spaeter und mit einem kleinen Ueberschwinger.

   REINES CSS. Kein JS-Interop, kein Timer, kein Zustand in der
   Ansicht — die Animation laeuft, weil das Element neu im DOM ist,
   und danach nie wieder. Wer das Kapitel erneut oeffnet, sieht sie
   einmal beim Aufbau der Seite und dann nichts mehr; ein Dauerpuls
   waere nach dem dritten Kapitel nur noch laestig.

   Die END-Zustaende der Keyframes sind der NATUERLICHE Zustand
   (opacity 1, keine Verschiebung, Skalierung 1). Damit greift die
   globale prefers-reduced-motion-Regel weiter oben in dieser Datei
   sauber: sie kuerzt die Dauer auf 0.01ms, und die Karte steht sofort
   da, wo sie hingehoert. Die Regel unten sagt es zusaetzlich
   ausdruecklich — eine Bewegungsvorgabe, die nur als Nebenwirkung
   einer Sternchen-Regel wirkt, ist keine.
   ================================================================= */

.cl-abschluss {
    position: relative;
    overflow: hidden;                 /* haelt das Konfetti in der Karte */
    animation: cl-abschluss-auf 500ms cubic-bezier(.16, 1, .3, 1);

    /* POSTEN C4 — farbige Kante statt des neutralen Glasrahmens.
       Der Wert ueberschreibt .cl-card-glass; der :hover-Zustand dort setzt
       border-color auf Weiss, deshalb steht die Regel unten noch einmal fuer
       :hover. Ohne das verlaere die Karte ihre Kante, sobald die Maus
       darueberfaehrt. */
    border-color: rgba(200, 160, 0, .45);
    box-shadow: 0 0 0 1px rgba(200, 160, 0, .10),
                0 10px 34px rgba(0, 0, 0, .28);
}

.cl-abschluss:hover { border-color: rgba(200, 160, 0, .55); }

.cl-abschluss__zeichen {
    display: inline-block;
    /* Kraeftiger als vorher: kleinerer Start, staerkerer Ueberschwinger. */
    animation: cl-abschluss-zeichen 620ms cubic-bezier(.34, 1.8, .5, 1) 140ms both;
}

@keyframes cl-abschluss-auf {
    from { opacity: 0; transform: translateY(14px); }
    to   { opacity: 1; transform: translateY(0); }
}

@keyframes cl-abschluss-zeichen {
    0%   { opacity: 0; transform: scale(.3)  rotate(-14deg); }
    60%  { opacity: 1; transform: scale(1.18) rotate(4deg); }
    100% { opacity: 1; transform: scale(1)   rotate(0); }
}

/* Die Modulkarte kommt einmal je Modul, nicht einmal je Kapitel — sie darf
   deutlicher sein. Verlaufskante ueber ein Pseudoelement mit Maske: ein
   echter Rahmen kann keinen Verlauf tragen, und ein zweiter Kasten dahinter
   wuerde den Glashintergrund von .cl-card-glass verdecken. */
.cl-abschluss--modul {
    border-color: transparent;
    box-shadow: 0 0 0 1px rgba(200, 160, 0, .18),
                0 14px 44px rgba(0, 0, 0, .34);
}

.cl-abschluss--modul::after {
    content: "";
    position: absolute;
    inset: 0;
    border-radius: inherit;
    padding: 2px;
    background: linear-gradient(135deg,
                #8a6d00 0%, #C8A000 25%, #f4e08a 50%, #C8A000 75%, #8a6d00 100%);
    -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    -webkit-mask-composite: xor;
            mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
            mask-composite: exclude;
    pointer-events: none;
}

/* ── Konfetti ──────────────────────────────────────────────────────────────
   REINES CSS, kein JS-Interop und keine Fremdbibliothek: vierzehn absolut
   gesetzte Elemente mit Keyframes. Jedes bekommt ueber :nth-child seine
   Startspalte, Verzoegerung, Farbe und Drehrichtung — im Markup steht
   deshalb nur eine leere Schleife und kein Stil je Teilchen.

   ES LAEUFT EINMAL UND HOERT AUF. Die Animation endet bei opacity 0 mit
   fill-mode forwards; danach liegt nichts Sichtbares mehr da. Der Container
   traegt pointer-events:none, damit die unsichtbaren Reste keinen Klick
   abfangen.

   WANN ES LAEUFT: beim Aufbau des Elements, also einmal je Seitenaufbau der
   Kapitelansicht. Ob das Kapitel gerade eben oder vor drei Wochen fertig
   wurde, unterscheidet die Ansicht nicht — dafuer braeuchte es einen
   gespeicherten "schon gefeiert"-Zustand, und den einzufuehren waere fuer
   eine Animation zu viel. Bewusst so, siehe Bericht.
   ────────────────────────────────────────────────────────────────────────── */

.cl-konfetti {
    position: absolute;
    inset: 0;
    overflow: hidden;
    pointer-events: none;
    z-index: 0;
}

.cl-konfetti > span {
    position: absolute;
    top: -14%;
    width: 8px;
    height: 14px;
    border-radius: 2px;
    opacity: 0;
    animation: cl-konfetti-fall 1100ms cubic-bezier(.35, .1, .6, 1) forwards;
}

/* Damit der Inhalt ueber dem Konfetti liegt und nicht darunter. */
.cl-abschluss > *:not(.cl-konfetti) { position: relative; z-index: 1; }

@keyframes cl-konfetti-fall {
    0%   { opacity: 0;   transform: translateY(0)     rotate(0deg)   scale(.9); }
    12%  { opacity: 1; }
    80%  { opacity: 1; }
    100% { opacity: 0;   transform: translateY(320px) rotate(540deg) scale(1); }
}

.cl-konfetti > span:nth-child(3n+1) { background: #C8A000; }
.cl-konfetti > span:nth-child(3n+2) { background: #34d399; }
.cl-konfetti > span:nth-child(3n+3) { background: #f4e08a; }

.cl-konfetti > span:nth-child(7n+2) { width: 6px;  height: 6px;  border-radius: 50%; }
.cl-konfetti > span:nth-child(7n+5) { width: 10px; height: 4px; }

.cl-konfetti > span:nth-child(1)  { left:  4%; animation-delay:  40ms; }
.cl-konfetti > span:nth-child(2)  { left: 12%; animation-delay: 180ms; }
.cl-konfetti > span:nth-child(3)  { left: 20%; animation-delay:   0ms; }
.cl-konfetti > span:nth-child(4)  { left: 28%; animation-delay: 240ms; }
.cl-konfetti > span:nth-child(5)  { left: 36%; animation-delay:  90ms; }
.cl-konfetti > span:nth-child(6)  { left: 44%; animation-delay: 300ms; }
.cl-konfetti > span:nth-child(7)  { left: 52%; animation-delay:  20ms; }
.cl-konfetti > span:nth-child(8)  { left: 60%; animation-delay: 210ms; }
.cl-konfetti > span:nth-child(9)  { left: 68%; animation-delay: 130ms; }
.cl-konfetti > span:nth-child(10) { left: 76%; animation-delay: 280ms; }
.cl-konfetti > span:nth-child(11) { left: 84%; animation-delay:  60ms; }
.cl-konfetti > span:nth-child(12) { left: 92%; animation-delay: 190ms; }
.cl-konfetti > span:nth-child(13) { left: 16%; animation-delay: 340ms; }
.cl-konfetti > span:nth-child(14) { left: 72%; animation-delay: 360ms; }

/* Gegenrichtung fuer jedes zweite Teilchen — sonst drehen alle gleich, und
   das sieht nach einer Kachel aus statt nach Konfetti. */
.cl-konfetti > span:nth-child(even) { animation-name: cl-konfetti-fall-links; }

@keyframes cl-konfetti-fall-links {
    0%   { opacity: 0;   transform: translateY(0)     rotate(0deg)    scale(.9); }
    12%  { opacity: 1; }
    80%  { opacity: 1; }
    100% { opacity: 0;   transform: translateY(340px) rotate(-480deg) scale(1); }
}

@media (prefers-reduced-motion: reduce) {
    .cl-abschluss,
    .cl-abschluss__zeichen {
        animation: none;
        opacity: 1;
        transform: none;
    }

    /* Kein Konfetti. Die Karte selbst bleibt vollstaendig sichtbar und
       behaelt ihre farbige Kante — abgeschaltet wird die BEWEGUNG, nicht
       die Aussage. */
    .cl-konfetti { display: none; }
}


/* =================================================================
   POSTEN C3 — Sprecherfigur im Dialogblock
   ----------------------------------------------------------------
   FREISTEHEND, wenn ein Bild da ist. Kein Hintergrund, kein Rahmen,
   keine runde Maske — die Bilder sind 320x320 RGBA mit transparentem
   Grund, und jede Flaeche dahinter schiene durch. Genau das war der
   blaue Schein hinter Saphirs Kopf.

   object-fit: contain statt cover: cover fuellt die Box und schneidet
   ab, was nicht hineinpasst — bei Arnie die Ohren, bei Saphir die
   Maehne. contain legt das ganze Bild hinein.
   object-position: bottom — die Figur steht auf derselben Linie wie
   die Unterkante der Sprechblase (die Zeile ist align-items:flex-end).

   .cl-dialog-figur--ersatz ist der ANDERE Fall, nicht der Untergrund:
   er wird nur gerendert, wenn kein Bild kommt. Dass hier ueberhaupt
   eine Hintergrundfarbe steht, ist deshalb unschaedlich — es liegt
   nie ein Bild darueber.
   ================================================================= */

.cl-dialog-figur {
    width: var(--cl-dialog-figur);
    height: var(--cl-dialog-figur);
    flex-shrink: 0;
    display: block;
    object-fit: contain;
    object-position: bottom center;
    /* Kein border-radius, kein background, kein overflow. Absicht. */
}

/* POSTEN C4 — die rechte Figur schaut nach links.
   Nur das BILD. Name und Sprechblase stehen ausserhalb dieses Elements und
   bleiben unberuehrt; eine Spiegelung der ganzen Zeile wuerde die Schrift
   seitenverkehrt setzen. */
.cl-dialog-figur--gespiegelt { transform: scaleX(-1); }

/* Der Ersatz bekommt die Spiegelklasse nie (DialogBlockView) — hier steht
   trotzdem die Gegenprobe, damit eine spaetere Zusammenlegung der beiden
   Zweige kein seitenverkehrtes "S" erzeugt. */
.cl-dialog-figur--ersatz {
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-weight: 700;
    font-size: 2rem;
    line-height: 1;
    transform: none;
}

/* Zwei Stufen nach unten. Rechnung bei 380 px Breite:
   .cl-main hat 1.5rem Innenabstand je Seite (app.css), bleiben 332 px.
   Abzueglich Figur 64 und Abstand .6rem bleiben rund 258 px fuer die Blase,
   davon 29 px Innenabstand — also gut 228 px Textbreite. Das traegt eine
   Zeile mit etwa 30 Zeichen und bleibt lesbar. */
@media (max-width: 640px) {
    /* Die Marke wandert, nicht die Regel — der Einzug der Folge-Replik
       folgt automatisch mit. */
    :root { --cl-dialog-figur: 76px; }
    .cl-dialog-figur--ersatz { font-size: 1.5rem; }
}

@media (max-width: 400px) {
    :root { --cl-dialog-figur: 64px; }
    .cl-dialog-figur--ersatz { font-size: 1.25rem; }
}

/* --- Seitenkopf: Überschrift + eine Aktion (Bau 39, B4) -----------------
   BEFUND, an einem echten 380px-Fenster gemessen (Chrome, DevTools-Protokoll,
   Emulation.setDeviceMetricsOverride — ein Fenster von 380px gibt Windows nicht
   her, --window-size klemmt bei 500px ab):

   Die Kopfzeilen waren `display:flex; justify-content:space-between` ohne
   Umbruch. Unter 992px zieht `.cl-btn-pill { width: 100% }` (Zeile ~1397) den
   Knopf auf volle Breite; als Flex-Element schrumpft er dann bis dicht an die
   Überschrift heran. Gemessen: Titel 24..102, Knopf 102..356 — GAR KEIN Abstand,
   und der Knopf ist mit 48px höher als die Titelzeile mit 30px. Auf dem Bild
   liegt die Pille samt Schein auf der Überschrift; bei zweizeiligen Titeln
   ("Meine Videos", "Alle Sessions") steht sie neben der zweiten Zeile.

   Die Kästen SCHNEIDEN sich dabei nicht — deshalb hätte eine reine
   Überlappungsprüfung nichts gefunden. Sichtbar ist es trotzdem, und der Nutzer
   liest Bilder, keine Rechtecke.

   LÖSUNG: umbrechen statt quetschen. Ab 576px bleibt alles wie bisher (eine
   Zeile, Aktion rechts), darunter steht die Aktion unter der Überschrift und
   nimmt die Breite, die sie ohnehin will. Keine neue Optik — dieselbe Pille,
   dieselbe Überschrift, nur eine Anordnung, die Platz hat. */
.cl-seitenkopf {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: .75rem 1rem;
    margin-bottom: 1.5rem;
}

/* flex: 0 1 auto — der Titel ist so BREIT WIE SEIN TEXT und darf schrumpfen.
   Mit `1 1 auto` zog er sich über die ganze Zeile, und der Gold-Unterstrich
   mit ihm: auf 1280px eine 794px lange Linie unter dem Wort "Analysen".
   Gemessen und wieder zurückgenommen. */
.cl-seitenkopf__titel {
    flex: 0 1 auto;
    min-width: 0;
    margin-bottom: 0;
    /* Ein langer Titel bricht um, statt den Knopf aus der Fläche zu drücken. */
    overflow-wrap: anywhere;
}

.cl-seitenkopf__aktion {
    flex: 0 0 auto;
}

@media (max-width: 575.98px) {
    .cl-seitenkopf {
        flex-direction: column;
        align-items: stretch;
    }

    /* inline-block: der Gold-Unterstrich bleibt so breit wie der Text und
       zieht sich nicht über die ganze Zeile. */
    .cl-seitenkopf__titel { align-self: flex-start; }

    .cl-seitenkopf__aktion {
        width: 100%;
        justify-content: center;
    }
}

/* --- Arbeitsfläche des Sitzexperten (Bau 40, A) ------------------------
   Eine Fläche, von oben nach unten abzuarbeiten: was sich durchzieht, woher
   das kommt, ein Vorschlag daraus, der Übungssatz, liefern. Keine neue Optik —
   dieselbe Glaskarte, dieselben Chips, nur eine Ordnung, die dem Ablauf folgt. */
.cl-arbeit { padding: 1rem; margin-bottom: 1.25rem; border: 1px solid var(--cl-gold-border); }

/* Der Hauptbefund hebt sich von den übrigen Mustern ab — er ist die Aussage,
   die oben auf der Ergebnisseite landet. */
.cl-chip--haupt {
    background: var(--cl-gold);
    color: var(--cl-navy);
    font-weight: 700;
}

.cl-slotliste { display: flex; flex-direction: column; gap: .4rem; margin-bottom: .75rem; }

.cl-slotzeile {
    border: 1px solid var(--cl-glass-border);
    border-left: 3px solid var(--cl-glass-border);
    border-radius: var(--cl-radius, .5rem);
    padding: .5rem .65rem;
    font-size: .84rem;
}

/* Der Zustand als Farbe am Rand: bewertet grün, abgelehnt rot, offen gold,
   nicht belegt bleibt neutral. Dieselbe Zuordnung wie an den Kacheln. */
.cl-slotzeile--bewertet { border-left-color: #3fb37f; }
.cl-slotzeile--abgelehnt { border-left-color: #e05555; }
.cl-slotzeile--offen { border-left-color: var(--cl-gold); }

.cl-slotzeile__kopf { display: flex; flex-wrap: wrap; align-items: baseline; gap: .5rem; }
.cl-slotzeile__name { font-weight: 600; }
.cl-slotzeile__zustand { font-size: .74rem; opacity: .7; text-transform: uppercase; letter-spacing: .02em; }
.cl-slotzeile__oeffnen { margin-left: auto; font-size: .78rem; text-decoration: none; white-space: nowrap; }

.cl-slotzeile__zeile { display: flex; gap: .5rem; margin-top: .25rem; line-height: 1.4; }
.cl-slotzeile__marke {
    flex: 0 0 4.5rem; font-size: .72rem; opacity: .6;
    text-transform: uppercase; letter-spacing: .02em; padding-top: .15rem;
}

/* Der Vorschlag ist sichtbar NICHT das Eingabefeld: gestrichelter Rand, eigener
   Kopf, eigener Knopf. Er wird nirgends gespeichert, und das soll man sehen
   (Human in the loop). */
.cl-vorschlag {
    border: 1px dashed var(--cl-gold);
    border-radius: var(--cl-radius, .5rem);
    padding: .7rem .8rem;
    margin-bottom: .6rem;
    background: rgba(255, 255, 255, .03);
}

.cl-vorschlag__kopf { font-size: .76rem; font-weight: 700; opacity: .85; margin-bottom: .4rem; }
.cl-vorschlag__text { font-size: .85rem; line-height: 1.5; white-space: pre-wrap; margin: 0 0 .6rem; }

.cl-liefern { margin-top: 1rem; padding-top: .85rem; border-top: 1px solid var(--cl-glass-border); }
.cl-liefern__liste { margin: 0 0 .75rem; padding-left: 1.1rem; font-size: .84rem; line-height: 1.7; }
.cl-liefern__liste li { opacity: .7; }
.cl-liefern__liste li.erledigt { opacity: 1; }
.cl-liefern__liste li.erledigt::marker { content: "\2713  "; color: #3fb37f; }

/* --- Die Ergebnisseite (Bau 40, B) ------------------------------------
   Die einzige Seite, die etwas ÜBERREICHT. Sie darf ruhiger und großzügiger
   sein als der Rest: mehr Weißraum, größere Schrift im Kopf, eine Blickführung
   von oben nach unten. Dieselbe Formensprache — Navy, Gold, Glaskarten —, keine
   Dekoration. Mobil zuerst: der Hauptbefund ist das Erste, der Start-Knopf steht
   direkt darunter im dritten Block. */
.cl-ergebnis { max-width: 44rem; margin: 0 auto; display: flex; flex-direction: column; gap: 1.75rem; }

/* 1 · Der Hauptbefund. Groß, mit Luft, ohne Kartenrahmen — er ist die Aussage,
   nicht ein Element unter vielen. */
.cl-ergebnis__kopf { padding: .5rem 0 0; }
.cl-ergebnis__vorspann {
    font-size: .8rem; text-transform: uppercase; letter-spacing: .06em;
    color: var(--cl-gold); margin: 0 0 .35rem;
}
.cl-ergebnis__befund {
    font-size: 1.9rem; font-weight: 700; line-height: 1.15;
    margin: 0; overflow-wrap: anywhere;
}
.cl-ergebnis__haeufigkeit { font-size: .95rem; opacity: .75; margin: .5rem 0 0; }
/* 07.09.2026 - .cl-ergebnis__bedeutung ist entfallen: das Feld dahinter
   (WasDarausFolgt / SolutionsDe) war bei allen 26 Mustern leer. An seine
   Stelle tritt die Reiterfassung als eigener Abschnitt (.cl-deutung). */

/* Die Fachbezeichnung unter der Ueberschrift. Sichtbar, aber leise: der
   Kaeufer liest den Reiternamen, der Sitzexperte findet seinen wieder. */
.cl-ergebnis__fachname {
    font-size: .9rem; opacity: .6; margin: .3rem 0 0; overflow-wrap: anywhere;
}

/* 2b - Was das heisst. Der Text, fuer den er bezahlt hat: begrenzte
   Zeilenlaenge, damit man ihn liest, und keine Kacheln - es sind Saetze. */
.cl-deutung { padding: 1.25rem; }
.cl-deutung__titel {
    font-size: .95rem; font-weight: 700; margin: 0 0 .3rem;
}
.cl-deutung__titel + .cl-deutung__text { margin-top: 0; }
.cl-deutung__text {
    font-size: .95rem; line-height: 1.6; max-width: 62ch;
    margin: 0 0 1rem; overflow-wrap: anywhere;
}
.cl-deutung__text:last-child { margin-bottom: 0; }

/* 2 · Das Zitat. Ein Mensch hat sich das angesehen — das ist das
   Verkaufsversprechen, und es soll wie ein Zitat aussehen, nicht wie ein Feld. */
.cl-zitat {
    margin: 0; padding: 0 0 0 1.1rem;
    border-left: 3px solid var(--cl-gold);
}
.cl-zitat__text {
    margin: 0; font-size: 1.05rem; line-height: 1.65;
    white-space: pre-wrap;      /* der Sitzexperte schreibt Absätze */
    overflow-wrap: anywhere;
}
.cl-zitat__wer { margin-top: .7rem; font-size: .85rem; font-weight: 600; }

/* 3 · Die Handlung. Der einzige hervorgehobene Knopf der Seite. */
.cl-tun { padding: 1.25rem; }
.cl-tun__titel { font-size: 1.05rem; font-weight: 700; margin: 0 0 .85rem; }
.cl-tun__satz + .cl-tun__satz { margin-top: 1.25rem; padding-top: 1.25rem; border-top: 1px solid var(--cl-glass-border); }
.cl-tun__name { font-size: 1.05rem; font-weight: 700; }

/* 07.09.2026 - die Herkunft eines Uebungssatzes. Leise: sie ordnet ein und
   ist nicht der Grund, warum jemand den Knopf drueckt. Sie erscheint nur,
   wenn beide Sorten nebeneinander stehen. */
.cl-tun__herkunft {
    font-size: .75rem; opacity: .6; margin-top: .15rem;
    text-transform: lowercase;
}
.cl-tun__liste { margin: .6rem 0 0; padding-left: 1.15rem; font-size: .9rem; line-height: 1.6; }
.cl-tun__start {
    margin-top: 1rem; width: 100%; min-height: 48px;
    display: inline-flex; align-items: center; justify-content: center;
    font-size: 1rem;
}

/* 4 · Weitere Beobachtungen — deutlich leiser. Sie sind nicht der Grund, warum
   jemand diese Seite öffnet. */
.cl-weiteres__titel { font-size: .85rem; font-weight: 700; opacity: .7; margin: 0 0 .5rem; }
.cl-weiteres__liste { margin: 0; padding-left: 1.1rem; font-size: .88rem; line-height: 1.8; opacity: .8; }
.cl-weiteres__name { font-weight: 600; }

/* Jede Zeile fuehrt zum Sitzproblem. 44px Tippflaeche wie ueberall - sie
   standen bis 07.09.2026 als toter Text da. */
.cl-weiteres__zeile {
    display: flex; align-items: center; gap: .35rem;
    min-height: 44px; color: inherit; text-decoration: none;
}
.cl-weiteres__zeile:hover { color: var(--cl-gold); }
.cl-weiteres__pfeil { margin-left: auto; font-size: .75rem; opacity: .6; }

/* 5 · Die Aufnahmen, zugeklappt. */
.cl-aufnahmen {
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius, .5rem);
    padding: .75rem 1rem;
}
.cl-aufnahmen__kopf { cursor: pointer; font-weight: 600; font-size: .92rem; min-height: 32px; }
.cl-aufnahmen__inhalt { margin-top: .75rem; display: flex; flex-direction: column; gap: .3rem; }
.cl-aufnahmen__zeile {
    display: flex; align-items: center; justify-content: space-between; gap: .75rem;
    min-height: 44px; padding: .35rem .5rem; text-decoration: none; color: inherit;
    border-radius: var(--cl-radius, .5rem);
}
.cl-aufnahmen__zeile:hover { background: var(--cl-glass-bg); }
.cl-aufnahmen__luecken {
    border: 1px solid #e05555; border-radius: var(--cl-radius, .5rem);
    padding: .6rem .75rem; margin-top: .5rem; font-size: .84rem;
}

@media (min-width: 768px) {
    .cl-ergebnis { gap: 2.25rem; }
    .cl-ergebnis__befund { font-size: 2.4rem; }
    /* Auf breiten Fenstern muss der Start-Knopf nicht über die ganze Zeile. */
    .cl-tun__start { width: auto; padding-left: 2rem; padding-right: 2rem; }
}

/* --- Der Trainings-Einstieg (Bau 41, C) ---------------------------------
   EINE Handlung oben, alles Uebrige leiser. Innerhalb der Formensprache:
   Glaskarte, Gold, dieselben Abstaende wie sonst. Keine neue Bibliothek. */
/* BAU 2 — DIE HANDLUNGSKARTE IST EIN LEISER BLOCK GEWORDEN.
   Der Goldschimmer und der goldene Rahmen gehoerten ihr, solange sie das
   Schwerste auf der Seite war. Seit es einen Helden gibt, ist sie es nicht
   mehr — und zwei goldene Flaechen sind zwei Antworten auf eine Frage. */
.cl-jetzt {
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: 14px;
    padding: 1.05rem 1.05rem 1.15rem;
    margin-bottom: 1.5rem;
}
/* BAU 2 — Farbe entfaellt; .cl-bereich__kicker (0,2,0) hat sie ohnehin
   ueberstimmt, seit die Karte eine Bereichsmarke traegt. */
.cl-jetzt__marke {
    font-size: .68rem; letter-spacing: .09em; text-transform: uppercase;
    font-weight: 700; margin-bottom: .45rem;
}
.cl-jetzt__kopf { display: flex; gap: .8rem; align-items: flex-start; }
/* BAU 2 — dieselbe tote Regel wie beim Marker. */
.cl-jetzt__symbol { font-size: 1.5rem; line-height: 1.2; }
.cl-jetzt__titel { font-size: 1.2rem; font-weight: 700; margin: 0 0 .2rem; }
.cl-jetzt__warum { font-size: .88rem; color: var(--cl-text-muted); margin: 0; }
.cl-jetzt__knopf {
    margin-top: .95rem; min-height: 48px;
    display: inline-flex; align-items: center; justify-content: center; gap: .4rem;
}

/* Was laeuft / was danach kommt: sichtbar leiser als die eine Handlung. */
.cl-leiser { margin-bottom: 1.35rem; }
.cl-leiser__titel {
    font-size: .78rem; letter-spacing: .07em; text-transform: uppercase;
    color: var(--cl-text-muted); font-weight: 600; margin: 0 0 .5rem;
}
.cl-loop-card--leise { opacity: .82; }

/* Die bestaetigten Muster MIT dem Weg zu ihrem Ergebnis. */
.cl-muster { margin-bottom: .6rem; }
.cl-muster__weg {
    display: inline-flex; align-items: center; gap: .2rem;
    font-size: .8rem; color: var(--cl-gold); text-decoration: none; margin-top: .35rem;
}
.cl-muster__weg:hover { text-decoration: underline; }

@media (min-width: 768px) {
    .cl-jetzt { padding: 1.35rem 1.4rem 1.45rem; }
    .cl-jetzt__titel { font-size: 1.4rem; }
    .cl-jetzt__symbol { font-size: 1.8rem; }
}
@media (max-width: 575.98px) {
    .cl-jetzt__knopf { width: 100%; }
}

/* Bau 41 (D) — der leere Fall auf der Ergebnisseite: ein Vorschlag ist keine
   Zuweisung, und das muss man sehen. Gestrichelter Rand, kein Gold. */
.cl-vorschlag-hinweis { font-size: .86rem; color: var(--cl-text-muted); margin: 0 0 .75rem; }
.cl-tun__satz--vorschlag {
    border: 1px dashed rgba(255,255,255,0.14);
    border-radius: 12px; padding: .8rem .85rem; margin-bottom: .6rem;
}

/* --- Bau 43 (B): Kopf ueber der Warteschlange und die Terminlage ---------
   Drei Zahlen, eine Spalte. Vorhandene Marken, keine neue Formensprache. */
.cl-kopfzahlen {
    display: flex; flex-wrap: wrap; gap: .35rem 1rem; align-items: baseline;
    font-size: .85rem; color: var(--cl-text-muted); margin-bottom: 1rem;
}
.cl-termin--ruhig { color: var(--cl-text-muted); }
.cl-termin--bald { color: #e0a800; }
.cl-termin--ueberfaellig { color: #e05555; }

/* --- Bau 44 (A): die Zeitauswertung. Vier Zahlen und eine Tabelle. --------- */
.cl-zeitzahlen {
    display: flex; flex-wrap: wrap; gap: .4rem 1.5rem; margin-top: .6rem; font-size: .85rem;
}
.cl-zeitzahlen b { font-size: 1.05rem; margin-right: .3rem; }
.cl-zeit-unscharf { color: var(--cl-text-muted); cursor: help; }
.cl-zeit-vorbehalt { font-size: .76rem; color: var(--cl-text-muted); margin-top: .45rem; }
.cl-zeittabelle { width: 100%; font-size: .8rem; margin-top: .5rem; border-collapse: collapse; }
.cl-zeittabelle th { text-align: left; font-weight: 600; color: var(--cl-text-muted); padding: .25rem .5rem .25rem 0; }
.cl-zeittabelle td { padding: .22rem .5rem .22rem 0; border-top: 1px solid rgba(255,255,255,.06); }

/* --- Abschnitt 1b: die aufklappbare Zeile (Webinarverwaltung) --------------
   EINE neue Klasse in diesem Lauf, und sie ist noetig: der Umschalter muss ein
   <button> sein, damit er mit der Tastatur erreichbar ist und einen Fokusring
   bekommt — und beides laesst sich nicht als style-Attribut schreiben
   (:focus-visible gibt es dort nicht). Ein <div> mit @onclick waere fuer die
   Maus gleich und fuer die Tastatur tot.

   Sie erfindet keine Formensprache: Farben, Abstaende und der Fokusring
   stammen aus den vorhandenen Token, der Ring ist derselbe wie bei .cl-btn
   (Zeile 551). Sie setzt nur den Browser-Knopf zurueck und macht aus ihm eine
   volle Zeile. */
.cl-webinar-zeile {
    display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap;
    width: 100%; text-align: left;
    background: none; border: none; padding: .15rem 0; margin: 0;
    color: inherit; font: inherit; cursor: pointer;
    border-radius: 8px;
    transition: background var(--cl-duration) var(--cl-ease);
}
.cl-webinar-zeile:hover { background: rgba(255, 255, 255, 0.04); }
.cl-webinar-zeile:focus-visible { outline: 2px solid var(--cl-gold); outline-offset: 2px; }

/* ===========================================================================
   SATTLER-MODUS (17.08.2026) — BEDIENUNG IST TEIL DES AUFTRAGS, NICHT KOSMETIK

   Bernhard Kargl ist Mitte fuenfzig, hat am Telefon die grosse Schrift
   eingestellt und arbeitet im Stall: kalte Finger, Handschuhe, Gegenlicht.
   Was hier steht, ist deshalb keine Verzierung, sondern die Bedingung dafuer,
   dass er das Werkzeug ueberhaupt benutzen kann.

   DIE VIER REGELN, UND WARUM SIE MESSBAR SIND:
     1. NICHTS IST KLEINER ALS DER FLIESSTEXT. Keine Hilfszeile in 11px, keine
        graue Zusatzzeile. Wer eine Schriftgroesse unter --cl-sattler-text
        setzt, hebt die Einstellung seines Telefons auf — und genau dafuer hat
        er sie gemacht.
     2. JEDER KNOPF IST MINDESTENS 56 PIXEL HOCH. Das ist keine gewaehlte
        Zahl: es ist die Groesse, die eine Fingerkuppe mit Handschuh trifft.
     3. AM TELEFON GEHT JEDER KNOPF UEBER DIE VOLLE BREITE. Zwei Knoepfe
        nebeneinander sind zwei halbe Ziele.
     4. EINE AUFGABE JE BILDSCHIRM. Das steht nicht im CSS, aber die Klassen
        hier sind dafuer gebaut: ein Schritt, eine Karte, ein Hauptknopf.

   Die Werte stehen als Token, damit ein Test sie lesen kann und damit eine
   spaetere Anpassung an EINER Stelle passiert. */

:root {
    --cl-sattler-text:   1.125rem;   /* 18px — der Fliesstext, die Untergrenze */
    --cl-sattler-gross:  1.375rem;   /* 22px — Werte, auf die er zeigt */
    --cl-sattler-titel:  1.625rem;   /* 26px */
    --cl-sattler-knopf:  56px;       /* Mindesthoehe JEDES Knopfes */
}

.cl-sattler { font-size: var(--cl-sattler-text); line-height: 1.5; }

/* Kein Kind ist kleiner als der Fliesstext — auch nicht das, was anderswo
   als "gedaempft" oder "klein" gilt. Die Klassen bleiben erlaubt (sie faerben
   und daempfen), sie duerfen nur nicht mehr verkleinern. */
.cl-sattler .cl-text-muted,
.cl-sattler small,
.cl-sattler label,
.cl-sattler .form-text { font-size: var(--cl-sattler-text); }

.cl-sattler h1 { font-size: var(--cl-sattler-titel); font-weight: 700; margin: 0 0 .5rem; }
.cl-sattler h2 { font-size: var(--cl-sattler-gross); font-weight: 700; margin: 0 0 .4rem; }

/* JEDER Knopf und jedes Eingabefeld in diesem Bereich. Absichtlich ueber den
   Elementtyp und nicht ueber eine eigene Klasse: eine Klasse vergisst man an
   dem einen Knopf, den man spaeter dazusetzt. */
.cl-sattler .btn,
.cl-sattler button:not(.cl-sattler-still),
.cl-sattler .form-control,
.cl-sattler select {
    min-height: var(--cl-sattler-knopf);
    font-size: var(--cl-sattler-text);
    padding: .75rem 1rem;
    border-radius: 12px;
}

/* Der Hauptknopf eines Schritts steht weiter unten, im Abschnitt HIERARCHIE
   (17.08.2026) — dort ist er eine gefuellte Flaeche. Hier stand bis dahin eine
   zweite, schwaechere Fassung; zwei Definitionen derselben Klasse sind zwei
   Wahrheiten, und die Datei las sich falsch. */

/* Auf dem Telefon geht ALLES ueber die volle Breite — auch die Nebenknoepfe.
   Zwei nebeneinander waeren zwei halbe Ziele. */
@media (max-width: 700px) {
    .cl-sattler .btn,
    .cl-sattler button:not(.cl-sattler-still) { display: block; width: 100%; }
    .cl-sattler .cl-sattler-reihe { display: block; }
    .cl-sattler .cl-sattler-reihe > * + * { margin-top: .6rem; }
}

.cl-sattler-reihe { display: flex; gap: .6rem; flex-wrap: wrap; }

/* Der Schrittzaehler. Er beantwortet die Frage "wie lange noch", ohne dass
   jemand sie stellt — und er ist gross genug, um im Vorbeigehen lesbar zu
   sein. */
.cl-sattler-schritt {
    display: flex; align-items: center; gap: .5rem;
    font-size: var(--cl-sattler-text); color: var(--cl-text-muted);
    margin-bottom: .75rem;
}
.cl-sattler-schritt .cl-punkt {
    width: 12px; height: 12px; border-radius: 50%;
    background: rgba(255,255,255,.18);
}
.cl-sattler-schritt .cl-punkt.aktiv { background: var(--cl-gold); }
.cl-sattler-schritt .cl-punkt.erledigt { background: var(--cl-gold-dark); }

/* Der Aufnahmeknopf steht weiter unten, im Abschnitt HIERARCHIE (17.08.2026):
   groesser, gefuellt, mit Pegel. Die erste Fassung ist entfallen — sie stand
   VOR der neuen in derselben Datei und war damit das, was ein Leser zuerst
   fand. */

/* Das Transkript steht NEBEN dem Formular und bleibt stehen. Wer nicht
   erkennt, woher ein Feld kommt, korrigiert es nicht. */
.cl-sattler-transkript {
    background: rgba(255,255,255,.04);
    border-left: 3px solid var(--cl-gold);
    padding: .75rem 1rem;
    border-radius: 8px;
    font-size: var(--cl-sattler-text);
    line-height: 1.55;
}

/* Ein Feld, das aus dem Diktat kommt, ist erkennbar — bis er es bestaetigt. */
.cl-sattler-vorschlag { border-color: var(--cl-gold) !important; }
.cl-sattler-marke {
    display: inline-block; font-size: var(--cl-sattler-text);
    color: var(--cl-gold); margin-left: .4rem;
}

/* --- Sattler-Modus, Umbau 17.08.2026: Zeile und Zustandsmarken -------------

   DIE ZEILE ist ein <button>, kein <div> mit @onclick: nur so ist sie mit der
   Tastatur erreichbar und bekommt einen Fokusring. Dieselbe Begruendung wie
   bei .cl-webinar-zeile weiter oben; die Werte stammen aus denselben Token.

   DIE MARKEN sind der Kern des Terminbildschirms: Video ja/nein, Notiz
   ja/nein, je Sattel. Gefuellt heisst da, leer heisst fehlt — er soll den
   Zustand im Vorbeigehen SEHEN und nicht lesen muessen. Deshalb feste Breite:
   die Symbole stehen untereinander in einer Spalte, auch wenn die
   Bezeichnungen verschieden lang sind. */
.cl-sattler-zeile {
    display: flex; align-items: center; gap: .6rem;
    width: 100%; min-height: var(--cl-sattler-knopf);
    background: none; border: none; padding: .6rem 0; margin: 0;
    color: inherit; font: inherit; font-size: var(--cl-sattler-text);
    text-align: left; cursor: pointer;
    border-radius: 10px;
    transition: background var(--cl-duration) var(--cl-ease);
}
.cl-sattler-zeile:hover { background: rgba(255, 255, 255, 0.04); }
.cl-sattler-zeile:focus-visible { outline: 2px solid var(--cl-gold); outline-offset: 2px; }

.cl-sattler-marken {
    display: inline-flex; gap: .6rem; align-items: center;
    min-width: 3.5rem; justify-content: flex-end;
    font-size: var(--cl-sattler-gross);
}

/* ===========================================================================
   SATTLER-MODUS — HIERARCHIE (17.08.2026)

   DER ANLASS, UND ER IST EIN BEFUND: die Klasse `btn-gold` wird in diesem
   Client an vielen Stellen benutzt und ist NIRGENDS definiert — weder hier
   noch in app.css noch in Bootstrap. Ein Knopf mit dieser Klasse bekommt
   deshalb nur die Bootstrap-Grundform: keine Fuellung, keine Farbe. Genau so
   sah „Neuer Termin" aus wie ein Textlink mit Symbol. Das ist nicht auf den
   Sattler-Bereich beschraenkt (Admin-Seiten benutzen sie auch) und deshalb
   GEMELDET; hier bekommt der Bereich eigene, benannte Klassen, statt eine
   fremde stillschweigend umzudeuten.

   DIE GEWICHTUNG ist aus dem Entwurf fuer den Sattler-Modus uebernommen —
   NICHT die Farben (die App bleibt im dunklen Cavallearn-Thema), sondern das
   Verhaeltnis: was eine HANDLUNG ist, sieht aus wie eine Flaeche; was eine
   LISTE ist, hat Symbol, fette Zeile und Beizeile.

   EINE HAUPTAKTION JE SEITE. Zwei gleich starke Knoepfe auf einem Bildschirm
   sind zwei halbe Entscheidungen — und im Stall, mit einer freien Hand, ist
   das eine zu viel. */

/* --- Hauptaktion: gefuellte Flaeche, volle Breite -------------------------- */
.cl-sattler .cl-sattler-haupt,
.cl-sattler-haupt {
    display: flex; align-items: center; justify-content: center; gap: .5rem;
    width: 100%;
    min-height: 64px;
    padding: 1rem 1.25rem;
    border: none;
    border-radius: 14px;
    background: linear-gradient(135deg, var(--cl-gold) 0%, var(--cl-gold-dark) 100%);
    color: #1a1408;
    font-size: var(--cl-sattler-gross);
    font-weight: 700;
    letter-spacing: -.01em;
    box-shadow: 0 6px 18px rgba(200, 149, 42, .28);
    cursor: pointer;
    transition: transform var(--cl-duration) var(--cl-ease),
                box-shadow var(--cl-duration) var(--cl-ease);
}
.cl-sattler-haupt:hover:not(:disabled) { transform: translateY(-1px); }
.cl-sattler-haupt:active:not(:disabled) { transform: translateY(1px); }
.cl-sattler-haupt:disabled { opacity: .45; box-shadow: none; cursor: default; }
.cl-sattler-haupt:focus-visible { outline: 2px solid var(--cl-gold-light); outline-offset: 3px; }

/* --- Nebenaktion: dieselbe Form, nur umrandet ------------------------------
   Sie bleibt ein KNOPF. „Lieber tippen" als Textlink waere im Handschuh kein
   Ziel, sondern eine Zeile. */
.cl-sattler .cl-sattler-neben,
.cl-sattler-neben {
    display: flex; align-items: center; justify-content: center; gap: .5rem;
    width: 100%;
    min-height: var(--cl-sattler-knopf);
    padding: .85rem 1.25rem;
    border: 1.5px solid var(--cl-gold-border);
    border-radius: 14px;
    background: transparent;
    color: var(--cl-text);
    font-size: var(--cl-sattler-text);
    font-weight: 600;
    cursor: pointer;
}
.cl-sattler-neben:hover:not(:disabled) { border-color: var(--cl-gold); }
.cl-sattler-neben:disabled { opacity: .45; cursor: default; }
.cl-sattler-neben:focus-visible { outline: 2px solid var(--cl-gold); outline-offset: 3px; }

/* --- Listenkachel: Symbolquadrat, fette Zeile, Beizeile, Pfeil -------------
   Vorbild ist die Kachel aus dem Entwurf (Schritt 01). Das Symbolquadrat ist
   der Grund, warum eine Liste als Liste lesbar ist: es gibt der Zeile links
   einen Anker, an dem das Auge entlanglaeuft. */
.cl-sattler-kachel {
    display: flex; align-items: center; gap: .9rem;
    width: 100%;
    min-height: 76px;
    padding: .85rem 1rem;
    margin-bottom: .6rem;
    background: var(--cl-glass);
    border: 1px solid var(--cl-glass-border);
    border-radius: 14px;
    text-decoration: none; color: inherit;
    text-align: left;
    font: inherit; font-size: var(--cl-sattler-text);
    cursor: pointer;
    transition: border-color var(--cl-duration) var(--cl-ease),
                background var(--cl-duration) var(--cl-ease);
}
.cl-sattler-kachel:hover { border-color: var(--cl-gold-border); background: rgba(255,255,255,.05); }
.cl-sattler-kachel:focus-visible { outline: 2px solid var(--cl-gold); outline-offset: 2px; }

.cl-sattler-ico {
    width: 44px; height: 44px; flex: 0 0 auto;
    border-radius: 12px;
    background: var(--cl-gold-glow);
    color: var(--cl-gold);
    display: grid; place-items: center;
    font-size: 1.35rem;
}

.cl-sattler-kachel-text { flex: 1 1 auto; min-width: 0; }
.cl-sattler-titel {
    display: block;
    font-size: var(--cl-sattler-text);
    font-weight: 700; letter-spacing: -.01em;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cl-sattler-bei {
    display: block;
    font-size: var(--cl-sattler-text);
    color: var(--cl-text-muted);
    margin-top: .1rem;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cl-sattler-pfeil { margin-left: auto; color: var(--cl-text-muted); font-size: 1.2rem; }

/* --- Der Diktierknopf ist die Hauptflaeche ---------------------------------
   Er ist der Anfang des ganzen Ablaufs; ein grauer Kasten mit Beschriftung
   war das Gegenteil davon. 112px, gefuellt, mit Puls waehrend der Aufnahme
   und Pegelbalken darunter. */
.cl-sattler-mikro {
    width: 112px; height: 112px; border-radius: 50%;
    border: none;
    background: linear-gradient(135deg, var(--cl-gold) 0%, var(--cl-gold-dark) 100%);
    color: #1a1408;
    font-size: 2.75rem; line-height: 1;
    display: grid; place-items: center;
    margin: 0 auto;
    box-shadow: 0 8px 24px rgba(200, 149, 42, .3);
    cursor: pointer;
}
.cl-sattler-mikro.laeuft {
    background: linear-gradient(135deg, #d9534f 0%, #a33 100%);
    color: #fff;
    animation: cl-sattler-puls 1.6s ease-out infinite;
}
@keyframes cl-sattler-puls {
    0%   { box-shadow: 0 0 0 0 rgba(217, 83, 79, .55); }
    70%  { box-shadow: 0 0 0 26px rgba(217, 83, 79, 0); }
    100% { box-shadow: 0 0 0 0 rgba(217, 83, 79, 0); }
}

.cl-sattler-pegel {
    display: flex; gap: 4px; justify-content: center; align-items: flex-end;
    height: 26px; margin-top: 1rem;
}
.cl-sattler-pegel i {
    width: 4px; height: 5px; display: block;
    background: var(--cl-gold); border-radius: 2px;
}
.cl-sattler-pegel.an i { animation: cl-sattler-pegelschlag .85s ease-in-out infinite; }
@keyframes cl-sattler-pegelschlag { 0%, 100% { height: 5px; } 50% { height: 24px; } }
.cl-sattler-pegel i:nth-child(2n) { animation-delay: .10s; }
.cl-sattler-pegel i:nth-child(3n) { animation-delay: .24s; }
.cl-sattler-pegel i:nth-child(5n) { animation-delay: .38s; }

/* WER WENIGER BEWEGUNG EINGESTELLT HAT, BEKOMMT WENIGER BEWEGUNG — aber nicht
   weniger Information: der Pegel bleibt sichtbar und zeigt die Aufnahme als
   ruhenden Balken, der Puls entfaellt. */
@media (prefers-reduced-motion: reduce) {
    .cl-sattler-mikro.laeuft { animation: none; box-shadow: 0 0 0 6px rgba(217, 83, 79, .35); }
    .cl-sattler-pegel.an i { animation: none; height: 16px; }
    .cl-sattler-haupt { transition: none; }
}

/* --- Die Daumenzone: Hauptaktion ueber der Leiste --------------------------
   NUR AM TELEFON und nur dort, wo die Seite es anfordert. Sie sitzt ueber der
   Bottom-Nav (deren Hoehe steht als Token bereit) und bleibt beim Scrollen
   stehen — die wichtigste Handlung soll nicht weggescrollt werden koennen.
   Der Platzhalter darunter verhindert, dass der fixierte Knopf den letzten
   Listeneintrag verdeckt. */
.cl-sattler-fix { /* am Rechner: normaler Fluss */ }
.cl-sattler-fix-platz { display: none; }

@media (max-width: 991.98px) {
    .cl-sattler-fix {
        position: fixed;
        left: 1rem; right: 1rem;
        bottom: calc(var(--cl-bottombar-h) + env(safe-area-inset-bottom, 0px) + .75rem);
        z-index: 90;
        width: auto;
    }
    .cl-sattler-fix-platz { display: block; height: 88px; }
}

/* Die auf .cl-sattler beschraenkte Nachreichung von btn-gold ist ENTFALLEN
   (17.08.2026): die Klassen sind jetzt global definiert, weiter unten in
   dieser Datei, und leisten dort dasselbe. Zwei Regeln fuer denselben Knopf
   waeren zwei Wahrheiten — die spaetere gewinnt zwar, aber wer die Datei
   liest, findet die erste. */

/* ===========================================================================
   BRANDED BUTTONS: .btn-gold / .btn-outline-gold  (17.08.2026)

   SIE WAREN NIE DEFINIERT. Beide Klassen werden in diesem Client seit
   Längerem benutzt — Admin/Produkte, Admin/ProduktBearbeiten,
   Admin/SprachnotizProbe, Sattler/SattelKatalog —, und keine Datei hat je
   gesagt, wie sie aussehen: nicht cavallearn.css, nicht app.css, und
   Bootstrap kennt sie nicht. Ein Knopf damit bekam ausschliesslich die
   Bootstrap-Grundform: keine Fuellung, keine Farbe. Deshalb sah die
   wichtigste Handlung einer Seite aus wie ein Textlink.

   In CDL.Web gibt es die beiden Klassen (CLAUDE.md § 7) — dort in einer
   eigenen Formatvorlage, die dieser Client nicht laedt. Der Name war also
   uebernommen, die Regel nicht.

   UEBER DIE BOOTSTRAP-VARIABLEN, NICHT DARUEBER HINWEG. Bootstrap 5.3 baut
   jeden Knopf aus --bs-btn-*; wer stattdessen background/color direkt setzt,
   muss Schwebe-, Druck-, Fokus- und Sperrzustand von Hand nachbauen und
   kaempft dabei gegen die Spezifitaet der Bootstrap-Regeln. So bekommt der
   Knopf alle fuenf Zustaende geschenkt und bleibt ein normaler .btn.

   DIE FARBEN KOMMEN AUS DEN VORHANDENEN TOKEN (--cl-gold*). Damit folgt der
   Knopf dem Thema: der Hell-Block weiter oben biegt dieselben Token um, und
   der Knopf geht ohne eine zweite Regel mit.

   DUNKLE SCHRIFT AUF GOLD, nicht weisse: Gold ist hell genug, dass Weiss
   darauf schlecht lesbar waere — dieselbe Wahl wie bei der Hauptaktion des
   Sattler-Bereichs. */

.btn-gold {
    --bs-btn-color:              #1a1408;
    --bs-btn-bg:                 var(--cl-gold);
    --bs-btn-border-color:       var(--cl-gold);
    --bs-btn-hover-color:        #1a1408;
    --bs-btn-hover-bg:           var(--cl-gold-light);
    --bs-btn-hover-border-color: var(--cl-gold-light);
    --bs-btn-active-color:       #1a1408;
    --bs-btn-active-bg:          var(--cl-gold-dark);
    --bs-btn-active-border-color: var(--cl-gold-dark);
    --bs-btn-disabled-color:     rgba(26, 20, 8, .55);
    --bs-btn-disabled-bg:        var(--cl-gold-dark);
    --bs-btn-disabled-border-color: var(--cl-gold-dark);
    --bs-btn-focus-shadow-rgb:   200, 149, 42;
    font-weight: 600;
}

.btn-outline-gold {
    --bs-btn-color:              var(--cl-gold);
    --bs-btn-bg:                 transparent;
    --bs-btn-border-color:       var(--cl-gold-border);
    --bs-btn-hover-color:        #1a1408;
    --bs-btn-hover-bg:           var(--cl-gold);
    --bs-btn-hover-border-color: var(--cl-gold);
    --bs-btn-active-color:       #1a1408;
    --bs-btn-active-bg:          var(--cl-gold-dark);
    --bs-btn-active-border-color: var(--cl-gold-dark);
    --bs-btn-disabled-color:     var(--cl-text-muted);
    --bs-btn-disabled-bg:        transparent;
    --bs-btn-disabled-border-color: var(--cl-gold-border-dim);
    --bs-btn-focus-shadow-rgb:   200, 149, 42;
    font-weight: 600;
}

/* ── E2b: Kapitel-Editor ───────────────────────────────────────────────────
   Nur die Einfuegezone und die Typwahl. Die Werkzeugleiste bringt ihr eigenes
   CSS aus dem Modul mit (_content/MaderInnovations.Modules.Content/css/…) —
   sie laeuft auch in MaderStudio und darf die Farbwelt eines Hosts nicht
   vorgeben. */

.cl-einfuegezone { position: relative; }

.cl-einfuegelinie {
    display: block;
    width: 100%;
    height: 1.4rem;
    padding: 0;
    background: transparent;
    border: 0;
    border-top: 1px dashed rgba(255, 255, 255, .14);
    cursor: pointer;
    position: relative;
    transition: border-color .12s ease;
}

.cl-einfuegelinie .cl-einfuegeplus {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 1.25rem;
    height: 1.25rem;
    line-height: 1.15rem;
    font-size: .95rem;
    border-radius: 50%;
    color: var(--cl-text-muted);
    background: var(--cl-bg, #0d1117);
    border: 1px solid rgba(255, 255, 255, .14);
    opacity: .45;
    transition: opacity .12s ease, color .12s ease, border-color .12s ease;
}

.cl-einfuegelinie.aktiv { border-top-color: var(--cl-gold); }

.cl-einfuegelinie.aktiv .cl-einfuegeplus {
    opacity: 1;
    color: var(--cl-gold);
    border-color: var(--cl-gold);
}

.cl-typwahl {
    display: block;
    width: 100%;
    text-align: left;
    padding: .35rem .5rem;
    background: transparent;
    border: 1px solid transparent;
    border-radius: .3rem;
    color: inherit;
    cursor: pointer;
}

.cl-typwahl:hover {
    border-color: var(--cl-gold);
    background: rgba(255, 255, 255, .04);
}

/* Die Blockvorschau darf den Rahmen nicht sprengen. */
.cl-vorschau img { max-width: 100%; height: auto; }
.cl-vorschau > :first-child { margin-top: 0; }
.cl-vorschau > :last-child { margin-bottom: 0; }

/* ── E2d 1: Medienfeld ──────────────────────────────────────────────────────
   Die Ablageflaeche fuer ein Bild. Das Eingabefeld liegt DURCHSICHTIG darueber
   und macht die ganze Flaeche zum Ablageziel und zum Knopf zugleich — ohne das
   braeuchte es einen eigenen Drop-Behandler mit denselben Fehlern. */

.cl-medienfeld__zone {
    position: relative;
    border: 2px dashed rgba(200, 160, 0, .45);
    border-radius: .6rem;
    padding: 1.1rem .8rem;
    text-align: center;
    transition: border-color .15s, background .15s;
}

.cl-medienfeld__zone:hover {
    border-color: var(--cl-gold);
    background: rgba(200, 160, 0, .06);
}

.cl-medienfeld__zone--arbeitet {
    border-style: solid;
    border-color: var(--cl-gold);
}

/* Deckt die Zone vollstaendig ab. opacity:0 statt display:none — ein
   ausgeblendetes Feld nimmt keinen Drop an. */
.cl-medienfeld__eingabe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
    cursor: pointer;
}

.cl-medienfeld__vorschau {
    position: relative;
    border-radius: .6rem;
    overflow: hidden;
    background: rgba(255, 255, 255, .04);
}

/* Brauchbare Groesse, keine Miniatur: man soll erkennen, ob es das richtige
   Bild ist, ohne es erst in der Blockvorschau zu suchen. */
.cl-medienfeld__vorschau img {
    display: block;
    width: 100%;
    max-height: 16rem;
    object-fit: contain;
}

.cl-medienfeld__weg {
    position: absolute;
    top: .4rem;
    right: .4rem;
}

.cl-medienfeld__fortschritt {
    min-height: 4.5rem;
}

/* ── E2d 2: Kachelband ──────────────────────────────────────────────────────
   Ersetzt die Liste in der Einfuegezone. Die Zone selbst bleibt im
   Ruhezustand eine duenne Linie — sie darf die Blockliste nicht zerreissen. */

.cl-kachelband {
    background: rgba(255, 255, 255, .03);
    border: 1px solid rgba(200, 160, 0, .3);
    border-radius: .6rem;
    padding: .6rem;
    margin: .3rem 0;
}

.cl-kachelband__suche { margin-bottom: .6rem; }

/* E2e 2d — mehr Luft zwischen den Gruppen, damit TEXT / MEDIEN / INTERAKTIV
   als Trennung wirkt und nicht als Zwischenzeile. Dazu eine feine Linie. */
.cl-kachelband__gruppe + .cl-kachelband__gruppe {
    margin-top: 1.1rem;
    padding-top: .9rem;
    border-top: 1px solid rgba(255, 255, 255, .08);
}

.cl-kachelband__gruppenname {
    font-size: .7rem;
    text-transform: uppercase;
    letter-spacing: .05em;
    opacity: .6;
    margin-bottom: .35rem;
}

.cl-kachelband__kacheln {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
}

/* E2e 2b — FESTE HOEHE. Lange Namen ("Zusammenfassung", "Selbstprüfung",
   "Handlungsaufruf") brachen um und schoben ihre Kachel nach unten; die Reihe
   stand danach auf drei verschiedenen Grundlinien. Jetzt hat jede Kachel
   dieselbe Hoehe, das Symbol sitzt oben, der Name fuellt den Rest. */
.cl-kachel {
    position: relative;
    width: 5.4rem;
    height: 6.1rem;
    background: none;
    border: 1px solid transparent;
    border-radius: .5rem;
    padding: .45rem .2rem .3rem;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .3rem;
    cursor: pointer;
    color: inherit;
    transition: background .12s, border-color .12s;
}

.cl-kachel:hover,
.cl-kachel:focus-visible {
    background: rgba(255, 255, 255, .07);
    border-color: rgba(200, 160, 0, .5);
}

/* Der erste Treffer beim Filtern — die Eingabetaste nimmt genau diesen.
   Ohne die Hervorhebung waere sie ein Glueckspiel. */
.cl-kachel--treffer {
    border-color: var(--cl-gold);
    background: rgba(200, 160, 0, .12);
}

.cl-kachel__symbol {
    width: 2.4rem;
    height: 2.4rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: 1.1rem;
    flex: 0 0 auto;
}

/* Die Dialog-Kachel: zwei Koepfe nebeneinander statt eines Symbols. Der
   farbige Kreis bleibt der Hintergrund, damit ein fehlendes Bild nicht als
   Loch erscheint. */
.cl-kachel__symbol--figuren {
    overflow: hidden;
    gap: 0;
}

.cl-kachel__symbol--figuren img {
    width: 1.2rem;
    height: 2.4rem;
    object-fit: cover;
    object-position: top center;
}

/* Zwei Zeilen sind erlaubt und aendern die Kachelhoehe nicht: der Name nimmt
   den Rest der Kachel ein und ist darin zentriert. Ein dritter Zeilenumbruch
   wird abgeschnitten — er kommt bei den vorhandenen Namen nicht vor, und eine
   Kachel, die aus der Reihe waechst, ist schlimmer als ein gekuerzter Name. */
.cl-kachel__name {
    font-size: .72rem;
    line-height: 1.15;
    text-align: center;
    word-break: break-word;
    flex: 1 1 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}

.cl-kachel__luecke {
    position: absolute;
    top: .15rem;
    right: .35rem;
    width: 1rem;
    height: 1rem;
    border-radius: 50%;
    background: #e0a800;
    color: #000;
    font-size: .7rem;
    font-weight: 700;
    line-height: 1rem;
}

/* ── E2d 3: Antwortkarten ───────────────────────────────────────────────────
   Vorher eine Zeile aus vier gleich grossen Bedienelementen. Jetzt eine Karte
   je Antwort: Zustand links, Text in der Mitte, Handlungen rechts. */

.cl-antwortliste {
    display: grid;
    gap: .35rem;
    margin: .35rem 0 .5rem;
}

.cl-antwortkarte {
    display: grid;
    grid-template-columns: auto 1fr auto auto;
    gap: .4rem;
    align-items: center;
    padding: .4rem .5rem;
    border: 1px solid rgba(255, 255, 255, .12);
    border-radius: .45rem;
    background: rgba(255, 255, 255, .02);
}

/* Die richtige Antwort ist auf einen Blick zu sehen — bei fuenf Antworten ist
   das die Frage, die man zuerst stellt. */
.cl-antwortkarte--richtig {
    border-color: rgba(25, 135, 84, .55);
    background: rgba(25, 135, 84, .08);
}

.cl-antwortkarte--neu {
    border-color: #e0a800;
}

.cl-antwortkarte__richtig {
    display: flex;
    align-items: center;
    margin: 0;
    padding: 0 .15rem;
    cursor: pointer;
}

.cl-antwortkarte__richtig input { width: 1.05rem; height: 1.05rem; }

.cl-antwortkarte__text { min-width: 0; }

/* Ueber die ganze Kartenbreite, unter den Bedienelementen. */
.cl-antwortkarte__warnung {
    grid-column: 1 / -1;
    display: flex;
    gap: .45rem;
    align-items: flex-start;
    margin-top: .35rem;
    padding: .4rem .5rem;
    border-radius: .35rem;
    background: rgba(224, 168, 0, .14);
    font-size: .78rem;
    line-height: 1.35;
}

.cl-antwort-anhaengen {
    display: block;
    width: 100%;
    padding: .45rem;
    border: 1px dashed rgba(255, 255, 255, .3);
    border-radius: .45rem;
    background: none;
    color: inherit;
    font-size: .82rem;
    cursor: pointer;
    transition: border-color .12s, background .12s;
}

.cl-antwort-anhaengen:hover {
    border-color: var(--cl-gold);
    background: rgba(200, 160, 0, .08);
}

/* ══════════════════════════════════════════════════════════════════════════
   SICHTBARE ORDNUNG — DREI FLAECHEN, EINE UEBERSCHRIFTSFORM, VIER TEXTGROESSEN
   24.08.2026, aus dem Test der Reiteransicht am Telefon.

   BEFUND: eine Liste ohne Gewicht. EIN Flaechenton, EINE Textfarbe,
   Ueberschriften, die wie Fliesstext aussahen - und die Kernaussage, das
   Ergebnis, fuer das jemand bezahlt hat, stand oben als graue Kiste ohne Titel.

   WARUM GLOBAL UND NICHT JE SEITE: die Reiteransicht und die Werkbank zeigen
   DIESELBEN Dinge (Stellen, Uebungen, Kernaussage). Zwei Fassungen derselben
   Abstufung laufen auseinander, und beim dritten Umbau sieht dieselbe Sache an
   zwei Orten verschieden aus. CSS-Isolation kann das nicht: sie bindet jede
   Regel an genau eine Komponente.
   ══════════════════════════════════════════════════════════════════════════ */

:root {
    /* DREI FLAECHEN. Sie trennen Abschnitte OHNE Linien - eine Linie sagt
       "hier ist ein Schnitt", eine Flaeche sagt "das gehoert zusammen". */
    --cl-flaeche-seite:  transparent;                  /* der Hintergrund */
    --cl-flaeche-karte:  rgba(255, 255, 255, .045);    /* was zusammengehoert */
    --cl-flaeche-tief:   rgba(0, 0, 0, .22);           /* eingelassen: Zitat,
                                                          Eingabe, Ergebnis */
}

/* ── DIE KARTE ──────────────────────────────────────────────────────────── */
.cl-flaeche {
    background: var(--cl-flaeche-karte);
    border: 1px solid rgba(255, 255, 255, .07);
    border-radius: .7rem;
    padding: 1rem;
}

/* EINGELASSEN: dunkler als die Karte, ohne Rand. Fuer das, was IN der Karte
   noch einmal fuer sich steht. */
.cl-flaeche--tief {
    background: var(--cl-flaeche-tief);
    border: 0;
}

/* ── DIE UEBERSCHRIFT ───────────────────────────────────────────────────────
   Eine kleine gesperrte Vorzeile in Gold, darunter die Zeile in Weiss.
   EINHEITLICH an jedem Abschnitt: wer die Form einmal gelernt hat, findet sich
   auf jeder Seite zurecht. */
.cl-vorzeile {
    font-size: .68rem;
    font-weight: 700;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--cl-gold);
    margin-bottom: .15rem;
}

.cl-abschnittstitel {
    font-size: 1.02rem;
    font-weight: 600;
    color: var(--cl-white);
    line-height: 1.3;
    margin: 0 0 .5rem;
}

/* ── DIE TEXTABSTUFUNG ──────────────────────────────────────────────────────
   Vier Groessen, und jede sagt etwas: das Ergebnis, der Inhalt, die Nebensache,
   die Herkunft. */
.cl-text-ergebnis {
    font-size: 1.22rem;
    line-height: 1.62;
    color: var(--cl-white);
    white-space: pre-wrap;
}

.cl-text-inhalt {
    font-size: .98rem;
    line-height: 1.55;
    color: var(--cl-text);
    white-space: pre-wrap;
}

.cl-text-meta {
    font-size: .76rem;
    line-height: 1.4;
    color: var(--cl-text-muted);
}

/* ── LEISE WERKZEUGE ────────────────────────────────────────────────────────
   Sie standen doppelt: einmal in RittfeedbackWerkbank.razor.css, einmal in
   Feldkarte.razor.css - CSS-Isolation laesst nichts anderes zu, wenn zwei
   Komponenten dieselbe Klasse brauchen. Global steht sie EINMAL. */
.cl-werkzeug {
    background: transparent;
    border: 0;
    color: var(--cl-text-muted);
    border-radius: .4rem;
    width: 1.9rem;
    height: 1.9rem;
    line-height: 1;
    cursor: pointer;
    opacity: .55;
}

.cl-werkzeug:hover:not(:disabled) {
    opacity: 1;
    background: rgba(255, 255, 255, .08);
}

.cl-werkzeug:disabled {
    opacity: .3;
    cursor: default;
}

/* Mit Beschriftung, goldener Umriss: eine Handlung, aber nicht DIE Handlung. */
.cl-werkzeug--gold {
    width: auto;
    padding: 0 .7rem;
    color: var(--cl-gold);
    border: 1px solid rgba(200, 149, 42, .5);
    opacity: .85;
}

.cl-werkzeug--laeuft {
    width: auto;
    padding: 0 .7rem;
    background: var(--cl-gold);
    color: #201a02;
    border: 1px solid var(--cl-gold);
    opacity: 1;
    animation: cl-werkzeug-puls 1.4s ease-in-out infinite;
}

@keyframes cl-werkzeug-puls {
    0%, 100% { opacity: 1; }
    50%      { opacity: .72; }
}

/* ══════════════════════════════════════════════════════════════════════════
   DER ZUSTAND ALS ABZEICHEN — nicht als Fusszeile.
   25.08.2026, aus dem Test der beiden Listen.

   BEFUND: der Zustand stand klein und grau unter der Zeile, in derselben
   Schrift wie das Datum daneben. Wer eine Liste ueberfliegt, sieht ihn nicht -
   und "ueberfaellig" gab es ueberhaupt nirgends, obwohl die Regel dafuer seit
   dem ersten Bau steht (AuftragsRegel.Ueberfaellig).

   VIER ANMUTUNGEN, UND DIE LAUTSTAERKE FOLGT DER HANDLUNG:
     Wartet       gold      - hier ist etwas zu tun, das lauteste
     In Arbeit    neutral   - jemand sitzt daran
     Geliefert    gedaempft - fertig, nichts mehr zu tun
     Ueberfaellig rot       - die Zusage ist vorbei

   JEDES TRAEGT EIN SYMBOL. Farbe allein ist keine Auskunft: Rot und Grau sind
   fuer einen Teil der Menschen dasselbe, und eine Liste, die nur ueber Farbe
   spricht, spricht mit ihnen nicht.

   DIE ZUORDNUNG (welcher Zustand welche Klasse) steht in Zustandsanmutung -
   beide Listen lesen dieselbe Regel.
   ══════════════════════════════════════════════════════════════════════════ */

.cl-stand {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    padding: .2rem .55rem;
    border-radius: 999px;
    font-size: .74rem;
    font-weight: 600;
    letter-spacing: .02em;
    white-space: nowrap;
    border: 1px solid transparent;
}

.cl-stand--wartet {
    background: rgba(200, 149, 42, .18);
    border-color: rgba(200, 149, 42, .5);
    color: var(--cl-gold-light);
}

.cl-stand--arbeit {
    background: rgba(255, 255, 255, .08);
    border-color: rgba(255, 255, 255, .18);
    color: var(--cl-text);
}

.cl-stand--fertig {
    background: transparent;
    border-color: rgba(255, 255, 255, .12);
    color: var(--cl-text-muted);
}

.cl-stand--faellig {
    background: rgba(248, 113, 113, .16);
    border-color: rgba(248, 113, 113, .55);
    color: #ffb4b4;
}

/* DIE FRIST STEHT NEBEN DEM ABZEICHEN, in Worten. Das genaue Datum tritt
   dahinter zurueck - wer es braucht, findet es; niemand muss es lesen, um zu
   wissen, ob es eilt. */
.cl-frist {
    font-size: .82rem;
    color: var(--cl-text);
}

.cl-frist--faellig {
    color: #ffb4b4;
    font-weight: 600;
}

.cl-frist__genau {
    font-size: .72rem;
    color: var(--cl-text-subtle);
    margin-left: .35rem;
}

/* ══════════════════════════════════════════════════════════════════════════
   EINE LISTE, DIE EINE FRAGE BEANTWORTET.

   Die Auftragsliste des Ausbilders beantwortet genau eine: was muss ich jetzt
   tun? Also stehen offene Auftraege oben, nach Frist, und die erledigten
   darunter - gedaempft, hinter einer Trennung, die sie benennt.
   ══════════════════════════════════════════════════════════════════════════ */

/* EINE BAHN FUER LESBARE BREITE.
   Am Rechner (1440 gemessen) lief eine Karte ueber 1146 px; der Blick muss
   dann von links nach rechts wandern, und das Auge verliert die Zeile. Die
   Bahn steht hier EINMAL und wird von den Seiten benutzt - keine Sonderregel
   je Seite. */
.cl-bahn {
    max-width: 54rem;
}

.cl-liste {
    display: flex;
    flex-direction: column;
    gap: .6rem;
    /* EINE BAHN, KEINE WAND: am Rechner lief eine Zeile ueber 1194 px, und der
       Blick musste vom Namen links bis zur Frist rechts wandern. Gemessen am
       Browser bei 1440. Global, damit beide Listen dieselbe Bahn haben. */
    max-width: 54rem;
}

/* Die Zahl gehoert zur GRUPPE, nicht ueber die ganze Liste: "1 offener
   Auftrag" ueber drei Zeilen stimmt und sieht trotzdem aus wie ein Fehler. */
.cl-listengruppe {
    display: flex;
    align-items: baseline;
    gap: .5rem;
    margin: .35rem 0 .1rem;
}

.cl-listengruppe--spaeter {
    margin-top: 1.6rem;
    padding-top: .9rem;
    border-top: 1px solid rgba(255, 255, 255, .08);
}

.cl-listengruppe__zahl {
    font-size: .76rem;
    color: var(--cl-text-muted);
}

/* Eine erledigte Zeile ist noch da, aber nicht mehr laut. */
.cl-zeile--erledigt {
    opacity: .62;
}

.cl-zeile--erledigt:hover {
    opacity: 1;
}

/* Ein ruhiger Satz statt einer leeren Flaeche. */
.cl-leerlauf {
    padding: 1.5rem 1rem;
    text-align: center;
    color: var(--cl-text-muted);
    border: 1px dashed rgba(255, 255, 255, .1);
    border-radius: .7rem;
}

/* ===========================================================================
   F6 (26.08.2026) — DIE KLEBENDE LEISTE UND DER PLATZ DARUNTER

   ZWEI FEHLER AN DERSELBEN STELLE, gemessen am Telefon auf DEV:

   1. Eine Leiste mit `position: sticky; bottom: 0` klebt an der UNTERKANTE DES
      FENSTERS — und genau dort steht die Bottom-Nav (.cl-bottom-nav, fix,
      64px, z-index 100). Die Leiste (z-index 5) liegt also DAHINTER. Auf
      /trainer/sessions/{id}/annotate hat „Speichern und zur Mappe" deshalb die
      Erklaerung zu „Punkte setzen" und den Eintrag „VA1 Beckenkreisen gross"
      verdeckt.

   2. `.cl-main` reserviert `--cl-bottombar-h + 1rem` und KEIN
      env(safe-area-inset-bottom). Auf einem iPhone mit Home-Indikator liegt
      der letzte Inhalt darunter — unabhaengig von jeder klebenden Leiste.

   DIE ZWEI KLASSEN GEHOEREN ZUSAMMEN und heissen deshalb fast gleich:
   .cl-klebeleiste hebt die Leiste UEBER die Nav, .cl-klebeleiste-platz haelt
   den Inhalt darueber frei. Wer nur die erste nimmt, verdeckt weiter — nur
   eine Zeile hoeher. Vorbild: .cl-sattler-fix / .cl-sattler-fix-platz, weiter
   oben in dieser Datei.
   =========================================================================== */

/* Am Rechner bleibt es beim klebenden Verhalten: dort scrollt .cl-main
   wirklich, die Leiste klebt also, und es gibt keine Bottom-Nav, die sie
   verdecken koennte. position, bottom und z-index stehen HIER und nicht im
   style-Attribut der Seite: ein Inline-Wert schlaegt jede Klasse, und die
   Regel weiter unten kaeme nie zum Zug. */
.cl-klebeleiste {
    position: sticky;
    bottom: 0;
    z-index: 5;
    background: linear-gradient(to top, var(--cl-navy-dark) 65%, transparent);
}

.cl-klebeleiste-platz { display: none; }

@media (max-width: 991.98px) {
    /* POSTEN 91 (26.08.2026) — AM TELEFON FEST, NICHT KLEBEND.
       ------------------------------------------------------------------
       `position: sticky` hat hier NIE gewirkt, und das war zwei Bauläufe lang
       unbemerkt: eine klebende Leiste richtet sich nach ihrem naechsten
       SCROLL-Vorfahren, und das ist .cl-main (overflow: auto). Das scrollt
       aber selbst nie — gemessen am 26.08.2026: scrollHeight 2330 =
       clientHeight 2330, waehrend das DOKUMENT 2412px hoch ist und scrollt.
       Also blieb die Leiste einfach am Ende einer 2400px langen Seite liegen,
       und "Speichern und zur Mappe" war nur ganz unten erreichbar.

       .cl-main das overflow zu nehmen waere die andere Loesung — und eine
       Aenderung mit unbekanntem Radius: die Klasse haengt an JEDER Seite
       dieser Anwendung. `fixed` ist oertlich und genau das, was gemeint war.

       left/right auf 0 mit eigenem Innenabstand: fest positioniert verlaesst
       die Leiste den Fluss und erbt die Raender ihres Elternteils nicht mehr.
       Der Platzhalter darueber haelt den Inhalt frei — ohne ihn verdeckte die
       Leiste jetzt erst recht. */
    .cl-klebeleiste {
        position: fixed;
        left: 0;
        right: 0;
        bottom: calc(var(--cl-bottombar-h) + env(safe-area-inset-bottom, 0px));
        /* Knapp unter der Nav (100): sichtbar, aber der Bereichswechsel bleibt
           obenauf. */
        z-index: 95;
        padding: .75rem 1rem;
        margin-top: 0;
        background: var(--cl-navy-dark);
        border-top: 1px solid var(--cl-glass-border);
    }

    /* Hoehe der Leiste plus der iOS-Rand. Gemessen am 26.08.2026: die Leiste
       ist 148px hoch (ein Knopf, eine Zeile Nebenaktionen), 10rem sind 160px.
       Grosszuegig mit Absicht — zu viel Luft unten kostet nichts, zu wenig
       laesst den letzten Eintrag unerreichbar. Traegt die Leiste zusaetzlich
       eine Fehlermeldung, waechst sie darueber hinaus; das ist ein Zustand,
       in dem man ohnehin auf die Meldung sieht (offene Frage 95). */
    .cl-klebeleiste-platz {
        display: block;
        /* Leistenhoehe PLUS die Nav darunter: freizuraeumen ist der ganze
           Streifen zwischen dem Fensterboden und der Oberkante der Leiste,
           nicht nur die Leiste. Gemessen: Leiste 600..748, Nav ab 748,
           Fenster 812 — also 212px. 10rem + 64px = 224px.
           NACHGEMESSEN, nicht gerechnet: mit 10rem allein blieb die letzte
           Zeile der Empfehlungen auch ganz unten verdeckt. */
        height: calc(10rem + var(--cl-bottombar-h) + env(safe-area-inset-bottom, 0px));
    }

    /* Der Rand, den .cl-main schuldig blieb. Er steht HIER und nicht in der
       Regel oben, damit die bestehende Zeile unveraendert lesbar bleibt. */
    .cl-main { padding-bottom: calc(var(--cl-bottombar-h) + 1rem + env(safe-area-inset-bottom, 0px)); }
}

/* ===========================================================================
   07.09.2026 (Paket 1b) — DER RAND OBEN UND AN DEN SEITEN

   NACHZUG ZU PAKET 1. Dort ist viewport-fit=cover dazugekommen (index.html),
   und damit hoert iOS auf, die Seite SELBST einzuruecken — an ALLEN VIER
   Kanten, nicht nur unten. Paket 1 hat nur unten nachgezogen. Seither liegt
   oben die Statusleiste (Uhr, Empfang, Akku) bzw. die Notch ueber dem
   obersten Element, und im Querformat schneidet die Notch links oder rechts
   in den Inhalt.

   ALLE REGELN STEHEN HIER UND NICHT IN DER JEWEILIGEN URSPRUNGSREGEL. Zwei
   Gruende: die bestehenden Zeilen bleiben unveraendert lesbar (dieselbe
   Begruendung wie eine Zeile darueber bei .cl-main), und wer den Rand sucht,
   findet ihn an EINER Stelle statt an zwoelf.

   NUR RICHTUNGEN, DIE ETWAS VERDECKEN KOENNEN. Hintergruende und
   Klick-Schirme (.cl-info-popover-backdrop, .cl-mehr-sheet-backdrop,
   .cl-notif-backdrop, .cl-blatt-hintergrund, .cl-aktionsmenue__schirm) sollen
   die ganze Flaeche decken und bleiben unberuehrt.
   =========================================================================== */

/* ── OBEN ────────────────────────────────────────────────────────────────────
   WER OBEN STEHT, HAENGT VOM UMGEBUNGSBAND AB. #app ist ein senkrechter
   Stapel (App.razor: Band, dann .cl-app); das Band steht nur in
   Nicht-Produktionsumgebungen ueberhaupt im DOM. Deshalb polstert genau EINES
   von beiden — waeren es beide, entstuende oben ein Streifen Leerraum in
   Randhoehe.

   DIE ZEILE WAECHST MIT. Nur die Polsterung zu erhoehen, machte die Kopfleiste
   nicht groesser: sie steht in einer Grid-Zeile fester Hoehe, und mit
   box-sizing: border-box (Bootstrap) fraesse die Polsterung ihren Inhalt auf.
   Dieselbe Bauform wie bei .cl-bottom-nav in Paket 1. */
.cl-app { grid-template-rows: calc(var(--cl-navbar-h) + env(safe-area-inset-top, 0px)) 1fr; }
.cl-navbar { padding-top: env(safe-area-inset-top, 0px); }

.cl-umgebungsband { padding-top: calc(.3rem + env(safe-area-inset-top, 0px)); }
.cl-umgebungsband ~ .cl-app {
    grid-template-rows: var(--cl-navbar-h) 1fr;
    /* 07.09.2026 (Paket 1c) — und aus demselben Grund traegt der Kopf hier
       auch in der Rechnung keinen Rand mehr. Ohne diese Zeile zoegen die drei
       Regeln, die --cl-navbar-total benutzen (Annotationsleiste,
       Benachrichtigungsblatt, Blatt), einen Rand ab, den es an dieser Stelle
       gar nicht gibt.
       WAS SIE NICHT LOEST — und das ist aelter als dieses Paket: die drei
       Regeln rechnen ueberhaupt nicht mit der HOEHE DES BANDES. Steht es da,
       sitzen die beiden Blaetter um dessen Hoehe zu weit oben. Die Bandhoehe
       ist keine Konstante (der Streifen bricht auf schmalen Geraeten um), also
       ist sie in einem calc() nicht zu haben; das braucht eine eigene
       Entscheidung und steht im Bericht. */
    --cl-navbar-total: var(--cl-navbar-h);
}
.cl-umgebungsband ~ .cl-app .cl-navbar { padding-top: 0; }

/* Dieselbe Rechnung fuer die Anmeldeschale: steht das Band darueber, hat es
   den oberen Rand schon abgeraeumt. Die Zeile setzt NUR den oberen Anteil
   zurueck — links, rechts und unten liegt kein Band. Der bestehende
   Geschwister-Zweig weiter unten (min-height: 0) bleibt unberuehrt. */
.cl-umgebungsband ~ .cl-auth-layout { padding-top: 0; }

/* ── LINKS UND RECHTS ────────────────────────────────────────────────────────
   Betrifft im Hochformat nichts (die Raender sind dort null) und im
   Querformat auf einem Geraet mit Notch alles, was ueber die volle Breite
   geht. Jede Zeile behaelt ihren bisherigen Abstand und bekommt den Rand
   DAZU — kein Element wird enger, wenn es keinen Rand gibt. */
.cl-navbar {
    padding-left: calc(1.25rem + env(safe-area-inset-left, 0px));
    padding-right: calc(1.25rem + env(safe-area-inset-right, 0px));
}
@media (max-width: 640px) {
    /* Dieselbe Schwelle wie die bestehende Verdichtung der Kopfleiste. */
    .cl-navbar {
        padding-left: calc(.75rem + env(safe-area-inset-left, 0px));
        padding-right: calc(.75rem + env(safe-area-inset-right, 0px));
    }
}

.cl-main {
    padding-left: calc(1.5rem + env(safe-area-inset-left, 0px));
    padding-right: calc(1.5rem + env(safe-area-inset-right, 0px));
}

/* Die untere Leiste verteilt ihre Symbole ueber die ganze Breite
   (space-around); ohne diese Zeile rutscht das aeusserste unter die Ecke. */
.cl-bottom-nav {
    padding-left: env(safe-area-inset-left, 0px);
    padding-right: env(safe-area-inset-right, 0px);
}

/* Die drei Blaetter von unten. Ihre senkrechte Polsterung traegt den unteren
   Rand schon; waagrecht standen sie auf 0. */
.cl-mehr-sheet,
.cl-notif-panel,
.cl-blatt {
    padding-left: env(safe-area-inset-left, 0px);
    padding-right: env(safe-area-inset-right, 0px);
}

/* Der Hinweisstreifen sitzt 2rem ueber der Unterkante — das sind 32px und
   damit knapp unter der Hoehe des Home-Indikators. */
.cl-toast { bottom: calc(2rem + env(safe-area-inset-bottom, 0px)); }

/* Der Fehlerstreifen von Blazor. Er steht in app.css (Infrastruktur), sein
   Rand aber hier — bei allen anderen. app.css wird VOR dieser Datei geladen,
   die Zeile gewinnt also. Er ist das eine Element, das man garantiert dann
   liest, wenn schon etwas schiefgegangen ist; halb unter dem Home-Indikator
   waere er dort besonders unbrauchbar. */
#blazor-error-ui {
    padding-bottom: calc(.7rem + env(safe-area-inset-bottom, 0px));
    padding-left: calc(1.25rem + env(safe-area-inset-left, 0px));
    padding-right: calc(1.25rem + env(safe-area-inset-right, 0px));
}

@media (max-width: 639.98px) {
    /* left traegt in der bestehenden Regel ein !important, also hier auch —
       sonst gewaenne die Zeile darueber. */
    .cl-info-popover {
        left: calc(1rem + env(safe-area-inset-left, 0px)) !important;
        right: calc(1rem + env(safe-area-inset-right, 0px));
    }
}

@media (max-width: 991.98px) {
    /* Nur am Telefon: am Rechner sind alle vier Raender null, und dort steht
       die Steuerzeile ohnehin im Fluss statt fest. */
    .cl-player__controls {
        padding-left: calc(.75rem + env(safe-area-inset-left, 0px));
        padding-right: calc(.75rem + env(safe-area-inset-right, 0px));
    }

    .cl-klebeleiste {
        padding-left: calc(1rem + env(safe-area-inset-left, 0px));
        padding-right: calc(1rem + env(safe-area-inset-right, 0px));
    }

    .cl-sattler-fix {
        left: calc(1rem + env(safe-area-inset-left, 0px));
        right: calc(1rem + env(safe-area-inset-right, 0px));
    }
}

/* BAU 6 (30.08.2026) — die drei Wegseiten des Trainings.
   Zwei Abstaende, sonst nichts: die Seiten benutzen durchgehend Formen, die es
   schon gibt (cl-seitenkopf, cl-leiser, cl-loop-card). */
.cl-wegseite__satz { font-size: .95rem; margin: -.25rem 0 1rem; }
.cl-wegseite__marke { margin: 0 0 1.25rem; }

/* BAU 6 — die drei Wege auf /training. Nur der Abstand nach oben; die Karten
   selbst sind cl-loop-card, die Form aus Bau 41. */
.cl-wege { display: flex; flex-direction: column; gap: .6rem; margin: 1.5rem 0 0; }

/* BAU 7 (30.08.2026) — die Zeile zum Elternteil.

   DIE FORM IST BESTAND: Chevron links, gedaempft, .85rem — dieselbe Zeile steht
   viermal inline im Client (DossierTiles, MappenErgebnis, ReiterDossier,
   Horses/Detail). NEU IST DIE TREFFERFLAECHE. Die inline geschriebenen Zeilen
   sind so hoch wie ihr Text, also rund 20 px; am Telefon ist das kein Ziel.
   44 px ist das Mass, das die Bottom-Nav und die Gruppenpillen schon tragen.

   KEIN GOLD ALS FLAECHE: die Zeile ist ein Weg, keine Handlung. Der Chevron
   traegt Gold als Schrift, mehr nicht — und beim Zeigen faerbt sich der Text
   mit, damit erkennbar bleibt, dass die GANZE Zeile tippbar ist. */
/* BAU 8 — die Zeile bekommt eine eigene Zeile. Ohne den Block setzt sich eine
   Ueberschrift mit display:inline-block (cl-section-title) daneben. */
.cl-elternzeile-zeile { display: block; }

.cl-elternzeile {
    display: inline-flex; align-items: center; gap: .4rem;
    min-height: 44px;
    padding: 0 .25rem 0 0;
    font-size: .85rem;
    color: var(--cl-text-muted);
    text-decoration: none;
}
.cl-elternzeile i { color: var(--cl-gold-light); font-size: .9rem; }
.cl-elternzeile:hover { color: var(--cl-text); }
.cl-elternzeile:focus-visible {
    outline: 2px solid var(--cl-gold);
    outline-offset: 2px;
    border-radius: var(--cl-radius);
}

/* ═══ BAU P12 — DAS PLUS-MENUE UEBER DER LEISTE ═════════════════════════ */

/* WARUM ES NICHT IN DER LEISTE LIEGT: die Leiste ist niedrig und schneidet ab.
   Das Menue ist eine eigene Ebene daneben, verankert am Mittelplatz.

   LEHRE AUS BAU P6: Schirm und Blatt fangen ihre Tipper SELBST. Dort war ein
   Tipp durch ein Blatt gefallen, weil ein VORFAHR pointer-events:none trug —
   deshalb steht hier auf beiden ausdruecklich pointer-events:auto, statt sich
   auf die Vererbung zu verlassen. */
.cl-aktionsmenue { position: relative; }

.cl-aktionsmenue__schirm {
    position: fixed; inset: 0;
    z-index: var(--cl-ebene-blatt);
    pointer-events: auto;
    background: none;
}

.cl-aktionsmenue__blatt {
    position: absolute;
    bottom: calc(100% + .6rem);
    left: 50%;
    transform: translateX(-50%);
    z-index: var(--cl-ebene-dialog);
    pointer-events: auto;

    min-width: 15rem;
    max-width: min(20rem, calc(100vw - 1.5rem));
    display: flex; flex-direction: column;
    padding: .35rem;
    border-radius: 14px;
    border: 1px solid var(--cl-border);
    /* BAU P12e — HIER STAND var(--cl-surface-2, var(--cl-surface)).
       BEIDE NAMEN EXISTIERTEN NIE. Ein Rueckfallwert rettet das nicht: ist
       auch er undefiniert, faellt die ganze Deklaration weg, und das Menue
       hat keinen Grund. Genau der Fehler, gegen den der Kommentar in
       horses.css bei --hrs-text schon einmal geschrieben wurde (Bau P11). */
    background: var(--cl-blatt-grund);
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.35);
}

.cl-aktionsmenue__zeile {
    display: flex; align-items: center; gap: .65rem;
    padding: .6rem .65rem;
    border-radius: 10px;
    text-decoration: none;
    color: var(--cl-text);
}
.cl-aktionsmenue__zeile:active { background: var(--cl-glass-hover); }
.cl-aktionsmenue__zeile i { font-size: 1.1rem; color: var(--cl-gold); }

.cl-aktionsmenue__text { display: flex; flex-direction: column; min-width: 0; }
.cl-aktionsmenue__titel { font-weight: 600; font-size: .95rem; }
.cl-aktionsmenue__untertitel {
    font-size: .78rem; color: var(--cl-text-muted);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* ═══════════════════════════════════════════════════════════════════════════
   DER ZUG AM TRENNER DER GUTACHTEN-WERKBANK (02.09.2026).

   WARUM HIER UND NICHT IN Gutachten.razor.css: jene Datei ist
   bereichsgebunden. Blazor haengt an jeden ihrer Selektoren ein [b-xxxxx] des
   Bauteils; <body> traegt dieses Attribut nicht, und die Regel haette dort NIE
   gegriffen — lautlos, ohne Fehler und ohne roten Test. Die Klasse setzt
   clWerkbank waehrend eines Zuges am <body>, also gehoert die Regel dorthin,
   wo sie den <body> auch erreicht.

   WAS SIE TUT: waehrend gezogen wird, markiert der Browser nichts (sonst
   faerbt er die halbe Seite blau) und das Video nimmt keine Zeigerereignisse
   an (sonst uebernimmt seine eigene Steuerung den Zug in der Mitte).
   =========================================================================== */
body.cl-gut-zieht {
    user-select: none;
    cursor: col-resize;
}

body.cl-gut-zieht iframe,
body.cl-gut-zieht video {
    pointer-events: none;
}

/* ═══════════════════════════════════════════════════════════════════════════
   DER UEBUNGSKATALOG (PAKET 6, 07.09.2026).

   WOHER DAS BLAU KAM: Bootstrap. Der Katalog benutzte .btn-primary fuer jeden
   aktiven Zustand, und .btn-primary ist #0d6efd aus lib/bootstrap/bootstrap.min.css
   — einer FREMDDATEI, die nie angefasst wird. Ein globales Ueberschreiben von
   .btn-primary in dieser Datei haette 27 weitere Razor-Dateien mitgefaerbt; das
   ist eine eigene Entscheidung und nicht Teil eines Pakets ueber den Katalog.
   Deshalb eigene Klassen, hier, mit den Marken-Tokens.

   ALLES AUS TOKENS. Kein Zahlwert fuer eine Farbe — die helle Fassung
   (data-theme) definiert dieselben Namen um, und eine feste Farbe waere dort
   still falsch.
   =========================================================================== */

/* --- Der Umschalter: eine Auswahl, keine Filterzeile ----------------------- */
.cl-umschalter {
    display: flex; flex-wrap: wrap; gap: .4rem;
    margin: 0 0 1.5rem;
}

.cl-umschalter__chip {
    display: inline-flex; align-items: center;
    padding: .5rem 1.1rem;
    border-radius: var(--cl-radius-pill);
    font-size: .9rem; font-weight: 600;
    line-height: 1.2;
    cursor: pointer;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    color: var(--cl-text-muted);
    transition: all var(--cl-duration) var(--cl-ease);
    /* 44 px Griffhoehe am Telefon — der Umschalter ist der Hauptgriff dieser
       Seite und muss mit dem Daumen zu treffen sein. */
    min-height: 44px;
}
.cl-umschalter__chip:hover {
    background: var(--cl-glass-hover);
    color: var(--cl-text);
}
.cl-umschalter__chip--aktiv {
    background: linear-gradient(135deg, var(--cl-gold) 0%, var(--cl-gold-light) 100%);
    border-color: transparent;
    color: var(--cl-navy-dark);
    box-shadow: 0 2px 12px rgba(200, 149, 42, 0.25);
}
.cl-umschalter__chip--aktiv:hover {
    background: linear-gradient(135deg, var(--cl-gold) 0%, var(--cl-gold-light) 100%);
    color: var(--cl-navy-dark);
}
.cl-umschalter__chip:focus-visible {
    outline: 2px solid var(--cl-gold); outline-offset: 2px;
}

/* --- Die Filterzeilen: leiser als der Umschalter --------------------------- */
.cl-filterblock { margin: 0 0 1.5rem; display: flex; flex-direction: column; gap: .45rem; }

.cl-filterzeile { display: flex; flex-wrap: wrap; gap: .3rem; align-items: center; }

.cl-filterzeile__marke {
    width: 3rem; flex: 0 0 3rem;
    font-size: .75rem; color: var(--cl-text-subtle);
}

.cl-filterchip {
    display: inline-flex; align-items: center; gap: .35rem;
    padding: .25rem .7rem;
    border-radius: 999px;
    font-size: .78rem; line-height: 1.6;
    cursor: pointer;
    background: transparent;
    border: 1px solid var(--cl-glass-border);
    color: var(--cl-text-muted);
    transition: all var(--cl-duration) var(--cl-ease);
}
.cl-filterchip:hover { background: var(--cl-glass-bg); color: var(--cl-text); }

/* AKTIV IST GOLD, aber leiser als der Umschalter: Flaeche statt Verlauf. Zwei
   gleich laute Goldtoene nebeneinander liessen nicht erkennen, welcher die
   Auswahl und welcher die Verfeinerung ist. */
.cl-filterchip--aktiv {
    background: var(--cl-gold-glow);
    border-color: var(--cl-gold-border);
    color: var(--cl-gold);
    font-weight: 600;
}
.cl-filterchip:focus-visible { outline: 2px solid var(--cl-gold); outline-offset: 2px; }

.cl-filterchip__zahl {
    font-size: .7rem;
    opacity: .7;
    font-variant-numeric: tabular-nums;
}

/* --- Das Raster: die Spaltenzahl geht mit der Trefferzahl ------------------ */
/* --cl-karten kommt aus dem Markup (Anzahl der Treffer). EIN Treffer soll
   nicht links in einem vierspaltigen Raster stehen und drei Viertel Leere
   neben sich haben; viele Treffer sollen die Breite nutzen.
   min(100%, 17.5rem) haelt das Telefon einspaltig, ohne Medienabfrage. */
.cl-katalograster {
    display: grid;
    gap: .75rem;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 17.5rem), 1fr));
    max-width: calc(var(--cl-karten, 4) * 22rem);
}

/* --- Die Karte ------------------------------------------------------------ */
.cl-uebungskarte {
    display: flex; flex-direction: column;
    /* Gleich hoch in einer Zeile: das Raster streckt, die Karte fuellt. Die
       Abzeichen haengen unten (margin-top:auto am Fuss), damit Karten mit
       kurzem und langem Titel dieselbe Grundlinie haben. */
    height: 100%;
    text-decoration: none; color: inherit;
}

.cl-uebungskarte__bild {
    height: 140px; overflow: hidden;
    border-radius: var(--cl-radius-lg) var(--cl-radius-lg) 0 0;
    margin: -1.25rem -1.25rem .75rem;
}
.cl-uebungskarte__bild img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* KEIN PLATZHALTER MEHR. Hier stand ein leeres Rechteck mit einem grauen
   Strichmaennchen — ein Rahmen um nichts liest sich als Fehler, eine Karte
   ohne Bild als Karte. Die Hoehe traegt das Raster, nicht das Rechteck. */

.cl-uebungskarte__titel {
    font-weight: 600; line-height: 1.35;
    margin-bottom: .35rem;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden;
}

.cl-uebungskarte__text {
    font-size: .8rem; line-height: 1.5;
    color: var(--cl-text-muted);
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden;
}

/* DIE PASSUNG IST EIN SATZ, KEIN ABZEICHEN. Sie beantwortet die Frage, mit der
   jemand in der Halle steht, und gehoert deshalb lesbar gesetzt. */
.cl-uebungskarte__passung { font-size: .8rem; margin-bottom: .5rem; }
.cl-uebungskarte__passung--passt   { color: var(--cl-gold); }
.cl-uebungskarte__passung--zulang  { color: var(--cl-warning); }

/* Die Abzeichen sind Beiwerk: der Titel ist die Sache. Sie stehen unten und
   leise — dieselbe Form wie .cl-chip--muted, hier ohne Zeigerhand. */
.cl-uebungskarte__marken {
    display: flex; flex-wrap: wrap; gap: .3rem;
    margin-top: auto; padding-top: .6rem;
}

/* ═══════════════════════════════════════════════════════════════════════════
   DAS REGAL IM UEBUNGSKATALOG (PAKET 7, 07.09.2026).

   Regal zum Stoebern, Liste zum Arbeiten. Die Zeilen sind waagrecht wischbar,
   und das muss AM TELEFON taugen: die naechste Karte am Rand angeschnitten,
   Fangpunkte an den Karten, und der senkrechte Seitenscroll darf nicht
   klemmen.
   =========================================================================== */

.cl-regal { margin: 0 0 1.75rem; }

.cl-regal__kopf {
    display: flex; align-items: baseline; justify-content: space-between;
    gap: 1rem; margin-bottom: .6rem;
}

.cl-regal__titel {
    font-size: 1.05rem; font-weight: 700; margin: 0;
    color: var(--cl-text);
}

.cl-regal__alle {
    display: inline-flex; align-items: center; gap: .25rem;
    font-size: .85rem; font-weight: 600;
    color: var(--cl-gold); text-decoration: none;
    white-space: nowrap;
    /* Griffflaeche fuer den Daumen, ohne die Zeile hoeher zu machen. */
    padding: .35rem 0 .35rem .5rem;
}
.cl-regal__alle:hover { color: var(--cl-gold-light); }

/* --- Die Spur ------------------------------------------------------------- */
.cl-regal__spur {
    display: flex; gap: .75rem;
    /* <ul> — die Zeile IST eine Liste; die Vorgaben des Browsers dafuer weg. */
    list-style: none; margin: 0; padding: 0;

    overflow-x: auto;
    /* Der Schatten der Karten wird sonst oben und unten abgeschnitten. */
    padding: .25rem .25rem 1rem;
    margin: -.25rem -.25rem -.5rem;

    scroll-snap-type: x mandatory;
    scroll-padding-left: .25rem;

    /* DAMIT DER SEITENSCROLL NICHT KLEMMT: am Ende der Spur gibt der Browser
       die Geste NICHT an die Seite weiter (sonst springt die Seite waagrecht
       oder das Wischen fuehlt sich blockiert an). Senkrecht bleibt frei. */
    overscroll-behavior-x: contain;
    -webkit-overflow-scrolling: touch;
}

.cl-regal__karte {
    flex: 0 0 auto;
    /* 62vw am Telefon heisst: die naechste Karte ist angeschnitten sichtbar —
       DAS ist der Hinweis, dass es weitergeht, und er braucht kein Pfeilchen.
       Am Rechner deckelt 15rem. */
    width: clamp(11rem, 62vw, 15rem);
    scroll-snap-align: start;
    display: flex;
}
.cl-regal__karte > * { width: 100%; }

/* --- Die Abschlusskachel -------------------------------------------------- */
.cl-regal__ende {
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: .5rem; text-align: center;
    text-decoration: none; color: var(--cl-gold);
    font-size: .85rem; font-weight: 600;
    border-style: dashed;
    min-height: 8rem;
}
.cl-regal__ende i { font-size: 1.5rem; }

/* --- Am Rechner: eine Bildlaufleiste, die man findet ----------------------- */
/* EIN REGAL, DAS NUR MIT WISCHGESTE BEDIENBAR IST, IST AM RECHNER
   UNERREICHBAR. Am Zeigegeraet steht die Leiste deshalb dauerhaft da und ist
   angefasst — nicht die duenne graue des Systems, die man auf dunklem Grund
   nicht sieht. (Pfeilknoepfe waeren die andere Loesung; sie brauchen
   JavaScript zum Scrollen und stehen deshalb im Bericht als Nachtrag.) */
@media (hover: hover) and (pointer: fine) {
    .cl-regal__spur {
        scrollbar-width: thin;
        scrollbar-color: var(--cl-gold-border) transparent;
        padding-bottom: .5rem;
    }
    .cl-regal__spur::-webkit-scrollbar { height: 8px; }
    .cl-regal__spur::-webkit-scrollbar-track {
        background: var(--cl-glass-bg); border-radius: 999px;
    }
    .cl-regal__spur::-webkit-scrollbar-thumb {
        background: var(--cl-gold-border); border-radius: 999px;
    }
    .cl-regal__spur:hover::-webkit-scrollbar-thumb { background: var(--cl-gold); }
}

/* --- Der Weg zurueck aus der Liste ---------------------------------------- */
.cl-listenkopf { margin: 0 0 .9rem; }

.cl-regal__zurueck {
    display: inline-flex; align-items: center; gap: .3rem;
    font-size: .85rem; color: var(--cl-text-muted); text-decoration: none;
    padding: .35rem 0;
}
.cl-regal__zurueck:hover { color: var(--cl-gold); }

/* ═══════════════════════════════════════════════════════════════════════════
   PLAENE ZU HAEUFIGEN SITZPROBLEMEN (PAKET 8, 07.09.2026).

   Volle Breite, untereinander, hoechstens vier: das ist der Weg, den die
   meisten brauchen, und er soll nicht aussehen wie noch eine Kartenreihe.
   =========================================================================== */

.cl-sitzproblemkarte {
    display: flex; align-items: center; gap: .75rem;
    text-decoration: none; color: inherit;
    padding: .9rem 1rem;
    margin-bottom: .5rem;
}
.cl-sitzproblemkarte i { color: var(--cl-gold); flex: 0 0 auto; }

.cl-sitzproblemkarte__titel { font-weight: 600; line-height: 1.35; }

.cl-sitzproblemkarte__zeile {
    font-size: .8rem; color: var(--cl-text-muted); margin-top: .15rem;
}

/* --- Die Trennlinie mit der leisen Marke ---------------------------------- */
/* Sie sagt, dass jetzt etwas anderes kommt: oben fertige Wege, unten der
   Bestand zum Selbersuchen. Eine blosse Linie sagt das nicht. */
.cl-abschnittsmarke {
    display: flex; align-items: center; gap: .75rem;
    margin: 1.75rem 0 1.25rem;
}
.cl-abschnittsmarke::before,
.cl-abschnittsmarke::after {
    content: ""; flex: 1 1 auto;
    border-top: 1px solid var(--cl-glass-border);
}
.cl-abschnittsmarke span {
    font-size: .7rem; letter-spacing: .08em; text-transform: uppercase;
    color: var(--cl-text-subtle); white-space: nowrap;
}

/* ═══════════════════════════════════════════════════════════════════════════
   DER KATALOG NIMMT WENIGER PLATZ (PAKET 9, 07.09.2026).

   Auf 380 px sollen ueber der Falz stehen: Titel, Chips, Suchfeld und die
   erste Plankarte. Alles, was dafuer weichen muss, weicht hier — und zwar
   durch Masse, nicht durch Weglassen von Inhalt.
   =========================================================================== */

/* Nur am breiten Schirm. Fuer Saetze, die wahr und freundlich sind und am
   Telefon trotzdem eine Zeile kosten, die der Inhalt braucht. */
@media (max-width: 639.98px) {
    .cl-nur-breit { display: none !important; }
}

/* --- Der Umschalter: kleiner, aber erkennbar die lautere Sorte ------------- */
.cl-umschalter { gap: .3rem; margin-bottom: 1rem; }

.cl-umschalter__chip {
    padding: .35rem .85rem;
    font-size: .85rem;
    /* 36 px statt 44: mit dem Daumen noch sicher zu treffen (Apple nennt 44 pt
       fuer FREISTEHENDE Ziele; in einer Reihe gleichartiger Chips mit Abstand
       ist das die uebliche Groesse), und der Umschalter frisst nicht mehr ein
       Sechstel des Schirms. Er bleibt durch Gewicht und Goldflaeche die
       lautere Sorte, nicht durch Groesse. */
    min-height: 36px;
}

/* --- Die Plankarten: eine Zeile, Zahl dahinter ---------------------------- */
.cl-sitzproblemkarte {
    padding: .6rem .8rem;
    margin-bottom: .4rem;
    /* AM RECHNER HOECHSTENS SO BREIT WIE DER LESETEXT. Eine Zeile ueber die
       ganze Flaeche liest sich nicht besser, sie liest sich weiter. */
    max-width: 62ch;
}

.cl-sitzproblemkarte__kopf {
    display: flex; align-items: baseline; gap: .5rem;
    min-width: 0;
}

.cl-sitzproblemkarte__titel {
    /* EINE Zeile: der Titel ist kurz, und wenn er es einmal nicht ist, endet
       er mit Auslassung statt die Karte zu dehnen. */
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    min-width: 0;
}

/* Die Zahl steht DAHINTER, nicht darunter — eine Zeile weniger je Karte. */
.cl-sitzproblemkarte__zeile {
    font-size: .78rem; color: var(--cl-text-muted);
    margin-top: 0; white-space: nowrap; flex: 0 0 auto;
}

/* --- Regalkarten: die Marken in EINE Zeile, ohne Umbruch ------------------ */
/* Der Ort steht schon ueber der Zeile; was bleibt (Ziel, Stufe, Entwurf),
   passt nebeneinander. Laeuft es doch ueber, wird geschnitten statt
   umgebrochen: eine zweite Markenzeile macht jede Karte der Zeile hoeher. */
.cl-uebungskarte__marken--eine {
    flex-wrap: nowrap; overflow: hidden;
}
.cl-uebungskarte__marken--eine > * { flex: 0 0 auto; }

/* --- Die Regalkarte selbst etwas knapper ---------------------------------- */
.cl-regal__karte .cl-uebungskarte { padding: .9rem; }
.cl-regal__karte .cl-uebungskarte__marken { padding-top: .45rem; }

/* ═══════════════════════════════════════════════════════════════════════════
   DIE SATZKARTE (PAKET 10, 07.09.2026).

   EINE Form fuer einen Uebungssatz, hervorgehoben oder nicht. Am Telefon
   fuellte einer davon einen halben Schirm; jetzt sind es zwei Zeilen Text und
   eine Knopfreihe.
   =========================================================================== */

.cl-satzkarte {
    padding: .7rem .8rem;
    margin-bottom: .5rem;
    border-radius: var(--cl-radius);
    border: 1px solid transparent;
}

/* HERVORGEHOBEN IST EIN ZUSTAND, KEINE ZWEITE BAUFORM: Flaeche und goldener
   Rand, sonst dieselbe Karte. */
.cl-satzkarte--hervor {
    background: var(--cl-gold-glow);
    border-color: var(--cl-gold-border-dim);
    padding: .9rem 1rem;
}

.cl-satzkarte__kopf {
    display: flex; align-items: center; gap: .5rem;
    min-width: 0;
}

.cl-satzkarte__symbol { color: var(--cl-gold); flex: 0 0 auto; }

.cl-satzkarte__titel {
    font-weight: 600; flex: 1 1 auto; min-width: 0;
    /* EINZEILIG. Ein Titel, der ueber drei Zeilen laeuft, macht jede Karte
       verschieden hoch und sagt nicht mehr als eine Zeile. */
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* Das Menue als Symbol am Titel — 32 px Griff, ohne Rahmen und ohne Flaeche:
   es ist eine Nebenhandlung. */
.cl-satzkarte__ausloeser { flex: 0 0 auto; }

.cl-satzkarte__mehr {
    display: inline-flex; align-items: center; justify-content: center;
    width: 32px; height: 32px;
    background: transparent; border: none; border-radius: 999px;
    color: var(--cl-text-muted); cursor: pointer;
}
.cl-satzkarte__mehr:hover { background: var(--cl-glass-bg); color: var(--cl-text); }
.cl-satzkarte__mehr:focus-visible { outline: 2px solid var(--cl-gold); outline-offset: 2px; }

/* --- Die Metazeile: ein Streifen, zwei Teile ------------------------------ */
.cl-satzkarte__meta {
    display: flex; gap: .4rem; align-items: baseline;
    font-size: .8rem; color: var(--cl-text-muted);
    margin: .15rem 0 0 1.6rem;   /* unter dem Titel, auf dessen Flucht */
    min-width: 0;
}

/* WO MAN IM SATZ STEHT, GILT IMMER — dieser Teil weicht nicht. */
.cl-satzkarte__stand { flex: 0 0 auto; }

/* WOMIT ES WEITERGEHT, IST DIE ZUGABE — dieser Teil schneidet ab. Er traegt
   den Trenner selbst, damit kein einsamer Punkt stehen bleibt, wenn er fehlt. */
.cl-satzkarte__naechste {
    flex: 0 1 auto; min-width: 0;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cl-satzkarte__stand + .cl-satzkarte__naechste::before {
    content: "· "; color: var(--cl-text-subtle);
}

.cl-satzkarte__warum {
    font-size: .85rem; color: var(--cl-text-muted);
    margin: .4rem 0 0 1.6rem;
}

.cl-satzkarte__fuss {
    display: flex; flex-wrap: wrap; gap: .4rem; align-items: center;
    margin: .6rem 0 0 1.6rem;
}

.cl-satzkarte__menue {
    display: flex; flex-wrap: wrap; gap: .4rem; align-items: center;
    font-size: .85rem;
    flex: 1 1 100%;
}


/* ============================================================================
   LERNBEREICH — DER KAPITELFLIESSTEXT UND SEINE KAESTEN (09.09.2026, Paket 1)

   WOGEGEN DAS HIER STEHT. `.cl-prose` und `.cl-chapter-block` standen an jedem
   Blockbauteil und hatten NULL Regeln — der Haken war ueberall gesetzt, es hing
   nur nichts daran. Der gesamte Kapitelfliesstext lief damit auf
   Bootstrap-Voreinstellungen: h2 in 2rem mitten in einem Absatz, Listen mit dem
   Browser-Einzug, Links in Bootstrap-Blau, <strong> im selben Ton wie der Rest.
   In einer sonst durchgestalteten Anwendung ist das der eine Bereich, der
   aussieht, als haette ihn niemand angesehen.

   ZWEI KLASSEN, ZWEI AUFGABEN, und sie werden hier nicht vermischt:

     .cl-chapter-block  ist die HUELLE. Sie sagt, wie ein Block im Kapitel
                        steht (Abstand nach unten) und welche Rolle er hat
                        (die --modifikatoren). Sie sagt NICHTS ueber Text.
     .cl-prose          ist der TEXT. Sie gilt fuer das, was aus dem Markdown
                        kommt, und nur dafuer.

   DIE HUELLE BLEIBT MAGER, und das ist Absicht: `.cl-chapter-block` haengt an
   NEUN Bauteilen (Cta, File, Frage, Image, Profibox, Prose, Unknown, Verweis,
   Video). Jede Polsterung, jeder Rahmen, jeder Grund an der Grundklasse traefe
   alle neun. Die Kastenoptik kommt deshalb ausschliesslich ueber
   --modifikatoren, und die stehen genau an den zwei Bauteilen, die sie meinen.

   KEIN ROHER FARBWERT. Alles kommt aus den Marken oben und geht die
   Hell-Umschaltung mit. Der C#-Switch, aus dem diese Regeln stammen, tat das
   NICHT: #34d399, #f59e0b, #fff und rgba(200,160,0,.10) standen dort fest und
   blieben im hellen Schema unveraendert stehen — gruen auf Weiss, Bernstein auf
   Weiss, und eine weisse Ueberschrift auf weissem Grund.
   ============================================================================ */

/* ── DIE HUELLE ─────────────────────────────────────────────────────────── */

.cl-chapter-block {
    margin-bottom: var(--cl-block-abstand);
}

/* DIE TITELZEILE EINES KASTENS. Groesse und Farbe kommen von den
   Modifikatoren darunter; hier steht nur, was fuer alle gilt.

   1rem IST DIE VORGABE UND NICHT DIE AUSNAHME: die Titelzeile eines Kastens
   ist eine Beschriftung, keine Ueberschrift der Seite. Wer sie groesser macht,
   macht den Kasten nicht deutlicher, nur lauter. */
.cl-chapter-block__titel {
    margin: 0 0 .6rem 0;
    font-size: 1rem;
    font-weight: 700;
    line-height: 1.35;
    color: var(--cl-gold-light);
}

.cl-chapter-block__titel > .bi {
    margin-right: .4rem;
}

/* ── DIE SECHS ROLLEN ───────────────────────────────────────────────────────
   Die drei didaktischen Kaesten muessen auf einen Blick unterscheidbar sein.
   Traeger dafuer sind Rahmenfarbe, Symbol und Titelzeile — NICHT die
   Schriftgroesse des Fliesstexts: wer den Text groesser macht, macht ihn nicht
   deutlicher, nur laenger. (Derselbe Satz stand vorher als Kommentar im
   Bauteil; er gehoert dorthin, wo die Groessen vergeben werden.) */

/* TEXT — kein Kasten. Der laufende Absatz ist der Normalfall des Kapitels und
   bekommt deshalb keine Rahmung, nur eine etwas kraeftigere Zwischenzeile. */
.cl-chapter-block--text > .cl-chapter-block__titel {
    font-size: 1.1rem;
    color: var(--cl-text);
}

/* BEISPIEL — die leiseste Kante. Ein Beispiel erlaeutert, es unterbricht nicht. */
.cl-chapter-block--beispiel {
    border-left: 3px solid var(--cl-gold);
}

/* ZUSAMMENFASSUNG — dieselbe Kante, hellerer Ton: sie schliesst ab, statt zu
   erlaeutern. */
.cl-chapter-block--summary {
    border-left: 3px solid var(--cl-gold-light);
}

/* SELBSTPRUEFUNG — Gruen, weil sie zum Nachsehen auffordert und nichts
   behauptet. --cl-success traegt im hellen Schema den dunkleren Ton, ohne dass
   hier etwas dazustehen braucht; #34d399 tat das nicht. */
.cl-chapter-block--check {
    border-left: 3px solid var(--cl-success);
}
.cl-chapter-block--check > .cl-chapter-block__titel {
    color: var(--cl-success);
}

/* MERKSATZ — das lauteste der drei: voller Goldrahmen statt Kante, damit er
   sich auch von den anderen Kaesten abhebt und nicht nur von normalem Text. */
.cl-chapter-block--merksatz {
    border: 2px solid var(--cl-gold);
    background: var(--cl-gold-glow);
}
.cl-chapter-block--merksatz > .cl-chapter-block__titel {
    font-size: 1.05rem;
    color: var(--cl-gold);
}

/* HAEUFIGER FEHLER — warnend, nicht alarmierend: Bernstein, kein Rot. Rot ist
   den Fehlerzustaenden der Anwendung vorbehalten; ein didaktischer Hinweis ist
   kein Fehler der Anwendung. */
.cl-chapter-block--fehlerbox {
    border-left: 3px solid var(--cl-warning);
    background: var(--cl-warning-wash);
}
.cl-chapter-block--fehlerbox > .cl-chapter-block__titel {
    color: var(--cl-warning);
}

/* FUER FORTGESCHRITTENE — zurueckgenommen, weil optional. Die Zeile traegt den
   gedaempften Ton, damit der Kasten im Ueberfliegen als "kann man auch lassen"
   lesbar ist. */
.cl-chapter-block--profibox {
    border-left: 3px solid var(--cl-text-muted);
}

/* ── DER FLIESSTEXT ────────────────────────────────────────────────────────
   Alles darunter wirkt NUR innerhalb von .cl-prose. Kein Selektor greift auf
   nackte Elemente der Seite durch; was hier steht, gilt fuer das Erzeugnis des
   Markdown-Renderers und fuer nichts sonst.

   DIE TAGS SIND BEKANNT: ContentMarkdownRenderer.AllowedTags ist eine
   Positivliste, und diese Regeln decken sie ab. Was dort nicht steht, kann hier
   nicht ankommen. */

.cl-prose {
    max-width: var(--cl-lesebreite);
    line-height: 1.7;
    color: var(--cl-text);
    font-size: .95rem;
    overflow-wrap: break-word;
}

/* DER ERSTE UND DER LETZTE ABSTAND GEHOEREN DEM KASTEN, nicht dem Text. Ohne
   diese zwei Zeilen steht ueber dem ersten Absatz die Polsterung PLUS der
   Absatzabstand, und der Kasten sitzt sichtbar schief. */
.cl-prose > *:first-child { margin-top: 0; }
.cl-prose > *:last-child  { margin-bottom: 0; }

.cl-prose p {
    margin: 0 0 .85rem 0;
}

/* UEBERSCHRIFTEN INNERHALB EINES BLOCKS sind Zwischenstufen, keine
   Seitentitel. Bootstrap gibt h2 2rem — das ist groesser als jede Ueberschrift,
   die in dieser Anwendung sonst in einer Karte steht. Die Staffelung hier ist
   flach und bleibt unter der Titelzeile des Kastens; sie ordnet, sie ruft
   nicht. */
.cl-prose h1,
.cl-prose h2,
.cl-prose h3,
.cl-prose h4,
.cl-prose h5,
.cl-prose h6 {
    margin: 1.4rem 0 .5rem 0;
    line-height: 1.3;
    font-weight: 700;
    color: var(--cl-text);
}
.cl-prose h1 { font-size: 1.25rem; }
.cl-prose h2 { font-size: 1.15rem; }
.cl-prose h3 { font-size: 1.05rem; }
.cl-prose h4,
.cl-prose h5,
.cl-prose h6 {
    font-size: .95rem;
    font-weight: 600;
    color: var(--cl-text-muted);
}

/* LISTEN. Der Einzug steht in rem und nicht auf dem Browserwert (40px), damit
   er zum Absatzrhythmus passt statt daneben zu stehen. Das Aufzaehlungszeichen
   traegt Gold — es ist der einzige Ort im Fliesstext, an dem die Hausfarbe
   ohne Anlass auftaucht, und genau deshalb ist es dosiert: 3px Glyphe, kein
   Rahmen, kein Grund. */
.cl-prose ul,
.cl-prose ol {
    margin: 0 0 .85rem 0;
    padding-left: 1.4rem;
}
.cl-prose li {
    margin-bottom: .35rem;
}
.cl-prose li::marker {
    color: var(--cl-gold);
}
/* Verschachtelte Listen bekommen keinen zweiten Aussenabstand — sonst reisst
   die Aufzaehlung in der Mitte auf. */
.cl-prose li > ul,
.cl-prose li > ol {
    margin: .35rem 0 0 0;
}

.cl-prose dl { margin: 0 0 .85rem 0; }
.cl-prose dt { font-weight: 600; color: var(--cl-text); }
.cl-prose dd { margin: 0 0 .5rem 1.4rem; color: var(--cl-text-muted); }

/* AUSZEICHNUNGEN. <strong> bekommt Gewicht UND Farbe: auf dunklem Grund
   allein durch Gewicht ist die Hervorhebung schwach, weil der Grundtext schon
   bei 0.92 Deckung steht. Es gibt DM Sans in 700; mehr wird hier nicht
   verlangt. */
.cl-prose strong,
.cl-prose b {
    font-weight: 700;
    color: var(--cl-text);
}
/* KURSIV IST SYNTHETISCH. Es gibt keinen Kursivschnitt (siehe Kopf dieser
   Datei); der Browser neigt das aufrechte Gesicht. Bewusst so — fuer die
   wenigen Stellen im Fliesstext lohnt keine eigene Datei. */
.cl-prose em,
.cl-prose i {
    font-style: italic;
}
.cl-prose u,
.cl-prose ins {
    text-decoration-color: var(--cl-gold-border);
    text-underline-offset: .18em;
}
.cl-prose s,
.cl-prose del {
    color: var(--cl-text-muted);
}
.cl-prose mark {
    background: var(--cl-gold-glow);
    color: var(--cl-text);
    padding: 0 .18em;
    border-radius: 3px;
}
.cl-prose small { font-size: .85em; color: var(--cl-text-muted); }

/* LINKS. Gold statt Bootstrap-Blau, und die Unterstreichung bleibt: sie ist
   das Merkmal, an dem ein Link im Fliesstext ohne Farbsehen erkennbar ist.
   Der Abstand zur Grundlinie verhindert, dass sie die Unterlaengen
   durchschneidet. */
.cl-prose a {
    color: var(--cl-gold);
    text-decoration: underline;
    text-decoration-color: var(--cl-gold-border);
    text-underline-offset: .18em;
    transition: color var(--cl-duration) var(--cl-ease),
                text-decoration-color var(--cl-duration) var(--cl-ease);
}
.cl-prose a:hover,
.cl-prose a:focus-visible {
    color: var(--cl-gold-light);
    text-decoration-color: var(--cl-gold-light);
}

/* ZITAT. Kante statt Anfuehrungszeichen — dieselbe Bauform wie bei den
   Kaesten, damit im Kapitel nur EIN Mittel fuer "das hier ist abgesetzt"
   vorkommt. Der gedimmte Goldrahmen unterscheidet es von einem Beispielkasten,
   der die volle Kante traegt. */
.cl-prose blockquote {
    margin: 0 0 .85rem 0;
    padding: .1rem 0 .1rem .9rem;
    border-left: 3px solid var(--cl-gold-border-dim);
    color: var(--cl-text-muted);
    font-style: italic;
}
.cl-prose blockquote > *:last-child { margin-bottom: 0; }

/* CODE. Monospace bleibt die Systemschrift — sie ist die einzige Familie, die
   in dieser Anwendung bewusst NICHT ausgeliefert wird (siehe Kopf: "monospace
   verwalten wir nicht"). */
.cl-prose code,
.cl-prose kbd,
.cl-prose samp,
.cl-prose var {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: .88em;
    background: var(--cl-navy-light);
    border: 1px solid var(--cl-glass-border);
    border-radius: 4px;
    padding: .08em .35em;
}
.cl-prose var { font-style: italic; }
.cl-prose pre {
    margin: 0 0 .85rem 0;
    padding: .8rem 1rem;
    background: var(--cl-navy-light);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
    overflow-x: auto;
}
/* Im Block traegt der Rahmen das <pre>, nicht jedes <code> darin. */
.cl-prose pre code {
    background: none;
    border: 0;
    padding: 0;
    font-size: .85rem;
}

.cl-prose hr {
    margin: 1.2rem 0;
    border: 0;
    border-top: 1px solid var(--cl-glass-border);
    opacity: 1;
}

/* BILDER IM FLIESSTEXT laufen nie ueber die Lesebreite hinaus. */
.cl-prose img {
    max-width: 100%;
    height: auto;
    border-radius: var(--cl-radius);
}
.cl-prose figure { margin: 0 0 .85rem 0; }
.cl-prose figcaption {
    margin-top: .35rem;
    font-size: .82rem;
    color: var(--cl-text-muted);
}

/* TABELLEN. Sie sind die eine Stelle, an der die Lesebreite nicht reicht —
   deshalb scrollt die Tabelle in sich und nicht die Seite. Ohne das
   waagerechte Scrollen im Container schiebt eine breite Tabelle die ganze
   Ansicht zur Seite. */
.cl-prose table {
    width: 100%;
    margin: 0 0 .85rem 0;
    border-collapse: collapse;
    font-size: .9rem;
    display: block;
    overflow-x: auto;
}
.cl-prose th,
.cl-prose td {
    padding: .45rem .6rem;
    border-bottom: 1px solid var(--cl-glass-border);
    text-align: left;
    vertical-align: top;
}
.cl-prose th {
    font-weight: 600;
    color: var(--cl-text-muted);
    white-space: nowrap;
}
.cl-prose caption {
    caption-side: bottom;
    padding-top: .4rem;
    font-size: .82rem;
    color: var(--cl-text-muted);
    text-align: left;
}

/* ── HELL ──────────────────────────────────────────────────────────────────
   Fast nichts steht hier, und das ist der Punkt: alle Regeln oben laufen ueber
   Marken, und die Marken kennen ihr Schema. Was bleibt, sind die zwei Stellen,
   an denen die dunkle Ableitung im Hellen nicht traegt. */

/* DER CODEGRUND KIPPT DIE RICHTUNG. Im Dunkeln hebt --cl-navy-light den Code
   vom Kartengrund AB (heller als die Umgebung). Im Hellen ist dieselbe Marke
   #F0EDE7 und liegt damit sehr nah am Kartenweiss — die Vertiefung
   verschwindet, der Code saehe aus wie ein leeres Feld. --cl-glass-bg ist im
   Hellen genau der Hauch Schwarz, den es dafuer braucht, und es ist bereits
   die Marke fuer "eine Lage tiefer". */
[data-theme="light"] .cl-prose code,
[data-theme="light"] .cl-prose kbd,
[data-theme="light"] .cl-prose samp,
[data-theme="light"] .cl-prose var,
[data-theme="light"] .cl-prose pre {
    background: var(--cl-glass-bg);
}

/* Das Aufzaehlungszeichen. Im Hellen ist --cl-gold ein dunkles Ocker und bei
   3px Glyphengroesse kaum von Schwarz zu unterscheiden; --cl-gold-dark traegt
   dort mehr Saettigung. */
[data-theme="light"] .cl-prose li::marker {
    color: var(--cl-gold-dark);
}


/* ============================================================================
   LERNBEREICH, PAKET 2 — DAS GESPRAECH, DIE ANKUENDIGUNG, DAS KAPITELENDE
   (09.09.2026)

   WOGEGEN. Die Kapitelansicht hatte drei Luecken, und alle drei waren
   Fuehrung und nicht Funktion:

     1. DER DIALOG SAH AUS WIE EINE LISTE. Jede Zeile trug ihren Avatar und
        ihren Namen, auch die vierte derselben Figur hintereinander; der Text
        stand in einem Rechteck mit gleichmaessig runden Ecken, das nichts
        darueber sagte, von welcher Seite es kommt. Die DATEN waren
        vollstaendig da — der Server loest Figur, Ausdruck und Seite auf und
        liefert Bild, Alt-Text, Buchstabe und Farbe fertig. Es fehlte
        ausschliesslich die Anmutung.

     2. DIE SPERRE KAM UNANGEKUENDIGT. Ueber der Frage stand "Wissens-Tor" und
        sonst nichts.

     3. DAS KAPITEL ENDETE IM NICHTS. Eine Zeile "Zurueck zu Lernen", und die
        zeigte auf den Verteiler statt auf das Modul.

   ALLES HIER LAEUFT UEBER MARKEN. Im Bauteil standen rgba(200,160,0,.2),
   #f5f5f5 und rgba(255,255,255,.08) als style-Attribute — sie gingen die
   Hell-Umschaltung nicht mit, dieselbe Bauform wie bei den Kaesten in Paket 1.
   ============================================================================ */

/* ── DAS GESPRAECH ────────────────────────────────────────────────────────── */

/* DIE ZEILE. align-items:flex-end setzt die Blase auf die Standlinie der
   Figur — sie steht neben ihr und nicht ueber ihr.

   DER TAKT: 1.1rem OBEN, .45rem UNTEN. Der obere Abstand faellt mit dem
   unteren des Vorgaengers zusammen (Randzusammenfall unter Geschwistern), also
   ergibt Prosa -> Gespraech 1.25rem und Gespraech -> Gespraech .45rem. Ein
   Gespraech laeuft schneller als ein Absatz, und das soll man sehen, ohne es
   zu bemerken. */
.cl-dialog {
    display: flex;
    align-items: flex-end;
    gap: .6rem;
    margin: 1.1rem 0 .45rem 0;
}

.cl-dialog--rechts {
    flex-direction: row-reverse;
}

/* 09.09.2026 (Paket 3) — UND DER ANFANG EINER FOLGE AUCH.

   :not(.cl-dialog) + .cl-dialog heisst „davor stand keine Sprechzeile" — also
   der EINSTIEG ins Gespraech. Ausdruecklich NICHT :not(.cl-dialog--folge):
   ein Sprecherwechsel mitten im Gespraech (Arnie -> Saphir) ist keine
   Folge-Replik, aber auch kein Szenenwechsel; er bleibt bei .45rem.

   Weil benachbarte Aussenabstaende zusammenfallen und der GROESSERE gewinnt,
   ergibt das genau einmal 2rem und nicht 1.25 + 2. */
:not(.cl-dialog) + .cl-dialog {
    margin-top: var(--cl-szenenabstand);
}

/* 09.09.2026 (Paket 2b/3) — DIE LETZTE ZEILE EINER FOLGE BEKOMMT DEN
   SZENENABSTAND.

   Paket 2b hat hier den BLOCKABSTAND gesetzt und damit die eine fehlende
   Richtung geschlossen. Er war messbar zu knapp: eine Dialogfolge ist ein
   Szenenwechsel und nicht der Uebergang zwischen zwei Absaetzen. Der Wert ist
   jetzt --cl-szenenabstand, symmetrisch zur Regel darueber.

   BEFUND: der Takt oben ist fuer BLASE-ZU-BLASE gebaut (.45rem). Er galt aber
   auch fuer die letzte Blase vor einem Textblock — und der Fliesstext klebte
   an der Sprechblase. Die Gegenrichtung stimmte schon: der obere Abstand der
   ersten Blase (1.1rem) faellt mit dem unteren des Vorgaengers zusammen und
   ergibt den Blockabstand. Es fehlte also genau eine Richtung.

   :has(+ .cl-dialog) HEISST „es folgt noch eine Zeile". Die Regel benennt
   damit den Sachverhalt selbst, statt ihn ueber den Nachfolger zu erschlagen:
   ein margin-top am folgenden Element waere von jedem inline gesetzten
   margin-Kurzformat ueberstimmt worden (ImageBlockView schreibt
   margin:0 0 1.25rem 0, und das setzt margin-top ausdruecklich auf 0).

   FEHLT :has (sehr alter Browser), bleibt der Abstand bei .45rem — enger als
   gewollt, aber nichts bricht. */
.cl-dialog:not(:has(+ .cl-dialog)) {
    margin-bottom: var(--cl-szenenabstand);
}

/* DIE FOLGE-REPLIK. Kein Avatar, kein Name — dafuer buendig unter dem ersten
   Beitrag, und noch enger getaktet.

   DER EINZUG IST DIE FIGURENSPALTE PLUS DER SPALT. Er wird gerechnet und
   nicht abgeschrieben; steht die Figur bei 380 px auf 64 px, wandert der
   Einzug mit (siehe die Medienabfragen an .cl-dialog-figur).

   LINKS UND RECHTS AUSDRUECKLICH GETRENNT: die Zeile dreht ihre Richtung ueber
   flex-direction, und ein logischer Rand (padding-inline-start) dreht dabei
   NICHT mit — er bliebe links und schoebe die rechte Blase von der falschen
   Seite. */
.cl-dialog--folge {
    margin-top: 0;
    margin-bottom: .3rem;
    padding-left: calc(var(--cl-dialog-figur) + .6rem);
}
.cl-dialog--rechts.cl-dialog--folge {
    padding-left: 0;
    padding-right: calc(var(--cl-dialog-figur) + .6rem);
}

.cl-dialog__spalte {
    min-width: 0;
}
/* Rechts steht die Blase am rechten Rand ihrer Spalte, sonst klebt sie in der
   Mitte und die Seite ist nicht mehr abzulesen. */
.cl-dialog--rechts .cl-dialog__spalte {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
}

.cl-dialog__name {
    text-transform: uppercase;
    font-size: .72rem;
    font-weight: 700;
    letter-spacing: .06em;
    color: var(--cl-gold);
    margin-bottom: .2rem;
}

/* DIE SPRECHBLASE.

   DIE ZUR FIGUR ZEIGENDE ECKE BLEIBT SPITZ. Das ist der ganze Unterschied
   zwischen einem Kasten und einer Sprechblase: die eine abgeflachte Ecke sagt,
   woher die Zeile kommt, und macht die Seite lesbar, ohne dass der Blick zum
   Bild wandern muss. 4px statt 0 — eine mathematisch spitze Ecke wirkt neben
   drei runden wie ein Fehler. */
.cl-dialog__blase {
    max-width: var(--cl-dialog-blase);
    padding: .6rem .9rem;
    color: var(--cl-text);
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-gold-border-dim);
    border-radius: var(--cl-radius-lg);
}
.cl-dialog:not(.cl-dialog--rechts) .cl-dialog__blase {
    border-bottom-left-radius: 4px;
}
.cl-dialog--rechts .cl-dialog__blase {
    /* Die rechte Blase steht etwas kraeftiger — sie ist im Gespraech die
       antwortende Seite, und der Unterschied war schon vorher da
       (rgba(255,255,255,.08) gegen .05). Jetzt als Marke. */
    background: var(--cl-glass-hover);
    border-bottom-right-radius: 4px;
}

/* EINE FOLGE-REPLIK ZEIGT AUF NIEMANDEN. Die Figur steht drei Zeilen hoeher;
   eine spitze Ecke wuerde auf leeren Platz deuten. Deshalb rundum rund — und
   genau daran ist im Vorbeilesen zu erkennen, dass es dieselbe Stimme ist. */
.cl-dialog--folge .cl-dialog__blase {
    border-radius: var(--cl-radius-lg);
}

.cl-dialog__ueberschrift {
    font-weight: 600;
    margin-bottom: .25rem;
}

/* IN DER BLASE GILT DIE BLASENBREITE, nicht die Lesebreite. Die 68ch aus
   Paket 1 sind fuer einen Absatz gedacht; in einer Sprechblase waeren sie eine
   zweite Grenze, die mit der ersten streitet. */
.cl-dialog__blase .cl-prose {
    max-width: none;
    font-size: .93rem;
    line-height: 1.6;
}

/* ── DIE ANGEKUENDIGTE SPERRE ─────────────────────────────────────────────── */

/* RUHIG UND KLEIN. Kein zweiter Rahmen, keine Warnfarbe: der Kasten der Frage
   traegt bereits den Goldrahmen, und eine zweite Auszeichnung machte aus einem
   Hinweis eine Warnung. */
.cl-frage-ankuendigung {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: .5rem;
    margin-bottom: .75rem;
    font-size: .82rem;
    color: var(--cl-text-muted);
}

/* DER XP-WERT IST DIE ZUGABE, nicht die Nachricht — deshalb steht er hinten
   und in der zurueckgenommenen Stufe. Gold, weil XP im ganzen Client gold
   sind; klein, damit daraus kein Versprechen wird. */
.cl-frage-ankuendigung__xp {
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .04em;
    color: var(--cl-gold);
    white-space: nowrap;
}

/* ── DAS KAPITELENDE ──────────────────────────────────────────────────────── */

.cl-kapitelende {
    margin-top: 2.5rem;
    padding-top: 1.25rem;
    border-top: 1px solid var(--cl-glass-border);
}

/* 09.09.2026 (Paket 2b) — HIER STANDEN DIE REGELN DER ZWEITEN KARTE
   (.cl-kapitelende__weiter/__marke/__titel/__koeder/__pfeil/__abschluss).

   Die Karte ist entfallen: sie hing am SEITENENDE und nicht am ZUSTAND und
   fuehrte deshalb auch dann ins naechste Kapitel, wenn eine Sperre noch offen
   war — ein Loch im Gating, kein Schoenheitsfehler. Bei einem abgeschlossenen
   Kapitel war sie ausserdem die zweite Karte mit demselben Ziel.

   Der KOEDER war der gute Teil davon und steht jetzt in der Abschlusskarte
   (.cl-abschluss__koeder, weiter unten). Am Kapitelende bleibt der Ausstieg.

   Die Regeln sind GELOESCHT und nicht auskommentiert: eine Regel, die niemand
   mehr benutzt, ist beim naechsten Lesen ein Angebot. */

/* DER AUSSTIEG. Er steht UNTER dem Weg weiter und nicht daneben: nebeneinander
   waeren es zwei gleichwertige Angebote, und das sind sie nicht. */
.cl-kapitelende__ausstieg {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: .4rem;
    margin-top: 1rem;
    font-size: .85rem;
}
.cl-kapitelende__ausstieg a {
    color: var(--cl-gold-light);
    text-decoration: none;
}
.cl-kapitelende__ausstieg a:hover,
.cl-kapitelende__ausstieg a:focus-visible {
    text-decoration: underline;
    text-underline-offset: .18em;
}


/* ============================================================================
   LERNBEREICH, PAKET 2b (09.09.2026)
   ============================================================================ */

/* DER KOEDER IN DER ABSCHLUSSKARTE — der Excerpt des naechsten Kapitels,
   zwischen dem Modulstand und dem Weiter-Knopf.

   ER STAND BIS HEUTE IN EINER ZWEITEN KARTE darunter. Jetzt traegt ihn die
   Karte, die ohnehin dorthin fuehrt: eine Karte, ein Ziel.

   ZWEI ZEILEN, nicht mehr. Laenger wird er zur Zusammenfassung und nimmt dem
   naechsten Kapitel den Anlass. Die Karte ist zentriert (text-align aus ihrem
   style-Attribut), deshalb bekommt der Absatz eine eigene Breite und eine
   Mitte — sonst laeuft er ueber die ganze Karte und liest sich als Fliesstext
   statt als Anreisser. */
.cl-abschluss__koeder {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    max-width: 34rem;
    margin: .9rem auto 0 auto;
    font-size: .88rem;
    line-height: 1.5;
    color: var(--cl-text-muted);
}



/* ============================================================================
   LERNBEREICH, PAKET 3 — DIE AUFZAEHLUNG (09.09.2026)

   BEFUND: drei Textbloecke ("Erstens: Festhalten", "Zweitens: …",
   "Drittens: …") sind inhaltlich EINE Aufzaehlung. Das Schema konnte das nicht
   ausdruecken, also zeigte die Darstellung es auch nicht. Der Abstands-Trick
   aus Paket 2b (betitelte Absaetze ruecken zusammen) war das Beste, was ohne
   Angabe ging — er las sich nicht als Gruppe und griff auch bei Abschnitten,
   die nichts miteinander zu tun haben.

   SEIT FASSUNG 5 TRAEGT DER BLOCK EINE KENNUNG (`gruppe`). Der PLATZ darin
   wird abgeleitet, nicht mitgegeben — die Zaehlung steht damit an EINER
   Stelle, der Position. Dieselbe Entscheidung wie bei der Kapitelnummer.

   DIE ZIFFER HAENGT LINKS AUSSERHALB DES TEXTES. Das ist die Form, die eine
   Aufzaehlung von einer Folge von Abschnitten unterscheidet: der Text bekommt
   eine gemeinsame Fluchtlinie, und die Zahlen stehen davor in der Rinne. Ein
   Rahmen oder eine Flaeche waere lauter und saegte nichts dazu.
   ============================================================================ */

/* DER EINZUG GILT FUER DEN GANZEN BLOCK, nicht nur fuer den ersten Absatz:
   Titel, Fliesstext und alles Weitere stehen auf derselben Fluchtlinie, und
   die Ziffer steht davor. position:relative ist der Bezug fuer sie. */
.cl-aufzaehlung {
    position: relative;
    padding-left: var(--cl-aufzaehlung-spalte);
}

/* DIE ZIFFER. Gold, weil sie zaehlt und nicht spricht — dieselbe Rolle wie das
   Aufzaehlungszeichen im Fliesstext, nur eine Stufe lauter, weil sie hier die
   Information traegt, die vorher im Titel stand.

   line-height 1.35 ist die der Kastentitelzeile: so sitzt die Ziffer auf
   derselben Grundlinie wie der Titel daneben und nicht darueber. Traegt ein
   Glied ausnahmsweise keinen Titel, sitzt sie auf der ersten Textzeile —
   deren Zeilenhoehe (1.7) ist groesser, die Ziffer steht dann etwas hoeher.
   Das ist hingenommen: ein Glied ohne Titel ist der Ausnahmefall, und eine
   zweite Regel dafuer waere eine zweite Wahrheit ueber dieselbe Zahl. */
.cl-aufzaehlung__ziffer {
    position: absolute;
    left: 0;
    top: 0;
    width: var(--cl-aufzaehlung-spalte);
    padding-right: .6rem;
    text-align: right;
    font-size: 1.1rem;
    font-weight: 700;
    line-height: 1.35;
    color: var(--cl-gold);
    font-variant-numeric: tabular-nums;
}

/* DER TAKT INNERHALB DER FOLGE. Die Glieder gehoeren zusammen und stehen
   deshalb enger als zwei beliebige Bloecke — derselbe Wert wie in Paket 2b
   (.7rem), nur jetzt an der Angabe festgemacht statt an der Nachbarschaft
   zweier betitelter Absaetze.

   Das LETZTE Glied behaelt den vollen Blockabstand: nach unten endet die
   Folge, und dort gehoert die Luft wieder hin. */
.cl-aufzaehlung:not(.cl-aufzaehlung--letztes) {
    margin-bottom: .7rem;
}

/* Und vor dem ERSTEN Glied steht die Folge ab: sie ist ein eigener Gedanke,
   und der Absatz davor hat ihn angekuendigt ("eine von drei Sachen"). */
.cl-aufzaehlung--erstes {
    margin-top: var(--cl-block-abstand);
}

/* ── SCHMALER SCHIRM: DIE ZIFFER GEHT IN DIE TITELZEILE ─────────────────────

   BEFUND AM GERAET (380 px): eine Rinne kostet Textbreite, und zwar die
   ganze Zeit. Der erste Versuch hat sie nur VERSCHMAELERT (2.4rem -> 1.8rem);
   der Einzug des Textes blieb und die Zeilen blieben kurz. Eine schmalere
   Rinne ist derselbe Fehler in kleiner.

   GEWAEHLT: die Ziffer wandert NEBEN DEN TITEL, der Text steht darunter ohne
   Einzug. Das kostet KEINE Textbreite — der Absatz laeuft ueber die volle
   Spalte. Und es ist die ehrlichere Zuordnung: die Ziffer beschriftet den
   Titel, nicht den Absatz. Am Schreibtisch bleibt die Rinne, weil dort
   Fluchtlinie und gemeinsamer Rand die Folge auf einen Blick zeigen; auf
   einem Telefon sieht man ohnehin selten zwei Glieder gleichzeitig.

   UEBER EIN GITTER UND NICHT UEBER float: ein float haette den Absatz je nach
   Titellaenge einmal daneben und einmal darunter gesetzt — dieselbe Seite
   saehe bei zwei Gliedern verschieden aus. Das Gitter setzt Ziffer und Titel
   fest in Zeile 1 und alles Weitere ueber beide Spalten.

   OHNE TITEL geht die Ziffer neben das erste, was dasteht (die Regel
   .cl-aufzaehlung__ziffer + *). Ein Glied ohne Titel ist der Ausnahmefall,
   aber eine Ziffer, die allein auf einer Zeile steht, saehe kaputt aus. */
@media (max-width: 400px) {
    .cl-aufzaehlung {
        padding-left: 0;
        display: grid;
        grid-template-columns: auto 1fr;
        column-gap: .45rem;
    }

    /* Vorgabe: alles laeuft ueber beide Spalten … */
    .cl-aufzaehlung > * { grid-column: 1 / -1; }

    /* … ausser der Ziffer und dem, was direkt auf sie folgt. */
    .cl-aufzaehlung > .cl-aufzaehlung__ziffer {
        position: static;
        grid-column: 1;
        grid-row: 1;
        width: auto;
        padding-right: 0;
        text-align: left;
        font-size: 1rem;
    }
    .cl-aufzaehlung > .cl-aufzaehlung__ziffer + * {
        grid-column: 2;
        grid-row: 1;
    }
}

/* ── HIER STAND DER ABSTANDS-TRICK AUS PAKET 2b ────────────────────────────
   Er hat betitelte Textbloecke zusammengerueckt, die unmittelbar
   aufeinanderfolgen — ohne Angabe war das die einzige ehrliche Moeglichkeit.
   Seit es die Kennung gibt, ist er ersetzt: er griff auch bei Abschnitten,
   die nichts miteinander zu tun haben, und genau das war sein Preis.
   Die Regel ist GELOESCHT und nicht auskommentiert — eine Regel, die niemand
   mehr benutzt, ist beim naechsten Lesen ein Angebot. */


/* ============================================================================
   KAPITEL-EDITOR — DIE AUFZAEHLUNG IN DER BLOCKLISTE (09.09.2026)

   Dieselbe Klammer, die der Leser als Ziffernspalte sieht, hier als Marke am
   linken Rand der Blockkarte: oben faengt sie an, unten hoert sie auf,
   dazwischen laeuft sie durch. Ohne Text — in einer Liste aus zugeklappten
   Karten ist kein Platz dafuer, und die Nummer steht ohnehin in der Kopfzeile.

   GOLD wie die Ziffer im Kapitel. Eine eigene Farbe waere ein sechster Ton
   ohne Bedeutung.
   ============================================================================ */

.cl-editor-folge {
    position: relative;
    /* Die Marke sitzt im Rand der Karte; ohne diesen Platz laege sie auf dem
       Text der Kopfzeile. */
    padding-left: 4px;
}

.cl-editor-folge::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 3px;
    background: var(--cl-gold);
}

/* DIE ENDEN SIND RUND, DIE MITTE NICHT. So sieht man an einer einzelnen Karte,
   ob sie die Folge beginnt, fortsetzt oder schliesst — auch dann, wenn die
   Nachbarkarte gerade ausserhalb des Sichtfelds liegt.

   Der Abstand nach aussen (top/bottom) zieht die Marke ueber den Rand der
   Karte hinaus nicht hinaus: die Karten stehen .4rem auseinander, und eine
   durchgezogene Linie ueber die Luecke waere ein Element, das zu keiner Karte
   gehoert. */
.cl-editor-folge--erstes::before {
    top: 6px;
    border-top-left-radius: 2px;
    border-top-right-radius: 2px;
}
.cl-editor-folge--letztes::before {
    bottom: 6px;
    border-bottom-left-radius: 2px;
    border-bottom-right-radius: 2px;
}

/* DIE NUMMER IN DER KOPFZEILE. „2/3" — die Laenge sagt, ob die Folge
   vollstaendig ist; in einer Liste steht kein Kontext daneben. */
.cl-editor-folge__nummer {
    flex: 0 0 auto;
    font-size: .72rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    color: var(--cl-gold);
    white-space: nowrap;
}


/* Die Adresszeile im Medienfeld, wenn es KEIN Bild ist (Video, Datei).
   Kein <img>: eine .mp4 als Bild zu laden ergibt ein kaputtes Bild und sagt
   nichts. Die Adresse selbst ist hier die Auskunft. */
.cl-medienfeld__adresse {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .45rem .6rem;
    font-size: .8rem;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
}
.cl-medienfeld__adresse > .bi { color: var(--cl-gold); flex: 0 0 auto; }


/* ============================================================================
   LERNMODULE — DIE UEBERSICHT (09.09.2026)

   BEFUND: /lernen/module trug vier Bloecke mit derselben Fuellung, demselben
   Radius und demselben Rahmen — Weitermachen-Band, Kennzahlenkarte,
   Modulkarten, Einzelne Kapitel. Man sah nicht, was Handlung, was Zustand und
   was Inhalt ist.

   DREI EBENEN STATT VIER GLEICHER KARTEN:
     HANDLUNG  genau eine, und sie traegt Gold (das Weitermachen-Band).
     INHALT    die Module. Ueberschrift, Karten, das meiste Gewicht.
     NACHSCHLAG die Zahlen. Ganz unten, ohne Karte, unter einem Strich.
   ============================================================================ */

/* ── DIE MODULKARTE ─────────────────────────────────────────────────────── */

.cl-modulkarte {
    padding: 1.25rem;
    margin-bottom: 1rem;
}

.cl-modulkarte__kopf {
    display: flex;
    align-items: flex-start;
    gap: 1rem;
}

/* DER TEXTTEIL DER KARTE: Titel, Beschreibung, Zahlen, Umschalter. */
.cl-modulkarte__text {
    flex: 1 1 auto;
    min-width: 0;
}

/* DER TITEL IST EIN LINK auf die Modulseite (09.09.2026) — und er sieht nicht
   danach aus. Ein blau unterstrichener Modultitel in einer Karte waere lauter
   als der Knopf daneben; die Karte hat bereits eine Handlung. Erst beim
   Ueberfahren zeigt er, dass er einer ist. */
.cl-modulkarte__titel {
    color: #fff;
    text-decoration: none;
}
.cl-modulkarte__titel:hover,
.cl-modulkarte__titel:focus-visible {
    color: var(--cl-gold-light);
    text-decoration: underline;
    text-underline-offset: .18em;
}

/* DER UMSCHALTER KLAPPT AUF — mehr nicht. Ein <button> ohne Knopfaussehen: er
   traegt keine Fuellung und keinen Rahmen, damit die Karte nicht aussieht wie
   ein Knopf in einem Knopf. Was er tut, sagt der Pfeil darin.

   Er umfasste bis zur Modulseite die ganze Kopfzeile samt Titel. Seit der
   Titel ein LINK ist, kann er nicht mehr darin liegen (ein <a> in einem
   <button> ist ungueltiges Markup) — der Umschalter ist damit die Zeile
   darunter.

   text-align:left und die Schriftvererbung sind noetig, weil ein <button>
   beides von sich aus anders macht. */
.cl-modulkarte__umschalter {
    display: block;
    width: 100%;
    text-align: left;
    margin-top: .35rem;
    background: none;
    border: 0;
    padding: 0;
    margin: 0;
    color: inherit;
    font: inherit;
    cursor: pointer;
}
.cl-modulkarte__umschalter:focus-visible {
    outline: 2px solid var(--cl-gold-border);
    outline-offset: 4px;
    border-radius: var(--cl-radius);
}

/* DER PFEIL SAGT, DASS SICH ETWAS AUFKLAPPT — und er ist kein zweiter Knopf.
   Er steht in derselben Zeile wie die Zahlen, weil er zu ihnen gehoert: beides
   ist Auskunft ueber das Modul, nicht Handlung. */
.cl-modulkarte__pfeil {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    font-size: .78rem;
    color: var(--cl-gold-light);
    white-space: nowrap;
}
.cl-modulkarte__umschalter:hover .cl-modulkarte__pfeil { color: var(--cl-gold); }

/* DIE EINE HANDLUNG. Sie steht AUSSERHALB des Umschalters — ein <a> in einem
   <button> waere ungueltiges Markup, und ein Klick loeste beides aus. */
.cl-modulkarte__aktion {
    flex: 0 0 auto;
    display: flex;
    align-items: flex-start;
}

/* Am Telefon steht der Knopf unter der Kopfzeile statt daneben: nebeneinander
   bliebe fuer den Modultitel keine Zeile mehr uebrig. */
@media (max-width: 560px) {
    .cl-modulkarte__kopf { flex-direction: column; gap: .75rem; }
    .cl-modulkarte__aktion { width: 100%; }
    .cl-modulkarte__aktion > * { width: 100%; text-align: center; }
}

/* ── DIE ZAHLEN, GANZ UNTEN ─────────────────────────────────────────────────
   KEINE KARTE. Eine Karte hebt hervor; diese Zahlen sollen nicht hervorstechen,
   sie sollen dastehen. Der Strich darueber trennt sie vom Inhalt, ohne sie
   einzurahmen. */
.cl-lernzahlen {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: .4rem .6rem;
    margin-top: 2rem;
    padding-top: .9rem;
    border-top: 1px solid var(--cl-glass-border);
    font-size: .82rem;
    color: var(--cl-text-muted);
}

/* Die ZAHL traegt das Gewicht, das Wort daneben nicht — so ist die Zeile im
   Vorbeisehen lesbar, ohne dass sie um Aufmerksamkeit bittet. */
.cl-lernzahlen strong {
    color: var(--cl-text);
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}


/* ============================================================================
   DIE NEBENZEILE (09.09.2026)

   Auf /lernen/module traegt das goldene Band, wo der Leser im STOFF
   weitermacht. Was sonst noch dran ist — faellige Karten, die Dauer des
   Kapitels — steht DARUNTER als schmale Zeile: es gehoert dazu, aber es ist
   nicht die Ueberschrift.

   WARUM NICHT IM BAND: das Band ist EIN Link. Ein zweites Ziel darin waere
   lesbar, aber nicht treffbar.
   ============================================================================ */

.cl-nebenzeile {
    display: flex;
    align-items: center;
    gap: .5rem;
    margin: -.75rem 0 1.25rem;
    padding: .45rem .75rem;
    font-size: .82rem;
    color: var(--cl-text-muted);
    text-decoration: none;
    border-radius: var(--cl-radius);
}

/* Der negative obere Abstand zieht sie an das Band heran: sie gehoert dazu,
   und zwischen beiden soll keine Luecke stehen, die sie zu einem eigenen
   Block macht. */

a.cl-nebenzeile:hover,
a.cl-nebenzeile:focus-visible {
    background: var(--cl-glass-bg);
    color: var(--cl-text);
}
.cl-nebenzeile > span { flex: 1 1 auto; }
.cl-nebenzeile > .bi:first-child { color: var(--cl-gold); }

/* IST KEIN KAPITEL OFFEN, ist diese Zeile das Einzige, was dran ist — dann
   traegt SIE das Gold, und zwar als Flaeche. Es gibt dann kein Band darueber,
   dem sie es wegnehmen koennte. */
.cl-nebenzeile--betont {
    margin-top: 0;
    background: var(--cl-gold-glow);
    border: 1px solid var(--cl-gold-border);
    color: var(--cl-text);
    font-size: .88rem;
    padding: .7rem 1rem;
}

/* ============================================================================
   DIE DREI BEREICHSKACHELN AUF /lernen (09.09.2026)

   Der Held ist entfallen; jede Kachel traegt ihren eigenen Stand. GENAU EINE
   traegt Gold — die, in der der Leser gerade steckt (LernheldRegel).
   ============================================================================ */

.cl-bereiche {
    display: grid;
    gap: .75rem;
    grid-template-columns: 1fr;
}

/* Ab Tablet nebeneinander: drei Bereiche sind eine Wahl, und eine Wahl liest
   man nebeneinander schneller als untereinander. */
@media (min-width: 768px) {
    .cl-bereiche { grid-template-columns: repeat(3, 1fr); }
}

.cl-bereich-karte {
    display: flex;
    flex-direction: column;
    gap: .5rem;
    padding: 1.1rem 1.25rem;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius-lg);
}

/* DIE EINE KACHEL MIT GOLD. Nur der Rahmen und ein Hauch Flaeche — die
   Fuellung gehoert dem Knopf darin, sonst streiten zwei goldene Flaechen in
   derselben Karte. */
.cl-bereich-karte--betont {
    background: var(--cl-gold-glow);
    border-color: var(--cl-gold-border);
}

.cl-bereich-karte__kopf {
    display: flex;
    align-items: center;
    gap: .5rem;
}
.cl-bereich-karte__kopf > .bi {
    font-size: 1.1rem;
    color: var(--cl-gold);
}
.cl-bereich-karte__kopf > h2 {
    margin: 0;
    font-size: 1rem;
    font-weight: 700;
    color: var(--cl-text);
}

.cl-bereich-karte__stand {
    flex: 1 1 auto;
    margin: 0;
    font-size: .85rem;
    line-height: 1.45;
    color: var(--cl-text-muted);
}

/* DER BALKEN — nur bei den Lernmodulen. Er zeigt dieselbe Groesse wie „3 von
   7 Kapiteln", aber als Laenge; nebeneinander liest man das eine im
   Vorbeisehen und das andere genau. Eine PROZENTZAHL steht daneben
   ausdruecklich nicht (siehe KapitelZeile). */
.cl-bereich-karte__balken {
    height: 4px;
    border-radius: 2px;
    background: var(--cl-glass-border);
    overflow: hidden;
}
.cl-bereich-karte__balken > div {
    height: 100%;
    background: var(--cl-gold);
    transition: width var(--cl-duration-slow) var(--cl-ease);
}

.cl-bereich-karte__knopf {
    align-self: flex-start;
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    padding: 7px 16px;
    font-size: .82rem;
    text-decoration: none;
    white-space: nowrap;
}


/* ============================================================================
   DIE FEHLERBILDSEITE /training/sitzproblem (09.09.2026)

   Nur die Teile, die es vorher gar nicht gab. Die LESETYPOGRAFIE steht NICHT
   hier: die drei Absaetze tragen .cl-prose, also dieselbe Klasse wie der
   Kapiteltext — Groesse, Zeilenhoehe und --cl-lesebreite kommen von dort. Eine
   eigene Regel daneben waere genau die dritte Breite, die dieser Bau abschafft.
   ============================================================================ */

/* Die drei Abschnittskoepfe. Eine Klasse statt dreier gleicher style-Kopien;
   bewusst klein — sie ordnen den Text, sie rufen nicht. */
.cl-fb-kopf {
    margin: 0 0 .35rem;
    font-size: 1rem;
    font-weight: 700;
    color: var(--cl-text);
}

/* Der Abstand nach unten gehoert dem ABSCHNITT und nicht .cl-prose: die Klasse
   beschreibt Text, nicht seine Stellung auf der Seite. */
.cl-fb-absatz { margin-bottom: 1rem; }

/* ── DER TITEL DER SEITE (10.09.2026) ─────────────────────────────────────

   WOGEGEN. Der Problemname stand in 1.2rem — kaum groesser als die
   Abschnittskoepfe darunter und kleiner als die Ueberschrift der Suche
   darueber. Er ist der Gegenstand der Seite und sah aus wie eine
   Zwischenzeile.

   DIE VORZEILE ORDNET EIN, SIE RUFT NICHT: klein, gesperrt, leise. Sie sagt,
   was fuer ein Ding das ist — ohne dem Namen die Aufmerksamkeit zu nehmen. */

.cl-fb-titel {
    margin: 0 0 1.25rem;
}

.cl-fb-titel__art {
    margin: 0 0 .1rem;
    font-size: .72rem;
    font-weight: 600;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--cl-text-muted);
}

.cl-fb-titel__name {
    margin: 0;
    font-size: 1.75rem;
    font-weight: 700;
    line-height: 1.2;
    color: var(--cl-text);
}

/* Am Telefon eine Stufe kleiner: 1.75rem auf 380px sind bei einem langen
   Namen ("Geworfen werden beim Aussitzen") drei Zeilen, und drei Zeilen
   Titel druecken den Wiedererkennungssatz unter die Falz. */
@media (max-width: 639.98px) {
    .cl-fb-titel__name { font-size: 1.45rem; }
}

/* ── DIE DREI ROLLEN (10.09.2026) ─────────────────────────────────────────

   Dasselbe Prinzip wie Merksatz, Zusammenfassung und Fehlerbox im Kapitel:
   die ROLLE bestimmt die Form. Die Grundklasse traegt nur den Abstand — jede
   Auszeichnung steht in ihrem Modifikator, und die Erklaerung in der Mitte
   bekommt keinen. Traegt jede eine, traegt keine mehr eine. */

.cl-fb-rolle {
    margin-bottom: 1.25rem;
}

.cl-fb-rolle > .cl-prose {
    margin: 0;
}

/* WORAN DU ES MERKST — der Wiedererkennungssatz.

   FLAECHE UND GROESSE STATT FARBE. Gold gehoert der Handlung (die zwei Wege
   weiter unten), der Warnton dem Vorbehalt darueber; eine dritte Farbe hier
   waere eine Aussage, die dieser Abschnitt nicht macht. Er sagt nur: das ist
   es, was du merkst. */
.cl-fb-rolle--merkmal {
    padding: 1rem 1.15rem;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius-lg);
}

.cl-fb-rolle--merkmal > .cl-prose {
    font-size: 1.05rem;
    line-height: 1.6;
}

.cl-fb-rolle--merkmal > .cl-fb-kopf > .bi {
    margin-right: .3rem;
    color: var(--cl-gold);
}

/* WAS ES BEWIRKT — die Konsequenz.

   DIESELBE FARBE WIE DIE PROBLEMKARTE AUF /uebungen: dasselbe Ding traegt auf
   beiden Seiten dieselbe Farbe. Nur die Kante, keine Flaeche — zwei
   ausgezeichnete Flaechen in drei Abschnitten waeren wieder das, wogegen die
   Aufteilung gebaut ist. */
.cl-fb-rolle--folge {
    padding-left: .9rem;
    border-left: 3px solid var(--cl-bereich-training);
}

.cl-fb-rolle--folge > .cl-fb-kopf {
    color: var(--cl-bereich-training);
}

/* ── DIE GESCHRUMPFTE SUCHZEILE ──────────────────────────────────────────
   Rueckweg links, Aufklappen rechts, eine Zeile. */
.cl-fb-kopfzeile {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
    font-size: .85rem;
    margin-bottom: .25rem;
}
.cl-fb-kopfzeile > a { text-decoration: none; }

.cl-fb-suchknopf {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    padding: 4px 12px;
    font-size: .82rem;
    color: var(--cl-text-muted);
    background: none;
    border: 1px solid var(--cl-glass-border);
    border-radius: 999px;
    cursor: pointer;
}
.cl-fb-suchknopf:hover,
.cl-fb-suchknopf:focus-visible {
    color: var(--cl-text);
    border-color: var(--cl-gold-border);
}

/* ── DIE ZWEI WEGE ───────────────────────────────────────────────────────

   GLEICHRANGIG HEISST GLEICH GROSS: dieselbe Flaeche, derselbe Rahmen, kein
   Gold auf einem von beiden. Die Reihenfolge (Verstehen vor Ueben) sagt schon
   genug; eine goldene Fuellung wuerde die Wahl treffen, die der Leser treffen
   soll.

   EIN <a> UND EIN <button> IN DERSELBEN KLASSE. Der eine fuehrt auf ein
   Kapitel, der andere legt einen Plan an — verschiedene Elemente, weil es
   verschiedene Dinge sind. Sie muessen trotzdem gleich aussehen, deshalb
   stehen hier die Ruecknahmen, die ein button mitbringt (Schriftart, Rand,
   Textausrichtung). */
.cl-fb-wege {
    display: grid;
    gap: .75rem;
    grid-template-columns: 1fr;
    margin: 1.25rem 0;
}

@media (min-width: 640px) {
    .cl-fb-wege { grid-template-columns: repeat(2, 1fr); }
}

.cl-fb-weg {
    display: flex;
    flex-direction: column;
    gap: .3rem;
    width: 100%;
    padding: 1rem 1.15rem;
    text-align: left;
    font: inherit;
    color: var(--cl-text);
    text-decoration: none;
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius-lg);
    cursor: pointer;
}
.cl-fb-weg:hover,
.cl-fb-weg:focus-visible {
    border-color: var(--cl-gold-border);
    background: var(--cl-gold-glow);
}
.cl-fb-weg:disabled { opacity: .55; cursor: default; }

/* Der Akzent liegt auf dem Zeichen -- das ist alles Gold, was diese zwei
   Karten bekommen. */
.cl-fb-weg__kopf {
    font-weight: 700;
    font-size: .95rem;
}
.cl-fb-weg__kopf > .bi {
    margin-right: .3rem;
    color: var(--cl-gold);
}

/* WOHIN es geht: der Kapiteltitel bzw. die Zahl der Uebungen. Zwei Zeilen
   duerfen es sein -- ein Kapiteltitel ist laenger als ein Knopfwort. */
.cl-fb-weg__ziel {
    font-size: .85rem;
    color: var(--cl-text-muted);
    line-height: 1.4;
}

.cl-fb-weg__tat {
    margin-top: .35rem;
    font-size: .82rem;
    font-weight: 600;
    color: var(--cl-gold-light);
}
.cl-fb-weg__tat > .bi { font-size: .75rem; }

/* ── EINE ZEILE JE UEBUNG BZW. KAPITEL ───────────────────────────────────

   GEKUERZT WIRD DIE ANZEIGE, NICHT DIE AUSKUNFT: der Zweck steht vollstaendig
   im Markup und wird auf eine Zeile beschnitten. Wer die Seite vorliest oder
   durchsucht, bekommt weiterhin den ganzen Satz. */
.cl-fb-zeile {
    display: block;
    padding: .6rem 1rem;
    border-bottom: 1px solid var(--cl-glass-border);
    color: inherit;
    text-decoration: none;
}
.cl-fb-zeile:last-child { border-bottom: none; }

/* SEIT 09.09.2026 SIND BEIDE ZEILENARTEN LINKS -- die Uebung auf ihre
   Detailseite, das Kapitel auf seine. Hier stand vorher die Begruendung, warum
   die Uebungszeile KEINE war: dem Reiter wurde zu einer Uebung keine Kennung
   geliefert. Sie wird jetzt geliefert (als Ziel, nicht als Text). */
.cl-fb-zeile--link:hover,
.cl-fb-zeile--link:focus-visible { background: var(--cl-glass-bg); }

.cl-fb-zeile__titel { font-weight: 600; }

/* Der Pfeil steht rechts vom Titel und nicht am Zeilenende: die Zeile ist
   mehrzeilig, und ein rechtsbuendiger Pfeil haenge dann neben der Mitte. */
.cl-fb-zeile__pfeil {
    font-size: .75rem;
    margin-left: .3rem;
    color: var(--cl-gold);
}

/* ORT UND ART. Leise (cl-chip--muted) und nicht in Gold: sie ordnen ein, sie
   werben nicht. Mehr als diese zwei stehen hier nicht -- Dauer und
   Schwierigkeit gehoeren auf die Uebungsseite. */
.cl-fb-zeile__marken {
    display: flex;
    flex-wrap: wrap;
    gap: .3rem;
    margin-top: .3rem;
}

.cl-fb-zeile__zweck {
    display: -webkit-box;
    -webkit-line-clamp: 1;
    line-clamp: 1;
    -webkit-box-orient: vertical;
    overflow: hidden;
    margin-top: .1rem;
    font-size: .8rem;
    line-height: 1.45;
    color: var(--cl-text-muted);
}


/* ============================================================================
   DIE PROBLEMKARTE AUF /uebungen (09.09.2026)

   WOGEGEN. Problem und Uebung sassen beide auf .cl-card-glass — gleiche
   Fuellung, gleicher Radius, gleicher Rahmen. Man sah nicht, welche Art Ding
   man anklickt: das eine ist ein Zustand des Reiters ("Runder Ruecken"), das
   andere ein Werkzeug dagegen.

   KEIN KARTENRAHMEN, sondern eine Kante links in der Bereichsfarbe. Damit
   stehen die zwei Arten nebeneinander wie ein Merkzettel und eine Karteikarte
   und nicht wie zwei Karteikarten. --cl-bereich-training und NICHT Gold: Gold
   gehoert der Handlung, und diese Karte ist ein Weg, keine Handlung.

   .cl-sitzproblemkarte BLEIBT WEITER UNTEN STEHEN und ist seit heute
   unbenutzt — sie war die alte Form. Geloescht wird sie nicht in einem Bau,
   der die Form aendert: dann waere im Diff nicht zu trennen, was neu ist und
   was nur verschoben.
   ============================================================================ */

.cl-problemkarte {
    display: flex;
    align-items: center;
    gap: .75rem;
    padding: .6rem .9rem;
    margin-bottom: .4rem;
    border-left: 3px solid var(--cl-bereich-training);
    border-radius: 0 var(--cl-radius) var(--cl-radius) 0;
    background: rgba(255, 255, 255, 0.03);
    color: inherit;
    text-decoration: none;
}

.cl-problemkarte:hover,
.cl-problemkarte:focus-visible {
    background: rgba(255, 255, 255, 0.06);
}

/* min-width:0 ist die Bedingung dafuer, dass das Beschneiden weiter unten
   ueberhaupt greift: ohne sie waechst das Kind ueber die Zeile hinaus, statt
   zu kuerzen. */
.cl-problemkarte__inhalt {
    flex: 1 1 auto;
    min-width: 0;
}

.cl-problemkarte__titel {
    font-weight: 600;
    font-size: .92rem;
    color: var(--cl-text);
}

/* DER SYMPTOMSATZ. Er ist der Grund, warum diese Karte anders aussieht: er
   spricht die Sprache der Suchzeile darueber ("ich neige nach vorne").
   GEKUERZT WIRD DIE ANZEIGE, NICHT DER TEXT — der ganze Satz steht im Markup
   und geht an Vorleseprogramm und Seitensuche vollstaendig. */
.cl-problemkarte__symptom {
    display: -webkit-box;
    -webkit-line-clamp: 1;
    line-clamp: 1;
    -webkit-box-orient: vertical;
    overflow: hidden;
    margin-top: .1rem;
    font-size: .82rem;
    line-height: 1.45;
    color: var(--cl-text-muted);
}

.cl-problemkarte__zahlen {
    margin-top: .15rem;
    font-size: .74rem;
    color: var(--cl-text-subtle, var(--cl-text-muted));
}

.cl-problemkarte > .bi {
    flex: 0 0 auto;
    color: var(--cl-bereich-training);
    font-size: .85rem;
}


/* ============================================================================
   DIE WEBINARSEITEN (10.09.2026, Schritt 2)

   BETRIFFT DREI SEITEN: /webinare (die eigenen Reihen), /webinare/{slug}
   (die Reihenseite, neu) und /webinare/{slug}/unterlagen.

   WOGEGEN DAS HIER STEHT. Die beiden bestehenden Seiten waren auf dem Stand,
   den die Fehlerbild- und die Uebungsseite VOR ihrem Umbau hatten: .cl-page
   sass, .cl-prose fehlte, und die Textgroessen standen als sechzehn einzelne
   style-Angaben im Markup (elf auf /webinare, fuenf auf den Unterlagen) —
   .88rem, .92rem, .85rem, .8rem, 1.05rem, 1.35rem, 2.25rem. Dazu zwei eigene
   Lesebreiten (34rem, 32rem), die es sonst nirgends im Projekt gibt.

   DIE LESETYPOGRAFIE STEHT AUCH HIER NICHT. Fliesstext traegt .cl-prose,
   dieselbe Klasse wie der Kapiteltext und die Fehlerbildseite; Groesse,
   Zeilenhoehe und --cl-lesebreite kommen von dort. Was hier steht, sind die
   Bauteile, die es sonst nirgends gibt: Karte, Zeitachse, Abendkopf.

   DREI GROESSEN, MEHR NICHT:
     1rem     der Name einer Reihe oder eines Abends
     .92rem   die Sachzeile darunter (Termine, Anzahl)
     .8rem    die Beiwerkzeile (Frist, Hinweis)
   Wer eine vierte braucht, braucht in Wahrheit eine andere Anordnung.
   ============================================================================ */

/* ── GEMEINSAME BAUTEILE DER DREI SEITEN ─────────────────────────────────── */

/* Die senkrechte Liste aus Karten. Ersetzt drei gleiche inline-Flexboxen. */
.cl-wb-liste {
    display: flex;
    flex-direction: column;
    gap: .75rem;
}

/* Der Name einer Reihe oder eines Abends. `overflow-wrap` bleibt: Serientitel
   koennen ein langes Wort enthalten, und auf einem Telefon schiebt das sonst
   die ganze Karte auf. */
.cl-wb-name {
    font-weight: 700;
    font-size: 1rem;
    overflow-wrap: anywhere;
}

/* Die Sachzeile: Termine, Anzahl der Abende, Zustand. */
.cl-wb-zeile {
    margin-top: .35rem;
    font-size: .92rem;
}

/* Beiwerk: Zugangsfrist, Hinweise, Leerstand. Immer leiser als die Sachzeile
   und nie Traeger einer Aussage, die man sonst nirgends findet. */
.cl-wb-meta {
    margin-top: .35rem;
    font-size: .8rem;
    color: var(--cl-text-muted);
}

/* Der Leerzustand. Die Breite kam aus zwei verschiedenen inline-Werten
   (34rem fuer den Satz, 32rem fuer die Karten darunter) — es ist EINE Spalte
   und bekommt EIN Mass, und zwar die Lesebreite, die alles andere auch hat. */
.cl-wb-leer {
    text-align: center;
    padding: 2rem;
}

.cl-wb-leer__symbol {
    font-size: 2.25rem;
    color: var(--cl-gold);
}

.cl-wb-leer__titel {
    margin: .75rem 0 .35rem;
    font-size: 1.05rem;
    font-weight: 700;
}

/* Die Spalte im Leerzustand: der Satz und die Reihen darunter stehen
   untereinander in derselben Breite und sind mittig gesetzt. */
.cl-wb-leer__spalte {
    display: flex;
    flex-direction: column;
    gap: .6rem;
    margin: 1.1rem auto 0;
    max-width: var(--cl-lesebreite);
    text-align: left;
}

/* ── DIE REIHENSEITE /webinare/{slug} ────────────────────────────────────

   10.09.2026, ZWEITE FASSUNG — DIE HIERARCHIE.

   WOGEGEN. Die erste Fassung stellte OBEN dasselbe hin wie UNTEN: ein Kasten
   „Naechster Abend" mit Stufe, Titel, Datum und Uhrzeit — und Abend 1 in der
   Liste darunter trug dieselben vier Angaben noch einmal. Ohne gepflegten
   Zugangslink sagte der Kasten nichts, was die Liste nicht auch sagte. Dazu
   vier gleich laute Karten, an dreien davon ein Merkzeichen „geplant"
   (alles, was noch nicht war, ist geplant) und drei Beschriftungen vor jedem
   Titel: roemische Stufe, das Wort „Abend", die Nummer.

   WAS JETZT GILT:
     DER KASTEN OBEN TRAEGT EINE HANDLUNG ODER ER STEHT NICHT DA.
     DIE ABENDE SIND EINE LISTE IN EINER KARTE, nicht vier Karten — dasselbe
       Muster wie der Kapitelpfad auf der Modulseite.
     DIE NUMMER STEHT LINKS ALS ZIFFER, der Titel daneben, die Stufe klein in
       der Sachzeile beim Datum. EINE Beschriftung, nicht drei.
     EIN MERKZEICHEN NUR FUER DAS, WAS ABWEICHT: abgesagt. Der naechste Abend
       traegt keines, sondern die Auszeichnung seiner Zeile.                */

/* ── DER KASTEN OBEN ──────────────────────────────────────────────────────

   Er erscheint NUR mit Zugangslink (die Seite entscheidet das, nicht dieses
   Formular). Dann ist er das Auffaelligste auf der Seite, und er traegt genau
   drei Dinge: dass es der naechste Abend ist, WANN er ist, und den Knopf. Der
   TITEL steht hier nicht — er steht acht Zeilen tiefer in der Liste, und
   zweimal derselbe Satz macht keinen davon wichtiger. */
.cl-wb-hero {
    padding: 1.1rem 1.25rem;
    margin-bottom: 1.5rem;
    border: 1px solid var(--cl-gold-border);
}

.cl-wb-hero__vorzeile {
    margin: 0 0 .2rem;
    font-size: .72rem;
    font-weight: 600;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--cl-text-muted);
}

/* DIE ZEIT IST HIER DIE HAUPTSACHE und deshalb so gross wie sonst nur ein
   Name. Wer die Seite am Abend oeffnet, sucht zwei Dinge: wann, und wo drauf. */
.cl-wb-hero__zeit {
    margin: 0;
    font-size: 1.35rem;
    font-weight: 700;
    line-height: 1.25;
    color: var(--cl-text);
}

/* ── DIE ABENDE: EINE KARTE, ZEILEN DARIN ────────────────────────────────

   Dasselbe Muster wie der Kapitelpfad (ModulSeite + KapitelZeile): ein Kasten
   mit Innenabstand, die Zeilen ziehen ihren eigenen Abstand nach aussen, damit
   die Auszeichnung der aktiven Zeile bis an den Rand des Kastens reicht.

   NICHT UEBERNOMMEN sind die festen Farbwerte der Kapitelzeile: sie stehen
   dort ausgeschrieben (Gold als Flaeche, Weiss fuer den Titel, ein Gruen fuer
   das Haekchen), stammen aus der Zeit vor den Marken und bleiben im hellen
   Schema unveraendert stehen. Hier kommt jede Farbe aus einer Marke.

   Die alten Werte sind hier BEWUSST NICHT ZITIERT: ein Waechter dieses Blocks
   liest die ganze Datei und faende sie im Kommentar wieder. */
.cl-wb-abende {
    padding: 1rem 1.25rem;
}

.cl-wb-abend {
    display: flex;
    gap: .7rem;
    align-items: flex-start;
    padding: .6rem;
    margin: .15rem -.6rem;
    border: 1px solid transparent;
    border-radius: 8px;
}

/* DER NAECHSTE ABEND WIRD AUSGEZEICHNET, NICHT BESCHRIFTET. Ein Merkzeichen
   „naechster" neben einer Zeile, die ohnehin die einzige hervorgehobene ist,
   sagt dasselbe zweimal. */
.cl-wb-abend--naechster {
    background: var(--cl-gold-border-dim);
    border-color: var(--cl-gold-border);
}

/* Vergangen tritt zurueck, ohne unlesbar zu werden. Abgesagt NICHT: das ist
   eine Nachricht und kein Beiwerk — es traegt als einziges ein Merkzeichen. */
.cl-wb-abend--vergangen { opacity: .6; }

/* DIE ZIFFER LINKS. Sie ersetzt das Wort „Abend" vor jedem Titel: in einer
   Liste von vier Zeilen sagt die Stellung schon, dass es Abende sind. */
.cl-wb-abend__nummer {
    flex: 0 0 1.6rem;
    text-align: center;
    font-size: .95rem;
    font-weight: 700;
    line-height: 1.5;
    color: var(--cl-text-muted);
}

.cl-wb-abend--naechster .cl-wb-abend__nummer {
    color: var(--cl-gold);
}

.cl-wb-abend__inhalt {
    flex: 1;
    min-width: 0;
}

.cl-wb-abend__kopfzeile {
    display: flex;
    gap: .5rem;
    align-items: baseline;
    flex-wrap: wrap;
}

.cl-wb-abend__name {
    flex: 1;
    min-width: 9rem;
    font-size: .95rem;
    font-weight: 600;
    color: var(--cl-text);
    overflow-wrap: anywhere;
}

.cl-wb-abend--naechster .cl-wb-abend__name {
    font-weight: 700;
}

/* DIE SACHZEILE: Datum, Uhrzeit, Stufe. Die Stufe steht hier und nicht vor
   dem Titel — sie ordnet den Abend ein, sie benennt ihn nicht. */
.cl-wb-abend__sache {
    margin-top: .1rem;
    font-size: .8rem;
    color: var(--cl-text-muted);
}

/* DIE PUNKTE BLEIBEN — sie sind der Grund, warum jemand die Liste liest —,
   aber sie sind LEISER als der Titel. Sie tragen zusaetzlich .cl-prose fuer
   Zeilenhoehe und Aufzaehlungszeichen; was hier steht, ueberschreibt nur
   Groesse und Ton. */
.cl-wb-abend__punkte {
    margin: .35rem 0 0;
    padding-left: 1.1rem;
    font-size: .85rem;
    color: var(--cl-text-muted);
}

/* Die Wege am Abend (Zugang, Aufzeichnung, Dateien) stehen in einer Zeile und
   brechen am Telefon um, statt nebeneinander schmal zu werden. */
.cl-wb-abend__wege {
    display: flex;
    flex-wrap: wrap;
    gap: .4rem;
    margin-top: .5rem;
}

/* ── DIE ABENDKARTE DER UNTERLAGENSEITE ──────────────────────────────────

   Dort steht KEINE Liste, sondern je Abend eine Karte mit Dateien darin — und
   das bleibt so: sie ist die Mappe und nicht die Uebersicht.

   SIE HAT IHRE EIGENE KLASSE, seit .cl-wb-abend eine ZEILE ist. Beide teilen
   sich den Namen und die Kopfzeile darin, aber nicht die Form: eine Karte, die
   ihren Abstand nach aussen zieht wie eine Listenzeile, sitzt schief. */
.cl-wb-karte {
    padding: .9rem;
}

.cl-wb-karte--vergangen { opacity: .72; }

/* Der Preis auf der Kaufkarte. Eigene Klasse und nicht die des Kastens oben:
   die beiden stehen in verschiedenen Zustaenden der Seite und nie zugleich —
   eine gemeinsame Klasse haette den einen mitgeaendert, wenn man den anderen
   meint. */
.cl-wb-preis {
    margin: 0 0 .1rem;
    font-size: 1.2rem;
    font-weight: 700;
    color: var(--cl-text);
}

/* ══════════════════════════════════════════════════════════════════════════
   PAKET 2 (10.09.2026) — DIE UEBUNGS-DETAILSEITE

   WOGEGEN. Die Seite lag in .cl-page (880px) und stellte beide Videos in den
   Lesefluss: das Erklaervideo als erstes nach dem Kopf, das Mitmach-Video ganz
   unten. Keins hatte poster oder aspect-ratio — ein Hochformatvideo wurde in
   der Spalte rund 1560px hoch und schob beim Laden alles darunter weg.

   EIGENE BREITE, UND SIE GILT NUR HIER. .cl-page bleibt bei 880px; 26 andere
   Seiten benutzen sie, und eine Detailseite ist kein Grund, das Haus
   umzustellen. 1120px sind die Lesespalte plus die 320px Nebenspalte plus ihr
   Abstand — die Zahl folgt dem Aufbau und ist nicht gewaehlt.
   ══════════════════════════════════════════════════════════════════════════ */

.cl-uebung {
    max-width: 1120px;
    margin: 0 auto;
}

.cl-uebung__rueckweg {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    color: var(--cl-gold-light);
    text-decoration: none;
    margin-bottom: 1rem;
    font-size: .9rem;
}
.cl-uebung__rueckweg:hover { color: var(--cl-gold-pale); }

/* --- Kopf: er steht ueber BEIDEN Spalten ------------------------------- */
.cl-uebung__kopf {
    padding-bottom: 1.1rem;
    border-bottom: 1px solid var(--cl-glass-border);
    margin-bottom: 1.4rem;
}
.cl-uebung__titel {
    font-size: 1.7rem;
    font-weight: 700;
    line-height: 1.2;
    margin: 0 0 .7rem;
}

/* Hilft bei — eine ZEILE und keine Ueberschrift mit Kasten darunter. Die
   Zuordnung gehoert zur Einordnung der Uebung und nicht zu ihrem Inhalt. */
.cl-uebung__hilft {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .35rem;
    margin-top: .7rem;
    font-size: .85rem;
}
.cl-uebung__hilft-wort { color: var(--cl-text-muted); margin-right: .15rem; }
.cl-uebung__hilft a { text-decoration: none; }

/* --- Das Raster --------------------------------------------------------- */
.cl-uebung__raster {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 320px;
    gap: 2.25rem;
    align-items: start;
}
/* min-width:0 AN ALLEN DREI RASTERKINDERN, nicht nur an der Textspalte.

   EIN RASTERKIND HAT VON SICH AUS min-width:auto und kann damit nicht schmaler
   werden als sein Inhalt; ein langes Wort oder eine feste Spalte darin macht
   die ganze Spur breiter als das Fenster. Das betrifft alle drei gleich —
   deshalb steht die Regel an allen dreien und nicht nur an der Textspalte, wo
   sie zuerst stand.

   VORSORGLICH UND NICHT AUS SCHADEN: bei 494px (dem schmalsten Viewport, den
   der Messbrowser am 10.09.2026 hergab) laeuft nichts ueber, gemessen an jedem
   Kasten einzeln. Schmaler liess sich nicht messen — headless Chrome klemmt
   die Fensterbreite dort fest. Der Fall darunter ist damit NICHT belegt, und
   das ist der Grund, warum die Regel hier steht statt zu warten. */
.cl-uebung__text,
.cl-uebung__medien,
.cl-uebung__neben { min-width: 0; }

.cl-uebung__text { grid-column: 1; }

/* Die rechte Spalte klebt UNTER DER KOPFLEISTE und nicht am Fensterrand:
   --cl-navbar-total ist die Hoehe, die die Leiste im Fenster BELEGT (samt
   sicherem Bereich), --cl-navbar-h nur die ihres Inhalts. Die Unterscheidung
   hat an drei anderen Stellen schon einmal gefehlt. */
.cl-uebung__spalte {
    grid-column: 2;
    /* AUSDRUECKLICH ZEILE 1. Die Textspalte steht im Markup davor und belegt
       Spalte 1 / Zeile 1; ohne diese Angabe setzt der Browser die Nebenspalte
       ins naechste freie Feld — bei einer langen Textspalte ist das Zeile 2,
       also unterhalb von allem. */
    grid-row: 1;
    position: sticky;
    top: calc(var(--cl-navbar-total) + 1rem);
    display: grid;
    gap: 1rem;
    align-content: start;
}
.cl-uebung__neben { display: grid; gap: 1rem; }

/* --- Kurzfakten --------------------------------------------------------- */
/* auto-fit statt fester Dreispaltigkeit: es sind HOECHSTENS drei Kacheln, und
   bei einer oder zweien sollen sie nicht auf ein Drittel schrumpfen. */
.cl-uebung__fakten {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: .6rem;
    margin-bottom: 1.5rem;
}
.cl-uebung__fakt {
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
    padding: .7rem .85rem;
}
.cl-uebung__fakt small {
    display: block;
    font-size: .72rem;
    color: var(--cl-text-muted);
    margin-bottom: .15rem;
}
.cl-uebung__fakt b { font-weight: 600; font-size: 1rem; }

/* --- Abschnitte --------------------------------------------------------- */
.cl-uebung__abschnitt { margin-bottom: 1.8rem; }
.cl-uebung__hinweise { margin-top: 1.1rem; }

.cl-uebung__check { display: flex; align-items: flex-start; gap: .75rem; }
.cl-uebung__check i { font-size: 1.25rem; margin-top: .1rem; flex-shrink: 0; }
.cl-uebung__check p { margin: 0; }

/* --- Bilderreihe -------------------------------------------------------- */
/* object-fit:contain AUF HELLEM GRUND. Die Kastner-Zeichnungen sind
   Strichgrafik auf Papierton; cover beschneidet sie auf das Quadrat, und
   beschnitten fehlt ausgerechnet das, worauf die Zeichnung zeigt. Der helle
   Grund ist deshalb kein Geschmack, sondern die Farbe der Vorlage. */
.cl-uebung__bilder {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
    gap: .6rem;
    margin-top: 1.2rem;
}
.cl-uebung__bild { margin: 0; }
.cl-uebung__bild button {
    display: block;
    width: 100%;
    padding: 0;
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
    background: var(--cl-papier);
    cursor: zoom-in;
    overflow: hidden;
}
.cl-uebung__bild button:focus-visible {
    outline: 2px solid var(--cl-gold);
    outline-offset: 2px;
}
.cl-uebung__bild img {
    display: block;
    width: 100%;
    aspect-ratio: 1;
    object-fit: contain;
}
.cl-uebung__bild figcaption {
    font-size: .75rem;
    color: var(--cl-text-muted);
    margin-top: .3rem;
    line-height: 1.35;
}

/* --- Nebenkarten -------------------------------------------------------- */
.cl-uebung__karte {
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius-lg);
    padding: .95rem 1.1rem;
}
.cl-uebung__karte h3 { margin: 0 0 .5rem; font-size: .95rem; font-weight: 700; }
.cl-uebung__karte ul { margin: 0; padding-left: 1.1rem; }
.cl-uebung__karte li,
.cl-uebung__karte p { font-size: .88rem; color: var(--cl-text-muted); margin: 0; }
.cl-uebung__karte li { margin-bottom: .3rem; }
.cl-uebung__karte li:last-child { margin-bottom: 0; }
.cl-uebung__vorzeile { white-space: pre-line; }
.cl-uebung__vorzeile + .cl-uebung__vorzeile { margin-top: .45rem !important; }

/* ── DIE MEDIENKARTE ─────────────────────────────────────────────────────
   Das Angebot, nicht der Inhalt. Beide Videos an EINER Stelle, gleich weit
   weg, und das Ansehen ist eine Entscheidung. */
.cl-medienkarte {
    background: var(--cl-glass-bg);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius-lg);
    overflow: hidden;
}
.cl-medienkarte__buehne {
    position: relative;
    display: block;
    width: 100%;
    padding: 0;
    border: 0;
    background: #050a14;
    cursor: pointer;
    aspect-ratio: 4 / 3;
}
.cl-medienkarte__buehne--still { cursor: default; }
.cl-medienkarte__buehne:focus-visible { outline: 2px solid var(--cl-gold); outline-offset: -2px; }
.cl-medienkarte__buehne img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.cl-medienkarte__play {
    position: absolute;
    left: 50%; top: 50%;
    transform: translate(-50%, -50%);
    width: 52px; height: 52px;
    border-radius: 50%;
    background: rgba(255, 255, 255, .92);
    color: var(--cl-navy-dark);
    display: grid; place-items: center;
    font-size: 1.7rem;
    line-height: 1;
}
.cl-medienkarte__buehne:hover .cl-medienkarte__play { background: #fff; }
.cl-medienkarte__zeit {
    position: absolute;
    right: .6rem; bottom: .6rem;
    background: rgba(0, 0, 0, .62);
    color: #fff;
    font-size: .72rem;
    padding: .15rem .45rem;
    border-radius: 6px;
}
.cl-medienkarte__knoepfe { display: grid; gap: .5rem; padding: .75rem; }
.cl-medienkarte__knopf {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: .75rem;
    width: 100%;
    padding: .65rem .85rem;
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
    background: rgba(255, 255, 255, .05);
    color: var(--cl-text);
    font-size: .9rem;
    text-align: left;
    cursor: pointer;
    transition: background var(--cl-duration) var(--cl-ease);
}
.cl-medienkarte__knopf:hover { background: rgba(255, 255, 255, .09); }
.cl-medienkarte__knopf:focus-visible { outline: 2px solid var(--cl-gold); outline-offset: 2px; }
.cl-medienkarte__knopf small { color: var(--cl-text-muted); font-size: .78rem; }
/* Mitmachen ist die Primaeraktion: die Seite heisst Selbst ueben. */
.cl-medienkarte__knopf--gold {
    background: linear-gradient(135deg, var(--cl-gold) 0%, var(--cl-gold-light) 100%);
    border-color: transparent;
    color: var(--cl-navy-dark);
    font-weight: 700;
}
.cl-medienkarte__knopf--gold:hover { filter: brightness(1.06); }
.cl-medienkarte__knopf--gold small { color: rgba(26, 18, 0, .7); }
.cl-medienkarte__notiz {
    margin: 0;
    padding: .75rem;
    font-size: .8rem;
    color: var(--cl-text-muted);
}

/* ── DAS VIDEOTHEATER ────────────────────────────────────────────────────
   Die Ebene ist die DIALOG-Stufe und nicht die des Blattes — das Theater legt
   sich ueber ALLES, auch ueber ein offenes Blatt. Die Zusage, dass hoechstens
   eine Ueberlagerung offen ist, gibt die Seite und nicht diese Regel.

   (Die Stufennamen stehen hier bewusst NICHT ausgeschrieben mit Doppelpunkt:
   BauP6EbenenUndKnoepfeTests zaehlt ihre Vorkommen im Stylesheet und haelt
   fest, dass jede Stufe GENAU EINMAL definiert ist. Ein Kommentar, der wie
   eine Definition aussieht, ist fuer einen Quelltext-Scan eine.) */
.cl-theater {
    position: fixed;
    inset: 0;
    z-index: var(--cl-ebene-dialog);
    background: rgba(3, 7, 14, .93);
    backdrop-filter: blur(3px);
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .9rem;
    padding: 1.25rem;
}
.cl-theater__zu {
    position: absolute;
    top: 1.1rem; right: 1.4rem;
    background: transparent;
    border: 1px solid var(--cl-glass-border);
    color: var(--cl-text);
    border-radius: 999px;
    padding: .45rem .9rem;
    font-size: .85rem;
    cursor: pointer;
}
.cl-theater__zu:hover { background: rgba(255, 255, 255, .08); }
.cl-theater__wahl {
    display: flex;
    gap: .25rem;
    background: rgba(255, 255, 255, .06);
    padding: .25rem;
    border-radius: 10px;
}
.cl-theater__wahl-knopf {
    background: transparent;
    border: 0;
    color: var(--cl-text-muted);
    padding: .45rem 1rem;
    border-radius: 7px;
    font-size: .88rem;
    cursor: pointer;
}
.cl-theater__wahl-knopf.is-aktiv {
    background: rgba(255, 255, 255, .12);
    color: var(--cl-text);
    font-weight: 600;
}
.cl-theater__wahl-zeit { color: inherit; opacity: .7; margin-left: .2rem; }

/* HOCHFORMAT TRAEGT DIE HOEHE, QUERFORMAT DIE BREITE. Andersherum laeuft ein
   9:16-Video aus dem Fenster: bei 92vw Breite waere es 163vh hoch. */
.cl-theater__buehne {
    position: relative;
    background: #000;
    border-radius: 12px;
    overflow: hidden;
    max-width: min(96vw, 1400px);
}
/* BEIDE GRENZEN STEHEN IM MASS SELBST und nicht als max-height daneben.

   GEMESSEN AM 10.09.2026 bei 1264x705: mit `width: min(92vw,1280px)` und
   `max-height: 84vh` kam die Querformat-Buehne auf 1163x581 heraus — ein
   Verhaeltnis von 2.00 statt 16:9. Das Seitenverhaeltnis gibt gegen eine
   Hoehengrenze nach; die Buehne wurde breiter als das Video, und der schwarze
   Kasten stand links und rechts ueber. Sichtbar wird das bei jedem flachen
   Fenster, also bei jedem Notebook im Querformat.

   Mit der dritten Grenze IN der min()-Liste bleibt das Verhaeltnis erhalten
   und die Buehne schrumpft, statt sich zu verziehen. Der Hochformatfall
   bekommt dieselbe Behandlung fuer den umgekehrten Fall (schmales, hohes
   Fenster). */
/* --cl-theater-rand: was im Theater AUSSER der Buehne Platz braucht —
   Umschalter, Fusszeile, die zwei Abstaende dazwischen und die Polsterung.
   Rund 130px; 8.5rem ist die naechste runde Zahl darueber. */
.cl-theater { --cl-theater-rand: 8.5rem; }

.cl-theater__buehne--hoch {
    height: min(calc(100vh - var(--cl-theater-rand)), 900px, calc(92vw * 16 / 9));
    aspect-ratio: 9 / 16;
}
.cl-theater__buehne--quer {
    width: min(92vw, 1280px, calc((100vh - var(--cl-theater-rand)) * 16 / 9));
    aspect-ratio: 16 / 9;
}
/* NICHT SCHRUMPFEN LASSEN. Die Buehne ist ein Flex-Kind, und ein Flex-Kind
   gibt in der Hoehe nach, bevor der Behaelter ueberlaeuft — das Verhaeltnis
   geht dabei kaputt. Gemessen am 10.09.2026 bei 1264x705: die Querformat-
   Buehne kam auf 1.81 statt 1.78 heraus, weil die Fusszeile ihr elf Pixel
   weggenommen hat. Die Hoehengrenze oben sorgt dafuer, dass nichts zu
   schrumpfen ist. */
.cl-theater__buehne { flex-shrink: 0; }
.cl-theater__buehne video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: contain;
    background: #000;
}
.cl-theater__fuss { font-size: .82rem; color: var(--cl-text-muted); text-align: center; }
.cl-theater__fuss-taste { opacity: .7; }

/* ── DIE BILDLUPE ────────────────────────────────────────────────────────
   Heller Grund unter dem Bild, kein schwarzer: die Zeichnungen sind
   Strichgrafik auf Papierton und stuenden auf Schwarz wie ein Loch. */
.cl-bildlupe {
    position: fixed;
    inset: 0;
    z-index: var(--cl-ebene-dialog);
    background: rgba(3, 7, 14, .93);
    backdrop-filter: blur(3px);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 3.5rem 1.25rem 1.25rem;
}
.cl-bildlupe__zu {
    position: absolute;
    top: 1.1rem; right: 1.4rem;
    background: transparent;
    border: 1px solid var(--cl-glass-border);
    color: var(--cl-text);
    border-radius: 999px;
    padding: .45rem .9rem;
    font-size: .85rem;
    cursor: pointer;
}
.cl-bildlupe__zu:hover { background: rgba(255, 255, 255, .08); }
.cl-bildlupe__pfeil {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 44px; height: 44px;
    border-radius: 50%;
    border: 1px solid var(--cl-glass-border);
    background: rgba(255, 255, 255, .08);
    color: var(--cl-text);
    font-size: 1.2rem;
    cursor: pointer;
    display: grid; place-items: center;
}
.cl-bildlupe__pfeil:hover { background: rgba(255, 255, 255, .16); }
.cl-bildlupe__pfeil--zurueck { left: 1rem; }
.cl-bildlupe__pfeil--vor { right: 1rem; }
.cl-bildlupe__rahmen {
    margin: 0;
    max-width: min(92vw, 900px);
    background: var(--cl-papier);
    border-radius: 12px;
    padding: 1rem;
}
.cl-bildlupe__rahmen img {
    display: block;
    max-width: 100%;
    max-height: 72vh;
    margin: 0 auto;
    object-fit: contain;
}
.cl-bildlupe__unterschrift {
    display: flex;
    justify-content: space-between;
    gap: 1rem;
    margin-top: .7rem;
    font-size: .82rem;
    color: #3b3b3b;
}
.cl-bildlupe__zaehler { color: #6b6b6b; flex-shrink: 0; }

/* ── AM TELEFON: EINE SPALTE, UND DIE MEDIENKARTE RUECKT NACH OBEN ───────
   display:contents loest die rechte Spalte auf, damit ihre Kinder im Raster
   der Seite ordnen koennen. Die Alternative waere, die Karte ZWEIMAL ins
   Markup zu schreiben — und das ist die Bauform, bei der die eine geaendert
   und die andere vergessen wird.

   960px ist die Zahl aus der Vorgabe und dieselbe wie im Mockup. */
@media (max-width: 959.98px) {
    .cl-uebung__raster { grid-template-columns: 1fr; gap: 1.25rem; }
    .cl-uebung__spalte { display: contents; }
    .cl-uebung__medien { order: 1; }
    .cl-uebung__text   { order: 2; grid-column: 1; }
    .cl-uebung__neben  { order: 3; }

    /* Aus der Karte wird ein Streifen: Standbild links, Knoepfe rechts. Ein
       4:3-Standbild ueber die volle Breite waere am Telefon der halbe
       Bildschirm, bevor ein Wort dasteht — genau der Fehler, den diese Seite
       gerade abgelegt hat. */
    .cl-medienkarte {
        display: grid;
        grid-template-columns: 120px 1fr;
        align-items: center;
    }
    .cl-medienkarte__buehne { aspect-ratio: 1; height: 100%; }
    .cl-medienkarte__play { width: 38px; height: 38px; font-size: 1.25rem; }
    .cl-medienkarte__zeit { right: .3rem; bottom: .3rem; font-size: .65rem; }
    .cl-medienkarte__knoepfe { padding: .6rem; }
    .cl-medienkarte__notiz { grid-column: 1 / -1; }

    .cl-uebung__titel { font-size: 1.4rem; }
    .cl-bildlupe__pfeil { width: 38px; height: 38px; }
    .cl-bildlupe__rahmen { padding: .7rem; }
}

/* ══════════════════════════════════════════════════════════════════════════
   PAKET 3b (11.09.2026) — DER MEDIENBLOCK DER UEBUNGS-REDAKTION

   WOGEGEN. Paket 3 hat den Block gebaut, die Klassen aber nicht bedient: die
   Vorschauen standen in Originalgroesse untereinander, die zwei Textfelder je
   Bild ohne Ausrichtung. Er funktionierte vollstaendig und sah aus wie ein
   Formular ohne Stylesheet.

   ══════════════════════════════════════════════════════════════════════════
   DER NAME IST .cl-medienposten UND NICHT .cl-medienfeld — MIT GRUND.
   ══════════════════════════════════════════════════════════════════════════
   .cl-medienfeld* ist seit E2d vergeben (Block weiter oben in dieser Datei):
   es gehoert Shared/Content/MedienFeld.razor, der Ablageflaeche des Kapitel-
   und Blogeditors. Dort ist __vorschau ein BEHAELTER mit einem Bild darin
   (`.cl-medienfeld__vorschau img { width:100%; max-height:16rem }`); hier
   waere es das Bild SELBST und 160px breit.

   Die Uebungsmaske trug die fremden Klassen seit Paket 3 im Markup und damit
   still deren Regeln. Haette dieser Block unter demselben Namen geschrieben,
   was die Uebungsmaske braucht, waere der Kapiteleditor mitgeaendert worden —
   an einer Stelle, an der es niemand sucht. Gefunden beim Schreiben dieses
   Blocks, nicht im Betrieb.

   VORBILDER, UEBERNOMMEN STATT ERFUNDEN
     .cl-icon-btn / --danger   (cavallearn.css:3861) fuer die drei kleinen
                               Knoepfe an einer Bildzeile — dieselben, die der
                               Plan-Editor benutzt
     .cl-btn-pill-outline
     + .cl-btn-sm              (:1039, :799) fuer Ersetzen / Entfernen /
                               Nachziehen
     .cl-medienfeld__zone      (:5295) als Vorbild fuer den Leerzustand:
                               gestrichelter Rahmen in Gold, dieselbe Idee
     --cl-papier               (Paket 2) als Grund unter den Zeichnungen
     ThStyle/InputStyle        die Textfelder benutzen denselben Helfer wie
                               jedes andere Feld dieser Maske — hier steht
                               kein zweiter Feldstil
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Ein Medienposten: Thumbnail, Erklaervideo, Mitmachvideo ─────────────── */

.cl-medienposten {
    display: flex;
    flex-direction: column;
    gap: .45rem;
}

/* Der erste Posten trennt den Medienteil vom Feldteil des Formulars. Die
   Linie steht an der KLASSE und nicht als Inline-Stil am Element — sie ist
   eine Aussage ueber den Aufbau der Maske und keine Eigenheit dieses einen
   Kastens. */
.cl-medienposten--erster {
    border-top: 1px solid var(--cl-glass-border);
    padding-top: .9rem;
    margin-top: .25rem;
}

.cl-medienposten__titel {
    font-size: .75rem;
    font-weight: 600;
    color: var(--cl-text-muted);
}

/* Vorschau links, Text in der Mitte, Aktionen rechts. align-items:flex-start,
   damit die Knoepfe oben stehen bleiben, wenn die Mitte zwei Zeilen bekommt. */
.cl-medienposten__zeile {
    display: flex;
    align-items: flex-start;
    gap: .9rem;
}

/* 160px BREIT UND 4:3. Die alte Maske zeigte 80x60 — zu klein, um zu
   erkennen, ob es das richtige Standbild ist; das war einer der Gruende fuer
   diesen Umbau. flex:0 0 auto, damit die Vorschau nicht schrumpft, wenn der
   Text daneben lang wird. */
.cl-medienposten__vorschau {
    flex: 0 0 auto;
    width: 160px;
    aspect-ratio: 4 / 3;
    object-fit: cover;
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
    background: var(--cl-navy-dark);
}

/* Der Leerzustand ist KEIN graues Rechteck: der gestrichelte Rahmen sagt
   „hier gehoert etwas hin", derselbe Gedanke wie bei .cl-medienfeld__zone.
   Er ist ruhiger als dort (1px, Glasrand statt Gold), weil hier drei davon
   nebeneinander stehen koennen und drei goldene Kaesten die Seite unruhig
   machen. */
.cl-medienposten__vorschau--leer {
    display: grid;
    place-items: center;
    border-style: dashed;
    border-color: var(--cl-glass-border);
    background: transparent;
    color: var(--cl-text-subtle);
    font-size: 1.5rem;
}

.cl-medienposten__mitte {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: .2rem;
    /* min-width:0 an einem Flex-Kind: ohne das kann es nicht schmaler werden
       als sein Inhalt, und eine lange Massezeile schiebt die Aktionen hinaus. */
    min-width: 0;
    flex: 1 1 auto;
}

/* „1920×1080 · Querformat · 0:03" — Sekundaerfarbe, weil es eine Auskunft
   ueber die Datei ist und keine Handlung. */
.cl-medienposten__masse {
    font-size: .82rem;
    color: var(--cl-text-muted);
}

.cl-medienposten__aktionen {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .4rem;
    flex: 0 0 auto;
}

.cl-medienposten__hinweis {
    margin: 0;
    font-size: .78rem;
    color: var(--cl-text-subtle);
    max-width: var(--cl-lesebreite);
}

/* ── Eine Bildzeile ──────────────────────────────────────────────────────── */

.cl-bildzeile {
    display: flex;
    align-items: flex-start;
    gap: .9rem;
    padding: .6rem 0;
    border-top: 1px solid var(--cl-glass-border);
}
.cl-bildzeile:first-of-type { border-top: 0; }

/* object-fit:contain AUF PAPIERGRUND, wie auf der Uebungsseite. `cover`
   beschneidet die Kastner-Zeichnung, und der Redakteur beurteilte einen
   Ausschnitt, den der Reiter nie sieht. 96px: kleiner als ein Medienposten,
   weil hier mehrere untereinander stehen. */
.cl-bildzeile__bild {
    flex: 0 0 auto;
    width: 96px;
    aspect-ratio: 1;
    object-fit: contain;
    background: var(--cl-papier);
    border: 1px solid var(--cl-glass-border);
    border-radius: var(--cl-radius);
}

.cl-bildzeile__felder {
    display: flex;
    flex-direction: column;
    gap: .35rem;
    min-width: 0;
    flex: 1 1 auto;
}
.cl-bildzeile__felder > label {
    display: flex;
    flex-direction: column;
    gap: .2rem;
    font-size: .72rem;
    color: var(--cl-text-muted);
}

.cl-bildzeile__aktionen {
    display: flex;
    align-items: center;
    gap: .35rem;
    flex: 0 0 auto;
}

/* „Gespeichert" — die Rueckmeldung blendet nach zwei Sekunden aus, OHNE einen
   Zeitgeber im Code.

   WARUM CSS UND NICHT EIN TIMER: ein Timer je Zeile muesste beim Verlassen
   der Seite abgeraeumt werden, und ein vergessener haelt die Komponente am
   Leben. Die Animation laeuft im Browser und endet von selbst.

   WAS SIE NICHT KANN, und das steht hier, damit es niemand fuer einen Fehler
   haelt: wird DIESELBE Zeile ein zweites Mal gespeichert, entsteht kein neues
   Element — die Animation startet dann nicht erneut, und die Meldung bleibt
   unsichtbar. Der Zustand stimmt trotzdem (gespeichert ist gespeichert); es
   fehlt nur die Bestaetigung. Wer das aendert, gibt dem Element einen
   Schluessel, der sich je Speichervorgang aendert. */
.cl-bildzeile__gespeichert {
    display: inline-flex;
    align-items: center;
    gap: .25rem;
    font-size: .72rem;
    color: var(--cl-success);
    white-space: nowrap;
    animation: cl-bildzeile-verblassen 2.4s ease-out forwards;
}

@keyframes cl-bildzeile-verblassen {
    0%, 70% { opacity: 1; }
    100%    { opacity: 0; }
}

/* Wer Bewegung abgestellt hat, bekommt keine — die Meldung steht dann einfach
   da. Dieselbe Ruecksicht wie ueberall sonst in dieser Datei. */
@media (prefers-reduced-motion: reduce) {
    .cl-bildzeile__gespeichert { animation: none; }
}

/* ── Am schmalen Schirm: untereinander ───────────────────────────────────── */
/*
   960px ist dieselbe Grenze wie auf der Uebungsseite (Paket 2). Vorschau
   ueber Text, Aktionen darunter in einer Reihe — ein 160px-Bild neben zwei
   Textfeldern laesst auf 390px fuer die Felder nichts uebrig.
*/
@media (max-width: 959.98px) {
    .cl-medienposten__zeile,
    .cl-bildzeile {
        flex-direction: column;
        align-items: stretch;
        gap: .5rem;
    }

    .cl-medienposten__vorschau,
    .cl-bildzeile__bild {
        width: 100%;
        max-width: 220px;
    }

    /* align-self:flex-start UND NICHT NUR justify-content. Die Zeile ist hier
       eine Spalte mit align-items:stretch — der Aktionskasten wird damit so
       breit wie die Seite, und seine Knoepfe wachsen mit. Gemessen bei 494px:
       "Video ersetzen" und "Entfernen" standen als zwei volle Balken
       untereinander statt nebeneinander. Mit flex-start ist der Kasten so
       breit wie sein Inhalt, und die Knoepfe stehen in einer Reihe. */
    .cl-medienposten__aktionen,
    .cl-bildzeile__aktionen {
        align-self: flex-start;
        justify-content: flex-start;
    }
}
