
.form-fieldset {
    border: 0;
    width: 100%;
    max-width: 800px;
}
.form-fieldset-label {
    padding: 16px 0;
    font-size: 1.25em;
    font-weight: 600;
}
.form-row {
    display: flex;
}
.form-row > div {
    flex: 1 1 calc(50% - 10px);
    max-width: calc(50% - 10px);
    margin-right: 20px;
}
.form-row > div:last-child {
    margin-right: 0;
}
@media only screen and (max-width: 800px) {
    .form-row {
        flex-direction: column;
    }
    .form-row > div {
        flex: 1 1 100%;
        max-width: 100%;
        margin-right: 0;
    }
}
.form-group,
.btn-group {
    max-width: 100%;
    margin-bottom:1em;
    overflow:hidden;
}
.btn-group .previous{margin-right:24px;}

.form-group-show_company_name {
    margin-top: 1em;
}
.form-group-company_name {
    max-width: 100%;
    transition: max-width 400ms;
}
.form-group-company_name.hidden-by-sliding-left {
    max-width: 0;
}
label.form-check-label {
    width:100%;
}
.inputs-list .radio {
    overflow:hidden;
}
input[type="radio"] {
    margin-right:1em;
}

/* show labels as coloured buttons */
.show-labels-as-coloured-buttons {
    display: flex;
    flex-wrap: wrap;
}
.show-labels-as-coloured-buttons .form-check {
    margin-right: 8px;
    border-top: none;
}
.form-group-amount .show-labels-as-coloured-buttons .form-check {
    flex: 1 1 90px;
    max-width: 90px;
}
.show-labels-as-coloured-buttons .form-check-label {
    padding: 12px 16px 12px 16px;
    background-color: #094f9e;
    color: white;
    font-size: 18px;
    font-weight: 700;
    text-align: center;
    line-height: 1;
    letter-spacing: .5px;
    cursor: pointer;
}
.show-labels-as-coloured-buttons .form-check-label:has(input:checked) {
    background-color:#F45E5E;
    color:white;
}
.show-labels-as-coloured-buttons .form-check-label input[type="radio"] {
    position: absolute;
    z-index: -10;
    visibility: hidden;
}
.form-group-amount .form-check.contains-input-field {
    flex:1 1 166px;
    max-width:166px;
}
.form-check.contains-input-field .input-group {
    display: flex;
}
.form-check.contains-input-field input[type="number"] {
    padding-top: 12px;
    padding-bottom: 11px;
    padding-left: 20px;
}
.show-labels-as-coloured-buttons .form-check.contains-input-field {
    position: relative;
}
.show-labels-as-coloured-buttons .form-check.contains-input-field input[type="number"] {
    background-color: transparent;
    border: none;
    box-shadow: none;
    color:white;
    font-weight: 600;
}
.show-labels-as-coloured-buttons .form-check.contains-input-field input[type="number"]::placeholder {
    color: white;
    font-weight: 600;
    text-align: left;
}
.show-labels-as-coloured-buttons .form-check.contains-input-field .form-check-label {
    padding: 0;
    background-color: #094f9e;
}
.show-labels-as-coloured-buttons .form-check.contains-input-field .form-check-label:has(input:checked) {
    background-color: #f95050;
    color: white;
}
.show-labels-as-coloured-buttons .form-check.contains-input-field .input-group-addon {
    position: absolute;
    top: 0;
    right: -16px;
    padding: 11px 0 0 2px;
    border: none;
    background-color: transparent;
    color: #202020;
    font-size: 18px;
    font-weight: 600;
}

/* progress bar */
.progress {
    height: 44px;
    margin-bottom: 0;
    border: unset;
    border-radius: unset;
    box-shadow: unset;
    background-color: #ccc;
    overflow: hidden;
}
.progress-bar {
    height: 100%;
    padding-top: 5px;
    color: #fff;
    font-size: 12px;
    line-height: 20px;
    text-align: center;
    overflow: hidden;
    transition: width 1s ease;
}
.progress-bar span {
    font-size: 20px;
    line-height: 30px;
}
.donation-goal p {
    margin-bottom: 0;
}

.finisher-confirmation-message {
    width: 100%;
    max-width: 800px;
    margin-left: auto;
    margin-right: auto;
    padding: 20px;
}

.toggle-next-fieldset {
    cursor: pointer;
    color: #8da700;
}

.inpersoneventform > h2 {
    visibility: hidden;
    height: 0;
}

.orderform-veto .form-group-amountstatictext {
    padding-top: 18px;
}
.orderform-veto .form-group-amountstatictext p {
    line-height: 1.4;
}

/* ── Spendenformular: Zwei-Klick-Einwilligung ─────────────────────────────────
   Markup baut .../custom_forms/Resources/Public/JavaScript/donateActivate.js,
   eingehängt in .../Resources/Private/Templates/Fundraisingbox/Donationform.html.

   ⚠️⚠️ DIE WERTE SIND ABSICHTLICH DIESELBEN wie bei den beiden Geschwistern —
   wer hier etwas ändert, ändert es dort mit, sonst laufen die drei Flächen
   auseinander:
     Karte: .../md_events/Resources/Public/Css/listMap.css        (.map-activate)
     Video: .../custom_md2022/Resources/Public/Css/styles-plugins.css
            .../custom_sprezu/Resources/Public/Css/styles.css     (.video-shariff-preview-*)
   Gemeinsam sind: Symbol 3rem, Lücke 0.625rem, Anbieterband 0.8125rem/700,
   Hinweisband max 32rem mit 1rem Abstand und 0.625rem/1rem Innenabstand,
   Kopfzeile 1.125rem, Hinweis fett mit 0.25rem Abstand, Schleier weiß 0.2.

   Diese Datei liegt über page.includeCSS.custom_forms ohnehin auf jeder Seite
   jeder Site — deshalb steht der Block hier und nicht doppelt in den
   Sitepackages. Der Cache-Buster ist die mtime, hier gibt es also NICHTS von
   Hand hochzuzählen (anders als bei der JS-Datei und bei md_events).           */

/* ── Stellschrauben: das Einzige, was eine Site überschreiben sollte ── */
.donate-embed {
    /* f3d1 = money-bill-1, ausgewählt vom User am 10.8.2026.
       ⚠️ Die Glyphe gibt es in FA 6.2.1 Free in ZWEI Schnitten: solid (900,
       gefüllter Schein) und regular (400, nur Umriss). Die Sites binden aber nur
       fontawesome + solid + brands ein — regular.min.css liegt nirgends.
       ⚠️⚠️ Das fällt NICHT auf: gemessen am 10.8.2026 (Chrome 151, örtlicher
       Prüfstand) ergibt font-weight:400 exakt dieselben Maße wie 900. Weil die
       Familie nur einen Schnitt hat, nimmt der CSS-Schriftabgleich ihn auch für
       400 — es bleibt also kein leeres Kästchen stehen, sondern still die SOLIDE
       Form. Wer den Umriss wirklich will, muss regular.min.css einbinden; die
       900 steht hier ausgeschrieben, damit niemand die 400 für den Umriss hält.
       Nachgesehen in .../custom_md2022/…/fontawesome-free-6.2.1-web/metadata/icons.json
       und in den includeCSS-Zweigen beider Sitepackages. */
    --donate-icon: "\f3d1";
    --donate-icon-weight: 900;
    --donate-host: "FundraisingBox (secure.fundraisingbox.com)";
    /* --color-red ist nur in custom_sprezu gesetzt (#ff6157); überall sonst
       greift der Rückfallwert, das MD-Dunkelblau. Genau wie bei der Karte. */
    --donate-icon-color: var(--color-red, #003567);
    --donate-surface-bg: #e9edf1;
    --donate-band-bg: #1271ee;   /* deckend — weiß darauf ergibt 4,54:1 */
    /* Rückmeldung beim Zeigen, derselbe Sprung wie bei den Buttons der Site
       (styles-defaultscreen.css:833/866), beim Video (--video-band-bg-hover) und
       auf der Karte (--map-band-bg-hover). ⚠️ Weiß darauf sind nur noch 3,15:1
       statt 4,54:1 — bewusste Entscheidung des Users am 12.8.2026 zugunsten der
       Einheitlichkeit. Wer sie zurücknimmt, nimmt sie an allen vier Stellen zurück. */
    --donate-band-bg-hover: #2e92ff;
    --donate-band-color: #ffffff;
    --donate-band-radius: 0;     /* mehr-demokratie.de ist eckig */
    /* ⚠️⚠️ EIGENE Stellschraube, NICHT --donate-icon-color mitbenutzen. Die Symbolfarbe
       darf hell sein: sprezu setzt dort sein Rot, und das ergibt als Fokusring auf
       creme nur 2,79:1 — unter den 3:1, die ein Fokusindikator braucht. Gekoppelt
       würde sprezu still schlechter, während md (dunkelblau, 10,5:1 auf der Fläche)
       gut aussieht. Am 12.8.2026 gerechnet. */
    --donate-focus-ring: var(--color-blue, #003567);
    /* Platzhalterhöhe. Das fertige Formular ist höher und wächst per fbResize
       selbst; hier geht es nur darum, dass die Fläche vor dem Klick nicht wie ein
       vergessener Streifen aussieht. Eine Zeile, wenn sie jemand anpassen will. */
    --donate-min-height: 25rem;

    position: relative;
}

.donate-embed .donate-activate {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    min-height: var(--donate-min-height);
    padding: 0;
    border: 0;
    overflow: hidden;
    cursor: pointer;
    background: var(--donate-surface-bg);
    font: inherit;          /* nimmt eventuelle button-Regeln der Site zurück */
    color: inherit;
    text-align: center;
}
.donate-embed .donate-activate--busy { cursor: progress; }
.donate-embed .donate-activate--error { cursor: pointer; }

/* ⚠️ KEINE Vorschau — hier fehlt absichtlich das Gegenstück zu .map-activate__preview
   (Kartenpunkte) und zum Standbild des Videos. Angedeutete Formularzeilen waren
   gebaut und am 10.8.2026 vom User abgelehnt: „keine vertikalen balken im
   Hintergrund bitte". Die Fläche bleibt einfarbig; wer die Symmetrie zu den
   Geschwistern „repariert", baut genau das zurück, was weg sollte.
   Der Schleier bleibt: er trägt den Aufhell-Wechsel beim Überfahren. */
.donate-embed .donate-activate__overlay {
    position: absolute;
    inset: 0;
    background: rgba(255, 255, 255, 0.2);
    transition: background 0.4s cubic-bezier(0.165, 0.84, 0.44, 1);
}
.donate-embed .donate-activate:hover .donate-activate__overlay,
.donate-embed .donate-activate:focus .donate-activate__overlay { background: transparent; }

.donate-embed .donate-activate__group {
    position: relative;
    z-index: 1;
    display: block;
    width: 100%;
    padding: 0 1rem;
}
.donate-embed .donate-activate__icon {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 0.625rem;
    margin: 0 auto;
    color: var(--donate-icon-color);
    font: inherit;
}
.donate-embed .donate-activate__icon::before {
    content: var(--donate-icon);
    font-family: 'Font Awesome 6 Free';
    font-weight: var(--donate-icon-weight);
    font-style: normal;
    font-size: 3rem;
    line-height: 1;
}
/* Ziel des Klicks im Klartext neben dem Symbol, eigener deckender Grund wie beim
   Video. ⚠️ Für Vorlesesoftware ist per CSS erzeugter Text zweite Wahl — der
   lange Hinweis im Band darunter ist echtes Markup und trägt die Aussage allein. */
.donate-embed .donate-activate__icon::after {
    content: var(--donate-host);
    padding: 0.25rem 0.5rem;
    border-radius: var(--donate-band-radius);
    background: var(--donate-band-bg);
    color: var(--donate-band-color);
    font-size: 0.8125rem;
    font-weight: 700;
    line-height: 1.3;
}
.donate-embed .donate-activate__text {
    display: block;
    max-width: 32rem;
    margin: 1rem auto 0;
    padding: 0.625rem 1rem;
    border-radius: var(--donate-band-radius);
    background: var(--donate-band-bg);
    color: var(--donate-band-color);
    font-size: 0.9375rem;
    line-height: 1.45;
}
.donate-embed .donate-activate__title {
    display: block;
    font-weight: 700;
    font-size: 1.125rem;
    line-height: 1.3;
}
.donate-embed .donate-activate__hint {
    display: block;
    margin-top: 0.25rem;
    font-weight: 700;
}
/* Rückmeldung an den BÄNDERN — dieselbe wie beim Video und auf der Karte.
   ⚠️⚠️ WARUM NICHT DER SCHLEIER REICHT: die Fläche hat hier bewusst KEINE Vorschau
   (siehe Kasten oben), der Schleier liegt also auf glattem --donate-surface-bg.
   Nachgerechnet am 12.8.2026: 20 % Weiß auf #e9edf1 ergibt #edf1f4 — eine Differenz
   von 4/4/3 Stufen von 255. Der Schleier-Hover ist hier also nicht schwach, sondern
   praktisch nicht vorhanden. Auf der Karte lag wenigstens noch ein Bild darunter.
   Der Schleier bleibt trotzdem: er kostet nichts und trägt, sobald jemand der Fläche
   doch einmal einen Hintergrund gibt. */
.donate-embed .donate-activate__text,
.donate-embed .donate-activate__icon::after { transition: background-color 120ms ease-in-out; }
.donate-embed .donate-activate:hover .donate-activate__text,
.donate-embed .donate-activate:hover .donate-activate__icon::after,
.donate-embed .donate-activate:focus-visible .donate-activate__text,
.donate-embed .donate-activate:focus-visible .donate-activate__icon::after { background: var(--donate-band-bg-hover); }
/* ⚠️⚠️ DUNKEL, NICHT HELL. Bis zum 12.8.2026 stand hier var(--color-light, #fbf8f4),
   also nahezu Weiß — auf --donate-surface-bg (#e9edf1) unsichtbar, der Knopf mit der
   Tastatur damit nicht auffindbar. Dieselbe Stelle war bei Video und Karte genauso
   falsch; alle drei sind am 12.8.2026 zusammen umgestellt worden. */
.donate-embed .donate-activate:focus-visible {
    outline: 0.1875rem solid var(--donate-focus-ring);
    outline-offset: -0.3125rem;
}
/**
 * ============================================================================
 *  EXPRESSFORMULAR 2026 -- Angleichung an das Spendenformular
 * ----------------------------------------------------------------------------
 *  Gilt fuer das Bauteil <frb-donation-form> der "Donation Form Suite" von
 *  FundraisingBox, eingebettet auf /spenden/expressspende
 *  (Formular-UUID 01a020d0-d801-7182-81c2-0909da413e66).
 *
 *  ⚠️⚠️ DAS IST NICHT DAS KLASSISCHE FORMULAR.
 *  /spenden/dauerspende laedt ein iframe von secure.fundraisingbox.com und
 *  wird von
 *      /home/timeras/PhpstormProjects/MehrDemokratie/typo3conf/ext/
 *      custom_forms/Resources/Public/Css/FundraisingBox/fundraisingbox-2026.css
 *  gestaltet. Diese Datei hier ist ein anderes Produkt: eine Web-Component
 *  mit eigenem Shadow DOM, die direkt in unserer Seite steckt. Von den
 *  118 --fb-*-Variablen des klassischen Formulars existiert hier KEINE
 *  einzige, und keiner seiner Selektoren trifft. Die beiden Dateien haben
 *  nichts gemeinsam ausser den Hausfarben.
 *
 *  ⚠️⚠️ WARUM ALLES !important IST -- und warum das hier kein Notnagel ist.
 *  Das Bauteil erzeugt seine Farb- und Radienwerte aus der Backend-Einstellung
 *  (designTokens: brandColorPrimary / brandColorSecondary / borderRadius) und
 *  schreibt sie per style.setProperty als INLINE-Deklaration auf den Wirt.
 *  Eine geerbte Custom Property verliert dagegen immer. Am 20.8.2026 gemessen:
 *  ohne !important kommt NICHTS an (Sonde --spacing:10px -> Hoehe blieb exakt
 *  625 px), mit !important schlaegt jedes Token durch (Sonde
 *  --color-background-default:#c8ffc8 -> Felder wurden gruen).
 *
 *  ⚠️ Was NICHT geht, damit niemand danach sucht:
 *  - ::part() -- das Bauteil vergibt 0 part-Attribute (in form.js gezaehlt).
 *  - Regeln fuer Elemente IM Formular -- der Shadow Root ist mode:"closed",
 *    von aussen kommt man weder per CSS-Selektor noch per JavaScript hinein.
 *  - eigene Elemente einschleusen -- der einzige <slot> traegt einen
 *    generierten Namen und hat einen Testabsatz nicht uebernommen.
 *  Es bleiben also ausschliesslich vererbte Custom Properties. Alles, was
 *  unten NICHT als Variable auftaucht, ist von hier aus nicht erreichbar.
 *
 *  Die Sollwerte stammen aus dem Spendenformular, nicht aus dem Gefuehl:
 *      .choice  min-height 40px, font-size 1rem, font-weight 600
 *      --md-abstand 1.25rem als EINZIGER Abstandswert
 *      Eingabefelder weiss mit #c9ced6, Text #606060
 *      Fokus 2px --md-blau-dunkel
 * ============================================================================
 */

frb-donation-form {

    /* ---- Hausfarben --------------------------------------------------------
     * Quelle ist der :root-Block am Ende von fundraisingbox-2026.css, dort
     * gemessen an https://dev.mehrdemokratie.de/testseite-farben.
     * Jede Farbe hat ihren eigenen Hover-Ton; die gehoeren zusammen benutzt. */
    --md-blau:            #1271ee;
    --md-blau-hover:      #2e92ff;
    --md-blau-dunkel:     #094f9e;
    --md-blau-dunkel-hov: #3a72b1;
    --md-rot:             #f45e5e;
    --md-rot-hover:       #f67e7e;
    --md-text:            #606060;
    --md-rahmen:          #c9ced6;
    --md-hintergrund:     #003567;

    /* Der EINE Abstandswert, wie im Spendenformular. Wer die Dichte aendern
       will, aendert nur diese Zeile. */
    --md-abstand:         1.25rem;

    /* ---- Betragsknoepfe und Rhythmus-Umschalter ----------------------------
     * Im Vorbild sind ALLE Betragsknoepfe dunkelblau gefuellt und nur der
     * gewaehlte rot. Die Vorgabe hier war umgekehrt: weiss mit Rahmen, der
     * gewaehlte blau.
     *
     * ⚠️ Die Tokens sind an den Elementen gemessen, nicht geraten:
     *      nicht gewaehlt  Grund  --color-interactive-secondary-outlined-background
     *                      Rahmen --color-border-default
     *                      Schrift--color-interactive-neutral-outlined-text
     *      gewaehlt        Grund  --color-interactive-secondary-solid-background-selected
     *                      Rahmen --color-interactive-secondary-solid-border-selected
     *                      Schrift--color-interactive-secondary-solid-text-selected
     *
     * ⚠️⚠️ Rhythmus-Umschalter und Betragsknoepfe TEILEN SICH die Tokens des
     * gewaehlten Zustands. "Einmalig/Monatlich" rot und der gewaehlte Betrag
     * rot ist deshalb keine Entscheidung, sondern eine Folge: getrennt
     * einfaerben liesse sich nur mit einem Selektor IM Shadow-Baum, und den
     * gibt es nicht. Wer den Rhythmus blau haben will, bekommt auch den
     * gewaehlten Betrag blau. */
    --color-interactive-secondary-outlined-background:       var(--md-blau-dunkel) !important;
    --color-border-default:                                  var(--md-blau-dunkel) !important;
    --color-interactive-neutral-outlined-text:               #fff                  !important;
    /* ⚠️ GETEILT mit "Zu weiteren Zahlungsarten" -- und genau deshalb ist der
       Knopf unten dunkelblau. Vorgeschichte, damit niemand rueckbaut:
       Beide Elemente tragen hover:bg-interactive-neutral-outlined-background-hover,
       ein spezifischeres Token gibt es nicht (beide Klassenlisten vollstaendig
       durchgesehen, 21 bzw. 28 Klassen). Solange der Link ein heller Textlink
       war, hiess das: entweder #3a72b1 (Kacheln richtig, Link bekommt einen
       blauen Kasten) oder transparent (Link richtig, Kacheln springen auf den
       Formulargrund und wirken fast weiss).
       ⚠️ Ein halbtransparentes Weiss loest es NICHT -- rgba(255,255,255,.2)
       ist rechnerisch exakt #3a72b1 ueber #094f9e, aber background-color wird
       ERSETZT, nicht ueberlagert: gemessen mischte sich die Kachel mit dem
       Formulargrund und wurde fast weiss.
       Ausweg war, den Link ebenfalls dunkelblau zu machen (s. unten) -- dann
       WOLLEN beide dieselbe Ueberfahren-Farbe, und der Konflikt ist keiner
       mehr. */
    --color-interactive-neutral-outlined-background-hover:   var(--md-blau-dunkel-hov) !important;
    --color-interactive-secondary-solid-background-selected: var(--md-rot)         !important;
    --color-interactive-secondary-solid-border-selected:     var(--md-rot)         !important;
    --color-interactive-secondary-solid-text-selected:       #fff                  !important;

    /* ⚠️ Der GEWAEHLTE Zustand hat einen eigenen Ueberfahren-Ton, und dessen
       Vorgabe ist BLAU -- gemeldet am 21.8.2026 als "das hover blau passt
       nicht" am roten Freibetragsfeld. Betrifft genauso den gewaehlten
       Betragsknopf und den gewaehlten Rhythmus.
       #f67e7e ist --md-rot-hover aus der Palette: die Vorlage nennt zu jeder
       Farbe ihren Hover-Ton, und beim Rot ist er HELLER, nicht dunkler.
       ⚠️ Diese Tokens waren von aussen nicht auffindbar -- die zugehoerige
       Regel steht im Stilblatt des Shadow-Baums, und das laesst sich nur in
       den Entwicklerwerkzeugen lesen. Der Name kam vom Nutzer:
       .hover\:bg-interactive-secondary-solid-background-selected-hover\!:hover
       Die Utility traegt selbst !important; unser Wert setzt sich trotzdem
       durch, weil er nur die VARIABLE belegt, die sie ausliest. */
    --color-interactive-secondary-solid-background-selected-hover: var(--md-rot-hover) !important;
    --color-interactive-secondary-solid-border-selected-hover:     var(--md-rot-hover) !important;
    --color-interactive-secondary-solid-text-selected-hover:       #fff                !important;

    /* Die Schiene hinter dem Umschalter stand auf #e3e8ef (hellgrau). Auf
       hellgrauem Grund waere die jetzt weisse Schrift unlesbar -- die Schiene
       muss also mitwandern. Das ist dieselbe Falle wie im Spendenformular:
       wer eine Variable umwidmet, muss jede daran haengende Eigenschaft
       nachziehen. */
    --segmented-control-background: var(--md-blau-dunkel) !important;

    /* ---- Masse der Betragsknoepfe ------------------------------------------
     * Ziel sind die 40 px des Vorbilds (.choice { min-height: 40px }).
     * Rechnung: Zeile 1.5 x 16 px = 24 px, zwei Rahmen à 1 px = 2 px,
     * bleiben 14 px fuer oben und unten -> 7 px = 0.4375rem.
     *
     * ⚠️ Auf Desktop setzt das Bauteil mit md:p-(--toggle-button-padding-x)
     * ALLE VIER Seiten aus der X-Variablen. Der Wert ist deshalb zugleich der
     * seitliche Innenabstand -- das faellt nicht auf, weil die Knoepfe im
     * Raster ohnehin gleich breit sind. */
    --toggle-button-padding-x:        0.4375rem !important;
    --toggle-button-padding-y-mobile: 0.4375rem !important;
    --toggle-button-font-size:        1rem      !important;
    --toggle-button-line-height:      1.5       !important;
    --toggle-button-gap:              0.625rem  !important;

    /* ⚠️ 700, nicht 600. Nachgelesen in der Vorlage statt geschaetzt:
       .choice .amount { font-weight: 700 } -- 600 ist dort die Schrift der
       WEITER-Knoepfe (--fb-button-font-weight), nicht die der Betragskacheln.
       Ich hatte zuerst 600 gesetzt. */
    --toggle-button-font-weight:      700       !important;

    /* ⚠️ Auf schmalen Fenstern (unter 768 px) nimmt die Beschriftung NICHT
       --toggle-button-font-size, sondern --paragraph-font-size-lg (1.25em).
       Ohne diese Zeile waren die Knoepfe dort 46 px hoch und 20 px gross,
       auf Desktop dagegen 40/16 -- derselbe Knopf in zwei Groessen.
       Geprueft, wer das Token sonst noch benutzt: NUR diese drei
       Beschriftungen. Sollte spaeter eine Meldung oder ein neuer Textblock
       damit gestaltet werden, ist diese Zeile erneut zu pruefen. */
    --paragraph-font-size-lg:         1rem      !important;

    /* ---- Rhythmus-Umschalter, Masse ---------------------------------------- */
    --segmented-control-height:                40px     !important;
    --segmented-control-height-mobile:         40px     !important;
    --segmented-control-font-size:             1rem     !important;
    --segmented-control-font-size-mobile:      1rem     !important;
    --segmented-control-font-weight:           700      !important;

    /* ⚠️⚠️ Die Luecke zwischen "Einmalig" und "Monatlich" bleibt bewusst 0.
       Eine Luecke laesst sich zwar setzen (10 px waren eingebaut und
       geometrisch nachgemessen), sie ist aber UNSICHTBAR: der nicht gewaehlte
       Eintrag hat gar keinen eigenen Grund (gemessen: rgba(0,0,0,0)) -- das
       Dunkelblau kommt von der durchgehenden Schiene, die auch unter der
       Luecke durchlaeuft. Sichtbar wuerde sie nur mit heller Schiene, und die
       verlangt dunkle Schrift; dasselbe Textfarb-Token gilt aber auch fuer die
       Betragskacheln, die dann ebenfalls hell werden muessten. Am 20.8.2026
       vorgelegt und so entschieden: dunkel bleiben, ohne sichtbare Luecke. */
    --segmented-control-gap:                   0        !important;
    --segmented-control-line-height:           1.5      !important;
    --segmented-control-line-height-mobile:    1.5      !important;
    --segmented-control-item-padding-x:        0.75rem  !important;
    --segmented-control-item-padding-y:        0.25rem  !important;
    --segmented-control-item-padding-y-mobile: 0.25rem  !important;

    /* ---- Betragsfeld -------------------------------------------------------
     * Im Vorbild ist das Freibetragsfeld ein normales Eingabefeld: weiss,
     * grauer Rahmen, Text in --md-text. Hier war es 72 px hoch mit einer
     * 28 px grossen, halbfetten Zahl. */
    --input-amount-height:                   40px     !important;
    --input-amount-height-mobile:            40px     !important;
    --input-amount-content-padding-y:        0.25rem  !important;
    --input-amount-content-padding-y-mobile: 0.25rem  !important;
    --input-amount-content-padding-x:        0.75rem  !important;
    --input-amount-currency-font-size:        1rem    !important;
    --input-amount-currency-font-size-mobile: 1rem    !important;

    /* ⚠️ NAMENSFALLE, am 20.8.2026 durchgemessen: die Schrift im Feld haengt
       an --input-amount-placeholder-*, NICHT an --input-number-*, obwohl der
       zweite Name danach klingt. Kontrollmessung: Platzhalter-Token auf 900
       -> Feld wurde 900; --input-number-font-weight auf 900 -> Feld blieb 400.
       Die --input-number-*-Zeilen sind deshalb bewusst NICHT gesetzt.

       700 ist der Wert der Vorlage: .input-custom-amount { font-weight: 700 }.
       ⚠️ Dort ist nur der EINGEGEBENE Wert 700, der Platzhalter 400 -- hier
       haengen beide am selben Token, trennen laesst sich das nicht. 700
       gewinnt, weil im Normalfall ein Betrag vorbelegt ist und der Platzhalter
       gar nicht zu sehen. */
    --input-amount-placeholder-font-size:        1rem !important;
    --input-amount-placeholder-font-size-mobile: 1rem !important;
    --input-amount-placeholder-font-weight:      700  !important;

    /* Eigene Tokens des Feldes -- beruehren die Knoepfe nicht (geprueft:
       das Feld nutzt --color-form-control-*, die Knoepfe --color-border-default).
       Weiss, nicht der Formulargrund #f8fafc: die Vorlage hat
       .choice.choice-custom { background-color: #fff }. */
    --color-form-control-background: #fff             !important;
    --color-form-control-border:     var(--md-rahmen) !important;
    --color-form-control-text:       var(--md-text)   !important;

    /* Das Feld hat EIGENE Ueberfahren-Tokens -- unabhaengig von allem anderen,
       am Element abgelesen (hover:bg-form-control-background-hover,
       hover:text-form-control-text-hover, hover:border-form-control-border-hover).
       Voreingestellt war ein fremdes Blau als FLAECHE; gemeldet als "komisches
       Blau".
       ⚠️ Zweiter Anlauf: ich hatte den Rahmen auf Hausblau gesetzt -- damit war
       der Wechsel zwar in Hausfarbe, aber es gab ihn weiterhin ("Hover ist
       immer noch gleich"). Die Vorlage laesst das Freibetragsfeld beim
       Ueberfahren UNVERAENDERT; nur die blauen Kacheln hellen auf.
       Alle drei Werte stehen deshalb auf dem Normalzustand: kein Hover. */
    --color-form-control-background-hover: #fff              !important;
    --color-form-control-text-hover:       var(--md-text)    !important;
    --color-form-control-border-hover:     var(--md-rahmen)  !important;

    /* ⚠️ Die Platzhalterfarbe wird NICHT gesetzt: die Vorgabe des Bauteils ist
       bereits #9199a5 -- exakt der Wert der Vorlage
       (.choice.choice-custom input::placeholder { color: #9199a5 }).
       Nachgemessen mit Positivkontrolle: --color-form-control-placeholder auf
       Magenta schlaegt durch, drei Kontrolltokens nicht. Eine Zeile, die den
       vorhandenen Wert wiederholt, waere nur Ballast. */

    /* ---- Fliesstext und Ankreuzfeld ----------------------------------------
     * Die Belegung von --color-text-subtle steht weiter unten, zusammen mit
     * der Begruendung -- hier stand sie frueher doppelt.
     *
     * Kaestchengroesse wie in der Vorlage: --fb-checkbox-size: 1rem = 16 px
       (hier waren 20 px voreingestellt), Rahmen 1 px, Radius 0.
     *
     * ⚠️⚠️ WAS HIER NICHT GEHT, und warum es beim naechsten Blick auffaellt:
     * die Vorlage will VIER verschiedene Farben --
     *     Rahmen unangekreuzt  #e5e7eb (sehr hell)
     *     Fuellung angekreuzt  #1271ee (Hausblau, --fb-primary)
     *     Beschriftung         #606060
     *     Hinweis darunter     #606060
     * Hier speist ALLE VIER dasselbe Token --color-text-subtle: das Kaestchen
     * traegt text-text-subtle / border-text-subtle / ring-text-subtle, und die
     * Regel des Bauteils lautet
     *     input[type=checkbox]:checked { background-color: currentColor }
     * -- die Fuellung IST also die Textfarbe. Ein eigenes Farb-Token fuer das
     * Kaestchen gibt es in der ganzen --checkbox-Gruppe nicht (7 Variablen,
     * alle nur Masse). Getrennt einfaerben ginge nur mit einem Selektor im
     * Shadow-Baum.
     * ⚠️⚠️ AM 21.8.2026 ZWEIMAL ENTSCHIEDEN -- Endstand ist #606060.
     * Erst wurde Hausblau gewaehlt (Kaestchen hat Vorrang), am gebauten
     * Ergebnis dann verworfen: mit Blau werden Beschriftung ("Ich moechte den
     * Newsletter erhalten") UND der Hinweis darunter ("Name & E-Mail werden an
     * die Organisation uebermittelt") ebenfalls blau, und blauer Fliesstext
     * liest sich wie ein Link, obwohl beide Zeilen keiner sind.
     * Jetzt also: Texte auf dem Vorlagenwert #606060, das Kaestchen grau
     * statt hausblau. Blau kostet die beiden Texte -- das ist der ganze
     * Handel, eine Zeile in jede Richtung.
     * ⚠️ Beim Pruefen NICHT nach dem Bildschirmfoto urteilen: im komprimierten
     * Ausschnitt sah die Beschriftung dunkel aus, gemessen war sie blau. */
    --color-text-subtle: var(--md-text) !important;

    --checkbox-control-size: 1rem !important;
    --checkbox-border-width: 1px  !important;

    /* ---- Knoepfe ("Zu weiteren Zahlungsarten") ------------------------------
     * Masse wie --fb-button-padding im Spendenformular. Der PayPal-Knopf ist
     * eine Grafik des Anbieters und bleibt davon unberuehrt. */
    --button-padding-x:          1.5rem  !important;
    --button-padding-y:          0.55rem !important;
    --button-medium-font-size:   1rem    !important;
    --button-medium-line-height: 1.5     !important;

    /* "Zu weiteren Zahlungsarten" als dunkelblauer Knopf im selben Ton wie die
       Betragskacheln -- entschieden am 20.8.2026, nachdem der Hover-Konflikt
       (s. oben) sich mit Tokens nicht aufloesen liess.
       ⚠️ Der GRUND-Token gehoert ihm allein (die Kacheln nehmen
       --color-interactive-secondary-outlined-background), nur der Hover ist
       geteilt. Beide auf denselben Ton zu stellen macht die Teilung harmlos.
       ⚠️ Der Name des Textfarb-Tokens ist irrefuehrend: -text-focus ist der
       NORMALZUSTAND (am Element nachgelesen), nicht der Fokuszustand.
       ⚠️ Die Unterstreichung bleibt -- sie kommt aus einer Utility-Klasse am
       Element und ist ohne Selektor im Shadow-Baum nicht abzuschalten. */
    --color-interactive-neutral-outlined-background: var(--md-blau-dunkel) !important;
    --color-interactive-neutral-outlined-text-focus: #fff                  !important;
    --color-interactive-neutral-outlined-text-hover: #fff                  !important;

    /* ---- Abstaende ---------------------------------------------------------
     * Alle drei auf denselben Wert, wie im Spendenformular. Gemessen ergibt
     * das 20 px zwischen Umschalter und Knoepfen UND zwischen Knoepfen und
     * Feld -- vorher waren es zwei verschiedene Werte. */
    --container-gap:            var(--md-abstand) !important;
    --fieldset-gap:             var(--md-abstand) !important;
    --input-amount-section-gap: var(--md-abstand) !important;

    /* ---- Fokus -------------------------------------------------------------
     * Das Spendenformular hat dafuer EINE Sammelregel am Dateiende (2px
     * --md-blau-dunkel). Hier gibt es keine Selektoren, also drei Tokens.
     * Mit Positivkontrolle geprueft: Token auf Magenta -> Ring wurde magenta,
     * also zeigt der blaue Ring tatsaechlich unseren Wert und nicht die
     * Vorgabe des Anbieters. */
    --color-form-control-focus-outline:           var(--md-blau-dunkel) !important;
    --color-interactive-focus-outline:            var(--md-blau-dunkel) !important;
    --color-interactive-secondary-focus-outline:  var(--md-blau-dunkel) !important;

    /* ⚠️⚠️ Der Fokusring ist KEIN outline, sondern ein ::after-Rechteck.
       Am Markup nachgelesen, nachdem zwei Linien stehen blieben:
           has-focus-visible:outline-0!                     <- outline wird
                                                               ausdruecklich
                                                               abgeschaltet
           has-focus-visible:after:absolute
           has-focus-visible:after:-inset-(--input-amount-outline-offset)
           has-focus-visible:after:border-(length:--input-amount-outline-width)
           has-focus-visible:after:border-form-control-focus-outline

       Entscheidend ist das MINUS in -inset-(...): der gesetzte Wert wird
       negiert. Die Vorgabe war calc(.0625em + .125em + .125em) = 5px, also
       inset:-5px -> ein abgesetzter Ring mit Luft. Mein erster Versuch mit
       -2px ergab inset:+2px -> der Ring rutschte NACH INNEN und stand als
       zweite Linie neben dem grauen 1px-Rahmen. Genau die zwei Linien.

       Richtig ist +1px: inset:-1px legt das Rechteck exakt ueber den 1px
       breiten Rahmen des Feldes, seine 2px-Kante deckt ihn vollstaendig ab.
       Ergebnis: EINE Linie, wie in der Vorlage.

       ⚠️ --input-outline-offset / --input-outline-width sind hier tot: sie
       speisen has-focus-visible:outline-*, und das outline wird eine Zeile
       weiter mit outline-0! abgeschaltet. Deshalb NICHT gesetzt. */
    --input-amount-outline-offset: 1px !important;
    --input-amount-outline-radius: 0   !important;
    --input-amount-outline-width:  2px !important;

    /* ---- Meldungsbaender ---------------------------------------------------
     * Das Bauteil kennt zwei Typen, am Quelltext abgelesen:
     *     type INFO   -> "Ihre Spende wurde abgebrochen"  (Vorgabe hellblau)
     *     type ERROR  -> "Zahlungsfehler"                 (Vorgabe hellrot)
     * Die Vorlage faerbt beide gleich:
     *     .alert-error, .error-banner { background: #ff7300; color: #fff }
     *
     * Je Typ drei Tokens, einzeln mit Positivkontrolle bestimmt:
     *     --color-<typ>-light           die Flaeche
     *     --color-<typ>                 Symbol und Ueberschrift
     *     --color-<typ>-light-contrast  der Fliesstext
     * ⚠️ Der Fliesstext haengt NICHT an --color-text-default -- das faerbt die
     * eingebaute Ueberschrift. Magenta-Probe darauf liess das Band unberuehrt.
     *
     * ⚠️ KONTRAST, aus der Vorlage uebernommen: weiss auf #ff7300 sind
     * 2,73:1 und verfehlen die 4,5:1. Der Nutzer hat sich am 19.8.2026 nach
     * Vorlage der Messung ausdruecklich fuer weisse Schrift entschieden; hier
     * gilt dieselbe Entscheidung, damit beide Formulare gleich aussehen.
     * Ab etwa #c25400 traegt Weiss wieder ueber 4,5:1.
     *
     * ⚠️⚠️ --color-error faerbt NICHT nur das Band. Die vier Zeilen darunter
     * sind kein Beiwerk, sondern die Reparatur eines Fehlers, den nur ein
     * echter Test gezeigt hat: mit --color-error:#fff wurde auch die Meldung
     * UNTER dem Feld weiss -- "Dies ist ein Pflichtfeld." stand unsichtbar auf
     * weissem Grund. Ausgeloest habe ich den Fall ohne Absenden, indem ich das
     * Betragsfeld geleert habe.
     * Trennbar ist es, weil --color-interactive-error-text nur eine ABLEITUNG
     * von --color-error ist: setzt man es ausdruecklich, gewinnt es. Einzeln
     * mit Magenta belegt:
     *     --color-error                    Ueberschrift + Symbol im Band
     *     --color-interactive-error-text   die Meldung unter dem Feld
     *     --color-form-control-text-error  der Feldinhalt im Fehlerfall
     * ⚠️ #dc3545 statt --md-rot fuer die Meldung: exakt die Begruendung der
     * Vorlage -- #f45e5e schafft auf Weiss keine 4,5:1, #dc3545 mit 4,53:1
     * gerade so. Rahmen duerfen 3:1 und nehmen deshalb --md-rot. */
    --color-info-light:           #ff7300 !important;
    --color-info:                 #ffffff !important;
    --color-info-light-contrast:  #ffffff !important;
    --color-error-light:          #ff7300 !important;
    --color-error:                #ffffff !important;
    --color-error-light-contrast: #ffffff !important;

    /* ---- Eingebaute Ueberschrift -------------------------------------------
     * Schwarz wie das H1.title auf /spenden (dort rgb(0,0,0) gemessen).
     * ⚠️ Das ist alles, was an ihr erreichbar ist: Groesse (30 px statt 28),
     * Gewicht (500 statt 600) und die Zentrierung stehen fest im Bauteil
     * (.prose-lg h2 ohne Variable, text-center als Utility-Klasse).
     * ⚠️ Geprueft, dass dieses Token sonst nichts faerbt: einziger weiterer
     * Nutzer waere der Fliesstext im Meldungsband, und der folgt gemessen
     * --color-<typ>-light-contrast. Gegenprobe im Fehlerfall: Titel
     * rgb(0,0,0), Bandtext rgb(255,255,255). */
    --color-text-default: #000 !important;

    --color-interactive-error-text:      #dc3545         !important;
    --color-form-control-text-error:     var(--md-text)  !important;
    --color-form-control-border-error:   var(--md-rot)   !important;
    --color-form-control-background-error: #fff          !important;
}

/* ============================================================================
 *  EIGENE UEBERSCHRIFT UEBER DEM FORMULAR
 * ----------------------------------------------------------------------------
 *  ⚠️ Setzt voraus, dass im FundraisingBox-Backend der Titel ABGESCHALTET ist
 *  (in der Konfiguration: title.isActive). Sonst stehen zwei Ueberschriften
 *  untereinander.
 *
 *  Warum ueberhaupt eine eigene: die eingebaute laesst sich nicht angleichen.
 *  Das Bauteil rendert sie als <h2> in einem prose-Container, und dort steht
 *      .prose-lg h2 { font-size: 1.5em; font-weight: 500 }
 *  fest im Blatt -- ohne Variable, also von aussen nicht erreichbar. Die
 *  Zentrierung kommt aus der Utility-Klasse text-center am Elternelement und
 *  ist ebenso wenig zu ueberschreiben, weil kein Selektor in den Shadow-Baum
 *  reicht. Erreichbar waere allein die Farbe.
 *
 *  Die Werte sind am echten H1.title auf /spenden gemessen, nicht geschaetzt:
 *  28px / 600 / #000 / Source Sans Pro.
 * ============================================================================ */

/* ⚠️⚠️ DIESE Ueberschrift ist die gewollte -- 28 px / 600 / schwarz /
 * linksbuendig, gemessen am H1.title auf /spenden.
 *
 * Die eingebaute Ueberschrift des Bauteils (customWordings.title) muss dafuer
 * im FundraisingBox-Backend ABGESCHALTET werden: title.isActive. Solange sie
 * an ist, stehen zwei "Jetzt foerdern" untereinander.
 *
 * ⚠️ Ich hatte am 21.8.2026 zwischenzeitlich DIESE hier ausgeblendet und
 * stattdessen die eingebaute schwarz eingefaerbt -- das war die falsche von
 * beiden. Die eingebaute ist 30 px / Gewicht 500 / zentriert, und daran ist
 * von aussen nichts zu aendern: .prose-lg h2 setzt Groesse und Gewicht fest
 * ohne Variable, text-center ist eine Utility-Klasse am Elternelement.
 * Erreichbar waere allein die Farbe. Deshalb bleibt es beim Backend-Schalter.
 *
 * ⚠️ --color-text-default weiter oben faerbt genau jene eingebaute
 * Ueberschrift. Ist der Schalter aus, ist die Zeile wirkungslos -- sie stoert
 * nicht, macht aber auch nichts mehr. */
.md-express-kopf {
    /* ⚠️ margin 0 mit Nachdruck: die h2-Regel der Site setzt 16 px unten, und
       diese 16 px waren als dunkler Streifen zwischen Ueberschrift und
       Formular zu sehen -- genau die Naht, die nicht sichtbar sein soll.
       Der Innenabstand entspricht --container-padding des Bauteils (1.5em),
       damit die Ueberschrift auf derselben Flucht steht wie der Inhalt. */
    margin: 0 !important;
    padding: 1.5rem 1.5rem 0;
    background: #f8fafc;

    font-family: "Source Sans Pro", sans-serif;
    font-size: 1.75rem;      /* 28 px */
    font-weight: 600;
    line-height: 1.2;
    color: #000;
}

/* ============================================================================
 *  DATENSCHUTZHINWEIS UNTER DEM FORMULAR
 * ----------------------------------------------------------------------------
 *  Wortlaut und Link sind identisch mit dem Spendenformular (dort setzt
 *  mdDatenschutzhinweisSetzen() in fundraisingbox-2026.js denselben Satz
 *  ueber den Absende-Knopf).
 *
 *  ⚠️ Hier steht er UNTER dem Formular, nicht ueber dem PayPal-Knopf. Der
 *  Knopf liegt im geschlossenen Shadow-Baum; die Express-Vorlage kennt nur
 *  die Bausteine "amount" und "payment" und sechs feste Wordings, also gibt
 *  es auch im FundraisingBox-Backend kein Feld dafuer. Beides gemessen, nicht
 *  vermutet.
 *
 *  Damit keine Kante sichtbar wird, traegt der Absatz den Grund des Bauteils
 *  (--color-background-subtle = #f8fafc, im offenen Spiegelbaum ausgelesen)
 *  und dessen seitlichen Innenabstand (--container-padding = 1.5em).
 *
 *  ⚠️ Der Absatz gehoert in das TYPO3-Inhaltselement neben <frb-donation-form>,
 *  NICHT per JavaScript erzeugt: der Hinweis ist eine Pflichtangabe und darf
 *  nicht verschwinden, wenn ein Skript ausbleibt.
 * ============================================================================ */

.md-express-datenschutz {
    margin: 0;
    padding: 0 1.5rem 1.5rem;
    background: #f8fafc;
    color: #606060;
    font-size: 0.875rem;
    line-height: 1.4;

    /* Die Seite trennt lange Woerter automatisch. Ohne diese Zeile brach
       "Datenschutzerklärung" mitten im Link um ("Datenschutzer-klärung"). */
    hyphens: manual;
}

/* Wie auf der uebrigen Website: helles Hausblau, beim Ueberfahren dunkel.
   Andersherum -- dunkel als Normalzustand -- widerspricht der Gewohnheit auf
   mehr-demokratie.de.

   ⚠️ Hier stehen die Farben als Zahl, nicht als var(--md-blau): die
   Hausfarben sind oben am Bauteil <frb-donation-form> deklariert, und der
   Absatz ist dessen GESCHWISTER, erbt sie also nicht. Ein var(--md-blau)
   waere hier still auf den Rueckfallwert gelaufen -- sichtbar identisch,
   und beim naechsten Farbwechsel unbemerkt falsch. */
.md-express-datenschutz a {
    color: #1271ee;
    text-decoration: underline;
}

.md-express-datenschutz a:hover,
.md-express-datenschutz a:focus-visible {
    color: #003567;
}

.md-express-datenschutz a:focus-visible {
    outline: 2px solid #094f9e;
    outline-offset: 2px;
}

/* ====================================================================== */
/*  MD-Design fuer orestbida/cookieconsent 3  (ab Fassung 2.4, 17.8.2026)  */
/* ====================================================================== */
/*
   ⚠️ Die Bibliothek wird ueber IHRE Variablen eingefaerbt, nicht durch Ueberschreiben
   ihrer Regeln. Ein Update der Bibliothek bringt sonst jedes Mal die Gestaltung
   durcheinander, und man merkt es erst am fertigen Banner. Die vollstaendige Liste der
   erlaubten Variablen steht in Libs/orestbida/cookieconsent.css - was dort nicht
   vorkommt, faellt hier STILL aus.

   ⚠️⚠️ UMSTELLUNG AM 17.8.2026 - HELL STATT DUNKEL. Ansage des Nutzers: das
   Cookie-Fenster soll aussehen wie der Termin-Dialog der Veranstaltungskarte
   (md_events/Resources/Public/Css/listMap.css, `dialog.dialog-event`), und das ganze
   Plugin soll moeglichst KEINE eigenen Werte mitbringen, sondern Bestehendes benutzen.

   Bis dahin stand hier ein dunkles Banner (rgba(0,15,41,0.92), weisse Schrift) aus der
   Osano-Zeit. Bemerkenswert: die Bibliothek ist von Haus aus HELL (--cc-bg:#fff) - der
   Umbau nimmt also groesstenteils eigene Uebersteuerungen WEG, statt neue zu setzen.

   ⚠️⚠️ ALLE FARBEN STAMMEN AUS DER FARBSEITE der Site (/testseite-farben), keine
   einzige ist erfunden:
     #1271ee blue          #2e92ff blue:hover      #000f29 darkblue
     #ffffff white         #ebebeb gray            #cccccc lightgray
     #a0a0a0 mediumgray    #606060 darkgray        #003567 "Background"
   ⚠️ Wer hier einen Wert ergaenzt, nimmt ihn von dieser Seite - nicht aus dem Gefuehl.

   ⚠️⚠️ DIE BEIDEN KNOEPFE BLEIBEN GLEICHGEWICHTIG (OH Digitale Dienste Rn. 135). Die
   Bibliothek besorgt das ueber `equalWeightButtons: true`; wer hier unterschiedliche
   Groessen oder Schriftstaerken setzt, hebelt es aus. Deshalb unterscheiden sich
   "Zustimmen" und "Ablehnen" unten NUR in der Fuellung, nicht in Groesse oder Gewicht -
   dieselbe Loesung, die das dunkle Banner schon hatte.

   ── KONTRASTE, am 17.8.2026 GERECHNET (nicht geschaetzt) ──────────────────────
     Fliesstext  #000f29 auf #ffffff .......... 19,08:1   OK
     Zweitrang   #606060 auf #ffffff ...........  6,29:1   OK
     Zweitrang   #606060 auf #ebebeb ...........  5,27:1   OK
     Link        #1271ee auf #ffffff ...........  4,54:1   OK
     Knopf       #ffffff auf #1271ee ...........  4,54:1   OK
     Fokusring   #003567 auf #ffffff ........... 12,32:1   OK
   ⚠️ ZWEI bewusst in Kauf genommene Werte, beide GEERBT und nicht hier entstanden:
     Knopf-Hover #ffffff auf #2e92ff ...........  3,15:1   unter 4,5
       -> derselbe Sprung, den die Buttons der Site, das Video und die Karte machen.
          Vom Nutzer am 12.8.2026 ausdruecklich so entschieden ("wie bei den buttons
          auch #2e92ff"). Wer das aendert, aendert es an allen vier Stellen.
     Schalter AUS #cccccc gegen #ffffff ........  1,61:1   unter 3,0
       -> das ist EXAKT der Aus-Zustand der Kartenlegende (listMap.css, .slider).
          Uebernommen, weil der Auftrag "an die Karte angleichen" lautet. Der
          Unterschied AN/AUS traegt trotzdem: #1271ee gegen #cccccc.
          ⏰ Wer die 3:1 will, setzt --cc-toggle-off-bg auf #606060 (6,29:1) - dann
          weicht der Schalter aber sichtbar von der Karte ab. Das ist eine
          Entscheidung, keine Reparatur.
   ────────────────────────────────────────────────────────────────────────────── */
#cc-main {
    /* Schrift der Site, nicht die Systemschrift der Bibliothek. */
    --cc-font-family: "Source Sans Pro", sans-serif;

    /* Grund und Schrift wie die weissen Inhaltskarten des Karten-Dialogs
       (listMap.css: `dialog .dialog-event-item { background:#ffffff }`). */
    --cc-bg: #ffffff;
    --cc-primary-color: #000f29;
    --cc-secondary-color: #606060;
    --cc-link-color: #1271ee;

    /* Zustimmen - die Aktionsfarbe der Site, wie die Zoomknoepfe der Karte und der
       Schliessknopf des Termin-Dialogs. */
    --cc-btn-primary-bg: #1271ee;
    --cc-btn-primary-color: #ffffff;
    --cc-btn-primary-border-color: #1271ee;
    --cc-btn-primary-hover-bg: #2e92ff;
    --cc-btn-primary-hover-color: #ffffff;
    --cc-btn-primary-hover-border-color: #2e92ff;

    /* Ablehnen - GLEICHE Groesse und Schriftstaerke, nur ungefuellt. Auf hellem Grund
       ist die Kontur die blaue Aktionsfarbe (auf dem alten dunklen Banner war sie
       weiss); im Hover fuellt sie sich wie der Erstknopf. */
    --cc-btn-secondary-bg: #ffffff;
    --cc-btn-secondary-color: #1271ee;
    --cc-btn-secondary-border-color: #1271ee;
    --cc-btn-secondary-hover-bg: #2e92ff;
    --cc-btn-secondary-hover-color: #ffffff;
    --cc-btn-secondary-hover-border-color: #2e92ff;

    /* Eckig wie alles andere auf der Site - die Bibliothek haette .4rem. */
    --cc-btn-border-radius: 0;
    --cc-modal-border-radius: 0;

    /* Trenner und Gruppenbloecke in den Grautoenen der Palette.
       ⚠️⚠️ HOVER GEHT HELLER, NICHT DUNKLER. Vom Nutzer am 17.8.2026 gemeldet:
       "normales button / hover verhalten ist, dass das element dunkler / gesaettigter
       ist und auf hover heller wird." Genau so macht es die ganze Site - #1271ee wird
       im Hover zu #2e92ff, also heller. Mein erster Entwurf hatte es umgedreht
       (#ebebeb -> #cccccc) und damit gegen die Hausregel gebaut.
       ⚠️ Zweiter Einwand desselben Satzes: der Hover war #cccccc - und das ist die
       Farbe des AUSGESCHALTETEN Schalters. Dieselbe Farbe fuer "hier zeigt die Maus
       hin" und fuer "dieser Schalter ist aus" laesst zwei verschiedene Aussagen gleich
       aussehen. Der Hover ist deshalb jetzt Weiss.
       ⚠️ Damit der Block auf weissem Grund nicht verschwindet, traegt er in BEIDEN
       Zustaenden eine #cccccc-Kontur. Die Kontur ist kein Fuellton und kollidiert
       deshalb nicht mit der Aussage des Schalters.
       ⚠️ FESTGELEGT VOM NUTZER am 17.8.2026: "deaktiviertes toggle auf a0a0a0, ausklapper
       auf ccc, hover auf ebebeb". Damit steht eine durchgehende Staffelung, in der
       jeder Zustand seinen eigenen Ton hat und keiner doppelt vorkommt:
           #a0a0a0  Schalter AUS      (am dunkelsten, siehe --cc-toggle-off-bg unten)
           #cccccc  Gruppenblock Ruhe
           #ebebeb  Gruppenblock Hover  -> heller als Ruhe, wie ueberall auf der Site
           #ffffff  Gruppenblock aufgeklappt
       Die frueheren Fassungen dieses Blocks hatten den Hover teils dunkler als die
       Ruhe und teils in der Farbe des ausgeschalteten Schalters - beides ist damit
       erledigt. */
    --cc-separator-border-color: #ebebeb;
    --cc-section-category-border: #cccccc;
    --cc-cookie-category-block-bg: #cccccc;
    --cc-cookie-category-block-border: #cccccc;
    --cc-cookie-category-block-hover-bg: #ebebeb;
    --cc-cookie-category-block-hover-border: #cccccc;
    /* ⚠️ AUFGEKLAPPT BLEIBT DER BLOCK FARBIG, nicht weiss. Vom Nutzer am 17.8.2026
       gemeldet: "aufgeklappt soll es auch eine hintergrundfarbe fuer das element
       geben, nicht nur weiss." Sonst loest sich der Block beim Aufklappen im weissen
       Fenstergrund auf, und man sieht nicht mehr, wo eine Gruppe anfaengt und aufhoert.
       ⚠️⚠️ FALLE: die zweite Variable heisst zwar "...-hover-bg", die Bibliothek
       benutzt sie im aufgeklappten Zustand aber als RAHMENFARBE:
           .pm__section--toggle.is-expanded {
               --cc-cookie-category-block-bg:     var(--cc-cookie-category-expanded-block-bg);
               --cc-cookie-category-block-border: var(--cc-cookie-category-expanded-block-hover-bg);
           }
       Wer sie nach dem Namen belegt und Weiss einsetzt, macht den Rahmen unsichtbar -
       ohne dass eine Regel fehlt oder etwas meldet. Deshalb steht hier die Konturfarbe.
       ⚠️ ENDSTAND nach drei Zwischenschritten am 17.8.2026 - hier kurz, damit niemand
       einen davon fuer den gewollten Zustand haelt: erst weiss (Block loeste sich im
       Fenstergrund auf), dann #ebebeb ("kann heller sein"), dann wieder weiss, und
       schliesslich die Ansage "aufgeklappt auch ccc". Aufgeklappt traegt die Kopfzeile
       also DIESELBE Farbe wie zugeklappt: der Block behaelt sein Aussehen, geoeffnet
       wie geschlossen, und nur der gedrehte Pfeil zeigt den Zustand an.
       ⚠️ Gemessen: die Inhaltsflaeche darunter (.pm__section-desc) ist transparent und
       war von all dem nie betroffen - es ging immer nur um die Kopfzeile. */
    --cc-cookie-category-expanded-block-bg: #cccccc;
    --cc-cookie-category-expanded-block-hover-bg: #cccccc;

    /* ── Schalter wie die Kartenlegende ──────────────────────────────────────
       Vorbild: listMap.css, `.mdevents_map .legend-item .toggleswitch`.
       Dort: 40x24 Pille, Radius 24px, weisser 18px-Knopf, AUS #cccccc,
       AN = die Kategoriefarbe. Hier ist "AN" die Aktionsfarbe der Site.
       ⚠️ Der GESPERRTE Zustand (Gruppe "notwendig", nicht abwaehlbar) hat in der
       Karte KEIN Vorbild - dort ist nichts gesperrt. Deshalb ist er der einzige
       Wert, der frei zu waehlen war: #606060 (darkgray, 6,29:1). Die naechstliegende
       Wahl #a0a0a0 kam nur auf 2,61:1 und haette die 3:1 gerissen. */
    --cc-toggle-on-bg: #1271ee;
    /* ⚠️ #a0a0a0, festgelegt vom Nutzer am 17.8.2026 - nicht mehr das #cccccc der
       Kartenlegende. Zwei Gruende, beide gemessen: der Ton gehoert allein dem
       AUS-Zustand und kommt sonst nirgends im Fenster vor, und der Kontrast steigt
       von 1,61:1 auf 2,61:1 gegen Weiss. Die 3:1 fuer grafische Bedienelemente sind
       damit immer noch knapp verfehlt - #606060 kaeme auf 6,29:1, weicht aber
       deutlicher von der Karte ab. Bewusste Wahl des Nutzers, kein Versehen. */
    --cc-toggle-off-bg: #a0a0a0;
    --cc-toggle-on-knob-bg: #ffffff;
    --cc-toggle-off-knob-bg: #ffffff;
    --cc-toggle-readonly-bg: #606060;
    --cc-toggle-readonly-knob-bg: #ffffff;
    --cc-toggle-enabled-icon-color: #ffffff;
    --cc-toggle-disabled-icon-color: #ffffff;
    --cc-toggle-readonly-knob-icon-color: #606060;
    --cc-pm-toggle-border-radius: 24px;

    --cc-footer-bg: #ebebeb;
    --cc-footer-color: #606060;
    --cc-footer-border-color: #cccccc;

    /* Der Schleier hinter dem Einstellungsdialog - wie der Grund des Karten-Dialogs. */
    --cc-overlay-bg: rgba(0, 15, 41, 0.8);
}

/*
   SCHRIFTGROESSE = FLIESSTEXT (Ansage des Nutzers 17.8.2026).
   ⚠️ Die Bibliothek stellt dafuer KEINE Variable bereit - die --cc-Liste kennt nur
   --cc-font-family. Deshalb ausnahmsweise eine echte Regel statt einer Variablen.
   Gemessen auf dev: body steht auf 16px/24px, also 1rem/1.5. Vorher lief das Banner
   auf der Vorgabe der Bibliothek und war damit kleiner als der Text daneben. */
#cc-main,
#cc-main .cm__desc,
#cc-main .pm__section-desc {
    font-size: 1rem;
    line-height: 1.5;
}

/*
   ── Schriftstufen: 24 / 18 / 16 ─────────────────────────────────────────────────
   ⚠️ Vom Nutzer am 17.8.2026 in zwei Schritten vorgegeben: "cookie-einstellung
   groesser wie eine ueberschrift", dann "Gruppennamen auch etwas groesser, dann auch
   'wir fragen, bevor wir laden' genau so gross. und cookie-einstellung groesser als
   diese."

   Vorher lagen alle drei fast gleichauf und die Rangfolge war nicht zu sehen:
       Cookie-Einstellungen   16,0 px
       Wir fragen …           16,8 px
       Gruppennamen           15,2 px

   ⚠️⚠️ DIE WERTE STAMMEN AUS DER SCHRIFTSEITE DER SITE, /testseite-schriften - das
   ist die verbindliche Skala, nicht mein Augenmass:
       H1  28px / 35px / 600
       H2  24px / 30px / 600     -> Fenstertitel "Cookie-Einstellungen"
       H3  20px / 30px / 600     -> Abschnitts- und Gruppennamen
       H4  18px / 27px / 600
       p   16px / 24px / 400     -> Fliesstext
   ⚠️ Ich hatte zuvor an einzelnen Inhaltselementen der Startseite gemessen und war
   dabei auf 18px/27px fuer die Gruppennamen gekommen - die Seite lieferte dort ein H4.
   Richtig ist H3. Und mein damaliger Vermerk "h3 ist 32px" war ein Messfehler an einem
   Element mit eigener Klasse; laut Schriftseite ist H3 20px. Im Zweifel die
   Schriftseite lesen, nicht ein beliebiges Element abgreifen.
   ⚠️ Weight 600 stand ueberall schon so - gefehlt hat allein die Groesse.
*/
#cc-main .pm__title {
    font-size: 1.5rem;
    line-height: 1.875rem;
}

#cc-main .cm__title,
#cc-main .pm__section-title {
    font-size: 1.25rem;
    line-height: 1.875rem;
}

/*
   Knoepfe: 18px und BOLD 700.
   ⚠️ Die Schriftseite sagt es woertlich in ihrer Richtlinie: "4) Buttons sind Bold
   700." Am `.btn` der Site nachgemessen: 18px / 18px / 700. Die Bibliothek liefert
   ihre Knoepfe kleiner und mit Gewicht 600 - sie standen damit unter der Fliesstext-
   groesse des Fensters daneben.
   ⚠️⚠️ Groesse und Gewicht gelten fuer BEIDE Knoepfe gleich. "Alle erlauben" und
   "Nur notwendige" muessen gleichgewichtig bleiben (OH Digitale Dienste Rn. 135) -
   eine Abstufung genau hier waere der klassische Weg, die Ablehnung unauffaelliger
   zu machen. Deshalb steht in beiden Selektoren derselbe Wert.
*/
#cc-main .cm__btn,
#cc-main .pm__btn {
    font-size: 1.125rem;
    font-weight: 700;
}

/*
   Rahmen des Fensters wie beim Karten-Dialog: eckig, ohne Schlagschatten-Spielerei.
   ⚠️ Der Weichzeichner des alten dunklen Banners ist WEG. Er hatte dort einen Zweck
   (die Seite schien durch den halbdurchsichtigen Grund), auf weissem Grund erzeugt er
   nur Rechenlast ohne sichtbare Wirkung.
*/
#cc-main .cm,
#cc-main .pm {
    border: 1px solid #cccccc;
}

/*
   ⚠️ KEIN ANIMIERTER UNTERSTREICHUNGS-HOVER (Ansage des Nutzers 17.8.2026).
   Der Link "Weitere Informationen zum Datenschutz" traegt die Klasse `cc__link` und
   erbt sonst die Link-Gestaltung der Site, die die Unterstreichung einblendet.
   Hier steht sie fest an: sichtbar, ohne Uebergang.
   ⚠️⚠️ Der Fokusring darf dabei NICHT mitverschwinden - er ist eine
   Barrierefreiheits-Anforderung, keine Zier. Deshalb nur `transition` und
   `background-image` zuruecknehmen, NICHT `outline`.
*/
#cc-main .cc__link {
    background-image: none;
    text-decoration: underline;
    transition: none;
}

#cc-main .cc__link:hover {
    color: #2e92ff;
    text-decoration: underline;
}

/*
   Schliessknopf wie im Karten-Dialog.
   Vorbild: listMap.css, `dialog.dialog-event .btn-close-container > button.close` -
   45x45, #1271ee, weisses Kreuz, Hover #2e92ff, Uebergang 0.4s.

   ⚠️⚠️ DAS KREUZ IST DAS SVG DER BIBLIOTHEK, KEINE FONT-AWESOME-GLYPHE.
   Der erste Entwurf am 17.8.2026 blendete das SVG aus und setzte stattdessen ein
   ::before mit "\f00d" - wie es die Karte tut. Ergebnis auf dev: ein blaues Quadrat
   OHNE Kreuz. Nachgemessen war der Inhalt korrekt (Zeichencodes 0x22, 0xf00d, 0x22),
   die Schrift geladen und weiss - die Glyphe wurde trotzdem nicht sichtbar; der Knopf
   traegt overflow:hidden und line-height:normal aus der Bibliothek.
   Statt das weiter aufzudroeseln, bleibt das mitgelieferte SVG stehen und wird nur
   eingefaerbt. Das ist ZUGLEICH das, was der Auftrag verlangt ("keine neuen Styles,
   auf Bestehendes zurueckgreifen") - und es ueberlebt ein Update der Bibliothek.
   ⚠️ Nicht "reparieren", indem die Glyphe zurueckkommt. Der Weg war gemessen erfolglos.

   ⚠️ Messfalle, die dabei fast eine Fehldiagnose erzeugt haette: getComputedStyle()
   liefert den Inhalt als Zeichenkette mit einem PUA-Zeichen, und das ueberlebt den Weg
   aus dem Browserwerkzeug NICHT - der Wert sah wie ein leerer String aus. Erst die
   Ausgabe als ZAHLENliste zeigte, dass er stimmt.
*/
/*
   ⚠️ Der Knopf liegt UEBER dem Fenster, nicht darin - wie beim Karten-Dialog, wo
   `.btn-close-container` mit margin-bottom:1rem ueber der weissen Karte steht und
   `dialog.dialog-event` selbst gar keinen Grund hat.
   ⚠️⚠️ `.pm` traegt von der Bibliothek `overflow:hidden` und wuerde den herausragenden
   Knopf abschneiden. Das Aufheben ist hier gefahrlos, weil das INNERE Scrollen an
   `.pm__body` haengt (eigenes overflow:auto, gemessen 686x445) und nicht an `.pm`.
*/
#cc-main .pm {
    overflow: visible;
}

/*
   ── Hoehe waechst mit dem Inhalt, wie beim Karten-Dialog ────────────────────────
   ⚠️ Vom Nutzer am 17.8.2026 gemeldet ("hoehe automatisch anpassen ... oder hoehe wie
   beim dialog"): bei drei zugeklappten Gruppen stand unter dem letzten Block ein
   grosses leeres Feld. Ursache ist die Bibliothek:
       #cc-main .pm--box { height: calc(100% - 2em); max-height: 37.5em }
   also eine feste Hoehe, unabhaengig vom Inhalt.

   Der Karten-Dialog macht es umgekehrt und genau so, wie es hier sein soll: das
   Fenster selbst waechst mit, gedeckelt wird nur der INHALTSBEREICH
   (listMap.css: `dialog .dialog-event-group { max-height:70vh; overflow:auto }`).

   ⚠️ Die Deckelung an `.pm` bleibt trotzdem stehen - ohne sie koennte das Fenster bei
   vielen aufgeklappten Cookie-Tabellen ueber den Schirm hinauswachsen, und der
   Schliessknopf sitzt oberhalb der Oberkante. Er waere dann nicht mehr erreichbar.
*/
#cc-main .pm--box {
    height: auto;
    max-height: calc(100% - 2em);
}

#cc-main .pm__body {
    max-height: 70vh;
}

#cc-main .pm__close-btn,
#cc-main .cm__close-btn {
    position: absolute;
    top: -3.8125rem; /* 45px Knopf + 16px Abstand, entspricht dem margin-bottom:1rem der Karte */
    right: 0;

    display: flex;
    align-items: center;
    justify-content: center;

    width: 45px;
    height: 45px;
    padding: 0;
    border: none;
    border-radius: 0;
    background: #1271ee;
    transition: 0.4s;
}

/*
   ⚠️⚠️ DAS SVG DER BIBLIOTHEK WIRD AUSGEBLENDET, das Kreuz kommt als
   Font-Awesome-Glyphe - so macht es der Karten-Dialog
   (listMap.css: `button.close::before { content:"\f00d" }`), und der Nutzer hat den
   Unterschied am 17.8.2026 gesehen: das SVG der Bibliothek ist duenner gestrichelt
   und sitzt anders im Quadrat.
   ⚠️ Ausgeblendet wird das umschliessende <span>, NICHT nur das <svg> darin. Beim
   ersten Versuch stand nur `svg { display:none }` da - der leere span blieb als
   Flex-/Blockelement stehen, und die ::before-Glyphe war im 45px-Quadrat nicht zu
   sehen. Zusammen mit display:flex + Zentrierung sitzt sie jetzt mittig.
   ⚠️ font-weight:900 gehoert dazu: "Font Awesome 6 Free" liegt auf den Sites nur als
   solid-Schnitt, und ohne die 900 waehlt der Schriftabgleich zwar denselben Schnitt,
   aber man verlaesst sich dabei auf ein Verhalten statt auf eine Angabe.
*/
#cc-main .pm__close-btn > span,
#cc-main .cm__close-btn > span {
    display: none;
}

#cc-main .pm__close-btn::before,
#cc-main .cm__close-btn::before {
    content: "\f00d";
    font-family: "Font Awesome 6 Free";
    font-weight: 900;
    font-style: normal;
    font-size: 1.5rem;
    line-height: 1;
    color: #ffffff;
}

.no-touchevents #cc-main .pm__close-btn:hover,
.no-touchevents #cc-main .cm__close-btn:hover,
#cc-main .pm__close-btn:active,
#cc-main .cm__close-btn:active {
    background: #2e92ff;
}

/*
   ── Schalter wie die Kartenlegende ──────────────────────────────────────────────
   ⚠️ Vom Nutzer am 17.8.2026 gemeldet: "bei den toggles der karte gibt es keine
   harken und kein x, auch sehen die toggles insgesamt anders aus." Stimmt - die
   Bibliothek legt ein ✓ und ein ✗ in die Bahn und baut 50x23 statt 40x24.

   Vorbild (listMap.css, `.mdevents_map .legend-item .toggleswitch`):
     Bahn 40x24, Radius 24px, ohne Ring und ohne Schatten
     Knopf 18x18, weiss, 3px Rand, im Ein-Zustand translateX(16px)
   ⚠️ Die fuenf Zahlen 40/24/18/3/16 sind EIN Satz und haengen zusammen - genau wie
   drueben in listMap.css vermerkt. Wer eine davon aendert, aendert alle.
*/
#cc-main .toggle__icon-on,
#cc-main .toggle__icon-off {
    display: none;
}

#cc-main .toggle__icon {
    width: 40px;
    height: 24px;
    border-radius: 24px;
    box-shadow: none;
}

#cc-main .toggle__icon-circle {
    top: 3px;
    left: 3px;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    box-shadow: none;
}

#cc-main .section__toggle:checked ~ .toggle__icon .toggle__icon-circle {
    transform: translateX(16px);
}

/*
   ── Ausklapp-Pfeile und Uebergangszeit ──────────────────────────────────────────
   ⚠️ Vom Nutzer am 17.8.2026 nachgereicht: "auch die ausklapper pfeile und die
   transision von 0.4 bitte aus dem design uebernehmen."

   Vorbild ist der Karten-Dialog (listMap.css):
     dialog.dialog-event .event-item-category::before  -> "\f0da" zugeklappt (caret-right)
                                                          "\f0d7" aufgeklappt (caret-down)
   ⚠️ Hier wird NICHT der Inhalt getauscht, sondern EIN Zeichen gedreht: "\f0da" um
   90 Grad ist deckungsgleich mit "\f0d7", und nur so laesst sich der Wechsel
   ueberhaupt weich fuehren. Ein Inhaltswechsel springt hart - und die 0,4 s, die
   ausdruecklich mitgewuenscht sind, waeren wirkungslos. Dieselbe Loesung benutzt die
   Kartenlegende bereits (`.legend-filter-angle::before`, dort mit "\f105").

   ⚠️ Das Icon sitzt VORNE, an der Stelle, an der die Bibliothek ihren eigenen Pfeil
   hat: ein 20px-SVG in einem gefuellten Kreis, absolut bei left:18px, wofuer der
   Titel bereits padding-left:3.4em reserviert. Der Kreis entfaellt ersatzlos - der
   Karten-Dialog setzt dort einen blanken Caret ohne Hintergrund.

   ⚠️⚠️ ZWEI Stolpersteine, beide am 17.8.2026 auf dev gemessen, nicht vermutet:
   1. `#cc-main .pm__section-arrow { display:none }` GREIFT NICHT. Die Bibliothek
      schreibt `#cc-main .pm__section--expandable .pm__section-arrow{display:flex}` -
      Spezifitaet 1-2-0 gegen 1-1-0, ihre Regel gewinnt. Es standen dadurch zwei
      Pfeile nebeneinander. Der Selektor unten nennt deshalb dieselbe Klassenkette.
   2. Der Aufklapp-Zustand haengt an der Klasse `is-expanded` AM ABSCHNITT, nicht an
      `aria-expanded` am Knopf. Mit dem Attributselektor drehte sich nichts
      (gemessen: transform blieb in beiden Zustaenden "none").
*/
#cc-main .pm__section--expandable .pm__section-arrow {
    display: none;
}

/*
   ⚠️ ABSTAND: der Pfeil steht DICHT am Text, nicht in einem breiten Feld davor.
   Vom Nutzer am 17.8.2026 an einem Akkordeon der Site gezeigt ("Ausklapper wie hier
   ... bzgl. abstaende"). Die Bibliothek reserviert fuer ihren Kreis-Pfeil
   `padding-left: 3.4em` am Titel - bei den 20px Schriftgroesse dieser Zeile sind das
   rund 68px, und der blanke Caret stand darin verloren weit links.
   Gerechnet wird jetzt wie im Karten-Dialog, der `margin-right: 8px` hinter dem
   Caret setzt:
       Pfeil bei 1rem, Pfeil 1rem breit  -> endet bei 2rem
       Text bei 2.5rem                   -> 0,5rem = 8px Abstand
   ⚠️ NUR padding-left ueberschreiben. Die senkrechten Innenabstaende der Zeile
   stammen aus derselben Kurzschreibweise der Bibliothek - wer `padding` statt
   `padding-left` setzt, plattet die Zeile mit.
*/
#cc-main .pm__section--expandable .pm__section-title {
    padding-left: 2.5rem;
}

/*
   ⚠️ DIE AUFGEKLAPPTE INHALTSFLAECHE BLEIBT WEISS. Ansage des Nutzers am 17.8.2026
   ("den bereich nicht faerben ... oder weiss faerben"), nachdem die Kopfzeile auf
   #cccccc gesetzt wurde: die Bibliothek zieht denselben Wert auch unter Beschreibung
   und Cookie-Tabelle, weil beide `--cc-cookie-category-block-bg` benutzen und die
   Variable im aufgeklappten Zustand umdefiniert wird. Gefaerbt werden soll aber nur
   die KOPFZEILE - der Text darunter steht auf dem Fenstergrund.
   ⚠️ Ausgeschrieben und nicht ueber die Variable geloest: die Variable traegt hier
   zwei Bedeutungen (Kopfzeile UND Inhaltsflaeche), eine Aenderung an ihr faerbt immer
   beides. Nur eine eigene Regel trennt die zwei.
*/
#cc-main .pm__section--toggle .pm__section-desc-wrapper,
#cc-main .pm__section--toggle .pm__section-desc {
    background: #ffffff;
}

#cc-main .pm__section--expandable .pm__section-title::before {
    content: "\f0da";
    font-family: "Font Awesome 6 Free";
    font-weight: 900;
    font-style: normal;
    font-size: 1rem;
    line-height: 1;

    position: absolute;
    left: 1rem;
    top: 50%;
    transform: translateY(-50%);

    width: 1rem;
    text-align: center;
    transition: transform 0.4s;
}

#cc-main .pm__section--expandable.is-expanded .pm__section-title::before {
    transform: translateY(-50%) rotate(90deg);
}

/*
   ⚠️ 0,4 s ueberall, wie im Kartendesign. Die Bibliothek liefert 0,25 s an den
   Schaltern und 0,15 s an den Knoepfen - beides schneller als alles andere auf der
   Site (`transition:0.4s` steht in listMap.css an Zoomknoepfen, Schliessknopf,
   Schalter und Kategoriezeile).
   ⚠️ An den Knoepfen werden die EINZELNEN Eigenschaften genannt und nicht `all`:
   ein pauschales `all` zoege auch Groessen- und Positionswechsel mit, und die
   Knoepfe muessen gleichgewichtig BLEIBEN (OH Rn. 135) - ein animierter
   Groessenunterschied waere genau das, was die Regel verhindern soll.
*/
#cc-main .toggle__icon,
#cc-main .toggle__icon-circle {
    transition: transform 0.4s ease, background-color 0.4s ease;
}

#cc-main .cm__btn,
#cc-main .pm__btn {
    transition: background-color 0.4s, border-color 0.4s, color 0.4s;
}

/*
   ── DAS BANNER STEHT HOEHER, STATT PLATZ ANZUHAENGEN (18.8.2026) ────────────
   Ansage des Nutzers: "setz den banner etwas hoeher, so dass man einen kleinen
   abstand unter dem banner hat, so das man, wenn man moechte dazwischen das
   Impressum oder Datenschutz anklicken kann. Ohne Fussraumluecke" - fester Wert
   fuer ALLE Sites. Zuerst 50px probiert, am 18.8.2026 auf 100px erhoeht.

   Vorher haengte fussraumFreihalten() dem <body> die volle BANNERHOEHE als
   padding-bottom an, damit die Fusszeile ueber das Banner geschoben werden kann.
   Auf sprezu LIVE gemessen: 397px bei 1920 Breite, 373px bei 390 - ein leerer
   Streifen unter dem Footer, solange das Banner steht. Genau der sollte weg.

   ⚠️ Die Bibliothek setzt `#cc-main .cm--bottom { bottom: var(--cc-modal-margin) }`,
   also 1rem = 16px. Hier werden daraus 100px.

   ⚠️⚠️ DIE ZWEI REGELN UNTEN GEHOEREN ZUSAMMEN. Das Anheben allein bringt gar
   nichts: fussraumFreihalten() bemisst den Fussraum an der HOEHE des Banners,
   nicht an seiner Lage - die Luecke bliebe stehen und der Abstand kaeme obendrauf.
   Wer eine der beiden Regeln entfernt, bekommt entweder die Luecke zurueck oder
   ein Banner, das die Fusszeile wieder verdeckt.
   ⚠️ Der Fussraum ist ein INLINE-Stil am <body> - den schlaegt nur `!important`.
   Eng gefasst auf `html.show--consent`, weil er genau dann gesetzt wird; vorher
   geprueft, dass keine der Sites selbst ein padding-bottom am body fuehrt (die
   Treffer waren durchweg `body:after`-Debugmarken).
   ⚠️ Das Skript RECHNET den Wert weiterhin und setzt ihn - er wird hier nur
   ueberschrieben. Das ist fuer den Versuch Absicht: vollstaendig reversibel und
   ohne die Fassungsnummer des eID-Skripts anzufassen (eine CSS-Datei bekommt
   ihren Cache-Brecher aus der mtime, das eID-Skript nicht). Bleibt die Loesung,
   gehoert das Abschalten in fussraumFreihalten() selbst - dann MIT v=-Bump.

   🔴🔴 OFFEN UND UNGEPRUEFT, BEVOR DAS AUF PROD GEHT: ob 100px reichen, damit
   Impressum und Datenschutz am Seitenende anklickbar BLEIBEN (OH Digitale
   Dienste, Rn. 121). Der Spalt zeigt am Scroll-Anschlag die letzten 100px des
   Dokuments - liegt die Linkzeile hoeher, ist sie verdeckt, und das war der
   ganze Zweck des Fussraums. Der bisherige Weg war haesslich, aber er MASS und
   zog automatisch nach (247-499px je nach Breite und Textlaenge); dieser hier
   ist ein fester Wert an einer Rechtspflicht. Im Browser nachmessen.
*/
#cc-main .cm--bottom {
    bottom: 100px;
}

html.show--consent body {
    padding-bottom: 0 !important;
}

/*
   Der dauerhafte Widerrufsreiter.
   ⚠️⚠️ Er ersetzt den `.cc-revoke`-Reiter der alten Bibliothek. orestbida bringt keinen
   mit, und ohne ihn gaebe es nach der Entscheidung KEINEN sichtbaren Weg mehr, sie zu
   aendern - Verstoss gegen Art. 7 Abs. 3 S. 4 DS-GVO und OH Rn. 126. Am 14.8.2026
   nachgemessen: ohne diesen Knopf null Widerrufswege auf der Seite.

   ⚠️⚠️ ER BLEIBT UNVERAENDERT, auch nachdem das Fenster hell geworden ist. Beim
   Umbau am 17.8.2026 hatte ich ihn auf deckendes #1271ee gezogen; der Nutzer hat das
   noch am selben Tag zurueckgewiesen ("das flag auf der Startseite links am rand unten
   soll wieder aussehen wie vorher"). Der Grund traegt auch fachlich: der Reiter liegt
   ueber der SEITE, nicht im Fenster, und muss sich gegen beliebige Seiteninhalte
   behaupten - der durchscheinende Weissschleier mit Weichzeichner tut das auf hellen
   wie auf dunklen Hintergruenden. Nicht erneut an die Fenstergestaltung angleichen.
*/
.md-consent-reiter {
    position: fixed;
    left: 0;
    bottom: 100px;
    z-index: 100;

    display: flex;
    justify-content: center;
    align-items: center;
    text-align: center;

    /*
       ⚠️ Die 1.875rem OBEN sind kein Zierrat - sie sind der Platz, auf dem das
       Cookie-Symbol sitzt (`::before`, absolut bei top:8px). Wer sie kuerzt, legt
       das Symbol in das Wort "Cookies". Genau das ist bis zum 19.8.2026 auf den
       Landesverbands-Sites passiert, weil der Reiter als <button type="button">
       unter die Formularknopf-Regel von custom_md fiel (0-1-1 schlaegt 0-1-0);
       das type-Attribut ist deshalb aus widerrufsReiter() entfernt.
       ⚠️ `margin: 0` steht ausdruecklich da und nicht nur im `*`-Reset (0-0-0):
       eine blosse `button { margin: ... }`-Regel irgendeiner Hausschrift wuerde den
       Reiter sonst verschieben - dieselbe Regel hat ihm vorher 0.5em/1em verpasst. */
    margin: 0;
    padding: 1.875rem 0.4rem 0.1rem 0.4rem;
    border: 0;
    border-radius: 0;
    outline: 1px solid #fff;

    font-family: "Source Sans Pro", sans-serif;
    font-size: 0.75rem;
    font-weight: 700;
    color: #fff;
    background: rgba(255, 255, 255, 0.2);
    backdrop-filter: blur(5px);
    -webkit-backdrop-filter: blur(5px);

    cursor: pointer;
    transition: 0.4s;
}

.md-consent-reiter::before {
    font-family: "Font Awesome 6 Free";
    font-style: normal;
    font-variant: normal;
    line-height: 1;
    text-rendering: auto;
    content: "\f563";
    font-size: 1.125rem;
    position: absolute;
    top: 8px;
}

.no-touchevents .md-consent-reiter:hover,
.md-consent-reiter:active {
    background: #2e92ff;
}

/*
   ⚠️ Eigener Fokusring. Ohne ihn waere der Knopf mit der Tastatur unsichtbar.
   #003567 auf Weiss sind 12,32:1; dieselbe Farbe und dieselbe Staerke wie der
   Fokusring der Kartenlegende (listMap.css, .toggleswitch .slider:focus-visible).
*/
.md-consent-reiter:focus-visible {
    outline: 0.1875rem solid #003567;
    outline-offset: 0.125rem;
}

/**
 * Platzhalter fuer gesperrte Fremdeinbettungen (siehe ExternalContentBlocker.php).
 *
 * Bewusst eigenstaendig gehalten: die Datei wird auf allen Sites der Installation
 * ausgeliefert, die das statische Template einbinden. Sie darf deshalb keine
 * Variablen, Mixins oder Klassen eines einzelnen Site-Themes voraussetzen.
 *
 * Masse in rem (Basis 16px).
 */

/* Der gesperrte Rahmen selbst nimmt keinen Platz ein - sichtbar ist der Kasten
   davor. Ueber das Datenattribut, nicht ueber eine Klasse: so kann keine fremde
   Regel und kein Redakteur die Sperre versehentlich aufheben. */
iframe[data-md-src] {
    display: none !important;
}

/* ⚠️ Der Kasten und seine Zeilen sind <span>, nicht <div>/<p> - warum, steht in
   platzhalter() in ExternalContentBlocker.php: als Blockelement bricht der
   Platzhalter den umgebenden RTE-Absatz auf. Das Aussehen macht deshalb hier
   das display, nicht die Auszeichnung. display:flex blockifiziert den span
   ohnehin; die Zeilen bekommen display:block trotzdem ausdruecklich, damit sie
   auch dann untereinander stehen, wenn eine Site-Regel das flex ueberschreibt. */
.md-sperre {
    box-sizing: border-box;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.5rem;
    padding: 1.25rem;
    border: 0.0625rem solid #c6c6c6;
    border-radius: 0.25rem;
    background: #f4f4f4;
    color: #1a1a1a;
    font-size: 1rem;
    line-height: 1.45;
}

.md-sperre > span {
    display: block;
    margin: 0;
}

.md-sperre__titel {
    font-weight: 700;
}

.md-sperre__host {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.875rem;
    /* Lange Hostnamen duerfen den Kasten nicht sprengen. */
    overflow-wrap: anywhere;
}

.md-sperre__hinweis {
    font-size: 0.875rem;
}

.md-sperre__knopf {
    margin-top: 0.25rem;
    padding: 0.5rem 1.125rem;
    border: 0.0625rem solid #1271ee;
    border-radius: 0.1875rem;
    background: #1271ee;
    color: #fff;
    font: inherit;
    font-size: 1rem;
    line-height: 1.2;
    cursor: pointer;
}

.md-sperre__knopf:hover {
    background: #0d5bc4;
    border-color: #0d5bc4;
    color: #fff;
}

/* Sichtbarer Fokusring, der auch auf dem gefuellten Knopf noch Kontrast hat:
   aussen liegend, damit ihn der Knopfhintergrund nicht schluckt. */
.md-sperre__knopf:focus-visible {
    outline: 0.1875rem solid #1a1a1a;
    outline-offset: 0.125rem;
}

/* Rueckfall fuer Browser ohne :focus-visible - dort lieber ein Ring zu viel
   als keiner. */
.md-sperre__knopf:focus {
    outline: 0.1875rem solid #1a1a1a;
    outline-offset: 0.125rem;
}

.md-sperre__knopf:focus:not(:focus-visible) {
    outline: none;
}

@media (prefers-contrast: more) {
    .md-sperre {
        border-color: #1a1a1a;
        background: #fff;
    }
}

.video-shariff-play{position:relative;text-align:center;display:block}a.video-shariff-play img{display:inline-block}.video-shariff-preview{position:absolute;left:0;right:0;top:30%;text-align:center}.video-shariff-preview-overlay{background:rgba(255,255,255,0.6);display:block;position:absolute;top:0;bottom:0;left:0;right:0;-webkit-transition:all .4s cubic-bezier(0.165,0.84,0.44,1);transition:all .4s cubic-bezier(0.165,0.84,0.44,1)}a.video-shariff-play:hover .video-shariff-preview-overlay,a.video-shariff-play:focus .video-shariff-preview-overlay{background:transparent}.video-shariff-preview span{display:block;position:relative}.video-shariff-preview-icon{background:transparent;border-radius:.375rem;width:0;height:0;border-top:24px solid transparent;border-left:36px solid #000;border-bottom:24px solid transparent;margin:-1.45rem -2rem;left:50%}.video-shariff-preview-text{top:3rem;margin:0 auto;width:80%;font-weight:bold}@media screen and (min-width:800px){.video-shariff-preview{top:50%}.video-shariff-preview-text{width:60%}}
.campaigncounter .dynamicLayer {
    overflow: hidden; }
.campaigncounter .staticLayer .countervalue {
    color: #202020; }
.campaigncounter .dynamicLayer h2 {
    font-size: 1.5em;
    text-transform:none; }

.campaigncounter .dynamicLayer .progressbar_container {
    width: 100%;
    height: 48px;
    margin-bottom: 0.25em;
    border-bottom: 2px solid black;
    /*background-color:#004078;*/ }
.campaigncounter .dynamicLayer .progressbar {
    height: 100%;
    /*background-color: #80A0BC;*/
    text-align: right; }
.campaigncounter .dynamicLayer .progressbar .countervalue {
    display: block;
    margin-right: 10px;
    margin-left: 10px;
    padding-top: 10px;
    color: white; }


.tx-userdata .sharerButtons {display:flex;flex-wrap:wrap}
.tx-userdata .sharerButtons a.btn{min-width:235px}
.tx-userdata .sharer:hover {color:#fff!important;border:none;outline:none;}
.tx-userdata .sharer_facebook {background-color:#3b5998;}
.tx-userdata .sharer_facebook:hover {background-color:#3b5998E6;}
.tx-userdata .sharer_whatsapp {background-color:#3aaa34;}
.tx-userdata .sharer_whatsapp:hover {background-color:#3aaa34E6;}
.tx-userdata .sharer_bluesky {background-color:#0085ff;}
.tx-userdata .sharer_bluesky:hover {background-color:#0085ffE6;}
.tx-userdata .sharer_linkedin {background-color:#0073b1;}
.tx-userdata .sharer_linkedin:hover {background-color:#0073b1E6;}
.tx-userdata .sharer_email {background-color:#86bc26;}
.tx-userdata .sharer_email:hover {background-color:#9ec951;}
/*.tx-userdata .sharer_donate {background-color:#86bc26;font-size:1.5rem;padding:0.96rem 3rem;min-height:55px;}
.tx-userdata .sharer_donate:hover {background-color:#9ec951;}*/
.tx-userdata .sharer_exampletext {width:100%;min-height:200px;}
/*!
 * Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com
 * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
 * Copyright 2022 Fonticons, Inc.
 */
.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-arrow-turn-right:before,.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}
/*!
 * ⚠️⚠️ ANGEPASST 11.8.2026 — NICHT durch ein FontAwesome-Update ueberschreiben!
 * Die @font-face-Regel unten zeigt auf fa-solid-900-SUBSET.woff2 (4.276 B) statt
 * auf fa-solid-900.woff2 (150.516 B). Das Subset enthaelt genau die 48 Zeichen,
 * die in diesem Projekt benutzt werden — gescannt ueber alle Extensions
 * (44 Icon-Klassen + 19 direkte content-Codepoints im eigenen CSS).
 * ⚠️ EIN NEUES ICON ERSCHEINT ALS LEERES KAESTCHEN, bis es im Subset ist.
 *    Neu bauen mit:  Resources/Public/Vendor/fontawesome/subset-bauen.sh
 * ⚠️ Bei einem FA-Update wird DIESE Datei ersetzt und die Zeile faellt zurueck
 *    auf die volle Schrift — dann wieder umstellen (funktioniert weiter, nur
 *    150 kB schwerer, faellt also nicht als Fehler auf).
 * Das Original fa-solid-900.woff2 bleibt unveraendert daneben liegen.
 * Der ttf-Fallback zeigt bewusst weiter auf die VOLLE Datei: er greift nur in
 * Browsern ohne woff2-Unterstuetzung, und dort ist Vollstaendigkeit wichtiger.
 */
/*!
 * Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com
 * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
 * Copyright 2022 Fonticons, Inc.
 */
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url('../../../typo3conf/ext/custom_sprezu/Resources/Public/Vendor/fontawesome/webfonts/fa-solid-900-subset.woff2') format("woff2"),url('../../../typo3conf/ext/custom_sprezu/Resources/Public/Vendor/fontawesome/webfonts/fa-solid-900.ttf') format("truetype")}.fa-solid,.fas{font-weight:900}
/*!
 * Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com
 * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
 * Copyright 2022 Fonticons, Inc.
 */
:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url('../../../typo3conf/ext/custom_sprezu/Resources/Public/Vendor/fontawesome/webfonts/fa-brands-400.woff2') format("woff2"),url('../../../typo3conf/ext/custom_sprezu/Resources/Public/Vendor/fontawesome/webfonts/fa-brands-400.ttf') format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}
/* START - Basis */
/* Farbvariablen, Schriftdefinitionen (Interstate), CSS-Reset, globale Element- und Überschriften-Grundstile. */
/* ============================================================
   FARBEN
   ------------------------------------------------------------
   Blau/Rot = offizielle CI-Farben (Vorgabe CMYK 100/57/0/40 bzw.
   0/84/75/0, hier als RGB hinterlegt). Die *-rgb-Variablen halten das
   Komma-Tripel für rgba()-Transparenzvarianten (rgba(var(--color-x-rgb), .5)).
   --color-red-dark ist eine rechnerisch abgeleitete, dunklere Variante von
   --color-red für Hover-Zustände (keine eigene CI-Farbe).
   ============================================================ */
:root {
  --color-blue: #17427f;
  --color-blue-rgb: 23, 66, 127;
  --color-blue-secondary: #2c5288;
  --color-red: #ff6157;
  --color-red-rgb: 255, 97, 87;
  --color-red-dark: #D85049;
  --color-light: #FBF8F4;
  --color-light-rgb: 251, 248, 244;
  --color-cream: #F5EFE5;

  /* STATUSFARBEN, ergaenzt am 17.8.2026 fuer die Schweregrade der
     Flash-Meldungen (ul.typo3-messages, ~Z. 1290). Bewusst hier und nicht
     dort, damit sie einmal an einer Stelle stehen, falls spaeter etwas
     anderes einen Status faerben muss.
     ⚠️ Das sind KEINE freien Erfindungen:
     --color-orange ist das vorhandene Kartenorange der "gemischten"
       Marker (md_events/.../Css/listMap.css:319, .../listMap.js:492) —
       also schon Bestand, nur bisher ohne Variable.
     --color-notice hat der Nutzer vorgegeben.
     --color-green ist der einzige echte Neuzugang; die Marke hatte kein
       Gruen. In OKLCH gerechnet auf H 150 Grad (102 Grad von Orange,
       108 Grad von Blau — also etwa gleich weit von beiden entfernt),
       L 0.55 / C 0.14. Kontrast 4,32 gegen den Meldungsgrund. */
  --color-orange: #ff7300;
  --color-green: #1c8742;
  --color-notice: #EEEDEB;

  /* Logo-Maße, EINE Quelle der Wahrheit für Nav-Logo-Position UND
     Hero-Freiraum (padding-top von .hero-home-content/.hero-sub-content).
     Wird einer der Werte geändert (z.B. Logo-Offset), zieht das Hero-Padding
     automatisch mit — verhindert Logo/Text-Überlappung im Hero dauerhaft,
     ohne dass beide Stellen von Hand synchron gehalten werden müssen. */
  --logo-size: 100px;
  --logo-offset-mobile: 24px;
  --logo-offset-desktop: 2rem;
  --hero-clear-buffer: 24px;
  --hero-clear-mobile: calc(var(--logo-offset-mobile) + var(--logo-size) + var(--hero-clear-buffer));
  --hero-clear-desktop: calc(var(--logo-offset-desktop) + var(--logo-size) + var(--hero-clear-buffer));
}
/* ============================================================
   FOKUS — EIN Ring für die ganze Site (12.8.2026)
   ------------------------------------------------------------
   Vorher gab es nur `.btn:focus-visible` mit einfarbig blauem Ring. Zwei Fehler
   auf einmal, beide vom User an Screenshots gemeldet:

   1. BLAU AUF BLAU. `.btn-blue-filled` (z. B. „Routenplaner") hat selbst
      `border:1px solid var(--color-blue)` und blauen Grund. Der blaue Ring 2px
      daneben sah aus wie eine doppelte Kontur und markierte nur den Spalt.
   2. RECHTECK AUF PILLE. Alles ohne eigene Regel — `.filterbtn`, `.viewbtn`, die
      Menü-Labels — bekam den Ring des BROWSERS, und der folgt dem border-radius
      nicht. Deshalb das Rechteck um „Alle Monate".

   Die Ursache war dieselbe: ein EINfarbiger Ring kann nicht gleichzeitig gegen
   den Seitenhintergrund und gegen das Bedienelement kontrastieren. Auf einem
   blauen Knopf verschwindet Blau, auf einem roten Rot.

   Lösung ist der übliche ZWEIFARBIGE Ring: innen creme (hängt am Element), außen
   blau (hängt am Seitenhintergrund). Einer von beiden trägt immer.
   Gerechnet: creme auf --color-blue 9,35:1, blau auf creme 9,35:1 — und die
   beiden Ringe gegeneinander ebenfalls 9,35:1. Damit ist WCAG 2.4.11 (3:1 gegen
   die Nachbarfarbe) in jeder Kombination erfüllt.

   ⚠️ box-shadow UND outline folgen beide dem border-radius des Elements — der
   Ring wird auf einer Pille automatisch eine Pille. Genau das fehlte vorher.
   ⚠️ `:where()` gibt der Regel Spezifität NULL. Absicht: jede vorhandene
   Sonderregel sticht sie mühelos. Die drei Einwilligungsflächen (Video, Karte,
   Spenden) behalten deshalb ihren INNENliegenden Ring — dort würde ein äußerer
   vom `overflow:hidden` des Rahmens abgeschnitten. Das ist kein Versehen.
   ⚠️ Wer eine neue Sonderregel schreibt, muss BEIDE Teile setzen. Nur `outline`
   zu überschreiben lässt den creme box-shadow stehen.
   ⚠️ Nicht erfasst: Felder mit `outline:none` im `:focus` (z. B.
   `.registrationview .form-control`). Die haben höhere Spezifität und bleiben
   ohne Ring — eigener Punkt, hier bewusst nicht mitgeändert.
   ⚠️⚠️ Die Werte stehen als Variablen, weil es Regeln gibt, die die `:where()`-
   Regel zwangsläufig stechen: `.btn` trägt in seiner Grundregel `outline:none`
   (Spezifität 0-1-0) und würde die 0-0-0 hier sonst aushebeln — Buttons hätten
   dann GAR keinen Ring, schlimmer als vorher. Solche Stellen setzen dieselben
   drei Variablen, damit es trotzdem EIN Ring bleibt. Wer den Ring ändert, ändert
   ihn hier und nirgends sonst. */
/* ⚠️⚠️ 12.8.2026, ZWEITER Anlauf — der Ring liegt jetzt INNEN. Die erste Fassung
   lag aussen (outline-offset positiv, creme als aeusserer box-shadow) und hatte
   zwei Fehler, die der User an sieben Screenshots gezeigt hat:

   1. ABGESCHNITTEN. Ein Ring ausserhalb des Elements wird von JEDEM Vorfahren
      mit overflow:hidden gekappt — Footer-Button, Datenschutz-Link, Fliesstext-
      Link. Jeden solchen Vorfahren zu suchen waere ein Fass ohne Boden; ein
      innenliegender Ring kann gar nicht abgeschnitten werden.
   2. STILL VERSCHWUNDEN. Der creme Innenring hing an `box-shadow` — und jedes
      Element mit EIGENEM Schatten ueberschreibt die ganze Eigenschaft. Beim
      `.scroll-top` fiel der Ring deshalb ersatzlos weg, ohne Fehlermeldung.
      Betroffen sind genau drei Stellen (nachgezaehlt), .scroll-top setzt seinen
      Ring darum weiter unten selbst und haengt seinen Schatten hinten an.

   Reihenfolge der Schichten: die ZUERST genannte wird OBEN gezeichnet. Blau liegt
   deshalb aussen (0–2px, Nachbar ist der Seitenhintergrund), creme innen (2–5px,
   Nachbar ist das Bedienelement). Damit hat immer einer der beiden Ringe einen
   kontrastierenden Nachbarn — auf hellen Seiten traegt Blau, auf blauen Flaechen
   creme. Beide 9,35:1.
   ⚠️ Das `outline` bleibt zusaetzlich bestehen, ebenfalls nach innen versetzt.
   Es ist die Rueckfallebene fuer den Fall, dass ein Element seinen box-shadow
   doch ueberschreibt: dann markiert wenigstens das outline den Fokus. */
/* ⚠️⚠️ DRITTER Anlauf, 12.8.2026 abends: SCHWARZ und WEISS statt Blau und Creme.
   Ich hatte bewiesen, dass EINE Farbe nicht reicht (der ganze Farbraum abgesucht,
   Beste ist Schwarz mit 2,12:1 gegen das Blau) und daraus geschlossen, Blau+Creme
   loese es. Das war zu frueh: geprueft hatte ich die Ringfarben nur gegen die
   UNTERGRUENDE, nicht gegen alle Kombinationen aus ELEMENT auf Untergrund.
   Der Gegenbeweis kam als Screenshot: eine CREME Karte (.highlight-tile) auf
   BLAUEM Panel. Dort ist der creme Ring die Kartenfarbe und der blaue die
   Panelfarbe — beide verschwinden gleichzeitig, der Fokus war unsichtbar.

   Schwarz und Weiss liegen an den ENDEN der Helligkeitsskala. Keine Flaeche der
   Site kann beide schlucken, egal in welcher Schachtelung:
     nahezu Schwarz gegen creme Karte 18,4:1 · gegen coral 7,1:1
     Weiss          gegen blaues Panel 9,4:1
   Genau dieses Paar benutzen Chrome und Safari fuer ihren Standardring — nicht
   aus Bequemlichkeit, sondern weil Markenfarben diese Aufgabe nicht loesen
   koennen. Das ist die Antwort auf die Frage des Users nach dem Standard.

   ⚠️ Der Ring ist damit KEINE CI-Farbe mehr. Er erscheint ausschliesslich bei
   Tastaturbedienung (:focus-visible), bei Mausbedienung nie.
   ⚠️ Wer zurueck auf Markenfarben will: bitte vorher gegen alle Kombinationen
   Element-auf-Untergrund rechnen, nicht nur gegen die Untergruende. Genau diese
   Abkuerzung hat mich hier zweimal Zeit gekostet. */
/* ⚠️⚠️ VIERTER Anlauf, 13.8.2026: ZURUECK auf CI-Farben — auf Wunsch des Users,
   und diesmal mit der Rechnung, die oben eingefordert wird.

   Der alte Beweis bleibt gueltig, er beantwortet nur eine ANDERE Frage: es gibt
   keine EINE Farbe mit 3:1 gegen creme, blau und coral gleichzeitig. Der User
   will aber keine einzelne Farbe, sondern eine JE NACH UNTERGRUND. Gemessen:

     Untergrund      blau    rot     weiss   (Ring-Kandidaten)
     creme  #F5EFE5  8,65 ✓  2,59    1,14
     hell   #FBF8F4  9,35 ✓  2,79    1,06
     blau   #17427f  1,00    3,35 ✓  9,90 ✓
     coral  #ff6157  3,35 ✓  1,00    2,96

   Also: blau als Grundfarbe (traegt auf creme, hell UND coral), rot nur dort,
   wo der Grund nachweislich blau ist.

   ⚠️ PAAR-SICHERHEIT (schlechtester denkbarer Untergrund fuer ein Farbpaar):
     blau + weiss     3,15 ✓   <- haelt auf JEDEM Untergrund ueber 3:1
     schwarz + weiss  4,43 ✓   <- mehr Reserve, war deshalb der Standard
     rot + weiss      1,72 ✗   <- taugt NICHT als Grundfarbe, nur gescoped
   Das ist der Grund, warum unten BLAU im :root steht und ROT nur in einer
   Ausnahmeliste. Wer das umdreht, baut einen Ring, der auf mittelhellen
   Flaechen verschwindet.

   ⚠️⚠️ DIE GEFAEHRLICHE STELLE ist die Schachtelung, nicht der Untergrund:
   der INNENring legt sein erstes Band nach aussen (Nachbar = umgebende Flaeche)
   und sein zweites nach innen (Nachbar = die EIGENE Flaeche des Elements).
   Eine HELLE Karte auf BLAUEM Panel (.highlight-tile, background:--color-light)
   ist damit der kritische Fall — genau der, an dem Blau+Creme 2026-08-12
   gescheitert ist:
     blau aussen gegen blaues Panel  1,00 ✗
     weiss innen gegen helle Karte   1,06 ✗   -> Ring UNSICHTBAR
   Er wird NUR dadurch gerettet, dass die Ausnahmeliste unten das blaue Panel
   erfasst und die Karte per Vererbung ROT bekommt (rot gegen blau 3,35 ✓).
   ⚠️ Die Ausnahmeliste ist deshalb NICHT Kosmetik, sondern tragend. Wer eine
   blaue Flaeche ergaenzt, in der helle Elemente liegen koennen, MUSS sie hier
   eintragen — sonst verschwindet dort der Fokus. Fehlt umgekehrt eine blaue
   Flaeche OHNE helle Kinder, ist es harmlos: dann bleibt der Ring blau+weiss und
   das Weiss traegt mit 9,90:1. */
:root {
  /* CI-Blau als Grundfarbe: traegt auf creme (8,65), hell (9,35) UND coral (3,35). */
  --focus-ring-color: var(--color-blue);
  --focus-ring-width: 0.125rem;
  --focus-ring-offset: -0.125rem;
  /* ⚠️⚠️ HIER STAND EINE FALSCHE BEHAUPTUNG (2026-08-13 im Browser widerlegt):
     "Custom Properties werden beim BENUTZEN aufgeloest, ein Element im Footer
     bekommt also automatisch die dort gesetzte Farbe." Das stimmt NICHT.
     Ein var() INNERHALB einer Custom Property wird dort ersetzt, wo die
     Property DEKLARIERT wird — also hier am :root. --focus-ring-inner erbt
     deshalb ueberall mit dem :root-Wert BLAU, auch im Footer.
     Gemessen an einem Footer-Link (Sonde: Eigenschaft am Element setzen und
     den berechneten Wert lesen):
       outline-color: var(--focus-ring-color)  ->  rgb(255,97,87)  ROT   ✓
       box-shadow:    var(--focus-ring-inner)  ->  rgb(23,66,127)  BLAU  ✗
     SICHTBAR ist das trotzdem nicht, weil die `outline` im selben 0-2px-Band
     liegt (outline-offset: -2px) und ueber dem inset-Schatten gemalt wird.
     ⚠️ DARAUS FOLGT DIE REGEL: jede Regel, die --focus-ring-inner benutzt,
     MUSS auch die `outline` mit var(--focus-ring-color) setzen. Sonst traegt
     das farbige Band den :root-Wert statt des Ausnahmewerts.
     .scroll-top war die einzige Stelle ohne outline und wurde nachgezogen. */
  --focus-ring-inner: inset 0 0 0 0.125rem var(--focus-ring-color),
                      inset 0 0 0 0.3125rem var(--focus-ring-halo-color);
  /* Nur fuer KURZE Textlinks, siehe Block "RING NACH AUSSEN" weiter unten.
     Der Hof liegt AUSSEN und ist deshalb kein inset-Schatten. */
  --focus-ring-halo: 0.25rem;
  --focus-ring-halo-color: #ffffff;
}
/* ⚠️⚠️ TRAGENDE AUSNAHMELISTE — siehe Begruendung im Block darueber.
   Auf BLAUEM Grund waere Blau unsichtbar (1,00:1). Dort gilt seit 2026-08-14
   auf Vorgabe des Nutzers: AUSSEN CREME, INNEN ROT (vorher rot + weiss).
   Aufgefuehrt sind bewusst die blauen CONTAINER, also die, in denen weitere
   Bedienelemente liegen koennen — bei ihnen entscheidet die Farbe ueber
   Sichtbarkeit, nicht ueber Geschmack. Das Creme aussen ist dabei kein
   Geschmack, sondern der Gewinn: es traegt gegen Blau 6,88 und rettet damit
   auch helle Kacheln AUF blauem Grund (a.highlight-tile war mit rot+weiss
   unsichtbar: A 1,00 · B 1,06).

   ⚠️⚠️ Der Kontext deklariert --focus-ring-inner NEU. Das ist keine
   Wiederholung aus Bequemlichkeit: ein var() in einer Custom Property wird
   dort ersetzt, wo die Property DEKLARIERT wird (ausfuehrlich am :root oben).
   Stuende --focus-ring-inner nur dort, truege das INNERE Band hier weiter den
   Wurzelwert Weiss und "innen rot" waere wirkungslos. Wer eine Farbe aendert,
   muss sie in der Zeile --focus-ring-color UND in --focus-ring-inner aendern.

   Messwerte 2026-08-14 im Browser, diesmal MIT Verlaeufen (Schlechtestfall
   ueber alle Farbstopps — das alte Werkzeug las nur background-color und war
   fuer linear-gradient blind):
     auf blau  (44,82,136 -> 23,66,127)   creme 6,88 ✓ · weiss 7,87 ✓ ·
                                          rot 2,66 ✗ · blau 1,00 ✗
     auf rot   (255,97,87 -> 216,80,73)   weiss 2,96 · hell 2,79 · creme 2,59 ·
                                          blau 2,43 · rot 1,00 — ALLE unter 3:1
   ⚠️⚠️ Auf der ROTEN Flaeche traegt KEINE Farbe der Palette die 3:1, auch
   Schwarz und Weiss nicht. Das ist kein Versaeumnis, sondern eine Eigenschaft
   des CI-Rots: es liegt in der Helligkeit zu nah an allem, was noch nach CI
   aussieht. Deshalb steht Rot NICHT in dieser Liste — Begruendung und
   Messwerte direkt an der Stelle, wo der Eintrag fehlt (siehe unten).
   Elemente, die selbst blau sind (.btn-blue-filled, .scroll-top, .filterbtn-reset,
   .viewbtn.active), brauchen KEINEN Eintrag: ihr inneres weisses Band liegt auf
   der eigenen blauen Flaeche und traegt dort mit 9,90:1.

   ⚠️⚠️ HIER GEHOEREN NUR FLAECHEN HINEIN, DIE NACHWEISLICH BLAU SIND.
   Ein falscher Eintrag ist genauso schaedlich wie ein fehlender: er faerbt den
   Ring CREME auf einem HELLEN Grund, und dort ist Creme praktisch weg
   (creme/weiss 1,14 · creme/hell 1,08 · creme/creme 1,00). Seit der Umstellung
   auf Creme ist ein Fehleintrag also noch teurer als vorher mit Rot (2,96 /
   2,79 / 2,59 — auch zu wenig, aber wenigstens sichtbar). Am 2026-08-13 im Browser
   nachgemessen; vier Eintraege wurden dabei WIEDER ENTFERNT, weil sie aus dem
   md-Design uebernommen waren, wo dieselben Bauteile blau sind — auf sprezu
   sind sie es nicht:
     .events-filter-panel   ist hier CREME (251,248,244). Die Regel dafuer steht
                            weiter unten: ".mdevents_listextended
                            .events-filter-panel { background: var(--color-light) }"
                            mit dem Kommentar, dass die blaue md-Fassung "auf dem
                            hellen S&Z-Grund unlesbar" war. Rot haette 4 Filter-
                            und 2 Ansichtsknoepfe unsichtbar gemacht (A=2,96/2,53).
     dialog.dialog-event    hat "background:none", die Karten darin sind WEISS
                            (".dialog-event-item { background:#ffffff }").
     .dialog-header         ist damit ebenfalls weiss.
                            Zusammen 87 Textlinks auf 4 Seiten mit A=2,96 B=1,00.
     .share                 ist creme (245,239,229), gemessen auf einer
                            Termin-Einzelansicht; 3 Links je Seite.
   Alle vier tragen jetzt den blauen Ring: 9,90 auf weiss, 8,65 auf creme.
   ⚠️ Vor jedem neuen Eintrag die Flaeche MESSEN, nicht aus dem Klassennamen
   schliessen — genau das war der Fehler. */
.footer,
.is-footer,
[class*="frame-type-container"].frame-blue,
.info-panels--bg-blue .info-panel,
/* ⚠️ .custom-tile-item-meta steht hier, weil sie GRUNDSAETZLICH blau ist (~3229).
   Sie hat aber zwei rote Auspraegungen — die stehen in der Gegenregel direkt
   unter dieser Liste, NICHT als :not() hier drin. .custom-tile-item-sharebar
   braucht das nicht: sie ist immer blau (3252). */
.custom-tile-item-meta,
.custom-tile-item-sharebar,
.project:nth-child(odd) {
  --focus-ring-color: var(--color-cream);
  --focus-ring-halo-color: var(--color-red);
  --focus-ring-inner: inset 0 0 0 0.125rem var(--color-cream),
                      inset 0 0 0 0.3125rem var(--color-red);
}
/* ⚠️⚠️ GEGENREGEL: die ROTEN Auspraegungen der Meta-Leiste zurueck auf den
   :root-Ring blau/weiss. Beide sind am 2026-08-14 im Browser GEMESSEN worden,
   nicht aus Klassennamen geschlossen — und der zweite Fall war eine echte
   Ueberraschung:
     .grid-view-container   In der KACHELANSICHT der Terminliste ist die Leiste
                            rot (Regel bei ~4436, background-color: var(--color-red)).
                            Auf /anstehende-termine sind das 26 von 26 Leisten.
                            Der Eintrag ".custom-tile-item-meta" in der Liste
                            darueber war dort also die ganze Zeit falsch — mit
                            dem alten Rot sogar rot auf rot (1,00).
     .featured_event        TCA-Checkbox am Termin (seit 10.06.2026), faerbt die
                            Leiste ebenfalls rot (3230, Hover rot-dunkel 4168).
                            Rendert derzeit nirgends, kann aber jederzeit kommen.
   ⚠️ Ein erster Versuch schrieb nur ":not(.featured_event)" in die Liste. Das war
   die falsche Ursache: rot macht sie fast immer die Kachelansicht, nicht die
   Checkbox. Wer hier etwas aendert, misst die FLAECHE im Browser — die Klasse
   sagt es nicht.
   ⚠️ Heute folgenlos, weil in den Meta-Leisten NULL fokussierbare Elemente
   liegen (nachgezaehlt). Die Regel steht trotzdem, damit der erste Link, der
   dort einmal landet, nicht in einen unsichtbaren Ring laeuft. */
.mdevents_listextended .grid-view-container .custom-tile-item-meta,
.custom-tile-item-meta.featured_event {
  --focus-ring-color: var(--color-blue);
  --focus-ring-halo-color: #ffffff;
  --focus-ring-inner: inset 0 0 0 0.125rem var(--color-blue),
                      inset 0 0 0 0.3125rem #ffffff;
}
/* ⚠️ HIER FEHLT ABSICHTLICH DER GEGENSTUECK-EINTRAG FUER DIE ROTEN BLOECKE
   (.project:nth-child(even) — die Faerbung kommt aus .project:nth-child(odd/even)
   weiter unten, ~Zeile 2412, mit !important: ungerade blau, gerade rot).
   Er war am 2026-08-14 gebaut und im Browser gemessen und wurde WIEDER
   ENTFERNT, weil er die Sache verschlechtert:
     aussen rot / innen creme   A 1,00 · B 2,59 · Bandpaar 2,59
     bisher blau / weiss        A 2,43 · B 2,96 · Bandpaar 9,90
   Auf rotem Grund verschwindet ein rotes Aussenband vollstaendig, und Creme
   traegt innen nur 2,59. Der geerbte blau/weisse Ring vom :root ist dort das
   Beste, was die Palette hergibt: er erreicht zwar auch keine 3:1 gegen die
   Flaeche, hat aber zwischen seinen beiden Baendern eine 9,90-Kante und ist
   dadurch klar zu sehen. Vom Nutzer so entschieden.
   Wer es wirklich normgerecht will, braucht ein abgedunkeltes Blau
   (#0d2a52 = 3,51 ✓) — das steht aber nicht im CI. */
:where(a[href], area[href], button, input, select, textarea, summary,
       [tabindex]:not([tabindex="-1"]), [contenteditable="true"]):focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
  box-shadow: var(--focus-ring-inner);
}

/* ============================================================
   SCHRIFTEN (Interstate)
   ------------------------------------------------------------
   3 Schnitte eingebunden: Light, Regular, Bold. Keine echten Kursiv-Dateien
   vorhanden – der Browser synthetisiert Kursivschrift automatisch aus dem
   jeweils passenden aufrechten Schnitt (kein font-synthesis: none gesetzt).
   Format: WOFF2 (kleinste Dateigröße, von allen modernen Browsern
   unterstützt). Liegt eine Datei nicht vor, greift automatisch der
   Fallback-Stack (Helvetica Neue / Arial / sans-serif).
   ============================================================ */
@font-face {
  font-family: 'Interstate';
  src: url('../../../typo3conf/ext/custom_sprezu/Resources/Public/Fonts/interstate-light.woff2') format('woff2');
  font-weight: 300;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Interstate';
  src: url('../../../typo3conf/ext/custom_sprezu/Resources/Public/Fonts/interstate-regular.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Interstate';
  src: url('../../../typo3conf/ext/custom_sprezu/Resources/Public/Fonts/interstate-bold.woff2') format('woff2');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}
/* Kein eigener Black-Schnitt vorhanden: 800 wird auf Bold gemappt,
   damit Headlines (font-weight: 800 im Layout) automatisch die
   fette Schrift statt eines synthetischen Fett-Effekts nutzen. */
@font-face {
  font-family: 'Interstate';
  src: url('../../../typo3conf/ext/custom_sprezu/Resources/Public/Fonts/interstate-bold.woff2') format('woff2');
  font-weight: 800;
  font-style: normal;
  font-display: swap;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
/* overflow-x: hidden fängt den Scrollbar-Überstand der 50vw-Full-bleed-Technik
   ab (z. B. .media-jumpnav-wrap). Auf dem Root-Element propagiert overflow zum
   Viewport — position: sticky im Dokument bleibt dadurch intakt (auf body
   gesetzt würde es sticky brechen). */
html { scroll-behavior: smooth; font-size: 16px; overflow-x: hidden; }
body {
  font-family: 'Interstate', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
  font-size: 16px;
  line-height: 1.5;
  color: var(--color-blue);
  background: var(--color-light);
  -webkit-font-smoothing: antialiased;
}
img { max-width: 100%; height: auto; display: block; }
/* Kein Wort darf seine Spalte sprengen. Deutsche Komposita und ausgeschriebene
   URLs sind länger als schmale Spalten: bei 1024px stand „Demokratieentwicklung"
   22px über der 235px-Spalte auf /mitmachen/fuer-unternehmen, auf /datenschutz
   bei 375px „Änderung unserer Datenschutzbestimmungen" 38px und zwei volle URLs
   11px über dem Viewport.
   `overflow-wrap` ändert am normalen Umbruch NICHTS — es greift nur, wenn ein
   Wort allein nicht in die Zeile passt. Auf Überschriften zusätzlich
   `hyphens: auto`: das Dokument trägt lang="de", Chrome trennt damit sauber
   („Demokratie-entwicklung") statt mitten im Wort abzuhacken. Bewusst NICHT
   auf Fließtext, dort würde es das Schriftbild aller Absätze verändern. */
h1, h2, h3, h4, h5, h6 { overflow-wrap: break-word; hyphens: auto; }
p, li, dd, dt, td, th, figcaption, blockquote, label, button, a { overflow-wrap: break-word; }
a { color: var(--color-blue); text-decoration: underline; text-decoration-thickness: 1.5px; text-underline-offset: 3px; }
@media (hover: hover) {

  a:hover { color: var(--color-red-dark); }

}
h1, h2, h3, h4 {
  font-family: 'Interstate', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
  font-weight: 800;
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--color-blue);
}
/* Eine Überschrift im Inhalt darf nie größer werden als der Hero, unter dem sie
   steht. Vorher clamp(40px, 6vw, 64px) -- damit lag sie bei jeder Breite über
   dem Unterseiten-Hero und erreichte sogar dessen Startseiten-Größe. Die Werte
   sind jetzt 1:1 die von ".hero-sub h1" (siehe dort, inkl. der 768er-Stufe).
   Die Startseite bleibt die Ausnahme: ".hero-home h1" hat eine eigene Regel und
   behält 64px. */
h1 { font-size: clamp(1.75rem, 8vw, 3.5rem); }
h2 { font-size: clamp(28px, 4vw, 44px); margin-bottom: 24px; }
h3 { font-size: 24px; margin-bottom: 12px; }
h4 { font-size: 20px; margin-bottom: 8px; }
@media (min-width: 768px) {
  h1 { font-size: clamp(2.25rem, 5vw, 3.5rem); }
}
.accent { color: var(--color-red); }
/* END - Basis */

/* START - Nav - Hauptnavigation */
/* Fixierte Kopfleiste mit Logo, Menüpunkten und mobilem Vollbild-Overlay (Hamburger-Menü). */
.nav {
  position: fixed; top: 0; left: 0; right: 0;
  /* Über den absolut positionierten Karten-Zoom-Buttons (z-index 999 aus
     md_events/listMap.css), die sonst beim Scrollen über der fixierten Navi
     liegen. Bleibt unter der Vollbild-Karte (z-index 10000). */
  z-index: 1000;
  height: 92px;
  background: transparent;
  border-bottom: 1px solid transparent;
  overflow: visible;
  transition: background 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;
}
.nav.nav-scrolled,
.nav.nav-menu-open {
  background: rgba(var(--color-light-rgb), 0.96);
  backdrop-filter: blur(12px);
  border-bottom: 1px solid rgba(var(--color-blue-rgb), 0.08);
  box-shadow: 0 2px 16px rgba(var(--color-blue-rgb), 0.06);
}
.nav-inner {
  max-width: 1400px; margin: 0 auto;
  height: 92px;
  padding: 0 24px;
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 24px;
}
.nav-logo {
  display: flex; align-items: flex-start;
  cursor: pointer;
  padding-top: var(--logo-offset-mobile);
  position: relative;
  z-index: 1;
  flex-shrink: 0;
  /* ⚠️ EINE Zahl fuer die Groesse der Wortmarke, nicht zwei. Vorher stand der
     Faktor direkt in den transform-Regeln; seit 2026-08-14 steht er hier, weil
     der Fokusring ihn ebenfalls braucht (siehe .nav-logo:focus-visible img).
     Haette der Ring seine eigene Zahl, wuerden beide beim naechsten Redesign
     auseinanderlaufen und der Ring saesse wieder falsch. */
  --logo-scale: 1;
}
.nav-logo img {
  width: var(--logo-size); height: var(--logo-size);
  display: block;
  transform-origin: top left;
  transform: scale(var(--logo-scale));
  transition: opacity 0.25s ease, transform 0.35s ease;
}
.logo-color {
  opacity: 0;
  position: absolute; top: var(--logo-offset-mobile); left: 0;
  filter: drop-shadow(0 2px 6px rgba(var(--color-blue-rgb), 0.2));
}
.logo-white {
  opacity: 1;
  filter: drop-shadow(0 2px 6px rgba(var(--color-blue-rgb), 0.35));
}
/* ⚠️ Die vier Zustaende setzen jetzt --logo-scale statt transform. Reihenfolge und
   Spezifitaet sind absichtlich unveraendert (0-2-0 / 0-3-0 / 0-4-0), damit sich am
   Verhalten nichts aendert: gescrollt schlaegt Hover, gescrollt+Hover schlaegt beide. */
@media (hover: hover) {

  .nav-logo:hover { --logo-scale: 1.05; }

}
.nav.nav-scrolled .nav-logo,
.nav.nav-menu-open .nav-logo {
  --logo-scale: 0.44;
}
@media (hover: hover) {

  .nav.nav-scrolled .nav-logo:hover, .nav.nav-menu-open .nav-logo:hover {
  --logo-scale: 0.462;
}

}
/* Fokusring des Kopflogos. ⚠️ Der Ring haengt an den BILDERN, nicht am <a>.
   Grund: der <a> ist 100x132 (oben) bzw. 100x116 (gescrollt), die sichtbare
   Wortmarke aber 100x100 bzw. nur 44x44 — ein Ring am <a> umschliesst also viel
   Luft, oben 32px Polster, gescrollt mehr als das Doppelte der Marke. Vom Nutzer
   am 2026-08-14 als "zu gross oder zu klein, je nach Scrollposition" gemeldet.
   ⚠️ a:has(> img:only-child) — das Muster der uebrigen Bildlinks — greift hier
   NICHT: im <a> liegen ZWEI <img> (.logo-white oben, .logo-color gescrollt), von
   denen immer eines auf opacity 0 steht. Der Ring liegt deshalb auf BEIDEN; das
   unsichtbare Bild traegt ihn unsichtbar mit, sichtbar ist immer genau einer.
   ⚠️⚠️ Die Breiten werden durch --logo-scale GETEILT, weil transform: scale()
   den Ring mitskaliert. Ohne das waere der Ring gescrollt 0,88px statt 2px.
   Nachgemessen 2026-08-14 im gescrollten Zustand: Hof berechnet 9,09px x 0,44 =
   exakt 4px ✓. Die outline kommt auf 1,76px statt 2px, weil Chrome
   outline-width auf GANZE Pixel rundet (4,545 -> 4). Optisch belanglos, aber
   nicht "reparieren", indem man beide Baender auf box-shadow umstellt: die
   outline ist das, was im Windows-Kontrastmodus uebrig bleibt, box-shadow nicht.
   ⚠️ Oben liegt das Logo ueber dem Hero-FOTO (.hero-home-bg > img) — dort gibt es
   keine berechenbare Flaeche. Tragen muss deshalb das Bandpaar blau/weiss, nicht
   die Farbe gegen den Untergrund. Genau dafuer ist der Aussenring da. */
.nav-logo:focus-visible {
  outline: none;
  box-shadow: none;
}
.nav-logo:focus-visible img {
  outline: calc(var(--focus-ring-width) / var(--logo-scale)) solid var(--focus-ring-color);
  outline-offset: 0;
  box-shadow: 0 0 0 calc(var(--focus-ring-halo) / var(--logo-scale)) var(--focus-ring-halo-color);
}
.nav.nav-scrolled .logo-color,
.nav.nav-menu-open .logo-color {
  opacity: 1;
}
.nav.nav-scrolled .logo-white,
.nav.nav-menu-open .logo-white {
  opacity: 0;
}
.nav-menu {
  display: flex; list-style: none; gap: 4px;
  flex-wrap: nowrap; justify-content: flex-start; align-items: stretch;
  flex-direction: column;
  height: auto;
  max-height: calc(100vh - 92px);
  overflow-y: auto;
  position: fixed; top: 92px; left: 0; right: 0;
  background: var(--color-light);
  padding: 24px 16px 24px;
  border-bottom: 1px solid rgba(var(--color-blue-rgb), 0.1);
  box-shadow: 0 16px 32px rgba(var(--color-blue-rgb), 0.18);
  visibility: hidden;
  opacity: 0;
  transform: translateY(-8px);
  pointer-events: none;
  transition: opacity 0.2s ease, transform 0.2s ease, visibility 0s linear 0.2s;
}
.nav-menu.open {
  visibility: visible;
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
  transition: opacity 0.2s ease, transform 0.2s ease;
}
.nav-backdrop {
  position: fixed; inset: 0;
  background: rgba(var(--color-blue-rgb), 0.4);
  z-index: 90;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.2s ease, visibility 0s linear 0.2s;
}
.nav-backdrop.visible {
  opacity: 1;
  visibility: visible;
  transition: opacity 0.2s ease;
}
.nav-menu a,
.nav-menu .nav-item-label {
  display: block;
  padding: 12px;
  font-size: 0.875rem; font-weight: 700;
  color: var(--color-light); text-decoration: none;
  border-radius: 4px;
  text-shadow: 0 1px 4px rgba(var(--color-blue-rgb), 0.5);
  transition: all 0.15s ease, color 0.25s ease, text-shadow 0.25s ease;
}
/* ⚠️ .nav-item-label ist seit dem 12.8.2026 ein <button> (vorher ein <span>) —
   siehe Kasten im Layout-Template. Ein Button bringt eigene Browservorgaben mit,
   die hier alle zurückgenommen werden müssen, sonst sitzt die Beschriftung
   plötzlich in Systemschrift und mit fremdem Rahmen im Menü. Die Maße kommen
   weiterhin aus der Regel darüber, die `a` und `.nav-item-label` gemeinsam führt. */
.nav-menu .nav-item-label {
  cursor: pointer;
  width: 100%;
  background: none;
  border: 0;
  font-family: inherit;
  line-height: inherit;
  text-align: left;
}
.nav.nav-scrolled .nav-menu a,
.nav.nav-scrolled .nav-menu .nav-item-label {
  color: var(--color-blue);
  text-shadow: none;
}
.nav-menu.open a,
.nav-menu.open .nav-item-label { color: var(--color-blue); text-shadow: none; }
/* ⚠️⚠️ Die Hover-/Aktiv-Regeln müssen BEIDE Sorten Menüpunkt treffen. Die Grund-
   regeln oben (Z. 245, 256, 261) tun das längst als Paar `a` + `.nav-item-label`,
   die Zustandsregeln hier hatten bis zum 12.8.2026 nur das `a`.
   Grund: die ersten drei Punkte sind KEINE Links, sondern Submenü-Eltern —
   <div class="nav-item-with-toggle"><span class="nav-item-label">…</span><button
   class="submenu-toggle">. Nur „Medien" u. ä. sind echte <a>. Genau deshalb hatten
   die ersten drei gar keine Rückmeldung, während „Medien" eine hatte.
   ⚠️ Angehängt wird der Hover am ELTERNTEIL `.nav-item-with-toggle`, nicht am
   Label selbst: sonst reagierte nur die Schrift, und die Lücke zwischen Text und
   Chevron bliebe tot — der Punkt fühlte sich kaputt an. Beim `a` macht dessen
   eigenes padding (12px, Z. 248) die Fläche, hier der Elternteil.
   ⚠️ `.submenu-toggle` bringt seinen eigenen Hover mit (weiter unten); beide
   zusammen sind gewollt — Chevron und Beschriftung gehören zu einem Bedienelement. */
.nav-menu a:active,
.nav-item-with-toggle:active .nav-item-label { background: rgba(var(--color-red-rgb), 0.15); color: var(--color-red-dark); text-shadow: none; }

@media (hover: hover) {

  .nav-menu a:hover,
  .nav-item-with-toggle:hover .nav-item-label { background: rgba(var(--color-red-rgb), 0.15); color: var(--color-red-dark); text-shadow: none; }

}
.nav-menu a.active { background: var(--color-red); color: var(--color-light); text-shadow: none; }
.nav.nav-scrolled .nav-menu a.active { background: var(--color-blue); color: var(--color-light); }
.nav-menu.open a.active { background: var(--color-blue); color: var(--color-light); }
.menu-toggle {
  display: flex; flex-direction: column; justify-content: center; align-items: center;
  position: absolute;
  top: 24px; right: 24px;
  z-index: 1;
  width: 44px; height: 44px;
  background: rgba(var(--color-light-rgb), 0.15);
  border: 1px solid rgba(var(--color-light-rgb), 0.3);
  border-radius: 8px;
  cursor: pointer;
  padding: 10px;
  transition: background 0.25s ease, border-color 0.25s ease;
}
.nav.nav-scrolled .menu-toggle,
.nav.nav-menu-open .menu-toggle {
  background: rgba(var(--color-blue-rgb), 0.06);
  border-color: rgba(var(--color-blue-rgb), 0.15);
}
.menu-toggle i {
  font-size: 18px;
  color: var(--color-light);
  text-shadow: 0 1px 4px rgba(var(--color-blue-rgb), 0.5);
  transition: color 0.25s ease, text-shadow 0.25s ease;
}
.nav.nav-scrolled .menu-toggle i,
.nav.nav-menu-open .menu-toggle i {
  color: var(--color-blue);
  text-shadow: none;
}
@media (min-width: 768px) {
  .nav { height: 76px; }
  .nav-inner { height: 76px; padding: 0 64px; }
  .nav-logo { padding-top: var(--logo-offset-desktop); }
  .logo-color { top: var(--logo-offset-desktop); }
  .nav.nav-scrolled .nav-logo { padding-top: 16px; }
  .nav.nav-scrolled .logo-color { top: 16px; }
  .nav-menu {
      display: flex; position: static; flex-direction: row;
      flex-wrap: wrap; justify-content: flex-end; align-items: center;
      height: 76px; max-height: none; overflow: visible;
      background: none; padding: 0; border-bottom: none; box-shadow: none;
      visibility: visible; opacity: 1; transform: none; pointer-events: auto;
      transition: none;
    }
  .nav-menu.open a,
    .nav-menu.open .nav-item-label { color: var(--color-light); text-shadow: 0 1px 4px rgba(var(--color-blue-rgb), 0.5); }
  .nav-menu.open a.active { background: var(--color-red); color: var(--color-light); }
  .nav-menu a,
    .nav-menu .nav-item-label { padding: 8px 12px 8px 12px; }
  .menu-toggle { display: none; }
  .nav-backdrop { display: none; }
}
/* END - Nav - Hauptnavigation */

/* START - Nav - Untermenü */
/* Aufklappbare Untermenüs je Hauptmenüpunkt (mobil: Akkordeon, Desktop: Hover-Dropdown). */
.nav-item-has-submenu { position: relative; }
.nav-item-with-toggle {
  display: flex; align-items: center; gap: 4px;
  padding-right: 12px;
  border-radius: 4px;
  cursor: pointer;
}
.nav-item-with-toggle a,
.nav-item-with-toggle .nav-item-label { flex: 1; }
.nav-item-has-submenu.submenu-open .nav-item-with-toggle {
  background: rgba(var(--color-red-rgb), 0.15);
}
.nav-item-has-submenu.section-active .nav-item-with-toggle {
  background: rgba(var(--color-red-rgb), 0.35);
}
.submenu-toggle {
  display: flex; align-items: center; justify-content: center;
  background: var(--color-red); border: none;
  border-radius: 8px;
  cursor: pointer;
  width: 28px; height: 28px;
  padding: 0;
  font-size: 12px;
  color: var(--color-light);
  transition: transform 0.2s ease, background 0.2s ease;
}
@media (hover: hover) {

  .submenu-toggle:hover {
  background: var(--color-red-dark);
}

}
.nav-item-has-submenu.submenu-open .submenu-toggle {
  transform: rotate(180deg);
}
.submenu {
  list-style: none;
  display: none;
  background: rgba(var(--color-blue-rgb), 0.05);
  border-radius: 4px;
  margin: 4px 0;
}
.nav-item-has-submenu.submenu-open .submenu {
  display: block;
}
.submenu a {
  font-size: 0.8125rem;
  padding-left: 32px;
}
.submenu a::before {
  content: "– ";
}
@media (min-width: 768px) {
  .nav-item-has-submenu { padding-right: 12px; }
  .nav-item-with-toggle { padding-right: 0; }
  /* Das Dropdown ist absolut positioniert und bekommt dadurch die Breite seines
     Menüpunkts ("shrink-to-fit") — längere Seitentitel brachen deshalb um, obwohl
     daneben Platz war. width: max-content richtet es am längsten Eintrag aus.
     Der Deckel ist der größte Wert, bei dem garantiert nichts aus dem Fenster
     ragen kann: im engsten Fall (768px) beginnt das rechteste Dropdown bei 519px
     und hat 249px bis zum Fensterrand. Gemessen brauchen die Dropdowns heute
     217/180/180px, es bleiben also rund 23px Reserve. Wird ein Seitentitel noch
     länger, bricht er wieder um — das ist gewollt: außerhalb des Fensters wäre er
     wegen html { overflow-x: hidden } abgeschnitten statt erreichbar. */
  .submenu {
      position: absolute;
      top: 100%; left: 0;
      min-width: 180px;
      width: max-content;
      max-width: 15rem;
      background: var(--color-light);
      border-radius: 4px;
      box-shadow: 0 12px 24px rgba(var(--color-blue-rgb), 0.15);
      padding: 8px;
      margin-top: 0;
      z-index: 1;
    }
  .submenu a {
      display: block;
      color: var(--color-blue);
      text-shadow: none;
      padding: 8px 12px;
      border-radius: 4px;
    }
  .submenu a.active {
      background: rgba(var(--color-red-rgb), 0.12);
      color: var(--color-red);
    }

  @media (hover: hover) {

    .submenu a:hover {
      background: rgba(var(--color-red-rgb), 0.12);
      color: var(--color-red-dark);
    }

  }
  /* Hover öffnet das Submenü zusätzlich zum Klick (nur Desktop) — Hover gilt für
       den ganzen Menüpunkt (Zeile + Dropdown), sonst schließt es sich beim Runterfahren
       zum Submenü wieder, bevor man einen Link anklicken kann. */
  /*
  .nav-item-has-submenu:hover .submenu {
      display: block;
      z-index: 2;
    }
  */
  .submenu-toggle { display: none; }
}
/* END - Nav - Untermenü */

/* START - Utilities (Alt/Ungenutzt) */
/* Reste aus einer früheren Single-Page-Version der Seite; aktuell in keiner Seite mehr referenziert, aber nicht gelöscht. */
.page { display: none; }
.page.active { display: block; animation: fadeIn 0.3s ease; }
@keyframes fadeIn {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}
/* END - Utilities (Alt/Ungenutzt) */

/* START - Hero - Startseite */
/* Vollbild-Bannerbereich der Startseite (Hintergrundbild, Eyebrow, Titel, Lead-Text, CTA-Button). */
.hero-home {
  position: relative;
  margin-top: 0;
  min-height: auto;
  display: flex;
  align-items: center;
  background: var(--color-blue);
  overflow: hidden;
  color: var(--color-light);
}
.hero-home-bg {
  position: absolute; inset: 0;
  z-index: 1;
}
.hero-home-bg img {
  width: 100%; height: 100%;
  object-fit: cover; object-position: center;
}
.hero-home-bg::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(var(--color-blue-rgb), 0.6) 0%, rgba(var(--color-blue-rgb), 0.9) 100%);
}
.hero-home-content {
  position: relative;
  z-index: 2;
  max-width: 1400px; width: 100%;
  margin: 0 auto;
  padding: var(--hero-clear-mobile) 24px 48px;
}
.hero-home-inner {
  max-width: 640px;
}
.hero-eyebrow {
  font-size: 0.875rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.18em;
  color: var(--color-red);
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.7), 0 0 20px rgba(0, 0, 0, 0.6);
  margin-bottom: 24px;
}
.hero-home h1 { color: var(--color-light); margin-bottom: 28px; font-size: clamp(28px, 8vw, 64px); }
.hero-home h1 .amp { color: var(--color-red); }
.hero-lead {
  font-size: 16px; line-height: 1.55;
  max-width: 540px; opacity: 0.95;
  margin-bottom: 36px;
}
.hero-cta {
  display: inline-flex; align-items: center; gap: 12px;
  background: var(--color-red); color: var(--color-light);
  padding: 16px 30px;
  font-size: 16px; font-weight: 700;
  text-decoration: none;
  border-radius: 999px;
  transition: all 0.2s;
  width: fit-content;
}
.hero-cta:active { background: var(--color-light); color: var(--color-blue); }

@media (hover: hover) {

  .hero-cta:hover { background: var(--color-light); color: var(--color-blue); }

}
.hero-cta-dark {
  background: var(--color-blue);
}
.hero-cta-dark:active {
  background: var(--color-light);
  color: var(--color-blue);
}

@media (hover: hover) {

  .hero-cta-dark:hover {
  background: var(--color-light);
  color: var(--color-blue);
}

}
@media (min-width: 768px) {
  .hero-home-content { padding: var(--hero-clear-desktop) 64px 64px; }
  .hero-home h1 { font-size: clamp(40px, 6vw, 64px); }
  .hero-lead { font-size: 20px; }
}
@media (min-width: 1024px) {
  .hero-home { min-height: 72vh; }
  .hero-home-content { padding: var(--hero-clear-desktop) 64px 96px; }
  .hero-home-bg::after {
      background: linear-gradient(90deg, rgba(var(--color-blue-rgb), 0.92) 0%, rgba(var(--color-blue-rgb), 0.78) 35%, rgba(var(--color-blue-rgb), 0.15) 75%, rgba(var(--color-blue-rgb), 0) 100%);
    }
}
/* END - Hero - Startseite */

/* START - Hero - Unterseiten */
/* Kompakterer Bannerbereich für alle Unterseiten (hero-sub, inkl. großer Variante hero-sub-large). */
.hero-sub {
  position: relative;
  margin-top: 0;
  min-height: 52vh;
  display: flex; align-items: flex-end;
  background: var(--color-blue);
  overflow: hidden;
  color: var(--color-light);
}
.hero-sub-image {
  position: absolute; inset: 0;
  z-index: 1;
}
.hero-sub-image img {
  width: 100%; height: 100%;
  object-fit: cover; object-position: center;
}
.hero-sub-image::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(var(--color-blue-rgb), 0.15) 0%, rgba(var(--color-blue-rgb), 0.55) 50%, rgba(var(--color-blue-rgb), 0.9) 100%);
}
/* Unterseiten (alle außer Startseite): stärkerer Verlauf für bessere
   Textlesbarkeit. Höhe bewusst NICHT mehr vergrößert (statische Vorlage:
   calc(52vh + 100px)) — der Leerraum über dem Text war zu groß, daher
   dieselbe Höhe wie ".hero-sub" (Entscheidung 15.7.2026). */
.hero-sub-large { min-height: 52vh; }
.hero-sub-large .hero-sub-image::after {
  background: linear-gradient(180deg, rgba(var(--color-blue-rgb), 0.25) 0%, rgba(var(--color-blue-rgb), 0.7) 45%, rgba(var(--color-blue-rgb), 0.96) 100%);
}
.hero-sub-content {
  position: relative;
  z-index: 2;
  padding: var(--hero-clear-mobile) 24px 48px;
  max-width: 1400px;
  margin: 0 auto;
  width: 100%;
}
.hero-sub h1 {
  color: var(--color-light);
  font-size: clamp(28px, 8vw, 56px);
  margin-bottom: 20px;
}
.hero-sub h1 .amp { color: var(--color-red); }
.hero-sub .hero-eyebrow { color: var(--color-red); }
.hero-sub .hero-lead {
  color: var(--color-light); opacity: 0.95;
  font-size: 16px;
  max-width: 720px;
}
@media (min-width: 768px) {
  .hero-sub-content { padding: var(--hero-clear-desktop) 64px 64px; }
  .hero-sub h1 { font-size: clamp(36px, 5vw, 56px); }
  .hero-sub .hero-lead { font-size: 20px; }
}
@media (min-width: 1024px) {
  .hero-sub-content { padding: var(--hero-clear-desktop) 64px 64px; }
}
/* END - Hero - Unterseiten */

/* START - Layout - Eyebrow-Label */
/* ".section"/".section-*"/".container"/".container-narrow"/".lead"/".effect"
   (ehemalige Seitenabschnitts-Bausteine der statischen Vorlage) entfernt —
   ungenutzt, seit Gridelements-Container Hintergrundfarbe + Abstand über das
   Feld "frame_class" abdecken (siehe "START Grid Elements" weiter unten,
   inkl. der von .section-blue/.section-coral .eyebrow übernommenen
   Kontrastregeln). Nur ".eyebrow" selbst bleibt, wird u. a. von
   Content/Partials/Header/All.html gerendert. */
.eyebrow {
  font-size: 0.875rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.18em;
  color: var(--color-red);
  margin-bottom: 20px;
}
/* Untertitel des Inhaltselement-Headers (Content/Partials/Header/All.html) fett. */
.subtitle.subheader { font-weight: 700; }
/* END - Layout - Eyebrow-Label */

/* START - Sidebar - Layout */
/* Zweispaltiges Layout (Content + Sidebar) inkl. Content-mit-Video-Variante. */
.layout-with-sidebar {
  display: grid;
  grid-template-columns: 1fr;
  gap: 64px;
  align-items: start;
}
.layout-with-sidebar > * {
  min-width: 0;
}
.content-with-video {
  display: grid;
  grid-template-columns: 1fr;
  gap: 48px;
  align-items: center;
}
.sidebar {
  position: static; top: 100px;
  background: var(--color-light);
  border: 2px solid var(--color-blue);
  padding: 28px;
  border-radius: 4px;
  margin-bottom: 48px;
}
.intro-logo {
  display: flex;
  justify-content: center;
  margin: 24px 0;
}
.intro-logo img {
  width: 25%;
  height: auto;
}
.sidebar h4 {
  font-size: 16px; line-height: 1.4; text-transform: uppercase;
  letter-spacing: 0.1em; margin-bottom: 16px;
  color: var(--color-blue);
}
.sidebar-block { margin-bottom: 28px; }
.sidebar-block:last-child { margin-bottom: 0; }
.sidebar-block + .sidebar-block {
  padding-top: 28px;
  border-top: 1px solid rgba(var(--color-blue-rgb), 0.12);
}
.sidebar p { font-size: 0.875rem; line-height: 1.5; }
@media (min-width: 1024px) {
  .content-with-video { grid-template-columns: 1fr 1fr; }
  .layout-with-sidebar { grid-template-columns: 2fr 1fr; }
  .sidebar { position: sticky; margin-bottom: 0; }
  .sidebar h4 { font-size: 20px; }
}
/* END - Sidebar - Layout */

/* START - Sidebar - Formular & Buttons */
/* Anmeldeformulare und Call-to-Action-Buttons innerhalb der Sidebar. */
.sidebar-cta {
  display: block;
  background: var(--color-red); color: var(--color-light);
  padding: 12px 20px;
  text-align: center; text-decoration: none;
  font-weight: 700; font-size: 0.875rem;
  border-radius: 999px;
  margin-top: 12px;
  text-transform: uppercase; letter-spacing: 0.05em;
}
.sidebar-cta:active { background: var(--color-blue); color: var(--color-light); }

@media (hover: hover) {

  .sidebar-cta:hover { background: var(--color-blue); color: var(--color-light); }

}
.sidebar-form { margin-top: 12px; }
.sidebar-form .form-hint {
  font-size: 0.75rem;
  line-height: 1.4;
  color: rgba(var(--color-blue-rgb), 0.6);
  margin-bottom: 16px;
}
.sidebar-form label {
  display: block;
  font-size: 0.8125rem;
  font-weight: 700;
  color: var(--color-blue);
  margin-bottom: 4px;
}
.sidebar-form input[type="text"],
.sidebar-form input[type="email"] {
  display: block;
  width: 100%;
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.3);
  border-radius: 4px;
  padding: 9px 12px;
  font-size: 0.875rem;
  font-family: inherit;
  color: var(--color-blue);
  margin-bottom: 16px;
  transition: border-color 0.2s;
}
.sidebar-form input[type="text"]:focus,
.sidebar-form input[type="email"]:focus {
  outline: none;
  border-color: var(--color-red);
}
.sidebar-form .form-row {
  display: flex;
  gap: 12px;
}
.sidebar-form .form-row > div {
  flex: 1;
  min-width: 0;
}
.sidebar-form textarea {
  display: block;
  width: 100%;
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.3);
  border-radius: 4px;
  padding: 9px 12px;
  font-size: 0.875rem;
  font-family: inherit;
  color: var(--color-blue);
  margin-bottom: 16px;
  resize: vertical;
  min-height: 80px;
  transition: border-color 0.2s;
}
.sidebar-form textarea:focus {
  outline: none;
  border-color: var(--color-red);
}
.sidebar-form .form-checkbox {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  font-size: 0.8125rem;
  line-height: 1.4;
  margin-bottom: 16px;
  cursor: pointer;
}
.sidebar-form .form-checkbox input {
  margin-top: 3px;
  flex-shrink: 0;
}
.sidebar-form button.sidebar-cta {
  width: 100%;
  border: none;
  cursor: pointer;
  font-family: inherit;
}
/* END - Sidebar - Formular & Buttons */

/* START - Formular (Form Framework) */
/* Styling für die fluid_styled_content-/EXT:form-Formulare (Inhaltselement
   frame-type-form_formframework, z. B. das Workshop-Anmeldeformular). Nutzt
   dieselben Design-Tokens wie das Sidebar-Formular (Cream-Feld, blaue Kontur,
   roter Fokus/Akzent, Pill-Button). Alles unter dem Frame-Wrapper gescoped,
   damit andere Formulare (Sidebar/Footer) unberührt bleiben. */
.frame-type-form_formframework .form-group { margin-bottom: 16px; }
.frame-type-form_formframework .form-row {
  display: flex;
  gap: 16px;
}
.frame-type-form_formframework .form-row > .form-group {
  flex: 1;
  min-width: 0;
}
/* Eingabefelder untereinander und in voller Breite ab 1024px abwärts (war 600px).
   Vorname/Nachname nebeneinander brauchen Platz; in der Seitenleiste bleiben
   davon je rund 130px, sobald das Fenster unter 1024px liegt.
   ⚠️ `max-width` MUSS mit: custom_forms/styles.css deckelt `.form-row > div`
   bedingungslos auf `max-width: calc(50% - 10px)` und gibt das erst unter
   800px frei — noch ein fremder Umbruchpunkt. Ohne die Rücknahme steht die
   Spalte zwar untereinander, bleibt aber halb so breit (gemessen 131px in
   einer 282px-Reihe). Dieselbe Falle wie bei den Rasterspalten und md2022s
   container.css: flex allein reicht nie. */
@media (max-width: 1023.98px) {
  .frame-type-form_formframework .form-row { flex-direction: column; gap: 0; }
  .frame-type-form_formframework .form-row > .form-group,
  .frame-type-form_formframework .form-row > div {
    flex: 1 1 100%;
    width: 100%;
    max-width: 100%;
  }
}
.frame-type-form_formframework .form-control-label {
  display: block;
  font-size: 0.8125rem;
  font-weight: 700;
  color: var(--color-blue);
  margin-bottom: 4px;
}
.frame-type-form_formframework .required { color: var(--color-red); }
.frame-type-form_formframework .form-control {
  display: block;
  width: 100%;
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.3);
  border-radius: 4px;
  padding: 10px 12px;
  font-size: 0.9375rem;
  font-family: inherit;
  color: var(--color-blue);
  transition: border-color 0.2s;
}
.frame-type-form_formframework textarea.form-control {
  resize: vertical;
  min-height: 100px;
}
.frame-type-form_formframework .form-control:focus {
  outline: none;
  border-color: var(--color-red);
}
/* Kontrollkästchen/Radios (z. B. Datenschutz-Zustimmung, falls sichtbar) */
.frame-type-form_formframework .form-group-checkbox,
.frame-type-form_formframework .form-group-radio {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  font-size: 0.875rem;
  line-height: 1.4;
}
.frame-type-form_formframework .form-group-checkbox input,
.frame-type-form_formframework .form-group-radio input {
  margin-top: 3px;
  flex-shrink: 0;
  width: auto;
}
/* Statischer Text (z. B. Datenschutz-Hinweis) */
.frame-type-form_formframework .form-group-statictext p {
  font-size: 0.875rem;
  line-height: 1.5;
}
/* Absende-Button im Stil von .sidebar-cta (Pill, rot → blau beim Hover) */
.frame-type-form_formframework .actions { margin-top: 8px; }
.frame-type-form_formframework .btn-primary {
  display: inline-block;
  background: var(--color-red);
  color: var(--color-light);
  border: none;
  cursor: pointer;
  padding: 12px 28px;
  font-family: inherit;
  font-weight: 700;
  font-size: 0.875rem;
  border-radius: 999px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  transition: background 0.2s, color 0.2s;
}
@media (hover: hover) {

  /* ⚠️ SEIT 12.8.2026 rot-dunkel statt blau. Derselbe Knopf im Footer-Formular
     (:is(…frame-blue, …is-footer) button.btn-primary, weiter unten) ging schon
     immer rot → rot-dunkel; hier ging er rot → blau. Zwei Antworten auf dieselbe
     Frage, dem User aufgefallen („mache buttons gleich, z. B. der im Content und
     der im Footer beim Formular"). Jetzt beide gleich.
     Hausregel: eine GEFÜLLT ROTE Fläche kann nicht rot werden — sie wird dunkler. */
  .frame-type-form_formframework .btn-primary:hover {
  background: var(--color-red-dark);
  color: var(--color-light);
}

}
/* Bestätigungsmeldung nach dem Absenden (ConfirmationFinisher, Markup
   ul.typo3-messages > li.alert > h4.alert-title + p.alert-message, siehe
   custom_forms/.../Finishers/Confirmation): als Hinweis-Box im Stil der
   ".info-box" der statischen Vorlage — ohne Listenpunkt, Titel in
   normaler Schreibung (die Versal-Regel der Seitenleisten-H4 nimmt
   .alert-title per :not aus). */
ul.typo3-messages {
  list-style: none;
  margin: 0;
  padding: 0;
}
ul.typo3-messages > li.alert {
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.12);
  border-left: 4px solid var(--color-red);
  border-radius: 4px;
  padding: 20px 24px;
}
/* 17.8.2026 vergroessert. Der Text lag mit 0.875rem (14px) UNTER dem
   Fliesstext der Seite — `body` steht auf 16px/24px, nachgemessen. Jetzt
   traegt die Meldung Fliesstextgroesse, der Titel liegt mit 1.125rem
   (18px) knapp darueber. Vom Nutzer so gewuenscht: "die Ueberschrift auch
   etwas groesser als der Text, der die Fliesstextgroesse haben soll". */
ul.typo3-messages .alert-title {
  color: var(--color-blue);
  font-size: 1.125rem;
  line-height: 1.35;
  margin: 0 0 10px;
}
ul.typo3-messages .alert-message {
  font-size: 1rem;
  line-height: 1.6;
  margin: 0;
}

/* Schweregrad am linken Balken (17.8.2026).
   TYPO3 11 kennt GENAU FUENF Grade; die Klassennamen stammen aus
   typo3/sysext/core/.../Messaging/Renderer/ListRenderer.php:
   NOTICE->alert-notice, INFO->alert-info, OK->alert-success,
   WARNING->alert-warning, ERROR->alert-danger. Die Regel oben bleibt als
   Rueckfall fuer Markup ohne Gradklasse.

   Herkunft der Farben — nichts davon ist frei erfunden:
   - Orange = das Kartenorange der "gemischten" Marker,
     md_events/.../Css/listMap.css:319 (.orangemarker) und
     .../JavaScript/listMap.js:492 als Standardfarbe.
   - Grau = vom Nutzer vorgegeben.
   - Gruen NEU, in OKLCH gerechnet: H 150 Grad liegt 102 Grad von Orange
     und 108 Grad von Blau entfernt, also etwa gleich weit von beiden.
     L 0.55 / C 0.14 -> #1c8742, Kontrast 4,32 zum Kastengrund.

   ⚠️ Koralle (2,79) und Orange (2,57) erreichen die 3,0 aus WCAG 1.4.11
   NICHT — das sind die CI-Farben, keine Wahl von hier. Traegt hier nicht,
   weil die Farbe NICHT alleiniger Bedeutungstraeger ist: die Titel sagen
   bereits "INFO:", "WARNUNG:", "FEHLER:". Wer die Titel je kuerzt, holt
   sich das Problem zurueck.
   ⚠️ `--color-notice` ist mit 1,11 gegen den Kastengrund faktisch
   unsichtbar. Bewusst so: NOTICE kommt im FRONTEND gar nicht vor (in
   userdata nur im BackendController), im Bestand sind nur INFO, WARNING
   und ERROR erreichbar.
   ⚠️ Diese Regeln gelten fuer ALLE Flash-Meldungen auf sprezu, nicht nur
   die von userdata — auch die Bestaetigung von custom_forms nach dem
   Absenden eines Formulars haengt an diesem Markup. */
ul.typo3-messages > li.alert-notice  { border-left-color: var(--color-notice); }
ul.typo3-messages > li.alert-info    { border-left-color: var(--color-blue); }
ul.typo3-messages > li.alert-success { border-left-color: var(--color-green); }
ul.typo3-messages > li.alert-warning { border-left-color: var(--color-orange); }
ul.typo3-messages > li.alert-danger  { border-left-color: var(--color-red); }
/* Pflichtfeld-Hinweis unter dem Formular */
.frame-type-form_formframework .mandatory_helper {
  font-size: 0.8125rem;
  color: rgba(var(--color-blue-rgb), 0.6);
  margin-top: 12px;
}
/* END - Formular (Form Framework) */

/* START - Personen & Kontakt-Karten */
/* Foto/Avatar-Varianten für Ansprechpersonen (Sidebar, Projekte) mit Name/Rolle/E-Mail. */
/* Volles Bild statt 16:9-Beschnitt — das Seitenverhältnis bestimmt der
   Zuschneider im Backend, nicht das CSS. Der Platzhalter darunter behält
   seine 16/9, er hat kein Bild, das eine Höhe aufspannen könnte.
   Die runden Avatare (.person-avatar, .project-contact-avatar) bleiben
   bewusst quadratisch beschnitten: sie sind Bedienoberfläche, kein Motiv. */
.person-photo {
  width: 100%;
  border-radius: 4px;
  overflow: hidden;
  margin-top: 12px;
}
.person-photo img {
  width: 100%;
  height: auto;
}
.person-photo-placeholder {
  width: 100%;
  aspect-ratio: 16 / 9;
  border-radius: 4px;
  margin-top: 12px;
  background: rgba(255, 255, 255, 0.5);
  border: 1px dashed rgba(var(--color-blue-rgb), 0.3);
  display: flex; align-items: center; justify-content: center;
  font-size: 0.875rem;
  color: rgba(var(--color-blue-rgb), 0.45);
  text-align: center;
}
.person-caption { margin-top: 12px; font-size: 0.875rem; line-height: 1.4; }
.person-caption strong { display: block; font-size: 0.875rem; margin-bottom: 2px; }
.person-caption span { display: block; color: rgba(var(--color-blue-rgb), 0.7); margin-bottom: 4px; }
.person-caption a { font-size: 0.875rem; }
.person {
  display: flex; align-items: center; gap: 12px;
  margin-top: 12px;
}
.person-avatar {
  width: 44px; height: 44px;
  border-radius: 50%;
  background: var(--color-blue);
  display: flex; align-items: center; justify-content: center;
  color: var(--color-light); font-weight: 700; font-size: 0.875rem;
  flex-shrink: 0;
  overflow: hidden;
}
.person-avatar img {
  width: 100%; height: 100%;
  object-fit: cover;
}
.person-info { font-size: 0.875rem; line-height: 1.3; }
.person-info strong { display: block; font-size: 0.875rem; }
.person-info a { font-size: 0.875rem; }
.project-contact {
  display: flex; align-items: center; gap: 12px;
  margin-top: 20px;
  padding-top: 20px;
  border-top: 1px solid rgba(var(--color-light-rgb), 0.25);
}
.project-contact-avatar {
  width: 44px; height: 44px;
  border-radius: 50%;
  flex-shrink: 0;
  overflow: hidden;
  background: rgba(var(--color-light-rgb), 0.18);
  display: flex; align-items: center; justify-content: center;
}
.project-contact-avatar img {
  width: 100%; height: 100%;
  object-fit: cover;
}
.project-contact-avatar svg {
  width: 60%; height: 60%;
  opacity: 0.75;
}
.project-contact-avatar img {
  width: 100%; height: 100%;
  object-fit: cover;
}
.project-contact-info {
  font-size: 0.875rem;
  line-height: 1.3;
}
.project-contact-info strong {
  display: block;
  font-size: 0.875rem;
}
.project-contact-info a {
  color: inherit;
  text-decoration: underline;
  text-decoration-color: rgba(var(--color-light-rgb), 0.5);
}
@media (hover: hover) {

  .project-contact-info a:hover {
  text-decoration-color: currentColor;
}

}
/* END - Personen & Kontakt-Karten */

/* START - Partner-Logos & externe Links */
/* Platzhalter-Logokacheln für Projektpartner sowie Pill-Link zu externen Quellen. */
.partner-logos {
  display: flex;
  gap: 16px;
  margin-top: 16px;
  flex-wrap: wrap;
}
/* Echte Partner-Logos (Bilder statt Platzhalter): auf weissem Kästchen, damit
   sie auch auf dem farbigen Projekt-Hintergrund lesbar sind, Höhe begrenzt.
   Achtung box-sizing: border-box — die Höhe enthält das Polster, netto bleibt
   also height minus 2x padding für das Logo selbst. Reines Weiss statt
   --color-light, weil viele Partner-Logos selbst weissen Grund mitbringen und
   sonst ein sichtbares Rechteck im Kästchen stehen würde. */
.partner-logos img {
  height: 5rem;
  width: auto;
  max-width: 17.5rem;
  object-fit: contain;
  background: #fff;
  padding: 0.75rem 1rem;
  border-radius: 0.375rem;
}
.partner-logo-placeholder {
  width: 120px;
  height: 64px;
  background: rgba(255, 255, 255, 0.5);
  border: 1px dashed rgba(var(--color-blue-rgb), 0.3);
  border-radius: 4px;
  display: flex; align-items: center; justify-content: center;
  font-size: 0.875rem;
  color: rgba(var(--color-blue-rgb), 0.45);
  text-align: center;
  flex-shrink: 0;
}
.external-link-card {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-top: 20px;
  padding: 10px 18px;
  background: var(--color-blue);
  color: var(--color-light);
  border-radius: 999px;
  text-decoration: none;
  font-size: 0.875rem;
  font-weight: 700;
  transition: all 0.2s;
}
/* ⚠️⚠️ `color` ist hier PFLICHT, obwohl es sich wiederholt. Zeile 106 setzt ein
   nacktes a:hover auf --color-red-dark (Spezifität 0-1-1) und schlägt damit die
   Grundregel dieser Karte (0-1-0). Ist die Karte ein <a> ohne Klasse `btn`,
   stünde beim Zeigen rote Schrift auf rotem Grund — unlesbar.
   ⚠️ Am 12.8.2026 GESUCHT und NICHT entschieden: die Klasse steht nirgends im
   Repository außer hier, weder in einem Fluid-Template noch in JavaScript. Sie
   wird also redaktionell im Inhaltselement gesetzt oder ist tot. Statt das zu
   ergründen ist die Regel hier unabhängig davon abgesichert — die Zeile kostet
   nichts und wirkt in beiden Fällen richtig. Wer die Klasse im Backend findet,
   kann den Hinweis kürzen, aber nicht die Zeile. */
.external-link-card:active {
  background: var(--color-red-dark);
  color: var(--color-light);
}

@media (hover: hover) {

  .external-link-card:hover {
  background: var(--color-red-dark);
  color: var(--color-light);
}

}
/* END - Partner-Logos & externe Links */

/* START - Phineo-Siegel */
/* PHINEO-Wirkt-Siegel im Footer bzw. in Sidebars (unterschiedliche Zielgröße je Kontext). */
.phineo-badge {
  text-align: center;
}
.phineo-badge img {
  max-width: 240px;
  margin: 0 auto;
}
.sidebar .phineo-badge img {
  max-width: 70%;
}
/* END - Phineo-Siegel */

/* START - Tiles */
/* Klickbare Bild-Text-Kacheln (z. B. "Wie Sie Teil von Sprechen & Zuhören werden" auf der Startseite). */
.tiles {
  display: grid;
  grid-template-columns: 1fr;
  gap: 24px;
  margin-top: 48px;
}
.tile {
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.12);
  border-radius: 4px;
  overflow: hidden;
  transition: all 0.2s;
  text-decoration: none;
  color: var(--color-blue);
  display: flex; flex-direction: column;
}
@media (hover: hover) {

  .tile:hover {
  border-color: var(--color-red-dark);
  transform: translateY(-4px);
  box-shadow: 0 12px 32px rgba(var(--color-blue-rgb), 0.12);
}

}
/* Bild vollständig zeigen statt beschneiden: keine feste Kachelhöhe, die Höhe
   folgt dem im TYPO3-Zuschneider gewählten Seitenverhältnis. Feste Höhe plus
   object-fit:cover schnitt je nach Viewport verschieden viel weg — die 200px
   ergaben bei 350px Kachelbreite 1.75:1, bei 500px aber 2.5:1, ein 16:9-Bild
   verlor dort oben und unten je ein Sechstel. Hero und Foto-Bento bleiben
   bewusst auf cover, dort ist die Rasterfläche das gestaltende Element.
   Die Kacheln selbst bleiben gleich hoch (Grid streckt, .tile-content hat
   flex:1), nur der Umbruch zwischen Bild und Text sitzt je Kachel anders. */
.tile-image {
  background: var(--color-blue);
  position: relative;
  overflow: hidden;
}
.tile-image img {
  width: 100%;
  height: auto;
}
.tile-content { padding: 28px; flex: 1; display: flex; flex-direction: column; }
.tile-content h3 { margin-bottom: 12px; }
.tile-content p { font-size: 16px; line-height: 1.55; flex: 1; }
.tile-arrow {
  margin-top: 20px;
  font-weight: 700; font-size: 0.875rem;
  text-transform: uppercase; letter-spacing: 0.05em;
  color: var(--color-red);
}
@media (min-width: 768px) {
  .tiles { grid-template-columns: repeat(2, 1fr); }
  .tiles > :nth-child(1) {
    grid-column: span 2;
  }
}
@media (min-width: 1024px) {
  .tiles { grid-template-columns: repeat(3, 1fr); }
  .tiles > :nth-child(1) {
    grid-column: span 1;
  }
}
/* END - Tiles */

/* START - Karte (Veranstaltungsorte) */
/* Statische Ersatzkarte mit Deutschland-Umriss und Standort-Pins (kein Leaflet mehr, siehe map.js) plus Kennzahlen-Kacheln. */
.map-section { background: var(--color-cream); padding: 0 0 96px; position: relative; }
.map-section::before {
  content: "";
  display: block;
  width: 120px;
  height: 1px;
  background: rgba(var(--color-blue-rgb), 0.2);
  margin: 0 auto 64px;
}
.map-container {
  max-width: 1400px; margin: 0 auto;
  padding: 0 24px;
  display: grid;
  grid-template-columns: 1fr;
  gap: 64px;
  align-items: center;
}
.map-intro h2 { margin-bottom: 24px; }
/* START - Info-Panels (konfigurierbares Panel-Raster, CType sprezu_infopanels;
   vormals .stat/.map-stats). Hintergrund + Strichfarbe kommen als Element-
   Modifier (.info-panels--bg-* / --stripe-*), Schriftstil + -farbe je Slot als
   Klasse (.panel-text-* / .text-*), siehe Template InfoPanels.html. */
.info-panels {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
  margin-top: 2rem;
}
.info-panel {
  padding: 1.5rem;
  background: rgba(var(--color-light-rgb), 0.08); /* Default = ".section-blue .effect" */
  border-left: 4px solid var(--color-red);        /* Default-Strich rot */
}
.info-panel-header { margin-bottom: 0.5rem; }
/* Hintergrund-Varianten (Element-Ebene) */
.info-panels--bg-light .info-panel  { background: var(--color-light); }
.info-panels--bg-cream .info-panel  { background: var(--color-cream); }
.info-panels--bg-red .info-panel    { background: var(--color-red); }
.info-panels--bg-blue .info-panel   { background: var(--color-blue); }
.info-panels--bg-effect .info-panel { background: rgba(var(--color-light-rgb), 0.08); }
/* Strich-Varianten (Element-Ebene). Farbreihenfolge überall: light, cream, red, blue. */
.info-panels--stripe-light .info-panel { border-left-color: var(--color-light); }
.info-panels--stripe-cream .info-panel { border-left-color: var(--color-cream); }
.info-panels--stripe-red .info-panel   { border-left-color: var(--color-red); }
.info-panels--stripe-blue .info-panel  { border-left-color: var(--color-blue); }
/* Schriftstil-Presets (je Header/Subheader wählbar; vormals .stat-number /
   .stat-label). Unter ".info-panels" gescopet, damit sie sicher greifen. */
.info-panels .panel-text-normal { font-size: 1rem; font-weight: 400; line-height: 1.5; text-transform: none; letter-spacing: normal; }
.info-panels .panel-text-bold   { font-size: 1rem; font-weight: 700; line-height: 1.4; }
.info-panels .panel-text-number { font-size: 2.25rem; font-weight: 800; line-height: 1; }
.info-panels .panel-text-label  { font-size: 0.875rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; }
/* Accordion-Variante: ein Panel MIT RTE-Text (bodytext) wird aufklappbar.
   Volle Breite (kein 50/50), Kopf = Button mit Chevron rechts, Text im
   aufklappbaren Body. Werte wie das statische .thesis-Akkordeon; Hintergrund/
   Farben bleiben aus den Panel-Einstellungen (kein Override). */
.info-panel--accordion { grid-column: 1 / -1; }
.info-panel-toggle {
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  width: 100%; background: none; border: none; padding: 0; margin: 0;
  cursor: pointer; text-align: left; font: inherit; color: inherit;
}
.info-panel-toggle-text { display: block; flex: 1; }
.info-panel-toggle-text .info-panel-header,
.info-panel-toggle-text .info-panel-subheader { display: block; }
.info-panel-toggle-icon {
  flex-shrink: 0; width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 8px; background: rgba(var(--color-light-rgb), 0.15);
  transition: transform 0.2s ease, background 0.2s ease;
}
@media (hover: hover) {

  .info-panel-toggle:hover .info-panel-toggle-icon { background: rgba(var(--color-light-rgb), 0.28); }

}
.info-panel--open .info-panel-toggle-icon { transform: rotate(180deg); }
.info-panel-body { display: none; margin-top: 16px; }
.info-panel--open .info-panel-body { display: block; }
.info-panel-body > :first-child { margin-top: 0; }
.info-panel-body > :last-child { margin-bottom: 0; }
/* END - Info-Panels */
.map-leaflet-wrap {
  background: var(--color-light);
  padding: 12px;
  border-radius: 4px;
  position: relative;
  box-shadow: 0 4px 24px rgba(var(--color-blue-rgb), 0.08);
}
.map-leaflet {
  width: 100%;
  height: 480px;
  border-radius: 4px;
  background: var(--color-cream);
  display: flex; align-items: center; justify-content: center;
}
.map-loading {
  display: flex; flex-direction: column; align-items: center; gap: 12px;
  color: var(--color-blue);
  font-size: 0.875rem;
}
.map-loading-spinner {
  width: 32px; height: 32px;
  border: 3px solid rgba(var(--color-blue-rgb), 0.15);
  border-top-color: var(--color-red);
  border-radius: 50%;
  animation: map-spin 0.8s linear infinite;
}
@keyframes map-spin { to { transform: rotate(360deg); } }
.map-fallback {
  width: 100%; height: 100%;
  display: flex; align-items: center; justify-content: center;
  padding: 24px;
}
.map-fallback svg { max-width: 360px; width: 100%; height: auto; }
.map-leaflet-tall { height: 560px; }
@media (min-width: 768px) {
  .map-section::before { margin-bottom: 96px; }
  .map-container { padding: 0 64px; }
  .info-panels { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 1024px) {
  .map-container { grid-template-columns: 1fr 1.4fr; }
}
/* END - Karte (Veranstaltungsorte) */

/* START - News / Medien-Kacheln */
/* Kachel-Grid für Presse-/Medienbeiträge ("Sprechen & Zuhören in den Medien"). */
.news-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 28px;
  margin-top: 48px;
}
.news-item {
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.1);
  border-radius: 4px;
  overflow: hidden;
  text-decoration: none;
  color: var(--color-blue);
  transition: all 0.2s;
  display: flex; flex-direction: column;
}
@media (hover: hover) {

  .news-item:hover { border-color: var(--color-red-dark); transform: translateY(-4px); box-shadow: 0 16px 32px rgba(var(--color-blue-rgb), 0.1); }

}
/* Wie bei .tile-image: volles Bild statt Beschnitt, die Höhe kommt aus dem
   Seitenverhältnis des Bildes (f:media rendert mit 800m, behält also den im
   Zuschneider gewählten Ausschnitt). Die frühere feste Höhe von 220px trägt
   jetzt das Ersatz-Icon — es ist der einzige Fall ohne Bild und bräuchte sonst
   eine Fläche, die niemand aufspannt (der Verlauf wäre 0px hoch). */
.news-thumb {
  background: linear-gradient(135deg, var(--color-blue), var(--color-blue-secondary));
  position: relative;
  overflow: hidden;
}
.news-thumb img {
  width: 100%;
  height: auto;
}
.news-thumb-icon {
  width: 100%; height: 13.75rem;
  display: flex; align-items: center; justify-content: center;
  font-size: 40px; color: rgba(var(--color-light-rgb), 0.85);
}
.news-body { padding: 32px; flex: 1; }
.news-source {
  font-size: 0.875rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--color-red); margin-bottom: 12px;
}
.news-body h4 {
  font-size: 20px; line-height: 1.35;
  margin-bottom: 12px;
}
.news-date {
  font-size: 0.875rem;
  color: rgba(var(--color-blue-rgb), 0.6);
  margin-top: 12px;
}
.news-cta-wrap {
  text-align: center;
  margin-top: 48px;
}
.news-cta {
  display: inline-flex; align-items: center; gap: 10px;
  background: var(--color-blue); color: var(--color-light);
  padding: 16px 32px;
  font-size: 16px; font-weight: 700;
  text-decoration: none;
  border-radius: 999px;
  transition: all 0.2s;
}
@media (hover: hover) {

  .news-cta:hover { background: var(--color-red-dark); color: var(--color-light); }

}
@media (min-width: 768px) {
  .news-grid { grid-template-columns: repeat(2, 1fr); }
  .news-grid > :nth-child(1) {
    grid-column: span 2;
  }
}
@media (min-width: 1024px) {
  .news-grid { grid-template-columns: repeat(3, 1fr); }
  .news-grid > :nth-child(1) {
    grid-column: span 1;
  }
}
/* Hinweis: Die EXT:news-Listen (news_pi1 / news_newsselectedlist) rendern über
   eigene Templates in custom_sprezu (Resources/Private/News/) direkt das
   ".news-grid"/".news-item"-Markup oben — daher braucht es hier kein separates
   Styling für das frühere Standard-".article"-Markup mehr. */
/* END - News / Medien-Kacheln */

/* START - Footer */
/* Site-weiter Footer: farbige Fläche; oberer Bereich ist redaktionell
   (footerContent-Gridelement aus customtemplate.footer.contentPid), darunter
   Rechts-Navigation und Copyright-Zeile. Die früheren fest verdrahteten
   Spalten (Logo/PHINEO/Kontakt/Newsletter) samt zugehöriger Klassen wurden
   entfernt, da der obere Footer jetzt über ein Gridelement gepflegt wird. */
.footer {
  background: var(--color-blue);
  color: var(--color-light);
  padding: 64px 0 32px;
}
.footer h4 {
  color: var(--color-red);
  font-size: 0.875rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.12em;
  margin-bottom: 16px;
}
.footer p, .footer a {
  font-size: 0.875rem; line-height: 1.6;
  color: rgba(var(--color-light-rgb), 0.85);
}
.footer a:active { color: var(--color-red); }

@media (hover: hover) {

  .footer a:hover { color: var(--color-red); }

}
.footer-nav {
  max-width: 1400px; margin: 32px auto 0;
  padding: 24px 24px 0;
  border-top: 1px solid rgba(var(--color-light-rgb), 0.15);
  display: flex; flex-wrap: wrap; gap: 12px 24px;
}
.footer-nav a {
  font-size: 0.875rem;
  color: rgba(var(--color-light-rgb), 0.85);
  text-decoration: none;
}
.footer-nav a:active { color: var(--color-red); }

@media (hover: hover) {

  .footer-nav a:hover { color: var(--color-red); }

}
.footer-bottom {
  max-width: 1400px; margin: 24px auto 0;
  padding: 24px 24px 0;
  border-top: 1px solid rgba(var(--color-light-rgb), 0.15);
  font-size: 0.875rem;
  color: rgba(var(--color-light-rgb), 0.6);
  display: flex; justify-content: space-between; flex-wrap: wrap; gap: 12px;
}
/* Container-Element im Footer ohne eigenen Aussenabstand und ohne eigenen Grund.

   Die Inhaltsbreite (1400px, 24/64px Einrueckung) kommt aus dem Abschnitts-Look
   weiter unten ("Rasterabschnitte") — dieselbe Regel, die auch .footer-nav und
   .footer-bottom buendig darunter stellt. Was dort NICHT passt, ist der
   senkrechte Abstand von 64/96px und die Hintergrundfarbe: Der <footer> bringt
   sein Blau und sein Polster schon selbst mit, das Element wuerde beides
   verdoppeln.

   Ohne Bedingung auf "is-footer": Der Haken "Ist Footer" IST am Fusselement
   gesetzt (tt_content 74749, tx_sprezu_footer=1, dev am 31.7.2026 nachgesehen),
   und die is-footer-Regel weiter unten nimmt das Polster ebenfalls zurueck.
   Massgeblich ist hier aber nicht der Haken, sondern WO das Element steht: Im
   <footer class="footer"> waeren 96px Innenabstand und ein zweites Blau immer
   falsch, auch an einem Element ohne Haken. Die typografischen is-footer-Regeln
   weiter unten haengen weiterhin am Haken, nur diese Ruecknahme nicht. */
.footer > .frame[class*="frame-type-container"] {
  padding: 0;
  background: transparent;
}
@media (min-width: 768px) {
  .footer-nav { padding: 24px 64px 0; }
  .footer-bottom { padding: 24px 64px 0; }
}
/* PHINEO-Siegel im Footer nicht mitwachsen lassen.

   Gemeldet am 31.7.2026: Das Siegel wirkt bei kleineren Auflösungen zu groß. Es
   ist als gewöhnliches Text/Medien-Element in der zweiten Footer-Spalte
   eingesetzt (nicht als ".phineo-badge"), die Bilddatei ist 600x361px groß und
   füllt deshalb, was die Spalte hergibt. Nachgerechnet mit den Spaltenbreiten
   dieser Datei:
       ab 1200px Fenster  4 Spalten  ->  bis 314px  (Inhalt 1400 - 3x48 Rinne)
       1024-1200px        4 Spalten  ->  188-232px
       768-1023px         2 Spalten  ->  ab 362px   <- springt nach OBEN
       unter 768px        1 Spalte   ->  bis 600px
   Der Sprung liegt also genau am Umbruch auf zwei Spalten. Nur dort wird
   gedeckelt, die Darstellung auf großen Schirmen bleibt unangetastet. 240px ist
   der Wert, den ".phineo-badge img" weiter oben ohnehin vorgibt.

   Bewusst am Bild und nicht an der Spalte: Das Logo darüber (100px) und das
   Mehr-Demokratie-Logo (200px) liegen unter dieser Grenze, für sie ändert sich
   nichts.

   1.8.2026: `margin-left/right: auto` entfernt. Die drei Bilder (Wortmarke,
   PHINEO-Siegel, Mehr-Demokratie-Logo) standen dadurch als einzige Elemente
   des Fußes mittig, während Überschriften, Fließtext und Anschrift links
   bündig blieben — gemessen 298,5px Rand je Seite gegen 0px bei allem
   anderen. Der Deckel von 240px bleibt, er löst ein anderes Problem. */
@media (max-width: 1023.98px) {
  .footer .grid-column .ce-gallery img {
    max-width: 240px;
  }
}
/* Hinweis 1.8.2026: Das PHINEO-Siegel stand mittig, weil sein Inhaltselement
   im Backend auf „Zentriert" gesetzt war (`.ce-center` → `.ce-center img`
   zentriert per auto-Rand). Kurzzeitig gab es hier einen CSS-Override dagegen;
   er ist wieder entfernt, weil der Nutzer das Element im Backend auf „links"
   gestellt hat. Die Ausrichtung einzelner Bilder gehört in die Redaktion, nicht
   ins Stylesheet — ein Override hier würde den Backend-Schalter lautlos
   wirkungslos machen. */
/* END - Footer */

/* START - Cookie-Consent */
/* ══════════════════════════════════════════════════════════════════════════
   COOKIE-BANNER AUF S&Z-PALETTE   (17.8.2026)
   ──────────────────────────────────────────────────────────────────────────
   Das Banner kommt aus EXT:matomocookieconsent (orestbida/cookieconsent 3,
   Wurzelelement `#cc-main`). Jene Datei gilt für ALLE ~23 Sites und ist dort
   im MD-Design gesetzt: Source Sans Pro, Signalblau #1271ee, weisser Grund,
   eckige Knöpfe, Hover HELLER (#2e92ff). Sie wird nicht angefasst — hier
   steht nur die S&Z-Fassung.

   ⚠️⚠️ HIER STAND BIS ZUM 17.8.2026 TOTER CODE. Der Vorgängerblock färbte
   `.cc-window`, `.cc-btn`, `.cc-link` und `.cc-revoke` — die Klassen der
   ALTEN Osano-Bibliothek. Die ist am 14.8.2026 durch orestbida ersetzt
   worden (setup.typoscript der Extension bindet nur noch diese ein), seither
   entstand keine dieser Klassen mehr: rund 110 Zeilen, die nichts trafen.
   ⚠️ Auch `.cc-revoke { display:none }` ist damit erledigt und NICHT etwa
   eine Funktion, die verloren geht: der Footer-Link "Cookies" endet auf
   `#cookie-consent` und wird von `a[href$="#cookie-consent"]` im Consent-
   Skript abgefangen (CookieConsentScript.js, Zeile ~737) → showPreferences().
   Geprüft, bevor gelöscht wurde.

   ── WIE DIESER BLOCK GEWINNT ──────────────────────────────────────────────
   ⚠️ Über SPEZIFITÄT, nicht über !important. matomocookieconsent.css wird
   NACH dieser Datei geladen (dieselbe Lage wie bei listMap.css, siehe den
   Block "md_events - Karten-Zoom- & Dialog-Schliessen-Buttons"). Ein blosses
   `#cc-main` (1-0-0) verlöre deshalb bei Gleichstand über die Reihenfolge.
   Der führende `body` hebt jede Regel hier auf 1-0-1 und schlägt sie sauber.
   ⚠️ Wer eine Regel ergänzt, MUSS das `body` mitschreiben — sonst fällt sie
   still aus, und zwar erst auf dem Server, wo die Reihenfolge zählt.

   ⚠️⚠️ Die Bibliothek wird über IHRE Variablen eingefärbt. Die vollständige
   Liste steht in Libs/orestbida/cookieconsent.css; was dort nicht vorkommt,
   fällt STILL aus. Alle unten benutzten Namen sind gegen diese Liste geprüft.

   ── FARBEN: ALLE AUS DEM :root DIESER DATEI, KEINE ERFUNDEN ───────────────
     --color-blue #17427f · --color-blue-secondary #2c5288
     --color-red-dark #D85049 · --color-light #FBF8F4 · --color-cream #F5EFE5
   Die Tönungen sind `rgba(var(--color-blue-rgb), a)` — dieselbe Schreibweise,
   mit der die Site ihre Trenner, Ränder und Flächen abstuft.

   ⚠️⚠️ FENSTERGRUND IST WEISS — am 18.8.2026 vom Creme #F5EFE5 umgestellt
   ("statt creme doch lieber in weiß"). Das war NICHT eine Zeile: der
   Fenstergrund ist die Bezugsfläche für die Blockstaffelung, den AUS-Schalter,
   die Fusszeile und den Umriss-Knopf — alle vier Werte sind neu gerechnet, nicht
   übernommen. Weiss ist dabei kein Fremdkörper in der Palette: die Karten im
   Termin-Dialog stehen ebenso auf #ffffff (`dialog .dialog-event-item`).
   ⚠️ Auf Weiss trägt jeder Textwert BESSER als auf Creme (Fliesstext 8,65 → 9,90).
   Enger wurde nur die Blockstaffelung — dazu unten bei den Gruppenblöcken.

   ── KONTRASTE, am 18.8.2026 GERECHNET (WCAG 2.1, nicht geschätzt) ─────────
     Fliesstext   #17427f auf Weiss ................... 9,90:1  OK
     Zweitrang    #2c5288 auf Weiss ................... 7,87:1  OK
     Gruppenname  #17427f auf Block #E0E1E5 ........... 7,57:1  OK
     Knopf 1      #FBF8F4 auf #17427f ................. 9,35:1  OK
     Knopf 2      #17427f auf Weiss (Umriss) .......... 9,90:1  OK
     Fusszeile    #2c5288 auf rgba(blau,.10) .......... 6,63:1  OK
     Schalter AN  #17427f gegen Block ................. 7,57:1  OK
     Schalter AUS rgba(blau,.70) gegen Block .......... 3,32:1  OK
     Schalter AUS Knopf #FBF8F4 gegen die Bahn ........ 4,10:1  OK
     Reiter       #17427f auf hellem Grund ............ 9,43:1  OK
   ⚠️ DREI bewusst hingenommene Werte, alle GEERBT und nicht hier entstanden:
     Knopf-Hover  #FBF8F4 auf #D85049 ................. 3,84:1  unter 4,5
     Link-Hover   #D85049 auf Weiss ................... 4,07:1  unter 4,5
     Gruppenname im Hover #D85049 auf #EEEDEB ......... 3,48:1  unter 4,5
       → genau der Sprung, den `.btn-blue-filled:hover` und `a:hover` auf der
         ganzen Site machen. Wer das ändert, ändert es an allen Stellen.
         (Das MD-Banner liegt an derselben Stelle bei 3,15:1.)
   🔴 EIN Wert, der NICHT trägt und offen ist:
     Reiter       #17427f über einer BLAUEN Fläche .... 1,74:1  unsichtbar
       → s. den Block beim Widerrufsreiter ganz unten.

   ⚠️⚠️ MESSFEHLER, den ich beim Bauen selbst gemacht habe — als Warnung:
   Der AUS-Schalter wurde zuerst gegen den FENSTERGRUND gerechnet. Er sitzt aber
   IM Gruppenblock, und dort trug derselbe Wert deutlich weniger (auf Creme
   gemessen: 3,21 gegen das Fenster, aber nur 2,50 gegen den Block). Ein
   Bedienelement ist gegen seinen TATSÄCHLICHEN Nachbarn zu messen, nicht gegen
   die Fläche, auf der das Fenster steht. Beim Umbau auf Weiss deshalb erneut
   gegen den Block gerechnet. ⚠️ Und nach der Umstellung der Blocktöne auf
   #E0E1E5 (18.8.2026) ein drittes Mal: der hellere Block lässt die schwächere
   Bahn wieder zu, gesetzt ist deshalb .70 (3,32:1). Jede Änderung am Blockton
   verschiebt diesen Wert mit — er ist keine Eigenschaft des Schalters.
   ⚠️ Der Bestandswert der Kartenlegende (rgba(blau,.15), siehe
   ".legend-item .toggleswitch .slider" weiter unten) kam hier NICHT in Frage:
   das wäre auf Weiss 1,29:1 — der Schalter wäre im AUS-Zustand unsichtbar.
   Das ist der einzige Wert, der bewusst vom Kartenvorbild abweicht.
   ⚠️ Preis dieser Wahl, offen benannt: AUS gegen AN trägt 2,28:1. Den Zustand
   trägt damit zu einem guten Teil die STELLUNG des Knopfes und das Symbol der
   Bibliothek, nicht die Bahnfarbe allein. Eine dunklere Bahn würde das umdrehen
   und dafür gegen den Block verlieren — beides zugleich geht auf hellem Grund
   nicht. (Zwischenstand mit dem dunkleren Blockton waren hier nur 1,99.)

   ⚠️⚠️ DIE BEIDEN KNÖPFE BLEIBEN GLEICHGEWICHTIG (OH Digitale Dienste
   Rn. 135). Sie unterscheiden sich unten NUR in der Füllung — nie in Grösse,
   Form oder Schriftstärke. Wer hier abstuft, hebelt `equalWeightButtons` aus.
   ══════════════════════════════════════════════════════════════════════════ */
body #cc-main {
  /* Schrift der Site statt Source Sans Pro. Ausgeschrieben und nicht `inherit`:
     die Bibliothek setzt die Variable an mehreren Stellen ein, und `inherit`
     hinge dort jeweils am Elternelement statt an der Site. */
  --cc-font-family: 'Interstate', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;

  /* Grund = Weiss, wie die Inhaltskarten des Termin-Dialogs
     (`dialog .dialog-event-item { background:#ffffff }`). Vom Nutzer am
     18.8.2026 gewählt, nachdem Creme kurz gesetzt war.
     ⚠️ Ausgeschriebenes #ffffff und keine Variable: die Palette dieser Datei
     kennt kein --color-white. Der Karten-Dialog schreibt es ebenso aus. */
  --cc-bg: #ffffff;
  --cc-primary-color: var(--color-blue);
  --cc-secondary-color: var(--color-blue-secondary);
  --cc-link-color: var(--color-blue);

  /* Zustimmen = gefüllte Pille in CI-Blau, Hover rot — wie .btn-blue-filled
     und wie Zoom-/Schliessknopf der Karte. */
  --cc-btn-primary-bg: var(--color-blue);
  --cc-btn-primary-color: var(--color-light);
  --cc-btn-primary-border-color: var(--color-blue);
  --cc-btn-primary-hover-bg: var(--color-red-dark);
  --cc-btn-primary-hover-color: var(--color-light);
  --cc-btn-primary-hover-border-color: var(--color-red-dark);

  /* ⚠️⚠️ WELCHER KNOPF "sekundär" IST, IST NICHT DER ABLEHNKNOPF. Am 17.8.2026
     im gerenderten DOM nachgemessen — mit `equalWeightButtons: true` vergibt die
     Bibliothek an BEIDE Entscheidungsknöpfe dieselbe Klasse:
         "Alle erlauben"      class="cm__btn"              bg #17427f  r 999px
         "Nur notwendige"     class="cm__btn"              bg #17427f  r 999px
         "Einzeln entscheiden" class="cm__btn--secondary"  bg Creme
         "Auswahl speichern"   class="pm__btn--secondary"  bg Creme
     Die --cc-btn-secondary-* unten färben also den Weg IN die Einstellungen und
     das Speichern, NICHT die Ablehnung. Genau so gehört es sich: eine ungefüllte
     Ablehnung neben einer gefüllten Zustimmung wäre der Verstoss gegen Rn. 135,
     den `equalWeightButtons` gerade verhindert.
     ⚠️ Wer hier "den Ablehnknopf abschwächen" will, findet dafür keine Variable —
     und das ist Absicht der Bibliothek, kein Mangel. */
  --cc-btn-secondary-bg: #ffffff;
  --cc-btn-secondary-color: var(--color-blue);
  --cc-btn-secondary-border-color: var(--color-blue);
  --cc-btn-secondary-hover-bg: var(--color-red-dark);
  --cc-btn-secondary-hover-color: var(--color-light);
  --cc-btn-secondary-hover-border-color: var(--color-red-dark);

  /* Pille wie jeder Knopf der Site (.btn/.hero-cta: 999px); das Fenster
     bekommt die 4px, die hier 33× als Boxenradius vorkommen. */
  --cc-btn-border-radius: 999px;
  --cc-modal-border-radius: 4px;

  /* ── Gruppenblöcke: zwei neutrale Grautöne, vom Nutzer vorgegeben ────────
     ⚠️ Ruhe #E0E1E5 und Hover #EEEDEB sind Ansage des Nutzers vom 18.8.2026,
     keine gerechneten Werte. #EEEDEB steht schon als --color-notice im :root
     dieser Datei; #E0E1E5 kam neu dazu und wird deshalb hier EINMAL als
     eigene Property gesetzt, statt fünfmal als Zahl im Block zu stehen.
     ⚠️ Das var() darin ist unbedenklich, obwohl Custom Properties beim
     DEKLARIEREN auflösen: beide stehen am selben Element (`body #cc-main`).
     Heikel wäre nur der Fall, in dem der Wert erst weiter unten im Baum
     umdefiniert wird — den gibt es hier nicht.

     ⚠️⚠️ DER FÜLLWECHSEL ALLEIN TRÄGT NICHT: Hover gegen Ruhe sind gemessen
     nur 1,12:1 — dieselbe Grössenordnung, die ich beim Weiss-Entwurf als
     nachweislich nicht wahrnehmbar verworfen hatte (MD-Zielmarke 1,35).
     Wahrnehmbar wird der Hover erst durch die ROTE SCHRIFT weiter unten, die
     der Nutzer im selben Zug angesagt hat. Die beiden Vorgaben gehören
     deshalb zusammen: wer die rote Schrift entfernt, muss die Flächentöne
     weiter auseinanderziehen, sonst ist der Hover unsichtbar.

     ⚠️ Dass Ruhe-Fläche und Ruhe-Kontur DENSELBEN Ton tragen, ist Absicht und
     aus der MD-Fassung übernommen: im Ruhezustand hat der Block keine sichtbare
     Kante, beim Zeigen wird die Fläche heller und die Kontur bleibt stehen —
     die Kante ERSCHEINT also im Hover. Wer der Kontur einen eigenen Ton gibt,
     nimmt dem Hover genau dieses Signal.

     Gemessen: Ruhe gegen Fenster 1,31 · Hover gegen Ruhe 1,12 · Hover gegen
     Fenster 1,17 · Gruppenname #17427f auf Ruhe 7,57. */
  --sz-gruppenblock: #E0E1E5;

  --cc-separator-border-color: rgba(var(--color-blue-rgb), 0.1);
  --cc-section-category-border: var(--sz-gruppenblock);
  --cc-cookie-category-block-bg: var(--sz-gruppenblock);
  --cc-cookie-category-block-border: var(--sz-gruppenblock);
  --cc-cookie-category-block-hover-bg: var(--color-notice);
  --cc-cookie-category-block-hover-border: var(--sz-gruppenblock);
  /* Aufgeklappt behält die Kopfzeile ihren Ton — der Block soll geöffnet wie
     geschlossen gleich aussehen, nur der gedrehte Pfeil zeigt den Zustand.
     ⚠️⚠️ FALLE, aus der MD-Fassung übernommen: die zweite Variable heisst zwar
     "...-hover-bg", die Bibliothek benutzt sie im aufgeklappten Zustand aber als
     RAHMENFARBE (.pm__section--toggle.is-expanded setzt daraus
     --cc-cookie-category-block-border um). Wer sie nach dem Namen belegt, macht
     den Rahmen unsichtbar — ohne dass eine Regel fehlt oder etwas meldet.
     Deshalb steht hier die Konturfarbe, nicht der Flächenton. */
  --cc-cookie-category-expanded-block-bg: var(--sz-gruppenblock);
  --cc-cookie-category-expanded-block-hover-bg: var(--sz-gruppenblock);

  /* ── Schalter ────────────────────────────────────────────────────────────
     Form (40×24, Knopf 18×18, Radius 24px) kommt aus der MD-Fassung und ist
     dort der Kartenlegende nachgebaut — die ist auf beiden Sites dieselbe.
     Hier wechseln nur die Farben.
     ⚠️ GESPERRT (Gruppe "notwendig") = --color-blue-secondary. Der Ton trägt
     6,88:1 auf Creme, liegt aber nur 1,26:1 neben dem AN-Blau. Das ist hier
     richtig und kein Versehen: ein gesperrter Schalter IST an, mitzuteilen ist
     allein "nicht änderbar" — und das trägt das Schloss-Symbol im Knopf. Beim
     AUS-Schalter ist es umgekehrt, dort unterscheidet die Farbe den ZUSTAND,
     und deshalb steht er als einziger Wert bewusst weit weg (rgba(blau,.7)). */
  /* ⚠️ .70 und nicht mehr .75: der Gruppenblock ist mit #E0E1E5 heller geworden
     als der vorige gerechnete Ton, und auf ihm trägt die schwächere Bahn wieder.
     Gemessen auf #E0E1E5: .70 → 3,32 gegen den Block (Soll 3,0), Knopf 4,10 und
     2,28 gegen AN; .75 käme auf 3,82 / 4,71 / nur 1,99. Die .70 kaufen also
     Unterscheidbarkeit AUS↔AN zurück, ohne die 3:1 zu verlieren. */
  --cc-toggle-on-bg: var(--color-blue);
  --cc-toggle-off-bg: rgba(var(--color-blue-rgb), 0.7);
  --cc-toggle-on-knob-bg: var(--color-light);
  --cc-toggle-off-knob-bg: var(--color-light);
  --cc-toggle-readonly-bg: var(--color-blue-secondary);
  --cc-toggle-readonly-knob-bg: var(--color-light);
  --cc-toggle-enabled-icon-color: var(--color-light);
  --cc-toggle-disabled-icon-color: var(--color-light);
  --cc-toggle-readonly-knob-icon-color: var(--color-blue-secondary);

  /* ⚠️ Die Fusszeile ist auf Weiss DUNKLER als der Fenstergrund — auf Creme war
     sie heller. Das ist keine Inkonsequenz, sondern zwingend: über Weiss gibt es
     nichts Helleres mehr. Sie trägt deshalb den B-Ton (1,19 gegen das Fenster),
     genau wie MD dort #ebebeb setzt. --color-light käme auf 1,06 und wäre vom
     Fenstergrund nicht zu unterscheiden. */
  --cc-footer-bg: rgba(var(--color-blue-rgb), 0.1);
  --cc-footer-color: var(--color-blue-secondary);
  --cc-footer-border-color: rgba(var(--color-blue-rgb), 0.25);

  /* Schleier hinter dem Einstellungsdialog — zeichengleich mit
     `dialog.dialog-event::backdrop` weiter unten in dieser Datei. */
  --cc-overlay-bg: rgba(var(--color-blue-rgb), 0.55);

  /* ℹ️ Die Bildlaufleiste des Dialogs braucht keine eigene Zeile: die
     Bibliothek leitet --cc-webkit-scrollbar-bg aus --cc-section-category-border
     und --cc-webkit-scrollbar-hover-bg aus --cc-btn-primary-hover-bg ab. Beide
     sind oben gesetzt, die Leiste folgt damit automatisch der S&Z-Palette. */
}

/* Das weisse Fenster steht auf dem Seitengrund --color-light und trägt gegen
   ihn nur 1,06:1 — ohne Kontur wäre seine Kante nicht zu sehen. (Mit Creme war
   es 1,08, also genauso wenig; die Kontur war in beiden Fassungen zwingend.)
   Sie trägt den A-Ton und bringt 1,47:1 gegen den Seitengrund; der Schatten ist
   der Wert, mit dem die Site ihre schwebenden Flächen absetzt
   (vgl. .nav-menu.open, box-shadow 0 16px 32px … 0.18).
   ⚠️ Die MD-Fassung setzt hier `border: 1px solid #cccccc` — gleiche Stelle,
   nur andere Farbe; deshalb reicht border-color und die 1px bleiben stehen. */
body #cc-main .cm,
body #cc-main .pm {
  border-color: rgba(var(--color-blue-rgb), 0.25);
  box-shadow: 0 16px 32px rgba(var(--color-blue-rgb), 0.18);
}

/* Knopfschrift auf das Mass der Site: `.btn` ist 1rem/700, die MD-Fassung
   setzt 1.125rem. Eine Pille in MD-Grösse stünde neben den übrigen Knöpfen
   der Seite aus dem Raster.
   ⚠️ Der Wert steht in BEIDEN Selektoren gleich — Gleichgewicht der Knöpfe. */
body #cc-main .cm__btn,
body #cc-main .pm__btn {
  font-size: 1rem;
}

/* ⚠️⚠️ `--cc-btn-border-radius` IST NICHT NUR DER KNOPFRADIUS. Die Bibliothek
   benutzt dieselbe Variable an SECHS Stellen, darunter die Gruppenblöcke:
       .cm__btn · .cm__btn--close · .pm__close-btn
       .pm__section, .pm__section--toggle · .pm__section-title
       .pm__section--toggle .pm__section-desc-wrapper · .pm__btn
   Auf MD fiel das nie auf, weil dort 0 steht — derselbe Wert überall, kein
   sichtbarer Überlauf. Mit den 999px der S&Z-Pille wurden die drei
   Gruppenblöcke zu Riesenpillen (im gerenderten Dialog gemessen: 999px an
   .pm__section--toggle UND an .pm__section-title). Sie bekommen deshalb hier
   den Boxenradius der Site zurück.
   ⚠️ Die Beschreibungsfläche darunter NUR an den unteren Ecken: oben stösst sie
   an die Kopfzeile, und die Bibliothek quadriert sie dort absichtlich
   (border-top-*-radius: 0). Ein Kurzschreibweise-`border-radius` hier würde
   diese Null überschreiben und einen Spalt in die Blockkante reissen.
   ⚠️ `.pm__close-btn` braucht keine Zeile: die MD-Fassung setzt ihn ohnehin
   auf border-radius 0 und lädt nach der Bibliothek. */
body #cc-main .pm__section,
body #cc-main .pm__section--toggle,
body #cc-main .pm__section-title {
  border-radius: 4px;
}
body #cc-main .pm__section--toggle .pm__section-desc-wrapper {
  border-bottom-left-radius: 4px;
  border-bottom-right-radius: 4px;
}

/* ⚠️⚠️ DAS EIGENTLICHE HOVER-SIGNAL DER GRUPPENBLÖCKE. Ansage des Nutzers vom
   18.8.2026 ("schrift wird auf hover rot"). Es ist nicht Zierrat, sondern trägt
   den Zustand: der Wechsel der FLÄCHE (#E0E1E5 → #EEEDEB) misst nur 1,12:1 und
   wäre für sich genommen nicht wahrnehmbar — die Farbe der Schrift ist es, die
   den Block als anfassbar ausweist. Wer sie entfernt, muss die Flächentöne
   auseinanderziehen.
   ⚠️ --color-red-dark und nicht --color-red: gemessen auf #EEEDEB trägt
   #D85049 3,48:1, #ff6157 nur 2,53:1. 3,48 liegt unter 4,5 — es ist derselbe
   geerbte Sprung, den `a:hover` und `.legend-item label:hover .title` auf der
   ganzen Site machen, und gilt nur im Hover; im Ruhezustand steht der
   Gruppenname mit 7,57:1 in CI-Blau.
   ⚠️ `.no-touchevents` für den Zeiger, `:active` für Geräte ohne — dieselbe
   Paarung wie bei den übrigen Hover-Regeln dieser Datei. */
.no-touchevents body #cc-main .pm__section--toggle .pm__section-title:hover,
body #cc-main .pm__section--toggle .pm__section-title:active {
  color: var(--color-red-dark);
}

/* Die aufgeklappte Inhaltsfläche steht auf dem FENSTERGRUND, nicht auf dem
   Blockton — gefärbt ist nur die Kopfzeile.
   ⚠️ Seit dem Wechsel auf Weiss ist der Wert hier derselbe wie in der
   MD-Fassung. Die Regel bleibt trotzdem stehen: ohne sie zöge die Bibliothek
   den Blockton (jetzt rgba(blau,.25)) auch unter Beschreibung und
   Cookie-Tabelle, weil beide dieselbe Variable benutzen und sie im
   aufgeklappten Zustand umdefiniert wird. Gleicher Wert, anderer Grund. */
body #cc-main .pm__section--toggle .pm__section-desc-wrapper,
body #cc-main .pm__section--toggle .pm__section-desc {
  background: #ffffff;
}

/* Schliessknopf zeichengleich mit dem des Termin-Dialogs (45×45, \f00d) —
   Geometrie und Glyphe stehen schon in der MD-Fassung, hier nur die Farben,
   und zwar dieselbe Zeile wie oben bei `dialog.dialog-event … button.close`.

   🧪 VERSUCH 18.8.2026 — KNOPF INS FENSTER. Ansage des Nutzers: "kannst du den
   schliessen button runtersetzen. probier mal mit 1 rem top und 1 rem right".
   ⚠️ Die MD-Fassung setzt ihn ÜBER das Fenster (`top: -3.8125rem; right: 0`),
   nachgebaut nach dem Termin-Dialog, wo `.btn-close-container` mit
   margin-bottom:1rem über der weissen Karte steht. Gemessen war das der Grund,
   warum er auf kurzen Schirmen unerreichbar wurde: bei 1280x413 lag er auf
   `top: -28px`, also ausserhalb des Schirms. Innen liegend kann ihm das nicht
   mehr passieren.
   ⚠️ Rückweg: `top: -3.8125rem; right: 0` wiederherstellen — dann gehört auch
   `overflow: visible` an `.pm` wieder gebraucht, das die MD-Fassung eigens dafür
   setzt (sonst schnitte `.pm` den herausragenden Knopf ab). Solange er innen
   liegt, ist jenes `overflow: visible` wirkungslos, aber harmlos. */
body #cc-main .pm__close-btn,
body #cc-main .cm__close-btn {
  background: var(--color-blue);
  top: 1rem;
  right: 1rem;
}
.no-touchevents body #cc-main .pm__close-btn:hover,
.no-touchevents body #cc-main .cm__close-btn:hover,
body #cc-main .pm__close-btn:active,
body #cc-main .cm__close-btn:active {
  background: var(--color-red-dark);
}

/* Datenschutz-Link: Hover rot wie jeder Link der Site (`a:hover`).
   ⚠️ Die MD-Fassung nimmt hier ihr #2e92ff; ohne diese Regel bliebe der
   Link der einzige Ort im Fenster, der noch MD-blau aufleuchtet. */
body #cc-main .cc__link:hover {
  color: var(--color-red-dark);
}

/* ══════════════════════════════════════════════════════════════════════════
   ⚠️⚠️ ALLES BIS ZUM FOKUSRING IST SEIT 18.8.2026 WIRKUNGSLOS.
   Der Widerrufsreiter ist auf sprezu ausgeblendet — die Regel dazu steht am
   ENDE dieses Blocks (`body .md-consent-reiter { display: none }`) samt der
   rechtlichen Begründung. Die Gestaltungsregeln hier bleiben absichtlich
   stehen: sie sind der fertige Rückweg, falls der Reiter je wiederkommt, und
   tragen die Messwerte, die dafür nötig wären. Sie beschreiben also NICHT,
   was ein Besucher sieht.
   ⚠️ Wer den Reiter wieder einblenden will, ändert genau EINE Regel — die am
   Ende. Hier ist nichts anzufassen.
   ══════════════════════════════════════════════════════════════════════════ */
/* ── Widerrufsreiter (das Flag links unten am Rand) ──────────────────────────
   ⚠️ Grund und Weichzeichner bleiben, wie sie sind: der Reiter liegt über der
   SEITE, nicht im Fenster, und muss sich gegen beliebige Inhalte behaupten —
   der durchscheinende Schleier tut das auf hellen wie auf dunklen Flächen. Auf
   MD wurde genau das am 17.8.2026 ausdrücklich so entschieden. Hier wechselt
   deshalb nur die Akzentfarbe.
   ⚠️ Der Fokusring darf NICHT wegfallen — ohne ihn ist der Reiter mit der
   Tastatur unsichtbar. Er kommt jetzt aus den --focus-ring-* dieser Datei
   (2px CI-Blau), damit er derselbe Ring ist wie überall sonst auf der Site;
   der Versatz bleibt positiv, weil der Ring auf einem durchscheinenden Grund
   nach AUSSEN sichtbar ist und nach innen im Schleier verschwände. */
/* ⚠️ Symbol, Text und Rahmen in CI-Blau statt Weiss — Ansage des Nutzers vom
   18.8.2026, nachdem der Reiter auf dem hellen Seitengrund praktisch unsichtbar
   war (weisse Schrift auf 20 % Weiss über Creme).
   ⚠️ EINE Zeile genügt für Symbol UND Text: das Cookie-Zeichen steckt in
   `.md-consent-reiter::before` und setzt dort keine eigene Farbe, es erbt also
   `color` vom Reiter. Der Rahmen ist eine `outline: 1px solid #fff` aus der
   MD-Fassung — deshalb reicht `outline-color`, die 1px bleiben stehen.
   ⚠️ Der Schlagschatten ist WÖRTLICH der des Nach-oben-Knopfes
   (`.scroll-top`, weiter unten in dieser Datei: 0 0.25rem 0.75rem rgba(0,0,0,.2)) —
   Ansage des Nutzers vom 18.8.2026, damit der Reiter sich auch von einer blauen
   Sektion absetzt. Wer ihn dort ändert, sollte ihn hier mitziehen.
   ⚠️ Anders als bei .scroll-top ist das hier GEFAHRLOS: dessen Fokusring hängt
   selbst an `box-shadow` und musste den Schatten wiederholen, sonst verschwand
   er beim Fokussieren. Der Fokusring des Reiters ist eine `outline` — die beiden
   Eigenschaften stören sich nicht.

   ⚠️⚠️ DECKENDER GRUND STATT WEICHZEICHNER — Ansage des Nutzers vom 18.8.2026
   ("#FBF8F4 beim widerrufsreiter als hintergrund statt dem filter effekt").
   Damit ist das Problem gelöst, das ich einen Schritt vorher noch als offen
   melden musste: auf dem durchscheinenden 20-%-Weiss trug die blaue Schrift über
   einer BLAUEN Sektion nur 1,74:1 und war unlesbar. Der Grund des Reiters hing
   bis dahin davon ab, was zufällig hinter ihm lag.
   Jetzt hängt gar nichts mehr davon ab — gemessen und auf JEDEM Untergrund gleich:
       Ruhe   #17427f auf #FBF8F4 .......... 9,35:1
       Hover  #D85049 auf #FBF8F4 .......... 3,84:1  (geerbt, s. unten)
   ⚠️ `backdrop-filter` MUSS mit weg. Die MD-Fassung setzt ihn zusammen mit dem
   halbdurchsichtigen Grund; bliebe er stehen, zeichnete der Browser weiter den
   Hintergrund weich, ohne dass man es unter der deckenden Fläche je sähe — reine
   Rechenlast. Beide Schreibweisen zurücknehmen, auch die mit -webkit-.
   ⚠️⚠️ NUR AUF SPREZU. Auf MD wurde der durchscheinende Reiter am 17.8.2026
   ausdrücklich verteidigt ("das flag auf der Startseite links am rand unten soll
   wieder aussehen wie vorher"); diese Regeln stehen deshalb hier in custom_sprezu
   und nicht in der geteilten Datei. Die anderen ~23 Sites bleiben, wie sie sind. */
/* 🧪 VERSUCH 18.8.2026 — BLAUER REITER. Ansage des Nutzers: "testweise den
   widerrufsreiter auf blau, ohne kontur, weisses cookie icon und weisser text".
   Damit ist der Reiter der Zwilling von `.scroll-top` (dessen Schatten er schon
   trug): blaue Fläche, weisser Inhalt, kein Rahmen.
   ⚠️ Vorgängerfassung war hell — `background: var(--color-light)`,
   `color/outline-color: var(--color-blue)`. Zum Zurückdrehen genau diese drei
   Werte wiederherstellen und die drei Regeln unten mit.
   Gemessen: weiss auf #17427f = 9,90:1. */
body .md-consent-reiter {
  background: var(--color-blue);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  color: #ffffff;
  /* "ohne kontur": die MD-Fassung setzt `outline: 1px solid #fff`. Nur die
     FARBE zurückzunehmen genügt nicht, die Linie bliebe stehen — deshalb die
     ganze Eigenschaft. Der Fokusring ist davon unberührt, er sitzt in der
     :focus-visible-Regel unten und schlägt diese hier über die Spezifität. */
  outline: none;
  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.2);

  /* Luft unten und rechts, "wie oben" (Ansage des Nutzers 18.8.2026).
     ⚠️ "Wie oben" ist NICHT der padding-top-Wert. Am 18.8.2026 am Reiter
     nachgemessen (59 x 46 px):
         padding      30px / 6,4px / 1,6px / 6,4px
         Icon         absolut bei top: 8px, 18px gross -> belegt y 8..26
         sichtbar     8px ueber dem Icon · 4px Icon->Text · 2px unter dem Text
     Die 30px oben sind also der PLATZ FUER DAS ICON, nicht der Abstand. Der
     Abstand oben sind die 8px ueber dem Icon - und genau die stehen jetzt auch
     unten und rechts. Wer hier den 1.875rem-Wert einsetzt, macht den Reiter
     doppelt so hoch.
     ⚠️ Einzelne Kanten setzen, NICHT die Kurzschreibweise `padding`: die
     30px oben stammen aus der MD-Kurzschreibweise und wuerden sonst mit
     plattgemacht - dann sitzt das Icon auf dem Text.
     ⚠️ Links bleibt bei 6,4px. Der Reiter steht mit `left: 0` an der
     Schirmkante, dort ist die Luft ohnehin nicht zu sehen; der Text sitzt
     dadurch 1,6px aus der Mitte. Soll es mittig sein, kommt padding-left
     mit auf 0.5rem. */
  padding-right: 0.5rem;
  padding-bottom: 0.5rem;
}

/* ⚠️ DIESER KASTEN BESCHRIEB DEN HELLEN REITER und ist mit dem blauen Versuch
   vom 18.8.2026 überholt — er stand hier noch, während der Code darunter schon
   das Gegenteil tat. Zum Nachlesen, falls zurückgedreht wird, war sein Inhalt:
   im Hover wechselte die SCHRIFT auf #D85049 (Symbol, Text und Rahmen zusammen,
   das Cookie-Zeichen erbt `color`), der durchscheinende Grund blieb in jedem
   Zustand stehen, und Rot trug dort 3,88:1 über hellem bzw. 3,65:1 über cremem
   Seitengrund — über einer blauen Sektion nur 1,40, wo aber schon der
   Ruhezustand mit 1,74 unlesbar war. Genau das hat den blauen Versuch ausgelöst.
   Was jetzt gilt, steht in der Regel darunter. */
.no-touchevents body .md-consent-reiter:hover,
body .md-consent-reiter:active {
  /* 🧪 ZUM VERSUCH MIT UMGEDREHT: Grund wechselt, Schrift bleibt weiss.
     ⚠️⚠️ DAS KEHRT EINE FRÜHERE ANSAGE UM ("schrift soll rot werden, nicht der
     grund", 18.8.2026) — bewusst, weil sich die Voraussetzung geändert hat. Jene
     Ansage galt dem HELLEN Reiter, dort trug rote Schrift 3,84:1. Auf blauem
     Grund sind es nur noch 2,43:1 (#D85049 auf #17427f) und damit unlesbar.
     Rückweg: wird der Reiter wieder hell, gehört auch dieser Block zurück.
     Gewählt ist stattdessen das Verhalten von `.btn-blue-filled` und
     `.scroll-top`: blau → rot, Inhalt bleibt weiss (4,07:1).

     ⚠️⚠️ `color` MUSS hier wiederholt werden, auch wenn es den Ruhewert wiederholt.
     Genau davor warnt der Kasten an `.scroll-top` weiter unten in dieser Datei:
     ein nacktes `a:hover` bzw. jede Rot-Regel mit höherer Spezifität färbte die
     Schrift sonst rot auf rot. Dasselbe gilt für `background`: die geteilte
     MD-Datei setzt `.no-touchevents .md-consent-reiter:hover { background: #2e92ff }`
     — ohne eigene Zeile gewinnt sie und der Reiter wird im Hover MD-BLAU. */
  background: var(--color-red-dark);
  color: #ffffff;
  outline: none;
}
/* 🧪 Fokusring zum blauen Versuch — zeichengleich mit `.scroll-top:focus-visible`
   weiter unten, und zwar aus demselben gemessenen Grund.
   ⚠️⚠️ Auf der EIGENEN blauen Fläche ist die blaue `outline` unsichtbar (1,00:1).
   Sichtbar macht den Fokus das INNERE weisse Band aus --focus-ring-inner, das auf
   Blau mit 9,90:1 trägt. Die outline steht trotzdem dabei: die Zusage "outline
   immer mitsetzen" gilt lückenlos, weil --focus-ring-inner am :root aufgelöst wird
   und in Ausnahme-Containern sonst der falsche Ton durchfiele (Begründung am :root).
   ⚠️⚠️ DER SCHLAGSCHATTEN MUSS HIER WIEDERHOLT WERDEN. `box-shadow` wird als
   GANZES überschrieben — ohne die zweite Schicht verlöre der Reiter beim
   Fokussieren seinen Schatten und spränge sichtbar. Genau diese Falle ist an
   `.scroll-top` dokumentiert; wer den Schatten oben ändert, zieht ihn hier mit.
   ⚠️ Versatz jetzt negativ (--focus-ring-offset, -0.125rem) statt der früheren
   +0.125rem: der positive Versatz war für den DURCHSCHEINENDEN Reiter gedacht,
   bei dem der Ring nach aussen liegen musste. */
body .md-consent-reiter:focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
  box-shadow: var(--focus-ring-inner), 0 0.25rem 0.75rem rgba(0, 0, 0, 0.2);
}

/*
   ── DIE 2 EM STEHEN OBEN WIE UNTEN (18.8.2026) ───────────────────────────────
   Ansage des Nutzers: "im popup 2em nicht nur unten sondern auch oben".

   Gemessen am Einstellungsdialog, bevor etwas geändert wurde:
       Schirm 1280 x 713 ... Fenster 148px oben / 148px unten  (Inhalt passt)
       Schirm 1280 x 413 ... Fenster  16px oben /  16px unten  (am Anschlag)
       Schirm 1280 x 313 ... Fenster  16px oben /  16px unten
   Die Bibliothek deckelt mit `max-height: calc(100% - 2em)` und zentriert; die
   2 em (32px) wurden also auf BEIDE Kanten aufgeteilt, 16 px je Seite. Jetzt
   sind es 2 em je Seite, also `calc(100% - 4em)`.

   ⚠️⚠️ DAS LÖST DEN SCHLIESSKNOPF NICHT — gemessen, damit es niemand annimmt.
   Der Knopf sitzt ÜBER dem Fenster (`top: -3.8125rem`, MD-Fassung: 45px Knopf
   plus 16px Abstand) und braucht deshalb rund 61 px Luft nach oben. Am Anschlag
   lag er bei `top: -44px`, also ausserhalb des Schirms und unerreichbar. Mit
   2 em sind es 32 px - besser, aber immer noch zu wenig. Wer ihn dort erreichbar
   haben will, braucht ~4em oben ODER den Knopf INNERHALB des Fensters.
   Das ist eine Entscheidung, keine Reparatur, und deshalb hier nicht getroffen.
   ⚠️ Betrifft nur schmale/kurze Schirme. Auf 1280 x 713 lag der Knopf bei +88px
   und war nie in Gefahr.

   ⚠️ `max-height` und nicht `height`: die MD-Fassung hat die feste Höhe der
   Bibliothek bereits auf `height: auto` gestellt, damit das Fenster mit dem
   Inhalt wächst. Wer hier `height` setzt, holt das leere Feld unter der letzten
   Gruppe zurück, das dort einmal beseitigt wurde.
*/
body #cc-main .pm--box {
  max-height: calc(100% - 4em);
}

/*
   ⚠️⚠️ NACHTRAG 18.8.2026 — die 4em allein wirken NUR auf breiten Schirmen.
   Vom Nutzer gemeldet ("das 2 rem top wurde unten drunter gepackt und nicht nach
   oben") und nachgemessen; die Bibliothek positioniert nach Schirmbreite völlig
   verschieden:
       1280 x 713 ... top: 356,5px / bottom: -61,5px  -> rechnerisch zentriert,
                      die Höhenbegrenzung verteilt sich auf beide Kanten (148/148)
        500 x 715 ... inset: 0                        -> auf Vollbild gespannt;
                      `top: 0` gewinnt, die ganze Differenz fällt nach UNTEN (0/64)
   Auf schmalen Schirmen ist der Abstand oben deshalb keine Frage der Höhe,
   sondern der LAGE - er muss über `top` kommen.
   Umbruchpunkt ist der der Bibliothek: `@media screen and (max-width:640px)`
   setzt dort `bottom:0; left:0; right:0; top:0; max-height:100%`.
   ⚠️ Die Grenze bewusst gleich gewählt. Eine eigene Grenze daneben ergäbe einen
   Streifen, in dem weder die Zentrierung noch dieser Versatz gilt.
   ⚠️ `max-height` aus der Regel darüber greift trotzdem, obwohl die Bibliothek
   hier `max-height:100%` setzt: 1-1-1 schlägt 1-1-0, unabhängig vom Media-Block.
   Zusammen ergibt das 2em oben und 2em unten - gemessen 32/32 statt 0/64.
*/
@media screen and (max-width: 640px) {
  body #cc-main .pm {
    top: 2em;
  }
}

/*
   ── LUFT ÜBER "COOKIE-EINSTELLUNGEN" (18.8.2026) ─────────────────────────────
   Ansage des Nutzers: "im dialog kann oben ein 1rem über die 'cookie-einstellungen'
   damit die linie nicht mit dem schließenknopf kollidiert".

   Nachgemessen, die Kollision ist echt und schmalschirm-spezifisch:
       500 x 715 ... Header 60px hoch, Linie bei 61 · Knopf 17..62
                     -> der Knopf ragt 1px ÜBER die Linie hinaus
      1280 x 713 ... Header 63px hoch, Linie bei 64 · Knopf 17..62
                     -> 2px Luft, keine Kollision
   Ursache ist der Knopf, der seit heute INNEN sitzt (top: 1rem) und mit 45px
   Höhe bis 62 reicht - knapp unter einer 61px hohen Kopfzeile.

   ⚠️ Das `!important` ist hier NICHT Bequemlichkeit: die Bibliothek setzt im
   640er-Block `padding: .9em !important` an Header, Body und Fusszeile. Ohne
   Nachdruck fiele die Zeile dort wortlos aus - und genau dort ist die Kollision.
   ⚠️ NUR padding-top, nicht die Kurzschreibweise: die seitlichen und unteren
   Abstände stammen aus derselben Kurzform der Bibliothek und würden sonst
   mit plattgemacht.
*/
body #cc-main .pm__header {
  padding-top: 2rem;
}

@media screen and (max-width: 640px) {
  body #cc-main .pm__header {
    padding-top: calc(0.9em + 1rem) !important;
  }
}

/*
   ══ DER WIDERRUFSREITER IST AUF SPREZU AUS (18.8.2026) ═══════════════════════
   Ansage des Nutzers: "auf sprezu den reiter ausblenden". Der Widerruf läuft
   hier über den Fußzeilen-Eintrag "Cookie-Einstellungen"
   (custom_sprezu/Resources/Private/Page/Layouts/Default.html, nav.footer-nav).

   ⚠️⚠️ DIESE REGEL IST RECHTLICH TRAGEND, NICHT KOSMETIK. Sie darf nur bleiben,
   solange es den Fußzeilen-Eintrag gibt. Fällt beides weg, hat die Site KEINEN
   Weg mehr, eine erteilte Einwilligung zu ändern — Verstoß gegen
   Art. 7 Abs. 3 S. 4 DS-GVO.

   Maßstab, am 18.8.2026 an der Primärquelle geprüft (OH Digitale Dienste der
   DSK, Version 1.2, Kapitel III. 2. g), Rn. 62 — dorthin verweist Fußnote 63
   an der sonst zitierten Rn. 126): verlangt ist "ein stets sichtbarer
   Direktlink ODER ein Icon, das unmittelbar zu den relevanten
   Einstellungsmöglichkeiten führt". Ein Reiter ist also nicht vorgeschrieben;
   unzulässig ist der SUCHVORGANG als Zwischenschritt (erst die
   Datenschutzerklärung öffnen, dort zur richtigen Stelle scrollen).
   Der Fußzeilen-Link erfüllt beides: er steht im Seitenlayout und damit auf
   jeder Seite, und ein Klick öffnet den Dialog direkt — das Consent-Skript
   bindet auf `a[href$="#cookie-consent"]`, nimmt den Sprung mit
   preventDefault() zurück und ruft CookieConsent.showPreferences() auf.

   ⚠️⚠️ NUR AUF SPREZU. Die anderen ~23 Sites haben den Reiter aus der geteilten
   Extension und brauchen ihn auch: `#cookie-consent` steht in den Repo-Templates
   ausschliesslich in custom_sprezu. Wer diese Regel in die geteilte Datei
   verschiebt, nimmt allen anderen Sites den Widerrufsweg.

   ⚠️ Spezifität: die MD-Fassung setzt `.md-consent-reiter { display: flex }`
   (0-1-0), und die geteilte Datei lädt NACH dieser hier. `body` bringt die
   Regel auf 0-1-1 und gewinnt damit unabhängig von der Ladereihenfolge — das
   `body` ist nicht Zierde, es trägt.
   ⚠️ `display: none` und nicht `visibility`/`opacity`: ein nur durchsichtiger
   Knopf bliebe im Tabulator-Lauf stehen und wäre ein Ziel ohne Ziel.

   ⚠️ Das Skript ERZEUGT den Reiter weiterhin (widerrufsReiter() beim `load`,
   absichtlich sofort). Das ist kein Fehler und kostet nichts — ein <button>
   ohne Darstellung. Der Weg über CSS ist gewählt, weil das Skript geteilt ist
   und eine Änderung dort alle Sites träfe.

   ⚠️ Ersetzt die frühere Regel `html.show--consent .md-consent-reiter` (Reiter
   nur ausblenden, solange Banner oder Dialog offen sind). Die wird von dieser
   hier vollständig gedeckt. Ihr Messbefund bleibt für den Rückweg erhalten:
   der Reiter lag bei 1280 px unter dem Banner (Banner x 16..400 / y 216..613,
   Reiter x 0..59 / y 567..613, z-index 9999 gegen 100), nur 16 px schauten
   links hervor. ⚠️⚠️ Und die Zustandsklasse hängt am <html>, NICHT an
   `#cc-main` — am 18.8.2026 gemessen, weil der Kommentar in
   CookieConsentScript.js das Gegenteil behauptet. Der Code dort ist richtig
   (er prüft `document.documentElement`), nur der Kommentar irrt.
*/
body .md-consent-reiter {
  display: none;
}
/* END - Cookie-Consent */

/* START - Content-Block & Info-Box */
/* Fließtext-Absätze/Listen sowie hervorgehobene Hinweis-/Info-Boxen innerhalb von Textseiten. */
.content-block { margin-bottom: 48px; }
.content-block p {
  margin-bottom: 16px;
  font-size: 16px; line-height: 1.7;
}
.content-block ul, .content-block ol { margin: 16px 0 24px 24px; }
.content-block li { margin-bottom: 12px; line-height: 1.6; }
/* TYPO3-Pendant zum Content-Block: Fließtext aus Text-/Textmedia-Elementen
   liegt in ".ce-bodytext" (fluid_styled_content) statt ".content-block".
   Dieselben Absatz-/Listenregeln, damit Zeilenhöhe (1.7 statt 1.5) und
   Absatzabstände der statischen Vorlage entsprechen; ohne diese Regeln
   kleben aufeinanderfolgende Absätze ohne Abstand aneinander. */
.ce-bodytext p {
  margin-bottom: 1rem;
  font-size: 1rem; line-height: 1.7;
}
/* RTE-Textgrößen-Stile (stylesSet in custom_backend/.../RTE/Custom.yaml),
   passend zur Größenskala dieser CSS. Basis-Bodytext = 1rem.
   - "etwas kleiner"  → 0.875rem (14px)
   - "etwas grösser"  → 1.125rem (18px), eine Stufe über normal
   - "groß (wie H2)"  → gleiche Skala wie h2
   - "extragroß (wie H1)" → gleiche Skala wie h1 */
.ce-bodytext p.bodytext-smaller { font-size: 0.875rem; }
.ce-bodytext p.bodytext-larger { font-size: 1.125rem; }
.ce-bodytext p.bodytext-large {
  font-size: clamp(1.75rem, 4vw, 2.75rem);
  font-weight: 700;
  line-height: 1.2;
  margin-bottom: 1.5rem;
}
.ce-bodytext p.bodytext-extralarge {
  font-size: clamp(2.5rem, 6vw, 4rem);
  font-weight: 700;
  line-height: 1.1;
  margin-bottom: 1.5rem;
}
/* Textfarben (RTE-Formatierungen-Dropdown + Infopanel-Schriftfarbe). Reihenfolge
   überall gleich: light, cream, red, blue. "light"/"cream" für Text auf dunklem Grund. */
.text-light { color: var(--color-light); }
.text-cream { color: var(--color-cream); }
.text-red   { color: var(--color-red); }
.text-blue  { color: var(--color-blue); }
.ce-bodytext ul, .ce-bodytext ol { margin: 1rem 0 1.5rem 1.5rem; }
.ce-bodytext li { margin-bottom: 0.75rem; line-height: 1.6; }
.ce-bodytext > :last-child { margin-bottom: 0; }
.info-box {
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.12);
  border-left: 4px solid var(--color-blue);
  border-radius: 4px;
  padding: 28px 32px;
  margin-bottom: 24px;
}
.info-box h3 {
  font-size: 18px;
  margin-bottom: 16px;
  color: var(--color-blue);
}
.info-box p { margin-bottom: 12px; font-size: 16px; line-height: 1.7; }
.info-box p:last-child { margin-bottom: 0; }
.info-box ul { margin: 0; padding-left: 22px; }
.info-box li { margin-bottom: 10px; line-height: 1.6; font-size: 16px; }
.info-box li:last-child { margin-bottom: 0; }
.info-box-note {
  background: rgba(var(--color-red-rgb), 0.06);
  border-left-color: var(--color-red);
}
.info-box-note h3 { color: var(--color-red); }
/* END - Content-Block & Info-Box */

/* START - Hinweis-Box (Text/Textmedia, Feld tx_sprezu_box → Klasse "frame-box"
   + "frame-box--blue"/"--note", siehe Layouts/Default.html). Optik von der
   statischen ".info-box"/".info-box-note", angepasst auf die TYPO3-Frame-
   Struktur (header .title + .ce-bodytext). KEIN "main >"-Präfix: die Box kann
   auch in einer Gridelements-Spalte (grid-column) liegen, also NICHT direktes
   main-Kind sein. Die zusätzliche frame-type-Klasse (3 Klassen) überschreibt
   trotzdem sicher das Standard-Frame-Padding (main > .frame …, nur 0,2,1). */
.frame.frame-box.frame-type-text,
.frame.frame-box.frame-type-textmedia {
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.12);
  border-left: 4px solid var(--color-blue);
  border-radius: 4px;
  padding: 1.75rem 2rem;
}
.frame.frame-box header .title {
  font-size: 1.125rem;
  margin-bottom: 1rem;
  color: var(--color-blue);
}
.frame.frame-box .ce-bodytext > :last-child { margin-bottom: 0; }
/* Coral-Variante (Hinweis): rot getönter Grund, roter Strich + Headline. */
.frame.frame-box--note.frame-type-text,
.frame.frame-box--note.frame-type-textmedia {
  background: rgba(var(--color-red-rgb), 0.06);
  border-left-color: var(--color-red);
}
.frame.frame-box--note header .title { color: var(--color-red); }
/* END - Hinweis-Box */

/* START - Content-Element - zentriertes Bild */
/* Bilder in zentrierten fluid_styled_content-Elementen (Klasse .ce-center,
   z. B. textmedia/textpic/image mit Ausrichtung "Mitte") mittig ausrichten
   und mit Abstand nach unten versehen. display:block ist nötig, damit die
   automatischen Seitenränder (margin: 0 auto) beim standardmäßig inline
   dargestellten <img> überhaupt wirken. */
.ce-center img { display: block; margin: 0 auto 24px; }
/* Linksbündige Bilder (.ce-left) bekommen denselben unteren Abstand, bleiben
   aber links (kein auto-Zentrieren). */
.ce-left img { margin-bottom: 24px; }
/* END - Content-Element - zentriertes Bild */

/* START - Content-Element - Frame-Abstände */
/* Vertikaler Abstand zwischen gestapelten Inhaltselementen (Überschrift/
   Text+Medien). Das jeweils letzte Element in einer Rasterspalte bekommt
   keinen unteren Abstand, damit die Spalte/Box nicht unnötig hoch wird. */
.frame-type-header,
.frame-type-textmedia { margin-bottom: 24px; }
.grid-column > .frame-type-header:last-child,
.grid-column > .frame-type-textmedia:last-child { margin-bottom: 0; }
/* END - Content-Element - Frame-Abstände */

/* START - Content-Element - Trenner (CType "div") */
/* Trenner-Inhaltselement (frame-type-div → hr.ce-div) im Stil des kurzen,
   zentrierten Trenners der statischen Vorlage (vgl. .map-section::before):
   schmale, mittige Linie in Blau mit 20% Deckkraft. Standard-Rahmen des
   <hr> wird zurückgesetzt. */
.ce-div {
  border: 0;
  width: 120px;
  height: 1px;
  background: rgba(var(--color-blue-rgb), 0.2);
  margin: 32px auto;
}
/* END - Content-Element - Trenner (CType "div") */

/* START - Content-Element - Video (textmedia/textpic) */
/* ⚠️⚠️ DIESER BLOCK STEHT IN ZWEI DATEIEN UND SOLL WORTGLEICH BLEIBEN:
     .../custom_md2022/Resources/Public/Css/styles-plugins.css
     .../custom_sprezu/Resources/Public/Css/styles.css
   Sitespezifisch ist AUSSCHLIESSLICH der Stellschrauben-Block unten (Farben,
   Rundungen, Aussenabstand). Wer an den Regeln darunter etwas aendert, aendert
   es in BEIDEN Dateien.

   ZWEI ZUSTAENDE, beide muessen sitzen:
     vor dem Klick:  figure.video > .video-embed > a.video-shariff-play > img
     nach dem Klick: figure.video > .video-embed > iframe.video-embed-item
   Der iframe steckt bis dahin als JSON im data-video-Attribut des Links. Die
   aeussere Huelle .video-embed ist in beiden Faellen dieselbe, deshalb traegt
   sie das Seitenverhaeltnis.

   Verankert an figure.video, NICHT an .frame-type-textmedia: so greift der Block
   auch dort, wo das Video ueber das News-Partial Detail/MediaVideo.html kommt und
   kein frame-* darueber liegt. Die Spezifitaet reicht auf beiden Sites —
   figure.video .x ist 0-2-1 gegen 0-1-0 der Erweiterung, das gilt unabhaengig
   von der Ladereihenfolge der Stylesheets.

   ⚠️ Der Schleier wird bewusst NICHT uebersteuert: die Erweiterung bringt
   weiss 0.6 mit, und genau so soll er auf beiden Sites aussehen. */

/* ── Stellschrauben: das Einzige, was sich je Site unterscheiden darf ── */
figure.video {
  --video-icon:"\f167";                              /* YouTube; je Plattform unten ueberschrieben */
  --video-host:"YouTube (youtube-nocookie.com)";
  --video-icon-color:var(--color-red);                /* Hausfarbe Sprechen & Zuhoeren */
  --video-frame-bg:var(--color-blue);
  --video-frame-radius:4px;                           /* S&Z rundet ab */
  --video-band-bg:var(--color-blue);                  /* volle CI-Farbe, creme darauf = 9,35:1 */
  --video-band-bg-hover:var(--color-red-dark);        /* Hausregel blau→rot, s. Kasten unten */
  --video-band-color:var(--color-light);
  --video-band-radius:0.375rem;
  --video-figure-margin:0 0 3rem;                     /* 48px Abstand zum Folgetext */
}
/* Je weiterer Plattform genau EINE Zeile. Die Erweiterung legt die fertige
   iframe-Adresse als JSON ins data-video-Attribut, ein Teilstring-Selektor
   darauf ist deshalb verlaesslich. Gezaehlt am 10.8.2026: 170 YouTube, 3 Vimeo. */
figure.video a[data-video*="vimeo"] { --video-icon:"\f27d"; --video-host:"Vimeo (player.vimeo.com)"; }

/* ── ab hier auf beiden Sites wortgleich ── */
/* Kopfzeile ueber dem Hinweis — das Gegenstueck zum „Karte laden" der
   Kartenflaeche (md_events/…/listMap.css, .map-activate__title). Bis zum
   10.8.2026 hatte nur die Karte eine; das Video zeigte allein den langen Satz,
   und genau dieser Unterschied ist dem User aufgefallen. Die Zeile sagt in zwei
   Woertern, WAS der Klick tut, der Satz darunter, was dabei passiert.
   Als Variable, damit eine weitere Sorte genau EINE Zeile kostet, etwa
   figure.audio { --video-action:"Audio laden"; }
   ⚠️ Gehoert NICHT in den Stellschrauben-Block darueber: die Beschriftung ist auf
   allen Sites dieselbe, dort steht nur, was sich je Site unterscheiden darf. */
figure.video { --video-action:"Video laden"; margin:var(--video-figure-margin); }
figure.video .video-embed { position:relative; width:100%; aspect-ratio:16 / 9; overflow:hidden; border-radius:var(--video-frame-radius); background:var(--video-frame-bg); }
figure.video .video-embed-item { position:absolute; inset:0; width:100%; height:100%; border:0; }
/* Vorschau-Link den ganzen 16:9-Rahmen ausfuellen lassen; die Erweiterung setzt ihn
   nur auf position:relative ohne Masse. display:block am Bild nimmt zugleich die 6px
   Grundlinien-Luecke weg, die `a.video-shariff-play img { display:inline-block }`
   (0-1-2) erzeugt — die schlaegt ein `.ce-gallery img { display:block }` (0-1-1)
   trotz spaeterer Ladung. Am 10.8.2026 gemessen: Rahmen 241px, Bild 235px. */
figure.video .video-shariff-play { position:absolute; inset:0; }
figure.video .video-shariff-play img { display:block; width:100%; height:100%; object-fit:cover; }
/* Die Erweiterung setzt .video-shariff-preview ab 800px auf top:50% — das verschiebt
   nur die Oberkante, erst translateY(-50%) zentriert die Gruppe wirklich. */
figure.video .video-shariff-preview { top:50%; transform:translateY(-50%); }
/* Plattform-Logo als Font-Awesome-BRANDS-Glyphe. Die Logos bringen ihre Form selbst
   mit, es wird also kein Feld und kein Hintergrund mehr gebaut.
   ⚠️⚠️ „Brands" ist eine ANDERE Familie UND eine andere Staerke als „Free/Solid":
   'Font Awesome 6 Brands' mit font-weight:400. Mit 900 oder mit der Free-Familie
   bleibt ein leeres Kaestchen stehen.
   ⚠️ Die Erweiterung baut hier ein 0x0-Element aus Rahmenkanten (das schwarze
   Dreieck) und schiebt es ueber left:50% plus negative Raender zurecht —
   width/height/border/margin/left muessen deshalb ALLE zurueckgenommen werden.
   ⚠️ Die Glyphe ist EINFARBIG: der Play-Keil ist eine Aussparung, das Vorschaubild
   scheint dort durch. Ein weisser Keil ginge nur mit einem zweiten Element. */
figure.video .video-shariff-preview-icon { left:auto; margin:0 auto; width:auto; height:auto; border:0; background:none; display:flex; flex-wrap:wrap; align-items:center; justify-content:center; gap:0.625rem; color:var(--video-icon-color); font:inherit; }
figure.video .video-shariff-preview-icon::before { content:var(--video-icon); font-family:'Font Awesome 6 Brands'; font-weight:400; font-style:normal; font-size:3rem; line-height:1; }
/* Ziel des Klicks im Klartext neben dem Logo. Eigener deckender Grund (dieselben
   Werte wie das Hinweisband), damit der Text unabhaengig vom Motiv lesbar bleibt —
   freier Text auf dem Foto faellt sonst durch: sprezus Rot auf hellem Grund ergibt
   nur ~3:1, noetig sind 4,5:1.
   ⚠️ Der Wortlaut nennt Marke UND echten Host, weil beides auseinandergeht: geladen
   wird youtube-nocookie.com bzw. player.vimeo.com (mit dnt=1), NICHT youtube.com.
   Am 10.8.2026 im ausgelieferten data-video-Attribut nachgesehen.
   ⚠️ Fuer Vorlesesoftware ist per CSS erzeugter Text zweite Wahl. Der lange Hinweis
   im Band daneben ist echtes Markup und traegt die Aussage auch ohne dieses Feld. */
figure.video .video-shariff-preview-icon::after { content:var(--video-host); padding:0.25rem 0.5rem; border-radius:var(--video-band-radius); background:var(--video-band-bg); color:var(--video-band-color); font-size:0.8125rem; font-weight:700; line-height:1.3; }
/* Hinweistext auf ein eigenes Band statt frei auf dem Foto. top:0 hebt den
   3rem-Versatz der Erweiterung auf, der Abstand kommt jetzt ueber margin.
   ⚠️ margin-top ist 1rem, NICHT 1.4142rem: der Zuschlag in md_events/…/listMap.css
   war allein der Ausgleich fuer die dort frueher GEDREHTE Kartennadel. Hier wird
   nichts gedreht, also gibt es nichts auszugleichen.
   font-weight:700 ausgeschrieben, damit die Staerke nicht still kippt, falls die
   Erweiterung ihr `font-weight:bold` einmal aendert. */
figure.video .video-shariff-preview-text { top:0; width:auto; max-width:32rem; margin:1rem auto 0; padding:0.625rem 1rem; border-radius:var(--video-band-radius); background:var(--video-band-bg); color:var(--video-band-color); font-size:0.9375rem; line-height:1.45; font-weight:700; }
/* Die Kopfzeile wird aus dem Hinweistext heraus gesetzt: das Markup der
   Erweiterung kennt sie nicht, und video_shariff 3.1.0 liegt NUR auf dem Server,
   nicht im Repo — s. md_video_shariff_roh_html. Fett kommt vom Elternteil; der
   Hinweis darunter ist seit dem 10.8.2026 ebenfalls fett, deshalb trennt die
   beiden Zeilen nur noch der Abstand — dieselben 0.25rem wie zwischen
   .map-activate__title und .map-activate__hint auf der Karte.
   ⚠️ Fuer Vorlesesoftware ist per CSS erzeugter Text zweite Wahl, genau wie beim
   Anbieterband oben. Der echte Satz im Markup traegt die Aussage auch allein. */
figure.video .video-shariff-preview-text::before { content:var(--video-action); display:block; margin-bottom:0.25rem; font-size:1.125rem; line-height:1.3; }
/* Rueckmeldung beim Zeigen und bei Tastaturbedienung - dasselbe wie auf der Karte
   darunter und auf der Spendenflaeche (custom_forms/…/styles.css). Ergaenzt am
   12.8.2026; bis dahin reagierte hier NICHTS ausser dem Schleier der Erweiterung.
   ⚠️⚠️ ANDERER WERT ALS AUF md, UND DAS IST DER PUNKT. md springt #1271ee → #2e92ff,
   wird also HELLER. Hier gilt die HAUSREGEL: eine gefuellte blaue Flaeche wird beim
   Zeigen ROT. Am 12.8.2026 an allen 110 Hover-Deklarationen von sprezu ausgezaehlt -
   rund 56 gehen auf Rot, nur 29 auf Blau, und das Muster ist sauber: Text/Icons werden
   rot, ein GEFUELLTER blauer Knopf wird rot (.btn-blue-filled, Karten-Zoomknoepfe,
   Dialog-Schliessen), ein WEISSER/umrandeter Knopf wird blau gefuellt. Entscheidung des
   Users am 12.8.2026, nachdem ich zuerst „heller" gebaut hatte.
   ⚠️⚠️ MEIN ERSTER VERSUCH WAR 0.92 → volle Deckung, also DUNKLER - die einzige Stelle
   der Site, die das tat, und mit 17/14/10 Stufen kaum zu sehen. Der User hat es als
   „selber hover fehler" erkannt. Nicht wieder einbauen.
   ⚠️⚠️ KONTRAST, UND DAS IST DER PREIS: creme auf --color-red sind nur 2,79:1. Fuer eine
   reine Grafik waeren 3:1 gefordert, hier steht aber TEXT im Band (15px Hinweis), also
   4,5:1 - im Hover-Zustand deutlich verfehlt. Der Grundzustand bleibt mit 9,35:1 weit
   darueber. --color-red-dark kaeme auf 3,84:1 und ist laut Palettenkommentar sogar
   ausdruecklich „fuer Hover-Zustaende" gedacht; die Site benutzt trotzdem ueberwiegend
   --color-red. Wer umstellt, stellt ALLE DREI Flaechen zugleich um. */
figure.video .video-shariff-preview-text,
figure.video .video-shariff-preview-icon::after { transition:background-color 120ms ease-in-out; }
figure.video .video-shariff-play:hover .video-shariff-preview-text,
figure.video .video-shariff-play:hover .video-shariff-preview-icon::after,
figure.video .video-shariff-play:focus-visible .video-shariff-preview-text,
figure.video .video-shariff-play:focus-visible .video-shariff-preview-icon::after { background:var(--video-band-bg-hover); }
/* Fokusring: das normale System (Farbe aus --focus-ring-color, weisses Innenband).
   ⚠️⚠️ Bis 2026-08-13 stand hier ein EIGENER 3px-Ring in --color-blue aus der Zeit
   vor der Vereinheitlichung. Er mischte beide Systeme: die eigene blaue outline lag
   im 0-3px-Band, der globale :where()-Schatten legte darunter noch sein schwarz/
   weisses Band — vom weissen Innenband blieben dadurch nur 2px sichtbar.
   ⚠️ Der alte Kommentar begruendete das Blau mit einem "durch den 0.6-Schleier der
   Erweiterung immer aufgehellten Untergrund". Das ist hier NICHT so — nachgemessen
   am Aktivierplatzhalter: <a class="video-shariff-play"> ist selbst transparent und
   sitzt auf <div class="video-embed"> mit VOLLEM --color-blue (23,66,127), ohne
   Hintergrundbild und ohne opacity. Das farbige Band liegt dort also blau auf blau
   (1,00) und traegt nichts; sichtbar macht den Ring das WEISSE Band mit 9,90:1.
   Das ist genau der oben als harmlos beschriebene Fall (blaue Flaeche ohne helle
   Kinder) — deshalb KEIN Eintrag in der Ausnahmeliste, sondern die Normalregel. */
figure.video .video-shariff-play:focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
  box-shadow: var(--focus-ring-inner);
}
/* END - Content-Element - Video (textmedia/textpic) */

/* ⚠️⚠️ 17.8.2026: HIER STAND DER SPREZU-BLOCK DER KARTEN-AKTIVIERFLAECHE.
   Er setzte --map-band-bg / --map-band-bg-hover / --map-band-color / --map-band-radius
   und --map-focus-ring auf die S&Z-Farben, weil die Grundfassung in
   md_events/Resources/Public/Css/listMap.css die Farben von mehr-demokratie.de traegt.

   Ersatzlos entfallen: die Aktivierflaeche gibt es nicht mehr. MapTiler ist aus
   md_events ausgebaut, damit faellt der Grund fuer den Klick weg (dort zaehlte jeder
   GESTARTETE Kartenaufbau als "Session"), und die Karte wird auch im Cookie-Banner nicht
   mehr abgefragt - Ansage des Users, mit der Geschaeftsfuehrung abgestimmt. Geblieben ist
   in listMap.css ein .map-placeholder mit dem Standbild, das keine Farben braucht.
   Die Stellschrauben --map-* existieren nicht mehr; dieser Block waere wirkungslos.

   ⚠️ NICHT als "fehlende Angleichung" wieder einbauen. Der VIDEO-Block oben bleibt
   unveraendert - dort ist die Einwilligung weiterhin noetig, und die drei Flaechen
   Video / Karte / Spenden sind seit heute NICHT mehr dasselbe Muster.

   ⚠️ Die Lehre aus dem Block bleibt gueltig, falls hier je wieder etwas hinkommt: das
   fuehrende `body` war PFLICHT. Die Grundregel in listMap.css hatte dieselbe Spezifitaet
   (1-3-0), und bei Gleichstand entscheidet die Reihenfolge im Dokument - am 10.8.2026 am
   ausgelieferten dev-HTML gezaehlt stand custom_sprezu/styles.css an Position 9,
   md_events/listMap.css an Position 10. Ohne `body` (1-3-1) waere der Block wirkungslos
   gewesen, ohne dass man es dem Code ansieht. Eine Klasse am <html> oder <body> gibt es
   auf sprezu als Anker NICHT - beide Tags sind dort attributfrei. */

/* START - Spendenformular - Aktivierflaeche (Klick-zum-Laden) */
/* Die dritte Einwilligungsflaeche neben Video und Karte, gebaut nach demselben Muster
   (custom_forms/Resources/Public/Css/styles.css, .donate-activate). Sie lag bisher ohne
   eigenen Block hier und lief damit in den Grundfarben von mehr-demokratie.de — also
   deckendes #1271ee mit weisser Schrift, mitten in einer Site, die weder dieses Blau
   noch eckige Baender kennt. Aufgefallen ist es nicht, weil der Zwei-Klick-Schalter fuers
   Spendenformular am 11.8.2026 AUS gestellt wurde und die Flaeche derzeit nirgends
   erscheint. Sie ist damit vorbereitet, nicht sichtbar geprueft.
   ⚠️ --donate-icon-color und --donate-focus-ring brauchen KEINE Zeile: beide sind in
   custom_forms als var(--color-red, …) bzw. var(--color-blue, …) geschrieben und finden
   die S&Z-Werte von allein. Nur die Baender tragen dort feste Hex-Werte.
   ⚠️ Kein fuehrendes `body` noetig, anders als beim Kartenblock oben — und der Grund ist
   ein anderer, als man erwartet: custom_forms setzt die Stellschrauben auf `.donate-embed`
   (0-1-0), hier stehen sie auf `.donate-embed .donate-activate` (0-2-0). Das gewinnt aus
   SPEZIFITAET, nicht aus Reihenfolge, und ist damit unabhaengig davon, wo custom_forms
   im includeCSS steht. Nachgesehen am 12.8.2026 — beim Kartenblock oben liegt genau
   deshalb ein `body` davor, weil dort Gleichstand herrscht und die Reihenfolge GEGEN uns
   ist. Wer diesen Block auf `.donate-embed` umschreibt, verliert den Vorsprung still. */
.donate-embed .donate-activate {
  /* Volle CI-Farbe als Grund, ROT beim Zeigen — dieselbe Hausregel wie bei Video und
     Karte, die drei gehören zusammen. Zahlen im Video-Block weiter oben. */
  --donate-band-bg: var(--color-blue);
  --donate-band-bg-hover: var(--color-red-dark);
  --donate-band-color: var(--color-light);
  --donate-band-radius: 0.375rem;
}
/* END - Spendenformular - Aktivierflaeche */

/* START - Highlight-Tile */
/* Generische Highlight-/Download-Karte mit Thumbnail (z. B. für PDFs wie
   Leitfaden/Forschungsbericht, aber bewusst generisch benannt). Markup:
   CType sprezu_highlight_tile, Template HighlightTile.html. */
/* ⚠️ Rahmen am 12.8.2026 von 0.12 auf 0.25 verstärkt. Der Nutzer meldete an der
   Karte auf einem BLAUEN Panel „hier gibt es sogar keine Kontur". Gemessen ist
   der Rahmen aber in beiden Umgebungen derselbe: rgba() wird über den EIGENEN
   cremefarbenen Kartengrund gerechnet, nicht über die Seite. Mit 0.12 ergab das
   1,23:1 zur Karte — unter den rund 1,5:1, ab denen eine 1px-Linie überhaupt als
   Kontur gelesen wird. Auf cremefarbenem Seitengrund fiel das nicht auf, weil
   die Linie dort die einzige Kante ist; neben einem blauen Panel steht sie gegen
   die viel stärkere Kante Creme/Blau und verschwindet. 0.25 ergibt 1,56:1.
   ⚠️ Nicht weiter hochdrehen: der Hover-Rahmen --color-red-dark liegt bei 3,84:1
   und muss deutlich über dem Ruhezustand bleiben, sonst verliert er seine Wirkung. */
.highlight-tile {
  display: flex;
  gap: 1.5rem;
  align-items: center;
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.25);
  border-radius: 4px;
  padding: 1.25rem;
  margin-top: 1.5rem;
  text-decoration: none;
  color: var(--color-blue);
  transition: all 0.2s;
}
.highlight-tile:active {
  border-color: var(--color-red-dark);
  box-shadow: 0 12px 28px rgba(var(--color-blue-rgb), 0.1);
}
/* Auf Berührgeräten ist :active die einzige Rückmeldung — die CTA-Zeile muss
   dort dasselbe tun wie beim Zeigen, sonst bliebe sie auf dem Handy blau. */
.highlight-tile:active .highlight-tile-cta {
  color: var(--color-red-dark);
  opacity: 1;
}

@media (hover: hover) {

  .highlight-tile:hover {
  border-color: var(--color-red-dark);
  box-shadow: 0 12px 28px rgba(var(--color-blue-rgb), 0.1);
}
  /* ⚠️⚠️ Die CTA-Zeile war die EINZIGE, die beim Zeigen blau blieb — und zwar
     unbeabsichtigt. Das Label ist ohnehin immer rot, und der Titel hat gar keine
     eigene Farbe: er erbt vom <a>, wo beim Zeigen das generische a:hover greift,
     also rot. Nur .highlight-tile-cta setzt ein eigenes Blau (0-1-0) und schlägt
     damit die Vererbung. Ergebnis war eine halb rote Karte. Seit 12.8.2026
     zieht die Zeile mit.
     ⚠️⚠️ opacity MUSS auf 1: mit den 0.75 der Grundfassung fiele rot-dunkel auf
     2,74:1 und wäre schlechter als jeder andere Hover der Site. Bei voller
     Deckung sind es 3,84:1 — derselbe Wert wie überall. Am 12.8.2026 gerechnet,
     Grundzustand blau bei 0.75 liegt bei 4,79:1. */
  .highlight-tile:hover .highlight-tile-cta {
    color: var(--color-red-dark);
    opacity: 1;
  }

}
.highlight-tile-thumb {
  width: 88px;
  flex-shrink: 0;
  border-radius: 3px;
  box-shadow: 0 4px 14px rgba(var(--color-blue-rgb), 0.25);
}
.highlight-tile-info {
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
  min-width: 0; /* erlaubt dem Flex-Kind zu schrumpfen -> Label/Titel brechen statt zu überlaufen */
}
.highlight-tile-label {
  font-size: 0.875rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--color-red);
}
.highlight-tile-title {
  font-size: 1.0625rem;
  font-weight: 700;
  line-height: 1.35;
}
.highlight-tile-cta {
  font-size: 0.875rem;
  color: var(--color-blue);
  opacity: 0.75;
}
/* Auf schmalen Viewports Thumbnail über den Text stapeln, damit Label/Titel/CTA
   die volle Breite bekommen und nicht mitten im Wort umbrechen (siehe Projekt-
   Accordion in der schmalen Rasterspalte). */
@media (max-width: 480px) {
  .highlight-tile { flex-direction: column; align-items: flex-start; gap: 1rem; }
  .highlight-tile-thumb { width: 72px; }
}
/* Tablet-Bereich: dort ist project-columns 2-spaltig (ab 768px), die Bericht-
   Karte also nur halb so breit -> Thumb über den Text stapeln, damit Label/Titel/
   CTA die volle Spaltenbreite bekommen. Nur im Projekt-Accordion. */
@media (min-width: 768px) and (max-width: 1023px) {
  .project .highlight-tile { flex-direction: column; align-items: flex-start; gap: 1rem; }
}
/* END - Highlight-Tile */

/* START - Steps (nummerierte Schritte) */
/* Nummerierte Schritt-für-Schritt-Erklärung (z. B. "Drei Wege für Ihre Kommune"). */
.steps {
  display: grid;
  grid-template-columns: 1fr;
  gap: 32px;
  margin: 48px 0;
}
.step { position: relative; padding-top: 48px; }
.step-number {
  position: absolute; top: 0; left: 0;
  font-size: 60px; font-weight: 800;
  color: var(--color-red); line-height: 0.8;
  font-family: Georgia, serif;
}
.step h3 { margin-bottom: 12px; padding-top: 8px; }
@media (min-width: 768px) {
  .steps { grid-template-columns: repeat(3, 1fr); }
}
/* END - Steps (nummerierte Schritte) */

/* START - Projekt-Karten */
/* Kartengrid für laufende/abgeschlossene Projekte inkl. farbig alternierender Hintergründe und Region-Pille. */
.project-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 24px;
  margin-top: 48px;
}
.project {
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.1);
  border-radius: 4px;
  padding: 32px;
}
.project:nth-child(4n+1),
.project:nth-child(4n) {
  background: linear-gradient(135deg, var(--color-blue-secondary), var(--color-blue));
  border-color: transparent;
  color: var(--color-light);
}
.project:nth-child(4n+2),
.project:nth-child(4n+3) {
  background: linear-gradient(135deg, var(--color-red), var(--color-red-dark));
  border-color: transparent;
  color: var(--color-light);
}
.project:nth-child(odd) {
  background: linear-gradient(135deg, var(--color-blue-secondary), var(--color-blue)) !important;
}
.project:nth-child(even) {
  background: linear-gradient(135deg, var(--color-red), var(--color-red-dark)) !important;
}
.project:nth-child(4n+1) .project-region,
.project:nth-child(4n) .project-region,
.project:nth-child(4n+2) .project-region,
.project:nth-child(4n+3) .project-region {
  background: rgba(var(--color-light-rgb), 0.18);
  color: var(--color-light);
}
.project:nth-child(4n+1) h3,
.project:nth-child(4n) h3,
.project:nth-child(4n+2) h3,
.project:nth-child(4n+3) h3 {
  color: var(--color-light);
}
.project:nth-child(4n+1) p,
.project:nth-child(4n) p,
.project:nth-child(4n+2) p,
.project:nth-child(4n+3) p {
  color: rgba(var(--color-light-rgb), 0.92);
}
.project:nth-child(4n+1) em,
.project:nth-child(4n) em,
.project:nth-child(4n+2) em,
.project:nth-child(4n+3) em {
  color: var(--color-light);
  font-weight: 700;
  font-style: normal;
}
.project-region {
  display: inline-block;
  background: var(--color-blue); color: var(--color-light);
  padding: 4px 12px;
  font-size: 0.875rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.1em;
  border-radius: 8px;
  margin-bottom: 12px;
}
.project h3 { margin-bottom: 12px; }
.project p { font-size: 16px; line-height: 1.6; margin-bottom: 12px; }
.project p:last-child { margin-bottom: 0; }
.project-grid-full {
  grid-column: 1 / -1;
}
.project .project-toggle-heading { margin-bottom: 0; }
.project-toggle {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  width: 100%;
  background: none;
  border: none;
  padding: 0;
  margin: 0;
  cursor: pointer;
  text-align: left;
  font: inherit;
  color: inherit;
}
.project-toggle-text { display: block; flex: 1; }
.project-toggle-title {
  display: block;
  font-size: 24px;
  font-weight: 800;
  line-height: 1.1;
  letter-spacing: -0.02em;
}
/* ⚠️ Am 12.8.2026 auf 0.15/0.28 angeglichen (war 0.18/0.3). Es gibt DREI
   baugleiche Toggles auf farbigen Panels — .info-panel-toggle-icon,
   .thesis-toggle-icon und diesen hier: alle 32x32, Radius 8, creme-Schleier.
   Zwei davon standen auf 0.15/0.28, dieser als einziger daneben. Kein sichtbarer
   Unterschied, aber drei Werte für dieselbe Sache laden zum Auseinanderdriften ein.
   ⚠️ Das ist die Hausregel für BEDIENELEMENTE AUF FARBIGEM GRUND: aufhellen statt
   umfärben. Rot ginge hier nicht — auf coralem Panel wäre es unsichtbar.
   Nachgerechnet am 12.8.2026: der Schritt 0.15 -> 0.28 bewegt sich auf blauem
   Panel um 30, auf coralem um 20 Stufen von 255, ist also auf beiden deutlich zu
   sehen. Wer die Werte ändert, ändert alle drei. */
.project-toggle-icon {
  flex-shrink: 0;
  width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 8px;
  background: rgba(var(--color-light-rgb), 0.15);
  transition: transform 0.2s ease, background 0.2s ease;
}
@media (hover: hover) {

  .project-toggle:hover .project-toggle-icon {
  background: rgba(var(--color-light-rgb), 0.28);
}

}
.project.project-open .project-toggle-icon { transform: rotate(180deg); }
.project-body { display: none; margin-top: 24px; }
.project.project-open .project-body { display: block; }
/* Links im RTE-Text der Karte: die Grundregel `a { color: var(--color-blue) }`
   ist auf dem blauen/roten Kartenverlauf unlesbar, also weiss mit gedämpfter
   Unterstreichung. .highlight-tile ist ausgenommen — die Bericht-Karte steht
   auf hellem Grund und behält ihr Blau. */
.project-body a:not(.highlight-tile) {
  color: var(--color-light);
  text-decoration-color: rgba(var(--color-light-rgb), 0.6);
}
@media (hover: hover) {

  .project-body a:not(.highlight-tile):hover {
  text-decoration-color: currentColor;
}

}
.project-columns {
  display: grid;
  grid-template-columns: 1fr;
  gap: 24px;
  margin-bottom: 24px;
}
@media (min-width: 768px) {
  .project-columns { grid-template-columns: 1fr 1fr; }
}
.project-group + .project-group { margin-top: 64px; }
.project-group-title {
  padding-top: 8px;
  padding-bottom: 16px;
  margin-bottom: 0;
  border-bottom: 1px solid rgba(var(--color-blue-rgb), 0.15);
}
/* END - Projekt-Karten */

/* START - Regionalgruppen-Tabelle */
/* Tabellarische Liste der Regionalgruppen: Titel (verlinkt) + Kurzbeschreibung + E-Mail. */
.region-table-wrap {
  margin-top: 32px;
  overflow-x: auto;
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.12);
  border-radius: 4px;
}
.region-table {
  width: 100%;
  border-collapse: collapse;
}
.region-table th {
  text-align: left;
  padding: 14px 20px;
  font-size: 0.75rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--color-blue);
  background: rgba(var(--color-blue-rgb), 0.05);
  border-bottom: 1px solid rgba(var(--color-blue-rgb), 0.12);
}
.region-table td {
  padding: 14px 20px;
  font-size: 0.875rem;
  border-bottom: 1px solid rgba(var(--color-blue-rgb), 0.08);
  vertical-align: middle;
}
.region-table tbody tr:last-child td { border-bottom: none; }
.region-table tbody tr:nth-child(even) { background: rgba(var(--color-blue-rgb), 0.03); }
.region-table tbody tr:active { background: rgba(var(--color-blue-rgb), 0.06); }

@media (hover: hover) {

  .region-table tbody tr:hover { background: rgba(var(--color-blue-rgb), 0.06); }

}
.region-table td.td-titel { white-space: nowrap; }
.region-table td.td-titel a { font-size: 16px; font-weight: 700; }
/* END - Regionalgruppen-Tabelle */

/* START - Content-Tabellen (RTE: <table class="contenttable">) im S&Z-Design,
   optisch wie die statische .region-table. TYPO3-RTE rendert KEINE <thead>/<th>
   und keine data-label → erste <tr> = Kopfzeile, erste Spalte = Titel.
   Desktop: Cream-Card mit Kopfzeile/Zebra; Mobil: Kopf ausblenden, Zellen
   gestapelt (untereinander) als Karten. */
.contenttable {
  width: 100%;
  /* separate statt collapse, damit border-radius + overflow die Ecken clippen */
  border-collapse: separate;
  border-spacing: 0;
  margin: 2rem 0 0;
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.12);
  border-radius: 4px;
  overflow: hidden;
}
/* Kopfzeile: echtes <th>/<thead> ODER die erste Zeile (fett gesetzte Zellen) */
.contenttable thead th,
.contenttable tr:first-child td {
  text-align: left;
  padding: 14px 20px;
  font-size: 0.75rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--color-blue);
  background: rgba(var(--color-blue-rgb), 0.05);
  border-bottom: 1px solid rgba(var(--color-blue-rgb), 0.12);
}
.contenttable td {
  padding: 14px 20px;
  font-size: 0.875rem;
  border-bottom: 1px solid rgba(var(--color-blue-rgb), 0.08);
  vertical-align: middle;
}
.contenttable tr:last-child td { border-bottom: none; }
/* Zebra für Datenzeilen (Kopfzeile = tr:first-child bleibt ausgenommen) */
.contenttable tr:nth-child(2n) { background: rgba(var(--color-blue-rgb), 0.03); }
@media (hover: hover) {
  .contenttable tr:not(:first-child):hover { background: rgba(var(--color-blue-rgb), 0.06); }
}
/* erste Spalte = verlinkter Titel: kräftig, einzeilig */
.contenttable td:first-child { white-space: nowrap; }
.contenttable td:first-child a { font-size: 1rem; font-weight: 700; }
@media (max-width: 767px) {
  /* Zellen gestapelt; Kopfzeile weg (ohne data-label keine sinnvollen Labels) */
  .contenttable,
  .contenttable tbody,
  .contenttable tr,
  .contenttable td { display: block; width: 100%; }
  .contenttable tr:first-child { display: none; }
  .contenttable tr { padding: 16px 20px; border-bottom: 1px solid rgba(var(--color-blue-rgb), 0.08); background: transparent; }
  .contenttable tr:last-child { border-bottom: none; }
  .contenttable td { padding: 2px 0; border: none; font-size: 0.9375rem; white-space: normal; }
  .contenttable td:first-child { margin-bottom: 2px; }
  .contenttable td:first-child a { font-size: 1.0625rem; }
}
/* END - Content-Tabellen */

/* START - Team-Grid */
/* Kachelraster für Team-/Regionalgruppen-Mitglieder mit Initialen-Avatar. */
.team-group + .team-group { margin-top: 64px; }
.team-group-title {
  padding-top: 8px;
  padding-bottom: 16px;
  margin-bottom: 0;
  border-bottom: 1px solid rgba(var(--color-blue-rgb), 0.15);
}
.team-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 32px;
  margin-top: 48px;
}
.team-member { text-align: center; margin-bottom: 1.5rem; }
.team-avatar {
  width: 140px; height: 140px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--color-blue), var(--color-blue-secondary));
  margin: 0 auto 16px;
  display: flex; align-items: center; justify-content: center;
  font-size: 36px; font-weight: 800;
  color: var(--color-light);
}
.team-member h4 { margin-bottom: 4px; }
.team-member-role {
  font-size: 0.875rem;
  color: rgba(var(--color-blue-rgb), 0.7);
  margin-bottom: 12px;
}
@media (min-width: 768px) {
  .team-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1024px) {
  .team-grid { grid-template-columns: repeat(3, 1fr); }
}
/* END - Team-Grid */

/* START - Person-Panels (CType sprezu_personpanels; Personen-Raster wie die
   statische .team-grid: Titel/Funktion, Avatar mit Bild ODER Initialen aus dem
   Namen, Name, Kontakt-Link. 1 Spalte mobil, 2 ab 768px, 3 ab 1024px. Werte
   aus .team-*, damit die Optik der Team-Seite entspricht. */
.person-panels {
  display: grid;
  grid-template-columns: 1fr;
  /* mehr Luft zwischen den Personen-Reihen (vertikal); Spaltenabstand bleibt 2rem */
  gap: 3.5rem 2rem;
}
.person-panel { text-align: center; }
.person-role {
  font-size: 0.875rem;
  color: rgba(var(--color-blue-rgb), 0.7);
  margin-bottom: 12px;
}
.person-avatar {
  width: 140px; height: 140px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--color-blue), var(--color-blue-secondary));
  margin: 0 auto 16px;
  display: flex; align-items: center; justify-content: center;
  font-size: 36px; font-weight: 800;
  color: var(--color-light);
  overflow: hidden;
}
.person-avatar img { width: 100%; height: 100%; object-fit: cover; }
.person-name { margin-bottom: 4px; }
.person-contact { font-size: 0.875rem; color: var(--color-blue); text-decoration: underline; text-underline-offset: 3px; }
/* Ganzes Panel als Mailto-Link (person-panel--link): Link-Reset, die Farben der
   Kinder bleiben; "Kontakt" sieht wie ein Link aus, Hover färbt es rot. */
a.person-panel { display: block; color: inherit; text-decoration: none; }
@media (hover: hover) {
  a.person-panel:hover .person-contact { color: var(--color-red-dark); }
}
@media (min-width: 768px) {
  .person-panels { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1024px) {
  .person-panels { grid-template-columns: repeat(3, 1fr); }
}
/* END - Person-Panels */

/* START - Medien-Sprungmarken */
/* Sticky Filterleiste mit Sprungmarken-Buttons oberhalb der Medienliste. */
.media-jumpnav-wrap {
  position: sticky;
  top: 92px;
  z-index: 50;
  background: rgba(var(--color-light-rgb), 0.95);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid rgba(var(--color-blue-rgb), 0.1);
  /* Full-bleed wie die statische Vorlage: Band + Trennlinie laufen über die
     volle Viewport-Breite, der Inhalt bleibt an der Frame-Content-Kante
     (padding-inline stellt sie wieder her). 100vw schließt die vertikale
     Scrollbar ein → sonst ~8-17px horizontaler Überstand. Deshalb je Seite die
     halbe Scrollbar-Breite abziehen (--scrollbar-width wird von nav.js gesetzt;
     Fallback 0px = altes Verhalten, das html{overflow-x:hidden} unten kappt). */
  margin-left: calc(50% - 50vw + var(--scrollbar-width, 0px) / 2);
  margin-right: calc(50% - 50vw + var(--scrollbar-width, 0px) / 2);
  padding: 16px calc(50vw - 50% - var(--scrollbar-width, 0px) / 2);
  /* Abstand zur ersten Gruppen-Überschrift (statisch übernahm das die
     nachfolgende Section mit eigenem Padding). */
  margin-bottom: 4rem;
}
/* Direkt nach einem Hero dockt das Band wie in der statischen Vorlage ohne
   Abstand an dessen Unterkante an. (.frame doppelt für die nötige Spezifität
   gegen die später folgende Frame-Basisregel "main > .frame:not(...)".) */
main > .frame-type-sprezu_hero + .frame.frame-type-sprezu_medialist { margin-top: 0; }
.media-jumpnav {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}
.media-jumpnav-link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 9px 18px;
  border-radius: 999px;
  background: rgba(var(--color-blue-rgb), 0.06);
  color: var(--color-blue);
  font-size: 0.875rem;
  font-weight: 700;
  text-decoration: none;
  transition: all 0.2s;
  flex-shrink: 0;
}
.media-jumpnav-link i {
  font-size: 13px;
  opacity: 0.7;
}
/* ⚠️ Schrift wird beim Zeigen ROT (12.8.2026, Entscheidung des Users). Vorher
   vertiefte sich nur die Tönung von 0.06 auf 0.12 und die Schrift blieb blau —
   dieselbe Bauart wie die Events-Filterleiste, die schon immer rot wurde. Die
   Tönung bleibt zusätzlich erhalten, das ist das zweite Signal.
   ⚠️ Die AKTIVE Pille (.media-jumpnav-link.active, blau gefüllt) bekommt bewusst
   KEINEN Hover: man ist dort bereits. Beim Ansichtswechsler steht aus demselben
   Grund cursor:default. Nicht als fehlend „ergänzen". */
.media-jumpnav-link:active {
  background: rgba(var(--color-blue-rgb), 0.12);
  color: var(--color-red-dark);
}

@media (hover: hover) {

  .media-jumpnav-link:hover {
  background: rgba(var(--color-blue-rgb), 0.12);
  color: var(--color-red-dark);
}

}
.media-jumpnav-link.active {
  background: var(--color-blue);
  color: var(--color-light);
}
.media-jumpnav-link.active i {
  opacity: 1;
}
@media (min-width: 768px) {
  .media-jumpnav-wrap { top: 76px; }
  .media-jumpnav-link { flex-shrink: 1; }
}
/* END - Medien-Sprungmarken */

/* START - Medien-Einträge */
/* Einzelne Einträge der Presse-/Medienliste (Listenansicht, nicht die Kachelvariante). */
.media-item {
  border-bottom: 1px solid rgba(var(--color-blue-rgb), 0.15);
  padding: 24px 0;
}
.media-item:last-child { border-bottom: none; }
.media-meta {
  font-size: 0.875rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.1em;
  color: var(--color-red);
  margin-bottom: 8px;
}
.media-item h4 { font-size: 20px; margin-bottom: 8px; }
.media-item a { font-size: 0.875rem; }
/* Kennzeichnung externer Links (manuelle Einträge mit externer URL): kleines
   FontAwesome-Icon vor dem Link-Text. */
.media-extlink-icon { margin-right: 0.5em; font-size: 0.85em; }
/* Abstand zwischen den Kategorie-Gruppen des CType sprezu_medialist (ersetzt
   das inline "margin-top: 64px" der statischen medien.html). */
.media-group + .media-group h2 { margin-top: 4rem; }
/* Einklapp-Logik "Alle anzeigen": Einträge über dem Sichtbarkeits-Limit
   (Element-Feld, Default 5) sind versteckt; der Button (Outline-Pille) blendet
   sie per JS ein (showAllMedia in media-jumpnav.js) und entfernt sich selbst. */
.media-item--collapsed { display: none; }
.media-showall {
  display: inline-block;
  margin-top: 1rem;
  background: none;
  border: 1px solid rgba(var(--color-blue-rgb), 0.3);
  border-radius: 999px;
  padding: 0.5rem 1.25rem;
  font: inherit;
  font-size: 0.875rem;
  font-weight: 700;
  color: var(--color-blue);
  cursor: pointer;
  transition: border-color 0.2s ease, color 0.2s ease;
}
@media (hover: hover) {
  .media-showall:hover { border-color: var(--color-red-dark); color: var(--color-red-dark); }
}
.media-showall:active { border-color: var(--color-red-dark); color: var(--color-red-dark); }

/* START - News-Detail (Einzelansicht, Templates/News/Detail.html) */
/* Seiten OHNE Hero (News-Einzelansicht & Co.) beginnen direkt unter der fixen
   Nav (92px, mobil 76px) -> erster Frame bekommt den Nav-Abstand. Der Hero
   selbst rechnet die Nav in sein eigenes Padding ein, daher ausgenommen.
   Passend dazu schaltet nav.js die Nav auf Hero-losen Seiten dauerhaft in den
   "scrolled"-Look (heller Grund, farbiges Logo). */
main > .frame:first-child:not(.frame-type-sprezu_hero) { margin-top: 8.5rem; }
@media (max-width: 767px) {
  main > .frame:first-child:not(.frame-type-sprezu_hero) { margin-top: 7rem; }
}
/* Einspaltig (mobil/tablet): Aside (Bild) via order VOR dem Text, Bildbreite
   auf Lesemaß gedeckelt. Ab 1024px zweispaltig: Text links, Aside rechts
   sticky (Sidebar-Muster der Site, vgl. grid2cols6633 has-sidebar). */
.news-detail {
  max-width: 50rem;
  margin: 0 auto;
}
/* Artikel-Titel auf H2-Größe gedeckelt (Site-Konvention: volle H1-Größe nur im
   Hero; ein 64px-Titel wirkt im Artikel-Layout zu wuchtig). */
.news-detail-header h1 {
  font-size: clamp(28px, 4vw, 44px);
  margin-bottom: 0.75rem;
}
.news-detail-meta {
  font-size: 0.875rem;
  color: rgba(var(--color-blue-rgb), 0.7);
}
.news-detail-header {
  padding-bottom: 1.25rem;
  margin-bottom: 2rem;
  border-bottom: 1px solid rgba(var(--color-blue-rgb), 0.15);
}
.news-detail-columns {
  display: flex;
  flex-direction: column;
  gap: 2rem;
}
.news-detail-aside { order: -1; }
.news-detail-aside .news-detail-media { max-width: 50%; }
@media (min-width: 1024px) {
  .news-detail { max-width: 74rem; }
  .news-detail-columns {
    display: grid;
    /* 50/50: die Bild-/Aside-Spalte bekommt die halbe Artikelbreite */
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 4rem;
    align-items: start;
  }
  .news-detail-aside {
    order: 0;
    position: sticky;
    top: 7rem;
  }
  .news-detail-aside .news-detail-media { max-width: none; }
}
.news-detail-lead {
  font-size: 1.25rem;
  line-height: 1.6;
  margin-bottom: 2rem;
}
.news-detail-media { margin: 0 0 1.5rem; }
.news-detail-media img {
  width: 100%;
  height: auto;
  border-radius: 4px;
  box-shadow: 0 4px 24px rgba(var(--color-blue-rgb), 0.08);
}
.news-detail-media figcaption {
  font-size: 0.875rem;
  color: rgba(var(--color-blue-rgb), 0.7);
  margin-top: 0.5rem;
}
.news-detail-body { line-height: 1.6; }
/* "Weiterführende Links/Dateien" als dezente Karte in der Aside */
.news-detail-related {
  border: 1px solid rgba(var(--color-blue-rgb), 0.12);
  border-radius: 4px;
  padding: 1.25rem;
  margin-bottom: 1.5rem;
}
.news-detail-related h4 { margin-bottom: 0.75rem; }
.news-detail-related ul {
  list-style: none;
  padding: 0;
  margin: 0;
}
.news-detail-related li { margin-bottom: 0.5rem; font-size: 0.9375rem; }
.news-detail-related li:last-child { margin-bottom: 0; }
/* Sharebar (Partial Content/Partials/Sharebar.html) im Artikel-Kontext:
   statisch in einer Zeile statt der absoluten Karten-Positionierung, Blau
   statt Weiß. Toggle-/Copy-Verhalten kommt global aus script.js. */
.news-detail-share {
  margin-top: 2.5rem;
  display: flex;
  align-items: center;
  gap: 1rem;
}
.news-detail-share .custom-tile-item-meta-sharebar {
  position: static;
  color: var(--color-blue);
  padding: 0;
}
.news-detail-share .custom-tile-item-sharebar {
  position: static;
  background: transparent;
  border: none;
  padding: 0;
}
.news-detail-share .custom-tile-item-sharebar a {
  color: var(--color-blue);
  font-size: 1.25rem;
  margin-right: 0.75rem;
  padding: 0;
}
.news-backlink-wrap { margin-top: 2rem; }
/* END - News-Detail */
/* END - Medien-Einträge */

/* START - Termine - Filter & Ansicht */
/* Filterleiste (Monat/Ort/Format) und Umschalter zwischen Listen-/Kacheln-/Kartenansicht auf der Termine-Seite. */
.events-filter-panel {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  flex-wrap: wrap;
  margin-top: 32px;
  padding: 16px 20px;
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.12);
  border-radius: 4px;
}
.events-filter-group {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
}
.events-filter-select {
  appearance: none;
  -webkit-appearance: none;
  background: #FFFFFF url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%231B3A6B"><path d="M7 10l5 5 5-5z"/></svg>') no-repeat right 10px center;
  background-size: 16px;
  border: 1px solid rgba(var(--color-blue-rgb), 0.25);
  border-radius: 999px;
  padding: 9px 34px 9px 16px;
  font-size: 0.875rem;
  font-weight: 700;
  font-family: inherit;
  color: var(--color-blue);
  cursor: pointer;
  transition: border-color 0.2s;
}
.events-filter-select:focus {
  border-color: var(--color-red);
  outline: none;
}

@media (hover: hover) {

  .events-filter-select:hover {
  border-color: var(--color-red-dark);
  outline: none;
}

}
.events-view-switch {
  display: flex;
  align-items: center;
  gap: 4px;
  background: rgba(var(--color-blue-rgb), 0.06);
  border-radius: 999px;
  padding: 4px;
  flex-shrink: 0;
}
.events-view-btn {
  display: flex;
  align-items: center;
  gap: 6px;
  background: transparent;
  border: none;
  border-radius: 999px;
  padding: 8px 16px;
  font-size: 0.875rem;
  font-weight: 700;
  font-family: inherit;
  color: rgba(var(--color-blue-rgb), 0.6);
  cursor: pointer;
  transition: all 0.2s;
}
.events-view-btn i {
  font-size: 14px;
  flex-shrink: 0;
}
@media (hover: hover) {

  .events-view-btn:hover {
  color: var(--color-blue);
}

}
.events-view-btn.active {
  background: var(--color-blue);
  color: var(--color-light);
}
@media (min-width: 768px) {
  .events-filter-panel { flex-direction: row; align-items: center; }
  .events-filter-group { width: auto; }
  .events-filter-select { flex: initial; min-width: auto; }
  .events-view-switch { width: auto; justify-content: flex-start; }
  .events-view-btn { flex: initial; justify-content: flex-start; }
}
/* END - Termine - Filter & Ansicht */

/* START - Thesis (Thesen-Zitatblock) */
/* Hervorgehobener Zitat-/Thesenblock mit rotem Rand (z. B. "Was wir beobachten"). */
.thesis {
  background: var(--color-blue); color: var(--color-light);
  padding: 40px;
  margin: 32px 0;
  border-left: 6px solid var(--color-red);
}
.thesis-label {
  display: block;
  font-size: 0.875rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.15em;
  color: var(--color-red);
  margin-bottom: 12px;
}
.thesis p { color: var(--color-light); font-size: 20px; line-height: 1.5; }
.thesis-toggle {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  width: 100%;
  background: none;
  border: none;
  padding: 0;
  margin: 0;
  cursor: pointer;
  text-align: left;
  font: inherit;
  color: inherit;
}
.thesis-toggle-text { display: block; flex: 1; }
.thesis-toggle-icon {
  flex-shrink: 0;
  width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 8px;
  background: rgba(var(--color-light-rgb), 0.15);
  transition: transform 0.2s ease, background 0.2s ease;
}
@media (hover: hover) {

  .thesis-toggle:hover .thesis-toggle-icon {
  background: rgba(var(--color-light-rgb), 0.28);
}

}
.thesis.thesis-open .thesis-toggle-icon { transform: rotate(180deg); }
.thesis-body { display: none; margin-top: 16px; }
.thesis.thesis-open .thesis-body { display: block; }
.thesis-cta {
  display: inline-flex; align-items: center; gap: 10px;
  background: var(--color-red); color: var(--color-light);
  padding: 14px 28px;
  margin-top: 24px;
  font-size: 16px; font-weight: 700;
  text-decoration: none;
  border-radius: 999px;
  transition: all 0.2s;
}
.thesis-cta:active { background: var(--color-light); color: var(--color-blue); }

@media (hover: hover) {

  .thesis-cta:hover { background: var(--color-light); color: var(--color-blue); }

}
/* END - Thesis (Thesen-Zitatblock) */

/* START - Foto-Bento-Grid */
/* Unregelmäßiges Bento-Bildraster (z. B. "Wenn Menschen einander zuhören" auf der Startseite). */
.photo-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  grid-auto-rows: 130px;
  gap: 12px;
  margin-top: 48px;
}
.photo {
  background: var(--color-blue);
  position: relative;
  overflow: hidden;
  border-radius: 4px;
}
.photo-bento {
  grid-template-rows: unset;
  grid-auto-flow: dense;
}
.photo-bento .photo:nth-child(1) { grid-column: 1 / 3; grid-row: span 2; }
.photo-bento .photo:nth-child(2) { grid-column: span 1; grid-row: span 2; }
.photo-bento .photo:nth-child(3) { grid-column: span 1; grid-row: span 1; }
.photo-bento .photo:nth-child(4) { grid-column: span 1; grid-row: span 1; }
.photo-bento .photo:nth-child(5) { grid-column: 1 / 3; grid-row: span 2; }
.photo-bento .photo:nth-child(6) { grid-column: span 1; grid-row: span 2; }
.photo-bento .photo:nth-child(7) { grid-column: span 1; grid-row: span 2; }
.photo img {
  width: 100%; height: 100%;
  object-fit: cover; object-position: center;
  transition: transform 0.4s ease;
}
@media (hover: hover) {

  .photo:hover img { transform: scale(1.04); }

}
@media (min-width: 768px) {
  .photo-grid { grid-auto-rows: 160px; gap: 16px; }
}
@media (min-width: 1024px) {
  .photo-grid { grid-template-columns: repeat(4, 1fr); grid-auto-rows: 140px; }
  .photo-bento { grid-template-rows: repeat(6, 140px); grid-auto-flow: row; }
  .photo-bento .photo:nth-child(1) { grid-column: 1 / 3; grid-row: 1 / 5; }
  .photo-bento .photo:nth-child(2) { grid-column: 3 / 4; grid-row: 1 / 4; }
  .photo-bento .photo:nth-child(3) { grid-column: 4 / 5; grid-row: 1 / 3; }
  .photo-bento .photo:nth-child(4) { grid-column: 4 / 5; grid-row: 3 / 5; }
  .photo-bento .photo:nth-child(5) { grid-column: 1 / 3; grid-row: 5 / 7; }
  .photo-bento .photo:nth-child(6) { grid-column: 3 / 4; grid-row: 4 / 7; }
  .photo-bento .photo:nth-child(7) { grid-column: 4 / 5; grid-row: 5 / 7; }
}
/* END - Foto-Bento-Grid */



/**** START - FROM custom_md2022 - styles-defaultscreen.css ****/
/*** START - General helper classes ***/
.hidden { display:none !important; visibility:hidden; }
/*** END - General helper classes ***/

/*** START - Custom tile group ***/
.custom-tile-group { list-style:none; display:flex; flex-wrap:wrap; overflow:hidden; }
.custom-tile-group.opened { transition:max-height 800ms; }
.custom-tile-group.closed { transition:max-height 100ms; }
/* Kachel-Look wie ".tile" der statischen Vorlage (Creme-Karte mit blauem
   12%-Rand, 4px-Radius) statt des weißen Kastens der MD-Hauptseite. */
.custom-tile-item { background:var(--color-light); border:1px solid rgba(var(--color-blue-rgb), 0.12); border-radius:4px; overflow:hidden; position:relative; margin-left:0; margin-right:1.5rem; margin-bottom:1.5rem; }
.aside .custom-tile-item { margin-right:0; }
.aside .custom-tile-item:last-child { margin-bottom:0; }
.custom-tile-item.margin-right-0 { margin-right:0; }

/** Columns **/
[data-columns="4"] .custom-tile-item { flex:1 1 calc(33.33% - 1rem); max-width:calc(33.33% - 1rem); }
.frame:not(.frame-first-item-doublesize) [data-columns="4"] .custom-tile-item:nth-child(n) { margin-right:1.5rem; }
.frame:not(.frame-first-item-doublesize) [data-columns="4"] .custom-tile-item:nth-child(3n) { margin-right:0; }
[data-columns="3"] .custom-tile-item { flex:1 1 calc(33.33% - 1rem);max-width:calc(33.33% - 1rem); }
[data-columns="3"] .custom-tile-item:nth-child(3n) { margin-right:0; }
[data-columns="2"] .custom-tile-item { flex:1 1 calc(50% - 0.75rem); max-width:calc(50% - 0.75rem); }
[data-columns="2"] .custom-tile-item:nth-child(2n) { margin-right:0; }
[data-columns="1"] .custom-tile-item { flex:1 1 100%; margin-right:0; max-width:100%; }

/* Custom tile item */
.custom-tile-item a { color:inherit; text-decoration:none; }
@media (hover: hover) {

  .custom-tile-item a:hover { color:inherit; text-decoration:none; }

}
.custom-tile-item > a { height:100%; display:block; }
.custom-tile-item-meta { align-items:center; background-color:var(--color-blue); display:flex; font-size:0.875rem; justify-content:space-between; padding:0.25rem 1rem 0.25rem 1rem; position:relative; }
.custom-tile-item-meta.featured_event { background-color:var(--color-red); }
.custom-tile-item-meta-contenttype { display:inline-block; font-weight:700/*600*/; text-transform:uppercase; white-space:nowrap; }
.custom-tile-item-meta-date { display:inline-block; /*width:115px;*/ white-space:nowrap;}
.custom-tile-item-meta-relevance { display:inline-block; white-space:nowrap;}
.custom-tile-item-meta-sharebar { background:none; border:none; color:#ffffff; position:absolute; top:0.375rem; right:1rem; display:inline-block; white-space:nowrap; cursor:pointer; /*text-decoration:underline;*/ font-weight:700/*600*/; transition:.4s; }
@media (hover: hover) {

  .custom-tile-item-meta-sharebar:hover { color:var(--color-red-dark); }

}
.custom-tile-item-meta-sharebar .fa-share { margin-right:5px; }
@media (hover: hover) {

  .custom-tile-item-meta-sharebar .fa-share:hover, .custom-tile-item-sharebar a:hover/*,.custom-tile-item-sharebar .fa-facebook:hover,.custom-tile-item-sharebar
.fa-envelope:hover*/ { color:var(--color-red-dark)/*!important*/; }

}
.no-touchevents .custom-tile-item > a:hover .custom-tile-item-meta, .custom-tile-item > a:active .custom-tile-item-meta { background-color:var(--color-blue-secondary); transition: 0.4s; }
.no-touchevents .custom-tile-item > a:hover .custom-tile-item-header, .custom-tile-item > a:active .custom-tile-item-header { color:var(--color-red-dark); text-decoration:underline; transition: 0.4s; }
.no-touchevents .frame-first-item-doublesize .custom-tile-item:first-child > a:hover .custom-tile-item-header, .frame-first-item-doublesize .custom-tile-item > a:active .custom-tile-item-header { color:#ffffff; }
.no-touchevents .frame-first-item-doublesize .custom-tile-item:first-child > a:hover .custom-tile-item-more, .frame-first-item-doublesize .custom-tile-item > a:active .custom-tile-item-more { color:var(--color-red-dark); }
.no-touchevents .custom-tile-item > a:hover .custom-tile-item-more, .custom-tile-item > a:active .custom-tile-item-more { color:var(--color-blue); }
.custom-tile-item-sharebar { background-color:var(--color-blue); border-top:1px solid #ffffff; padding:5px 1em; position:absolute; right:0; top:2rem; z-index:10; }
/* Solr result sharebars are toggled open/closed via JS (jq-main.js). AJAX-injected
   tiles (facet clicks, pagination) carry no inline display, so hide them by default
   here; the toggle sets an inline display to open. Scoped to .results-list so
   mdevents/news/content sharebars keep their own behaviour. */
.results-list .custom-tile-item-sharebar { display:none; }
.custom-tile-item-sharebar a { display: inline-block;margin-right: .5em;font-size: 1.875em;padding:5px;}
.custom-tile-item-sharebar a:last-child { margin-right: 0;}
.custom-tile-item-image figure {position: relative;line-height: .5;}
.custom-tile-item-image figure img { width:100%; }
.custom-tile-item-image figcaption { position:absolute; left:16px; top:12px; font-size:32px; font-weight:700; line-height:1; }
.custom-tile-item-image figcaption > span.time { display:block; margin-top:20px; font-size:16px; }
.custom-tile-item-image a figcaption { color:#e0e0e0; }
.custom-tile-item-text { color:#000000; padding:1em 1em 3em 1em; }
.custom-tile-item-header h2, .custom-tile-item-header h3 { margin-bottom:16px; line-height:26px; }
.custom-tile-item-teaser p:nth-last-child(2) { margin-bottom:0; }
.custom-tile-item-more { position:absolute; left:16px; bottom:16px; display:inline-block; margin-bottom:0; padding-right:16px; color:var(--color-red); font-size:0.875rem; text-transform:uppercase; text-decoration:underline;transition:.4s;font-weight:700/*600*/;}
.custom-tile-item-more:after { font-family: 'Font Awesome 6 Free'; content:"\f105"; display:inline-block; margin-left:5px; }

@media only screen and (min-width: 1600px) {
  [data-columns="4"] .custom-tile-item {
    flex: 1 1 calc(25% - 1.125rem);
    max-width: calc(25% - 1.125rem);
  }
}

@media only screen and (max-width: 1200px) {
  :is([data-columns="4"], [data-columns="3"], [data-columns="2"], [data-columns="1"]) .custom-tile-item {
    position: relative;
    flex: 1 1 calc(50% - 0.75rem);
    max-width: calc(50% - 0.75rem);
    margin-left: 0;
    margin-right: 1.5rem;
    margin-bottom: 1.5rem;
    background-color: white;
  }
  .aside :is([data-columns="4"],[data-columns="3"],[data-columns="2"],[data-columns="1"]) .custom-tile-item {
    flex:unset;
    max-width: unset;
    margin-right: 0;
  }
  :is([data-columns="4"],[data-columns="3"],[data-columns="2"],[data-columns="1"]) .custom-tile-item:nth-child(2n) {
    margin-right:0;
  }
  .custom-tile-group {
    justify-content: space-between;
  }
  :is(aside, .grid-column) .form-navigation {
    position: static;
    bottom:unset;
  }
}

@media only screen and (max-width: 800px) {
  :is([data-columns="4"],
        [data-columns="3"],
        [data-columns="2"],
        [data-columns="1"]) .custom-tile-item {
    flex:1 1 100%;
    max-width:100%;
    margin-right:0;
  }
  .custom-tile-group {
    margin-bottom: 1.5em;
  }
}
/*** END - Custom tile group ***/

/*** START Rasterabschnitte (gridSimplerow/grid2cols/grid2cols6633/grid2cols7525/grid3cols/grid4cols/gridphotobento) ***/
/* MARKERKLASSE ".grid-section" (28.7.2026, vorher ".frame-type-gridelements"):
   Der gesamte Block galt ursprünglich nur für Gridelements-Container. Seit der
   Umstellung auf b13/container gibt es im S&Z-Baum ZWEI Systeme mit identischem
   Raster-Markup (.grid-row > .grid-column), deshalb tragen beide Frame-Layouts
   dieselbe Marker-Klasse:
     Resources/Private/Content/Layouts/GridElementsDefault.html  (alt)
     Resources/Private/Content/Layouts/ContainerDefault.html     (neu)
   Die spaltenspezifischen Regeln weiter unten (.grid2cols6633, .grid4cols, …)
   sprechen weiterhin die ALTEN Rasternamen an; bei Containern liefert
   settings.gridClass aus Configuration/TypoScript/plugin/tx_container.typoscript
   dieselbe Klasse nach. Deshalb musste an den Breiten/Rinnen nichts geändert
   werden. Umbenannt wurde ausschließlich der Selektor, keine Werte. */
/* Abschnitts-Look, übernommen von der ehemaligen (jetzt entfernten) Klasse
   ".section"/".container" der statischen Vorlage: vertikaler Abstand außen
   (Hintergrundfarbe darf über die volle Breite gehen), Inhalt innen auf
   1400px begrenzt. */
[class*="frame-type-container"] { padding: 64px 0; }
[class*="frame-type-container"] > div.grid-row {
  display:flex; justify-content:space-between; flex-wrap:wrap;
  max-width: 1400px; margin: 0 auto; padding: 0 24px;
}
/* Container-eigener Header (Überschrift/Eyebrow des Gridelements, oberhalb der
   Rasterzeile) auf dieselbe Breite/Einrückung wie die Rasterzeile darunter
   bringen, damit Überschrift und Inhalt bündig ausgerichtet sind. */
[class*="frame-type-container"] > header {
  max-width: 1400px; margin: 0 auto; padding: 0 24px;
}
@media (min-width: 768px) {
  [class*="frame-type-container"] { padding: 96px 0; }
  [class*="frame-type-container"] > div.grid-row,
  [class*="frame-type-container"] > header { padding: 0 64px; }
}
/* Inhaltselemente/Plugins DIREKT in <main> (ohne Gridelements-Container,
   z. B. Überschrift + md_events-Plugins auf der Termine-Seite) bekommen
   dieselbe Inhaltsbreite wie Gridelements-Zeilen (1400px, seitliches
   Padding) und einen vertikalen Rhythmus. Gridelements selbst bleiben
   volle Breite (Hintergrundfarbe), deshalb ausgenommen. */
main > .frame:not([class*="frame-type-container"]) {
  max-width: 1400px;
  margin: 32px auto;
  padding: 0 24px;
}
/* Überschrift-Frame eng an das folgende Inhaltselement koppeln (wie in der
   statischen Vorlage, wo Überschrift und Filter im selben Abschnitt stehen):
   weniger Abstand nach unten bzw. oben zwischen Header und Folge-Frame. */
main > .frame-type-header { margin-bottom: 16px; }
main > .frame-type-header + .frame:not([class*="frame-type-container"]) { margin-top: 16px; }
/* Überschrift MIT Trennlinie darunter (frame-ruler-after): die Überschrift
   selbst (h1–h4) bekommt keinen unteren Abstand, damit der Text direkt auf der
   Linie sitzt. Der Abstand des Frames darunter (margin-bottom) bleibt erhalten. */
.frame.frame-ruler-after :is(h1, h2, h3, h4) { margin-bottom: 0; }
/* Mehr Luft UNTER der Trennlinie: die ruler-after-Linie sitzt am unteren
   Frame-Rand; der folgende Inhalt (z. B. Person-Panels) soll deutlich abgesetzt
   sein. Greift in <main> UND in Rasterspalten (0-4-0 schlägt die 16px-Header-
   Regel oben). */
:is(main, .grid-column) > .frame:not([class*="frame-type-container"]).frame-ruler-after { margin-bottom: 2.5rem; }
/* Ausrichtung der Überschrift (Backend-Feld header_position = center/right).
   Die Klasse setzt Partials/Header/All.html auf das <header>; text-align
   zentriert/rechtsbündig Eyebrow, Titel und Unterüberschrift. */
.frame > header.header-align-center { text-align: center; }
.frame > header.header-align-right { text-align: right; }
@media (min-width: 768px) {
  main > .frame:not([class*="frame-type-container"]) { padding: 0 64px; }
}
/* "Kein Abstand" (Backend-Felder Abstand davor/danach = "null"): entfernt den
   Standard-Frame-Abstand. Bei normalen Frames die margin, bei Gridelements-
   Sektionen zusätzlich das padding (die haben statt margin ein padding).
   Die margin-Regeln greifen per :is(main, .grid-column) sowohl für Frames
   direkt in <main> ALS AUCH für Frames, die (gestapelt) in einer Gridelements-
   Spalte liegen — sonst wären die Backend-Abstände dort wirkungslos. */
/* Seiten OHNE Hero: das erste Frame in <main> bekommt oben 6rem Abstand, damit
   der Inhalt nicht unter der fixierten Navigation klebt. Auf Seiten MIT Hero
   ist das erste Frame der Hero (per :not() ausgenommen), der den Freiraum
   selbst mitbringt. */
main > .frame:first-child:not(.frame-type-sprezu_hero) { margin-top: 6rem; }
/* Ist dieses erste Frame ein Gridelements-Container, dessen eigenes 96px-Top-
   Padding NICHT zusätzlich stapeln (sonst doppelter Abstand = ~192px). */
main > [class*="frame-type-container"]:first-child:not(.frame-type-sprezu_hero) { padding-top: 0; }

:is(main, .grid-column) > .frame.frame-space-before-null { margin-top: 0; }
:is(main, .grid-column) > .frame.frame-space-after-null { margin-bottom: 0; }
:is(main, .grid-column) > [class*="frame-type-container"].frame-space-before-null { padding-top: 0; }
:is(main, .grid-column) > [class*="frame-type-container"].frame-space-after-null { padding-bottom: 0; }
/* Abstufungen Extraklein…Extragroß (space_before/after = extra-small…extra-large).
   Logische Sprünge passend zum Seitenraster, mit eigener Skala je Kontext:
   - normale Frames = margin (Standard 2rem/32px): 1 / 1.5 / 2 / 3 / 4rem
   - Gridelements-Sektionen = padding (Standard 4–6rem/64–96px, farbige Bänder
     brauchen mehr): 2 / 3 / 4 / 6 / 8rem
   „davor" = oben (margin-top/padding-top), „danach" = unten. */
:is(main, .grid-column) > .frame.frame-space-before-extra-small { margin-top: 1rem; }
:is(main, .grid-column) > .frame.frame-space-before-small       { margin-top: 1.5rem; }
:is(main, .grid-column) > .frame.frame-space-before-medium      { margin-top: 2rem; }
:is(main, .grid-column) > .frame.frame-space-before-large       { margin-top: 3rem; }
:is(main, .grid-column) > .frame.frame-space-before-extra-large { margin-top: 4rem; }
:is(main, .grid-column) > .frame.frame-space-after-extra-small  { margin-bottom: 1rem; }
:is(main, .grid-column) > .frame.frame-space-after-small        { margin-bottom: 1.5rem; }
:is(main, .grid-column) > .frame.frame-space-after-medium       { margin-bottom: 2rem; }
:is(main, .grid-column) > .frame.frame-space-after-large        { margin-bottom: 3rem; }
:is(main, .grid-column) > .frame.frame-space-after-extra-large  { margin-bottom: 4rem; }
:is(main, .grid-column) > [class*="frame-type-container"].frame-space-before-extra-small { padding-top: 2rem; }
:is(main, .grid-column) > [class*="frame-type-container"].frame-space-before-small       { padding-top: 3rem; }
:is(main, .grid-column) > [class*="frame-type-container"].frame-space-before-medium      { padding-top: 4rem; }
:is(main, .grid-column) > [class*="frame-type-container"].frame-space-before-large       { padding-top: 6rem; }
:is(main, .grid-column) > [class*="frame-type-container"].frame-space-before-extra-large { padding-top: 8rem; }
:is(main, .grid-column) > [class*="frame-type-container"].frame-space-after-extra-small  { padding-bottom: 2rem; }
:is(main, .grid-column) > [class*="frame-type-container"].frame-space-after-small        { padding-bottom: 3rem; }
:is(main, .grid-column) > [class*="frame-type-container"].frame-space-after-medium       { padding-bottom: 4rem; }
:is(main, .grid-column) > [class*="frame-type-container"].frame-space-after-large        { padding-bottom: 6rem; }
:is(main, .grid-column) > [class*="frame-type-container"].frame-space-after-extra-large  { padding-bottom: 8rem; }
/* Trennlinie davor/danach (Backend-Feld Rahmen = "Linie oberhalb/unterhalb",
   frame_class = ruler-before/ruler-after). Der Core liefert nur die Klasse, kein
   CSS → hier nachgezogen wie der Trenner unter .team-group-title in der statischen
   Vorlage: dünne blaue Linie mit 15 % Deckkraft. Als Pseudo-Element gezeichnet;
   die seitliche Einrückung steuert --ruler-inset: 0 = volle Breite (z. B. in
   Gridelements-Rasterspalten, wo der Frame bündig sitzt), auf Top-Level-Frames
   auf das Frame-Gutter (24/64px) gesetzt, damit die Linie dort mit dem Text
   bündig ist. NICHT auf "main >" gescoped, damit sie auch in Rasterspalten greift. */
.frame:not([class*="frame-type-container"]).frame-ruler-before,
.frame:not([class*="frame-type-container"]).frame-ruler-after { position: relative; }
.frame:not([class*="frame-type-container"]).frame-ruler-before { padding-top: 16px; }
.frame:not([class*="frame-type-container"]).frame-ruler-after { padding-bottom: 16px; }
.frame:not([class*="frame-type-container"]).frame-ruler-before::before,
.frame:not([class*="frame-type-container"]).frame-ruler-after::after {
  content: "";
  position: absolute;
  left: var(--ruler-inset, 0);
  right: var(--ruler-inset, 0);
  border-top: 1px solid rgba(var(--color-blue-rgb), 0.15);
}
.frame:not([class*="frame-type-container"]).frame-ruler-before::before { top: 0; }
.frame:not([class*="frame-type-container"]).frame-ruler-after::after { bottom: 0; }
/* Top-Level-Frames (direkt unter main): Einrückung = Frame-Gutter 24/64px. */
main > .frame:not([class*="frame-type-container"]).frame-ruler-before,
main > .frame:not([class*="frame-type-container"]).frame-ruler-after { --ruler-inset: 24px; }
@media (min-width: 768px) {
  main > .frame:not([class*="frame-type-container"]).frame-ruler-before,
  main > .frame:not([class*="frame-type-container"]).frame-ruler-after { --ruler-inset: 64px; }
}
/* ===================================================================================
   Spaltengeometrie der Container-Elemente (b13/container)

   31.7.2026: Diese Regeln hingen bis heute an den Gridelements-Klassen
   ".grid-section.grid2cols6633" & Co. Die erzeugt seit der Container-Migration
   NIEMAND mehr — den Marker "grid-section" setzten nur Layouts/ContainerDefault.html
   und Layouts/GridElementsDefault.html, und beide rendern nicht mehr. Gegenprobe an
   der ausgelieferten Startseite: "grid-section" 0 Treffer, "grid-row" 10 Treffer.
   Deshalb waren Footer, Seitenspalte und Newsletter-Formular ohne Gestaltung.

   Es rendert stattdessen custom_backend/Resources/Private/Content/Templates/, und
   zwar mit Layouts/Default.html DIESER Extension. Ausgegeben wird:
       <div class="frame frame-type-container2cols frame-layout-1">
         <div class="grid-row grid-row-1">
           <div class="grid-column grid-column-101 width-66">…
   Das Verhältnis steckt also im Feld "layout" (0 = 50/50, 1 = 66/33, 2 = 33/66,
   3 = 75/25, 4 = 25/75), nicht mehr im CType. Bis zum 3.8.2026 gab es daneben
   vier eigenständige CTypes (container2cols6633/3366/7525/2575), weshalb in
   jeder Regel BEIDES stand; sie sind entfallen, es bleibt das Layout.

   Die Spezifität ist überall unverändert geblieben: ".grid-section" war 0-1-0,
   ein Attributselektor zählt genauso; aus dem zweiklassigen
   ".grid-section.grid4cols" wird ".frame.frame-type-container4cols", und :is()
   erbt die Spezifität seines stärksten Arguments. Das ist Absicht — sonst würden
   sich die Gewichte gegenüber den umliegenden Regeln verschieben.

   Grundbreiten liefert custom_md2022/Resources/Public/Css/container.css (0.75rem
   Rinne, per f:asset.css priority="1" also VOR dieser Datei). S&Z überschreibt
   sie hier bewusst mit den Rinnen der statischen Vorlage (64px Sidebar/Karte,
   24px Kacheln, 48px Footer-Spalten).

   JEDE Regel hier setzt neben flex/width auch MAX-WIDTH. Das ist kein
   Schönheitsfehler, sondern Pflicht: container.css deckelt jede Spalte
   zusätzlich per max-width (".frame-type-container2cols .grid-column.width-33"
   auf calc(33.3333% - 0.75rem) usw.). Eine Regel, die nur flex und width setzt,
   kommt gegen diesen Deckel nicht an — im Browser nachgemessen am 31.7.2026 bei
   868px Fensterbreite: Die Spalten trugen korrekt "flex: 1 1 100%", standen aber
   trotzdem bei 471px und 230px nebeneinander statt gestapelt, weil der 66/33-
   Deckel weitergalt. Wer hier eine Breite anfasst, muss max-width mitziehen.
   =================================================================================== */
/* containersimple — eine Spalte über die volle Breite */
.frame.frame-type-containersimple > div.grid-row > div.grid-column { flex:1 1 100%; width:100%; max-width:100%; }
/* Zweispalter 50/50 (Layout "0" = keine Auswahl) — 64px Spaltenabstand
   (2rem je Innenseite), wie der frühere Section-/Container-Abstand der
   statischen Vorlage (.layout-with-sidebar/.map-container: gap: 64px).
   Bewusst auf frame-layout-0 eingegrenzt: Der CType container2cols trägt heute
   ALLE Verhältnisse. Ohne diese Eingrenzung setzte die Regel ihr
   "min-width: calc(50% - 2rem)" auch auf die 33%-Spalte eines 66/33-Elements —
   die Zeile darunter überschreibt nur flex und width, nicht min-width. */
.frame-type-container2cols.frame-layout-0 > div.grid-row > div.grid-column { flex:1 1 calc(50% - 2rem); min-width:calc(50% - 2rem); max-width:calc(50% - 2rem); }
.frame-type-container2cols.frame-layout-0 > div.grid-row > div:first-child { margin-right:2rem; }
.frame-type-container2cols.frame-layout-0 > div.grid-row > div:last-child { margin-left:2rem; }
/* Zweispalter 66/33 — Spaltenverhältnis 2:1 mit 64px Rinne wie
   ".layout-with-sidebar" der statischen Vorlage (grid 2fr/1fr, gap 64px).
   Die px-Abzüge in calc() verteilen die 64px Rinne im Verhältnis der
   Spaltenbreiten (2/3 bzw. 1/3 von 64px), die 32px-Ränder je Innenseite
   ergeben zusammen die Rinne.
   Gilt ab 1024px. Darunter NICHT gestapelt, sondern 50/50 nebeneinander —
   siehe den 768–1023.98px-Block weiter unten. */
.frame-type-container2cols.frame-layout-1 > div.grid-row > div:first-child { flex:1 1 calc(66.666% - 42.67px); width:calc(66.666% - 42.67px); max-width:calc(66.666% - 42.67px); margin-right:32px; }
.frame-type-container2cols.frame-layout-1 > div.grid-row > div:last-child { flex:1 1 calc(33.333% - 21.33px); width:calc(33.333% - 21.33px); max-width:calc(33.333% - 21.33px); margin-left:32px; }
/* Termin-Einzelansicht OHNE Anmeldeformular: volle Breite statt leerer Spalte.
   Das Plugin gibt in diesem Fall ein leeres <div class="registrationview"> aus
   und blendet per Skript nur SEINEN EIGENEN .frame aus (inline display:none).
   Die Rasterspalte darum bleibt stehen und belegt weiter ihre 33 % (bzw. 50 %
   im 768–1023.98px-Band) — der Text daneben endete auf zwei Dritteln der
   Seite, rechts nichts.
   Bedingung bewusst eng gefasst, damit sie NUR diesen Fall trifft: die letzte
   Spalte muss GENAU EINEN .frame enthalten (`:only-child`) und darin ein
   LEERES .registrationview. Ist ein Formular da, greift nichts davon und es
   bleibt bei 66/33 bzw. 50/50. `:empty` verlangt einen Knoten ganz ohne
   Inhalt — das Plugin liefert `<div class="registrationview"></div>` ohne
   Leerzeichen, sonst würde die Regel still nicht zünden.
   Ohne Media Query: gestapelt (unter 768px) ist die erste Spalte ohnehin
   100 % breit, das Ausblenden spart dort nur die Leerspalte. */
.frame-type-container2cols.frame-layout-1 > div.grid-row:has(> div.grid-column:last-child > .frame:only-child .registrationview:empty) > div.grid-column:first-child {
  flex: 1 1 100%;
  width: 100%;
  max-width: 100%;
  margin-right: 0;
  margin-bottom: 0;
}
.frame-type-container2cols.frame-layout-1 > div.grid-row:has(> div.grid-column:last-child > .frame:only-child .registrationview:empty) > div.grid-column:last-child {
  display: none;
}
/* Zweispalter 75/25 — 64px Rinne, anteilig verteilt (s. o.) */
.frame-type-container2cols.frame-layout-3 > div.grid-row > div:first-child { flex:1 1 calc(75% - 48px); width:calc(75% - 48px); max-width:calc(75% - 48px); margin-right:32px; }
.frame-type-container2cols.frame-layout-3 > div.grid-row > div:last-child { flex:1 1 calc(25% - 16px); width:calc(25% - 16px); max-width:calc(25% - 16px); margin-left:32px; }
/* Zweispalter 33/66 und 25/75 — die gespiegelten Verhältnisse. Neu am 31.7.2026:
   Unter Gridelements gab es sie nicht (die Layoutliste kannte nur gridSimplerow,
   grid2cols, grid2cols6633, grid2cols7525, grid3cols, grid4cols, gridphotobento),
   das Layout-Feld des Zweispalters bietet sie aber an — siehe
   custom_md2022/Configuration/TSconfig/Page/setup.tsconfig, "layout.types.container2cols".
   Ohne diese Regeln fielen genau diese beiden Verhältnisse auf die 0.75rem-Rinne
   aus custom_md2022/container.css zurück und sähen als einzige anders aus.
   Werte sind die gespiegelten Zahlen von oben. */
.frame-type-container2cols.frame-layout-2 > div.grid-row > div:first-child { flex:1 1 calc(33.333% - 21.33px); width:calc(33.333% - 21.33px); max-width:calc(33.333% - 21.33px); margin-right:32px; }
.frame-type-container2cols.frame-layout-2 > div.grid-row > div:last-child { flex:1 1 calc(66.666% - 42.67px); width:calc(66.666% - 42.67px); max-width:calc(66.666% - 42.67px); margin-left:32px; }
.frame-type-container2cols.frame-layout-4 > div.grid-row > div:first-child { flex:1 1 calc(25% - 16px); width:calc(25% - 16px); max-width:calc(25% - 16px); margin-right:32px; }
.frame-type-container2cols.frame-layout-4 > div.grid-row > div:last-child { flex:1 1 calc(75% - 48px); width:calc(75% - 48px); max-width:calc(75% - 48px); margin-left:32px; }
/* Dreispalter — 24px Rinne wie ".tiles" der statischen Vorlage (gap 24px):
   3 Spalten teilen sich 2×24px = 48px Rinne, je Spalte 16px Abzug. */
.frame.frame-type-container3cols > div.grid-row > div.grid-column { flex:1 1 calc(33.333% - 16px); width:calc(33.333% - 16px); max-width:calc(33.333% - 16px); margin:0 12px; }
.frame.frame-type-container3cols > div.grid-row > div:first-child { margin-left:0; }
.frame.frame-type-container3cols > div.grid-row > div:last-child { margin-right:0; }
/* Vierspalter — 48px Rinne wie ".footer-inner" der statischen Vorlage (gap 48px):
   4 Spalten teilen sich 3×48px = 144px Rinne, je Spalte 36px Abzug. */
.frame.frame-type-container4cols > div.grid-row > div.grid-column { flex:1 1 calc(25% - 36px); width:calc(25% - 36px); max-width:calc(25% - 36px); margin:0 24px; }
.frame.frame-type-container4cols > div.grid-row > div:first-child { margin-left:0; }
.frame.frame-type-container4cols > div.grid-row > div:last-child { margin-right:0; }
/* Leere Rasterspalten erzeugen in gestapelten Ansichten keinen Leerraum. */
[class*="frame-type-container"] > div.grid-row > div.grid-column:empty { margin-top: 0 !important; margin-bottom: 0 !important; }
/* ⚠️ md2022s container.css bringt FREMDE Umbruchpunkte mit (500/800/1100/1200/
   1600px) und lädt per f:asset.css priority="1" VOR dieser Datei. Auf sprezu
   gelten aber nur 768px und 1024px (statische Vorlage). Die dortige Regel
       @media (max-width:800px) { :is(…2cols…) .grid-row { flex-direction:column } }
   kippt die Rasterzeile auf gestapelt. Sie zählt 0-2-0 und traf hier auf gar
   keinen Gegenspieler: sprezu überschreibt nur die Spaltenbreiten, nie die
   Richtung der Zeile. Folge bis 1.8.2026: zwischen 768 und 800px sprang die
   Seitenleiste unter den Inhalt, behielt aber ihre halbe Breite.
   Deshalb hier ausdrücklich zurückgenommen — 0-3-1 schlägt 0-2-0.
   MERKE: Spalten und Zeile sind zwei getrennte Baustellen. Wer nur
   flex/width/max-width der Spalte setzt, hat die Zeilenrichtung nicht erledigt. */
@media only screen and (min-width: 768px) {
  .frame[class*="frame-type-container"] > div.grid-row { flex-direction: row; }
}
/* Umbruchpunkte wie in der statischen Vorlage (dort mobile-first mit
   min-width 768px/1024px): mehrspaltige Layouts brechen unterhalb von 1024px
   um, alles einspaltig unterhalb von 768px. Die .98-Werte vermeiden
   Überschneidung mit den min-width-Regeln bei exakt 1024px/768px
   Fensterbreite. Die vertikalen Abstände beim Stapeln entsprechen den
   jeweiligen gap-Werten der statischen Vorlage (64px Sidebar/Karte,
   24px Kacheln, 48px Footer-Spalten). */
@media only screen and (min-width: 768px) and (max-width: 1023.98px) {
  .frame.frame-type-container2cols > div.grid-row > div.grid-column { flex:1 1 100%; width: 100%; max-width: 100%; margin: 0 0 64px 0; }
  /* Ausnahme 1.8.2026 — der 66/33-Zweispalter (Inhalt + Seitenleiste) stapelt
     hier NICHT, sondern steht 50/50 nebeneinander. Bei 2:1 blieben der
     Seitenleiste in diesem Bereich nur rund 275px; halbe/halbe gibt beiden
     Spalten rund 400px. Ab 1024px gilt wieder 66/33 (Basisregel weiter oben).
     Muss die Stapelregel eine Zeile darüber schlagen: die zählt 0-4-2, diese
     0-5-2 (`:is()` erbt die Spezifität seines stärksten Arguments, hier
     `.frame-type-container2cols.frame-layout-1` mit zwei Klassen).
     `max-width` MUSS mitgesetzt werden — sonst deckelt md2022s container.css
     die Spalte weiter auf 66% bzw. 33%. */
  .frame.frame-type-container2cols.frame-layout-1 > div.grid-row > div.grid-column { flex:1 1 calc(50% - 32px); width:calc(50% - 32px); max-width:calc(50% - 32px); margin:0; }
  .frame.frame-type-container2cols.frame-layout-1 > div.grid-row > div.grid-column:first-child { margin-right:32px; }
  .frame.frame-type-container2cols.frame-layout-1 > div.grid-row > div.grid-column:last-child { margin-left:32px; }
  /* Kachelraster wie ".tiles" der statischen Vorlage bei 768–1023px:
     erste Kachel über die volle Breite, darunter zwei Spalten
     (Rinne 24px über justify-content: space-between der Rasterzeile). */
  .frame.frame-type-container3cols > div.grid-row > div.grid-column { flex:0 1 calc(50% - 12px); width:calc(50% - 12px); max-width:calc(50% - 12px); margin:0 0 24px 0; }
  .frame.frame-type-container3cols > div.grid-row > div.grid-column:first-child { flex-basis:100%; width:100%; max-width:100%; }
  .frame.frame-type-container4cols > div.grid-row > div.grid-column { flex:1 1 calc(50% - 24px); width:calc(50% - 24px); max-width:calc(50% - 24px); margin-bottom:48px; }
  .frame.frame-type-container4cols > div.grid-row > div:nth-child(3) { margin-left:0; }
  .frame.frame-type-container4cols > div.grid-row > div:nth-child(2) { margin-right:0; }
  [class*="frame-type-container"] > div.grid-row > div.grid-column:nth-last-child(-n+1),
  .frame.frame-type-container3cols > div.grid-row > div.grid-column:nth-last-child(-n+2),
  .frame.frame-type-container4cols > div.grid-row > div.grid-column:nth-last-child(-n+2) { margin-bottom: 0; }
}
@media only screen and (max-width: 767.98px) {
  .frame:is(.frame-type-container2cols, .frame-type-container3cols, .frame-type-container4cols) > div.grid-row > div.grid-column { flex: 1 1 100%; width: 100%; max-width: 100%; }
  .frame.frame-type-container2cols > div.grid-row > div.grid-column { margin: 0 0 64px 0; }
  .frame.frame-type-container3cols > div.grid-row > div.grid-column { margin: 0 0 24px 0; }
  .frame.frame-type-container4cols > div.grid-row > div.grid-column { margin: 0 0 48px 0; }
  [class*="frame-type-container"] > div.grid-row > div.grid-column:last-child { margin-bottom: 0; }
}
/* Rahmenfarbe (Feld "frame_class", siehe Configuration/TSconfig/Page/GridElements/).
   Kein eigenes padding mehr — die vertikale Abstandsregel oben gilt für alle
   Gridelements-Container, unabhängig von der Rahmenfarbe. */
[class*="frame-type-container"].frame-cream { background: var(--color-cream); }
[class*="frame-type-container"].frame-coral { background: var(--color-red); color: var(--color-light); }
[class*="frame-type-container"].frame-blue { background: var(--color-blue); color: var(--color-light); }
/* Karten-Abschnitt (erkannt am md_events-Kartenelement): unten fest 96px
   Padding wie ".map-section" der statischen Vorlage (auch mobil). Oben behält
   der Abschnitt sein normales Frame-Padding (64/96px). Der frühere mittige
   Trenner-Strich (::before) wurde entfernt — er passte nicht immer. */
[class*="frame-type-container"].frame-cream:has(.mdevents_map) { padding-bottom: 96px; }
/* Eyebrow-Kontrast auf farbigem Hintergrund, übernommen von der ehemaligen
   Klasse ".section-blue .eyebrow"/".section-coral .eyebrow". */
[class*="frame-type-container"].frame-blue .eyebrow { color: var(--color-red); }
[class*="frame-type-container"].frame-coral .eyebrow { color: var(--color-blue); }
/* Überschriften auf farbigem Hintergrund hell (die Basisregel h1–h4 setzt sonst
   Blau, also unlesbar auf blauem/rotem Grund) — wie ehemals .section-blue h2/h3. */
[class*="frame-type-container"].frame-blue :is(h1, h2, h3, h4, h5, h6),
[class*="frame-type-container"].frame-coral :is(h1, h2, h3, h4, h5, h6) { color: var(--color-light); }
/* H4 auf blauem Hintergrund als roter Akzent (abweichend von den übrigen
   hellen Überschriften). */
[class*="frame-type-container"].frame-blue h4 { color: var(--color-red); }
/* Links auf blauem Hintergrund hell — der Standard-Link (blau) wäre unlesbar.
   Ausgenommen sind eigenständig gestylte Link-Komponenten (Button/Kachel/News-
   Kachel), die ihre eigene Farbe/Hintergrund mitbringen. */
[class*="frame-type-container"].frame-blue a:not(.btn):not(.tile):not(.news-item):not(.news-cta) { color: var(--color-light); }
/* Hover auf blauem Grund grundsätzlich rot — wie die Footer-Links der
   statischen Vorlage (.footer a:hover). Die is-footer-Links haben zusätzlich
   ihre eigene (gleichfarbige) Hover-Regel beim is-footer-Block. */
/* @media (hover: hover) statt .no-touchevents-Klasse: der Hover greift so
   ohne JS (die no-touchevents-Klasse setzt nav.js — wird die Datei nicht
   mitdeployt, wäre der Hover tot). :active bleibt für Touch/Tap. */
@media (hover: hover) {
  [class*="frame-type-container"].frame-blue a:not(.btn):not(.tile):not(.news-item):not(.news-cta):hover { color: var(--color-red); }
}
[class*="frame-type-container"].frame-blue a:not(.btn):not(.tile):not(.news-item):not(.news-cta):active { color: var(--color-red); }
/* Button (.news-cta) auf farbigem Abschnitt (coral/blau): weißes Pill mit
   blauem Text. Das blaue Standard-Pill wäre auf blauem Grund unsichtbar und auf
   coral klobig; zusätzlich verschwände der rote Standard-Hover auf rotem Grund.
   ⚠️⚠️ HOVER: nur die SCHRIFT wechselt, die Fläche bleibt hell. Das ist die
   Regel für helle Bedienelemente auf farbigem Grund — sie funktioniert auf
   BEIDEN Untergründen, weil die Schrift immer auf dem cremefarbenen Pill sitzt
   und nie auf coral oder blau. Ein Farbwechsel der FLÄCHE ginge nicht: rot
   verschwände auf coral, blau auf blau.
   ⚠️⚠️ Bis zum 12.8.2026 setzte die Hover-Regel hier exakt die Grundfarben, es
   passierte also gar nichts — sichtbar war allein der `transform`-Lift aus der
   Basisregel. Als der Lift an diesem Tag site-weit entfernt wurde, blieb dieser
   Knopf ganz ohne Rückmeldung; genau das hat der User sofort gemeldet. Wer den
   Hover hier je wieder auf die Grundfarben setzt, macht ihn erneut wirkungslos.
   ⚠️ Kontrast: rot-dunkel auf creme sind 3,84:1 statt 9,35:1 mit Blau — dieselbe
   bewusste Abwägung wie überall sonst am 12.8.2026 („lass das vorhandene
   dunkelrot, auch wenn der Kontrast nicht ganz optimal ist"). */
[class*="frame-type-container"].frame-coral .news-cta, [class*="frame-type-container"].frame-coral .news-cta:active, [class*="frame-type-container"].frame-blue .news-cta, [class*="frame-type-container"].frame-blue .news-cta:active {
  background: var(--color-light);
  color: var(--color-blue);
}

@media (hover: hover) {

  [class*="frame-type-container"].frame-coral .news-cta:hover, [class*="frame-type-container"].frame-blue .news-cta:hover {
  background: var(--color-light);
  color: var(--color-red-dark);
}

}
/* Checkbox "tx_sprezu_sidebar" (nur beim 66/33-Zweispalter im Formular sichtbar,
   siehe ext_tables.php): rechte Spalte im selben Look wie .sidebar (siehe
   "Sidebar - Layout" weiter oben in dieser Datei) — bewusst dupliziert statt der
   Klasse "sidebar", damit diese Regel unabhängig vom Markup der Rasterspalten bleibt.
   Das Layout im Selektor schützt gegen den Fall, dass das Häkchen gesetzt
   bleibt, nachdem ein Container nachträglich auf ein anderes Verhältnis
   umgestellt wurde — displayCond blendet das Feld dann zwar aus, löscht seinen
   Wert aber nicht. */
.frame-type-container2cols.frame-layout-1.has-sidebar > div.grid-row > div.grid-column:last-child {
  background: var(--color-light);
  border: 2px solid var(--color-blue);
  padding: 28px;
  border-radius: 4px;
}
/* Letztes Element in der Seitenleiste ohne unteren Abstand, damit die Box
   nicht mit Leerraum endet (unabhängig vom CType des letzten Elements). */
.frame-type-container2cols.frame-layout-1.has-sidebar > div.grid-row > div.grid-column:last-child > :last-child { margin-bottom: 0; }
/* Überschrift in der Seitenleisten-Spalte im selben Stil wie ".sidebar h4"
   (Versalien, Sperrung, Blau) — die Kachel übernimmt bewusst nur den Box-Look
   von .sidebar, daher hier die Typografie separat nachbilden. */
.frame-type-container2cols.frame-layout-1.has-sidebar > div.grid-row > div.grid-column:last-child h4:not(.alert-title) {
  font-size: 16px; line-height: 1.4; text-transform: uppercase;
  letter-spacing: 0.1em; margin-bottom: 16px;
  color: var(--color-blue);
}
/* Fließtext in der Seitenleisten-Spalte kleiner als im Hauptinhalt,
   wie ".sidebar p" der statischen Vorlage (0.875rem/1.5 statt 16px/1.7). */
.frame-type-container2cols.frame-layout-1.has-sidebar > div.grid-row > div.grid-column:last-child p {
  font-size: 0.875rem; line-height: 1.5;
}
/* align-self:flex-start = nur so hoch wie ihr Inhalt (statt von der Flex-Zeile
   auf Spaltenhöhe gestreckt). Ohne das füllt die Seitenleiste den ganzen
   Scrollbereich und "sticky" kann nicht greifen.
   ⚠️ Gilt ab 768px, NICHT erst ab 1024px — die Regel muss überall dort stehen,
   wo die Spalten NEBENEINANDER stehen. Seit dem 50/50-Band (768–1023.98px) ist
   das schon ab 768px der Fall; bis 1.8.2026 hing sie an 1024px und der blaue
   Kasten wurde im neuen Band auf die volle Höhe der Inhaltsspalte gezogen —
   auf /fuer-schulen bei 1000px Fensterbreite 2838px Kasten für 747px Inhalt,
   also über 2000px Leerraum im Rahmen.
   MERKE: jede Regel, die das Nebeneinander voraussetzt, gehört an denselben
   Umbruchpunkt wie das Nebeneinander selbst. */
/* "sticky" hängt am selben Umbruchpunkt: sobald die Seitenleiste neben dem
   Inhalt steht, soll sie beim Scrollen stehen bleiben. Die statische Vorlage
   setzt es erst ab 1024px, dort ist die Leiste unterhalb aber GESTAPELT —
   die 1024 war also nie eine Aussage über sticky, sondern über das
   Nebeneinander. */
@media (min-width: 768px) {
  .frame-type-container2cols.frame-layout-1.has-sidebar > div.grid-row > div.grid-column:last-child {
    align-self: flex-start;
    position: sticky;
    top: 100px;
  }
}
/* Überschriften in der Seitenleiste an die BREITE DER SPALTE binden, nicht an
   die Fensterbreite. Die 20px hingen bis 1.8.2026 an @media (min-width:1024px)
   — genau dort ist die Spalte aber am schmalsten (272px, innen 216px), und
   "ANSPRECHPARTNERIN" braucht bei 20px mit 0.1em Sperrung 263px: die letzten
   Buchstaben standen rechts über dem blauen Rand. Die Rasterspalten sind
   ohnehin schon `container-type: inline-size` (siehe Karten-Block weiter
   unten), deshalb eine Container-Abfrage statt eines neuen Umbruchpunkts —
   die 768/1024-Vorgabe der statischen Vorlage bleibt unangetastet.
   270px Schwelle = das längste vorkommende Wort bei 20px (263px) plus Luft;
   darunter bleiben die 16px, bei denen dasselbe Wort 210px misst. */
@container (min-width: 270px) {
  .frame-type-container2cols.frame-layout-1.has-sidebar > div.grid-row > div.grid-column:last-child h4:not(.alert-title) {
    font-size: 20px;
  }
}
/* Notnagel gegen jedes künftige Langwort: ein Wort darf den Kasten nie
   sprengen, auch wenn die Größenstaffel oben nicht passt. `hyphens` greift
   nur mit Sprachauszeichnung (<html lang="de">), `overflow-wrap` immer. */
.frame-type-container2cols.frame-layout-1.has-sidebar > div.grid-row > div.grid-column:last-child :is(h1, h2, h3, h4, h5, h6) {
  overflow-wrap: break-word;
  hyphens: auto;
}
/* Überschriften-Ebenen, die aus eingebetteten Inhaltselementen hereinkommen:
   das Anmeldeformular bringt ein h2 mit, das sonst die Seitentypografie erbt
   — clamp(28px, 4vw, 44px), bei 1024px Fensterbreite also 40,96px, was
   "Bitte anmelden!" in der 212px-Spalte über zwei Zeilen und 90px Höhe zog.
   Gestaffelt bleiben sie, damit die Hierarchie erhalten bleibt; h4 hat weiter
   oben seine eigene Behandlung (Versalien) und ist hier ausgenommen. */
.frame-type-container2cols.frame-layout-1.has-sidebar > div.grid-row > div.grid-column:last-child :is(h1, h2) {
  font-size: 1.5rem;
  line-height: 1.25;
}
.frame-type-container2cols.frame-layout-1.has-sidebar > div.grid-row > div.grid-column:last-child h3 {
  font-size: 1.25rem;
  line-height: 1.3;
}

/* Checkbox "tx_sprezu_footer" (nur beim Vierspalter im Formular sichtbar, siehe
   ext_tables.php): Container im Look des statischen Footers (".footer" der
   Vorlage) — blauer Grund, kleinere gedämpfte Typografie (0.875rem, Creme mit
   85% Deckkraft), rote Versal-H4s. Ohne Häkchen bleibt der Vierspalter unverändert.
   Das Element wird site-weit im <footer class="footer"> gerendert
   (footerContent-Region, Konstante customtemplate.footer.contentUid) — der
   <footer> liefert bereits blauen Grund + vertikales Padding, daher hat das
   Element selbst padding:0 (die 4-Spalten-Breite kommt aus der grid-row). */
.frame.frame-type-container4cols.is-footer {
  background: var(--color-blue);
  color: var(--color-light);
  padding: 0;
}
/* Im <footer> ist der Grund schon blau — Element transparent, kein doppeltes
   Padding (die Grundregel für Container-Abschnitte: padding 64px/96px wird
   hier zurückgesetzt). */
footer.footer .frame.frame-type-container4cols.is-footer {
  padding: 0;
  background: transparent;
}
.frame.frame-type-container4cols.is-footer p {
  font-size: 0.875rem; line-height: 1.6;
  color: rgba(var(--color-light-rgb), 0.85);
}
/* :not-Kette wie bei der frame-blue-Linkregel weiter unten, damit diese
   spezifischere Regel auch greift, wenn zusätzlich frame-blue gesetzt ist. */
.frame.frame-type-container4cols.is-footer a:not(.btn):not(.tile):not(.news-item):not(.news-cta) {
  color: rgba(var(--color-light-rgb), 0.85);
}
@media (hover: hover) {
  .frame.frame-type-container4cols.is-footer a:not(.btn):not(.tile):not(.news-item):not(.news-cta):hover { color: var(--color-red); }
}
.frame.frame-type-container4cols.is-footer a:not(.btn):not(.tile):not(.news-item):not(.news-cta):active { color: var(--color-red); }
.frame.frame-type-container4cols.is-footer :is(h1, h2, h3, h5, h6) { color: var(--color-light); }
.frame.frame-type-container4cols.is-footer h4 {
  color: var(--color-red);
  font-size: 0.875rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.12em;
  margin-bottom: 16px;
}
/* Newsletter-Formular auf blauem Grund (HTML-Inhaltselement mit
   powermail-Markup: .form-group > input.form-control, Absenden-Button
   .btn.btn-primary). Ohne diese Regeln erscheint das Eingabefeld im
   Browser-Standardlook (schmal, grauer Inset-Rand) und der Button als
   nackter weißer Text (die md_events-".btn"-Basisregel setzt background:none).
   Look wie beim Formular-Framework-Button oben (".sidebar-cta"-Pille);
   Hover dunkelrot statt blau — Blau wäre auf blauem Grund unsichtbar. */
:is([class*="frame-type-container"].frame-blue, [class*="frame-type-container"].is-footer) .form-group { margin-bottom: 12px; }
:is([class*="frame-type-container"].frame-blue, [class*="frame-type-container"].is-footer) .form-control {
  display: block;
  width: 100%;
  background: #ffffff;
  border: 1px solid rgba(var(--color-blue-rgb), 0.25);
  border-radius: 4px;
  padding: 10px 12px;
  font-family: inherit;
  font-size: 0.875rem;
  color: var(--color-blue);
}
:is([class*="frame-type-container"].frame-blue, [class*="frame-type-container"].is-footer) .form-control:focus {
  outline: none;
  border-color: var(--color-red);
}
:is([class*="frame-type-container"].frame-blue, [class*="frame-type-container"].is-footer) .actions { margin-top: 8px; }
:is([class*="frame-type-container"].frame-blue, [class*="frame-type-container"].is-footer) button.btn-primary {
  display: inline-block;
  background: var(--color-red);
  color: var(--color-light);
  border: none;
  cursor: pointer;
  margin: 0;
  min-height: 0;
  padding: 12px 28px;
  font-family: inherit;
  font-weight: 700;
  font-size: 0.875rem;
  border-radius: 999px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  transition: background 0.2s, color 0.2s;
}
@media (hover: hover) {
  :is([class*="frame-type-container"].frame-blue, [class*="frame-type-container"].is-footer) button.btn-primary:hover { background: var(--color-red-dark); }
}
:is([class*="frame-type-container"].frame-blue, [class*="frame-type-container"].is-footer) button.btn-primary:active { background: var(--color-red-dark); }

/* gridphotobento — Bento-Bildraster (7 Bilder) als Gridelement. Überträgt die
   Optik von ".photo-grid.photo-bento" (siehe "Foto-Bento-Grid") auf die 7
   .grid-column des Containers: die Rasterzeile wird zum CSS-Grid, jede Spalte
   zu einer Bento-Zelle (blaue Platzhalterfläche + Cover-Bild). Das Bild-
   Inhaltselement in jeder Zelle wird über die verschachtelten ce-Wrapper hinweg
   auf 100% Höhe gestreckt. */
/* Das Backend-Layout liefert ZWEI Rasterzeilen (Bilder 1-4 in .grid-row-1,
   Bilder 5-7 in .grid-row-2, siehe TSconfig/Page/GridElements) — sieben
   Backend-Spalten nebeneinander würden das Seitenmodul sprengen. Der
   Umbruch ist eine reine Backend-Maßnahme: im Frontend werden die beiden
   Zeilen per display:contents aufgelöst, der Container selbst wird zum
   CSS-Grid und alle 7 Bilder werden explizit platziert — die Optik
   (inkl. der Verzahnung: Bild 6 ragt eine Rasterzeile nach oben) bleibt
   exakt die der statischen Vorlage.
   Da der Container die volle Breite behält (blauer Hintergrund), bilden
   die äußeren Grid-Spalten die Seitenränder: fester Randwert + Grid-Gap
   ergeben zusammen das übliche seitliche Padding (12+12=24px mobil,
   48+16=64px ab 768px). Reihe 1 des Grids gehört dem Container-Header
   (Eyebrow/Überschrift), darunter folgen die Bento-Reihen. */
.frame.frame-type-containerphotobento {
  display: grid;
  grid-template-columns: 12px repeat(2, minmax(0, 1fr)) 12px;
  grid-auto-rows: 130px;
  gap: 12px;
}
.frame.frame-type-containerphotobento > div.grid-row { display: contents; }
/* Header-Zeile: automatische Höhe, Inhaltsbreite ohne eigenes Padding
   (die Grid-Randspalten übernehmen die Einrückung). */
.frame.frame-type-containerphotobento { grid-template-rows: auto; }
.frame.frame-type-containerphotobento > header {
  grid-column: 2 / -2;
  grid-row: 1;
  max-width: none;
  margin: 0;
  padding: 0;
}
.frame.frame-type-containerphotobento > div.grid-row > div.grid-column {
  background: var(--color-blue);
  position: relative;
  overflow: hidden;
  border-radius: 4px;
  margin: 0;
}
/* Mobil (2 Bild-Spalten): explizite Plätze — identisch zum Ergebnis des
   früheren grid-auto-flow:dense auf einer einzelnen Rasterzeile. */
.frame.frame-type-containerphotobento > div.grid-row-1 > div.grid-column:nth-child(1) { grid-column: 2 / 4; grid-row: 2 / 4; }
.frame.frame-type-containerphotobento > div.grid-row-1 > div.grid-column:nth-child(2) { grid-column: 2 / 3; grid-row: 4 / 6; }
.frame.frame-type-containerphotobento > div.grid-row-1 > div.grid-column:nth-child(3) { grid-column: 3 / 4; grid-row: 4 / 5; }
.frame.frame-type-containerphotobento > div.grid-row-1 > div.grid-column:nth-child(4) { grid-column: 3 / 4; grid-row: 5 / 6; }
.frame.frame-type-containerphotobento > div.grid-row-2 > div.grid-column:nth-child(1) { grid-column: 2 / 4; grid-row: 6 / 8; }
.frame.frame-type-containerphotobento > div.grid-row-2 > div.grid-column:nth-child(2) { grid-column: 2 / 3; grid-row: 8 / 10; }
.frame.frame-type-containerphotobento > div.grid-row-2 > div.grid-column:nth-child(3) { grid-column: 3 / 4; grid-row: 8 / 10; }
/* Bild-Inhaltselement je Zelle vollflächig füllen (ce-Wrapperkette + figure). */
.frame.frame-type-containerphotobento > div.grid-row > div.grid-column .frame,
.frame.frame-type-containerphotobento > div.grid-row > div.grid-column .ce-textpic,
.frame.frame-type-containerphotobento > div.grid-row > div.grid-column .ce-gallery,
.frame.frame-type-containerphotobento > div.grid-row > div.grid-column .ce-outer,
.frame.frame-type-containerphotobento > div.grid-row > div.grid-column .ce-inner,
.frame.frame-type-containerphotobento > div.grid-row > div.grid-column .ce-row,
.frame.frame-type-containerphotobento > div.grid-row > div.grid-column .ce-column,
.frame.frame-type-containerphotobento > div.grid-row > div.grid-column figure { height: 100%; margin: 0; }
.frame.frame-type-containerphotobento > div.grid-row > div.grid-column img {
  display: block;
  width: 100%; height: 100%;
  object-fit: cover; object-position: center;
  transition: transform 0.4s ease;
}
@media (hover: hover) {

  .frame.frame-type-containerphotobento > div.grid-row > div.grid-column:hover img { transform: scale(1.04); }

}
@media (min-width: 768px) {
  /* Randspalten 48px + Gap 16px = 64px seitliches Padding wie überall. */
  .frame.frame-type-containerphotobento {
    grid-template-columns: 48px repeat(2, minmax(0, 1fr)) 48px;
    grid-auto-rows: 160px;
    gap: 16px;
  }
}
@media (min-width: 1024px) {
  /* 4 Bild-Spalten à max. 306px = 1272px Inhaltsbreite (wie 1400px-Container
     minus 2×64px Padding); die flexiblen Randspalten zentrieren den Inhalt
     auf breiten Viewports exakt wie der frühere max-width-Container. */
  .frame.frame-type-containerphotobento {
    grid-template-columns: minmax(48px, 1fr) repeat(4, minmax(0, 306px)) minmax(48px, 1fr);
    grid-template-rows: auto repeat(6, 140px);
    grid-auto-rows: 140px;
  }
  /* Platzierung wie die statische Vorlage (Bild-Spalten = Grid-Linien 2-6,
     Reihe 1 = Header, Bento-Reihen 2-7) — inkl. Verzahnung: Bild 6 beginnt
     eine Rasterzeile über der unteren Gruppe (Reihe 5) und füllt damit die
     vierte Reihe der dritten Spalte unter Bild 2. */
  .frame.frame-type-containerphotobento > div.grid-row-1 > div.grid-column:nth-child(1) { grid-column: 2 / 4; grid-row: 2 / 6; }
  .frame.frame-type-containerphotobento > div.grid-row-1 > div.grid-column:nth-child(2) { grid-column: 4 / 5; grid-row: 2 / 5; }
  .frame.frame-type-containerphotobento > div.grid-row-1 > div.grid-column:nth-child(3) { grid-column: 5 / 6; grid-row: 2 / 4; }
  .frame.frame-type-containerphotobento > div.grid-row-1 > div.grid-column:nth-child(4) { grid-column: 5 / 6; grid-row: 4 / 6; }
  .frame.frame-type-containerphotobento > div.grid-row-2 > div.grid-column:nth-child(1) { grid-column: 2 / 4; grid-row: 6 / 8; }
  .frame.frame-type-containerphotobento > div.grid-row-2 > div.grid-column:nth-child(2) { grid-column: 4 / 5; grid-row: 5 / 8; }
  .frame.frame-type-containerphotobento > div.grid-row-2 > div.grid-column:nth-child(3) { grid-column: 5 / 6; grid-row: 6 / 8; }
}
/*** END Grid Elements ***/
/**** END - FROM custom_md2022 - styles-defaultscreen.css ****/

/**** START - FROM custom_md2022 - styles-plugins.css ****/
/*** START md_events ***/
/** Panel **/
.events-filter-panel { margin-bottom: 3rem; padding: 2rem 1rem; background-color: var(--color-blue); color: white; }
.filter-panel-heading h2 { margin-top: 0; }
.panel-group { display: inline-flex; }
.panel { position: relative; flex: 1 1 25%; min-width: 220px; max-width: 280px; margin-right: 20px; }

@media only screen and (max-width:1200px) {
  .panel-group { flex-wrap: wrap; }
  .panel { flex: 1 1 calc(50% - 20px); min-width: calc(50% - 20px); }
  .panel-group > div:nth-last-child(2), .panel-group > div:last-child { margin-top: 20px; }
  .panel-group > div:nth-child(2n) { margin-right: 0; }
}
@media only screen and (max-width:800px) and (orientation:portrait),only screen and (max-width:800px) and (orientation:landscape) {
  .panel { flex: 1 1 100%; min-width: 100%; margin-top: 20px; margin-right: 0; }
}

.panel-title { margin-bottom: .5em; }
/* .panel-collapsible .panel-button (SVG-Caret aus icon_arrow-right_blue/
   icon_faq-closed) entfernt: das Element gibt es im sprezu-Filter-Markup nicht
   (Filter nutzt .filterbtn + FontAwesome-Caret, siehe .mdevents_listextended). */
.panel-collapsible .panel-input { padding: 10px 8px; }
.panel-collapsible .panel-input:focus { border: none; }
.panel-collapsible .panel-input::placeholder { color: #000000; font-family: "Source Sans Pro",sans-serif; font-weight: 700/*600*/; }
.panel-list-group { list-style:none; position:absolute; top:72px; left:0; width:100%; margin-bottom:0; background-color:#f8f8f8;overflow:hidden; transition:max-height 400ms; color:#000000; font-weight:700/*600*/; z-index:1002; }
.panel:not(.collapsed) .panel-list-group:has(li:not(.hidden)) { border-top: 1px solid #aaa; }
.collapsed .panel-list-group { max-height: 0; border: none; }
.panel-list-item { margin: 0; padding: 2px 8px; cursor: pointer; }
/* Unterkategorien im Kategoriefilter: eingerueckt unter ihrer Elternkategorie,
   Pfeil als Schmuck per ::before (nicht im Text, damit dataset.label der reine
   Name bleibt). Nur vorhanden, wenn im Plugin der Schalter "Unterkategorien
   unter ihrer Elternkategorie" gesetzt ist. */
.panel-list-item--sub { padding-left: 1rem; }
/* margin-left gleicht einen optischen Versatz aus, keinen Abstand: Die Glyphe
   wird um 90 Grad gedreht, wodurch ihr senkrechter Abstand zur Grundlinie zu
   einem waagerechten wird. Gemessen beginnt die Tinte des Pfeils 2px LINKS
   seines Kastens, die des "D" von "Dialoge" dagegen 1px rechts davon — der
   Pfeil stand also 3px weiter links als die Kategorienamen darueber und
   darunter. Beim Aendern der Schriftgroesse neu messen. */
.panel-list-item--sub::before { content: "\f3bf"; font-family: "Font Awesome 6 Free"; font-weight: 900; font-size: 0.8em; display: inline-block; transform: rotate(90deg); margin-left: 0.1875rem; margin-right: 0.5rem; opacity: 0.55; }
.panel-list-item.emphasized { background-color: lightgoldenrodyellow; }

/* START - md_events - Karten-Zoom- & Dialog-Schließen-Buttons */
/* Zoom-Buttons der Karte und Schließen-Button des Termin-Dialogs im
   S&Z-Blau statt des MD-Standardblaus (#1271ee aus listMap.css); Hover in
   der roten Akzentfarbe wie bei den übrigen Buttons der Vorlage (vgl.
   .news-cta:hover). listMap.css wird NACH dieser Datei geladen — der
   body-Präfix hebt die Spezifität über die dortigen Regeln, ohne sie
   inhaltlich zu duplizieren. */
body .mdevents_map .map_container .leaflet-legend-zoom-control > button,
body dialog.dialog-event .btn-close-container > button.close { background: var(--color-blue); }
.no-touchevents body .mdevents_map .map_container .leaflet-legend-zoom-control > button:hover,
body .mdevents_map .map_container .leaflet-legend-zoom-control > button:active,
.no-touchevents body dialog.dialog-event .btn-close-container > button.close:hover,
body dialog.dialog-event .btn-close-container > button.close:active { background: var(--color-red-dark); }
/* END - md_events - Karten-Zoom- & Dialog-Schließen-Buttons */

/* START - md_events - Termin-Dialog Typografie & Abstände */
/* Datum/Uhrzeit und Titel stehen zusammen in der H2 des Dialogs (listMap.css)
   und waren gleich groß. Hier: Titel größer (24px wie H3 der Vorlage), die
   Datumszeile darüber auf Fließtextgröße in der roten Akzentfarbe (analog
   ".news-source" — rotes Label über blauer Überschrift). Absätze im
   Dialog-Body bekommen den 16px-Rhythmus, der im Dialog schon verwendet
   wird (Kategorie-Label und Button haben 1rem Abstand). Der body-Präfix
   hebt die Spezifität über das später geladene listMap.css. */
body dialog.dialog-event .dialog-header h2 { font-size: 24px; line-height: 1.2; }
body dialog.dialog-event .dialog-header h2 span.datetime {
  font-size: 1rem;
  color: var(--color-red);
  margin-bottom: 4px;
}
body dialog.dialog-event .dialog-body p { margin-bottom: 16px; }
/* END - md_events - Termin-Dialog Typografie & Abstände */

/** List Extended **/
/* Aus custom_md2022 übernommen und auf die S&Z-Palette umgestellt: das
   Original stammt von der dunkelblauen MD-Hauptseite (weiße Schrift, MD-Blau
   #003567/#1271ee) — auf dem hellen S&Z-Grund war die Filterleiste unlesbar.
   Optik angelehnt an ".events-filter-panel"/".termine-table" der statischen
   Vorlage (Creme-Box mit blauem 12%-Rand, blaue Schrift, roter Hover). */
/* Event Filter Panel */
.mdevents_listextended #eventsFilterPanel.overlayed { position:relative; z-index:1002;}
.mdevents_listextended .events-filter-panel {
  display:flex; gap:0 1rem; margin-bottom:1.5rem; padding:0 0 0 1rem; position:relative;
  background: var(--color-light);
  border: 1px solid rgba(var(--color-blue-rgb), 0.12);
  border-radius: 4px;
  color: var(--color-blue);
}
.mdevents_listextended .filter-panel-heading { align-items:center; color:var(--color-blue); display:flex; font-size:1.125rem; font-weight:700; line-height:normal; min-height:45px; padding:0.5rem 0;}
.mdevents_listextended .panel-group { align-items:center; display:flex; justify-content:flex-start; visibility:visible; }
.mdevents_listextended .panel-group:last-child { margin: 0 0 0 auto; }
.mdevents_listextended .panel { margin:0; max-width:unset; min-width:unset; }
.mdevents_listextended .panel:last-child .panel-input-group, .mdevents_listextended .panel:last-child .panel-input-group .filterbtn-reset { margin:0; }
.mdevents_listextended .panel-input-group { align-items:center; display:flex; justify-content:space-between; margin-right:1rem; }
.mdevents_listextended .overlay { position:fixed; top:0; left:0; width:100%; height:100%; background-color:#000000cc; z-index:1001; }
.mdevents_listextended .filterbtn-reset-all, .mdevents_listextended .filterbtn-list-view , .mdevents_listextended .filterbtn-grid-view { background:none!important; border:none; color:var(--color-blue); font-weight:700; text-decoration:underline; transition:0.4s; white-space:nowrap; }
.no-touchevents .mdevents_listextended .filterbtn-reset-all:hover, .no-touchevents .mdevents_listextended .filterbtn-list-view:hover, .no-touchevents .mdevents_listextended .filterbtn-grid-view:hover, .mdevents_listextended .filterbtn-reset-all:active, .mdevents_listextended .filterbtn-list-view:active, .mdevents_listextended .filterbtn-grid-view:active { color:var(--color-red-dark); }

/* Drop Down */
.mdevents_listextended .panel-list-group { background-color:transparent; left:0; top:45px; transition:none; padding:0; width:auto; }
.mdevents_listextended .panel-list-group:after { content:""; display:block; height:100px; width:100%; }
.mdevents_listextended .panel-collapsible.collapsed .panel-list-group { display:none; visibility:hidden; }
/* Ausgeklapptes Dropdown als abgesetzte Karte (nur wenn es sichtbare Einträge
   gibt): weißer Grund + Kontur + Schatten, damit es sich klar vom Hintergrund
   abhebt. Werte passend zum bisherigen CSS (Item-Border rgba(blue,0.12),
   Item-Schatten 0 4px 24px …). */
.mdevents_listextended .panel:not(.collapsed) .panel-list-group:has(li:not(.hidden)) {
  background:#ffffff;
  border:1px solid rgba(var(--color-blue-rgb), 0.12);
  box-shadow:0 8px 24px rgba(var(--color-blue-rgb), 0.15);
}
.mdevents_listextended .panel-list-item { background-color:#ffffff; color:var(--color-blue); font-size:1rem; padding:0.5rem 1rem; transition:0.4s; white-space:nowrap; }
/*.mdevents_listextended .panel-list-button { display:block; width:100%; padding:0.25rem 1rem; border:none; background:none; font:inherit; color:inherit; text-align:left; white-space:nowrap; cursor:pointer; }*/
.no-touchevents .mdevents_listextended .panel-list-item:hover, .mdevents_listextended .panel-list-item:active { color:var(--color-red-dark); }
/* Der Winkelpfeil behaelt beim Ueberfahren seine Farbe — sonst wanderte er mit
   der Textfarbe nach var(--color-red) mit. Die Angabe steht direkt am ::before,
   damit sie die geerbte Hover-Farbe der Zeile sticht. */
.mdevents_listextended .panel-list-item--sub::before { color:var(--color-blue); }
/* Kind enger an seine Elternzeile ruecken: Abstand Eltern->Kind 0.5rem gegen
   1rem zwischen gleichrangigen Zeilen. Die Zusammengehoerigkeit ist damit schon
   am Abstand ablesbar, nicht erst am Pfeil. Ein Kind VOR einer neuen
   Elternzeile behaelt seinen vollen unteren Abstand. */
.mdevents_listextended .panel-list-item:has(+ .panel-list-item--sub) { padding-bottom:0.25rem; }
.mdevents_listextended .panel-list-item--sub { padding-top:0.25rem; }
.mdevents_listextended .panel-list-item:first-child { padding-top:0.75rem; }
.mdevents_listextended .panel-list-item:last-child { padding-bottom:0.75rem; }

/* Filter Button + View Button */
.mdevents_listextended .filterbtn::before { content:"\f0d7"; font-family:'Font Awesome 6 Free'; font-size:1rem; left:0; position:absolute; transition:.4s; }
.mdevents_listextended .collapsed .filterbtn::before { content:"\f0da"; }
.mdevents_listextended .filterbtn, .mdevents_listextended .viewbtn { align-items:center; background:none; border:none; color:var(--color-blue); display:inline-flex; font-size:1.125rem; font-weight:700; margin-right:0; min-height:45px; padding:0.5rem 0 0.5rem 0.875rem; position:relative; transition:color .4s; white-space:nowrap; }
.mdevents_listextended .selected .filterbtn { margin-right:0.5rem; }
.mdevents_listextended .viewbtn { padding:0 0.5rem; }
.mdevents_listextended .map-view .viewbtn { padding:0 1rem 0 0.5rem; }
/* map-view hidden (no map content element on the page, see ListExtended-EventFilter.js init()): grid-view becomes the last visible toggle and needs its own trailing padding */
.mdevents_listextended .grid-view.no-map-view .viewbtn { padding-right:1rem; }
.no-touchevents .mdevents_listextended .filterbtn:hover, .no-touchevents .mdevents_listextended .viewbtn:hover, .mdevents_listextended .filterbtn:active, .mdevents_listextended .viewbtn:active, .mdevents_listextended .viewbtn.active { color:var(--color-red-dark); }
.mdevents_listextended .viewbtn.active { cursor:default; }
.mdevents_listextended .list-view button::after, .mdevents_listextended .grid-view button::after, .mdevents_listextended .map-view button::after { font-family:'Font Awesome 6 Free'; font-size:1.5rem; margin-left:8px; transition:.4s; }
.mdevents_listextended .list-view button::after { content:"\f00b"; }
.mdevents_listextended .grid-view button::after { content:"\f84c"; }
.mdevents_listextended .map-view button::after { content:"\f5a0"; }
.mdevents_listextended .map-view .viewbtn {  }
.mdevents_listextended .map-view .viewbtn.active { background-color:var(--color-blue); color:var(--color-light); cursor:default; margin-left:0.5rem; padding:0 1rem; }

/* Filter Reset Button */
/* ⚠️⚠️ SEIT 12.8.2026 EIN KREIS, KEIN PILL (Wunsch des Users). Vorher: weisses Pill mit
   blauem 25-%-Rahmen und blauem Pfeil. Die Filterleiste steht auf dem HELLEN Seitengrund
   (die Knoepfe daneben haben background:none und blaue Schrift), der weisse Knopf war
   dort nur an seinem blassen Rahmen zu ahnen - dieselbe Ursache wie beim Reset der
   Kartenlegende, den der User zuerst gemeldet hat.
   ⚠️ md bleibt bewusst beim weissen Pill: dessen Filterleiste ist DUNKEL (weisse Schrift,
   s. .filterbtn-reset-all in custom_md2022/…/styles-plugins.css), dort ist Weiss die
   sichtbare Wahl. Gleiches Aussehen waere hier das Gegenteil von gleicher Wirkung.
   ⚠️ Anders als bei der Karte gibt es KEINE gemeinsame Grundfassung in md_events -
   .filterbtn-reset ist in custom_md2022 und hier jeweils vollstaendig definiert. Die
   Masse muessen deshalb ausgeschrieben stehen, sie kommen von nirgendwo her.
   ⚠️ KONTRAST: creme auf --color-blue = 9,35:1. Der rote Hover ist die Hausfarbe fuer
   genau diese Knoepfe (Zoomknoepfe der Karte, Dialog-Schliessen, Kategoriefilter-Reset),
   kommt mit creme aber nur auf 2,79:1 und reisst damit die 3:1 fuer grafische
   Bedienelemente. Bewusst belassen, weil die Site es ueberall so macht; wer die 3:1
   halten will, nimmt --color-red-dark (3,84:1) - dann an ALLEN diesen Knoepfen. */
.mdevents_listextended .filterbtn-reset::before { color:var(--color-light); content:"\f2ea"; font-family:'Font Awesome 6 Free'; font-size:0.875rem; transition:.4s; }
.mdevents_listextended .filterbtn-reset { align-items:center; background:var(--color-blue); border:none; border-radius:50%; cursor:pointer; display:none; height:1.5rem; justify-content:center; line-height:1; margin:0; padding:0; transition:.4s; visibility:hidden; width:1.5rem; }
.no-touchevents .mdevents_listextended .filterbtn-reset:hover, .mdevents_listextended .filterbtn-reset:active { background:var(--color-red-dark); }
/* ⚠️ inline-FLEX, nicht inline-block: erst damit zentrieren align-items/justify-content
   den Pfeil im Kreis. Mit inline-block sass er unten links. */
.mdevents_listextended .selected .filterbtn-reset { display:inline-flex; visibility:visible; }
/* Fokusring: AUSSEN, wie bei den anderen kleinen Symbolknoepfen (button.ics/.route).
   ⚠️ Bewusst NICHT der Innenring: der Knopf ist ein Kreis von 24x24px, ein 5px-Band
   nach innen frisst ihn auf. Der alte Ring (3px --color-blue, offset +2px) lag schon
   aussen und war richtig platziert, kannte aber --focus-ring-* noch nicht.
   ⚠️ Nachgemessen 2026-08-13: der Knopf ist selbst blau (23,66,127) und sitzt auf
   WEISS (255,255,255). Genau deshalb darf ".events-filter-panel" NICHT in der
   Ausnahmeliste stehen: mit Rot waeren es 2,96.
   ⚠️⚠️ HIER STAND "das farbige Band traegt dort mit 9,90:1". Das war die Zahl fuer
   Blau gegen Weiss, sie galt aber fuer den INNENring — der Knopf ist erst am
   2026-08-14 auf den Aussenring umgezogen, und dabei kippt die Rechnung.
   Am 2026-08-14 zum ersten Mal am aufgeklappten Knopf gemessen (24x24, padding 0,
   Glyphe U+f2ea mit 14x14 Tinte, also 5px Luft je Seite — der Aussenring bleibt
   richtig). Die drei Kanten von innen nach aussen:
     Knopf (blau) | Band (blau)   1,00  — unsichtbar
     Band (blau)  | Hof (weiss)   9,90
     Hof (weiss)  | Seite (weiss) 1,00  — unsichtbar
   Sichtbar war damit nur, dass die blaue Scheibe von 24 auf 28px waechst — ein
   GROESSENwechsel (der die 3:1 gegen die Seite mit 9,35 zwar haelt), aber kein
   eigener Ring wie ueberall sonst.
   ✅ 2026-08-14 auf Entscheidung des Nutzers VERTAUSCHT: die outline traegt jetzt
   die Hof-Farbe und der Hof die Ringfarbe. Aus blau|weiss|weiss wird
   weiss|blau|weiss, und alle drei Kanten tragen:
     Knopf (blau) | Band (weiss)  9,90
     Band (weiss) | Hof (blau)    9,90
     Hof (blau)   | Seite (weiss) 9,35
   ⚠️ Die beiden Variablen sind hier also ABSICHTLICH ueber Kreuz eingesetzt. Wer
   das "aufraeumt", nimmt dem Knopf den Ring wieder weg. Der Grund ist, dass der
   Knopf die Ringfarbe selbst als Flaeche traegt — das gilt nur fuer ihn und fuer
   nichts anderes in dieser Datei. */
.mdevents_listextended .filterbtn-reset:focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-halo-color);
  outline-offset: 0;
  box-shadow: 0 0 0 var(--focus-ring-halo) var(--focus-ring-color);
}

/* Grid view */
.mdevents_listextended .custom-tile-item a { height:100%; }
.mdevents_listextended .custom-tile-item-meta { display:flex; align-items:center; justify-content:flex-start; padding:0.25rem 1rem 0.25rem 1rem; }
.mdevents_listextended .custom-tile-item-meta .datetime { color:#ffffff; font-size:1.125rem; }
.mdevents_listextended .custom-tile-item-meta .date { /*display:block;*/ font-weight:700; margin-right:0.5rem; }
.mdevents_listextended .custom-tile-item-meta .time { font-size:1rem; }
.mdevents_listextended .custom-tile-item-text { padding:0.75rem 1rem 1rem 1rem; }
.mdevents_listextended .custom-tile-item-place { display:inline-block; font-size:1.125rem; margin-bottom:0.5rem; max-width:235px;}
.mdevents_listextended .custom-tile-item-place span:before { color:var(--color-blue); content: "\f3c5"; font-family: 'Font Awesome 6 Free'; font-size:1rem; font-style: normal; font-variant: normal;line-height:1; margin-right:0.5rem; text-rendering:auto; }
.mdevents_listextended .custom-tile-item-category { margin-bottom:5px; }
.mdevents_listextended .custom-tile-item-text h2 { margin:0; }
.mdevents_listextended a .custom-tile-item-text header { color:var(--color-blue); transition:0.4s; text-decoration:none; }
/* Bug - Überlagerung des Dropdowns gibt bei Klick auf <li> den :hover auf das Unterelement (Kachel/Link) weiter, wodurch ein angeklickt Zustand auf dem Phone entsteht - deswegen .no-touchevents und :active */
.no-touchevents .mdevents_listextended a:hover .custom-tile-item-text header, .mdevents_listextended a:active .custom-tile-item-text header { color:var(--color-red-dark); text-decoration:underline; }
.no-touchevents .mdevents_listextended a:hover .custom-tile-item-meta, .mdevents_listextended a:active .custom-tile-item-meta { background-color:var(--color-blue-secondary); transition:0.4s; }
.no-touchevents .mdevents_listextended a:hover .custom-tile-item-meta.featured_event, .mdevents_listextended a:active .custom-tile-item-meta.featured_event { background-color:var(--color-red-dark); }

/* List view — Tabellen-Look wie ".termine-table" der statischen Vorlage:
   Creme-Box mit blauem 12%-Rand, Versal-Spaltenköpfe auf 5%-Blau, zarte
   Zeilentrenner, Zebra/Hover in Blau-Tönen, Datum blau + Uhrzeit rot. */
.mdevents_listextended .events-table { background:var(--color-light); border:1px solid rgba(var(--color-blue-rgb), 0.12); border-collapse:collapse; height:100%; width:100%; }
.mdevents_listextended .events-table thead th { background:rgba(var(--color-blue-rgb), 0.05); border-bottom:1px solid rgba(var(--color-blue-rgb), 0.12); color:var(--color-blue); cursor:pointer; font-size:0.75rem; font-weight:700; letter-spacing:0.08em; padding:14px 20px; text-transform:uppercase; transition:0.4s; vertical-align:middle; white-space:nowrap; }
.no-touchevents .mdevents_listextended .events-table thead th:hover, .mdevents_listextended .events-table thead th:active { color:var(--color-red-dark); }
.mdevents_listextended .events-table thead th.sortable::before { content:"\f0da"; display:inline-block; font-family:'Font Awesome 6 Free'; font-size:1rem;  transition:.4s; width:0.875rem; }
.mdevents_listextended .events-table thead th.sort-asc::before { content:"\f0d8"; }
.mdevents_listextended .events-table thead th.sort-desc::before { content:"\f0d7"; }
.mdevents_listextended .events-table tbody tr { background:transparent; border:0; border-bottom:1px solid rgba(var(--color-blue-rgb), 0.08); color:var(--color-blue); height:100%;}
.mdevents_listextended .events-table tbody tr:last-child { border-bottom:none; }
.mdevents_listextended .events-table tbody tr:nth-child(2n) { background:rgba(var(--color-blue-rgb), 0.03); }
.no-touchevents .mdevents_listextended .events-table tbody tr:hover { background:rgba(var(--color-blue-rgb), 0.06); }
.mdevents_listextended .events-table tbody tr .date { color:var(--color-blue); display:block; font-size:0.875rem; font-weight:700; line-height:1.4; margin-bottom:2px; }
.mdevents_listextended .events-table tbody tr .time { color:var(--color-red); font-size:0.8125rem; font-weight:700; }
.mdevents_listextended .events-table tbody tr a { color:var(--color-blue); font-size:16px; font-weight:700; }
.no-touchevents .mdevents_listextended .events-table tbody tr a:hover, .mdevents_listextended .events-table tbody tr a:active { color:var(--color-red-dark); }
.mdevents_listextended .events-table tbody td { font-size:0.875rem; padding:14px 20px; vertical-align:middle; }
.mdevents_listextended .events-table tbody td.featured_event { padding:0;  }
.mdevents_listextended .events-table tbody td.featured_event .datetime { background-color:var(--color-red); display:inline-block; padding:14px 20px; }
.mdevents_listextended .events-table tbody td.featured_event .date, .mdevents_listextended .events-table tbody td.featured_event .time { color:#ffffff; white-space:nowrap; }

.events-table-actions { align-items:stretch; display:flex; height:100%; justify-content:flex-end; padding:0!important; position:relative; white-space:nowrap; }
.events-table-actions > a { align-items:center; display:flex; height:100%; justify-content:center; margin-left:1.5rem; text-decoration:none; }
.events-table-actions > a:last-child { margin-left:0; }
.events-table-actions button { background:none; border:none;  }
.events-table-actions button::before { background:none; border:none; color:var(--color-blue); font-family:'Font Awesome 6 Free'; font-size:1.75rem; transition:.4s; }
.no-touchevents .events-table-actions button:hover::before, .events-table-actions button:active::before { color:var(--color-red-dark); }
.events-table-actions button.ics::before { content:"\f271"; }
.events-table-actions button.route::before { content:"\f3c5"; }
.events-table-actions button.share::before { content:"\f064"; }

/* START - List Extended - S&Z-Filter- und Kartenoptik */
/* Optik der statischen Termine-Seite: Filter-Dropdowns als weiße Pillen
   (".events-filter-select"), Ansichtsumschalter als graue Pillengruppe
   (".events-view-switch"), Terminkacheln als Creme-Karten (".termin-card")
   mit blauer Ort-Pille, rotem Datums-Badge oben rechts und "Mehr Infos"-Pille.
   Steht NACH den übernommenen md_events-Regeln oben und überschreibt sie. */

/* Filter-Dropdowns als Pillen. Padding/Gap wie ".events-filter-panel" der
   statischen Vorlage (16px 20px, gap 24px), flex-wrap für schmale Breiten.
   justify-content:flex-start überschreibt das space-between aus dem md_events-
   Basis-CSS (das "Filter:" und die Dropdowns auseinanderriss). Heading +
   Dropdowns liegen so links zusammen, der Umschalter wird per margin-left:auto
   nach rechts geschoben. */
/* nowrap: Heading, Filter-Gruppe und Umschalter bleiben in EINER Flex-Zeile;
   der Umschalter wird per margin-left:auto rechtsbündig gehalten. Wird es eng,
   brechen NUR die Filter-Pillen intern um (.panel-group.one ist flex-wrap:wrap)
   – der Umschalter fällt so nie als rechtsbündiger Block in eine leere Zeile. */
.mdevents_listextended .events-filter-panel { align-items:center; justify-content:flex-start; flex-wrap:nowrap; gap:16px 12px; padding:16px 20px; }
/* md_events zwingt die Dropdown-Container auf flex:1 1 calc(50% - 20px) →
   sie füllen die halbe Zeile und brechen in ein 2×2-Raster um. Zurück auf
   Inhaltsbreite (wie die kompakten Selects der statischen Vorlage), dann
   liegen die vier Filter in EINER umbrechenden Reihe. */
.mdevents_listextended .events-filter-panel .panel { flex:0 0 auto; width:auto; margin:0; }
.mdevents_listextended .panel-group.one { display:flex; flex-wrap:wrap; gap:12px; }
.mdevents_listextended .panel-input-group {
  background:#ffffff;
  border:1px solid rgba(var(--color-blue-rgb), 0.25);
  border-radius:999px;
  padding:0 16px;
  transition:border-color 0.2s;
}
.no-touchevents .mdevents_listextended .panel-input-group:hover { border-color:var(--color-red-dark); }
.mdevents_listextended .filterbtn { font-size:0.875rem; min-height:38px; padding:0.5rem 1.25rem 0.5rem 0; }
/* Caret ans Ende der Pille (statische Selects haben den Pfeil rechts) */
.mdevents_listextended .filterbtn::before { left:auto; right:0; }
.mdevents_listextended .panel-list-group { top:44px; border-radius:8px; overflow:hidden; }
/* 100px-Platzhalter (:after der Basisregel) entfernen — sonst umschlösse die
   Dropdown-Karte 100px Leerraum unter dem letzten Eintrag. */
.mdevents_listextended .panel-list-group:after { content:none; }

/* Ansichtsumschalter als graue Pillengruppe (".events-view-switch" der
   Vorlage). Selektoren bewusst mit ".events-filter-panel" davor, damit sie
   spezifischer sind als die md_events-Media-Queries weiter unten (die dem
   letzten Panel-Kind sonst padding-left:1rem geben → Lücke vor "Kacheln",
   wenn "Liste" ausgeblendet ist, und die Pillen-Optik zerstören). */
/* Kein margin-left:auto: das erzwingt in flex-wrap einen vorzeitigen Umbruch
   des Umschalters auf eine zweite Zeile, auch wenn er neben die Dropdowns
   passt. Der Umschalter fließt stattdessen direkt hinter die Dropdowns und
   bleibt so bei ausreichender Breite in EINER Zeile. */
.mdevents_listextended .events-filter-panel .panel-group.two {
  background:rgba(var(--color-blue-rgb), 0.06);
  border-radius:999px;
  padding:4px;
  gap:4px;
  /* Umschalter nie intern umbrechen lassen (er wurde vom flex-Panel unter
     seine Inhaltsbreite gestaucht → ein Button rutschte in eine 2. Zeile,
     Gruppe wurde 60 statt 40px hoch). Die 3 Buttons dürfen nie umbrechen. */
  flex-shrink:0;
  flex-wrap:nowrap;
  /* margin-left:auto schiebt den Umschalter an den rechten Rand. In der
     nowrap-Leiste (siehe .events-filter-panel) erzwingt das KEINEN Umbruch
     mehr – bei Platzmangel brechen stattdessen die Filter-Pillen intern um,
     der Umschalter bleibt rechts und vertikal zentriert. */
  margin-left:auto;
}
.mdevents_listextended .events-filter-panel .panel-group.two .viewbtn {
  border-radius:999px;
  color:rgba(var(--color-blue-rgb), 0.6);
  font-size:0.875rem;
  min-height:0;
  margin:0;
  padding:8px 14px;
}
/* :not(.active), damit die AKTIVE (blaue) Pille bei Hover nicht die Textfarbe
   der inaktiven erbt. Die aktive Ansicht ist ohnehin nicht erneut anklickbar
   (cursor:default) und bekommt bewusst gar keinen Hover.
   ⚠️ Seit 12.8.2026 rot-dunkel statt Blau: die inaktiven Pillen tragen ein
   gedämpftes Blau (0.6), und der alte Hover machte daraus nur volles Blau —
   derselbe Farbton, nur kräftiger. Jetzt dieselbe Antwort wie bei allen hellen
   Bedienelementen der Site. Die Events-Filterleiste direkt daneben machte es
   schon immer so; genau dieser Unterschied ist dem User aufgefallen. */
.no-touchevents .mdevents_listextended .events-filter-panel .panel-group.two .viewbtn:not(.active):hover,
.mdevents_listextended .events-filter-panel .panel-group.two .viewbtn:not(.active):active { color:var(--color-red-dark); }
.mdevents_listextended .events-filter-panel .panel-group.two .viewbtn.active,
.mdevents_listextended .events-filter-panel .panel-group.two .map-view .viewbtn.active {
  background:var(--color-blue);
  color:var(--color-light);
  margin-left:0;
}
/* Die ungescopte Basisregel ".panel-group > div:nth-last-child(2)/:last-child
   { margin-top:20px }" (greift ab ≤1200px, gedacht fürs 2×2-Filterraster)
   versetzt in unserer einzeiligen Leiste die letzten Filter und die
   Umschalt-Buttons ("Kacheln"/"Karte") um 20px nach unten. Hier neutralisiert
   – der Zeilenabstand kommt allein aus dem gap der Leiste. */
.mdevents_listextended .events-filter-panel .panel-group > div { margin-top:0; }
/* Icons vor dem Label (statt dahinter), mit klarem Abstand zum Text.
   KEINE Ausblendung der Labels bei ≤1600px (der frühere font-size:0-Ansatz
   ließ die Icons kleben) — die Umschalt-Pille passt mit Labels bequem. */
.mdevents_listextended .events-filter-panel :is(.list-view, .grid-view, .map-view) button::after { content:none; }
.mdevents_listextended .events-filter-panel :is(.list-view, .grid-view, .map-view) button::before {
  font-family:'Font Awesome 6 Free';
  font-weight:900;
  font-size:0.875rem;
  margin-right:8px;
  transition:.4s;
}
/* dieselben Glyphen wie das originale md_events (vorher via ::after gerendert
   und sichtbar) — nur nach ::before verschoben, damit das Icon VOR dem Label
   steht. */
.mdevents_listextended .events-filter-panel .list-view button::before { content:"\f00b"; }
.mdevents_listextended .events-filter-panel .grid-view button::before { content:"\f84c"; }
.mdevents_listextended .events-filter-panel .map-view button::before { content:"\f5a0"; }

/* Terminkacheln als weiße Karten (heben sich vom cremefarbenen Seiten-/Panel-
   Hintergrund ab; die Basis-.custom-tile-item ist creme). */
.mdevents_listextended .grid-view-container .custom-tile-item {
  background:#ffffff;
  border-radius:8px;
  padding:20px 24px 24px;
  transition:box-shadow 0.2s, transform 0.2s;
}
.no-touchevents .mdevents_listextended .grid-view-container .custom-tile-item:hover {
  box-shadow:0 16px 32px rgba(var(--color-blue-rgb), 0.1);
  transform:translateY(-3px);
}
/* Karte als CSS-Grid: Kopfzeile (Ort-Pille links, Datums-Badge rechts) teilen
   sich EINE Zeile automatisch — die Ort-Spalte ist flexibel (minmax(0,1fr)),
   das Badge nimmt seine Eigenbreite. Kein festes Reservieren mehr (das schnitt
   auf schmalen 3-Spalten-Karten schon "Cottbus" auf "CO…"). Der Ort kürzt sich
   nur, wenn er neben dem Badge wirklich nicht passt. .custom-tile-item-text
   wird per display:contents aufgelöst, damit Ort/Kategorie/Titel direkte
   Grid-Items der Karte werden. Zeile 4 (1fr) schiebt die "Mehr Infos"-Pille
   nach unten (gleich hohe Karten). */
.mdevents_listextended .grid-view-container .custom-tile-item > a {
  display:grid;
  grid-template-columns:minmax(0, 1fr) auto;
  grid-template-rows:auto auto auto 1fr auto;
  column-gap:12px;
  height:100%;
  text-decoration:none;
}
.mdevents_listextended .grid-view-container .custom-tile-item-text { display:contents; }
/* Datums-Badge (rot) oben rechts */
.mdevents_listextended .grid-view-container .custom-tile-item-meta {
  grid-column:2;
  grid-row:1;
  justify-self:end;
  align-self:start;
  max-width:130px;
  background-color:var(--color-red);
  border-radius:8px;
  box-shadow:0 6px 16px rgba(var(--color-red-rgb), 0.3);
  padding:9px 14px 8px;
  line-height:1.1;
}
@media (hover: hover) {
  .mdevents_listextended .grid-view-container a:hover .custom-tile-item-meta { background-color:var(--color-red-dark); }
}
.mdevents_listextended .grid-view-container a:active .custom-tile-item-meta { background-color:var(--color-red-dark); }
.mdevents_listextended .grid-view-container .custom-tile-item-meta .datetime {
  display:flex;
  flex-direction:column;
  align-items:center;
  color:var(--color-light);
}
/* Datum bei Spannen ("06.06. – 27.09.2026") umbrechen statt das Badge breit
   zu machen (max-width 130px oben) — sonst bleibt der Ort-Pille zu wenig
   Platz. Einzeldaten ("16.07.2026") haben keine Umbruchstelle, bleiben also
   einzeilig. */
.mdevents_listextended .grid-view-container .custom-tile-item-meta .date { font-size:18px; font-weight:800; margin-right:0; white-space:normal; text-align:center; }
.mdevents_listextended .grid-view-container .custom-tile-item-meta .time { color:rgba(var(--color-light-rgb), 0.9); font-size:0.6875rem; font-weight:700; margin-top:3px; white-space:nowrap; }
/* Ort-Pille: linke Kopfzeilen-Spalte, vertikal mittig zum Badge */
.mdevents_listextended .grid-view-container .custom-tile-item-place {
  grid-column:1;
  grid-row:1;
  align-self:center;
  min-width:0;
  margin:0;
}
.mdevents_listextended .grid-view-container .custom-tile-item-place .place {
  background:var(--color-blue);
  border-radius:999px;
  color:var(--color-light);
  display:inline-block;
  max-width:100%;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  vertical-align:top;
  font-size:0.6875rem;
  font-weight:700;
  letter-spacing:0.08em;
  padding:5px 12px;
  text-transform:uppercase;
}
/* Pin-Icon der Ortszeile entfällt — der Ort ist jetzt die blaue Pille */
.mdevents_listextended .grid-view-container .custom-tile-item-place span::before { content:none; }
.mdevents_listextended .grid-view-container .custom-tile-item-header { grid-column:1 / -1; grid-row:2; margin-top:14px; }
.mdevents_listextended .grid-view-container .custom-tile-item-header h2 { font-size:16px; line-height:1.35; margin:0 0 6px; }
.mdevents_listextended .grid-view-container .custom-tile-item-category { grid-column:1 / -1; grid-row:3; color:rgba(var(--color-blue-rgb), 0.6); font-size:0.8125rem; margin:0; }
/* Präfix "Selbstorganisiert: " vor dem Titel externer Veranstaltungen (Veranstalterhinweis
   = Sprechen & Zuhören). In Kachel und Kartendialog steht es in einer h2 und
   würde deren Fettschrift erben — als Zusatz zum Titel soll es aber
   zurücktreten, deshalb der normale Schnitt (Interstate Regular, 400).
   Markup an drei Stellen, alle mit derselben Klasse:
     Partials/Event/ListExtended-Item.html  (Kachelansicht)
     Partials/Event/DialogEvent.html        (Kartendialog)
     Templates/Event/ListExtended.html      (Listenansicht)
   Bewusst ohne Kontext-Selektor, damit sich alle drei über diese eine Regel
   ansteuern lassen. */
.extern-prefix { font-weight:400; }
/* "Mehr Infos"-Pille (rein visuell — die ganze Karte ist der Link).
   Hiess bis 18.8.2026 "Anmelden"; geaendert auf Wunsch des Users, weil die
   Kachel gar nicht zur Anmeldung fuehrt, sondern zur Einzelansicht.
   ⚠️ Der Text steht NUR hier im CSS, nicht im Markup und nicht in einer
   XLF-Datei - eine Suche in den Templates oder im ausgelieferten HTML findet
   ihn deshalb nicht, und im DOM taucht er auch nicht in textContent auf. */
.mdevents_listextended .grid-view-container .custom-tile-item > a::after {
  content:"Mehr Infos";
  grid-column:1 / -1;
  grid-row:5;
  justify-self:start;
  margin-top:16px;
  background:var(--color-red);
  border-radius:999px;
  color:var(--color-light);
  font-size:0.875rem;
  font-weight:700;
  padding:8px 16px;
  transition:background 0.2s;
}
@media (hover: hover) {
  .mdevents_listextended .grid-view-container .custom-tile-item > a:hover::after { background:var(--color-blue); }
}
/* "Teilen"-Button unten rechts als Pille (oben rechts sitzt das Datums-Badge).
   Grundzustand dezent (blau 60%), geöffnet als gefüllte blaue Pille — der
   md_events-Grundzustand war eckig (border-radius:0). */
.mdevents_listextended .grid-view-container .custom-tile-item-meta-sharebar {
  display:inline-flex;
  align-items:center;
  gap:6px;
  top:auto;
  bottom:20px;
  right:16px;
  border-radius:999px;
  background:rgba(var(--color-blue-rgb), 0.06);
  color:rgba(var(--color-blue-rgb), 0.6);
  font-size:0.8125rem;
  font-weight:700;
  min-height:0;
  padding:6px 14px;
  transition:background 0.2s, color 0.2s;
}
.no-touchevents .mdevents_listextended .grid-view-container .custom-tile-item-meta-sharebar:hover {
  background:rgba(var(--color-blue-rgb), 0.12);
  color:var(--color-blue);
}
.mdevents_listextended .grid-view-container .custom-tile-item-meta-sharebar.opened {
  background:var(--color-blue);
  color:var(--color-light);
}
/* Aufgeklappte Share-Leiste als abgerundete blaue Pille mit hellen Icons */
.mdevents_listextended .grid-view-container .custom-tile-item-sharebar {
  top:auto;
  bottom:56px;
  right:16px;
  gap:4px;
  padding:8px 14px;
  border-radius:999px;
  background:var(--color-blue);
}
.mdevents_listextended .grid-view-container .custom-tile-item-sharebar a { color:var(--color-light); }
.no-touchevents .mdevents_listextended .grid-view-container .custom-tile-item-sharebar a:hover { color:var(--color-red-dark); }
/* Kachelraster: 1/2/3 Spalten wie ".termine-grid" der statischen Vorlage
   (CSS-Grid, 16px Gap) statt der data-columns-Flexbreiten der MD-Hauptseite —
   vier Karten nebeneinander wurden zu schmal (Ort-Pille unter dem Badge,
   umbrechende Titel). Der nth-child(n)-Zusatz hebt die Spezifität über die
   data-columns-Randregeln weiter oben. */
.mdevents_listextended .grid-view-container .custom-tile-group {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
  overflow: visible;
}
.mdevents_listextended .grid-view-container .custom-tile-group[data-columns] > .custom-tile-item:nth-child(n) {
  flex: none;
  width: auto;
  max-width: none;
  margin: 0;
}
@media (min-width: 768px) {
  .mdevents_listextended .grid-view-container .custom-tile-group { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1024px) {
  .mdevents_listextended .grid-view-container .custom-tile-group { grid-template-columns: repeat(3, 1fr); }
}
/* END - List Extended - S&Z-Filter- und Kartenoptik */

/* Map view */
.mdevents_listextended .map-view-container { padding-bottom:0.75rem; }

@media (max-width: 1600px) {
  .mdevents_listextended .panel-group:last-child button { font-size:0;}
  .mdevents_listextended .list-view button::after, .mdevents_listextended .grid-view button::after, .mdevents_listextended .map-view button::after { margin-left:0; }
}
/* Umbruchpunkt der statischen Vorlage (1024px): NUR die Listenansicht
   (Tabelle) + der Listen-Umschalter verschwinden.
   Ab hier stapeln Heading, Filter-Gruppe (.one) und Umschalter (.two) unter-
   einander, jeweils auf voller Breite — aber mit der bisherigen Ausrichtung:
   Heading + Filter linksbündig, Umschalter rechtsbündig (align-self:flex-end,
   bleibt kompakte Pille). Der frühere Versuch zentrierte alles und sah "kaputt"
   aus; deshalb hier explizit die Links-/Rechts-Ausrichtung. */
@media (max-width: 1023.98px) {
  .mdevents_listextended .events-table,
  .mdevents_listextended .panel-group .list-view { display:none; visibility:hidden; }
  .mdevents_listextended .map-view-container .list-helper { display:none; visibility:hidden; }
  .mdevents_listextended .events-filter-panel { flex-direction:column; align-items:stretch; }
  .mdevents_listextended .events-filter-panel .panel-group.two { align-self:flex-end; margin-left:0; }
}
/* Unterhalb 768px zusätzlich: Filter-Pillen stapeln vertikal (volle Breite),
   Dropdowns volle Breite. */
@media (max-width: 767.98px) {
  .tx-mdevents-singleview-footer table td { display: block; }
  .frame-type-list-mdevents_slider {
    padding-left: 40px !important;
    padding-right :40px !important;
  }
  .mdevents_listextended .panel-group.one { flex-direction:column; align-items:stretch; gap:12px; }
  .mdevents_listextended .panel { width:100%; }
  .mdevents_listextended .panel-input-group { width:100%; margin:0; }
  /* filterbtn füllt die gesamte Breite der Pille → komplette Fläche klickbar
     (statt nur die Textbreite). Der Reset-Button bleibt als Flex-Nachbar
     rechts daneben und behält seine eigene klickbare Fläche. */
  .mdevents_listextended .panel-input-group .filterbtn { flex:1; }
  .mdevents_listextended .panel-list-group { width:100%; }
  .mdevents_listextended .panel-list-item { border:none; }
}

/* Share button */
/* Grid view */
.mdevents_listextended .custom-tile-item-meta-sharebar { background-color:unset; color:var(--color-blue); font-size:1rem; min-height:45px; padding:0.625rem 1rem; right:0; top:34px; transition:color .4s; }
.no-touchevents .mdevents_listextended .custom-tile-item-meta-sharebar:hover, .no-touchevents .mdevents_listextended .custom-tile-item-meta-sharebar .fa-share:hover, .mdevents_listextended .custom-tile-item-meta-sharebar:active, .mdevents_listextended .custom-tile-item-meta-sharebar .fa-share:active { color:var(--color-red-dark); }
.mdevents_listextended .custom-tile-item-meta-sharebar.opened { background-color:var(--color-blue); color:#ffffff; }
.no-touchevents .mdevents_listextended .custom-tile-item-meta-sharebar.opened:hover, .no-touchevents .mdevents_listextended .custom-tile-item-meta-sharebar.opened .fa-share:hover, .mdevents_listextended .custom-tile-item-meta-sharebar.opened:active , .mdevents_listextended .custom-tile-item-meta-sharebar.opened .fa-share:active { color:var(--color-red-dark); }
.mdevents_listextended .custom-tile-item-sharebar { align-items:center; background-color:var(--color-blue); border:none; display:flex; height:45px; justify-content:flex-end; top:34px; padding:0 1rem; right:95px; transition:unset; }
.mdevents_listextended .custom-tile-item-sharebar a { font-size:1.5rem; height:auto; line-height:0; margin:0; padding:0; }
.mdevents_listextended .custom-tile-item-sharebar a { margin-right:1rem; }
.mdevents_listextended .custom-tile-item-sharebar a:last-child { margin-right:0; }
/* List view */
.mdevents_listextended .list-view-container .custom-tile-item-meta-sharebar { align-items:center; display:flex; font-size:0; height: 100%; justify-content:center; padding:0; position:relative; top:0; }
.mdevents_listextended .list-view-container .custom-tile-item-meta-sharebar.opened { background:var(--color-blue); }
.mdevents_listextended .list-view-container .custom-tile-item-meta-sharebar .fa-share{ font-size:1.75rem; margin:0 1.5rem; }
.mdevents_listextended .list-view-container .custom-tile-item-sharebar { border-right:1px solid #ffffff; height:100%; padding:1.5rem; right:76px; top:0; }
.mdevents_listextended .list-view-container .custom-tile-item-sharebar a { color:#ffffff; font-size:1.75rem; margin:0 1.5rem 0 0; }
.mdevents_listextended .list-view-container .custom-tile-item-sharebar a:last-child { margin:0; }
.no-touchevents .mdevents_listextended .list-view-container .custom-tile-item-sharebar a:hover, .mdevents_listextended .list-view-container .custom-tile-item-sharebar a:active { color:var(--color-red-dark); }
/* Single view */
/* Button-Basis (aus custom_md2022 übernommen, Farben auf S&Z-Palette gebracht) —
   fehlte in custom_sprezu, daher waren .btn / .btn-blue-filled (z. B. "Zum
   Termin" im Karten-Dialog, Route/iCal-Buttons) ungestylt. margin-bottom 1rem. */
.btn {
  background:none; color:#fff; outline:none; cursor:pointer;
  font-size:1rem; font-weight:700; min-height:40px;
  margin:0 24px 1rem 0; padding:0.6rem 1.5rem;
  text-align:center; display:inline-flex; justify-content:center; align-items:center;
  line-height:1; text-decoration:none;
  /* Pillen-Look wie die übrigen Buttons der Vorlage (.news-cta/.sidebar-cta).
     Rahmen dauerhaft 1px (transparent) statt border:none beim Hover — das
     Entfernen des 1px-Rahmens von .btn-blue-filled ließ den Button beim
     Hover um 1px springen ("ruckeln"). Gezielte 0.2s-Übergänge statt
     pauschalem .4s auf allen Eigenschaften. */
  border:1px solid transparent;
  border-radius:999px;
  transition:background 0.2s, border-color 0.2s, color 0.2s;
}
.btn.checked { color:#fff !important; }
/* ⚠️⚠️ TASTATUR-FOKUS, ergaenzt am 12.8.2026. Die Grundregel oben setzt
   outline:none — und die einzige Wiederherstellung stand bis heute in
   .registerevent_view. JEDER .btn ausserhalb des Formulars „Termin einreichen"
   war damit mit der Tabulatortaste unsichtbar, unter anderem der „mehr"-Knopf
   auf den Terminkacheln (<a class="btn btn-blue-filled">).
   ⚠️ --color-blue, nicht Rot: seit 12.8.2026 tragen ALLE Fokusringe der Site
   diese Farbe (Video, Karte, Spenden, beide Reset-Knoepfe). 9,35:1 auf hellem
   Grund gegen 2,79:1 bei --color-red.
   ⚠️⚠️ Das outline:none musste dafuer aus .btn.checked UND aus der
   :hover-Regel darunter raus. Beide haetten diese Regel geschlagen —
   .btn.checked mit 0-2-0 bei Gleichstand ueber die Reihenfolge, die
   :hover-Regel mit 0-4-0 klar. Die Grundregel oben darf ihr outline:none
   behalten: 0-1-0 verliert gegen die 0-2-0 hier, und sie sorgt weiterhin
   dafuer, dass ein Mausklick keinen Ring hinterlaesst. */
/* ⚠️ Muss hier stehen bleiben und darf nicht durch die globale :where()-Regel
   ersetzt werden: `.btn` setzt oben `outline:none` (0-1-0) und wuerde die
   Spezifitaet 0-0-0 der globalen Regel schlagen — die Buttons haetten dann GAR
   keinen Ring. Werte kommen aus den --focus-ring-* am Dateianfang, damit es
   trotzdem derselbe Ring ist. Am 12.8.2026 von einfarbig Blau umgestellt: auf
   .btn-blue-filled („Routenplaner") lag Blau auf Blau. */
.btn:focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
  box-shadow: var(--focus-ring-inner);
}

@media (hover: hover) {

  /* ⚠️⚠️ Die beiden UMRISS-Pillen sind seit 12.8.2026 ausgenommen. Sie fuellen
     sich beim Zeigen nicht mehr blau, sondern behalten ihren hellen Grund und
     bekommen rote Schrift und roten Rahmen — weisse Schrift waere darauf
     unsichtbar. Das `!important` hier laesst sich nicht durch hoehere
     Spezifitaet schlagen; die Ausnahme MUSS deshalb an dieser Stelle stehen.
     Wer eine weitere Umriss-Variante baut, traegt sie hier ein. */
  .btn:hover:not(.btn-cancel):not(.btn-blue-border) { color:#fff !important; }

}
.btn:last-child { margin-right:0; }
.btn-blue-filled { border:1px solid var(--color-blue); background:var(--color-blue); }
.btn-blue-filled.checked { border-color:var(--color-red); background:var(--color-red); }

@media (hover: hover) {

  /* Hover in der roten Akzentfarbe wie bei den übrigen Buttons der Vorlage —
   das frühere --color-blue-secondary (#2c5288) lag so nah am Grundblau
   (#17427f), dass der Hover kaum wahrnehmbar war. */
.btn-blue-filled:hover { border-color:var(--color-red-dark); background:var(--color-red-dark); }

}
.btn::before { color:#ffffff; font-family:'Font Awesome 6 Free'; font-size:1.25rem; margin-right:0.5rem; transition:.4s; }
.btn.ics::before { content:"\f271";  }
.btn.route::before { content:"\f3c5"; }
.btn.share::before { content:"\f064"; }
.singleview .share {  }
.singleview .share > div { margin-bottom:1.5rem; }
.singleview .share a { font-size:1.75rem; margin:0 1rem 0 0; }
.singleview .share a:last-child { margin:0; }
.no-touchevents .share a:hover, .share a:active { color:var(--color-red); }

.tx_mdevents .subtitle {font-size: 16px;font-weight: 700/*600*/;}

/** Event-Detailseite: der Gridelements-Container hat global 96px vertikales
    Padding (Sektions-Rhythmus). Der OBERE Abstand kommt jetzt aus der
    6rem-first-child-Regel (dort padding-top auf 0); hier nur noch das UNTERE
    Padding reduzieren, damit unter der Karte kein zu großer Leerraum entsteht
    (:has() = moderne Browser). */
main > [class*="frame-type-container"]:has(.frame-type-list-mdevents_show) {
  padding-bottom: 3.5rem;
}

/** Single View — S&Z-Design: Karte mit abgerundeten Ecken + weichem Schatten,
    Cream-Footer, Koralle-Akzente, blaue Typo (statt generisch weiß/grau/schwarz). */
.tx_mdevents .singleview {
  background-color:#fff;
  color:var(--color-blue);
  border-radius:16px;
  overflow:hidden;
  box-shadow:0 12px 28px rgba(var(--color-blue-rgb),0.08);
}
.tx-mdevents-singleview-header,.tx-mdevents-singleview-content {padding:2rem 2rem 0 2rem;}
.tx-mdevents-singleview-content { padding-bottom:2rem; }
/* Überschriften der Event-Einzelansicht kompakter als die globale Skala
   (global: h1 clamp(40,6vw,64px), h2 clamp(28,4vw,44px)) — im Karten-/
   Spalten-Kontext wirkten sie zu groß. Nur hier gescoped. */
.tx-mdevents-singleview-header h1 { font-size: clamp(26px, 3.4vw, 40px); }
.tx-mdevents-singleview-content h2 { font-size: clamp(20px, 2.4vw, 28px); margin-top: 2.5rem; }
/* Die Description (RTE) enthält oft ein eigenes <h1> — global wäre das
   clamp(40,6vw,64px) und damit viel zu groß. Hier deutlich kleiner (bleibt
   unter dem Event-Titel im Header). */
.tx-mdevents-singleview-content h1 { font-size: clamp(24px, 3vw, 34px); margin-top: 2.5rem; }
.tx-mdevents-singleview-content > :first-child { margin-top: 0; }
/* Absätze im Content brauchen Abstand zueinander (waren zusammengeklebt). */
.tx-mdevents-singleview-content p { margin: 0 0 1rem; }

/* Statusmeldungen der Einzelansicht ("noch nicht freigegeben", "Veranstaltung
   ist vorbei", Markup siehe md_events/.../Templates/Event/Show.html). Beide
   standen vorher ohne Innenabstand und ohne Rahmen im Plugin — die Meldung
   klebte am Rand der weißen Karte. Aufbau wie die bestehende Hinweis-Box
   "ul.typo3-messages > li.alert" (Koralle-Balken links, blaue Typo), nur mit
   dem Cream der Einzelansicht statt --color-light, damit sie sich innerhalb
   der weißen Karte absetzt. --pending liegt in .singleview (weiße Karte),
   --past steht frei im Plugin — daher die getrennten Außenabstände. */
.mdevents-message {
  background: var(--color-cream);
  border-left: 4px solid var(--color-red);
  border-radius: 8px;
  color: var(--color-blue);
  padding: 1.5rem 2rem;
}
.tx_mdevents .singleview > .mdevents-message { margin: 2rem; }
.tx_mdevents .mdevents-message--past { margin: 2rem 0; }
.mdevents-message p { line-height: 1.6; margin: 0; }
.mdevents-message p + p { margin-top: 0.75rem; }
/* Global wäre h2 clamp(28px, 4vw, 44px) — als Meldungstitel viel zu groß. */
.mdevents-message h2 {
  font-size: clamp(18px, 2vw, 22px);
  margin: 0 0 0.5rem;
}
.registrationview .asideform h2 { font-size: clamp(20px, 2.2vw, 26px); }
/* Abstand Überschrift → Bild (Header hat unten 0 Padding, deshalb steht der
   Abstand hier und nicht als padding-bottom am Header: ohne Bild folgt direkt
   .tx-mdevents-singleview-content mit eigenem padding-top, sonst stünde der
   Abstand doppelt).
   29.7.2026: von 1.5rem auf 2rem — gleicher Wert wie das padding-top des
   Headers, damit die Überschrift oben und unten gleich viel Luft hat.
   Der Gegenwert für <=800px steht in der Medienabfrage weiter unten (1rem). */
.tx-mdevents-singleview-images { margin-top: 2rem; }
.tx-mdevents-singleview-figure { position:relative; }
.tx-mdevents-singleview-figure img { display:block; width:100%; height:auto; }
.tx-mdevents-singleview-figure figcaption { background-color:var(--color-blue); color:#ffffff; padding:0.25rem 2rem; }
/* Copyright/Bild-Metadaten: kleiner, dezent, rechtsbündig mit Abstand zum Bild
   (oben) und zum rechten Kartenrand (rechte Einrückung wie der Inhalt = 2rem). */
.tx-mdevents-singleview-figure .image-metadata {
  text-align: right;
  padding: 0.5rem 2rem 0;
  font-size: 0.8125rem;
  color: rgba(var(--color-blue-rgb), 0.65);
}
/* Inhalts-Listen: Koralle-Punkte statt Standard-Bullets (on-brand). */
.tx-mdevents-singleview-content ul { list-style:none; padding-left:0; margin:0 0 1.5rem; }
.tx-mdevents-singleview-content ul li { position:relative; padding-left:1.5rem; margin-bottom:0.5rem; }
.tx-mdevents-singleview-content ul li::before {
  content:""; position:absolute; left:0; top:0.55em;
  width:0.5rem; height:0.5rem; border-radius:50%; background:var(--color-red);
}
.tx-mdevents-singleview-footer { background-color:var(--color-cream); color:var(--color-blue); overflow:hidden; padding:2rem; }
.tx-mdevents-singleview-footer table { table-layout:fixed; width:100%; }
.tx-mdevents-singleview-footer table td { min-width:220px; padding-right:2rem; vertical-align:top; }
.tx-mdevents-singleview-footer table td:last-child { padding-right:0; }
/* Feld-Labels als kleine Koralle-Eyebrows (wie in der Karten-Legende). */
.tx-mdevents-singleview-footer h4 {
  color:var(--color-red); text-transform:uppercase; letter-spacing:0.05em;
  font-size:0.8125rem; margin:0 0 0.35rem;
}
.tx-mdevents-singleview-footer span.date { display:inline-block; margin-right:0.25rem; }
.tx-mdevents-singleview-footer span.date, .tx-mdevents-singleview-footer span.time { font-weight:700; }
/* Gleichmäßiger Abstand zwischen den Info-Blöcken (Label+Wert). Das Eyebrow-h4
   bleibt eng an seinem Wert (0.35rem), zwischen den Blöcken 1.75rem — in beiden
   Spalten und bei Online-/Präsenz-Events identisch (kongruent). */
.tx-mdevents-singleview-footer dl,
.tx-mdevents-singleview-footer dt { margin:0; }
.tx-mdevents-singleview-footer dd { margin:0 0 1.75rem; }
.tx-mdevents-singleview-footer dd:last-child { margin-bottom:0; }
.tx-mdevents-singleview-footer dd p { margin:0; }
.tx-mdevents-singleview-footer .share { margin-top:1.75rem; }
/* Abstand zwischen Text (Datum/Adresse) und dem darunterliegenden Button
   ("Termin herunterladen" / "Routenplaner") — Button klebte sonst am Text. */
.tx-mdevents-singleview-footer dd .btn { margin-top:0.75rem; }
/* Zurück-Navigation (eigener <p> direkt im Footer, nach der Info-Tabelle):
   deutlicher abgesetzt von den Event-Infos darüber. */
.tx-mdevents-singleview-footer > table + p { margin-top:2rem; }

/** Anmelde-Formular der Event-Einzelansicht (md_events "registrationview",
    rechte Spalte). Eigenes Markup (form.asideform mit .form-control/.btn-primary),
    daher NICHT vom Formular-Framework-Styling (.frame-type-form_formframework)
    erfasst — hier bewusst mit denselben Design-Tokens nachgebaut: Cream-Karte,
    blaue Labels, weiße Felder mit roter Fokus-Kontur, Pill-Button (rot → blau). */
.registrationview .asideform {
  background: var(--color-cream);
  border-radius: 16px;
  padding: 2rem;
}
.registrationview .asideform h2 { color: var(--color-blue); margin-top: 0; }
.registrationview .form-group { margin-bottom: 16px; }
.registrationview .form-row { display: flex; gap: 16px; }
.registrationview .form-row > .form-group { flex: 1; min-width: 0; }
/* wie beim Form-Framework-Formular: ab 1024px abwärts untereinander (war 600px),
   inklusive Rücknahme des 50%-Deckels aus custom_forms (siehe dort). */
@media (max-width: 1023.98px) {
  .registrationview .form-row { flex-direction: column; gap: 0; }
  .registrationview .form-row > .form-group,
  .registrationview .form-row > div {
    flex: 1 1 100%;
    width: 100%;
    max-width: 100%;
  }
}
/* Randfall, den die Fensterbreite nicht erwischt: bei GENAU 1024px greift die
   Regel oben nicht mehr, dort ist die Seitenleiste aber am schmalsten
   (272px Spalte, 212px Container) — zwei Felder nebeneinander wurden je 94px.
   Deshalb zusätzlich an der Spaltenbreite: unter 280px reicht es nie für zwei
   Felder (2 × ~120px + 16px Rinne). Gilt für beide Formularsorten. */
@container (max-width: 280px) {
  .registrationview .form-row,
  .frame-type-form_formframework .form-row { flex-direction: column; gap: 0; }
  .registrationview .form-row > .form-group,
  .registrationview .form-row > div,
  .frame-type-form_formframework .form-row > .form-group,
  .frame-type-form_formframework .form-row > div {
    flex: 1 1 100%;
    width: 100%;
    max-width: 100%;
  }
}
.registrationview .form-control-label {
  display: block; font-size: 0.8125rem; font-weight: 700;
  color: var(--color-blue); margin-bottom: 4px;
}
.registrationview .required { color: var(--color-red); }
.registrationview .form-control {
  display: block; width: 100%; background: #fff;
  border: 1px solid rgba(var(--color-blue-rgb), 0.3);
  border-radius: 4px; padding: 10px 12px;
  font-size: 0.9375rem; font-family: inherit; color: var(--color-blue);
  transition: border-color 0.2s;
}
.registrationview .form-control:focus { outline: none; border-color: var(--color-red); }
/* Datenschutz-Zeile (statischer Text mit Link) + Pflichtfeld-Hinweis klein. */
.registrationview .form-group-statictext { font-size: 0.875rem; line-height: 1.5; }
.registrationview .mandatory_helper {
  font-size: 0.8125rem; color: rgba(var(--color-blue-rgb), 0.7); margin-top: 0.75rem;
}
/* Absende-Button im Pill-Stil der Vorlage (rot → blau beim Hover/Aktiv). */
.registrationview .actions { margin-top: 8px; }
.registrationview .btn.btn-primary {
  display: inline-block; background: var(--color-red); color: var(--color-light);
  border: none; cursor: pointer; padding: 12px 28px;
  font-family: inherit; font-weight: 700; font-size: 0.875rem;
  border-radius: 999px; text-transform: uppercase; letter-spacing: 0.05em;
  transition: background 0.2s, color 0.2s;
}
.registrationview .btn.btn-primary:active { background: var(--color-blue); color: var(--color-light); }
@media (hover: hover) {
  .registrationview .btn.btn-primary:hover { background: var(--color-blue); color: var(--color-light); }
}
/* 800px war ein md2022-Wert; auf sprezus Umbruchpunkt gezogen. Der schmale
   Spaltenfall steckt zusätzlich in der Container-Abfrage weiter unten. */
@media (max-width: 767.98px) { .registrationview .asideform { padding: 1.5rem; } }

/** Karten-Steuerung (mdevents_map) auf S&Z-Palette — überschreibt die
    md_events-Blautöne (#1271ee/#2e92ff) aus listMap.css. */
/* Zoom-Buttons (listmap-zoom-in / listmap-zoom-out) */
.mdevents_map .map_container .leaflet-legend-zoom-control > button { background-color:var(--color-blue); }
.no-touchevents .mdevents_map .map_container .leaflet-legend-zoom-control > button:hover, .mdevents_map .map_container .leaflet-legend-zoom-control > button:active { background-color:var(--color-red-dark); }
/* Ereigniszähler auf Cluster-Markern weiß */
.mdevents_map .map_container .leaflet-marker-icon[data-events]::before { color:#ffffff; }
/* Kartenhöhe: listMap.js setzt inline height:70vh (sehr hoch). Kompakter und
   auf großen Screens gedeckelt, damit die Karte "kleiner" ist und immer passt.
   !important schlägt den inline-Wert; Fullscreen (eigene !important-Regel in
   listMap.css, :not() ausgenommen) bleibt unberührt. */
.mdevents_map .map_container:not(.is-fullscreen) #map {
  height: clamp(360px, 60vh, 560px) !important;
}

/** Karten-Dialog (mdevents_map Marker-Popup) — übernommen aus
    md_events/Resources/Public/Css/listMap.css, damit das per showModal()
    geöffnete <dialog> auch im S&Z-Baum gestylt ist. Das Overlay (::backdrop)
    fehlt in listMap.css und ist hier ergänzt. Die SVG-Kategorie-Icons weiter
    unten überschreiben bewusst die FontAwesome-Variante aus diesem Block. */
dialog.dialog-event::backdrop { background: rgba(var(--color-blue-rgb), 0.55); }
dialog { padding:0; }
dialog.dialog-event::before { display:inline-block; height:100px; position:relative; width:100%; }
dialog.dialog-event { background:none; overflow:visible; border:0; }
/* S&Z-Anpassung: Als Modal (showModal) liegt der Dialog im Top-Layer relativ
   zum Viewport. Feste Breite statt des UA-Standards "fit-content" (der die
   Breite beim Auf-/Zuklappen eines Akkordeon-Items springen ließ) und sicher
   in beiden Achsen zentrieren (top/left 50% + translate). Breite ~66% der
   Inhaltsbreite (max. 924px ≈ 66% von 1400px); mobil breiter für Lesbarkeit.
   Hinweis: Ein echtes Modal kann per CSS nicht an die konkrete Breite des
   Gridelements gebunden werden — 924px ist die 66%-Näherung der max. 1400px
   breiten Inhaltsspalte. */
dialog.dialog-event {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 90%;
  max-width: 924px;
  max-height: 90vh;
  margin: 0;
}
@media (min-width: 768px) {
  dialog.dialog-event { width: 66%; }
}
/* Close Button */
dialog.dialog-event > .btn-close-container { display:flex; justify-content:flex-end; margin-bottom:1rem;}
dialog.dialog-event .btn-close-container > button.close { background:var(--color-blue); border:none; float:none; height:45px; text-align:center; transition:0.4s; width:45px;  }
dialog.dialog-event .btn-close-container > button.close::before { color:#ffffff; content:"\f00d"; font-family:'Font Awesome 6 Free'; font-size:1.5rem; }
.no-touchevents dialog.dialog-event .btn-close-container > button.close:hover, dialog.dialog-event .btn-close-container > button.close:active { background:var(--color-red-dark); }
/* Dialog Event Group */
dialog .dialog-event-group { background:transparent; max-height:70vh; overflow:auto; }
/* Dialog Event Item */
dialog .dialog-event-item { background:#ffffff; margin-bottom:1rem; }
dialog .dialog-event-item:last-child { margin-bottom:0; }
dialog .dialog-event-item:is(.hidden-past,.hidden-category) { display: none; }
/* Header */
dialog .dialog-event-item.closed .dialog-header { padding-bottom:1rem; }
dialog .dialog-event-item.closed .dialog-header h2{ margin-bottom:0; }
dialog.dialog-event:not([data-events="1"]) .dialog-header { cursor: pointer; }
/* Category */
dialog .dialog-header .event-item-category { color:#ffffff; font-size:1rem; font-weight:700; margin-bottom:1rem; padding:0.5rem 1rem; transition:0.4s;}
.no-touchevents dialog.dialog-event:not([data-events="1"]) .dialog-header:hover .event-item-category, dialog.dialog-event:not([data-events="1"]) .dialog-header:active .event-item-category { color:#ffffff; font-size:1rem; font-weight:700; margin-bottom:1rem; opacity:0.8; padding:0.5rem 1rem; }
dialog.dialog-event:not([data-events="1"]) .dialog-event-item.closed .event-item-category, dialog.dialog-event:not([data-events="1"]) .event-item-category { background:none; }
/* Title */
dialog .dialog-header h2 { padding:0 1rem; font-size:20px; }
.no-touchevents dialog.dialog-event:not([data-events="1"]) .dialog-header:hover h2, dialog.dialog-event:not([data-events="1"]) .dialog-header:active h2 { color:var(--color-red); text-decoration:underline; }
dialog .dialog-header h2 span.datetime { display:block; font-size:1rem; }
dialog .dialog-header h2 span.datetime strong::after { content:' '; white-space:pre; }
/* Body */
dialog .dialog-event-item.closed .dialog-body { display:none;  }
dialog .dialog-body { padding:0 1rem;  }
dialog .dialog-body p { font-size:1rem; }
dialog .dialog-body > p:last-child { margin-bottom:0; }
/* Die Event-Description (RTE) im Popup kann eigene h1/h2 enthalten — global
   wären die riesig und würden das Popup sprengen. Auf Popup-Maß begrenzen. */
dialog .dialog-body :is(h1, h2, h3, h4) { font-size: 1.15rem; line-height: 1.3; margin: 0.75rem 0 0.35rem; }
/* Single event (Suche/Autocomplete) */
dialog.show-single-event .show-event { display:block !important; }
dialog.show-single-event .hide-event { display:none !important; }
dialog.dialog-event.show-single-event .dialog-header { cursor:default !important; }
dialog.dialog-event.show-single-event .event-item-category::before { content:none !important; }
.no-touchevents dialog.dialog-event.show-single-event .dialog-header:hover h2,
dialog.dialog-event.show-single-event .dialog-header:active h2 { color:inherit !important; text-decoration:none !important; }
.no-touchevents dialog.dialog-event.show-single-event .dialog-header:hover .event-item-category,
dialog.dialog-event.show-single-event .dialog-header:active .event-item-category { opacity:1 !important; }


/* mdevents_map in einer Rasterspalte — Legende unter die Karte stapeln,
   sobald die SPALTE zu schmal für das Nebeneinander (Karte + 300–350px Legende)
   wird. Container-Query statt Media-Query, weil im mehrspaltigen Raster der
   Viewport breit, die Spalte aber schmal ist (die viewportbasierte 800px-Regel
   in md_events/listMap.css greift dort nicht, und die calc()-Breiten der Karte
   würden negativ/kaputt). Schwellwert 800px = derselbe Umbruchpunkt wie die
   bestehende Karten-Logik. Ersetzt den früheren .grid4cols-Test-Hack.

   31.7.2026: Die Zeile stand bis heute auf ".grid-section .grid-column" und war
   damit tot — dieser Umzug weckt sie auf. Deshalb steht hier bewusst NICHT die
   pauschale Fassung [class*="frame-type-container"], sondern die Aufzählung der
   MEHRSPALTIGEN Container: "containersimple" ist ein Vollbreiten-Rahmen, keine
   schmale Spalte. Seine Spalte ist so breit wie der Inhaltsbereich, die
   Container-Abfrage würde dort nur die Fensterbreite nachbilden — und zwar
   anders als die Regeln darunter: Bei 810px Fenster misst die Spalte rund 762px,
   die Abfrage feuerte also und stapelte die Karte, während der Block weiter
   unten für 801–1200px ausdrücklich Halb/Halb vorsieht. Spezifität wie zuvor
   0-2-0 (:is() erbt sein stärkstes Argument). */
:is(.frame-type-container2cols, .frame-type-container2rows2cols,
    .frame-type-container3cols, .frame-type-container4cols) .grid-column { container-type: inline-size; }
@container (max-width: 800px) {
  /* column-reverse → Legende OBEN, Karte darunter (wie md_events/md2022 im
     ≤800px-Modus). Zuvor "column" (Karte oben) — auf Wunsch angeglichen. */
  .grid-column .mdevents_map { flex-direction: column-reverse; }
  /* Karte + Legende füllen die volle Spaltenbreite. WICHTIG: listMap.css wird
     nach dieser styles.css geladen, daher gewinnt dessen
     "@media(min-width:1201px){.mdevents_map > div.map_container:not(.is-fullscreen){max-width:75%}}"
     (Spezifität 0-3-1) bei gleicher Spezifität. Deshalb hier bewusst 0-4-1
     (div.map_container:not(.is-fullscreen) qualifiziert), sonst bleibt die
     gestapelte Karte auf 75% gedeckelt und rechts entsteht eine Lücke. */
  .grid-column .mdevents_map > div.map_container:not(.is-fullscreen),
  .grid-column .mdevents_map > div.legend_container {
    max-width: 100%;
    min-width: 0;
    margin-right: 0;
    margin-bottom: 20px;
  }
}

/* Legendenspalte bleibt EIN DRITTEL, auch auf sehr breiten Schirmen.
   md_events/listMap.css schaltet ab 1600px auf ein Viertel (25% - 1.125rem),
   weil sich die Karte dort am 4-spaltigen Kachelraster der Hauptseite
   ausrichtet. S&Z hat dieses Raster nicht, und in einem Viertel bricht die
   Beschriftung "Vergangene Veranstaltungen" um.
   WICHTIG: listMap.css laedt NACH dieser Datei, gleiche Spezifitaet verliert
   also. Die Basisregeln dort sind 0-2-1 bzw. 0-3-1 — das fuehrende body macht
   daraus 0-2-2 bzw. 0-3-2 und gewinnt.

   Ein Drittel gilt aber ERST AB 1201px. Darunter ist es zu wenig:
   nachgemessen auf der Startseite bei 880px Fensterbreite steht die Karte in
   einer Rasterspalte von 737px, ein Drittel davon sind 230px — die Ueberschrift
   "Veranstaltungskarte" braucht 261px und der Schalter "Vergangene
   Veranstaltungen" 270px, beide brechen um. Mit der Polsterung von 1.5rem je
   Seite braucht die Spalte rund 320px, das Drittel reicht also erst ab etwa
   1000px Spaltenbreite.
   Deshalb 801–1200: HALB/HALB. Damit ist die Legende nie breiter als die Karte
   (das war der Grund, warum die alten festen 300–350px hier nicht taugten —
   bei 810px Fensterbreite war die Legende mit 346px breiter als die Karte mit
   297px), und sie ist gleichzeitig nie schmaler als noetig.

   Fensterbreite ist dabei nur ein Ersatzmass: Eigentlich haengt das Problem an
   der SPALTENbreite. Die Container-Abfrage weiter oben macht genau das —
   sie gilt aber nur in den MEHRSPALTIGEN Containern. Die Karte der Startseite
   haengt unter "frame-type-containersimple", also in einem Vollbreiten-Rahmen;
   dort bleibt container-type absichtlich "normal", weil die Spaltenbreite dort
   nichts anderes waere als die Fensterbreite. Fuer diesen Fall gilt der Block
   hier. Steht die Karte dagegen in einer echten Rasterspalte, greift oben die
   Container-Abfrage und stapelt Legende ueber Karte. */
@media only screen and (min-width: 801px) and (max-width: 1200px) {
  body .mdevents_map > div.map_container:not(.is-fullscreen) {
    max-width: calc(50% - 0.75rem);
    min-width: calc(50% - 0.75rem);
    margin-right: 1.5rem;
  }
  body .mdevents_map > div.legend_container {
    max-width: calc(50% - 0.75rem);
    min-width: calc(50% - 0.75rem);
  }
}
@media only screen and (min-width: 1201px) {
  body .mdevents_map > div.map_container:not(.is-fullscreen) {
    max-width: calc(66.6667% - 0.5rem);
    min-width: calc(66.6667% - 0.5rem);
    margin-right: 1.5rem;
  }
  body .mdevents_map > div.legend_container {
    max-width: calc(33.3333% - 1rem);
    min-width: calc(33.3333% - 1rem);
  }
}

/* Umbruch beim Umschalten vermeiden: listMap.css:103 setzt den aktiven
   Legendeneintrag auf font-weight 700, den inaktiven laesst es bei normal.
   Fette Schrift ist breiter — deshalb sprang "Vergangene Veranstaltungen"
   beim Ein- und Ausschalten zwischen einer und zwei Zeilen. Die Beschriftung
   traegt hier IMMER die fetten Metriken; der Aus-Zustand wird stattdessen
   ueber die Deckkraft angezeigt, die die Breite nicht veraendert.

   Achtung bei den Selektoren: der Eintrag "Vergangene Veranstaltungen" hat
   KEINE Klasse an seinem Text-<span> (anders als die Kategorien, die .title
   tragen) — deshalb hier ueber span:not(.toggleswitch) statt span.title,
   sonst bliebe ausgerechnet der gemeldete Eintrag aussen vor.
   Das fuehrende body ist noetig: ohne es waere die Regel spezifitaetsgleich
   mit listMap.css:103 (beide 0-4-2) und wuerde als frueher geladene verlieren. */
body .mdevents_map .legend_container .legend-item > label > span:not(.toggleswitch) { font-weight: 700; }
body .mdevents_map .legend_container .legend-item.markers-hidden > label > span:not(.toggleswitch) { opacity: 0.6; }
/* Fuß der Einzelansicht ab 1024px abwärts EINSPALTIG. Die Eigenschaften stehen
   dort in einer Tabelle mit zwei Zellen à `min-width: 220px` plus 2rem
   Innenabstand — zusammen 472px Bedarf. Sobald das Fenster unter 1024px liegt,
   ist die Spalte schmaler (im 50/50-Band bei 900px nur 347px): die Zellen
   wurden auf 138px gequetscht und der Knopf „Termin herunterladen" (182px)
   lief in die Nachbarzelle über „Teilen" (Knopf endete bei 280px, zweite Zelle
   begann bei 238px). `min-width` MUSS mit zurückgenommen werden, sonst hält
   die Tabelle die 220px weiter und die Zelle ragt aus der Spalte. */
@media (max-width: 1023.98px) {
  .tx-mdevents-singleview-footer table,
  .tx-mdevents-singleview-footer table tbody,
  .tx-mdevents-singleview-footer table tr { display: block; width: 100%; }
  .tx-mdevents-singleview-footer table td {
    display: block;
    width: 100%;
    min-width: 0;
    padding-right: 0;
  }
  /* Gleichmäßiger Rhythmus über den Zellenwechsel hinweg. `dd:last-child`
     nimmt den unteren Abstand weg — nebeneinander richtig (die Zelle endet
     dort), untereinander falsch: die nächste Zelle stieß ohne Luft an.
     Gemessen war die Folge 5px (Beschriftung→Wert), 28px (Wert→nächste
     Beschriftung) und am Zellenwechsel 0px. Die letzte Zelle behält ihre
     Null, sonst stünde unten zu viel Luft vor dem „zurück"-Knopf. */
  .tx-mdevents-singleview-footer table td:not(:last-child) dd:last-child {
    margin-bottom: 1.75rem;
  }
}
/* Kompakter Rhythmus der Einzelansicht. Umbruchpunkt war 800px — ein
   md2022-Wert, den sprezu nirgends sonst kennt (die Vorlage hat 768/1024).
   Auf 767.98px gezogen, damit er zu den übrigen Umbruchpunkten passt.
   ⚠️ Die Fensterbreite ist hier aber ohnehin die falsche Größe: die
   Einzelansicht steht in einer Rasterspalte, und die kann schmal sein,
   während das Fenster breit ist. Deshalb steht derselbe Satz unten noch
   einmal als Container-Abfrage. */
@media only screen and (max-width: 767.98px) {
  .tx-mdevents-singleview-header,
  .tx-mdevents-singleview-content {
    padding: 1rem 1rem 0 1rem;
  }
  /* 29.7.2026: mit dem padding-top des Headers gleichziehen (oben 1rem).
     Vorher blieben hier die 2rem der Grundeinstellung stehen — auf dem Handy
     hatte die Überschrift dadurch unten doppelt so viel Luft wie oben. */
  .tx-mdevents-singleview-images {
    margin-top: 1rem;
  }
  .tx-mdevents-singleview-figure figcaption {
    padding: 0.25rem 1rem;
  }
  .tx-mdevents-singleview-footer {
    padding: 1rem 1rem 0 1rem;
  }
  .tx-mdevents-singleview-footer table td {
    display: block;
  }
  /* Meldungen folgen dem schmaleren Rhythmus der Einzelansicht (1rem statt 2rem). */
  .mdevents-message {
    padding: 1rem 1.25rem;
  }
  .tx_mdevents .singleview > .mdevents-message { margin: 1rem; }
  .tx_mdevents .mdevents-message--past { margin: 1rem 0; }
}
/* Dasselbe, aber an der SPALTENBREITE statt an der Fensterbreite — die
   Rasterspalten sind `container-type: inline-size` (siehe Karten-Block).
   Anlass: die Eigenschaften-Tabelle im Fuß hat zwei Zellen mit je
   `min-width: 220px` plus 2rem Innenabstand, zusammen also 472px Bedarf.
   Im 50/50-Band ist die Spalte bei 900px Fensterbreite nur 347px breit —
   die Zellen wurden auf 138px gequetscht und der Knopf „Termin
   herunterladen" (182px) lief in die Nachbarzelle über „Teilen".
   Gemessen: Knopf endete bei 280px, die zweite Zelle begann bei 238px.
   480px Schwelle = die 472px Bedarf plus etwas Luft. */
@container (max-width: 480px) {
  .tx-mdevents-singleview-header,
  .tx-mdevents-singleview-content { padding: 1rem 1rem 0 1rem; }
  .tx-mdevents-singleview-images { margin-top: 1rem; }
  .tx-mdevents-singleview-figure figcaption { padding: 0.25rem 1rem; }
  .tx-mdevents-singleview-footer { padding: 1rem 1rem 0 1rem; }
  /* Zellen untereinander: `min-width` mit zurücknehmen, sonst hält die
     Tabelle die 220px weiter und die Zelle ragt aus der Spalte. */
  .tx-mdevents-singleview-footer table td {
    display: block;
    min-width: 0;
    padding-right: 0;
  }
  .mdevents-message { padding: 1rem 1.25rem; }
  .tx_mdevents .singleview > .mdevents-message { margin: 1rem; }
  .tx_mdevents .mdevents-message--past { margin: 1rem 0; }
  /* Anmeldeformular in der schmalen Spalte ebenfalls kompakter. */
  .registrationview .asideform { padding: 1.5rem; }
}
/** Legende der Veranstaltungskarte (mdevents_map) im S&Z-Design. Die Basis aus
    md_events/listMap.css nutzt generisches Blau/Grau und ungestylte <hr>; hier
    auf die Palette + Rhythmus gebracht (Trennlinien "Strich", Toggle-Farben,
    Typografie, Hinweisblock). Gleiche Spezifität wie die Basis reicht, da
    styles.css nach listMap.css geladen wird (vgl. Zoom-Button-Override oben). */
/* Titel "Veranstaltungskarte" (h2) + Untertitel "Kategoriefilter" (h3).
   WICHTIG: der Titel ist ein <h2> und bekam sonst die globale h2-Größe
   (clamp bis 44px). "Veranstaltungskarte" ist EIN langes, unteilbares Wort und
   sprengte damit die nur 300–350px schmale Legende → horizontaler Überlauf der
   ganzen Seite ("rausragen"). Hier auf legendengerechte Größe gebracht; dazu
   overflow-wrap als generelle Sicherung gegen lange Wörter in der Legende. */
.mdevents_map .legend_container .leaflet-legend { overflow-wrap: break-word; }
.mdevents_map .legend_container .leaflet-legend h2 {
  font-size: 1.75rem;
  line-height: 1.15;
  font-weight: 700;
  color: var(--color-blue);
  margin: 0 0 0.75rem;
  overflow-wrap: break-word;
}
/* Untertitel/Toggle "Kategoriefilter" (h3): eine klare Stufe unter dem Titel
   (28px → 20px) statt fast gleich groß (war 24px) — bessere Hierarchie. */
.mdevents_map .legend_container .leaflet-legend h3 {
  font-size: 1.25rem;
  line-height: 1.2;
  color: var(--color-blue);
  margin-bottom: 0.25rem;
}
/* ⚠️⚠️ SEIT 12.8.2026 EIN KREIS, KEIN PILL (Wunsch des Users). Vorher stand hier
   ausdrücklich „im Look der Filterleisten-Resets": weißes Pill, blauer Rahmen, blaues
   Undo-Icon. Die Filterleisten-Resets sind am selben Tag ebenfalls Kreise geworden, die
   Begründung von damals trägt also nicht mehr — und sie war ohnehin das Problem: ein
   weißer Knopf auf hellem Grund ist keine erkennbare Schaltfläche, man sieht nur den
   Pfeil. Genau das hat der User zuerst auf md gemeldet.
   Die GEOMETRIE kommt jetzt wieder aus listMap.css (1,5rem, border-radius:50%) — hier
   stehen nur noch die Farben. Selektor 0-4-0 (mit .leaflet-legend) schlägt listMaps
   0-3-0, auch im Mobil-Media-Block dort.
   ⚠️ Die Mobil-Gegenregel von md greift deshalb hier NICHT, und das ist richtig so:
   sprezus Legende ist mobil eine CREME-Box, keine blaue — ein blauer Kreis steht darauf
   gut. Nur die Ringfarbe muss von Hand zurückgeholt werden, sonst zieht listMaps
   Mobilregel sie auf Weiß (auf creme unsichtbar).
   ⚠️ KONTRAST: creme auf --color-blue = 9,35:1. Der rote Hover ist die Hausfarbe für
   genau diese Knöpfe, kommt mit creme aber nur auf 2,79:1 und reißt damit die 3:1 für
   grafische Bedienelemente. Bewusst belassen (die Site macht es überall so); wer die
   3:1 halten will, nimmt --color-red-dark (3,84:1) — dann an ALLEN diesen Knöpfen. */
.mdevents_map .legend_container .leaflet-legend .legend-filter-reset {
  background: var(--color-blue);
  border: none;
  transition: background 0.2s;
}
.mdevents_map .legend_container .leaflet-legend .legend-filter-reset::before {
  content: "\f2ea";
  color: var(--color-light);
  font-size: 0.875rem;
  transition: color 0.2s;
}
.no-touchevents .mdevents_map .legend_container .leaflet-legend .legend-filter-reset:hover,
.mdevents_map .legend_container .leaflet-legend .legend-filter-reset:active {
  background: var(--color-red-dark);
}
.mdevents_map .legend_container .leaflet-legend .legend-filter-reset:focus-visible {
  /* Nur die FARBE zurueckholen (listMap.css zieht sie mobil auf Weiss, auf der
     cremefarbenen Legende unsichtbar). Seit 2026-08-13 ueber --focus-ring-color
     statt fest --color-blue, damit dieser Knopf derselben Logik folgt wie alles
     andere. Ergebnis hier unveraendert: die Legende liegt in keinem Container der
     Ausnahmeliste, die Variable loest also zu Blau auf (8,65:1 auf creme). */
  outline-color: var(--focus-ring-color);
  /* ⚠️ Das Innenband MUSS hier weg. Vom Nutzer am 14.8.2026 gemeldet ("der Fokus
     auf dem Reset sollte besser aussen drum sein"), danach die Kaskade gemessen:
     auf diesem 24x24-Kreis treffen VIER Fokusregeln zusammen.
       styles.css  :where(...)      outline 2px, offset -2px, box-shadow INSET
       styles.css  diese Regel      nur outline-color
       listMap.css .legend-...      outline 3px, offset +2px   <- gewinnt beim Versatz
       listMap.css Mobilblock       outline-color weiss
     Beim outline-offset setzt sich listMap.css durch (0-3-1 gegen die
     0-Spezifitaet von :where), der Ring liegt also richtig AUSSEN. Der inset-
     Schatten aus der ersten Regel blieb aber unwidersprochen und malte
     zusaetzlich ein 5px-Band nach INNEN in den 24px-Kreis — das sah aus wie ein
     zu enger Rahmen und ueberdeckte den Pfeil.
     Ein Hof nach aussen braucht es nicht: durch den +2px-Versatz liegt zwischen
     Knopf und Ring ein cremefarbener Spalt, und damit tragen alle drei Kanten
     mit 8,65 (blauer Knopf | creme Spalt | blauer Ring | creme Legende). */
  box-shadow: none;
}
/* Kategoriefilter mobil (<=800px): listMap.css macht die Legende dort zu einer
   BLAUEN Box (#1271ee) mit weißer Schrift. Hier auf S&Z-Design gebracht:
   Cream-Box mit blauer Typo (wie die übrigen S&Z-Panels). Der .tx_mdevents-
   Prefix hebt die Spezifität über listMaps Regeln (die nach styles.css laden). */
@media only screen and (max-width: 800px) {
  .tx_mdevents.mdevents_map .legend_container.bgcolor-white {
    background-color: var(--color-cream);
    color: var(--color-blue);
  }
  /* Ausgewogener, gleichmäßiger Innenabstand der Cream-Box (statt 24/16/32/16
     aus listMap.css → oben/unten/Seiten uneinheitlich). .tx_mdevents-Prefix
     (0-4-1) schlägt listMaps 0-3-1. */
  .tx_mdevents.mdevents_map .legend_container .leaflet-legend { padding: 1.5rem; }
  .tx_mdevents.mdevents_map .legend_container .leaflet-legend h2,
  .tx_mdevents.mdevents_map .legend_container .leaflet-legend h3,
  .tx_mdevents.mdevents_map .legend_container .leaflet-legend strong,
  .tx_mdevents.mdevents_map .legend_container .leaflet-legend a { color: var(--color-blue); }
  .tx_mdevents.mdevents_map .legend_container .leaflet-legend h4 { color: var(--color-red); }
  .tx_mdevents.mdevents_map .legend_container hr { border-color: rgba(var(--color-blue-rgb), 0.15); }
  /* Toggle-Ring: subtiles Blau statt Weiß (2px-Struktur bleibt → kein Sprung). */
  .tx_mdevents.mdevents_map .legend-item .toggleswitch { border-color: rgba(var(--color-blue-rgb), 0.2); }
  .no-touchevents .tx_mdevents.mdevents_map .legend-item label:hover .title,
  .tx_mdevents.mdevents_map .legend-item label:active .title { color: var(--color-red-dark); }
  /* Orange-Marker-Hinweis braucht auf Cream keinen weißen Kasten mehr. */
  .tx_mdevents.mdevents_map .legend_container .orangemarker { background-color: transparent; padding: 0; }
}
.mdevents_map .legend_container .leaflet-legend h4 {
  font-size: 0.875rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--color-red);
  margin: 0 0 1.25rem;
}
/* Trennlinien ("Strich") — subtil und mit Luft, wie die Medien-/News-Trenner */
.mdevents_map .legend_container .leaflet-legend hr {
  border: 0;
  height: 1px;
  background: rgba(var(--color-blue-rgb), 0.15);
  margin: 1.5rem 0;
}
/* Kategorie-Toggles: Abstände, vertikal zentriert, Beschriftung in Blau */
.mdevents_map .legend_container .legend-items-list { margin: 0; }
.mdevents_map .legend_container .legend-item { margin: 0.75rem 0; }
.mdevents_map .legend_container .legend-item > label { align-items: center; }
.mdevents_map .legend_container .legend-item > label > span:last-child { color: var(--color-blue); }
/* Toggle-Track: "aus" in blau-getöntem Grau, "an" erbt die Kategorie-Farbe
   (inline style-Attribut aus dem Template). ".legend_container" qualifiziert
   (Spezifität 0-5-0), damit es listMaps gleich-spezifisches #ebebeb schlägt,
   das nach dieser Datei geladen wird. Die "an"-Regel (input:checked + .slider,
   0-5-1) aus listMap bleibt stärker und behält die Kategorie-Farbe. */
.mdevents_map .legend_container .legend-item .toggleswitch .slider { background-color: rgba(var(--color-blue-rgb), 0.15); }
/* Hinweisblock (letzter direkter <span> der Legende) lesbar in Blau */
.mdevents_map .legend_container .leaflet-legend > span {
  display: block;
  font-size: 0.875rem;
  line-height: 1.5;
  color: var(--color-blue);
}
/* Suchfeld + "Veranstaltung eintragen"-Button (falls in den Plugin-Settings
   aktiviert) an die Formular-/Button-Optik der Seite angleichen */
.mdevents_map .legend_container .legend-input {
  width: 100%;
  padding: 0.6rem 0.9rem;
  border: 1px solid rgba(var(--color-blue-rgb), 0.2);
  border-radius: 4px;
  background: #fff;
  color: var(--color-blue);
  font-size: 1rem;
}
.mdevents_map .legend_container .legend-input:focus {
  outline: none;
  border-color: var(--color-blue);
}
.mdevents_map .legend_container .legend-send .button-filled {
  display: inline-block;
  padding: 0.7rem 1.4rem;
  border-radius: 999px;
  background: var(--color-blue);
  color: #fff;
  font-weight: 700;
  text-decoration: none;
  transition: background 0.2s;
}
.no-touchevents .mdevents_map .legend_container .legend-send .button-filled:hover,
.mdevents_map .legend_container .legend-send .button-filled:active { background: var(--color-red-dark); }

/***  END md_events ***/
/**** END - FROM custom_md2022 - styles-plugins.css ****/

/* START - Nach-oben-Button */
/* Runder Button fest rechts unten; per nav.js ab ~400px Scrolltiefe eingeblendet,
   Klick scrollt smooth nach oben.
   ⚠️⚠️ SEIT 12.8.2026 UMGEDREHT: BLAUER Kreis mit weißem Pfeil, Hover -> rot.
   Vorher rot mit Hover blau, also invers zu jedem anderen gefüllten Knopf der
   Site (.btn-blue-filled, Karten-Zoomknöpfe, Dialog-Schließen gehen alle
   blau -> rot). Entscheidung des Users.
   ⚠️⚠️ `color` MUSS im Hover WIEDERHOLT werden. Zeile 106 dieser Datei setzt an
   einem nackten `a:hover` die Farbe --color-red-dark; Spezifität 0-1-1 — das
   schlägt die 0-1-0 der Grundregel hier. Ohne die Wiederholung wurde der Pfeil
   beim Zeigen ROT AUF BLAU (gemessen 3,35:1), obwohl keine einzige
   .scroll-top-Regel je eine rote Schrift gesetzt hat. Genau das hat der User
   mit „Inhalt bleibt weiß" gemeint. Gilt für JEDE Hover-Regel an einem <a>:
   das Markup ist <a href="#top" class="scroll-top"> OHNE Klasse `btn`, sonst
   finge das globale `.btn:hover` mit color:#fff !important es ab.
   ⚠️ In Kommentaren KEINE geschweiften Klammern verwenden — mehrere Prüfskripte
   zerlegen das Stylesheet an diesen Zeichen und sähen sonst eine Regel, die es
   gar nicht gibt. Am 12.8.2026 genau so passiert. */
.scroll-top {
  position: fixed;
  right: 1.5rem;
  bottom: 1.5rem;
  z-index: 1000;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 3rem;
  height: 3rem;
  border-radius: 50%;
  background: var(--color-blue);
  color: #ffffff;
  font-size: 1.125rem;
  line-height: 1;
  text-decoration: none;
  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.2);
  opacity: 0;
  visibility: hidden;
  transform: translateY(0.5rem);
  transition: opacity 0.25s ease, transform 0.25s ease, background-color 0.2s ease;
}
.scroll-top.is-visible {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}
.no-touchevents .scroll-top:hover,
.scroll-top:active,
.scroll-top:focus-visible {
  background: var(--color-red-dark);
  color: #ffffff;   /* Pflicht, siehe Kasten oben — sonst gewinnt a:hover */
}
/* ⚠️⚠️ EIGENE Fokus-Regel, weil .scroll-top oben einen eigenen `box-shadow`
   (Schlagschatten) hat. Der globale Ring hängt ebenfalls an `box-shadow`, und die
   Eigenschaft wird als GANZES überschrieben — der Knopf war deshalb der einzige
   ohne cremefarbenen Ring, ohne dass irgendwo ein Fehler sichtbar wurde.
   Hier stehen beide Schichten zusammen: erst der Ring, dann der Schlagschatten.
   ⚠️ Wer den Schlagschatten oben ändert, muss ihn hier mitziehen — sonst springt
   er beim Fokussieren. Am 12.8.2026 nachgezählt: außer diesem Knopf haben nur
   .highlight-tile-thumb und .custom-tile-item-meta einen eigenen Schatten, und
   beide sind nicht fokussierbar.
   ⚠️⚠️ Die `outline` steht seit 2026-08-13 dabei und ist NICHT kosmetisch: das
   farbige Band von --focus-ring-inner traegt IMMER den :root-Wert (Begruendung
   ganz oben am :root — ein var() in einer Custom Property wird beim Deklarieren
   ersetzt, nicht beim Benutzen). Ueberall sonst deckt die outline dieses Band ab;
   dies war die einzige Regel ohne outline und damit die einzige Stelle, an der der
   Ausnahmewert je haette durchfallen koennen. Hier faellt es nicht auf, weil
   .scroll-top in keinem Ausnahme-Container liegt (gemessen: blau auf creme,
   Band 9,35 · weisses Innenband auf der eigenen blauen Flaeche 9,90) — die Regel
   steht trotzdem, damit die Zusage "outline immer mitsetzen" luekenlos gilt. */
.scroll-top:focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
  box-shadow: var(--focus-ring-inner), 0 0.25rem 0.75rem rgba(0, 0, 0, 0.2);
}
/* END - Nach-oben-Button */

/* START - Termin einreichen (md_events "registerevent", alle Schritte) */
/* Das geteilte Plugin bringt nur Bootstrap-nahe Klassennamen mit (fieldset /
   legend, .form-group, .form-row, .form-control, .form-check, .btn-*) und KEIN
   eigenes Stylesheet. In custom_sprezu war davon nichts gestaltet: Standard-
   Rahmen um die fieldsets, Systemfelder — und zwei UNSICHTBARE Knöpfe, weil
   .btn zwar existiert (color:#fff, kein Hintergrund), die Varianten
   .btn-cancel/.btn-blue-border ("Zurück", Schritte 2-5) und .button-filled
   ("Absenden" im E-Mail- und Code-Formular) aber nie definiert wurden.
   Hier mit denselben Tokens nachgebaut wie das Anmeldeformular
   (.registrationview weiter oben): cremefarbene Karte, weiße Felder mit roter
   Fokus-Kontur, Pill-Buttons. Ein Block deckt ALLE Schritte ab (E-Mail, Code,
   1-6), weil alle dasselbe Markup benutzen.
   Alles unter .registerevent_view gescoped — Ausnahme sind der Kalender
   (flatpickr hängt sein Fenster an <body>) und die CKEditor-Hülle. */

/* Das <h2> der Partials ist eine Unterzeile zur H1, keine zweite
   Seitenüberschrift: die globale h2-Größe (bis 44px) erschlug hier die H1.
   Rückgängig gemacht (Wunsch: einheitlich mit den übrigen Seiten): die
   Zwischenüberschrift war hier auf 20-28px gedeckelt, während eine h2 sonst
   clamp(28px, 4vw, 44px) misst. Sie folgt jetzt wieder der globalen Regel
   (Z. 105) — der Grund für die Deckelung ist entfallen, seit die h1 auf
   Hero-Größe begrenzt ist. Der Abstand nach unten ist in beiden Regeln
   derselbe (24px), es bleibt also nur der fehlende Abstand oben zu setzen. */

/* Senkrechter Rhythmus im Kopfbereich. Die globale h1 bringt keinen Abstand
   nach unten mit und "ul.typo3-messages" steht absichtlich auf margin:0
   (Bestätigungsbox der EXT:form-Formulare, Z. 852) — im Plugin klebten
   dadurch Überschrift, Meldung und Zwischenüberschrift direkt aufeinander. */
.registerevent_view > h1 { margin-bottom: 2rem; }
.registerevent_view > ul.typo3-messages { margin-bottom: 2rem; }
.registerevent_view > ul.typo3-messages > li.alert + li.alert { margin-top: 1rem; }
.registerevent_view > h2,
.registerevent_view > div:not([class]) > h2 { margin-top: 0; }
/* Der Einleitungstext über dem ersten Feld (E-Mail-/Code-Formular, Schritt 1). */
.registerevent_view > p { margin: 0 0 2rem; }

/* Restlaufzeit-Zähler rechts oben ("Session: mm:ss"). Aufbau, Grundfarben und
   Verhalten liegen im Template (md_events, EventRegisterEvent/RegisterEvent.html)
   und gelten für alle Sites; hier stehen nur die S&Z-Werte.
   Der Zähler klebt beim Scrollen und muss dabei unter der fixierten .nav
   bleiben. Deren Höhe wechselt am Umbruchpunkt (Z. 140: 92px, ab 768px Z. 303:
   76px) — der Abstand muss deshalb MITZIEHEN, sonst hängt der Zähler auf dem
   Desktop 24px zu tief. Jeweils Kopfleistenhöhe + 8px Luft.
   Warn- und Alarmfarben bewusst NICHT überschrieben: die Markenrottöne halten
   als Textgrund die 4,5:1 nicht (vgl. Play-Knopf video_shariff, 2,96:1).
   Der Zähler ist ein <div>, KEIN <p> — die Absatzregel eine Zeile höher greift
   deshalb nicht, der Abstand kommt aus dem Template. */
.registerevent_view {
  --registerevent-session-top: 6.25rem;
  --registerevent-session-bg: var(--color-cream);
  --registerevent-session-fg: var(--color-blue);
  --registerevent-session-border: var(--color-red);
}
@media (min-width: 768px) {
  .registerevent_view { --registerevent-session-top: 5.25rem; }
}

/* Ein Schritt = eine Karte. */
.registerevent_view fieldset {
  background: var(--color-cream);
  border: 0;
  border-radius: 1rem;
  padding: 2.5rem;
  margin: 0;
}
/* float + width machen aus dem <legend> ein normales Blockelement; ohne das
   sitzt es im (hier entfernten) Rahmen und ignoriert die Innenabstände. */
.registerevent_view legend {
  float: left;
  width: 100%;
  padding: 0;
  margin: 0 0 2rem;
  /* Auf Wunsch so groß wie eine h3 (Z. 106: 24px). Versalien und Sperrung
     bleiben — das ist die Auszeichnung der Einzelansicht. */
  font-size: 1.5rem;
  font-weight: 800;
  line-height: 1.2;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  /* Die Kapitälchen-Label der Einzelansicht sind rot; auf Creme kommt
     --color-red nur auf 2,6:1 und --color-red-dark auf 3,6:1 — beides zu wenig
     für Text dieser Größe. Deshalb Blau (8,7:1), roter Akzent per Linie. */
  color: var(--color-blue);
}
.registerevent_view legend::after {
  content: "";
  display: block;
  width: 3.5rem;
  height: 0.25rem;
  margin-top: 0.75rem;
  background: var(--color-red);
  border-radius: 0.125rem;
}
.registerevent_view legend + * { clear: both; }

.registerevent_view .form-group { margin-bottom: 1.75rem; }
.registerevent_view .form-group:last-child { margin-bottom: 0; }
.registerevent_view .form-row { display: flex; gap: 1.5rem; }
.registerevent_view .form-row > .form-group { flex: 1; min-width: 0; }

/* Beschriftungen. Das Eingabefeld steht IM <label> (Markup des Plugins),
   deshalb rückt es unter den Text, sobald beide Blockelemente sind. */
.registerevent_view .form-group > label,
.registerevent_view .form-control-label {
  display: block;
  font-size: 0.8125rem;
  font-weight: 700;
  color: var(--color-blue);
}
.registerevent_view .form-control-label { margin-bottom: 0.5rem; }
.registerevent_view .form-group-label-help {
  display: block;
  font-weight: 400;
  font-size: 0.75rem;
  color: rgba(var(--color-blue-rgb), 0.75);
}

/* Felder. :not([type="radio"]) ist nötig, weil die Radios im Plugin ebenfalls
   die Klasse .form-control tragen — mit width:100% würden sie zu Balken. */
.registerevent_view .form-control:not([type="radio"]) {
  display: block;
  width: 100%;
  margin-top: 0.375rem;
  background: #fff;
  border: 1px solid rgba(var(--color-blue-rgb), 0.3);
  border-radius: 0.25rem;
  padding: 0.625rem 0.75rem;
  font-family: inherit;
  font-size: 0.9375rem;
  color: var(--color-blue);
  transition: border-color 0.2s;
}
.registerevent_view textarea.form-control { resize: vertical; min-height: 9rem; }
.registerevent_view .form-control:not([type="radio"]):focus {
  outline: none;
  border-color: var(--color-red);
}
.registerevent_view .form-control::placeholder { color: rgba(var(--color-blue-rgb), 0.5); }
/* Die E-Mail-Adresse ist in Schritt 1 gesperrt (bereits bestätigt) — das darf
   man sehen, statt es wie ein normales Feld aussehen zu lassen. */
.registerevent_view .form-control[readonly] {
  background: rgba(var(--color-blue-rgb), 0.06);
  color: rgba(var(--color-blue-rgb), 0.75);
  cursor: not-allowed;
}
/* ⚠️ Dasselbe readonly, zwei Bedeutungen: flatpickr setzt seine Felder selbst
   auf readonly (im Init von ShowEventFormStep2.html steht kein allowInput, im
   Bundle: w.config.allowInput||w._input.setAttribute("readonly","readonly")).
   Gesperrt sind Datum und Enddatum damit aber NICHT — ein Klick öffnet den
   Kalender. Der Sperr-Cursor der Regel darüber wäre hier eine Falschaussage.
   Der graue Grund bleibt: er zeigt richtig an, dass man nicht tippen kann. */
.registerevent_view .form-control.flatpickr-datetime[readonly] {
  cursor: pointer;
}

/* Auswahlknöpfe (Veranstaltungstyp, Format) */
.registerevent_view .inputs-list { display: flex; flex-direction: column; gap: 0.625rem; }
.registerevent_view .form-check-label {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  font-size: 0.9375rem;
  color: var(--color-blue);
  cursor: pointer;
}
.registerevent_view input.form-control[type="radio"] {
  width: 1.125rem;
  height: 1.125rem;
  margin: 0;
  flex-shrink: 0;
  accent-color: var(--color-blue);
  cursor: pointer;
}

/* Hinweiskästen. Das Plugin setzt per f:asset.css (RegisterEvent.html) das
   Ausrufezeichen-Symbol und padding-left:50px; die Regeln hier sind mit 0-2-0
   spezifischer und gewinnen unabhängig von der Ladereihenfolge. Das
   background-image bleibt erhalten, weil nur background-color gesetzt wird. */
.registerevent_view .form-help-message {
  background-color: #fff;
  /* Das Plugin legt hier per f:asset.css sein eigenes SVG als Hintergrundbild
     ab (EXT:md_events/Resources/Public/Icons/icon_exclamation_mark.svg, mit
     fest eingebautem "fill: #1a7dff" aus md2022). Die Datei liegt in der
     geteilten Extension, ein Austausch dort träfe alle ~23 Sites — deshalb
     wird das Bild hier abgeschaltet und durch das FontAwesome-Zeichen ersetzt,
     das sprezu ohnehin lädt (Vendor/fontawesome/css/solid.min.css). */
  background-image: none;
  position: relative;
  border-left: 0.25rem solid var(--color-red);
  border-radius: 0.5rem;
  padding: 1.5rem 1.5rem 1.5rem 4rem;
  font-size: 0.875rem;
  line-height: 1.5;
}
/* \f06a = circle-exclamation, dieselbe Form wie das bisherige Bild.
   font-weight: 900 ist bei "Font Awesome 6 Free" die gefüllte Schnitt-
   variante — ohne die Angabe hinge das Zeichen am geerbten Gewicht. */
.registerevent_view .form-help-message::before {
  content: "\f06a";
  font-family: 'Font Awesome 6 Free';
  font-weight: 900;
  font-size: 1.5rem;
  line-height: 1;
  color: var(--color-blue);
  position: absolute;
  left: 1.5rem;
  top: 1.5rem;
}
.registerevent_view .form-help-message h3 {
  font-size: 0.9375rem;
  color: var(--color-blue);
  margin: 0 0 0.25rem;
}
.registerevent_view .form-help-message p { margin: 0 0 0.5rem; }
.registerevent_view .form-help-message > *:last-child { margin-bottom: 0; }
.registerevent_view .form-help-message ul { margin: 0; padding-left: 1.25rem; }
.registerevent_view .form-help-message li { margin-bottom: 0.25rem; }
.registerevent_view .help-block { display: block; margin-top: 1rem; }
.registerevent_view .form-group-statictext { font-size: 0.875rem; line-height: 1.5; }

/* Knopfleiste */
.registerevent_view .actions { margin-top: 2rem; }
.registerevent_view .btn-toolbar,
.registerevent_view .btn-group { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; }
.registerevent_view .btn { margin: 0; }
/* Angeglichen am 12.8.2026: war --color-red (2,79:1), ist jetzt derselbe Ring wie
   ueberall sonst — Werte aus den --focus-ring-* am Dateianfang. Die Regel ist seit
   .btn:focus-visible weiter oben eigentlich ueberfluessig; sie bleibt stehen,
   damit eine kuenftige Sonderfarbe fuer dieses Formular hier eine Stelle hat.
   ⚠️ Wer sie aendert, setzt BEIDE Teile — nur `outline` liesse den cremefarbenen
   Innenring der globalen Regel stehen und ergaebe eine Mischung. */
.registerevent_view .btn:focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
  box-shadow: var(--focus-ring-inner);
}
/* "Absenden" im E-Mail-/Code-Formular trägt .button-filled statt
   .btn-blue-filled — ohne diese Regel weiße Schrift auf hellem Grund. */
.registerevent_view .button-filled {
  border: 1px solid var(--color-blue);
  background: var(--color-blue);
  color: #fff;
}
/* Der Zurück-Knopf als Umriss-Pille.
   ⚠️⚠️ SEIT 12.8.2026: beim Zeigen wird die Pille NICHT mehr blau gefüllt,
   sondern behält ihren hellen Grund und bekommt roten Rahmen und rote Schrift —
   dieselbe Antwort, die alle hellen Bedienelemente der Site geben (die
   Events-Filterleiste machte es schon immer so). Entscheidung des Users.
   ⚠️⚠️ Dafür musste die globale Regel `.btn:hover` mit color:#fff !important
   weiter oben in dieser Datei um :not(.btn-cancel):not(.btn-blue-border)
   ergänzt werden. Ein !important lässt sich nicht durch höhere Spezifität
   schlagen — ohne diese Ausnahme bliebe die Schrift weiß und wäre auf dem
   hellen Grund unsichtbar. Wer die Ausnahme dort entfernt, bricht es hier.
   ⚠️ :active bleibt die blaue Füllung mit weißer Schrift: das ist der
   Gedrückt-Zustand und auf Berührgeräten die einzige Rückmeldung. */
.registerevent_view .btn-cancel,
.registerevent_view .btn-blue-border {
  background: transparent;
  border: 1px solid var(--color-blue);
  color: var(--color-blue);
}
.registerevent_view .btn-cancel:active,
.registerevent_view .btn-blue-border:active {
  background: var(--color-blue);
  color: #fff;
}
@media (hover: hover) {
  .registerevent_view .button-filled:hover {
    border-color: var(--color-red-dark);
    background: var(--color-red-dark);
  }
  .registerevent_view .btn-cancel:hover,
  .registerevent_view .btn-blue-border:hover {
    background: transparent;
    border-color: var(--color-red-dark);
    color: var(--color-red-dark);
  }
}

/* Schritt 2: CKEditor 4 (per CDN geladen, Hülle .cke_chrome/.cke_top/
   .cke_bottom). Der Fließtext selbst steckt in einem iframe und ist von hier
   aus nicht erreichbar — gestaltet wird nur der Rahmen. */
.registerevent_view .cke_chrome {
  border: 1px solid rgba(var(--color-blue-rgb), 0.3);
  border-radius: 0.25rem;
  overflow: hidden;
  margin-top: 0.375rem;
}
.registerevent_view .cke_top,
.registerevent_view .cke_bottom {
  background: var(--color-light);
  border-color: rgba(var(--color-blue-rgb), 0.3);
  box-shadow: none;
}

/* Schritt 5: die Vorschau ist eine echte Einzelansicht und bringt ihr Aussehen
   selbst mit — ".tx_mdevents .singleview" (weiter oben) ist bereits die weiße
   Karte mit 16px-Radius und Schatten. Hier deshalb KEINE zweite Karte darum:
   ein eigener Kasten mit overflow:hidden verhinderte das Zusammenfallen der
   Außenabstände, wodurch das margin-top:20px aus dem f:asset.css von
   ShowEventFormStep5.html sichtbar wurde und die gestrichelte Linie 20px
   unterhalb der Oberkante begann. Angepasst wird nur die Rahmenfarbe — im
   Plugin steht dort das md2022-Blau #1a7dff. */
.registerevent_view fieldset .singleview {
  border-color: rgba(var(--color-blue-rgb), 0.4);
  margin-top: 0;
}
/* "zurück", der iCal-Knopf und die Teilen-Leiste werden in der Vorschau gar
   nicht mehr erzeugt — die Bedingung dafür steht in
   custom_sprezu/Resources/Private/MdEvents/Partials/Event/Properties.html.
   Hier ist deshalb nichts auszublenden. */

/* Schritt 6: die Abschlussmeldung ist ein <div> ganz ohne Klasse und stand
   sonst nackt auf der Seite. */
.registerevent_view > div:not([class]) {
  background: var(--color-cream);
  border-radius: 1rem;
  padding: 2rem;
}
.registerevent_view > div:not([class]) > h2 { margin-top: 0; }
.registerevent_view > div:not([class]) p { margin: 0 0 0.75rem; }
.registerevent_view > div:not([class]) p:last-child { margin-bottom: 0; }
.registerevent_view > div:not([class]) a { color: var(--color-blue); font-weight: 700; }

/* Kalender (flatpickr, Thema "material_blue"). Er hängt an <body>, kann also
   nicht unter .registerevent_view gescoped werden; .flatpickr-calendar kommt
   auf sprezu nur in diesem Formular vor.
   Jede Regel führt ".flatpickr-calendar" mit, damit sie auch dann gewinnt,
   wenn das CDN-Stylesheet nach dieser Datei geladen wird. */
.flatpickr-calendar {
  background: #fff;
  border: 1px solid rgba(var(--color-blue-rgb), 0.15);
  border-radius: 0.75rem;
  box-shadow: 0 0.5rem 1.5rem rgba(var(--color-blue-rgb), 0.18);
  font-family: inherit;
}
/* Kopf: Monat, Jahr und Pfeile auf Blau — dort muss ALLES weiß sein, sonst
   bleibt es beim Vorgabewert des Themas (rgba(0,0,0,0.54)) und verschwindet
   im dunklen Grund. Genau das war bei den Wochentagen der Fall. */
.flatpickr-calendar .flatpickr-months {
  background: var(--color-blue);
  border-radius: 0.75rem 0.75rem 0 0;
  overflow: hidden;
}
.flatpickr-calendar .flatpickr-months .flatpickr-month,
.flatpickr-calendar .flatpickr-current-month,
.flatpickr-calendar .flatpickr-current-month input.cur-year,
.flatpickr-calendar .flatpickr-monthDropdown-months {
  background: transparent;
  color: #fff;
  fill: #fff;
  font-weight: 700;
}
/* Die aufgeklappte Liste des Monatsfeldes zeichnet das Betriebssystem — dort
   gilt Blau auf Weiß, nicht Weiß auf Weiß. */
.flatpickr-calendar .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month {
  background: #fff;
  color: var(--color-blue);
}
.flatpickr-calendar .flatpickr-months .flatpickr-prev-month svg,
.flatpickr-calendar .flatpickr-months .flatpickr-next-month svg { fill: #fff; }
.flatpickr-calendar .flatpickr-months .flatpickr-prev-month:hover svg,
.flatpickr-calendar .flatpickr-months .flatpickr-next-month:hover svg { fill: var(--color-red-dark); }
.flatpickr-calendar .numInputWrapper:hover { background: rgba(255, 255, 255, 0.15); }

/* Wochentagszeile */
.flatpickr-calendar .flatpickr-weekdays,
.flatpickr-calendar .flatpickr-weekdaycontainer { background: var(--color-blue); }
.flatpickr-calendar span.flatpickr-weekday {
  background: var(--color-blue);
  color: #fff;
  font-weight: 700;
  font-size: 0.75rem;
  letter-spacing: 0.04em;
}

/* Tage */
.flatpickr-calendar .flatpickr-day {
  color: var(--color-blue);
  border-radius: 50%;
  border-color: transparent;
}
.flatpickr-calendar .flatpickr-day:hover,
.flatpickr-calendar .flatpickr-day:focus {
  background: var(--color-cream);
  border-color: var(--color-cream);
}
.flatpickr-calendar .flatpickr-day.today {
  border-color: var(--color-red);
  color: var(--color-blue);
}
.flatpickr-calendar .flatpickr-day.selected,
.flatpickr-calendar .flatpickr-day.selected:hover,
.flatpickr-calendar .flatpickr-day.startRange,
.flatpickr-calendar .flatpickr-day.endRange {
  background: var(--color-blue);
  border-color: var(--color-blue);
  color: #fff;
}
.flatpickr-calendar .flatpickr-day.prevMonthDay,
.flatpickr-calendar .flatpickr-day.nextMonthDay,
.flatpickr-calendar .flatpickr-day.flatpickr-disabled,
.flatpickr-calendar .flatpickr-day.flatpickr-disabled:hover {
  color: rgba(var(--color-blue-rgb), 0.35);
  background: transparent;
  border-color: transparent;
}

/* Uhrzeit-Leiste am Fuß */
.flatpickr-calendar .flatpickr-time {
  border-top: 1px solid rgba(var(--color-blue-rgb), 0.15);
  border-radius: 0 0 0.75rem 0.75rem;
}
.flatpickr-calendar .flatpickr-time input,
.flatpickr-calendar .flatpickr-time .flatpickr-time-separator,
.flatpickr-calendar .flatpickr-time .flatpickr-am-pm {
  color: var(--color-blue);
  font-weight: 700;
}
.flatpickr-calendar .flatpickr-time input:hover,
.flatpickr-calendar .flatpickr-time input:focus,
.flatpickr-calendar .flatpickr-time .flatpickr-am-pm:hover { background: var(--color-cream); }

@media (max-width: 600px) {
  .registerevent_view fieldset,
  .registerevent_view > div:not([class]) { padding: 1.25rem; }
  .registerevent_view .form-row { flex-direction: column; gap: 0; }
  .registerevent_view .form-help-message {
    padding: 1rem 1rem 1rem 3.25rem;
    background-position: 1rem 1rem;
  }
  .registerevent_view .btn-group { width: 100%; }
  .registerevent_view .btn { flex: 1; }
}
/* END - Termin einreichen */

/* START - userdata "Weiterverbreiten" (Teilen-Block) */
/* Das Plugin userdata_campaignbroadcaster bringt EIGENES CSS mit
   (userdata/Resources/Public/Css/styles.css, per page.includeCSS aus
   userdata/Configuration/TypoScript/setup.typoscript:361 — auf JEDER Site).
   Darin tragen die Teilen-Knoepfe die Hausfarben der Plattformen; am
   17.8.2026 auf /weiterverbreiten-online gemessen: Facebook #3b5998,
   WhatsApp #3aaa34, Bluesky #0085ff, E-Mail #86bc26.

   ⚠️⚠️ DIESE FARBEN BLEIBEN. Sie waren am 17.8.2026 kurzzeitig auf
   S&Z-Blau vereinheitlicht und wurden vom Nutzer ausdruecklich
   zurueckgeholt ("die Buttons wieder mit den Corporate Farben"). Form und
   Schrift kommen ohnehin aus dem S&Z-Design (.btn: Pille 999px,
   Interstate, 700) — die Knoepfe fuegen sich also ein, ohne dass ihnen die
   Wiedererkennbarkeit genommen wird. NICHT erneut umfaerben.

   Diese Datei laedt nur das sprezu-Wurzeltemplate; im ausgelieferten Bundel
   steht sie HINTER dem userdata-CSS (gemessen: Position 10.325 gegen
   128.992) — was hier steht, gewinnt also schon ueber die Reihenfolge.

   ⚠️ KEINE Marken-Icons auf den Knoepfen. `fa-bluesky` gibt es in der hier
   eingebundenen FontAwesome 6.2.1 NICHT — am freien Paket nachgemessen:
   6.5.1 null Treffer, ab 6.5.2 vorhanden (U+E671). Es waere ein leeres
   Kaestchen ohne jede Fehlermeldung. Dazu laedt diese Seite die
   Brands-Datei bisher gar nicht, und laut
   Vendor/fontawesome/subset-bauen.sh laesst sich Brands hier nicht
   subsetten. Wer die Icons will, hebt zuerst FontAwesome an — und zwar in
   custom_sprezu UND custom_md2022, deren FA-Dateien byte-gleich sind. */
/* Abstaende. Das Plugin liefert seine Bloecke voellig ohne Rhythmus: die
   beiden Absaetze oben und der Knopfblock standen mit margin 0 direkt
   aneinander (am 17.8.2026 an der Live-Seite gemessen). Die Kopier-
   Schaltflaechen bringen ihre 20px selbst im style-Attribut mit, die
   brauchen nichts.
   ⚠️ Bewusst `> p` statt `.tx-userdata p`: der Meldungskasten der
   E-Mail-Bestaetigung enthaelt ebenfalls ein <p> (ul.typo3-messages >
   li.alert > p.alert-message), und das steht dort absichtlich auf
   margin:0. Ein pauschales .tx-userdata p haette ihm 1rem untergeschoben. */
.tx-userdata > p,
.tx-userdata .sharerWrapper > p { margin: 0 0 1rem; }
.tx-userdata .sharerWrapper { margin-top: 1.5rem; }

/* Die beiden Kopier-Schaltflaechen tragen ihre Gestaltung im
   style-Attribut am Element (Broadcast.html): Groesse, Fettung,
   transparenter Grund, fehlender Rahmen, Innenabstand. Das ist ohne
   !important nicht zu aendern — und muss es auch nicht sein. Auffaellig
   waren genau die zwei Eigenschaften, die NICHT im style-Attribut stehen:
   gemessen Arial 20px in Schwarz mitten in einer Interstate-Seite.
   Die Icons (fa-copy/fa-check) erben die Farbe mit. */
.tx-userdata button {
  color: var(--color-blue);
  font-family: inherit;
}

@media (hover: hover) {
  .tx-userdata button:hover { color: var(--color-red); }
}

/* Textvorschlag und Link-Feld kamen als reine Browser-Vorgabe: Monospace
   13,3px, grauer 1px-Rahmen (#767676), eckige Ecken.

   ⚠️⚠️ DER HINTERGRUND IST WEISS, NICHT var(--color-light). Der erste
   Versuch am 17.8.2026 nahm --color-light aus
   ".frame-type-form_formframework .form-control" (Z. 1157) — das ist aber
   GENAU der Seitenhintergrund (body = #FBF8F4, nachgemessen), das Feld
   verschwand darin. Die sichtbaren sprezu-Felder stehen auf Weiss.
   Referenz ist das Newsletter-Feld im Footer, an derselben Seite
   abgelesen: bg #fff, Rahmen blau 0.25, radius 4px.
   Merksatz: eine Flaechenfarbe nie aus einer anderen Regel uebernehmen,
   ohne nachzusehen, WORAUF die Flaeche liegt.

   `padding: 0.5em` statt der 10px/12px der Referenz, weil das Link-Feld
   diesen Wert inline im Template stehen hat — so sind beide Felder gleich,
   ohne dass ich dem Template mit !important hineinregieren muss.

   Schriftgroesse 1rem mit Zeilenhoehe 1.6: der Fliesstext der Seite laeuft
   auf 14px/22.4px (= 1.6). Das Feld stand vorher auf 15px und
   `line-height: normal` und wirkte dadurch gedraengt — vom Nutzer
   gemeldet ("groessere Schrift / wie Fliesstext").

   ⚠️ KEIN `outline:none` im :focus. Die aelteren Feldregeln dieser Datei
   machen das und mussten am 12.8.2026 durch den FOKUS-Nachtrag am
   Dateiende wieder eingefangen werden. Ohne outline:none greift die
   globale :where(...)-Regel (Z. 300) von selbst und der Ring stimmt. */
.tx-userdata textarea,
.tx-userdata input[type="text"] {
  background: #fff;
  border: 1px solid rgba(var(--color-blue-rgb), 0.25);
  border-radius: 4px;
  color: var(--color-blue);
  font-family: inherit;
  font-size: 1rem;
  line-height: 1.6;
  margin-top: 0.5rem;
  padding: 0.5em;
  transition: border-color 0.2s;
}
.tx-userdata textarea:focus,
.tx-userdata input[type="text"]:focus { border-color: var(--color-red); }

/* Kein Scrollbalken im Textvorschlag. Das Template nagelt das Feld mit
   `min-height:300px` inline fest, der Text braucht bei 1rem/1.6 aber
   451px (gemessen) — es blieben 6px Ueberhang schon bei der alten,
   kleineren Schrift. Statt einer festen Ersatzhoehe, die bei einer
   anderen Kampagne oder schmalem Fenster wieder danebenlaege, waechst
   das Feld mit seinem Inhalt.
   ⚠️ `field-sizing` kennen nur neuere Browser (im Pruefbrowser am
   17.8.2026 per CSS.supports bestaetigt). Wo es fehlt, bleibt es beim
   heutigen Verhalten — fester Kasten mit Balken, kein kaputtes Layout.
   `height:auto` muss dazu, sonst legt das rows-Attribut des <textarea>
   die Hoehe doch wieder fest. */
.tx-userdata textarea {
  field-sizing: content;
  height: auto;
  resize: vertical;
}
/* END - userdata "Weiterverbreiten" (Teilen-Block) */

/* ============================================================
   FOKUS — Nachtrag fuer Formularfelder (12.8.2026)
   ------------------------------------------------------------
   Acht Regeln weiter oben setzen im :focus `outline:none` und markieren den
   Fokus stattdessen ueber die Rahmenfarbe. Fuer die Maus ist das richtig —
   fuer die TASTATUR war es zu wenig, und ihre Spezifitaet schlaegt die
   globale :where()-Regel am Dateianfang muehelos.
   Diese Gegenregel holt den Ring zurueck, OHNE die Rahmenfarbe anzutasten:
   dieselben Selektoren, nur `:focus` -> `:focus-visible`, und weil sie am
   Dateiende steht, gewinnt sie bei gleicher Spezifitaet ueber die Reihenfolge.
   ⚠️ Die Selektoren sind maschinell aus dem Bestand erzeugt, nicht abgetippt —
   ein selbst formulierter Selektor haette leicht eine andere Spezifitaet und
   verloere dann still. Wer oben einen Selektor aendert, muss ihn hier mitziehen.
   ⚠️ Nur :focus-visible, nicht :focus — sonst zeichnete der Ring auch beim
   Mausklick ins Feld, und genau das sollten die outline:none-Regeln verhindern. */
.sidebar-form input[type="text"]:focus-visible,
.sidebar-form input[type="email"]:focus-visible,
.sidebar-form textarea:focus-visible,
.frame-type-form_formframework .form-control:focus-visible,
.events-filter-select:focus-visible,
:is([class*="frame-type-container"].frame-blue, [class*="frame-type-container"].is-footer) .form-control:focus-visible,
.registrationview .form-control:focus-visible,
.mdevents_map .legend_container .legend-input:focus-visible,
.registerevent_view .form-control:not([type="radio"]):focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
  box-shadow: var(--focus-ring-inner);
}

/* ============================================================
   FOKUS — Nachtrag: Ring auf den SICHTBAREN Rahmen (12.8.2026)
   ------------------------------------------------------------
   Zwei Stellen, an denen das fokussierbare Element NICHT das ist, was der
   Besucher als Bedienelement sieht. Der Ring sass dort formal richtig und wirkte
   trotzdem falsch:

   1. Filterleiste („Alle Formate"): die weisse Pille gehoert dem Wrapper
      .panel-input-group (border-radius:999px). Der <button class="filterbtn">
      darin hat background:none; border:none — er IST ein Rechteck. Der Ring
      umrandete also brav ein unsichtbares Rechteck innerhalb der Pille.
   2. Terminkachel: der fokussierbare <a> fuellt die Kachel, aber
      .custom-tile-item hat overflow:hidden — ein Ring mit positivem Versatz wird
      an der Kachelkante ABGESCHNITTEN. Daher die eckige, angeschnittene Kontur.

   Loesung: der Ring wandert per :has() an den Container, das innere Element gibt
   seinen ab. :has() statt :focus-within, weil in der Pille noch ein ZWEITES
   Bedienelement sitzt (.filterbtn-reset) — mit :focus-within haette dessen Fokus
   die ganze Pille umrandet, und zusammen mit seinem eigenen runden Ring waere es
   wieder eine Doppelkontur geworden. So reagiert der Container nur auf den
   Knopf, der ihn optisch ausmacht.
   ⚠️ :has() ist ab Chrome 105 / Safari 15.4 / Firefox 121 verfuegbar. Faellt es
   aus, bleibt der Ring am inneren Element — unschoen, aber nie unsichtbar. */
.mdevents_listextended .panel-input-group:has(.filterbtn:focus-visible),
.custom-tile-item:has(> a:focus-visible) {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
  box-shadow: var(--focus-ring-inner);
}
.mdevents_listextended .panel-input-group .filterbtn:focus-visible,
.custom-tile-item > a:focus-visible {
  outline: none;
  box-shadow: none;
}

/* ============================================================
   FOKUS — Textlinks und Bildlinks (12.8.2026)
   ------------------------------------------------------------
   Der Ring der Regeln oben ist fuer BEDIENELEMENTE gemacht: Knoepfe, Pillen,
   Kacheln, Felder. Zwei Bauformen vertragen ihn nicht, und beide hat der User an
   Screenshots gezeigt:

   1. FLIESSTEXT-LINKS. Ein Link, der ueber die Zeile laeuft, hat keine sinnvolle
      Box — der innenliegende Ring legte sich im Footer quer ueber die Schrift und
      machte sie unlesbar. Fuer Text ist die uebliche Loesung keine Kontur, sondern
      eine FLAECHE mit Unterstrich (bekanntestes Beispiel: GOV.UK). Genau das hat
      der User selbst vorgeschlagen.
   2. BILDLINKS. Ein Link, der nur ein Bild enthaelt: ein innenliegender
      box-shadow wird vom Bild ueberdeckt (inset-Schatten liegen UNTER dem Inhalt).
      Hier hilft nur `outline` — das wird ueber allem gezeichnet. Zweifarbig wird
      es, indem Link UND Bild je eine Kontur bekommen, ineinander versetzt.

   ⚠️⚠️ WARUM KEINE EIGENE FOKUSFARBE: am 12.8.2026 der gesamte Farbraum
   abgesucht (32.768 Farben, Raster 8) gegen die drei Flaechen creme / blauer
   Footer / corales Panel. Die BESTE denkbare Einzelfarbe ist Schwarz und kommt
   auf 2,12:1 gegen das Blau — unter den geforderten 3:1. Ohne das corale Panel
   waeren es 2,94:1, immer noch darunter. Es gibt keine. Deshalb zweifarbig, und
   deshalb machen Chrome und Safari es bei ihrem Standardring genauso.
   Wer hier je eine Einzelfarbe einfuehren will: das ist Arithmetik, nicht
   Geschmack — bitte erst nachrechnen. */

/* ⚠️⚠️ HIER STANDEN BIS ZUM 12.8.2026 ABENDS DIE TEXTFLAECHEN (GOV.UK-Muster:
   farbige Flaeche + Unterstrich statt Ring fuer Fliesstext-Links). Entfernt auf
   ausdrueckliche Ansage des Users — zweimal "nur Rahmen, keine Flaeche".
   Der Grund, warum es nicht trug: die Regel arbeitete mit einer AUSSCHLUSSLISTE
   (:not(.btn):not(.news-cta)…). Damit muss man jeden knopfartigen Link der Site
   kennen. Vier sind mir entgangen und fielen erst am Screenshot auf: Footer-Link,
   Untermenue, "Medien" in der Navigation und die Personenkarte. Ueberall lag dann
   eine Flaeche, wo ein Rahmen hingehoert.
   Wer die Idee wieder aufgreift: NICHT mit :not() ausschliessen, sondern mit einer
   Positivliste einschliessen (z. B. nur Links in .ce-bodytext). Dann kostet ein
   uebersehener Sonderfall nichts. */
/* ============================================================
   KURZE TEXTLINKS: DERSELBE RING, ABER NACH AUSSEN
   ------------------------------------------------------------
   Der globale Ring ganz oben liegt INNEN und ist 5px dick (2px schwarz
   + 3px weiss). Auf einem Knopf (38px) oder einer Kachel (416px) ist
   das ein Rahmen. Auf einer Textzeile ist es eine FLAECHE. Am
   13.8.2026 im Browser nachgemessen, nicht gerechnet:

     Footer-Link .footer-inline-link   16px Zeile - 10px Ring = 6px frei
     Fliesstext-Link in .ce-bodytext   18px       - 10px      = 8px frei
     .footer-nav a ("Impressum")       22px       - 10px      = 12px frei
                                       (dort verdeckte der Ring zusaetzlich
                                        die Randbuchstaben)

   6px von 16px heisst: 62% der Zeile ist Ring. Genau das hat der User
   zweimal beanstandet ("nur Rahmen, keine Flaeche") und per Screenshot
   belegt. Deshalb hier derselbe zweifarbige Ring gespiegelt nach AUSSEN,
   damit die Zeile vollstaendig sichtbar bleibt:
     schwarz 0-2px  (outline, offset 0 statt -2px)
     weiss   2-4px  (box-shadow OHNE inset, liegt hinter der outline)
   Auf creme traegt das Schwarz (18,4:1), auf dem blauen Footer das Weiss
   (9,4:1) — Schwarz gegen #17427f waere nur 1,98:1 und ist dort blind.

   ⚠️ Warum das NICHT global geht: ein Aussenring wird von Vorfahren mit
   overflow:hidden abgeschnitten. Am 13.8.2026 ueber ALLE 37 fokussierbaren
   Elemente der Startseite gemessen: 8 wuerden beschnitten, und zwar
   buendig (Luft 0 auf mehreren Seiten) — .form-control in DIV.form-group,
   .btn in DIV.btn-group, .video-shariff-play in DIV.video-embed. Das sind
   genau die hohen Elemente, bei denen der Innenring gut aussieht. Die
   beiden Mengen sind fast disjunkt: was den Aussenring braucht, wird nicht
   beschnitten. Deshalb bleibt oben alles unveraendert, hier steht nur der
   Zusatz fuer die kurzen Zeilen.

   ⚠️ POSITIVLISTE, keine :not()-Ausschlussliste — siehe den Kommentar
   direkt darueber, an dem die Ausschlussliste gescheitert ist (vier
   knopfartige Links uebersehen). Gegenprobe am 13.8.2026 ueber alle
   <a> und <button>: KEIN knopfartiges Element steht in einem <p>.
   "p a[href]" kann also keinen Knopf erwischen; 0 Falsch-Positive.

   ⚠️⚠️ ABER: eine Positivliste verwirft STILL. Die erste Fassung dieser
   Regel war nur an der STARTSEITE geprueft — der User meldete sofort
   danach zwei Faelle per Screenshot, die durchgefallen waren. Deshalb
   am 13.8.2026 ueber ALLE 19 Seiten der Sitemap nachgezaehlt (Seiten
   per fetch geholt, geparst, gegen genau diesen Selektor getestet) und
   die Hoehen im iframe mit 1920px Breite gemessen:

     .media-item a            10x  16px  ❌ war Flaeche  -> aufgenommen
     .project-contact-info a   6x  16px  ❌ war Flaeche  -> aufgenommen
     td (ohne Klasse) a       26x  18px  ❌ war Flaeche  -> aufgenommen
     li.custom-tile-item a    26x 166px  ✅ Kachel, bleibt Innenring
     .person-panels a         15x 236px  ✅ Panel, bleibt Innenring

   ⚠️ Die 45 Icon-Links der Terminliste stehen in `td.events-table-actions`
   und sind 71px hoch — die sind mit `td:not(.events-table-actions)`
   bewusst ausgenommen, sonst aendert sich etwas, das gut aussieht.
   ⚠️ Die Textlinks der Terminliste sind nur in der Ansicht "Liste"
   sichtbar; wer sie in der Kachelansicht misst, findet 0 und haelt sie
   faelschlich fuer nicht betroffen.
   ⚠️ WER EIN NEUES BAUTEIL MIT TEXTLINKS BAUT, muss es hier eintragen.

   ⚠️⚠️ DRITTER FALL, gefunden am 13.8.2026 beim Durchgang durch alle 19 Seiten
   (744 fokussierbare Elemente, 40 Bauarten): KLEINE SYMBOLKNOEPFE. Nicht Text,
   sondern eine Glyphe wird vom Ring beschnitten.

     button.route (Kartennadel)  21x29  -> nach Ring nur 11x19 frei
     button.ics   (Kalender)     25x29  -> nach Ring nur 15x19 frei

   Mit Fokus fehlte der Nadel die runde Kuppe und dem Kalender die Lasche, die
   runden Ecken wurden quadratisch abgeschnitten. Im Browser bei vierfacher
   Vergroesserung mit/ohne Fokus verglichen — am unskalierten Screenshot ist das
   NICHT zu sehen (er ist von 1920 auf 1568 heruntergerechnet, ein 2px-Ring wird
   darin 1,6px). Beide haben KEINEN beschneidenden Vorfahren, der Aussenring
   greift dort also.
   ⚠️ Es sind site-weit die EINZIGEN Bedienflaechen unter 44px in beiden
   Richtungen — nachgezaehlt, nicht geschaetzt. Beide liegen in `md_events`,
   die Regel steht aber hier und wirkt damit nur auf sprezu, nicht auf die
   ~23 anderen md_events-Sites.

   ⚠️ "Datenschutzbestimmungen" im Workshop-Formular sitzt buendig
   (Abstand links 0px) in einer Formulargruppe mit overflow:hidden — der
   Aussenring wurde dort LINKS abgeschnitten, vom User per Screenshot
   gemeldet. Behoben durch die Regel direkt unter dem Selektor.
   ============================================================ */
/* ⚠️⚠️ DER COOKIE-BANNER-LINK STEHT NICHT MEHR IN DIESER LISTE — er kann sie
   nicht gewinnen. Bis zum 18.8.2026 stand hier `a.cc-link`, die Klasse der ALTEN
   Osano-Bibliothek. Seit dem 14.8.2026 laeuft orestbida/cookieconsent 3, und die
   erzeugt `cc__link` mit DOPPELTEM Unterstrich (Erzeuger:
   matomocookieconsent/Classes/Eid/CookieConsentScript.php:277; im ausgelieferten
   eID-Skript 2 Treffer fuer cc__link, 0 fuer die KLASSE .cc-link).
   ⚠️⚠️ Das blosse Umbenennen haette aber NICHTS bewirkt. Am 18.8.2026 im
   Pruefstand gemessen (alle 11 Stylesheets in Ladereihenfolge, mit Positiv- und
   Negativkontrolle): die Bibliothek setzt
   `#cc-main a { outline: revert; outline-offset: 2px }` mit Spezifitaet 1-0-1.
   Ein Eintrag HIER traegt wegen `:where()` gar keine Spezifitaet, die Regel kommt
   ueber `:focus-visible` nur auf 0-1-0 und verliert — unabhaengig davon, welche
   Datei spaeter geladen wird. Messung: mit `a.cc-link` KEIN Ring, mit
   `a.cc__link` ebenfalls KEIN Ring, erkennbar am durchschlagenden
   `outline-offset: 2px` der Bibliothek.
   ⚠️ Der Link war ausserdem nie unerfasst: er sitzt in `<p id="cm__desc">`, also
   greift `p a[href]` ganz oben in dieser Liste ohnehin (`el.matches()` = true).
   Ein eigener Eintrag waere hier somit auch ohne das Spezifitaetsproblem doppelt.
   ✅ Er hat deshalb eine EIGENE Regel mit `body #cc-main` direkt unter dieser
   Liste. Wer ihn hier wieder einsortiert, baut einen stillen Ausfall.

   ⚠️ Die TEILEN-Symbole (.share a, .custom-tile-item-sharebar a) kamen am
   14.8.2026 dazu — vom Nutzer gemeldet ("sehen zu eng gerahmt aus"). Gemessen
   sind sie 28x31px: das 5px-Innenband liess davon nur 18x21 uebrig und lief
   durch die Glyphe. Das ist derselbe Fall wie button.ics/button.route (25x29,
   21x29) weiter unten in dieser Liste, nur spaeter bemerkt, weil die Symbole
   erst beim Aufklappen der Teilen-Leiste sichtbar werden. */
:where(p a[href], .footer-nav a[href], .footer-inline-link,
       .footer span a[href], .media-item a[href],
       .project-contact-info a[href],
       td:not(.events-table-actions) a[href],
       .share a[href], .custom-tile-item-sharebar a[href],
       button.ics:not(.btn), button.route:not(.btn)):focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: 0;
  box-shadow: 0 0 0 var(--focus-ring-halo) var(--focus-ring-halo-color);
}

/* Cookie-Banner, Link "Weitere Informationen zum Datenschutz". Eigene Regel,
   weil die Bibliothek `#cc-main a { outline: revert }` mit 1-0-1 setzt und jede
   :where()-Regel dagegen verliert — Begruendung im Kommentar ueber der Liste.
   `body #cc-main a.cc__link:focus-visible` kommt auf 1-2-2 und schlaegt sie
   sauber; dasselbe fuehrende `body` wie im Block "Cookie-Consent" weiter oben,
   und wie dort OHNE !important.
   ⚠️ AUSSENring, wie die Eintraege in der Liste darueber. Am 18.8.2026 am echten
   Bannermarkup gemessen (Interstate geladen — mit Ersatzschrift stimmen die
   Werte nicht): Zeilenkaesten 18px hoch, padding 0, Tinte buendig an ALLEN vier
   Kanten (0px). Das ist dasselbe Profil wie `p a[href]` (18px) und
   `.footer-nav a` (21px); ein Innenring haette die Randbuchstaben ueberdeckt.
   ⚠️ Beschneidender Vorfahr ist `.cm__desc` mit `overflow:auto` — NICHT mehr
   Osanos `.cc-window`. Luft rundum 99/81/19/21px bei 1920px Breite, der
   4px-Aussenring passt also. Die Knoepfe heissen jetzt `.cm__btn`/`.pm__btn`
   (nicht mehr `.cc-btn`) und brauchen nichts: 42px hoch mit 8/16px padding,
   sie behalten den Innenring der Grundregel. */
body #cc-main a.cc__link:focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: 0;
  box-shadow: 0 0 0 var(--focus-ring-halo) var(--focus-ring-halo-color);
}

/* Formulargruppen tragen overflow:hidden und schnitten den Aussenring des
   Datenschutz-Links LINKS ab (er steht dort mit Abstand 0 an der Kante).
   ⚠️ Vor der Aenderung nachgemessen, nicht angenommen: in dieser Gruppe
   stehen NULL Floats, und die Hoehe ist mit overflow:hidden, mit
   overflow:visible und mit display:flow-root identisch (63px). Das hidden
   raeumt dort also nichts auf, es beschneidet nur den Ring.
   `display:flow-root` steht trotzdem dabei: es haelt Floats zurueck, FALLS
   in einem anderen Formular doch welche in so einer Gruppe stehen — im
   Gegensatz zu overflow:hidden aber ohne zu beschneiden.
   ⚠️ Bewusst `:has(a[href])`: nur Gruppen MIT Link. Die Gruppen mit
   Eingabefeldern behalten ihr overflow:hidden, denn deren Ring liegt INNEN
   und braucht keinen Platz nach aussen (nachgemessen: 4 von 5 Gruppen der
   Startseite bleiben unveraendert auf hidden). */
.form-group:has(a[href]) {
  display: flow-root;
  overflow: visible;
}

/* Bildlinks: der GANZE Ring sitzt am BILD, aussen. Der Link selbst bekommt keinen.
   ⚠️⚠️ Bis zum 13.8.2026 stand hier eine Konstruktion mit zwei versetzten
   Konturen — schwarz am <a>, weiss am <img>. Sie KONNTE nicht funktionieren,
   und zwar aus einem Grund, den man nur am Bildschirm sieht (vom User per
   Screenshot gemeldet):

     Das <a> ist `display:inline` und umschliesst ein `display:block`-Bild.
     Sein Kasten ist deshalb SPALTENBREIT, nicht bildbreit — gemessen 805px
     gegen 500px Bild. Die beiden Ringe lagen 152px auseinander und ergaben
     nie einen Rahmen, sondern zwei versetzte Kaesten.
     Dazu lag der weisse Ring mit `outline-offset:-0.3125rem` AUF dem Bild und
     schnitt das "E" von DEMOKRATIE ab.

   Jetzt: beide Farben am <img>, offset 0 — schwarz 0-2px, weiss 2-4px, beides
   AUSSERHALB der Grafik. Der Rahmen laeuft damit um das ganze Bild und
   ueberdeckt nichts davon.

   ⚠️ Warum NICHT das <a> auf Bildbreite umgestellt wurde (`width:fit-content`):
   das Bild ist per `margin: 0 auto` zentriert — gemessen 152,656px je Seite.
   Ein schrumpfendes <a> haette die Zentrierung gekippt und das Bild nach links
   springen lassen. Der Weg ueber das <img> laesst das Layout unveraendert
   (nachgemessen: Bildkasten vorher wie nachher 469 / 500x138).
   ⚠️ Aussenring ist hier zulaessig: das Bild hat KEINEN Vorfahren mit
   overflow != visible (nachgemessen). Fuer das WEISSE Logo auf blauem Footer
   traegt der weisse Anteil, auf creme der schwarze — dieselbe Logik wie oben. */
:where(a[href]):has(> img:only-child):focus-visible {
  outline: none;
  background-color: transparent;
  box-shadow: none;
}
:where(a[href]):has(> img:only-child):focus-visible > img {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: 0;
  box-shadow: 0 0 0 var(--focus-ring-halo) var(--focus-ring-halo-color);
}

/* Symbolknoepfe, die IN einem Link stecken: der Ring gehoert an den BUTTON.
   ⚠️ Hintergrund (Nutzermeldung 14.8.2026, "sie sind zweimal nacheinander
   ausgewaehlt"): das Markup ist <a href><button type="button"></button></a>.
   Beide waren fokussierbar, also zwei Tab-Anschlaege je Symbol — und der erste
   landete auf dem button, der ohne Handler beim Druecken NICHTS tut. Die
   Templates tragen deshalb jetzt tabindex="-1" am button; fokussiert wird nur
   noch der <a>. Betroffen: Properties.html (Einzelansicht) und
   ListExtended.html (Liste), beide in custom_sprezu — md_events bleibt
   unberuehrt und damit auch die ~23 anderen Sites.
   ⚠️ Der <a> ist `display:inline` und umschliesst einen Block — sein Kasten
   passt nicht zum Knopf (dieselbe Falle wie beim Bildlink darueber). Der Ring
   wird deshalb vom <a> genommen und an den button gehaengt, wo die Geometrie
   stimmt und `border-radius:999px` ihn rund macht.
   ⚠️⚠️ DIESELBE KLASSE, ZWEI GROESSEN — am 17.8.2026 vom User per Screenshot
   gemeldet ("hellen Rahmen nach innen"). `ics` und `route` kommen in ZWEI voellig
   verschiedenen Auspraegungen vor, und ein gemeinsamer Ring passt nur einer davon:

     ListExtended.html:209/218   class="ics" / "route"          25x29 bzw. 21x29
     Properties.html:159/171/172 class="ics btn btn-blue-filled"  239x41 (Pille)

   Das blanke Symbol braucht den Ring AUSSEN — ein 5px-Band nach innen liesse
   15x19 uebrig und liefe durch die Glyphe.
   Die beschriftete Pille braucht ihn INNEN: sie ist blau gefuellt, ein blauer
   Aussenring verschmilzt mit ihr, und sichtbar bleibt nur das WEISSE Halo
   ausserhalb — genau der helle Rahmen, den der User beanstandet hat. Innen sitzt
   das Weiss dagegen auf dem Blau und folgt dank border-radius:999px der Pille.

   ⚠️ Unterschieden wird an `.btn`, NICHT an der Groesse — CSS kann nicht messen.
   Wer eine dritte Auspraegung anlegt, muss hier entscheiden, in welche Haelfte
   sie gehoert. Vgl. [[global_feedback_geteilte_klasse_selektor_eingrenzen]]. */
:where(a[href]):has(> button.ics, > button.route):focus-visible {
  outline: none;
  box-shadow: none;
}
/* blankes Symbol in der Terminliste: Ring AUSSEN */
:where(a[href]):focus-visible > button.ics:not(.btn),
:where(a[href]):focus-visible > button.route:not(.btn) {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: 0;
  box-shadow: 0 0 0 var(--focus-ring-halo) var(--focus-ring-halo-color);
}
/* beschriftete, gefuellte Pille in der Einzelansicht: Ring INNEN */
:where(a[href]):focus-visible > button.ics.btn,
:where(a[href]):focus-visible > button.route.btn {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
  box-shadow: var(--focus-ring-inner);
}
/* Akkordeon-Kopf auf farbigem Panel: der Ring gehoert um den GANZEN Block, nicht
   um die innere Textzeile. Vom User am Screenshot gemeldet („ganzer block soll
   gerahmt werden"). Dasselbe :has()-Muster wie bei Kachel und Filterpille. */
/* ⚠️ Der Container heisst `.thesis`, NICHT `.thesis-item` — beim ersten Schreiben
   geraten und beim Nachsehen korrigiert (Beleg: `.thesis.thesis-open` weiter
   oben). Ein geratener Selektor faellt nicht auf: die Regel ist syntaktisch
   gueltig, greift nur nie. Bei `:has()`-Regeln immer den Container belegen. */
/* ⚠️⚠️ `.project` war hier VERGESSEN und ist am 13.8.2026 per Screenshot des
   Users aufgefallen ("bei Grafiken sieht es fehlerhaft aus"). Der Fehler sah
   anders aus als bei den Textlinks und hat eine andere Ursache: der Knopf
   `.project-toggle` ist mit 67px hoch genug, hat aber `padding: 0`, und die
   Titelzeile endet EXAKT auf seiner Unterkante (gemessen: Abstand 0px).
   Der 5px-Innenring lief dadurch mitten durch die Unterlaengen von
   "Sprechen & Zuhoeren in Mecklenburg-Vorpommern".
   Merksatz: nicht nur KURZE Kaesten sind gefaehrdet, sondern auch hohe, in
   denen der Text buendig an der Kante klebt. Die Hoehe allein genuegt als
   Pruefung NICHT — den Abstand Text-zu-Kante mitmessen.
   `.project` traegt 32px padding, dort ist der Ring vom Text weit weg. */
.info-panel:has(.info-panel-toggle:focus-visible),
.thesis:has(.thesis-toggle:focus-visible),
.project:has(.project-toggle:focus-visible) {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
  box-shadow: var(--focus-ring-inner);
}
.info-panel-toggle:focus-visible,
.thesis-toggle:focus-visible,
.project-toggle:focus-visible {
  outline: none;
  box-shadow: none;
}
