/*
 * sws-overrides.css
 *
 * Utilities, die Tailwind v4 nicht automatisch aus `@theme`-Tokens mit nicht-standardisierten
 * Shade-Suffixen (wie -70, -50, -30) erzeugt. Werden hier manuell definiert.
 * Wirkt ohne Tailwind-Rebuild.
 */

/* Horizontalen Overflow global unterdruecken.
   Hintergrund: Dekorationen wie `.m-news-section::before` (Welle) sind bewusst
   10 px breiter als ihre Sektion, um Subpixel-Gaps an den Sektion-Kanten zu
   eliminieren. Der 5-px-Ueberstand rechts erzeugt aber `scrollWidth > clientWidth`,
   wodurch die Seite bei allen Viewports minimal horizontal scrollbar wird.
   `overflow-x: clip` auf html + body blockt das Scrollen, ohne einen Scroll-Container
   anzulegen (wie `overflow-x: hidden` es taete) — `position: sticky` bleibt intakt. */
html, body { overflow-x: clip; }

/* === Foundation · Layout-Engine (Page Composer) === */
/*
 * BCL-Projekt-Konfiguration. Werte werden von den universellen .sws-layout-*-Klassen
 * konsumiert (siehe sws_page_composer/assets/css/sws-layouts.css). Wenn ein anderes
 * Projekt andere Content-Breiten/Gaps braucht, hier überschreiben oder selektiv auf
 * Section-Ebene neu setzen.
 */
:root {
    /* WICHTIG: absolute Pixel-Werte, damit die Layout-Mathematik unabhängig
       von der BCL-Root-Font-Size (12–18 px je Breakpoint) konsistent bleibt.
       3-Zonen-Modell (Agentur-Layout):
         --sws-max-w       Content-Zone (Text, reguläre Inhalte)
         --sws-max-w-ext   Extended/Bleed-Zone (Hero, Skipperfreunde, Overflow-Bilder)
         > ext-max         Randbereich — keine Content-Elemente, nur Section-Hintergründe */
    --sws-max-w:     1485px;                                  /* = m-max-w (Content-Zone) */
    --sws-max-w-ext: 1920px;                                  /* Bleed-Zone (Bilder kappen hier) */
    --sws-gap:       1.5rem;                                  /* 24 px @ 16-px-Root */
    --sws-breakout:  max(0px, calc((100vw - var(--sws-max-w)) / 2));
    --sws-bp-sm:     40rem;                                   /* 640 px */
    --sws-bp-md:     48rem;                                   /* 768 px */
    --sws-bp-lg:     64rem;                                   /* 1024 px */
}

.bg-primary-70       { background-color: var(--color-primary-70); }
.bg-primary-50       { background-color: var(--color-primary-50); }
.bg-primary-30       { background-color: var(--color-primary-30); }
/* Hinweis: Klassen wie .bg-u70 werden jetzt automatisch aus dem Page-Composer-
 * Dropdown ("CSS-Klassen → Sektion-Hintergründe") generiert. Source ist
 * sws_section_config::getBgClassesCss(); injiziert per OUTPUT_FILTER ins
 * <head>. Hier nur eintragen, wenn zusätzliche Properties (z. B. eigene
 * --section-…-Variablen) nötig sind. */

.text-primary-70     { color: var(--color-primary-70); }
.text-primary-50     { color: var(--color-primary-50); }
.text-primary-30     { color: var(--color-primary-30); }

.border-primary-70   { border-color: var(--color-primary-70); }
.border-primary-30   { border-color: var(--color-primary-30); }

.hover\:text-primary-70:hover { color: var(--color-primary-70); }

/* === Foundation · Helper-Klassen (BCL) === */
/*
 * Die Werte (Höhe, Breite, Schrift, Padding) werden aus der Datenbank verwaltet:
 * Backend → Page Composer → Tailwind Manager → Responsive Tokens.
 * Generierte Regeln stehen in `assets/css/sws-breakpoints.css` und wirken je Breakpoint.
 *
 * Hier bleiben nur die Nicht-responsiven Layout-Helfer.
 */

/* .m-max-w: max-width wird via Token gesetzt; die Auto-Margin bleibt invariant hier.
   Pattern (moderner Agentur-Ansatz): Body/Hintergruende fliessen full-width,
   der INHALT jeder Sektion wird via .m-max-w auf 1920px gekappt + zentriert. */
.m-max-w { margin-left: auto; margin-right: auto; }

/* Responsive Edge-Paddings: Pufferzone um .m-max-w (max-width 1485 px).
   Die Grenze liegt bei 1564 px, damit bei Viewport = 1485 noch 40 px Rand-Padding
   wirksam sind (= 1485 + 2×40). Erst ab 1565 fällt das Padding auf 0, weil dann
   durch margin:auto mind. 40 px natürliche Luft links/rechts entsteht. */
.m-hero-text { left: 0; }
@media (max-width: 1564px) {
    .m-px-edge { padding-left: 2.667rem; padding-right: 2.667rem; }  /* ~40 px @15 / 37 @14 */
    .m-hero-text { left: 2.667rem; }
}
@media (max-width: 1023px) {
    .m-px-edge { padding-left: 2rem; padding-right: 2rem; }          /* ~28 px @14 / 26 @13 */
    .m-hero-text { left: 2rem; }
}
@media (max-width: 759px) {
    .m-px-edge { padding-left: 1.5rem; padding-right: 1.5rem; }      /* ~20 px @13 / 18 @12 */
    .m-hero-text { left: 1.5rem; }
}

/* --edge-pad: spiegelt den jeweils aktiven m-px-edge-Wert pro Breakpoint.
 * Wird für Elemente außerhalb von m-max-w-Wrappern genutzt (Logo absolute,
 * m-tis-text, ggf. weitere), damit sie auf der GLEICHEN Inhalts-Linie
 * starten wie m-max-w-Sektionen. Ohne diese Variable haben Sektionen ohne
 * m-px-edge-Wrapper eine andere Sprung-Schwelle (siehe altes Issue „bei
 * 1565 springen nur einige Sektionen nach innen"). */
:root { --edge-pad: 0px; }
@media (max-width: 1564px) { :root { --edge-pad: 2.667rem; } }
@media (max-width: 1023px) { :root { --edge-pad: 2rem; } }
@media (max-width: 759px)  { :root { --edge-pad: 1.5rem; } }

/* Nav-Items nicht intern umbrechen (Einzelworte bleiben auf einer Zeile).
   Breakpoint-gebundene Größe/Gap laufen ueber Tokens. */
.m-nav-text { white-space: nowrap; }

/* === News-Ansicht · Übersicht + Detail === */
/*
   Wird vom Modul bcl_news_view gerendert und bedient zwei Darstellungen im
   selben Template. Siehe auch .m-news-card* (gemeinsamer Teaser-Kachel-Stil
   mit dem Startseiten-News-Teaser-Modul).

   Farb-Konzept (seit 2026-04-25 getrennte Schemata):
     Sektion (bg_class): --nv-bg, --nv-fg, --nv-heading, --nv-muted
     Box (box_class):    --card-bg, --card-fg, --card-heading, --card-muted,
                         --card-link-bg, --card-link-fg
   Das Modul liest die jeweilige Farb-Definition aus rex_sws_css_options
   (Page Composer → CSS-Klassen → Sektion-Hintergründe / Box-Farbschemata)
   und setzt sie als Inline-CSS-Variablen. Section und Box sind voneinander
   unabhängig wählbar. */
/* Vertikale Paddings 1:1 vom Box-Element-Modul übernommen, damit alle
 * inhaltsführenden Sektionen (Header, Liste, Mehr-vom-BCL) auf derselben
 * Rhythmik laufen.
 *   default:           2rem / 2rem
 *   ≥ 64em (1024 px):  3rem / 3rem
 *   ≥ 112.5em (1800 px): 5rem / 5rem
 * AUSGENOMMEN: .m-news-view-section--detail. Diese Sektion enthält ein
 * eingebettetes Box-Element (c11), das sein vertikales Padding selbst über
 * .text/.bild-Padding rendert. py-0 hier vermeidet doppeltes Padding —
 * exakt dasselbe Pattern wie das Box-Element-Modul (siehe Output: dort
 * wird $_boxPadding hart auf py-0 gesetzt).
 * `:has(+ [data-section-top-decor])` überschreibt padding-bottom der
 * Vorgänger-Sektion bei Welle (clamp 60–184 px). Spezifität: doppelte
 * Klasse `.m-news-section.m-news-view-more`. */
.m-news-view-section:not(.m-news-view-section--detail),
.m-news-section.m-news-view-more {
    padding-top: 2rem;
    padding-bottom: 2rem;
}
@media (min-width: 64em) {
    .m-news-view-section:not(.m-news-view-section--detail),
    .m-news-section.m-news-view-more {
        padding-top: 3rem;
        padding-bottom: 3rem;
    }
}
@media (min-width: 112.5em) {
    .m-news-view-section:not(.m-news-view-section--detail),
    .m-news-section.m-news-view-more {
        padding-top: 5rem;
        padding-bottom: 5rem;
    }
}
.m-news-view-section--detail {
    padding-top: 0;
    padding-bottom: 0;
}

/* Back-Nav-Wraps: gleiches Außen-Padding wie das Box-Element (Outer-Column-
 * Formel). Damit sitzt die "ZURÜCK ZUR ÜBERSICHT"-Linkbox auf derselben
 * Vertikalen wie der .text-Inhalt der c11-Spalte (= Content-Zone-Linke).
 *
 * Standard `.m-max-w + auto-margin` zentriert auf Eltern-Breite (Section
 * = 100% des Layout-Wrapper, OHNE Scrollbar), das Box-Element rechnet mit
 * `100vw` (MIT Scrollbar). 4 px Differenz → daher hier explizit gleichen
 * `min(100vw, 1920) - 1485) / 2`-Wert nutzen. */
.m-news-view-section--detail > .m-max-w.m-px-edge {
    max-width: none;
    margin-left: 0;
    margin-right: 0;
    padding-left:  max(var(--gutter, 1.5rem), calc((min(100vw, var(--max-w-ext, 1920px)) - var(--max-w, 1485px)) / 2));
    padding-right: max(var(--gutter, 1.5rem), calc((min(100vw, var(--max-w-ext, 1920px)) - var(--max-w, 1485px)) / 2));
}
.m-news-view-wrap { color: var(--nv-fg, var(--section-fg, var(--color-primary))); }

/* Themed Sektion (Header / Übersicht-Liste): nutzt Inline-CSS-Vars */
.m-news-view--themed { background-color: var(--nv-bg, transparent); color: var(--nv-fg, inherit); }
.m-news-view--themed .m-news-view-header-h1,
.m-news-view--themed .m-news-view-header-h2 { color: var(--nv-heading, var(--nv-fg, inherit)); }

/* Themed News-Card: BG, Fg, Headings, Linkbox aus Box-Klasse */
.m-news-card--themed { background-color: var(--card-bg, #ffffff); color: var(--card-fg, #06235e); }
.m-news-card--themed .m-news-card-title { color: var(--card-heading, var(--card-fg, inherit)); }
.m-news-card--themed .m-news-card-date { color: var(--card-muted, var(--card-fg, inherit)); }
.m-news-card--themed .m-news-card-text { color: var(--card-fg, inherit); }
.m-news-card--themed .m-news-card-btn {
    /* Fallback-Chain: Box-Klasse → Sektion-Linkbox → Hardcode-Default. Wenn der
       Slot keine box_class hat, übernimmt die Card-Linkbox die Section-Farbe. */
    background-color: var(--card-link-bg, var(--section-link-bg, #5076A2));
    color: var(--card-link-fg, var(--section-link-fg, #ffffff));
}

/* Header übernimmt jetzt das Box-Element-Padding (siehe oben) — Standalone-
 * Override entfernt. */
.m-news-view-header-titles { margin-bottom: 1.5rem; }
.m-news-view-header-h1 { font-size: 1.889rem; font-weight: 300; line-height: 1.15; margin: 0 0 0.25rem 0; }
.m-news-view-header-h2 { font-size: 1.889rem; font-weight: 800; line-height: 1.15; margin: 0; text-transform: uppercase; letter-spacing: 0.02em; }
.m-news-view-header-body { font-size: 1rem; line-height: 1.55; }
.m-news-view-header-body p { margin: 0 0 1rem 0; break-inside: avoid; }
.m-news-view-header-body p:last-child { margin-bottom: 0; }
.m-news-view-cols-1 { columns: 1; }
@media (min-width: 1024px) {
    .m-news-view-cols-2 { columns: 2; column-gap: 2.5rem; }
    .m-news-view-cols-3 { columns: 3; column-gap: 2rem; }
}

/* Back-Nav-Spacing.
 * Vorgabe XL (≥ 1800 px, root 18 px):
 *   - Text ↔ Linkbox (oben + unten): 40 px = 2.222 rem
 *   - Linkbox ↔ Welle (unten): 90 px = 5 rem
 *   - Linkbox ↔ Hero (oben): 90 px = 5 rem
 * Skaliert über kleinere Breakpoints proportional (rem-basiert). Text-↔-
 * Linkbox-Distanz wird über .m-news-detail-text padding-top/bottom
 * gesteuert (siehe weiter unten); back-nav margins bestimmen nur den
 * Abstand zu den Section-Rändern (Hero oben, Welle unten). */
.m-news-detail-back-nav {
    margin-top: 2.222rem;     /* Linkbox ↔ Hero (oben). 40/54/90 px je Token */
    margin-bottom: 0;
}
.m-news-detail-back-nav--bottom {
    margin-top: 0;
    /* Linkbox ↔ Welle (unten). XL: 2.5 rem = 45 px (50 % von ursprünglich
     * 90 px nach User-Vorgabe). Skaliert über kleinere Breakpoints. */
    margin-bottom: 1.111rem;
}
@media (min-width: 64em) {
    .m-news-detail-back-nav { margin-top: 3rem; }
    .m-news-detail-back-nav--bottom {
        margin-top: 0;
        margin-bottom: 1.5rem;
    }
}
@media (min-width: 112.5em) {
    .m-news-detail-back-nav { margin-top: 5rem; }            /* 90 px */
    .m-news-detail-back-nav--bottom {
        margin-top: 0;                                         /* margin-top der allgemeinen Regel überschreiben */
        margin-bottom: 2.5rem;                                 /* 45 px */
    }
}

/* .text/.bild padding-top + padding-bottom = Abstand Linkbox ↔ Inhalt.
 * Box-Element-Default (sws-layouts.css → 2/3/5 rem an Breakpoints) wäre zu
 * viel; hier konstant 2.222 rem (40 px @ 18 px-Root). Selektor braucht
 * `.box-element > …`-Spezifität, sonst gewinnen die globalen Box-Element-
 * Regeln. */
.box-element > .text.m-news-detail-text,
.box-element > .bild.m-news-detail-bild {
    padding-top: 2.222rem;
    padding-bottom: 2.222rem;
}

/* Override für padding-bottom der Detail-Section (bei Welle als Decor)
 * sitzt weiter unten in der Datei NACH der globalen `:has`-Regel — sonst
 * gewinnt die globale Regel via Source-Order. */
.m-news-detail-back {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 1rem;
    background-color: var(--section-link-bg, var(--color-primary));
    color: var(--section-link-fg, #ffffff);
    /* Figtree 18 px im XL-Token (≥ 1800 px → root 18 px → 1 rem = 18 px).
     * Skaliert mit dem Root-Token herunter (16 / 15 / 14 px). Light, weil
     * der Body ebenfalls Light läuft und der Pfeil als eigentlicher
     * Aufmerksamkeitsanker dient. */
    font-size: 1rem;
    font-weight: 300;
    letter-spacing: 0.02em;
    text-transform: uppercase;
    text-decoration: none;
    border-radius: 0.222rem;
    transition: filter 0.2s;
}
.m-news-detail-back:hover { filter: brightness(0.92); }
/* Pfeil-Icon: Gelb (Akzentfarbe), Größe an Schriftgröße gekoppelt. sws_icon
 * rendert ein <svg> mit fill=currentColor, daher reicht `color`. */
.m-news-detail-back .m-news-detail-back-icon {
    color: var(--color-accent, #fdc846);
    width: 1.111em;
    height: 1.111em;
    flex: 0 0 auto;
    display: inline-block;
}
.m-news-detail-back .m-news-detail-back-icon svg { width: 100%; height: 100%; display: block; }

/* Detail-Layout = Box-Element c11. Linke Spalte: .text mit .box-title
 * (Title = line1 oben, Subtitle = line2 unten), Datum, Body. Rechte Spalte:
 * .bild mit Bildern. „ZURÜCK ZUR ÜBERSICHT" oberhalb und unterhalb des
 * Box-Element-Grids in eigenem .m-max-w-Wrap (linksbündig zur Content-
 * Zone). Themed-Vars (--section-fg/-heading/-muted) liefern die Farben aus
 * der Newsdetail-Section-Config. */

/* Box-Element default ist line1 light + line2 bold. Für Newsdetail
 * dreht sich die Hierarchie: Titel oben (BOLD, prominent), Subtitle unten
 * (Light, ergänzend). Schriftgewicht und Farbrolle werden gespiegelt. */
.m-news-detail-text .box-title-line1 {
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    color: var(--section-heading, var(--nv-heading, inherit));
}

/* Box-Element h2-Bold (Standard, alle Inhaltstypen mit .box-title-line2) —
 * uppercase analog allen anderen fetten H2-Zeilen. */
.box-element .box-title-line2 {
    text-transform: uppercase;
    letter-spacing: 0.02em;
}
.m-news-detail-text .box-title-line2 {
    font-weight: 300;
    color: var(--section-muted, var(--nv-muted, inherit));
}

/* Datum direkt unter der Headline: Schrift wie der Body (regular, body-
 * Größe), Farbe wie line2 (= --section-muted, Light-Subtitle-Ton). Geringer
 * Abstand zur Headline (kein Block-Margin oben), normaler Abstand zum Body. */
.m-news-detail-text .m-news-detail-date {
    font-size: 1rem;
    line-height: 1.55;
    font-weight: 400;
    color: var(--section-muted, var(--nv-muted, inherit));
    margin: 0 0 1rem 0;
}
/* Box-Title hat im Box-Element default 1rem (= 18 px @ 18 px-Root) margin-
 * bottom. Für Newsdetail halbiert auf 0.5 rem (9 px) — Datum sitzt logisch
 * zur Überschrift. !important nötig, weil sws-layouts.css mit
 * `.box-element > .text .box-title` höhere Spezifität hat als der einfache
 * `.m-news-detail-text .box-title`-Selektor. */
.m-news-detail-text .box-title { margin-bottom: 0.5rem !important; }

/* Bilder in der rechten Spalte (.bild). Gap zwischen den Figures groß genug,
 * damit die Bildunterschrift einer Figure nicht visuell mit dem nächsten
 * Bild verschmilzt — Caption + Atemluft reicht in 2.5rem (≈ 45 px @18 px). */
.m-news-detail-bild { display: flex; flex-direction: column; gap: 2.5rem; }

/* Grid-Items duerfen unter ihre min-content Groesse schrumpfen — sonst
 * blaeht ein Pre-Init-Swiper (.swiper-wrapper als display:flex mit
 * intrinsisch gestapelten Slides) die rechte Spalte auf zigtausend px
 * auf und engt die Text-Spalte auf min-content ein. */
.box-element.c11 > .m-news-detail-text,
.box-element.c11 > .m-news-detail-bild { min-width: 0; }
.m-news-detail-bild .m-slider,
.m-news-detail-bild .m-slider .swiper,
.m-news-detail-bild .m-slider .swiper-wrapper { min-width: 0; max-width: 100%; }
.m-news-detail-image { margin: 0; }
.m-news-detail-image img { display: block; width: 100%; height: auto; border-radius: 0.333rem; }
/* Bildunterschrift: Figtree Light 18 px im XL-Token (>= 1800 px Viewport,
 * Root 18 px → 1 rem = 18 px). Bei kleineren Breakpoints skaliert mit dem
 * Root-Token automatisch (16/15/14/13/12 px). Farbe weiterhin --section-fg.
 * Italic entfernt (Figtree Light reicht als Differenzierung). */
.m-news-detail-image-caption {
    margin-top: 0.5rem;
    font-size: 1rem;
    font-weight: 300;
    line-height: 1.35;
    color: var(--section-fg, #666);
}

/* Alte .m-news-grid--overview-Regelblock entfernt — die Subgrid-Regel weiter
   unten (.m-news-grid, .m-news-grid--overview) definiert das Layout jetzt
   einheitlich. Vorher: zwei konkurrierende Regeln (auto-fit vs repeat(N,1fr))
   führten in Firefox zu inkonsistentem Spalten-Rendering. */
.m-news-grid--overview {
    margin-bottom: 2.5rem;
}

.m-news-overview-empty { text-align: center; padding: 3rem 1rem; color: var(--section-fg, #888); font-size: 1.111rem; }

.m-news-pagination {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    margin-top: 1rem;
}
.m-news-pagination-link {
    display: inline-block;
    padding: 0.4rem 0.85rem;
    background-color: #ffffff;
    color: #5076A2;
    border: 1px solid #d1d5db;
    border-radius: 0.25rem;
    text-decoration: none;
    font-size: 0.944rem;
    font-weight: 500;
    transition: background-color 0.15s, color 0.15s;
}
.m-news-pagination-link:hover { background-color: #5076A2; color: #ffffff; }
.m-news-pagination--current { background-color: #5076A2; color: #ffffff; border-color: #5076A2; cursor: default; }
.m-news-pagination--disabled { color: #9ca3af; cursor: not-allowed; }
.m-news-pagination--disabled:hover { background-color: #ffffff; color: #9ca3af; }

/* Sektionen mit fixierter Höhe: Content-Block vertikal zentriert (gleicher Abstand oben/unten).
   Items-internes Top-Alignment passiert im Modul via `items-start` auf dem Grid.
   Token aus sws-breakpoints.css (height: 6.667rem ≈ 120px @ XL) wird hier zu
   min-height umgebogen: Section kann bei Content-Überstand (z. B. 2-zeilige
   Kontakt-Boxen bei knappen Viewports) wachsen, bleibt aber im Idealfall auf
   der Design-Referenz-Höhe. Zusätzliches vertikales Padding gibt 8 px Luft
   für 1-zeiliges Layout bei ≥1430 px. */
.m-kontakt-h {
    display: flex;
    align-items: center;
    height: auto;
    min-height: 6.667rem;
    padding-top: 0.5rem;
    padding-bottom: 0.5rem;
}
.m-kontakt-h > * { width: 100%; }

/* Schnellkontakt-Grid: 1 Label + 5 Kontakte = 6 Slots. Eigene CSS-Regel
   statt Tailwind-grid-cols-Utilities — unabhängig vom Tailwind-Build und
   präzise je Breakpoint steuerbar. */
.m-kontakt-grid {
    display: grid;
    grid-template-columns: 1fr;            /* Mobile: 1 Spalte, 6 Zeilen */
    gap: 1rem 2rem;
    align-items: start;
}
@media (min-width: 640px) {                 /* sm: 2 Spalten → 3 Zeilen */
    .m-kontakt-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 768px) {                 /* md: 3 Spalten → 2 Zeilen (3+3) */
    .m-kontakt-grid { grid-template-columns: repeat(3, 1fr); }
}
/* 6 Spalten (1 Zeile) erst ab 1430 px — bei 1280–1429 px werden die Spalten
   sonst so schmal, dass das Label „Schneller Kontakt zu den Hafenmeistern:"
   unschön mehrzeilig umbricht, während die Kontakt-Boxen nur 3 Zeilen brauchen. */
/* Ab 1430 px läuft das ganze Grid in einer Zeile. Die Label-Spalte bekommt
 * mehr Raum (1.5fr statt 1fr) und ein Mindestmaß von 17.5rem, damit der
 * Titel „Schneller Kontakt zu den Hafenmeistern:" auch bei der xl-Token-
 * Größe (>= 1800 px → html=18 px) maximal zweizeilig bricht — vorher 4-
 * zeilig in 217 px-Spalte. minmax(0,1fr) auf den Personen-Spalten verhindert
 * grid-blowout durch lange Telefonnummern. */
@media (min-width: 1430px) {
    .m-kontakt-grid { grid-template-columns: minmax(17.5rem, 1.5fr) repeat(5, minmax(0, 1fr)); }
}

/* Inline-Icon neben Text-Links (Telefon, E-Mail, Arrow-Links in Kontaktleiste + Footer).
   20px @ XL (18px root) = 1.111rem; skaliert via Root-Font. */
.m-link-icon { width: 1.111rem; height: 1.111rem; flex-shrink: 0; }

/* Hero-Slider: Bildcontainer auf 1920px gekappt + zentriert. Section-Background bleibt
   full-bleed (bg-primary fuellt beyond 1920 bei grossen Viewports). */
.m-hero-images-wrap {
    position: absolute;
    inset: 0;
    max-width: 1920px;
    margin-left: auto;
    margin-right: auto;
    overflow: hidden;
}

/* Hero-Willkommens-Box: im Slide-TEXT (TinyMCE) via Baustein einfügbar.
   Hintergrund #5076a2, 18px padding, leicht abgerundet, 40px Schrift in 2 Zeilen,
   weiß. Skaliert via rem automatisch über alle Breakpoints.
   ACHTUNG: Klassen NICHT entfernen — kommen aus TinyMCE-Slice-Inhalten in der
   DB, NICHT aus Modul-Output-Files (grep über *.php zeigt sie nicht). */
.m-hero-box {
    background-color: #5076a2;
    color: #ffffff;
    padding: 1rem;                  /* 18px @ XL */
    border-radius: 0.333rem;        /* 6px - leicht abgerundet */
    font-size: 2.222rem;            /* 40px @ XL */
    line-height: 1.1;
    margin-top: 11.111rem;          /* 200px Abstand oben @ XL */
    display: block;                 /* Block → Link unter der Box */
    width: fit-content;             /* Nur so breit wie der Text */
}
.m-hero-box-line1 {
    display: block;
    font-weight: 300;               /* Figtree Light */
}
.m-hero-box-line2 {
    display: block;
    font-weight: 800;               /* Figtree Extra Bold */
    text-transform: uppercase;
    letter-spacing: 0.02em;
}

/* Hero-Link-Button: weiß, #909090 Text, 18px, gelb-oranger Pfeil,
   12px unter der Hero-Box. Auch via TinyMCE-Baustein. */
.m-hero-link {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    background-color: #ffffff;
    color: #909090;
    font-size: 1rem;                /* 18px @ XL */
    padding: 0.667rem 1rem;         /* 12px/18px */
    border-radius: 0.333rem;        /* 6px */
    margin-top: 0.667rem;           /* 12px Abstand zur Box */
    text-decoration: none;
    transition: background-color 0.2s;
}
.m-hero-link:hover { background-color: #f5f5f5; }
.m-hero-link-icon {
    width: 1.111rem;                /* 20px */
    height: 1.111rem;
    color: var(--color-accent);     /* gelb-orange */
    flex-shrink: 0;
}

/* Slider-Dots: 24px Durchmesser (1.333rem @ XL), 1px weisser Rand.
   Inaktiv = komplett weiss, aktiv = #5076a2. Groesse skaliert via rem. */
.m-hero-dot {
    width: 1.333rem;
    height: 1.333rem;
    border-radius: 9999px;
    border: 1px solid #ffffff;
    background-color: #ffffff;
    padding: 0;
    cursor: pointer;
    transition: background-color 0.2s;
}
.m-hero-dot:hover { background-color: #e5e7eb; }
.m-hero-dot.is-active { background-color: #5076a2; }
.m-hero-dot.is-active:hover { background-color: #5076a2; }

/* Footer unterer Balken (Copyright/Impressum/Datenschutz) — farblich vom Haupt-Footer abgesetzt.
   Hintergrund invariant (StyleGuide-Farbe), Hoehe/Text via Token. */
.m-footer-bar { background-color: #376295; display: flex; align-items: center; }
.m-footer-bar > * { width: 100%; }

/* Footer-Haupt — Hoehe + Top-Padding via Token; Inhalt oben buendig via flex-start.
   Zeilenabstand 1.4 gilt fuer ALLE Inhalte (Adresse-Zeilen, Listen-Items, Links, Ueberschriften). */
.m-footer-main { display: flex; align-items: flex-start; line-height: 1.4; }
.m-footer-main > * { width: 100%; }
.m-footer-main ul { list-style: none; padding: 0; margin: 0; }
.m-footer-main ul li { margin: 0; }

/* Kategorie-Links: inline-flex (nur so breit wie der Text, Icon links). */
.m-footer-main ul a {
    display: inline-flex;
    align-items: flex-start;
    gap: 0.5rem;
}
.m-footer-main ul a .m-link-icon { margin-top: 0.15rem; }

/* Kontakt-Links (Phone/E-Mail): Block-flex, jeder auf eigener Zeile. */
.m-footer-contact {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

/* Unterer Balken: vertikaler Trennstrich zwischen Impressum | Datenschutz.
   Strich via border-left auf einem leeren <span> — Hoehe folgt der aktuellen Zeile. */
.m-footer-bar-divider {
    display: inline-block;
    width: 1px;
    height: 1em;
    background-color: currentColor;
    opacity: 0.6;
    margin: 0 1rem;
}

/* === Modul 03 · Skipperfreunde (Text-Bild-Splitter) === */
/*
   Layout nach Kunden-Vorgabe:
   - Outer-Wrapper 1920px (Hero-Raster), zentriert
   - Bild 960×694 rechts bündig mit 1920-Rand → steht über den 1485-Content-Raster
     hinaus, sowohl links (ragt in die Text-Zone hinein) als auch rechts (bis 1920)
   - Text in der linken Spalte, padding-left auf 1485-Rand gesetzt, padding-top 85px,
     Button unten bündig (flex-col + margin-top:auto) */

.m-tis-wrap {
    /* Absolute 1920 px — rem würde bei 16-px-Root (vw < 1800) auf 1707 px schrumpfen
       und das Bild ließe einen Gap zum Viewport-Rand. */
    max-width: var(--sws-max-w-ext, 1920px);
    margin-left: auto; margin-right: auto;
}
.m-tis-grid {
    display: flex;
    align-items: stretch;
    min-height: 38.556rem;                       /* 694 px — Bild-Höhe als Mindestmaß */
}
.m-tis-text {
    /* Padding-left synced auf die m-max-w-Content-Linie:
     *   = max(0, (vw − 1485) / 2)  // m-max-w-Sprung (zentrieren bei vw>1485)
     *   + var(--edge-pad)          // m-px-edge bei aktuellem Breakpoint
     * Damit sitzt der Text-Content genau auf derselben x-Linie wie z. B. die
     * News-Eyebrow oder die Hauptnavigation — egal welcher Viewport. Alte
     * `max(2.667rem, ...)`-Formel hatte einen Sprung bei vw 1485–1565, weil
     * sie das m-px-edge-Padding der Vergleichs-Sektionen ignorierte. */
    flex: 1 1 auto;
    min-width: 0;                                /* erlaubt Schrumpfen neben dem Bild */
    /* 100% statt 100vw — `100vw` schließt Scrollbar mit ein, JS-Layout misst
     * aber ohne; das gibt einen 4-px-Versatz zur m-max-w-Edge bei sichtbarem
     * Scrollbar. 100% = m-tis-grid-Width (= body − Scrollbar) eliminiert ihn. */
    padding-left: calc(max(0px, (100% - 1485px) / 2) + var(--edge-pad));
    padding-right: 2.222rem;                     /* 40px Abstand zum Bild */
    padding-top: 4.722rem;                       /* 85px */
    padding-bottom: 2.222rem;                    /* 40px */
    display: flex; flex-direction: column;
    color: var(--color-primary);
}
.m-tis-title {
    color: var(--section-heading, #4a73a1);      /* StyleGuide: Ultramarineblau 70 auf weißem BG */
    font-size: 1.889rem;                         /* 34px @ XL */
    line-height: 1.15;
    margin: 0 0 1rem 0;
}
.m-tis-title-line1 { display: block; font-weight: 300; }          /* Figtree Light */
.m-tis-title-line2 { display: block; font-weight: 800; text-transform: uppercase; letter-spacing: 0.02em; }          /* Figtree Extra Bold */

/* Body 2-spaltig als echtes Grid (statt CSS columns), damit der Button direkt unter
   der letzten Zeile der rechten Spalte sitzt — unabhängig davon, wie hoch die linke
   Spalte ist. */
.m-tis-body-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 2rem;                                   /* 36px Spaltenabstand */
    font-weight: 300;                            /* Figtree Light */
    font-size: 1rem;                             /* 18px @ XL */
    line-height: 1.55;
}
.m-tis-body-col { display: flex; flex-direction: column; align-items: flex-start; }
.m-tis-body-col > :first-child { margin-top: 0; }
.m-tis-body-col p { margin: 0 0 0.833rem 0; width: 100%; }
.m-tis-body-col p:last-of-type { margin-bottom: 0; }  /* Button kommt als <a> danach — daher :last-of-type statt :last-child */

/* 1-spaltige Variante (aktiv bei cols_mode=1col oder auto ohne Bild) */
.m-tis-body-single {
    display: flex; flex-direction: column; align-items: flex-start;
    font-weight: 300;
    font-size: 1rem;
    line-height: 1.55;
}
.m-tis-body-single > :first-child { margin-top: 0; }
.m-tis-body-single p { margin: 0 0 0.833rem 0; width: 100%; }
.m-tis-body-single p:last-of-type { margin-bottom: 0; }

/* Button „WEITERLESEN" — weiß auf #5076A2, gelber Pfeil rechts.
   Sitzt als Abschluss direkt unter der rechten Body-Spalte, mit 1,5-zeiligem Abstand. */
.m-tis-btn {
    align-self: flex-start;
    margin-top: 1.55rem;                         /* 1 × Body-Zeilenhöhe (≈ 28 px) — 1/3 kleiner als vorher */
    display: inline-flex; align-items: center; gap: 0.5rem;
    background-color: var(--section-link-bg, #5076A2);
    color: var(--section-link-fg, #ffffff);
    font-weight: 400;
    font-size: 1rem;                             /* 18px @ XL */
    padding: 0.389rem 0.889rem;                  /* 7px / 16px */
    border-radius: 0.222rem;
    text-decoration: none;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    transition: filter 0.2s;
}
.m-tis-btn:hover { filter: brightness(0.95); }
.m-tis-btn-icon { width: 1.111rem; height: 1.111rem; color: var(--color-accent); flex-shrink: 0; }

/* Bild: natürlich 960×694, Flex-Sibling rechts. Breite = halbe Extended-Zone
   (960 px absolute), max 50vw — schrumpft unter 1920 px mit, aber nie mehr
   als halbe Extended-Zone. Absolut in px, nicht rem — sonst Bruch bei 1800/1920
   Root-Font-Wechsel. */
.m-tis-img {
    flex: 0 0 calc(var(--sws-max-w-ext, 1920px) / 2);
    max-width: min(50vw, calc(var(--sws-max-w-ext, 1920px) / 2));
    height: 38.556rem;                           /* 694 px @ 18-px-Root, skaliert proportional */
    overflow: hidden;
}
.m-tis-img img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Unter lg: stacken, Bild nimmt volle Breite, Text-Padding wie .m-px-edge. */
@media (max-width: 1023px) {
    .m-tis-grid { flex-direction: column; min-height: 0; }
    .m-tis-text {
        padding: 2.222rem 2rem;
        order: 1;
    }
    .m-tis-img {
        flex: 0 0 auto;
        width: 100%; max-width: none; height: auto; aspect-ratio: 960 / 694;
        order: 2;
    }
    .m-tis-body-grid { grid-template-columns: 1fr; gap: 0; }
}
@media (max-width: 759px) {
    .m-tis-text { padding-left: 1.5rem; padding-right: 1.5rem; }
}

/* === Modul 04 · Bootsführerscheine (Termin-Kacheln) === */
/*
   Hintergrund bg-primary (Ultramarineblau 100). Oberer Rand läuft von links
   (12 px über „normalem" Rand) schräg nach rechts (auf 0) — dezenter Kipp-Effekt.
   Mittig oben ein 140-px-Kreis (dunkelblau) mit 120-px-Steuerrad (gelb) darin,
   Mitte liegt 25 px unter dem normalen oberen Rand.
   Unten rechts Boot-Dekoration (gelb). */
/* REGEL: BG-Klasse kommt aus der Section-Config — hier KEIN background-color. */
.m-bfs-section {
    color: #ffffff;
    position: relative;
    padding-top: 6.389rem;                        /* 115 px ab normalem Rand bis Content */
    /* padding-bottom dynamisch via Foundation-Regel
       `section:has(+ [data-section-top-decor]…)` (Zeile ~969):
       - mit Welle-Folge → clamp(60, 9.583vw, 184) px Puffer (greift mit !important)
       - ohne Welle-Folge → Standard-Section-Bottom unten (5 rem ≈ 80 px) */
    padding-bottom: 5rem;
}
/* Stufe links/rechts entfernt — User-Wunsch 2026-05-05: oberer Rand soll
   bündig durchlaufen, kein 12-px-Versatz auf der linken Hälfte. */

/* Sektion-Anker für no-wrapper-Module: das Universal-Template gibt
   bei no-wrapper einen <span class="sws-section-anchor" id="..."></span>
   vor der Modul-Section aus, damit Mega-Menu-Sprünge funktionieren.
   scroll-margin-top kompensiert den sticky Header (155 px). */
.sws-section-anchor {
    display: block;
    width: 0;
    height: 0;
    scroll-margin-top: 9rem;
}

/* Links grundsätzlich ohne Unterstrich (User-Wunsch 2026-05-07).
   Greift auf alle <a> im Fließtext und in Modulen. Wenn ein einzelner Link
   doch unterstrichen sein soll, kann der Redakteur via TinyMCE im inline
   style="text-decoration:underline" überschreiben. */
a {
    text-decoration: none;
}
a:hover, a:focus {
    text-decoration: none;
}

/* 140-px-Kreis + 120-px-Steuerrad: konzentrisch mittig, Mitte 25 px unter dem normalen Rand.
   Kreis-Farbe folgt der Section-BG (via --m-bfs-decor). */
.m-bfs-wheel {
    position: absolute;
    top: -2.5rem;                                 /* -45 px — 140/2 − 25 = 45 px über dem Rand */
    left: 50%;
    transform: translateX(-50%);
    width: 7.778rem;                              /* 140 px */
    height: 7.778rem;
    background: var(--m-bfs-decor, transparent);
    border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    z-index: 3;
}
.m-bfs-wheel-svg {
    width: 6.667rem;                              /* 120 px */
    height: 6.667rem;
    display: block;
}

.m-bfs-wrap { position: relative; z-index: 2; }

.m-bfs-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;               /* 50 : 50 */
    gap: 3.333rem;
}

/* Linke Spalte — Intro. Farben kommen aus der Section-Config (var(--section-*)). */
.m-bfs-title {
    font-size: 1.889rem;                          /* 34 px */
    color: var(--section-fg, #ffffff);
    line-height: 1.15;
    margin: 0 0 1rem 0;
}
.m-bfs-title-line1 { display: block; font-weight: 300; color: var(--section-muted, rgba(255,255,255,.7)); }    /* Figtree Light, gedämpft */
.m-bfs-title-line2 { display: block; font-weight: 800; text-transform: uppercase; letter-spacing: 0.02em; }                                                        /* ExtraBold, erbt section-fg */

.m-bfs-body {
    font-weight: 300;
    font-size: 1rem;                              /* 18 px */
    line-height: 1.55;
    color: var(--section-fg, #ffffff);
}
.m-bfs-body > :first-child { margin-top: 0; }
.m-bfs-body p { margin: 0 0 0.833rem 0; }
.m-bfs-body p:last-child { margin-bottom: 0; }

.m-bfs-btn {
    display: inline-flex; align-items: center; gap: 0.5rem;
    background-color: var(--section-link-bg, #5076A2);
    color: var(--section-link-fg, #ffffff);
    font-weight: 400;
    font-size: 1rem;
    padding: 0.389rem 0.889rem;
    border-radius: 0.222rem;
    text-decoration: none;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    margin-top: 1.55rem;
    transition: filter 0.2s;
}
.m-bfs-btn:hover { filter: brightness(0.95); }
.m-bfs-btn-icon { width: 1.111rem; height: 1.111rem; color: var(--color-accent); flex-shrink: 0; }

/* Rechte Spalte — Termine
   Termine-Haupttitel unten bündig mit Line2 der linken Spalte:
   padding-top = Line1-Höhe (Line1 = 34 × 1.15 = 39.1 px) plus (Line2 − Termine-Titel)
               = 34 × 1.15 + (34 − 22) × 1.15 = 2.94 rem (= 52.9 px @ XL 18)  */
.m-bfs-termine { padding-top: 2.94rem; }

.m-bfs-termine-title {
    color: var(--section-fg, #ffffff);
    font-weight: 800;                             /* Figtree ExtraBold */
    font-size: 1.222rem;                          /* 22 px */
    line-height: 1.15;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    margin: 0 0 1rem 0;                           /* unten bündig mit Line2, Abstand wie linke Spalte */
}

/* Kategorien: 2 Spalten nebeneinander (max 2), dritte wenn nötig in 2. Zeile */
.m-bfs-kat-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 1rem;
    row-gap: 1.667rem;
}
.m-bfs-kat { display: flex; flex-direction: column; }
.m-bfs-kat-title {
    color: var(--section-fg, #ffffff);
    font-weight: 400;                             /* Figtree Regular — 18 px, nicht bold */
    font-size: 1rem;                              /* 18 px */
    line-height: 1.15;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    margin: 0 0 0.556rem 0;                       /* 10 px zur ersten Kachel */
}

/* Kacheln vertikal gestapelt, max 2 pro Kategorie */
.m-bfs-kachel-stack {
    display: flex;
    flex-direction: column;
    gap: 0.556rem;                                /* 10 px zwischen den Kacheln */
}
.m-bfs-kachel {
    display: flex; align-items: center; justify-content: space-between;
    gap: 0.667rem;
    background-color: var(--card-bg, #5076A2);
    color: var(--card-fg, #ffffff);
    padding: 0.889rem 1.111rem;                   /* 16/20 px */
    border-radius: 0.222rem;
    text-decoration: none;
    transition: filter 0.2s;
}
/* Top und Bottom haben jetzt eigenständige Box-Klassen (eigene --card-* via Inline-Style).
   Kein brightness-Filter — der Redakteur wählt die Farben explizit. */
.m-bfs-kachel:hover { filter: brightness(0.95); }

.m-bfs-kachel-grid {
    display: grid;
    grid-template-columns: auto 1fr;
    column-gap: 0.556rem;                         /* 10 px */
    row-gap: 0.167rem;                            /* 3 px */
    font-size: 1rem;                              /* 18 px */
    line-height: 1.35;
}
.m-bfs-kachel-label { font-weight: 400; }       /* Figtree Regular */
.m-bfs-kachel-value { font-weight: 700; }       /* Datum Bold */
.m-bfs-kachel-arrow { flex-shrink: 0; }
.m-bfs-kachel-arrow-svg { width: 1.111rem; height: 1.111rem; color: var(--color-accent); }

/* Responsive < xl (1280 px) — 2-spaltig ist bei ≤ 1279 px zu eng für die
   Kacheln in der rechten Spalte, deshalb kollabiert das Haupt-Grid schon hier
   auf eine Spalte. Boot nur unterhalb lg (1024) komplett ausblenden. */
@media (max-width: 1279px) {
    .m-bfs-grid { grid-template-columns: 1fr; gap: 2.5rem; }
    .m-bfs-kachel-row { grid-template-columns: 1fr; }
}
@media (max-width: 1023px) {
    .m-bfs-section { padding-top: 4.5rem; padding-bottom: 3rem; }
    /* Termine-Titel braucht keinen baseline-Offset mehr, wenn untereinander */
    .m-bfs-termine { padding-top: 0; }
}
/* Sehr schmale Viewports: Terminarten-Grid kollabiert auf 1 Spalte (statt 2 nebeneinander).
   Zusätzlich mehr Luft vor der Welle (unten), damit die letzten Kacheln Abstand zum
   Welle-Übergang zur News-Section haben. */
@media (max-width: 639px) {
    .m-bfs-kat-grid { grid-template-columns: 1fr; }
    .m-bfs-section { padding-bottom: 5.5rem; }
}

/* === Modul 05 · News-Teaser-Grid (4 Karten, gelb) === */
/* REGEL: BG-Klasse kommt aus der Section-Config — hier KEIN background-color. */
.m-news-section {
    color: var(--section-fg, var(--color-primary));
    position: relative;
    padding-top: 0;                               /* Decor (z.B. Welle) schließt direkt an */
    padding-bottom: 0;                            /* 130-px-Block wird durch .m-news-cta-wrap selbst definiert */
}

/* === Foundation · Sektion-Top-Decor (generisch) === */
/*
   Greift auf jeder <section> mit dem Attribut [data-section-top-decor].
   Werte werden in der Section-Config gewählt; sws_section_config setzt
   pro Sektion folgende Custom Properties als Inline-Style:
     --section-top-decor-mask        URL des SVG-Masks
     --section-top-decor-aspect      Aspect-Ratio (z.B. 1920 / 102)
     --section-top-decor-color       Sektion-BG (= Welle-Farbe)
     --section-top-decor-prev-color  Vorgelagerte-Sektion-BG (für Sockel-Bänder)

   Render-Modell: Welle wird per ::before in der EIGENEN Sektion-Farbe ÜBER die
   Sektion-Oberkante hinaus in die Vorgänger-Sektion gerendert. Sichtbar wird
   die Welle dadurch, dass der nicht-mask-Bereich transparent ist und den
   Vorgänger-BG durchscheinen lässt (Welle = eigene Farbe wächst in fremde).

   Damit der Welle-Bereich KEINEN Vorgänger-Inhalt überdeckt, bekommt die
   Vorgänger-Sektion automatisch ein padding-bottom = Welle-Höhe via
   `:has(+ [data-section-top-decor])`-Selektor (modern browsers).
   Pflege der Decor-Varianten unter Page Composer → CSS-Klassen → Sektion-Decor. */
[data-section-top-decor]:not([data-section-top-decor=""]):not([data-section-top-decor="none"]) {
    position: relative;
}
/* Welle: zentriert, max 1920 px breit, +5 px Überstand seitlich (gegen Subpixel-Gaps).
   Höhe via aspect-ratio. */
[data-section-top-decor]:not([data-section-top-decor=""]):not([data-section-top-decor="none"])::before {
    content: '';
    position: absolute;
    bottom: 100%;
    left: 50%;
    transform: translateX(-50%);
    /* Wave-SVG-viewBox-Breite = 1920 px. Decke exakt diese Breite ab, damit
     * die Sockel-Bänder daneben (mit min(100vw, 1920px)-Berechnung) plan an
     * den Wellenrand anschließen. Frühere +10 px Subpixel-Hack ist nicht mehr
     * nötig, weil die Sockel die Lücken jetzt aktiv füllen. */
    width: 100%;
    max-width: 1920px;
    aspect-ratio: var(--section-top-decor-aspect, 1920 / 184);
    margin-bottom: -1px;
    background: var(--section-top-decor-color, var(--color-accent));
    mask-image: var(--section-top-decor-mask);
    mask-repeat: no-repeat;
    mask-position: bottom center;
    mask-size: 100% 100%;
    -webkit-mask-image: var(--section-top-decor-mask);
    -webkit-mask-repeat: no-repeat;
    -webkit-mask-position: bottom center;
    -webkit-mask-size: 100% 100%;
    pointer-events: none;
    z-index: 2;
}
/* Sockel-Bänder seitlich der Welle (bei Viewport > 1930 px sichtbar).
 *
 * Zwei separate Gradienten als Multi-Background auf einem ::after:
 * - Linkes Band: füllt den Bereich zwischen Viewport-Links und Welle-Links.
 *   Trennlinie auf Höhe `edge-y-left` (= Y-Position, an der die Welle ihren
 *   LINKEN Rand verlässt). Oben prev-color, unten current-color.
 * - Rechtes Band: spiegelbildlich auf Welle-Rechts → Viewport-Rechts.
 *   Trennlinie auf `edge-y-right` (kann sich von links unterscheiden, bei
 *   asymmetrischen Wellen wie „Welle mit Boot").
 *
 * Bei Viewport ≤ 1930 px haben beide Bänder Breite 0 → kein Effekt, die
 * Welle füllt die volle Breite. Bei Viewport > 1930 px nehmen die Bänder
 * (viewport - 1930) / 2 auf jeder Seite ein und schließen plan an die
 * linke/rechte Wellenrand-Höhe an.
 *
 * z-index 1 (unter der Welle z-index 2). Da die Bänder nur SEITLICH der
 * Welle Inhalt rendern, wird die Welle selbst nicht überdeckt. */
[data-section-top-decor]:not([data-section-top-decor=""]):not([data-section-top-decor="none"])::after {
    content: '';
    position: absolute;
    bottom: 100%;
    left: 50%;
    transform: translateX(-50%);
    width: 100vw;
    height: calc(min(100vw, 1920px) * var(--section-top-decor-h-frac, 0.0958));
    margin-bottom: -1px;
    background:
        linear-gradient(
            to bottom,
            var(--section-top-decor-prev-color, transparent) 0%,
            var(--section-top-decor-prev-color, transparent) var(--section-top-decor-edge-y-left, var(--section-top-decor-edge-y, 50%)),
            var(--section-top-decor-color, transparent) var(--section-top-decor-edge-y-left, var(--section-top-decor-edge-y, 50%)),
            var(--section-top-decor-color, transparent) 100%
        ) left top no-repeat,
        linear-gradient(
            to bottom,
            var(--section-top-decor-prev-color, transparent) 0%,
            var(--section-top-decor-prev-color, transparent) var(--section-top-decor-edge-y-right, var(--section-top-decor-edge-y, 50%)),
            var(--section-top-decor-color, transparent) var(--section-top-decor-edge-y-right, var(--section-top-decor-edge-y, 50%)),
            var(--section-top-decor-color, transparent) 100%
        ) right top no-repeat;
    /* Sockel-Bänder ragen 5 px in den Welle-Rect-Bereich hinein. Damit
     * dient der Sockel-Gradient als Backdrop für die Anti-Alias-Pixel des
     * Welle-Mask-Randes — die mischen sich dann nicht mit der prev-section-
     * Farbe (Blau), sondern mit dem korrekten Gradient (oben Blau, unten
     * Gelb). z-index 1 (unter der Welle z-index 2) — die Welle deckt im
     * 5-px-Überlapp den Sockel ab; sichtbar wirken die 5 px nur, wenn die
     * Welle dort transparent ist (Anti-Alias). */
    background-size:
        calc((100vw - min(100vw, 1920px)) / 2 + 5px) 100%,
        calc((100vw - min(100vw, 1920px)) / 2 + 5px) 100%;
    pointer-events: none;
    z-index: 1;
}
/* Vorgänger-Sektion bekommt automatisch padding-bottom = Welle-Höhe
   (clamp gegen sehr große/kleine Viewports). Greift auf jeder <section>,
   deren unmittelbar nachfolgende Sektion ein Decor-Attribut hat.
   Zusätzlich: tolerant gegen ein <style>-Element zwischen den Sections
   (Modul-Output kann kleines Inline-CSS direkt vor seiner Section emittieren).
   :has() wird ab Chrome 105 / Safari 15.4 / Firefox 121 unterstützt. */
section:has(+ [data-section-top-decor]:not([data-section-top-decor=""]):not([data-section-top-decor="none"])),
section:has(+ style + [data-section-top-decor]:not([data-section-top-decor=""]):not([data-section-top-decor="none"])) {
    padding-bottom: clamp(60px, 9.583vw, 184px) !important;
}
/* bfs-Section: zusätzliche 1.5rem Atemraum zwischen Inhalt-Unterkante (Termine-
   Box) und Welle/Boot, sonst klebt das Boot direkt an der Termine-Box (sichtbar
   bei Viewports >= 1920 px, wo das Foundation-Padding exakt der Welle-Höhe = 184 px). */
section.m-bfs-section:has(+ [data-section-top-decor]:not([data-section-top-decor=""]):not([data-section-top-decor="none"])),
section.m-bfs-section:has(+ style + [data-section-top-decor]:not([data-section-top-decor=""]):not([data-section-top-decor="none"])) {
    padding-bottom: calc(clamp(60px, 9.583vw, 184px) + 1.5rem) !important;
}
/* Detail-Section-Override: globale clamp(60, 9.583vw, 184) ist auf das
 * höchste Decor (welle-mit-boot, h-frac 0.0958) ausgelegt. Bei „welle"
 * (h-frac 0.053) ist die Welle nur ~102 px hoch, sodass leere px im
 * Padding entstehen → die Linkbox sitzt zu hoch über der Welle. Hier
 * exakt die Wellenhöhe als Padding setzen.
 * Selektor source-order NACH der globalen Regel platziert; gleiche
 * Spezifität → späterer Match gewinnt. */
section.m-news-view-section--detail:has(+ .m-news-view-more[data-section-top-decor="welle"]) {
    padding-bottom: calc(min(100vw, 1920px) * 0.053125) !important;
}
section.m-news-view-section--detail:has(+ .m-news-view-more[data-section-top-decor="welle-mit-boot"]) {
    padding-bottom: calc(min(100vw, 1920px) * 0.0958) !important;
}

/* === Foundation · Decor-Section Standard-Padding === */
/*
 * Sections mit Welle-Decor (Top oder Bottom) brauchen kein zusätzliches
 * Tailwind-Section-Padding (`py-20 lg:py-28` = 126 px), weil die Welle
 * visuell die Section-Grenze ist und der Inhalt direkt darunter beginnen
 * soll (siehe Startseite/News-Section: padding 0).
 *
 * Selector matcht nur Sections mit der Standard-Wrapper-Padding-Klasse
 * `py-20` (= Page-Composer-Section-Default). No-wrapper-Module wie
 * `.m-news-section`, `.m-bg-section` (`py-0`) bleiben unverändert.
 */
section[data-section-top-decor]:not([data-section-top-decor=""]):not([data-section-top-decor="none"])[class~="py-20"] {
    padding-top: 2.5rem !important;
    padding-bottom: 2.5rem !important;
}
section[data-section-bottom-decor]:not([data-section-bottom-decor=""]):not([data-section-bottom-decor="none"])[class~="py-20"] {
    padding-bottom: 2.5rem !important;
}

.m-news-wrap { position: relative; z-index: 1; }
.m-news-head {
    text-align: center;
    margin-bottom: 2.222rem;                      /* 40 px zum Grid */
}
.m-news-eyebrow {
    font-weight: 300;                             /* Figtree Light */
    font-size: 1.889rem;                          /* 34 px — analog Modul 03 */
    line-height: 1.15;
    margin: 0;
    color: var(--color-primary);
}
.m-news-title {
    font-weight: 800;                             /* ExtraBold */
    font-size: 1.889rem;                          /* 34 px */
    text-transform: uppercase;
    line-height: 1.15;
    margin: 0;
    color: var(--color-primary);
}

/* Equal-Height per Subgrid: alle Cards einer Reihe richten Datum, Fließtext
   und Linkbox auf gleichen Y-Positionen aus. Title+Subtitle bilden zusammen
   einen Heading-Block (.m-news-card-heading) → der Block stretcht auf max-
   Höhe der Reihe, intern bleiben die Abstände zwischen Title und Subtitle
   kompakt (flex-natürlich). */
.m-news-grid,
.m-news-grid--overview {
    display: grid;
    /* Deterministische Spalten-Zahl via Media-Queries statt auto-fit.
       Grund: Firefox + Chrome rendern `auto-fit` mit Subgrid-Kindern
       unterschiedlich — Firefox brach selbst mit `minmax(15rem, 18.889rem)`
       auf 3 Spalten, Chrome zeigte 4. Mit `repeat(N, 1fr)` + Media-Query
       sind beide Browser identisch. Cards füllen ihre fr-Spalte (Width
       = (container − gaps) / N), max gedeckelt durch `.m-news-card`-Width. */
    grid-template-columns: 1fr;
    grid-template-rows: auto auto auto 1fr auto;  /* img · heading-block · datum · text(flex) · btn */
    /* Grid füllt den vollen m-max-w-Container (1485 px). Cards strecken auf
     * 1fr — Width = (container_inner − 3·gap) / 4. Bei 1485 px Inhalt und
     * 36 px Gap ergibt das ~344 px pro Card (gegen vorher fix 340 mit
     * Restpadding rechts/links zum Container). column-gap 2rem (= 36 px)
     * statt 1.333rem (= 24 px) für mehr Luft zwischen den Kacheln. */
    column-gap: 2rem;
    row-gap: 2rem;
}
@media (min-width: 40rem)  { .m-news-grid, .m-news-grid--overview { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 56rem)  { .m-news-grid, .m-news-grid--overview { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 72rem)  { .m-news-grid, .m-news-grid--overview { grid-template-columns: repeat(4, 1fr); } }
.m-news-card {
    background-color: var(--card-bg, var(--section-box-bg, #ffffff));
    color: var(--card-fg, var(--section-box-fg, var(--color-primary)));
    display: grid;
    grid-template-rows: subgrid;
    grid-row: span 5;
    row-gap: 0;
    overflow: hidden;
    border-radius: 0.222rem;
    width: 100%;                                  /* füllt die feste 340-px-Spalte */
    min-width: 0;                                 /* erlaubt Schrumpfen unter min-content */
}
/* Body-Wrapper komplett aus dem HTML entfernt — Kinder (Heading-Block,
   Datum, Text, Btn) liegen direkt unter .m-news-card und werden vom
   Card-Subgrid direkt in die Rows 2..5 eingehängt. Damit braucht's weder
   display:contents (Firefox-Problemzone) noch nested subgrid. */
/* Heading-Block (Title+Subtitle): nimmt 1 Subgrid-Row ein. Inhalt oben
   ausgerichtet, Heading-Block-Höhe stretcht auf max-content der Reihe. */
.m-news-card-heading {
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
    padding: 1rem 1.111rem 0 1.111rem;
}
.m-news-card-img {
    width: 100%;
    aspect-ratio: 340 / 185;                      /* Bild-Format 340 × 185 px (Querformat) */
    overflow: hidden;
}
.m-news-card-img img {
    width: 100%; height: 100%; object-fit: cover; display: block;
}
.m-news-card-title {
    color: var(--section-box-fg, var(--color-primary));
    font-weight: 800;                             /* Figtree ExtraBold */
    font-size: 1.167rem;                          /* 21 px */
    text-transform: uppercase;
    line-height: 1.2;
    margin: 0 0 0.333rem 0;
}
.m-news-card-date {
    color: var(--section-box-fg, var(--color-primary));
    font-weight: 400;                             /* Figtree Regular */
    font-size: 1.167rem;                          /* 21 px */
    margin: 0;
    line-height: 1.25;
}
/* Veröffentlichungsdatum: kleine Schrift, dezent. Eigene Subgrid-Row →
   konsistente Y-Position über alle Cards einer Reihe. Einzeilig erzwungen
   (white-space: nowrap + overflow: hidden) damit der Slot kompakt bleibt. */
.m-news-card-published {
    color: var(--section-box-fg, var(--color-primary));
    opacity: 0.65;
    font-weight: 400;
    font-size: 0.778rem;                          /* 14 px @ 18-root */
    line-height: 1.2;
    margin: 0.667rem 0 0 0;                       /* ~12 px Abstand zum Heading (≤ 1 Zeilenhöhe) */
    padding: 0 1.111rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.m-news-card-text {
    color: var(--section-box-fg, var(--color-primary));
    font-weight: 400;                             /* Figtree Regular */
    font-size: 0.944rem;                          /* 17 px */
    line-height: 1.4;
    margin: 0.333rem 0 0 0;                       /* ~6 px Abstand zum Datum (halbiert) */
    padding: 0 1.111rem;
}
.m-news-card-btn {
    display: inline-flex; align-items: center; gap: 0.5rem;
    align-self: flex-start;
    background-color: #5076A2;
    color: #ffffff;
    font-size: 1rem;                              /* 18 px */
    font-weight: 400;
    padding: 0.389rem 0.889rem;                   /* 7/16 px */
    border-radius: 0.222rem;
    text-decoration: none;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    margin: 1rem 1.111rem 1.222rem 1.111rem;      /* 18 px oben, 20/22/20 außen (vom Body-Padding übernommen) */
    transition: filter 0.2s;
}
.m-news-card-btn:hover { filter: brightness(0.95); }
.m-news-btn-icon { width: 1.111rem; height: 1.111rem; color: var(--color-accent); flex-shrink: 0; }

/* CTA-Linkbox unten („ALLE NEWS ANSEHEN") — im 130-px-Block unter dem News-Grid
   horizontal und vertikal mittig platziert. Block ersetzt padding-bottom der Section. */
.m-news-cta-wrap {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 7.222rem;                             /* 130 px */
    margin-top: 0;
}
.m-news-cta {
    display: inline-flex; align-items: center; gap: 0.5rem;
    background-color: var(--section-link-bg, #5076A2);
    color: var(--section-link-fg, #ffffff);
    font-weight: 400;                             /* Figtree Regular */
    font-size: 1rem;                              /* 18 px */
    padding: 0.389rem 0.889rem;                   /* 7/16 px */
    border-radius: 0.222rem;
    text-decoration: none;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    transition: filter 0.2s;
}
.m-news-cta:hover { filter: brightness(0.95); }

/* Mobile (< 40rem / 640 px): Subgrid abschalten — bei nur 1 Card pro Reihe
 * braucht es keine Gleichhöhe-Synchronisation, und Subgrid ist genau die
 * Stelle, wo Firefox vorher gebrochen ist (Karten-Layout überlagert).
 * Cards werden zu normalen Block-Stacks; Children fließen natürlich. */
@media (max-width: 39.999rem) {
    .m-news-grid,
    .m-news-grid--overview {
        display: block;
    }
    .m-news-card {
        display: block;
        grid-row: auto;
        grid-template-rows: none;
        margin-bottom: 1.333rem;
    }
    .m-news-card:last-child { margin-bottom: 0; }
}

/* === Modul 06 · Über BCL (Split-Sektion) === */
/*
   Links vollbleed Bild bis Viewport-Mitte. Rechts innerhalb 1485-Inhaltsbox sitzt der Wrap
   ab Viewport-Mitte bis zum 1485-rechten-Rand. Im Wrap: Titel spannt über die komplette
   Wrap-Breite (Text + Vignette), darunter der Text, rechts-mittig das Steuerrad.
   REGEL: BG + Schriftfarben kommen aus der Section-Config. */
.m-abt-section {
    color: var(--section-fg, #ffffff);
    position: relative;
    overflow: hidden;                             /* Steuerrad/Bild clippen am Viewport */
    min-height: 26.667rem;                        /* 480 px */
}
/* Bild: linke Hälfte einer zentrierten 1920-Box, analog .m-tis-wrap (Skipperfreunde).
   Unter 1920 Viewport: `left:0`, `width:50%` → klassische Viewport-Mitte (wie bisher).
   Ab 1920 Viewport: `left` rueckt mittig ein, `width` cappt bei 960 — der Sektions-
   Hintergrund wird links und rechts sichtbar. Mathematisch: image-right = viewport/2
   in beiden Regimen, sodass der Wrap (`margin-left: 50%`) nahtlos anschliesst. */
.m-abt-img {
    position: absolute;
    top: 0; bottom: 0;
    left: max(0px, calc((100% - 1920px) / 2));
    width: min(50%, 960px);
    overflow: hidden;
}
.m-abt-img img {
    width: 100%; height: 100%; object-fit: cover; display: block;
}
.m-abt-wrap {
    margin-left: 50%;                             /* startet an Viewport-Mitte */
    /* Symmetrisch zur Bild-Cap-Logik (`.m-abt-img`): unter 1920 Viewport
       fuellt der Wrap die rechte Haelfte (margin-right=0). Ab 1920 cappt er
       am 1920-rechten Rand; rechts davon wird der Section-BG sichtbar — wie
       links neben dem Bild. So bleibt der Content bei jeder Aufloesung
       konstant 960 px breit, egal wie breit der Viewport ist. */
    margin-right: max(0px, calc((100% - 1920px) / 2));
    position: relative;
    min-height: 26.667rem;
    padding: 3.889rem 17rem 3.889rem 2.222rem;    /* 70 / 306 / 70 / 40 — rechts Freiraum fuer 260-px-Wheel + ~46 px Gap */
}
/* Wheel ist absolute am rechten Viewport-Rand — Content nimmt die volle Wrap-Breite. */
.m-abt-content {
    display: block;
}
.m-abt-text {
    display: flex; flex-direction: column;
}
.m-abt-title {
    color: var(--section-heading, var(--section-fg, #ffffff));
    font-size: 1.889rem;                          /* 34 px */
    line-height: 1.15;
    margin: 0 0 1.778rem 0;                       /* 32 px Abstand zum Body */
    position: relative;
    z-index: 2;                                   /* über dem Wheel, wenn sie sich visuell berühren */
}
.m-abt-title-line1 { display: block; font-weight: 800; text-transform: uppercase; letter-spacing: 0.02em; }   /* ExtraBold */
.m-abt-title-line2 { display: block; font-weight: 300; }   /* Light */
.m-abt-body {
    font-size: 0.944rem;                          /* 17 px */
    font-weight: 400;
    line-height: 1.5;
    color: var(--section-fg, #ffffff);
}
.m-abt-body--1col { columns: 1; }
.m-abt-body--2col { columns: 2; column-gap: 2.222rem; }
.m-abt-body p { margin: 0 0 1rem 0; break-inside: avoid; }
.m-abt-body p:last-child { margin-bottom: 0; }
.m-abt-btn {
    display: inline-flex; align-items: center; gap: 0.5rem;
    align-self: flex-start;
    margin-top: 1.778rem;                         /* 32 px */
    background-color: var(--section-link-bg, var(--color-primary));
    color: var(--section-link-fg, #ffffff);
    font-weight: 400;
    font-size: 1rem;                              /* 18 px */
    padding: 0.389rem 0.889rem;
    border-radius: 0.222rem;
    text-decoration: none;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    transition: filter 0.2s;
}
.m-abt-btn:hover { filter: brightness(0.95); }

/* Vignette: absolute am rechten Viewport-Rand, vertikal mittig in der Wrap-Box.
   Containing Block ist .m-abt-wrap (position:relative); right:0 = Wrap-Rechtsrand
   = Viewport-Rechtsrand (margin-right:0). */
.m-abt-wheel {
    position: absolute;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
    width: 14.444rem;                             /* 260 px Durchmesser */
    height: 14.444rem;
    z-index: 2;
}
.m-abt-wheel-svg { width: 100%; height: 100%; display: block; }

@media (max-width: 1023px) {
    .m-abt-section { min-height: 0; }
    .m-abt-img { position: static; width: 100%; aspect-ratio: 960 / 480; }
    .m-abt-wrap { margin-left: 0; margin-right: 0; width: 100%; min-height: 0; padding: 2rem 1.5rem; }
    .m-abt-text { padding-right: 0; }
    .m-abt-body--2col { columns: 1; }
    .m-abt-wheel { display: none; }
}

/* === Utility · Responsive-Overrides < 1024 px === */
/*
   Unter Tailwind-Breakpoint lg stacked das Grid (1 oder 2 Spalten). Die bei XL fixierten
   Sektions-Hoehen (Kontakt 120, Footer 440) reichen dann nicht mehr fuer den stacked Inhalt.
   Fix: height → auto, zugleich etwas Padding fuer Atmung.
   Auch der untere Footer-Balken geht auf auto, damit Copyright + Impressum/Datenschutz
   vertikal untereinander Platz finden, wenn sie bei schmalem Viewport umbrechen. */
/* Schnellkontakt bekommt unterhalb von 1430 px auto-Höhe + vertikales Padding.
   Die fixe Token-Höhe (120 px @ XL) reicht nicht für mehrzeilige Grid-Layouts:
   2 Spalten bei <768, 3 Spalten (= 2 Zeilen) bei 768–1429. Erst ab 1430 px
   passen alle 6 Slots (Label + 5 Kontakte) in eine Zeile — dort greift wieder
   die Token-Höhe. Breakpoint sync mit .m-kontakt-grid oben. */
@media (max-width: 1429px) {
    .m-kontakt-h {
        height: auto;
        padding-top: 1.5rem;
        padding-bottom: 1.5rem;
    }
}
@media (max-width: 1023px) {
    .m-footer-main {
        height: auto;
        padding-top: 2.5rem;
        padding-bottom: 2.5rem;
    }
    .m-footer-bar {
        height: auto;
        padding-top: 1rem;
        padding-bottom: 1rem;
    }
}
/* Ab Desktop (>= 1024 px) ist die Footer-Hoehe aus sws-breakpoints (24.444rem = 440 px
   @ XL) als Ziel-/Mindesthoehe gedacht. Bei 1024-1279 px werden die fuenf Spalten
   jedoch so schmal (~164 px @ 1030 px), dass laengere Linklisten („DIE LAHN") in
   mehrzeilig umbrechen und ueber 440 px hinauswachsen — Inhalt laeuft dann in den
   unteren Balken. Fix: height -> min-height; zusaetzliches padding-bottom gibt der
   wachsenden Liste Abstand zum Balken. Bei XL ändert sich nichts, da der Inhalt dort
   in 440 px passt. */
@media (min-width: 1024px) {
    .m-footer-main {
        height: auto;
        min-height: 24.444rem;
        padding-bottom: 2.5rem;
    }
}

/* Footer-Ueberschriften umbrechen im Laptop-Band sauber:
   (A) `hyphens: auto` + `overflow-wrap: break-word` erlauben Silbentrennung fuer
       lange Komposita wie „BOOTSFÜHRERSCHEINE", damit sie nicht in die Nachbar-
       spalte leaken.
   (B) Im Band 1024-1279 px zusaetzlich kleinere Font-Size (1rem statt 1.222rem),
       da die Spalten dort nur ~164 px breit sind. Ab 1280 px gilt wieder die
       Token-Groesse aus sws-breakpoints.css. */
.m-footer-heading-text {
    overflow-wrap: break-word;
    hyphens: auto;
}
@media (min-width: 1024px) and (max-width: 1279px) {
    .m-footer-heading-text {
        font-size: 1rem;
    }
}

/* === Mega-Menü · Desktop === */
/*
   Phase 1 — Hover/Fokus-Dropdown unter dem Header.
 */
.m-nav-root { position: static; }
/* Abstand zwischen Logo-Circle und erstem Nav-Item: 70 px @ XL, skaliert via rem */
.m-nav-offset { margin-left: 3.889rem; }
.m-nav-item { position: relative; display: flex; align-items: center; }
.m-nav-item .m-nav-link { display: inline-flex; align-items: center; padding: 0.5rem 0; }

/* Mega-Menü Viewport: unsichtbarer Positionier-Container unter dem Header.
   Der weiße Panel-Hintergrund sitzt auf dem inneren .m-max-w-Container und ist
   dadurch auf die Content-Zone (max. 1485 px, wie Nav-Leiste) begrenzt — nicht full-width. */
.m-megamenu-viewport {
    display: none;
    position: absolute;
    top: 100%; left: 0; right: 0;
    z-index: 40;
    pointer-events: none;                         /* darunterliegender Content anklickbar, wenn geschlossen */
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.2s ease;
}
@media (min-width: 1024px) {
    .m-megamenu-viewport { display: block; }
}
.m-megamenu-viewport.is-open { max-height: 52rem; overflow: visible; }
.m-megamenu-viewport.is-open .m-megamenu.is-open { pointer-events: auto; }

.m-megamenu { display: none; padding: 0; }
.m-megamenu.is-open { display: block; }
/* m-max-w-Container innerhalb eines Mega-Menüs: nur Positionier-Wrapper, keine Optik. */
.m-megamenu > .m-max-w { background: transparent; box-shadow: none; border: 0; }

/* Inner-Layout: Panels-Block links, Linkleiste rechts.
   Breite @XL 1635 px (= 90.833rem bei root 18). Skaliert via rem auf alle Breakpoints.
   Padding: 40 px seitlich und unten (= 2.222rem), oben leicht negativ damit das Panel in die
   weiße Header-Leiste reicht. */
.m-megamenu > .m-max-w { background: transparent; border-top: 0; box-shadow: none; }
.m-megamenu { padding: 0; }
.m-megamenu-inner {
    max-width: 90.833rem;                            /* 1635 px @ XL-Root-18 (obere Grenze) */
    /* Links beim Nav-Start (Logo-Breite + 70 px Abstand), rechts am 1485-Content-Rand. */
    margin-left: calc(12.333rem + 3.889rem);         /* Logo-Circle + 70 px */
    margin-right: max(0px, calc((100% - 82.5rem) / 2));
    margin-top: -1.25rem;                            /* ragt 22 px in die weiße Header-Leiste */
    display: grid;
    grid-template-columns: minmax(0, 1fr) 12rem;     /* Panels 1fr, Linkleiste 180-216 px (Headline+2 Links reichen — vorher 18.889rem = 340 px, hat links zu wenig Platz für 2 Card-Cols gelassen) */
    gap: 3.333rem;                                   /* 60 px */
    align-items: start;
    background: #ffffff;
    box-shadow: 0 0.5rem 1.25rem rgba(0, 0, 0, 0.08);
    padding: 2.222rem;                               /* 40 px rundum @XL */
    position: relative;
    z-index: 41;
}
/* Kleinere Viewports: Inner füllt die verfügbare Breite bis zum m-px-edge. */
@media (max-width: 1564px) {
    .m-megamenu-inner { margin-right: 2.667rem; }
}
@media (max-width: 1023px) {
    .m-megamenu-inner { margin-left: 2rem; margin-right: 2rem; grid-template-columns: 1fr; gap: 2rem; }
}
@media (max-width: 759px) {
    .m-megamenu-inner { margin-left: 1.5rem; margin-right: 1.5rem; padding: 1.5rem; }
}

/* Spalten-Überschriften (links und rechts): 27 px ExtraBold #5076A2 UPPERCASE */
.m-megamenu-col-title,
.m-megamenu-side-title {
    font-weight: 800;                                /* Figtree ExtraBold */
    font-size: 1.5rem;                               /* 27 px @ 18 */
    line-height: 1.15;
    color: #5076A2;
    margin: 0 0 1.333rem 0;                          /* 24 px Abstand zum Content */
    text-transform: uppercase;
    letter-spacing: 0.02em;
}

/* 2×2-Grid mit Panels */
.m-megamenu-main { min-width: 0; }
.m-megamenu-panels {
    display: grid;
    /* minmax(0, 1fr) statt 1fr — sonst diktiert min-content-Breite der
       Panels (langes Uppercase-Title mit letter-spacing) die Spaltenbreite
       und sprengt den Container in die Linkleiste. */
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 1.667rem 2.222rem;                          /* 30 px vertikal, 40 px horizontal */
    min-width: 0;
}
/* Tablet/Laptop-Layout für Mega-Menü-Panels — siehe Override am Ende der
 * Mega-Menü-Sektion (nach den Title/Desc-Defs, sonst greift Spezifität nicht). */
.m-mm-panel { min-width: 0; }
.m-mm-panel-title,
.m-mm-panel-desc,
.m-mm-panel-links a {
    min-width: 0;
    /* hyphens:auto trennt an deutschen Silbengrenzen (lang="de" auf <html>);
     * word-break/break-word entfernt — würde mitten im Wort schneiden. */
    overflow-wrap: break-word;
    hyphens: auto;
    -webkit-hyphens: auto;
}
.m-mm-panel {
    display: flex;
    flex-direction: column;
}

/* Bild 460×160 px (Seitenverhältnis 23:8). Via rem-Höhe, Breite flexibel. */
.m-mm-panel-img {
    display: block;
    width: 100%;
    aspect-ratio: 460 / 160;
    background: #5076A2;
    margin-bottom: 0.889rem;                         /* 16 px Abstand zum Titel unter dem Bild */
    transition: opacity 0.15s;
    overflow: hidden;
    position: relative;
}
.m-mm-panel-img:hover { opacity: 0.85; }
.m-mm-panel-img > img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
}

/* Panel-Titel = Unterschrift unter dem Bild. 22 px Bold #505050 UPPERCASE. */
.m-mm-panel-title {
    font-weight: 700;                                /* Figtree Bold */
    font-size: 1.222rem;                             /* 22 px @ 18 */
    line-height: 1.2;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    margin-bottom: 0.667rem;                         /* 12 px zur Listen-/Desc-Sektion */
    color: #505050;
    text-decoration: none;
    transition: opacity 0.15s;
}
.m-mm-panel-title:hover { opacity: 0.75; }

/* Beschreibung + Link-Items: Figtree Light 22 px #505050, Pfeil #5076A2 */
.m-mm-panel-desc {
    font-weight: 300;                                /* Figtree Light */
    font-size: 1.222rem;                             /* 22 px */
    line-height: 1.35;
    color: #505050;
}
.m-mm-panel-desc p { margin: 0 0 0.444rem 0; }
.m-mm-panel-desc p:last-child { margin-bottom: 0; }
.m-mm-panel-desc a { color: #5076A2; }
.m-mm-panel-desc strong { font-weight: 700; }
.m-mm-panel-desc em { font-style: italic; }

.m-mm-panel-links {
    list-style: none; padding: 0; margin: 0;
}
.m-mm-panel-links li,
.m-megamenu-side-list li { margin: 0; }
.m-mm-panel-links a,
.m-megamenu-side-list a {
    display: inline-flex; align-items: flex-start;   /* Pfeil an erster Zeile ausrichten */
    gap: 0.556rem;                                   /* 10 px Icon-Gap */
    font-weight: 300;                                /* Figtree Light */
    font-size: 1.222rem;                             /* 22 px */
    line-height: 1.4;                                /* User-Vorgabe */
    color: #505050;
    text-decoration: none;
    transition: opacity 0.15s;
}
.m-mm-panel-links a:hover,
.m-megamenu-side-list a:hover { opacity: 0.7; }

/* Pfeil-Icon (sws_icon arrow-right) in den Link-Listen.
   margin-top zentriert ihn auf die Mitte der ersten Textzeile:
   (line-height-in-em − icon-height-in-em) / 2 ≈ (1.4 − 0.728) / 2 = 0.336em @22px. */
.m-mm-arrow-icon {
    width: 0.889rem; height: 0.889rem;               /* 16 px */
    color: #5076A2;                                  /* Pfeil-Farbe laut Vorgabe */
    flex-shrink: 0;
    display: inline-block;
    margin-top: 0.411rem;                            /* passt für font-size 22, line-height 1.4 */
}

/* Rechte Linkleiste */
.m-megamenu-side-list { list-style: none; padding: 0; margin: 0; }

/* Laptop-Range (1024-1279 px): 2-Col-Karten + kleinere Schrift.
 * SPORTBOOTFÜHRERSCHEIN (20 chars Uppercase Bold + letter-spacing) braucht
 * bei 18.33-px-Schrift ~270 px — bei 1024 px Viewport hat jede Karte aber
 * nur ~205 px. Mit 1rem-Schrift (= 15 px @ Laptop-Root) schrumpft das Wort
 * auf ~185 px und passt in eine Zeile. Ab 1280 px greift die Standard-
 * Schrift (1.222rem), Karten dann breit genug.
 * Hinweis: die rechte KURSE-Spalte wurde von 18.889rem auf 12rem reduziert
 * (siehe .m-megamenu-inner) — sonst wäre links nicht mal mit kleinerer
 * Schrift genug Platz für 2 Karten.
 * Position NACH den Title/Desc-Default-Defs damit die Override-Spezifität
 * gleich ist und der spätere Selektor in der Cascade gewinnt. */
@media (min-width: 64em) and (max-width: 79.99em) {
    .m-mm-panel-title { font-size: 1rem; }      /* 15 px @ Laptop-Root */
    .m-mm-panel-desc  { font-size: 1rem; line-height: 1.4; }
}

/* === Mega-Menü · Mobile (Accordion) === */
/*
   Burger-Menü < 1024 px.
 */
.m-mobile-nav { padding: 0.5rem 0; }
.m-mobile-nav-item { border-bottom: 1px solid rgba(29, 57, 105, 0.08); }
.m-mobile-nav-item:last-child { border-bottom: 0; }
.m-mobile-nav-toggle,
.m-mobile-nav-link {
    display: flex;
    align-items: center;
    justify-content: space-between;
    width: 100%;
    padding: 1rem 1.5rem;
    background: transparent;
    border: 0;
    color: var(--color-primary);
    font-family: inherit;
    font-weight: 400;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    text-align: left;
    text-decoration: none;
    cursor: pointer;
}
.m-mobile-nav-toggle.is-active,
.m-mobile-nav-link.is-active { color: var(--color-accent); }
.m-mobile-nav-chevron { transition: transform 0.2s ease; flex-shrink: 0; }
.m-mobile-nav-toggle[aria-expanded="true"] .m-mobile-nav-chevron { transform: rotate(180deg); }

.m-mobile-nav-panel {
    display: none;
    padding: 0 1.5rem 1.25rem 1.5rem;
    background: rgba(29, 57, 105, 0.025);
}
.m-mobile-nav-panel.is-open { display: block; }
.m-mobile-nav-section-link {
    display: inline-block;
    padding: 0.5rem 0 1rem 0;
    color: var(--color-primary);
    font-weight: 700;
    text-decoration: none;
}

/* Mega-Menü-Content innerhalb des Mobile-Accordions:
   stacked (1-Spaltig), Bilder behalten Aspect-Ratio, Typografie kleiner als Desktop-MM. */
.m-mobile-nav-panel .m-megamenu-inner {
    display: block;
    max-width: none;
    margin: 0;
    padding: 0;
    background: transparent;
    box-shadow: none;
}
.m-mobile-nav-panel .m-megamenu-main { margin-bottom: 1.25rem; }
.m-mobile-nav-panel .m-megamenu-panels {
    display: grid;
    grid-template-columns: 1fr;
    gap: 1.25rem;
}
.m-mobile-nav-panel .m-megamenu-col-title,
.m-mobile-nav-panel .m-megamenu-side-title {
    font-size: 1.125rem;                         /* kleiner auf Mobile */
    margin-bottom: 0.75rem;
}
/* Mobile-Panels: Bild kompakt (max 240 px breit), Titel darunter, Links/Beschreibung darunter.
   Stacked-Layout wie Desktop, aber Bild in der Größe gedeckelt, damit nicht zuviel gescrollt wird. */
.m-mobile-nav-panel .m-mm-panel {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
}
.m-mobile-nav-panel .m-mm-panel-img {
    width: 100%;
    max-width: 13.333rem;                         /* 240 px — kompakter Thumbnail */
    height: auto;
    aspect-ratio: 460 / 160;
    margin-bottom: 0.5rem;
}
.m-mobile-nav-panel .m-mm-panel-title {
    font-size: 1rem;
    margin-bottom: 0.375rem;
}
.m-mobile-nav-panel .m-mm-panel-desc,
.m-mobile-nav-panel .m-mm-panel-links a,
.m-mobile-nav-panel .m-megamenu-side-list a {
    font-size: 0.9375rem;
    line-height: 1.4;
}
.m-mobile-nav-panel .m-megamenu-side {
    margin-top: 1.25rem;
    padding-top: 1rem;
    border-top: 1px solid rgba(29, 57, 105, 0.1);
}
.m-mobile-nav-panel .m-mm-arrow-icon {
    width: 0.75rem; height: 0.75rem;
    margin-top: 0.28rem;
}

/* === Flyouts · Pegel + Schneller Kontakt === */
/*
 * Desktop: fixed rechts, mittig, Click-to-open
 * Mobile : schlanke Leiste am unteren Rand
 */
.m-flyout {
    position: fixed;
    right: 0;
    top: 11.111rem;                                 /* 200 px von oben */
    z-index: 45;
    display: flex;
    flex-direction: column;
    align-items: flex-end;                          /* rechtsbündig */
    gap: 0.556rem;                                 /* 10 px zwischen Tiles */
    pointer-events: none;                           /* nur Kinder klickbar */
}
/* Item ist eine horizontale Flex-Row: Tile links, Panel rechts daneben.
   Panel wächst beim Öffnen aus dem rechten Rand heraus nach links und
   schiebt das Tile dabei in den Inhalt. Der Schatten liegt EINMAL auf dem
   Item (drop-shadow folgt der sichtbaren Gesamtform) — so wirken Tile und
   Panel optisch als ein Element, ohne innere Schatten-Fuge. */
.m-flyout-item {
    pointer-events: auto;
    display: flex;
    flex-direction: row;
    align-items: flex-start;
    filter: drop-shadow(0 0.278rem 0.667rem rgba(0, 0, 0, 0.15));
}

/* Tile (Bouton) */
.m-flyout-tile {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 5rem;                                    /* 90 px */
    height: 5rem;                                   /* 90 px — passt zur Pegel-Infobox-Höhe */
    background: #ffffff;
    border: none;
    border-radius: 0.333rem 0 0 0.333rem;           /* 6 px links */
    cursor: pointer;
    color: #5076A2;
    transition: background-color 0.18s;
    position: relative;
    z-index: 2;                                     /* über dem Panel */
    margin-right: 0;
    /* box-shadow entfernt — Schatten liegt auf dem Item via drop-shadow. */
}
.m-flyout-item.is-open .m-flyout-tile {
    margin-right: -0.333rem;                        /* = Panel-Radius, überlappt 6 px */
}
.m-flyout-tile:hover,
.m-flyout-tile[aria-expanded="true"] { background: #ffffff; }

.m-flyout-icon {
    width: auto;                                    /* proportional zur Höhe */
    height: 3.889rem;                               /* 70 px */
    display: block;
}
/* Gepflegte SVGs (icon-pegel, icon-hafenmeister) tragen teils .cls-1 mit
   Magenta-Fill, teils unbeklasste <path>/<rect>-Elemente. Kompromisslos alle
   Kinder umfärben — SVG-interner <style> wird via !important ausgehebelt. */
.m-flyout-icon,
.m-flyout-icon * { fill: #5076A2 !important; }
.m-flyout-tile:hover .m-flyout-icon,
.m-flyout-tile:hover .m-flyout-icon *,
.m-flyout-tile[aria-expanded="true"] .m-flyout-icon,
.m-flyout-tile[aria-expanded="true"] .m-flyout-icon * { fill: #15365F !important; }

/* Panel sitzt als Flex-Child rechts vom Tile. Geschlossen: max-width 0 (+
   overflow:hidden) klappt es auf 0 Breite zusammen — Tile sitzt am Viewport-
   Rand. Offen: max-width wächst auf volle Breite, Panel fährt nach links
   heraus und drückt das Tile in den Inhalt. Beide Panels haben feste Breite,
   damit Pegel und Kontakt gleich wirken. Rundung links (top-left + bottom-
   left); die Tile-Überlappung verdeckt die obere linke Rundung. */
.m-flyout-panel {
    order: 2;
    flex-shrink: 0;
    width: 16rem;                                   /* 288 px — fest, beide Panels gleich */
    max-width: 0;                                   /* geschlossen: auf 0 geklappt */
    padding: 0.556rem 0;                            /* horizontal 0 im geschlossenen Zustand */
    background: #ffffff;
    overflow: hidden;
    border-radius: 0.333rem 0 0 0.333rem;           /* 6 px links oben + unten */
    pointer-events: none;
    position: relative;
    z-index: 1;
    transition: max-width 0.28s ease-out, padding 0.28s ease-out;
    /* box-shadow entfernt — einheitlicher drop-shadow auf .m-flyout-item. */
}
.m-flyout-item.is-open .m-flyout-panel {
    max-width: 16rem;
    /* 10 px oben/unten, 12 px rechts; links 18 px (6 px Tile-Überlappung +
       12 px Abstand zur Tile-Kante) */
    padding: 0.556rem 0.667rem 0.556rem 1rem;
    pointer-events: auto;
}

.m-flyout-title {
    font-size: 1rem;                                /* 18 px @ 18-px-Root */
    font-weight: 700;                               /* Figtree Bold */
    text-transform: uppercase;
    letter-spacing: 0.02em;
    color: #5076A2;                                 /* BCL-Primary */
    /* margin: 0 0 0.111rem;                            2 px — kompakt */
    line-height: 1.2;
}
/* Pegel-Panel: kompaktes vertikales Padding, damit Panel-Höhe der Tile-Höhe
   (90 px) entspricht. Kontakt-Panel behält die größere Default-Padding. */
.m-flyout-item[data-flyout="pegel"].is-open .m-flyout-panel {
    padding-top: 0.389rem;                          /* 7 px */
    padding-bottom: 0.389rem;
    min-height: 5rem;                               /* = Tile-Höhe 90 px */
}
.m-flyout-list {
    list-style: none;
    margin: 0;
    padding: 0;
}
.m-flyout-list li + li { margin-top: 0; }
.m-flyout-list a {
    display: inline-flex;
    align-items: baseline;
    gap: 0.389rem;                                  /* 7 px */
    font-size: 1rem;                                /* 18 px */
    font-weight: 300;                               /* Figtree Light */
    color: #505050;
    text-decoration: none;
    line-height: 1.4;                               /* Zeilenabstand zwischen den Links */
}
.m-flyout-list a:hover { color: #15365F; }
.m-flyout-arrow {
    width: 0.75rem;
    height: 0.75rem;
    color: #E8A628;
    flex-shrink: 0;
    transform: translateY(0.1rem);
}

/* Kontakt-Liste */
.m-flyout-kontakt {
    list-style: none;
    margin: 0;
    padding: 0;
}
.m-flyout-kontakt li + li { margin-top: 0.5rem; } /* 9 px Abstand zwischen Einträgen */
.m-flyout-role {
    font-size: 1rem;                                /* 18 px */
    font-weight: 700;                               /* Figtree Bold */
    color: #5076A2;
    margin: 0;
    line-height: 1.2;
}
.m-flyout-name {
    font-size: 0.889rem;                            /* 16 px */
    font-weight: 300;                               /* Figtree Light */
    color: #505050;
    margin: 0;
    line-height: 1.3;
}
.m-flyout-tel {
    display: inline-flex;
    align-items: center;
    gap: 0.278rem;                                  /* 5 px */
    font-size: 0.889rem;                            /* 16 px */
    font-weight: 300;
    color: #505050;
    text-decoration: none;
    line-height: 1.3;
    margin-top: 0;
}
.m-flyout-tel:hover { color: #15365F; }
.m-flyout-tel-icon {
    width: 0.833rem;                                /* 15 px */
    height: 0.833rem;
    color: #E8A628;
    flex-shrink: 0;
}

/* ---- Mobile: schlanke Bottom-Leiste statt seitliche Tiles ----
 * Wichtig: filter:drop-shadow auf .m-flyout-item (Desktop-Regel) erzeugt
 * einen Containing Block für position:fixed-Kinder → das Panel würde sonst
 * nicht mehr viewport-bezogen positioniert. Auf Mobile deshalb filter:none. */
@media (max-width: 1023px) {
    .m-flyout {
        top: auto;
        bottom: 0;
        right: 0;
        left: 0;
        transform: none;
        flex-direction: row;
        align-items: stretch;
        justify-content: stretch;
        gap: 0;
        background: #ffffff;
        box-shadow: 0 -0.167rem 0.833rem rgba(0, 0, 0, 0.1);
    }
    /* Jedes Item = halbe Bar-Breite, ohne item-scope drop-shadow */
    .m-flyout-item {
        flex: 1 1 50%;
        filter: none;
    }
    .m-flyout-tile {
        width: 100%;
        height: 3rem;                               /* 54 px Bar-Höhe */
        border-radius: 0;
        border-top: 1px solid rgba(80, 118, 162, 0.12);
        margin: 0;
    }
    /* Desktop-Überlappung (margin-right: -6 px) im Bar-Modus aufheben */
    .m-flyout-item.is-open .m-flyout-tile {
        margin-right: 0;
        background: #f6f7f9;                        /* aktiver Zustand markiert */
    }
    .m-flyout-icon { width: auto; height: 2rem; }

    /* Panel als Bottom-Sheet: volle Breite direkt über der Bar */
    .m-flyout-panel {
        position: fixed;
        left: 0;
        right: 0;
        bottom: 3rem;                               /* = Bar-Höhe */
        top: auto;
        width: auto;
        max-width: none;
        min-width: 0;
        padding: 1rem 1.333rem;
        border-radius: 0.667rem 0.667rem 0 0;
        overflow: visible;
        clip-path: none;
        transform: translateY(calc(100% + 3rem));   /* komplett unter Bar versteckt */
        transition: transform 0.28s ease-out;
        pointer-events: none;
        background: #ffffff;
        box-shadow: 0 -0.167rem 0.833rem rgba(0, 0, 0, 0.12);
    }
    /* Desktop-Is-Open-Regeln aufheben (max-width 16rem, asymm. Padding) */
    .m-flyout-item.is-open .m-flyout-panel {
        max-width: none;
        padding: 1rem 1.333rem;
        min-height: 0;
        transform: translateY(0);
        pointer-events: auto;
    }
    /* Desktop-Pegel-Override (kompaktes Padding + min-height 5rem) aufheben */
    .m-flyout-item[data-flyout="pegel"].is-open .m-flyout-panel {
        padding: 1rem 1.333rem;
        min-height: 0;
    }
    /* Body-Platz unter der Bar */
    body { padding-bottom: 3rem; }
}

/* === Modul Box-Element · Abgerundete Ecken === */
/*
 * Abgerundete Ecken für freistehende Bilder (8 px = 0.444rem @ 18-px-Root).
 * Greift bei Bild- und BildTextBox-Boxen — explizit NICHT bei c11.overflow-l/-r
 * (dort soll das Bild scharf an die Viewport-Kante laufen). Die :not()-Selektoren
 * verlassen sich darauf, dass overflow-l/-r nur in Verbindung mit c11 vorkommt
 * (CSS aus sws-layouts.css).
 */
.box-element:not(.overflow-l):not(.overflow-r) > .bild img,
.box-element:not(.overflow-l):not(.overflow-r) > .bildtextbox .box-img img {
    border-radius: 0.444rem;
}
/* `<picture>` ummantelt das `<img>` bei sws_responsive_image — der Radius
 * muss daher auch auf den Wrapper, sonst sieht man die Ecke des picture-
 * Elements. overflow:hidden sorgt dafür, dass auch ohne explizites img-
 * Border-Radius die Ecken sauber clippen. */
.box-element:not(.overflow-l):not(.overflow-r) > .bild picture,
.box-element:not(.overflow-l):not(.overflow-r) > .bildtextbox .box-img picture {
    border-radius: 0.444rem;
    overflow: hidden;
    display: block;
}

/* === Modul Box-Element · Mehrfach-Blöcke === */
/*
 * Mehrere Box-Element-Blöcke innerhalb derselben CType-Tab.
 * Wenn ein Tab mehrere Box-Element-Slices enthält, sollen sie wie ein
 * durchlaufender Block wirken (= 1× Padding zwischen den Blöcken statt 2×).
 * Marker `.box-section--continuation` wird vom Modul nur für den 2., 3., …
 * Block desselben CType gesetzt — der ERSTE Block jedes Tabs bleibt
 * unmarkiert und behält sein normales padding-top.
 * Geschwister-Selektor (`.box-section + .box-section`) ist absichtlich
 * NICHT mehr verwendet, weil er auch zwischen Tabs greifen würde, deren
 * Box-Sections eigenständig sind.
 * Greift NICHT, wenn die markierte Sektion eine Decor-Welle hat — dann
 * übernimmt das `:has(+ [data-section-top-decor])`-Padding den Abstand.
 */
@media (min-width: 64em) {
    .box-section--continuation:not([data-section-top-decor]) > .box-wrap > .box-element > .text,
    .box-section--continuation:not([data-section-top-decor]) > .box-wrap > .box-element > .bild,
    .box-section--continuation:not([data-section-top-decor]) > .box-wrap > .box-element > .infobox,
    .box-section--continuation:not([data-section-top-decor]) > .box-wrap > .box-element > .bildtextbox,
    .box-section--continuation:not([data-section-top-decor]) > .box-wrap > .box-element > .kachel,
    .box-section--continuation:not([data-section-top-decor]) > .box-wrap > .box-element > .html,
    .box-section--continuation:not([data-section-top-decor]) > .box-wrap > .box-element > .galerie,
    .box-section--continuation:not([data-section-top-decor]) > .box-wrap > .box-element > .slide {
        padding-top: 0;
    }
}

/* BildTextBox (Inhaltstyp „Bild oben, Text unten"): Lesefluss-Abstand
   zwischen Bild und Textblock. Konsistent mit dem 1rem-Pattern in
   .box-title margin-bottom und Body-Paragraph-Spacing. */
.box-element .bildtextbox .box-img + .box-text {
    margin-top: 1rem;
}
/* BildTextBox + Bild im selben c11-Grid: Default-Stretch wuerde das reine
 * .bild auf die volle BildTextBox-Hoehe (Bild + Text + Padding) ziehen
 * → das Bild zerrt unschoen. Override macht das Verhalten konsistent mit
 * c111+ (Bilder im natuerlichen Aspekt). Wird per
 * `.bild.bild-h-stretch` (Modul-Option „Bildhoehe = an Reihe anpassen")
 * pro Slot UEBERSCHRIEBEN. */
@media (min-width: 64em) {
    .box-element.c11:has(> .bildtextbox) > .bild:not(.bild-h-stretch),
    .box-element.c11:has(> .bildtextbox) > .bildtextbox:not(.bild-h-stretch) {
        align-self: start;
        min-height: 0;
    }
    .box-element.c11:has(> .bildtextbox) > .bild:not(.bild-h-stretch) img,
    .box-element.c11:has(> .bildtextbox) > .bildtextbox:not(.bild-h-stretch) .box-img img {
        height: auto;
    }
}

/* Modul-Option pro Bild-Slot „Bildhoehe":
 *   `bild-h-stretch`  = Bild nimmt immer die hoechste Reihen-Hoehe (auch in c111/c1111/c11111)
 *   `bild-h-natural`  = Bild rendert immer im natuerlichen Aspekt (auch in c11)
 * Default (keine Klasse) = Layout-Default + c11+BildTextBox-Override oben. */
@media (min-width: 64em) {
    /* row-stretch: Bild fuellt die Zelle auf die Hoehe der hoechsten Schwester-
     * Spalte (i.d.R. Text). Damit das natuerliche Bildmaß die Grid-Row nicht
     * aufblaeht, wird das <img> aus dem Block-Flow rausgenommen
     * (position: absolute + min-height: 0 am Cell). object-fit: cover crop't
     * das Bild auf die verfuegbare Cell-Form. Cell-Padding (3rem oben/unten)
     * bleibt erhalten — das absolut positionierte img sitzt mit `inset: 3rem 0`
     * im Padding-Bereich, damit das Bild oben/unten denselben Abstand wie der
     * Text in der Schwester-Spalte hat. */
    .box-element > .bild.bild-h-stretch,
    .box-element > .bildtextbox.bild-h-stretch {
        align-self: stretch;
        min-height: 0;
        overflow: hidden;
        position: relative;
    }
    .box-element > .bild.bild-h-stretch img,
    .box-element > .bildtextbox.bild-h-stretch .box-img img {
        position: absolute;
        inset: 3rem 0;
        width: 100%;
        height: calc(100% - 6rem);
        object-fit: cover;
    }
    .box-element > .bild.bild-h-natural,
    .box-element > .bildtextbox.bild-h-natural {
        align-self: start;
        min-height: 0;
    }
    .box-element > .bild.bild-h-natural img,
    .box-element > .bildtextbox.bild-h-natural .box-img img {
        height: auto;
    }
}
@media (min-width: 112.5em) {
    /* XL-Breakpoint: Default-Padding erhoeht sich auf 5rem (sws-layouts.css).
     * inset/height entsprechend nachfuehren. */
    .box-element > .bild.bild-h-stretch img,
    .box-element > .bildtextbox.bild-h-stretch .box-img img {
        inset: 5rem 0;
        height: calc(100% - 10rem);
    }
}

/* Linkbox am Ende eines Box-Slots (optional) — analog .m-news-cta, nutzt
   die Sektion-Linkbox-Farben aus sws_section_config. Generisch für alle
   Slot-Typen, die eine Linkbox unten unterstützen (Text, BildTextBox).

   Selektor mit Slot-Klasse + a-Tag ergänzt (Spezifizität 0,0,3,1), damit
   die Regel `.box-element .text a` aus sws-layouts.css (color: inherit +
   text-decoration: underline) NICHT gewinnt — sonst ist die Linkbox-Schrift
   auf der Section-Fg-Farbe statt der Section-Link-Fg-Farbe. */
.box-element .text a.m-box-link-btn,
.box-element .bildtextbox a.m-box-link-btn,
.box-element .infobox a.m-box-link-btn,
.box-element .html a.m-box-link-btn {
    display: inline-flex; align-items: center; gap: 0.5rem;
    align-self: flex-start;
    margin-top: 1rem;
    background-color: var(--section-link-bg, #5076A2);
    color: var(--section-link-fg, #ffffff);
    font-weight: 400;
    font-size: 1rem;
    padding: 0.389rem 0.889rem;
    border-radius: 0.222rem;
    text-decoration: none;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    transition: filter 0.2s;
}
.box-element .text a.m-box-link-btn:hover,
.box-element .bildtextbox a.m-box-link-btn:hover,
.box-element .infobox a.m-box-link-btn:hover,
.box-element .html a.m-box-link-btn:hover { filter: brightness(0.95); }
/* Pfeil-Icon innerhalb der Linkbox — analog .m-news-btn-icon. */
.m-box-link-icon,
.m-kachel-btn-icon {
    width: 1.111rem; height: 1.111rem;          /* 20 px @ XL */
    color: var(--color-accent);                 /* gelb-orange Pfeil */
    flex-shrink: 0;
}

/* === Modul Box-Element · Inhaltstyp Kachel === */
/*
 * Layout analog News-Card auf Startseite.
 * Bild oben (optional) + Überschrift 1 (Light) + Überschrift 2 (Bold/UPPERCASE)
 * + Fließtext + Linkbox (optional). Farbschema aus box_class über --card-*
 * Custom Properties (analog .m-news-card).
 */
.box-element .kachel { display: flex; flex-direction: column; }
.m-kachel {
    display: flex; flex-direction: column;
    overflow: hidden;
    border-radius: 0.222rem;                        /* 4 px */
    background-color: #ffffff;
    color: var(--color-primary);
    /* Default: Kachel-Höhe = Inhalt-Höhe (kein Stretch).
       Wenn mehrere Kacheln in einer Reihe sind (Grid mit ausschließlich
       Kachel-Slots), gewinnt die :has()-Regel weiter unten und stretcht
       alle Kacheln auf gleiche Höhe. */
    height: auto;
}
/* Default: Kachel-Slot nimmt nur Inhalt-Höhe (kein Grid-Stretch) — wichtig
   für gemischte Layouts (Kachel + .text), damit die Kachel nicht auf die
   Höhe des größeren Nachbar-Slots gestretcht wird. */
.box-element > .kachel { align-self: start; }
/* Ausnahme: Wenn das Grid AUSSCHLIESSLICH Kachel-Slots als direkte Kinder
   hat, werden alle Kacheln auf gleiche Höhe gestretcht (klassische
   equal-height-cards-Optik). :has()-Negation = "kein direktes Kind ist
   nicht-.kachel" → alle Kinder sind Kacheln. */
.box-element:not(:has(> :not(.kachel))) > .kachel { align-self: stretch; }
.box-element:not(:has(> :not(.kachel))) > .kachel .m-kachel { height: 100%; }
.m-kachel--themed {
    background-color: var(--card-bg, #ffffff);
    color: var(--card-fg, var(--color-primary));
}
.m-kachel-img {
    width: 100%;
    aspect-ratio: 340 / 185;                        /* analog News-Card */
    overflow: hidden;
}
.m-kachel-img img,
.m-kachel-img picture {
    width: 100%; height: 100%; object-fit: cover; display: block;
}
.m-kachel-body {
    padding: 1rem 1.111rem 1.222rem 1.111rem;       /* 18/20/22/20 px */
    display: flex; flex-direction: column;
    flex: 1;
}
.m-kachel-line1 {
    font-weight: 300;                               /* Light */
    font-size: 1.167rem;                            /* 21 px */
    line-height: 1.25;
    margin: 0 0 0.333rem 0;
    color: var(--card-muted, var(--card-fg, inherit));
}
.m-kachel-line2 {
    font-weight: 800;                               /* ExtraBold */
    font-size: 1.167rem;
    line-height: 1.2;
    text-transform: uppercase;
    margin: 0 0 0.667rem 0;
    color: var(--card-heading, var(--card-fg, inherit));
}
.m-kachel-text {
    font-weight: 400;
    font-size: 0.944rem;                            /* 17 px */
    line-height: 1.4;
    margin: 0 0 1rem 0;
    flex: 1;
    color: var(--card-fg, inherit);
}
.m-kachel-text > :first-child { margin-top: 0; }
.m-kachel-text > :last-child  { margin-bottom: 0; }
.m-kachel-btn {
    display: inline-flex; align-items: center; gap: 0.5rem;
    align-self: flex-start;
    /* Fallback-Chain: Box-Klasse → Sektion-Linkbox → Hardcode-Default.
       Wenn die Kachel keine box_class hat, übernimmt sie die Section-Farbe. */
    background-color: var(--card-link-bg, var(--section-link-bg, #5076A2));
    color: var(--card-link-fg, var(--section-link-fg, #ffffff));
    font-weight: 400;
    font-size: 1rem;
    padding: 0.389rem 0.889rem;
    border-radius: 0.222rem;
    text-decoration: none;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    transition: filter 0.2s;
}
.m-kachel-btn:hover { filter: brightness(0.95); }

/* === Modul Box-Element · Inhaltstyp Symbolliste === */
/*
 * Icon + Label, mehrspaltig.
 * Beispiel: „WAS GIBT ES HIER?" auf Fahrtenrevier-Seiten — Icons mit Beschriftung
 * in 1-3 Spalten. Farbschema optional via box_class → --card-bg/-fg/-heading.
 */
.m-symbolliste {
    list-style: none;
    margin: 0; padding: 0;
    display: grid;
    grid-template-columns: 1fr;
    gap: 0.667rem 1.111rem;                          /* 12 / 20 px */
}
.m-symbolliste.cols-2 { grid-template-columns: 1fr 1fr; }
.m-symbolliste.cols-3 { grid-template-columns: 1fr 1fr 1fr; }
@media (max-width: 47.99em) {
    .m-symbolliste.cols-3 { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 31.99em) {
    .m-symbolliste.cols-2,
    .m-symbolliste.cols-3 { grid-template-columns: 1fr; }
}
.m-symbolliste-item {
    display: flex; align-items: center; gap: 0.667rem;
    color: var(--card-fg, var(--section-fg, inherit));
    font-size: 1rem;
    line-height: 1.3;
}
.m-symbolliste--themed .m-symbolliste-item {
    background-color: var(--card-bg, transparent);
    color: var(--card-fg, inherit);
    padding: 0.5rem 0.667rem;
    border-radius: 0.222rem;
}
.m-symbolliste-icon-wrap {
    flex: 0 0 auto;
    width: 1.778rem; height: 1.778rem;               /* 32 px @ XL */
    display: inline-flex; align-items: center; justify-content: center;
    color: var(--card-heading, var(--section-link-bg, var(--color-accent)));
}
.m-symbolliste-icon-wrap > svg { width: 100%; height: 100%; display: block; }
.m-symbolliste-label { flex: 1 1 auto; }

/* === Modul Box-Element · Padding-Erweiterung Galerie + Slide === */
/*
 * Die in sws-layouts.css definierten Padding-Regeln gelten nur für
 * .text/.infobox/.bildtextbox/.bild — die neuen Slot-Klassen .galerie und
 * .slide werden hier analog ergänzt, damit Spalten-Gap und vertikales
 * Padding identisch greifen.
 */
.box-element > .galerie,
.box-element > .slide,
.box-element > .kachel {
    padding-top: 2rem;
    padding-bottom: 2rem;
    min-width: 0;                                     /* Grid-Default min-content auf 0, sonst overflowt Slider */
}
/* Galerie/Slide behalten eigene Höhe (kein Stretch). Kacheln nehmen den
   Grid-Default (stretch), damit Nachbar-Kacheln in einer Reihe gleich hoch sind. */
.box-element > .galerie,
.box-element > .slide {
    align-self: start;
}
/* Mobile (< 64em): horizontales Gutter/Content-Zone-Padding analog
   .text/.bildtextbox-Regel in sws-layouts.css. Ohne dieses Override
   würden .galerie/.slide bündig an die Viewport-Kante kleben. */
@media (max-width: 63.99em) {
    .box-element > .galerie,
    .box-element > .slide,
    .box-element > .kachel {
        padding-inline: max(var(--gutter, 1.5rem), calc((100% - var(--max-w, 1485px)) / 2));
    }
}
@media (min-width: 64em) {
    .box-element > .galerie,
    .box-element > .slide,
    .box-element > .kachel {
        padding-top: 3rem;
        padding-bottom: 3rem;
    }
    /* c11: Outer/Inner-Padding analog .text/.bildtextbox */
    .box-element.c11 > .galerie:first-child,
    .box-element.c11 > .slide:first-child,
    .box-element.c11 > .kachel:first-child {
        padding-left: max(var(--gutter, 1.5rem), calc((min(100vw, var(--max-w-ext, 1920px)) - var(--max-w, 1485px)) / 2));
        padding-right: 2.222rem;
    }
    .box-element.c11 > .galerie:last-child,
    .box-element.c11 > .slide:last-child,
    .box-element.c11 > .kachel:last-child {
        padding-right: max(var(--gutter, 1.5rem), calc((min(100vw, var(--max-w-ext, 1920px)) - var(--max-w, 1485px)) / 2));
        padding-left: 2.222rem;
    }
}
@media (min-width: 112.5em) {
    .box-element > .galerie,
    .box-element > .slide,
    .box-element > .kachel {
        padding-top: 5rem;
        padding-bottom: 5rem;
    }
}

/* === Modul Box-Element · Inhaltstyp Galerie === */
/*
 * Lead-Bild + Thumb-Grid mit Lightbox.
 * Pattern: picodent-Galerie. Magnific Popup wird automatisch eingebunden,
 * sobald „mfp-image"-Klassen im Output stehen (sws_verwaltung-Output-Filter).
 */
.box-element .galerie .m-galerie,
.box-element .slide   .m-slider { display: block; width: 100%; }
.m-galerie-header {
    display: block;
    width: 100%;
    margin-bottom: 0.667rem;
}
.m-galerie-header a,
.m-galerie-header img,
.m-galerie-header picture { display: block; width: 100%; height: auto; }
.m-galerie-header img,
.m-galerie-header picture { border-radius: 0.444rem; overflow: hidden; }
.m-galerie-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(7rem, 1fr));
    gap: 0.667rem;
}
.m-galerie-grid-item a,
.m-galerie-grid-item img,
.m-galerie-grid-item picture {
    display: block; width: 100%; height: auto;
    border-radius: 0.222rem; overflow: hidden;
}
.m-galerie-grid-item a { transition: filter 0.2s; }
.m-galerie-grid-item a:hover { filter: brightness(0.92); }

/* === Modul Box-Element · Inhaltstyp Slide === */
/*
 * Swiper-Carousel — Swiper-Bundle 12.x via CDN. Carousel-Pagination unten,
 * Pfeile seitlich, ein Slide pro Ansicht. Aspect-Ratio fix gehalten, sodass
 * die Slide-Höhe nicht vom Original-Bild bestimmt wird (sonst Layout-Shift
 * beim Init).
 */
.m-slider { width: 100%; max-width: 100%; }
.m-slider .swiper {
    /* Aspect-Ratio auf dem Container — definiert die Slider-Höhe.
       Slides erben Höhe via Swiper's height:100%-Default → object-fit:cover
       füllt das gesamte Bild, kein Letterboxing, kein Layout-Shift beim Init. */
    width: 100%; max-width: 100%;
    aspect-ratio: 4 / 3;                              /* Default: passt für c1/c11/c111 (Slot ≥ 480 px) */
    overflow: hidden;
    position: relative;
    border-radius: 0.444rem;
    background: rgba(0,0,0,0.04);                     /* sichtbarer Slot bevor Bilder laden */
}
/* Bei schmalen Spalten flachere/quadratische Verhältnisse, damit der Slider
   nicht zu klein wird (4:3 in 300-px-Spalte = nur 225 px Höhe). */
.box-element.c1111 .m-slider .swiper { aspect-ratio: 5 / 4; }    /* c1111 ≈ 360 px → 288 px hoch */
.box-element.c11111 .m-slider .swiper { aspect-ratio: 1 / 1; }   /* c11111 ≈ 300 px → 300 px (quadratisch) */
.m-slider .swiper-slide {
    /* Bewusst KEINE eigene aspect-ratio/height — Swiper-Bundle setzt height:100%
       auf .swiper-slide; das greift jetzt, weil .swiper definierte Höhe hat. */
    box-sizing: border-box;
    overflow: hidden;
}
.m-slider .swiper-slide img,
.m-slider .swiper-slide picture {
    display: block;
    width: 100% !important;
    height: 100% !important;
    object-fit: cover;                                /* Bild füllt den Slide-Bereich komplett */
}
.m-slider .swiper-slide-caption {
    /* Caption unter dem Bild (nicht als Overlay, damit Pagination unten Platz hat). */
    margin-top: 0.5rem;
    font-size: 0.944rem;
    color: var(--section-muted, var(--section-fg, inherit));
    text-align: center;
}
/* Pagination als Overlay innerhalb des Bilds (Hero-Slider-Pattern):
   absolut am unteren Rand, mittig, Punkte 24 px weiß mit Rand, aktiv = #5076a2. */
.m-slider .swiper-pagination {
    position: absolute;
    left: 0; right: 0; bottom: 1rem;
    z-index: 5;
    display: flex; justify-content: center; gap: 0.444rem;     /* 8 px Abstand zwischen Punkten */
    pointer-events: none;
}
.m-slider .swiper-pagination-bullet {
    pointer-events: auto;
    width: 1.333rem;                                   /* 24 px @ XL */
    height: 1.333rem;
    border-radius: 9999px;
    border: 1px solid #ffffff;
    background-color: #ffffff;
    opacity: 1;                                        /* Override Swiper-Default 0.4 */
    margin: 0;                                         /* Override Swiper-Default */
    transition: background-color 0.2s;
    cursor: pointer;
}
.m-slider .swiper-pagination-bullet:hover { background-color: #e5e7eb; }
.m-slider .swiper-pagination-bullet-active { background-color: #5076a2; }
.m-slider .swiper-pagination-bullet-active:hover { background-color: #5076a2; }

.m-slider .swiper-button-prev,
.m-slider .swiper-button-next { color: #ffffff; text-shadow: 0 1px 3px rgba(0,0,0,0.5); }
.m-slider .swiper-button-prev::after,
.m-slider .swiper-button-next::after { font-size: 1.5rem; }

/* === Modul 12 · Kurs-Termine === */
/*
 * Kachelgrid mit Header + Empty-State.
 * Header oben (H1/H2 + Body mit eigener Ausrichtung), darunter die Kacheln
 * mit den nächsten Terminen einer Terminart. Farben kommen aus der Section-
 * Config (--section-*); Karten-Farben aus rex_sws_css_options (box_class).
 * Modul rendert nur Inhalt — Section/Wrapper/Decor liefert die CType-Config.
 */
.m-kurs-termine { color: var(--section-fg, inherit); }

/* Header: H1 (light, gedaempft) + H2 (extrabold, prominent), je per data-align
 * gesteuert; Body separat per data-align. Spiegelt die News-View-More-Optik. */
.m-kurs-termine-header {
    margin-bottom: 2.222rem;                                  /* 40 px Abstand zum Grid */
    text-align: center;
}
.m-kurs-termine-header[data-align="left"]   { text-align: left;   }
.m-kurs-termine-header[data-align="center"] { text-align: center; }
.m-kurs-termine-header[data-align="right"]  { text-align: right;  }
.m-kurs-termine-title {
    font-size: 1.889rem;                                      /* 34 px @ XL */
    line-height: 1.15;
    margin: 0 0 1rem 0;
    color: var(--section-heading, var(--section-fg, inherit));
}
.m-kurs-termine-h1 {
    display: block;
    font-weight: 300;
    color: var(--section-muted, var(--section-fg, inherit));
}
.m-kurs-termine-h2 {
    display: block;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.02em;
}
.m-kurs-termine-body { color: var(--section-fg, inherit); }
.m-kurs-termine-body[data-align="left"]   { text-align: left;   }
.m-kurs-termine-body[data-align="center"] { text-align: center; }
.m-kurs-termine-body[data-align="right"]  { text-align: right;  }
.m-kurs-termine-body p { margin: 0 0 1rem 0; }
.m-kurs-termine-body p:last-child { margin-bottom: 0; }

/* Grid: 2 Spalten ab lg, 3 Spalten ab xl, 1 Spalte mobil. Karten gleich hoch
 * (align-items:stretch ist Grid-Default), Inhalt verteilt sich vertikal. */
.m-kurs-termine-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 1.333rem;                                            /* 24 px */
}
@media (min-width: 64em) { /* 1024 */
    .m-kurs-termine-grid { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 90em) { /* 1440 */
    .m-kurs-termine-grid { grid-template-columns: 1fr 1fr 1fr; gap: 1.778rem; }
}

/* Termin-Kachel — Box-Variablen kommen aus rex_sws_css_options (box_class)
 * und werden vom Modul-Output als Inline-Style auf das <article> gesetzt. */
.m-kurs-termine-kachel {
    background-color: var(--card-bg, rgba(255,255,255,0.08));
    color: var(--card-fg, var(--section-fg, inherit));
    padding: 1.667rem 1.778rem;                               /* 30 / 32 px */
    border-radius: 0.444rem;
    display: flex;
    flex-direction: column;
    gap: 1rem;                                                /* 18 px */
}
.m-kurs-termine-kachel-title {
    font-size: 1.222rem;                                      /* 22 px */
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    color: var(--card-heading, var(--card-fg, inherit));
    margin: 0;
    line-height: 1.2;
}

/* Meta als <dl> mit zwei Spalten: Label rechtsbündig (compact), Value links.
 * Kein Float — Grid 2-Col mit „auto 1fr" haelt das Label auf min-content. */
.m-kurs-termine-kachel-meta {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 0.444rem 0.889rem;                                   /* 8 / 16 px */
    margin: 0;
    font-size: 1rem;                                          /* 18 px @ XL */
    line-height: 1.4;
}
.m-kurs-termine-kachel-meta dt {
    font-weight: 400;
    color: var(--card-muted, var(--card-fg, inherit));
    margin: 0;
}
.m-kurs-termine-kachel-meta dd {
    font-weight: 700;
    margin: 0;
    color: var(--card-fg, inherit);
}
.m-kurs-termine-kachel-date { display: inline-block; }
.m-kurs-termine-kachel-time {
    display: inline-block;
    margin-left: 0.444rem;                                    /* 8 px */
    font-weight: 400;
    color: var(--card-muted, var(--card-fg, inherit));
}
/* Anmelde-Button — uppercase Pill, Karten-Link-Farben (link_bg/link_fg).
 * margin-top:auto schiebt den Button bei flex-column-Kacheln nach unten,
 * damit Karten unterschiedlicher Hoehe unten buendig sind. Icon links mit
 * gelber Akzentfarbe (analog .m-news-detail-back-icon). */
.m-kurs-termine-kachel-cta {
    align-self: flex-start;
    margin-top: auto;
    display: inline-flex; align-items: center;
    gap: 0.5rem;                                              /* 9 px Abstand Icon ↔ Text */
    padding: 0.444rem 1rem;                                   /* 8 / 18 px */
    background-color: var(--card-link-bg, var(--color-primary, #15365F));
    color: var(--card-link-fg, #ffffff);
    font-size: 1rem;
    font-weight: 400;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    text-decoration: none;
    border-radius: 0.222rem;
    transition: filter 0.2s;
}
.m-kurs-termine-kachel-cta:hover { filter: brightness(0.92); }
.m-kurs-termine-kachel-cta .m-kurs-termine-kachel-cta-icon {
    color: var(--color-accent, #fdc846);
    width: 1.111em;
    height: 1.111em;
    flex: 0 0 auto;
    display: inline-block;
}
.m-kurs-termine-kachel-cta .m-kurs-termine-kachel-cta-icon svg {
    width: 100%; height: 100%; display: block;
}

/* Empty-State (kein aktiver, zukuenftiger Termin) — gleiche Optik wie Body. */
.m-kurs-termine-empty {
    color: var(--section-fg, inherit);
    text-align: center;
    padding: 1.5rem 0;
}
.m-kurs-termine-empty p { margin: 0 0 1rem 0; }
.m-kurs-termine-empty p:last-child { margin-bottom: 0; }

/* === Modul 13 · Anmeldung-Form (Termin-Anmeldung) === */
/*
 * Header oben (H1/H2 + Intro-Body), darunter 2-spaltiges Form-Grid mit
 * Pflichtfeld-Markierung, Validierungs-Errors, Submit-Button mit Pfeil-Icon.
 * Farben kommen aus der Section-Config (--section-fg/-heading/-muted).
 */
.m-anmeldung-section { color: var(--section-fg, inherit); }
.m-anmeldung-header { margin-bottom: 2.222rem; text-align: center; }
.m-anmeldung-title  { font-size: 1.889rem; line-height: 1.15; margin: 0 0 1rem 0; color: var(--section-heading, var(--section-fg, inherit)); }
.m-anmeldung-h1     { display: block; font-weight: 300; color: var(--section-muted, var(--section-fg, inherit)); }
.m-anmeldung-h2     { display: block; font-weight: 800; text-transform: uppercase; letter-spacing: 0.02em; }
.m-anmeldung-intro  { color: var(--section-fg, inherit); }
.m-anmeldung-intro p { margin: 0 0 1rem 0; }
.m-anmeldung-intro p:last-child { margin-bottom: 0; }

.m-anmeldung-form { max-width: 50rem; margin: 0 auto; }
.m-anmeldung-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1rem 1.333rem;
}
@media (max-width: 47.99em) { .m-anmeldung-grid { grid-template-columns: 1fr; } }

.m-anmeldung-field { display: flex; flex-direction: column; gap: 0.333rem; }
.m-anmeldung-field--full { grid-column: 1 / -1; }
.m-anmeldung-field--plz  { grid-column: span 1; }
.m-anmeldung-field--ort  { grid-column: span 1; }
@media (min-width: 48em) {
    .m-anmeldung-grid > .m-anmeldung-field--plz { grid-column: 1 / span 1; max-width: 12rem; }
    .m-anmeldung-grid > .m-anmeldung-field--ort { grid-column: 2 / span 1; }
}

.m-anmeldung-field label {
    font-size: 0.889rem;
    font-weight: 400;
    color: var(--section-fg, inherit);
}
.m-anmeldung-field input[type="text"],
.m-anmeldung-field input[type="email"],
.m-anmeldung-field input[type="tel"],
.m-anmeldung-field input[type="date"],
.m-anmeldung-field select,
.m-anmeldung-field textarea {
    width: 100%;
    padding: 0.5rem 0.778rem;
    font-size: 1rem;
    line-height: 1.4;
    color: #15365F;
    background: #ffffff;
    border: 1px solid rgba(0,0,0,0.15);
    border-radius: 0.222rem;
    box-sizing: border-box;
    transition: border-color 0.15s, box-shadow 0.15s;
}
.m-anmeldung-field input:focus,
.m-anmeldung-field select:focus,
.m-anmeldung-field textarea:focus {
    outline: none;
    border-color: var(--color-accent, #fdc846);
    box-shadow: 0 0 0 3px rgba(253,200,70,0.25);
}
.m-anmeldung-field textarea { resize: vertical; min-height: 5rem; }

.m-anmeldung-field--checkbox label {
    display: flex; align-items: flex-start; gap: 0.5rem;
    font-size: 0.889rem; font-weight: 400;
    cursor: pointer;
}
.m-anmeldung-field--checkbox input[type="checkbox"] {
    margin-top: 0.222rem;
    flex: 0 0 auto;
}

.m-anmeldung-field.has-error input,
.m-anmeldung-field.has-error select,
.m-anmeldung-field.has-error textarea {
    border-color: #dc2626;
}
.m-anmeldung-field-error {
    color: #dc2626;
    font-size: 0.833rem;
    margin: 0;
}
.m-anmeldung-error {
    background: rgba(220,38,38,0.08);
    border: 1px solid #dc2626;
    color: #dc2626;
    padding: 0.778rem 1rem;
    border-radius: 0.333rem;
    margin-bottom: 1.333rem;
}
.m-anmeldung-error ul { margin: 0.444rem 0 0 1.333rem; padding: 0; }

.m-anmeldung-submit { margin-top: 1.667rem; text-align: center; }
.m-anmeldung-cta {
    display: inline-flex; align-items: center; gap: 0.5rem;
    padding: 0.667rem 1.667rem;
    background-color: var(--section-link-bg, var(--color-primary, #15365F));
    color: var(--section-link-fg, #ffffff);
    font-size: 1rem; font-weight: 400;
    text-transform: uppercase; letter-spacing: 0.02em;
    border: 0; border-radius: 0.222rem;
    cursor: pointer;
    transition: filter 0.2s;
}
.m-anmeldung-cta:hover { filter: brightness(0.92); }
.m-anmeldung-cta-icon  { color: var(--color-accent, #fdc846); width: 1.111em; height: 1.111em; flex: 0 0 auto; }
.m-anmeldung-cta-icon svg { width: 100%; height: 100%; display: block; }

.m-anmeldung-thanks {
    max-width: 50rem; margin: 0 auto;
    padding: 2rem;
    background: rgba(34,197,94,0.08);
    border: 1px solid rgba(34,197,94,0.4);
    border-radius: 0.444rem;
    color: var(--section-fg, inherit);
}
.m-anmeldung-thanks p { margin: 0 0 1rem 0; }
.m-anmeldung-thanks p:last-child { margin-bottom: 0; }

/* === Modul 16 · Kontakt-Form === */
/*
 * Analog Anmeldung-Form, ohne Termin-Bezug.
 * Pattern und Styles gespiegelt aus .m-anmeldung-* — gleiche Form-UI,
 * eigene Klasse zur Unterscheidung in Layout-Overrides + Backend-Routing.
 */
.m-kontakt-section { color: var(--section-fg, inherit); }
.m-kontakt-header { margin-bottom: 2.222rem; text-align: center; }
.m-kontakt-title  { font-size: 1.889rem; line-height: 1.15; margin: 0 0 1rem 0; color: var(--section-heading, var(--section-fg, inherit)); }
.m-kontakt-h1     { display: block; font-weight: 300; color: var(--section-muted, var(--section-fg, inherit)); }
.m-kontakt-h2     { display: block; font-weight: 800; text-transform: uppercase; letter-spacing: 0.02em; }
.m-kontakt-intro  { color: var(--section-fg, inherit); }
.m-kontakt-intro p { margin: 0 0 1rem 0; }
.m-kontakt-intro p:last-child { margin-bottom: 0; }

.m-kontakt-form { max-width: 50rem; margin: 0 auto; }
/* Form-Grid spezifisch via .m-kontakt-form-Parent — vermeidet Konflikt mit
 * der Schnellkontakt-Leiste auf der Startseite, die ebenfalls .m-kontakt-grid
 * verwendet (responsive 1/2/3/6 Spalten). */
.m-kontakt-form .m-kontakt-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1rem 1.333rem;
}
@media (max-width: 47.99em) { .m-kontakt-form .m-kontakt-grid { grid-template-columns: 1fr; } }

.m-kontakt-field { display: flex; flex-direction: column; gap: 0.333rem; }
.m-kontakt-field--full { grid-column: 1 / -1; }
.m-kontakt-field--plz  { grid-column: span 1; }
.m-kontakt-field--ort  { grid-column: span 1; }
@media (min-width: 48em) {
    .m-kontakt-form .m-kontakt-grid > .m-kontakt-field--plz { grid-column: 1 / span 1; max-width: 12rem; }
    .m-kontakt-form .m-kontakt-grid > .m-kontakt-field--ort { grid-column: 2 / span 1; }
}

.m-kontakt-field label {
    font-size: 0.889rem;
    font-weight: 400;
    color: var(--section-fg, inherit);
}
.m-kontakt-field input[type="text"],
.m-kontakt-field input[type="email"],
.m-kontakt-field input[type="tel"],
.m-kontakt-field select,
.m-kontakt-field textarea {
    width: 100%;
    padding: 0.5rem 0.778rem;
    font-size: 1rem;
    line-height: 1.4;
    color: #15365F;
    background: #ffffff;
    border: 1px solid rgba(0,0,0,0.15);
    border-radius: 0.222rem;
    box-sizing: border-box;
    transition: border-color 0.15s, box-shadow 0.15s;
}
.m-kontakt-field input:focus,
.m-kontakt-field select:focus,
.m-kontakt-field textarea:focus {
    outline: none;
    border-color: var(--color-accent, #fdc846);
    box-shadow: 0 0 0 3px rgba(253,200,70,0.25);
}
.m-kontakt-field textarea { resize: vertical; min-height: 6rem; }

.m-kontakt-field--checkbox label {
    display: flex; align-items: flex-start; gap: 0.5rem;
    font-size: 0.889rem; font-weight: 400;
    cursor: pointer;
}
.m-kontakt-field--checkbox input[type="checkbox"] {
    margin-top: 0.222rem;
    flex: 0 0 auto;
}
.m-kontakt-field--checkbox a {
    color: var(--section-link-bg, var(--color-accent, #fdc846));
}

.m-kontakt-field.has-error input,
.m-kontakt-field.has-error select,
.m-kontakt-field.has-error textarea {
    border-color: #dc2626;
}
.m-kontakt-field-error {
    color: #dc2626;
    font-size: 0.833rem;
    margin: 0;
}
.m-kontakt-error {
    background: rgba(220,38,38,0.08);
    border: 1px solid #dc2626;
    color: #dc2626;
    padding: 0.778rem 1rem;
    border-radius: 0.333rem;
    margin-bottom: 1.333rem;
}
.m-kontakt-error ul { margin: 0.444rem 0 0 1.333rem; padding: 0; }

.m-kontakt-submit { margin-top: 1.667rem; text-align: center; }
.m-kontakt-cta {
    display: inline-flex; align-items: center; gap: 0.5rem;
    padding: 0.667rem 1.667rem;
    background-color: var(--section-link-bg, var(--color-primary, #15365F));
    color: var(--section-link-fg, #ffffff);
    font-size: 1rem; font-weight: 400;
    text-transform: uppercase; letter-spacing: 0.02em;
    border: 0; border-radius: 0.222rem;
    cursor: pointer;
    transition: filter 0.2s;
}
.m-kontakt-cta:hover { filter: brightness(0.92); }
.m-kontakt-cta-icon  { color: var(--color-accent, #fdc846); width: 1.111em; height: 1.111em; flex: 0 0 auto; }
.m-kontakt-cta-icon svg { width: 100%; height: 100%; display: block; }

.m-kontakt-thanks {
    max-width: 50rem; margin: 0 auto;
    padding: 2rem;
    background: rgba(34,197,94,0.08);
    border: 1px solid rgba(34,197,94,0.4);
    border-radius: 0.444rem;
    color: var(--section-fg, inherit);
}
.m-kontakt-thanks p { margin: 0 0 1rem 0; }
.m-kontakt-thanks p:last-child { margin-bottom: 0; }

/*
 * Module 17/18 — Download-Liste + Download-Kacheln (gemeinsamer Wrapper).
 * Liste:    Picodent-Pattern (Kategorie-Anker oben, kompakte Linkliste,
 *           Titel + Größe + Seitenanzahl pro Eintrag)
 * Kacheln:  Grid mit Vorschaubild, Titel, Seiten, Download-Button.
 */

/* Gemeinsame Section-Wrap (wirkt wie Anmeldung-/Kontakt-Wrapper). */
.m-dl-section { color: var(--section-fg, inherit); }
.m-dl-header { margin-bottom: 2.222rem; text-align: left; }
.m-dl-header--align-left   { text-align: left; }
.m-dl-header--align-center { text-align: center; }
.m-dl-header--align-right  { text-align: right; }
.m-dl-header--align-center .m-dl-intro { margin-left: auto; margin-right: auto; }
.m-dl-header--align-right  .m-dl-intro { margin-left: auto; margin-right: 0; }
.m-dl-title  { font-size: 1.889rem; line-height: 1.15; margin: 0 0 1rem 0; color: var(--section-heading, var(--section-fg, inherit)); }
.m-dl-h1     { display: block; font-weight: 300; color: var(--section-muted, var(--section-fg, inherit)); }
.m-dl-h2     { display: block; font-weight: 800; }
.m-dl-intro  { color: var(--section-fg, inherit); max-width: 50rem; }
.m-dl-intro p { margin: 0 0 1rem 0; }
.m-dl-intro p:last-child { margin-bottom: 0; }
.m-dl-intro--cols-2,
.m-dl-intro--cols-3 { max-width: none; }
@media (min-width: 64em) {
    .m-dl-intro--cols-2 { columns: 2; column-gap: 1.778rem; }
    .m-dl-intro--cols-3 { columns: 3; column-gap: 1.444rem; }
    .m-dl-intro--cols-2 p,
    .m-dl-intro--cols-3 p { break-inside: avoid; }
}

/* Sprung-Navigation (Anker zu jeder Kategorie) — Pills oben. */
.m-dl-toc {
    display: flex; flex-wrap: wrap; gap: 0.444rem;
    margin-bottom: 2.222rem; padding-bottom: 1.111rem;
    border-bottom: 1px solid rgba(0,0,0,0.08);
}
.m-dl-toc-link {
    display: inline-block;
    padding: 0.333rem 0.889rem;
    background: var(--section-link-bg, var(--color-primary, #1d3969));
    color: var(--section-link-fg, #ffffff);
    font-size: 0.833rem; font-weight: 500;
    border-radius: 9999px;
    text-decoration: none;
    transition: filter 0.15s;
}
.m-dl-toc-link:hover { filter: brightness(1.1); text-decoration: none; }

/* Gruppen-Header pro Kategorie. */
.m-dl-group { margin-bottom: 2.667rem; scroll-margin-top: 5rem; }
.m-dl-group:last-child { margin-bottom: 0; }
.m-dl-group-title {
    font-size: 1.389rem; font-weight: 800;
    margin: 0 0 1rem 0;
    color: var(--section-heading, var(--section-fg, inherit));
    padding-bottom: 0.444rem;
    border-bottom: 2px solid var(--color-accent, #fdc846);
}

/* === Modul 17 · Download-Liste === */
.m-dl-list { list-style: none; padding: 0; margin: 0; }
.m-dl-item {
    display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.667rem;
    padding: 0.444rem 0;
    border-bottom: 1px solid rgba(0,0,0,0.06);
}
.m-dl-item:last-child { border-bottom: 0; }
.m-dl-link {
    color: var(--section-link-bg, var(--color-primary, #1d3969));
    text-decoration: none;
    font-size: 1rem; font-weight: 500;
    flex: 1 1 auto;
}
.m-dl-link:hover { /* kein Underline (User-Wunsch 2026-05-07) */ }
.m-dl-meta {
    color: var(--section-muted, #6b7280);
    font-size: 0.833rem; font-weight: 300;
    display: inline-flex; gap: 0.667rem;
    flex: 0 0 auto;
}
.m-dl-meta .m-dl-size + .m-dl-pages::before {
    content: '·'; margin-right: 0.667rem; color: rgba(0,0,0,0.25);
}
.m-dl-desc {
    flex: 1 1 100%;
    margin-top: 0.333rem;
    color: var(--section-muted, #6b7280);
    font-size: 0.875rem; line-height: 1.5; font-weight: 300;
}
.m-dl-desc > :first-child { margin-top: 0; }
.m-dl-desc > :last-child  { margin-bottom: 0; }
.m-dl-desc p { margin: 0 0 0.444rem; }
.m-dl-desc p:last-child { margin-bottom: 0; }

/* === Modul 18 · Download-Kacheln === */
.m-dl-grid {
    display: grid; gap: 1.333rem;
    grid-template-columns: 1fr;
}
@media (min-width: 40em) { .m-dl-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 64em) {
    .m-dl-grid--cols-2 { grid-template-columns: repeat(2, 1fr); }
    .m-dl-grid--cols-3 { grid-template-columns: repeat(3, 1fr); }
    .m-dl-grid--cols-4 { grid-template-columns: repeat(4, 1fr); }
    .m-dl-grid--cols-5 { grid-template-columns: repeat(5, 1fr); }
}

.m-dl-tile {
    display: flex; flex-direction: column;
    background: var(--section-box-bg, #ffffff);
    color: var(--section-box-fg, var(--color-primary, #1d3969));
    border: 1px solid rgba(0,0,0,0.08);
    border-radius: 0.444rem;
    overflow: hidden;
    transition: box-shadow 0.15s, transform 0.15s;
}
/* Themed-Kachel: Inline-CSS-Vars (--card-bg etc.) überschreiben die
 * Section-Defaults. Pattern identisch zur Box-Element-Kachel. */
.m-dl-tile--themed {
    background: var(--card-bg, var(--section-box-bg, #ffffff));
    color: var(--card-fg, var(--section-box-fg, inherit));
}
.m-dl-tile--themed .m-dl-tile-title,
.m-dl-tile--themed .m-dl-tile-title a {
    color: var(--card-heading, var(--card-fg, var(--section-box-fg, inherit)));
}
.m-dl-tile--themed .m-dl-tile-meta {
    color: var(--card-fg, var(--section-box-fg, inherit));
    opacity: 0.7;
}
.m-dl-tile--themed .m-dl-tile-btn {
    background: var(--card-link-bg, var(--section-link-bg, var(--color-primary, #1d3969)));
    color: var(--card-link-fg, var(--section-link-fg, #ffffff));
}
.m-dl-tile:hover {
    box-shadow: 0 4px 16px rgba(0,0,0,0.08);
    transform: translateY(-2px);
}
.m-dl-tile-img {
    display: block; aspect-ratio: 4 / 3; background: #f3f4f6; overflow: hidden;
}
.m-dl-tile-img img { width: 100%; height: 100%; object-fit: cover; display: block; }
.m-dl-tile-img--placeholder {
    display: flex; align-items: center; justify-content: center;
    background: linear-gradient(135deg, #f3f4f6, #e5e7eb);
}
.m-dl-tile-icon { width: 2.667rem; height: 2.667rem; color: rgba(0,0,0,0.3); }
.m-dl-tile-icon svg { width: 100%; height: 100%; display: block; }
.m-dl-tile-body { padding: 0.889rem; display: flex; flex-direction: column; flex: 1 1 auto; gap: 0.444rem; }
.m-dl-tile-title {
    font-size: 1rem; font-weight: 600; line-height: 1.3;
    margin: 0;
    color: var(--section-box-fg, var(--color-primary, #1d3969));
}
.m-dl-tile-title a {
    color: inherit; text-decoration: none;
}
.m-dl-tile-title a:hover { /* kein Underline (User-Wunsch 2026-05-07) */ }
.m-dl-tile-meta {
    margin: 0; font-size: 0.833rem; color: rgba(0,0,0,0.5); font-weight: 300;
}
.m-dl-tile-desc {
    margin: 0.222rem 0 0;
    font-size: 0.875rem; line-height: 1.5; font-weight: 300;
    color: rgba(0,0,0,0.65);
}
.m-dl-tile-desc > :first-child { margin-top: 0; }
.m-dl-tile-desc > :last-child  { margin-bottom: 0; }
.m-dl-tile-desc p { margin: 0 0 0.444rem; }
.m-dl-tile-desc p:last-child { margin-bottom: 0; }
.m-dl-tile--themed .m-dl-tile-desc {
    color: var(--card-fg, var(--section-box-fg, inherit));
    opacity: 0.8;
}
.m-dl-tile-btn {
    margin-top: auto;
    display: inline-flex; align-items: center; gap: 0.444rem;
    padding: 0.444rem 0.889rem;
    background: var(--section-link-bg, var(--color-primary, #1d3969));
    color: var(--section-link-fg, #ffffff);
    font-size: 0.889rem; font-weight: 500;
    text-transform: uppercase; letter-spacing: 0.02em;
    border-radius: 0.222rem;
    text-decoration: none;
    transition: filter 0.15s;
    align-self: flex-start;
}
.m-dl-tile-btn:hover { filter: brightness(0.92); text-decoration: none; }
.m-dl-tile-btn-icon { width: 1em; height: 1em; flex: 0 0 auto; color: var(--color-accent, #fdc846); }
.m-dl-tile-btn-icon svg { width: 100%; height: 100%; display: block; }

/* === Modul 19 · Ansprechpartner-Grid === */
/*
 * Personen-Grid (Picodent-Stil), Modul-Klasse `bcl_ansprechpartner`.
 * Foto + Name + Position + Kontaktdaten als Karte. Hover-Foto optional.
 */
.m-ap-section { color: var(--section-fg, inherit); }

/* Inner-Wrap-Padding für full-bleed-Module (analog .m-bg-col).
 * Da die Module im full_bleed_module_keys-Register kein Section-Padding
 * rendern (siehe py-0-Hardcode in mod_box_grid + den fünf Form-/Listen-
 * Modulen), kommt das vertikale Spacing aus dem Inner-Wrap. Symmetrisch,
 * pro Breakpoint identisch zu .m-bg-col. */
.m-ap-wrap,
.m-dl-wrap,
.m-anmeldung-wrap,
.m-kontakt-wrap {
    width: 100%;
    padding-top: 2rem;
    padding-bottom: 2rem;
}
@media (min-width: 64em) {
    .m-ap-wrap,
    .m-dl-wrap,
    .m-anmeldung-wrap,
    .m-kontakt-wrap { padding-top: 3rem; padding-bottom: 3rem; }
}
@media (min-width: 112.5em) {
    .m-ap-wrap,
    .m-dl-wrap,
    .m-anmeldung-wrap,
    .m-kontakt-wrap { padding-top: 3.5rem; padding-bottom: 3.5rem; }
}

.m-ap-header { margin-bottom: 2.222rem; text-align: left; }
.m-ap-header--align-left   { text-align: left; }
.m-ap-header--align-center { text-align: center; }
.m-ap-header--align-right  { text-align: right; }
.m-ap-header--align-center .m-ap-intro { margin-left: auto; margin-right: auto; }
.m-ap-header--align-right  .m-ap-intro { margin-left: auto; margin-right: 0; }
.m-ap-title  { font-size: 1.889rem; line-height: 1.15; margin: 0 0 1rem 0; color: var(--section-heading, var(--section-fg, inherit)); }
.m-ap-h1     { display: block; font-weight: 300; color: var(--section-muted, var(--section-fg, inherit)); }
.m-ap-h2     { display: block; font-weight: 800; }
.m-ap-intro  { color: var(--section-fg, inherit); max-width: 50rem; }
.m-ap-intro p { margin: 0 0 1rem 0; }
.m-ap-intro p:last-child { margin-bottom: 0; }
.m-ap-intro--cols-2,
.m-ap-intro--cols-3 { max-width: none; }
@media (min-width: 64em) {
    .m-ap-intro--cols-2 { columns: 2; column-gap: 1.778rem; }
    .m-ap-intro--cols-3 { columns: 3; column-gap: 1.444rem; }
    .m-ap-intro--cols-2 p,
    .m-ap-intro--cols-3 p { break-inside: avoid; }
}

/* Anker-TOC analog Downloads */
.m-ap-toc {
    display: flex; flex-wrap: wrap; gap: 0.667rem;
    margin: 0 0 2rem; padding: 0;
}
.m-ap-toc-link {
    display: inline-block;
    padding: 0.444rem 0.889rem;
    background: var(--section-link-bg, var(--color-primary, #1d3969));
    color: var(--section-link-fg, #ffffff);
    border-radius: 999px;
    font-size: 0.889rem; font-weight: 500;
    text-decoration: none;
    transition: filter 0.15s;
}
.m-ap-toc-link:hover { filter: brightness(1.15); text-decoration: none; }

.m-ap-group { margin-bottom: 3rem; scroll-margin-top: 5rem; }
.m-ap-group:last-child { margin-bottom: 0; }
.m-ap-group-title {
    font-size: 1.444rem; font-weight: 800;
    margin: 0 0 1.333rem;
    padding-bottom: 0.444rem;
    border-bottom: 2px solid var(--color-accent, #fdc846);
    color: var(--section-heading, var(--section-fg, inherit));
}

/* Grid */
.m-ap-grid {
    display: grid; gap: 1.333rem;
    grid-template-columns: 1fr;
}
@media (min-width: 40em) and (max-width: 63.99em) {
    .m-ap-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 64em) {
    .m-ap-grid--cols-2 { grid-template-columns: repeat(2, 1fr); }
    .m-ap-grid--cols-3 { grid-template-columns: repeat(3, 1fr); }
    .m-ap-grid--cols-4 { grid-template-columns: repeat(4, 1fr); }
    .m-ap-grid--cols-5 { grid-template-columns: repeat(5, 1fr); }
}

/* Karte */
.m-ap-card {
    display: flex; flex-direction: column;
    overflow: hidden;
    background: #ffffff;
    border-radius: 0.444rem;
    box-shadow: 0 1px 3px rgba(0,0,0,0.06);
    transition: box-shadow 0.2s, transform 0.2s;
}
.m-ap-card:hover {
    box-shadow: 0 4px 14px rgba(0,0,0,0.10);
    transform: translateY(-2px);
}
.m-ap-card--themed {
    background: var(--card-bg, var(--section-box-bg, #ffffff));
    color: var(--card-fg, var(--section-box-fg, inherit));
}

/* Foto */
.m-ap-photo {
    position: relative;
    aspect-ratio: 4 / 5;
    overflow: hidden;
    background: rgba(0,0,0,0.04);
}
.m-ap-photo-primary,
.m-ap-photo-hover {
    position: absolute; inset: 0;
}
.m-ap-photo-primary img,
.m-ap-photo-hover img {
    width: 100%; height: 100%; object-fit: cover; display: block;
}
.m-ap-photo-hover {
    opacity: 0;
    transition: opacity 0.4s ease;
}
.m-ap-card:hover .m-ap-photo-hover { opacity: 1; }

.m-ap-photo--placeholder {
    display: flex; align-items: center; justify-content: center;
    color: rgba(0,0,0,0.25);
}
.m-ap-photo-icon { width: 3rem; height: 3rem; }
.m-ap-photo-icon svg { width: 100%; height: 100%; display: block; }

/* Body */
.m-ap-body {
    display: flex; flex-direction: column; gap: 0.444rem;
    padding: 1rem 1.111rem 1.222rem;
    flex: 1 1 auto;
}
.m-ap-name {
    margin: 0;
    font-size: 1.111rem; font-weight: 700;
    line-height: 1.2;
    color: var(--card-heading, var(--section-heading, var(--section-fg, inherit)));
}
.m-ap-card--themed .m-ap-name {
    color: var(--card-heading, var(--card-fg, var(--section-box-fg, inherit)));
}
.m-ap-position {
    margin: 0;
    font-size: 0.889rem; font-weight: 500;
    color: rgba(0,0,0,0.55);
    text-transform: uppercase; letter-spacing: 0.02em;
}
.m-ap-card--themed .m-ap-position {
    color: var(--card-fg, var(--section-box-fg, inherit));
    opacity: 0.7;
}
.m-ap-vita {
    font-size: 0.889rem; line-height: 1.5; font-weight: 300;
    color: rgba(0,0,0,0.7);
}
.m-ap-card--themed .m-ap-vita {
    color: var(--card-fg, var(--section-box-fg, inherit));
    opacity: 0.85;
}
.m-ap-vita > :first-child { margin-top: 0; }
.m-ap-vita > :last-child  { margin-bottom: 0; }
.m-ap-vita p { margin: 0 0 0.444rem; }
.m-ap-vita p:last-child { margin-bottom: 0; }

/* Kontakt-Liste */
.m-ap-contact {
    list-style: none;
    margin: 0.222rem 0 0;
    padding: 0;
    display: flex; flex-direction: column; gap: 0.333rem;
    font-size: 0.889rem;
}
.m-ap-contact-row {
    display: flex; align-items: center; gap: 0.5rem;
    color: var(--card-fg, var(--section-fg, inherit));
}
.m-ap-contact-row a {
    color: inherit; text-decoration: none;
    transition: color 0.15s;
}
.m-ap-contact-row a:hover {
    color: var(--card-link-bg, var(--section-link-bg, var(--color-primary, #1d3969)));
}
.m-ap-contact-icon {
    width: 1em; height: 1em; flex: 0 0 auto;
    color: var(--card-link-bg, var(--section-link-bg, var(--color-primary, #1d3969)));
}
.m-ap-contact-icon svg { width: 100%; height: 100%; display: block; }
.m-ap-card--themed .m-ap-contact-icon {
    color: var(--card-link-bg, var(--card-fg, var(--section-box-fg, inherit)));
}

/* === Modul Box-Blocks · Freie Block-Anordnung === */
/*
 * Modul-Klasse `bcl_box_blocks`.
 * Block-Typen: headline, text (1/2/3-spaltig), infobox (Icon + Text), separator.
 * Layout: Bild links/rechts/oben oder kein Bild — Inhalt in der Gegenseite.
 */
.m-bb-section { color: var(--section-fg, inherit); padding: 3.333rem 0; }
.m-bb-wrap { width: 100%; }
.m-bb-layout { display: grid; gap: 2.222rem; align-items: start; }
.m-bb-layout--none { grid-template-columns: 1fr; }
.m-bb-layout--left,
.m-bb-layout--right { grid-template-columns: 1fr 1fr; }
.m-bb-layout--top { grid-template-columns: 1fr; }

/* Bild */
.m-bb-image { width: 100%; }
.m-bb-image img { width: 100%; height: auto; display: block; border-radius: 0.444rem; }

/* Headline */
.m-bb-headline {
    display: block;
    margin: 0 0 1.111rem 0;
    line-height: 1.15;
    color: var(--section-heading, var(--section-fg, inherit));
}
.m-bb-headline .m-bb-h1 {
    display: block;
    font-size: 1.667rem;
    font-weight: 300;
    color: var(--section-muted, var(--section-fg, inherit));
}
.m-bb-headline .m-bb-h2 {
    display: block;
    font-size: 2rem;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.02em;
}

/* Text */
.m-bb-text { margin: 0 0 1.444rem 0; color: var(--section-fg, inherit); }
.m-bb-text:last-child { margin-bottom: 0; }
.m-bb-text p { margin: 0 0 0.778rem 0; }
.m-bb-text p:last-child { margin-bottom: 0; }
.m-bb-text ul, .m-bb-text ol { margin: 0 0 0.778rem 1.222rem; padding: 0; }
.m-bb-text--cols-2 { columns: 2; column-gap: 1.778rem; }
.m-bb-text--cols-3 { columns: 3; column-gap: 1.444rem; }
.m-bb-text--cols-2 p, .m-bb-text--cols-3 p { break-inside: avoid; }
.m-bb-text--left    { text-align: left; }
.m-bb-text--center  { text-align: center; }
.m-bb-text--justify { text-align: justify; hyphens: auto; }

/* Infobox */
.m-bb-infobox { margin: 0 0 1.444rem 0; padding: 1rem 1.222rem; border-radius: 0.444rem; background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12); }
.m-tone-light .m-bb-infobox { background: #f1f5f9; border-color: #e2e8f0; }
.m-bb-infobox-title { font-weight: 700; margin-bottom: 0.667rem; font-size: 1.111rem; }
.m-bb-infobox-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.556rem; }
.m-bb-infobox-list li { display: flex; align-items: flex-start; gap: 0.667rem; }
.m-bb-infobox .m-bb-icon { flex: 0 0 24px; display: inline-flex; align-items: center; justify-content: center; color: var(--section-heading, currentColor); }
.m-bb-infobox .m-bb-icon svg { width: 20px; height: 20px; }
.m-bb-infobox .m-bb-text-wrap { display: flex; flex-direction: column; }
.m-bb-infobox .m-bb-text-wrap strong { font-weight: 700; }
.m-bb-infobox .m-bb-text-wrap span { color: var(--section-fg, inherit); }

/* Separator */
.m-bb-sep { border: 0; border-top: 1px solid rgba(0,0,0,0.1); margin: 1.444rem 0; }
.m-tone-dark .m-bb-sep { border-top-color: rgba(255,255,255,0.18); }

/* Responsive */
@media (max-width: 47.99em) {
    .m-bb-layout--left,
    .m-bb-layout--right { grid-template-columns: 1fr; }
    .m-bb-layout--right .m-bb-image { order: -1; }
    .m-bb-text--cols-2,
    .m-bb-text--cols-3 { columns: 1; }
    .m-bb-headline .m-bb-h1 { font-size: 1.333rem; }
    .m-bb-headline .m-bb-h2 { font-size: 1.556rem; }
}

/* === Modul Box-Grid · N-Spalten-Layout === */
/*
 * Modul-Klasse `bcl_box_grid`. Stapelbare Inhaltsboxen.
 * Layout: 1/2/3/4 Spalten · Block-Typen: headline, text, image, iconbox.
 */
/* Kein eigenes Section-Padding — der Host-CType-Wrapper liefert kein Padding
 * (full-bleed-Modul, py-0). Padding ist analog .box-element ueber Spalten +
 * .m-bg-grid Auto-Gutter geregelt. Section-Trennung visuell durch das
 * .m-bg-col-Spalten-Padding (2rem/3rem je Breakpoint) — identisch zur
 * box-section, sodass m-bg sich nicht in Padding-Höhe unterscheidet. */
.m-bg-section { color: var(--section-fg, inherit); }
.m-bg-grid { display: grid; gap: 0; }
.m-bg-grid--c1     { grid-template-columns: 1fr; }
.m-bg-grid--c11,
.m-bg-grid--c11o-l,
.m-bg-grid--c11o-r { grid-template-columns: 1fr 1fr; }
.m-bg-grid--c12    { grid-template-columns: 1fr 2fr; }
.m-bg-grid--c21    { grid-template-columns: 2fr 1fr; }
.m-bg-grid--c13    { grid-template-columns: 1fr 3fr; }
.m-bg-grid--c31    { grid-template-columns: 3fr 1fr; }
.m-bg-grid--c111   { grid-template-columns: 1fr 1fr 1fr; }
.m-bg-grid--c1111  { grid-template-columns: repeat(4, 1fr); }
.m-bg-grid--c11111 { grid-template-columns: repeat(5, 1fr); }

/* Non-c11-Layouts: Grid eingerueckt auf Content-Zone (1485 px) ueber padding
 * auf .m-bg-grid + Default-Gap zwischen Spalten — analog .box-element-Pattern.
 *
 * Padding-Formel nutzt `100%` (= Grid-/Section-Breite) statt `min(100vw, 1920)`,
 * damit der Inhalt auch bei Viewports > 1920 px korrekt auf 1485 px zentriert
 * bleibt. Frueher mit `min(100vw, 1920)` wurde das Padding bei 1920 px gecappt,
 * sodass der Inhalt bei 2560 px Viewport auf 2125 px ueberlief. */
@media (min-width: 64em) {
    .m-bg-grid--c1,
    .m-bg-grid--c11,
    .m-bg-grid--c12, .m-bg-grid--c21,
    .m-bg-grid--c13, .m-bg-grid--c31,
    .m-bg-grid--c111, .m-bg-grid--c1111, .m-bg-grid--c11111 {
        /* `c11o-l` und `c11o-r` sind absichtlich ausgenommen — das sind
         * Bleed-Layouts mit Bild-Overflow, die volle Section-Breite nutzen. */
        padding-left:  max(var(--gutter, 1.5rem), calc((100% - var(--max-w, 1485px)) / 2));
        padding-right: max(var(--gutter, 1.5rem), calc((100% - var(--max-w, 1485px)) / 2));
        gap: var(--gap, 1.5rem);
    }
}

/* c11-Overflow (Bleed-Varianten): Outer-Cols mit auto-gutter, innen 2.222 rem
 * zur Mitte. Greift NUR fuer c11o-l/c11o-r — der normale c11 bekommt sein
 * Padding ueber die generische Grid-Padding-Regel weiter oben (Spalten
 * fuellen die 1485 px voll aus, getrennt durch grid-gap). */
@media (min-width: 64em) {
    .m-bg-grid--c11o-l > .m-bg-col:first-child,
    .m-bg-grid--c11o-r > .m-bg-col:first-child {
        padding-left: max(var(--gutter, 1.5rem), calc((100% - var(--max-w, 1485px)) / 2));
        padding-right: 2.222rem;
    }
    .m-bg-grid--c11o-l > .m-bg-col:last-child,
    .m-bg-grid--c11o-r > .m-bg-col:last-child {
        padding-left: 2.222rem;
        padding-right: max(var(--gutter, 1.5rem), calc((100% - var(--max-w, 1485px)) / 2));
    }
}

/* Mobile (< 64em): gestackt, alle Spalten/Grids horizontal eingerueckt */
@media (max-width: 63.99em) {
    .m-bg-grid {
        padding-left:  var(--gutter, 1.5rem);
        padding-right: var(--gutter, 1.5rem);
        gap: var(--gap, 1rem);
    }
}

.m-bg-col {
    display: flex; flex-direction: column;
    gap: 1.444rem;
    /* Vertikales Slot-Padding analog .box-element > .text/.bild — pro Breakpoint
     * symmetrisch (oben=unten). Verhindert, dass kleinere Viewports zu dickes
     * Padding bekommen. */
    padding-top: 2rem;
    padding-bottom: 2rem;
}
@media (min-width: 64em) {
    .m-bg-col { padding-top: 3rem; padding-bottom: 3rem; }
}
@media (min-width: 112.5em) {
    .m-bg-col { padding-top: 3.5rem; padding-bottom: 3.5rem; }
}
/* XL-Override: reduziert Slot-Padding von 5rem (90 px) auf 3.5rem (~63 px) —
 * sonst wirkt eine einzelne Headline-Zeile in einem Slot bei breiten Viewports
 * mit 180 px vertikalem Padding deutlich zu großzuegig.
 * Gilt sowohl fuer bcl_box_element-Slots als auch bcl_box_grid-Spalten. */
@media (min-width: 112.5em) {
    .box-element > .text,
    .box-element > .infobox,
    .box-element > .bildtextbox,
    .box-element > .bild {
        padding-top: 3.5rem;
        padding-bottom: 3.5rem;
    }
}
/* Mobile gestapelt: Spalten-Padding zwischen benachbarten Spalten kollabieren —
 * sonst summieren sich padding-bottom + padding-top der Nachbarn zu einem
 * unverhaeltnismaessig grossen Abstand. Nur erste Spalte hat oben Padding,
 * letzte unten — der Inhalts-Abstand zwischen Spalten ist allein der grid-gap.
 *
 * AUSNAHME: bei nebeneinander-Layouts (c11/c12/c21/c13/c31/c11o-l/c11o-r)
 * bleibt das Layout 2-spaltig auch unter 64em — die kollabierte Padding-Logik
 * oben würde sonst Inhalt und Bild auf unterschiedlichen Y-Höhen starten.
 * Beide Spalten brauchen dasselbe vertikale Padding. */
@media (max-width: 63.99em) {
    .m-bg-col:not(:first-child) { padding-top: 0; }
    .m-bg-col:not(:last-child)  { padding-bottom: 0; }

    .m-bg-grid--c11 > .m-bg-col,
    .m-bg-grid--c11o-l > .m-bg-col,
    .m-bg-grid--c11o-r > .m-bg-col,
    .m-bg-grid--c12 > .m-bg-col,
    .m-bg-grid--c21 > .m-bg-col,
    .m-bg-grid--c13 > .m-bg-col,
    .m-bg-grid--c31 > .m-bg-col {
        padding-top: 2rem;
        padding-bottom: 2rem;
    }
}
/* Multi-Block-Sektionen: ab dem 2. bcl_box_grid-Slice in derselben CType-Tab
 * wird das padding-top der Spalten unterdrueckt — sonst doppelt sich der
 * Section-Top-Abstand mit dem padding-bottom des Vorgaenger-Blocks.
 * Ausnahme: Kachel-Spalten (.m-bg-col--card) — die brauchen ihr eigenes
 * Inhalts-Padding 1rem oben, sonst klebt die Überschrift am Kachelrand. */
.m-bg-section--continuation .m-bg-col:not(.m-bg-col--card) { padding-top: 0 !important; }

/* Headline */
.m-bg-headline { display: block; line-height: 1.15; }
.m-bg-headline .m-bg-h1 {
    display: block;
    font-size: 1.667rem;
    font-weight: 300;
    color: var(--section-muted, var(--section-fg, inherit));
}
.m-bg-headline .m-bg-h2 {
    display: block;
    font-size: 2rem;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    color: var(--section-heading, var(--section-fg, inherit));
}

/* Text */
.m-bg-text { color: var(--section-fg, inherit); }
.m-bg-text p { margin: 0 0 0.778rem 0; }
.m-bg-text p:last-child { margin-bottom: 0; }
.m-bg-text ul, .m-bg-text ol { margin: 0 0 0.778rem 1.222rem; }
.m-bg-text--cols-2 { columns: 2; column-gap: 1.667rem; }
.m-bg-text--cols-3 { columns: 3; column-gap: 1.444rem; }
/* Absätze duerfen zwischen Spalten umbrechen (zeilenweise Aufteilung) — frueher
 * `break-inside: avoid` ergaenzt, was lange Absaetze immer in eine Spalte
 * zwang. Jetzt entfernt, damit der Browser zeilenweise umbrechen kann. */
.m-bg-text--left    { text-align: left; }
.m-bg-text--center  { text-align: center; }
.m-bg-text--justify { text-align: justify; hyphens: auto; }

/* Image */
.m-bg-image { margin: 0; }
.m-bg-image img { width: 100%; height: auto; display: block; border-radius: 0.444rem; }
.m-bg-image--h-auto img { height: auto; }

/* row-stretch: Bild fuellt die volle Spaltenhoehe, in beiden Richtungen.
 * Das figure beansprucht via flex:1 + min-height:0 keine eigene intrinsische
 * Hoehe vom Bild, sondern nimmt was die Cell ihm gibt. Das <img> ist absolute
 * positioniert, damit es das figure NICHT auf seine natuerliche Hoehe drueckt
 * — egal ob das Bild kleiner oder groesser als der Nachbar-Inhalt ist.
 *
 * Aktiv ab ≥ 48em (768 px) — exakt dort wo c11/c12/c21/c13/c31 als 2-spaltige
 * Layouts side-by-side bleiben. Unter 48em stacken die Cols zu single-col,
 * dann würde flex-basis:0 die Bild-Col auf 0 kollabieren und das absolut
 * positionierte <img> verschwinden. Dort greift der Default
 * .m-bg-image img { width:100%; height:auto }. Analog zu .bild-h-stretch
 * im Box-Element-Modul. */
@media (min-width: 48em) {
    .m-bg-image--h-row-stretch {
        position: relative;
        flex: 1 1 0;
        min-height: 0;
        width: 100%;
        overflow: hidden;
        border-radius: 0.444rem;
    }
    .m-bg-image--h-row-stretch img {
        position: absolute;
        inset: 0;
        width: 100%;
        height: 100%;
        object-fit: cover;
        display: block;
        border-radius: 0;  /* radius am figure, nicht doppelt */
    }
}

.m-bg-image--h-natural img { width: auto; max-width: 100%; height: auto; }

/* === Utility · Bild-Größen-Klassen === */
/*
 * Bild-Größen-Klassen (image_size_class) — projektweite Stufen aus
 * rex_sws_css_options. Setzen `max-width` auf das `<figure>`-Element,
 * `<img>` darin behält `width:100%`. Damit wird das Bild auf die
 * gewünschte Display-Größe begrenzt, ohne die Spalte zu stretchen.
 *
 * Pflege im Backend: Page Composer → CSS-Klassen → Kategorie
 * "image_size_class". Werte müssen mit den hier definierten
 * Selektoren übereinstimmen.
 */
/* Bild-Groessen + Ausrichtungs-Klassen werden NICHT mehr hier gepflegt!
 * Quelle: rex_sws_css_options (Kategorien image_size_class + image_align_class)
 * Generierte Datei: assets/css/sws-managed.css (vom Backend automatisch geschrieben)
 * Editor: Backend → Verwaltung → Page Composer → CSS-Klassen
 *
 * Generator: sws_managed_css::generate() — laeuft automatisch beim Save der
 * CSS-Klassen-Seite. Initial via scripts/seed-image-classes.php. */

/* Icon-Block (.m-bg-iconblock) — figure mit SVG, eigenstaendiger Block-Typ
 * im mod_box_grid. Hinweis: NICHT mit .m-bg-icon verwechseln, das ist die
 * (kleine, fixe) Icon-Spalte in `.m-bg-iconbox-list li`.
 *
 * `width: 100%` zwingt das figure auf volle Container-Breite — sonst shrinkt
 * es auf die intrinsische SVG-Width (Lucide-Icons haben ein hardcoded
 * width="..."-Attribut), was die `max-width`-Klassen wirkungslos macht.
 *
 * `color: var(--color-accent)` ist der Default — wirkt wenn der Redakteur
 * keine Farbe explizit waehlt. Eine explizite Farbe wird via Inline-Style
 * `color: #xxx;` im Output-Renderer gesetzt und ueberschreibt diesen Default. */
.m-bg-iconblock { margin: 0; line-height: 0; width: 100%; color: var(--color-accent, #fdc846); }
.m-bg-iconblock svg { width: 100%; height: auto; display: block; }
.m-bg-iconblock a { display: block; color: inherit; }

/* Spalten muessen min-height:0 haben, sonst greift flex-shrink im row-stretch
 * nicht (Default min-height ist auto = content-min). */
.m-bg-col { min-height: 0; }

/* Spalte als Kachel — Box sieht aus wie der Inhaltstyp `.m-bg-kachel`:
 * eigene BG-Farbe, Border-Radius, gleichmaessiges Inhalts-Padding 1.222rem,
 * Bild als erstes Element bündig oben (kein Padding davor). */
.m-bg-col--card {
    background: var(--card-bg, transparent);
    color: var(--card-fg, var(--section-fg, inherit));
    border-radius: 0.222rem;
    overflow: hidden;
    padding: 1rem 1.111rem 1.222rem 1.111rem !important;
    gap: 0.667rem;
}
/* Erstes Bild-Element bündig zur Card-Kante (kein Außenrand) */
.m-bg-col--card > .m-bg-image:first-child {
    margin: -1rem -1.111rem 0 -1.111rem;
    border-radius: 0;
    aspect-ratio: 340 / 185;
    overflow: hidden;
}
.m-bg-col--card > .m-bg-image:first-child img {
    border-radius: 0;
    width: 100%; height: 100%; object-fit: cover; display: block;
}

/* Inhalt erbt Card-Farben */
.m-bg-col--card .m-bg-headline .m-bg-h1 { color: var(--card-muted, var(--card-fg, inherit)); }
.m-bg-col--card .m-bg-headline .m-bg-h2 { color: var(--card-heading, var(--card-fg, inherit)); }
.m-bg-col--card .m-bg-text { color: var(--card-fg, inherit); }
.m-bg-col--card .m-bg-linkbox {
    background-color: var(--card-link-bg, var(--section-link-bg, #5076A2));
    color: var(--card-link-fg, var(--section-link-fg, #ffffff)) !important;
}

/* Linkbox am Ende eines Fließtext-Blocks — Optik analog .m-box-link-btn
 * (uppercase, Section-Link-Farben, gelber arrow-right rechts). Wrapper-<p>
 * verhindert column-break, damit Link bei multi-column-Layout am Ende der
 * letzten Spalte sitzt und nicht innerhalb einer Spalte umbricht. */
.m-bg-linkbox-wrap {
    margin: 1rem 0 0 0;
    break-inside: avoid;
}
.m-bg-linkbox {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    background-color: var(--section-link-bg, #5076A2);
    color: var(--section-link-fg, #ffffff) !important;
    font-weight: 400;                 /* Figtree Regular */
    font-size: 1rem;
    padding: 0.389rem 0.889rem;
    border-radius: 0.222rem;
    text-decoration: none !important;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    transition: filter 0.2s ease;
}
.m-bg-linkbox:hover { filter: brightness(0.95); }
.m-bg-linkbox .m-bg-linkbox-arrow {
    display: inline-flex; align-items: center; justify-content: center;
    width: 1.111rem; height: 1.111rem;
    color: var(--color-accent, #fde68a);
    transition: transform 0.15s ease;
}
.m-bg-linkbox .m-bg-linkbox-arrow svg { width: 1.111rem; height: 1.111rem; }
.m-bg-linkbox:hover .m-bg-linkbox-arrow { transform: translateX(3px); }

/* HTML-Block — roher HTML-Container, kein eigenes Styling */
.m-bg-html { width: 100%; }

/* === Utility · TinyMCE-Listen-Marker === */
/*
 * Standard-Listen-Marker für TinyMCE-Body-Container (alle Inhalts-Module):
 * Tailwind-Reset entfernt list-style komplett, daher hier mit ::before-
 * Pseudo-Element ein gelber Akzent-Pfeil ▸ als Marker.
 * Geltungsbereich: Box-Element-Slots + Box-Grid-Blöcke + News-Detail.
 */
.m-bg-text ul,
.m-bg-kachel-content ul,
.m-bg-infobox-body ul,
.m-bg-col--card ul,
.box-element > .text .box-body ul,
.box-element > .infobox .box-body ul,
.box-element > .bildtextbox .box-text ul,
.m-kachel-text ul,
.m-news-detail-text ul {
    list-style: none;
    padding-left: 1.333rem;
    margin: 0 0 0.778rem 0;
}
.m-bg-text ul > li,
.m-bg-kachel-content ul > li,
.m-bg-infobox-body ul > li,
.m-bg-col--card ul > li,
.box-element > .text .box-body ul > li,
.box-element > .infobox .box-body ul > li,
.box-element > .bildtextbox .box-text ul > li,
.m-kachel-text ul > li,
.m-news-detail-text ul > li {
    position: relative;
    padding-left: 0;
    margin-bottom: 0.222rem;
}
.m-bg-text ul > li::before,
.m-bg-kachel-content ul > li::before,
.m-bg-infobox-body ul > li::before,
.m-bg-col--card ul > li::before,
.box-element > .text .box-body ul > li::before,
.box-element > .infobox .box-body ul > li::before,
.box-element > .bildtextbox .box-text ul > li::before,
.m-kachel-text ul > li::before,
.m-news-detail-text ul > li::before {
    /* Lucide arrow-right als mask-image — Farbe via background-color, nimmt
     * automatisch den Akzent-Gelb-Ton an und passt sich an dunkle/helle Themes an.
     * Auf gelbem Section-Hintergrund (`.bg-accent`) ueberschreibt das CSS-Var
     * `--bullet-color` weiter unten den Wert auf Primaer-Blau, sonst waere der
     * Pfeil unsichtbar. */
    content: "";
    position: absolute;
    left: -1.333rem;
    top: 0.25em;
    width: 1em; height: 1em;
    background-color: var(--bullet-color, var(--color-accent, #fde68a));
    -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M5 12h14'/><path d='m12 5 7 7-7 7'/></svg>") no-repeat center / contain;
            mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M5 12h14'/><path d='m12 5 7 7-7 7'/></svg>") no-repeat center / contain;
}
/* Auf gelben Section-/Card-Hintergruenden den Akzent-Pfeil auf Primaer-Blau
 * umstellen — sonst geht der gelbe Pfeil im gelben Hintergrund unter.
 *
 * Zwei Klassen-Quellen liefern gelbes Background:
 * - `.bg-accent` (Tailwind-Section-Klasse aus `rex_sws_css_options` Kategorie
 *   `bg_class`)
 * - `.box-accent` (Box-Klasse aus `rex_sws_css_options` Kategorie `box_class`,
 *   z. B. fuer einzelne Kacheln im Box-Element- und Box-Grid-Modul) */
.bg-accent,
.box-accent,
.m-bg-kachel.bg-accent,
.m-bg-kachel.box-accent,
.m-kachel.bg-accent,
.m-kachel.box-accent,
.m-bg-col--card.bg-accent,
.m-bg-col--card.box-accent {
    --bullet-color: var(--color-primary, #1d3969);
}

/* InfoBox (aufklappbar) */
.m-bg-infobox { width: 100%; }
.m-bg-infobox-summary {
    list-style: none;
    cursor: pointer;
    padding: 0.667rem 0;
    border-bottom: 1px solid currentColor;
    display: flex; flex-direction: column;
}
.m-bg-infobox-summary::-webkit-details-marker { display: none; }
.m-bg-infobox-summary::after {
    content: "▾"; align-self: flex-end;
    font-size: 1.111rem; line-height: 1; transition: transform 0.2s;
    color: var(--color-accent, #fde68a);
}
.m-bg-infobox[open] > .m-bg-infobox-summary::after { transform: rotate(180deg); }
.m-bg-infobox-summary .m-bg-h1 {
    display: block; font-weight: 300; font-size: 1.667rem;
    color: var(--section-muted, var(--section-fg, inherit));
}
.m-bg-infobox-summary .m-bg-h2 {
    display: block; font-weight: 800; font-size: 2rem;
    text-transform: uppercase; letter-spacing: 0.02em;
    color: var(--section-heading, var(--section-fg, inherit));
}
.m-bg-infobox-body { padding: 1rem 0; color: var(--section-fg, inherit); }

/* Kachel — Card-Layout 1:1 zu .m-kachel (bcl_box_element). Werte:
 * border-radius 0.222rem · Inhalts-Padding 1rem 1.111rem 1.222rem 1.111rem ·
 * Bild aspect-ratio 340/185 · Headline 21 px · Text 17 px · Linkbox 18 px. */
.m-bg-kachel {
    display: flex; flex-direction: column;
    border-radius: 0.222rem;
    overflow: hidden;
    background: var(--card-bg, #ffffff);
    color: var(--card-fg, var(--section-fg, inherit));
}
.m-bg-kachel-img {
    margin: 0;
    width: 100%;
    aspect-ratio: 340 / 185;
    overflow: hidden;
}
.m-bg-kachel-img img,
.m-bg-kachel-img picture { width: 100%; height: 100%; object-fit: cover; display: block; }
.m-bg-kachel-content {
    padding: 1rem 1.111rem 1.222rem 1.111rem;
    display: flex; flex-direction: column;
    flex: 1;
}

/* Headline + Text + Linkbox INNERHALB Kachel ODER Spalte-als-Card —
 * Größen analog .m-kachel-line1/-line2/-text/-btn. */
.m-bg-kachel .m-bg-headline,
.m-bg-col--card .m-bg-headline { line-height: 1.2; margin: 0; }
.m-bg-kachel .m-bg-headline .m-bg-h1,
.m-bg-col--card .m-bg-headline .m-bg-h1 {
    font-size: 1.167rem;        /* 21 px */
    font-weight: 300;
    line-height: 1.25;
    margin: 0 0 0.333rem 0;
    color: var(--card-muted, var(--card-fg, inherit));
}
.m-bg-kachel .m-bg-headline .m-bg-h2,
.m-bg-col--card .m-bg-headline .m-bg-h2 {
    font-size: 1.167rem;
    font-weight: 800;
    line-height: 1.2;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    margin: 0 0 0.667rem 0;
    color: var(--card-heading, var(--card-fg, inherit));
}
.m-bg-kachel .m-bg-text,
.m-bg-col--card .m-bg-text {
    font-size: 0.944rem;        /* 17 px */
    font-weight: 400;
    line-height: 1.4;
    margin: 0 0 1rem 0;
    color: var(--card-fg, inherit);
}
.m-bg-kachel .m-bg-text > :first-child,
.m-bg-col--card .m-bg-text > :first-child { margin-top: 0; }
.m-bg-kachel .m-bg-text > :last-child,
.m-bg-col--card .m-bg-text > :last-child { margin-bottom: 0; }
.m-bg-kachel .m-bg-linkbox,
.m-bg-col--card .m-bg-linkbox {
    background-color: var(--card-link-bg, var(--section-link-bg, #5076A2));
    color: var(--card-link-fg, var(--section-link-fg, #ffffff)) !important;
    font-size: 1rem;            /* 18 px */
    font-weight: 400;
    padding: 0.389rem 0.889rem;
    border-radius: 0.222rem;
    text-transform: uppercase;
    letter-spacing: 0.02em;
}

/* Galerie — Lead-Bild + Thumbnails */
.m-bg-galerie { display: flex; flex-direction: column; gap: 0.667rem; }
.m-bg-galerie-lead img { width: 100%; height: auto; display: block; border-radius: 0.444rem; }
.m-bg-galerie-thumbs { display: grid; grid-template-columns: repeat(auto-fill, minmax(80px, 1fr)); gap: 0.444rem; }
.m-bg-galerie-thumbs a { display: block; aspect-ratio: 1; overflow: hidden; border-radius: 0.222rem; }
.m-bg-galerie-thumbs img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Slider — Swiper-Carousel */
.m-bg-slider { width: 100%; overflow: hidden; border-radius: 0.444rem; }
.m-bg-slider .swiper-slide img { width: 100%; height: auto; display: block; }
.m-bg-slider .swiper-pagination { position: relative; margin-top: 0.5rem; }

/* Linkboxen-Block — Optik analog .m-news-cta / .m-box-link-btn:
 * uppercase, Section-Linkbox-Farben, gelber arrow-right RECHTS am Item.
 * Layout: stretch (Grid mit 1/2 fr-Spalten, Items füllen die Zelle) ODER
 * natural (Flex-Wrap, Items nehmen Inhalts-Breite). */
.m-bg-linkboxes { gap: 0.778rem; margin: 0; }
@media (max-width: 47.99em) {
    .m-bg-linkboxes { gap: 0.667rem; }
}

/* Stretch: Grid mit fester Spaltenanzahl */
.m-bg-linkboxes--w-stretch { display: grid; }
.m-bg-linkboxes--w-stretch.m-bg-linkboxes--cols-1 { grid-template-columns: 1fr; }
.m-bg-linkboxes--w-stretch.m-bg-linkboxes--cols-2 { grid-template-columns: 1fr 1fr; }

/* Natural: Flex-Wrap, Items nach Inhalt; cols-2 = 2-spaltig, aber Items mit Inhalts-Breite */
.m-bg-linkboxes--w-natural { display: flex; flex-wrap: wrap; }
.m-bg-linkboxes--w-natural .m-bg-linkbox-item { flex: 0 0 auto; }
.m-bg-linkboxes--w-natural.m-bg-linkboxes--cols-1 { flex-direction: column; align-items: flex-start; }
.m-bg-linkbox-item {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.389rem 0.889rem;
    font-size: 1rem;
    font-weight: 400;                 /* Figtree Regular */
    text-transform: uppercase;
    letter-spacing: 0.02em;
    text-decoration: none !important;
    border-radius: 0.222rem;
    transition: filter 0.2s ease, background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.m-bg-linkbox-item .m-bg-linkbox-label { flex: 1; }
.m-bg-linkbox-item .m-bg-linkbox-arrow {
    flex: 0 0 auto;
    width: 1.111rem; height: 1.111rem;
    color: var(--color-accent, #fde68a);   /* gelb */
    display: inline-flex; align-items: center; justify-content: center;
    transition: transform 0.15s ease;
}
.m-bg-linkbox-item .m-bg-linkbox-arrow svg { width: 1.111rem; height: 1.111rem; }
.m-bg-linkbox-item:hover .m-bg-linkbox-arrow { transform: translateX(3px); }
.m-bg-linkbox-icon-left { flex: 0 0 1.111rem; display: inline-flex; align-items: center; justify-content: center; }
.m-bg-linkbox-icon-left svg { width: 1.111rem; height: 1.111rem; }

/* Stil-Varianten */
.m-bg-linkboxes--primary .m-bg-linkbox-item {
    background-color: var(--section-link-bg, #5076A2);
    color: var(--section-link-fg, #ffffff) !important;
}
.m-bg-linkboxes--primary .m-bg-linkbox-item:hover { filter: brightness(0.95); }

.m-bg-linkboxes--outline .m-bg-linkbox-item {
    background-color: transparent;
    color: var(--section-fg, inherit) !important;
    border: 2px solid var(--section-link-bg, #5076A2);
    padding: 0.222rem 0.722rem;       /* etwas weniger, weil border 2 px hinzukommt */
}
.m-bg-linkboxes--outline .m-bg-linkbox-item:hover {
    background-color: var(--section-link-bg, #5076A2);
    color: var(--section-link-fg, #ffffff) !important;
}

.m-bg-linkboxes--plain .m-bg-linkbox-item {
    background-color: transparent;
    color: var(--section-fg, inherit) !important;
    padding: 0.444rem 0;
    border-radius: 0;
}
.m-bg-linkboxes--plain .m-bg-linkbox-item:hover { color: var(--section-heading, inherit) !important; }

@media (max-width: 47.99em) {
    .m-bg-linkboxes--w-stretch.m-bg-linkboxes--cols-2 { grid-template-columns: 1fr; }
    .m-bg-linkboxes--w-natural { flex-direction: column; align-items: flex-start; }
}

/* Iconbox — Icon 45x45 px, Titel Figtree Regular 18px, Text Figtree Light 18px */
.m-bg-iconbox { padding: 1rem 1.222rem; border-radius: 0.444rem; background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12); }
.m-tone-light .m-bg-iconbox { background: #f1f5f9; border-color: #e2e8f0; }
.m-bg-iconbox-title { font-weight: 700; font-size: 1.111rem; margin-bottom: 0.667rem; }
.m-bg-iconbox-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.778rem; }
.m-bg-iconbox-list--cols-1 { grid-template-columns: 1fr; }
.m-bg-iconbox-list--cols-2 { grid-template-columns: 1fr 1fr; }
.m-bg-iconbox-list--cols-3 { grid-template-columns: 1fr 1fr 1fr; }
.m-bg-iconbox-list li { display: flex; align-items: center; gap: 0.778rem; }
.m-bg-icon {
    flex: 0 0 2.5rem;        /* 45 px @ 18-px-Root */
    width: 2.5rem; height: 2.5rem;
    display: inline-flex; align-items: center; justify-content: center;
    color: var(--section-heading, currentColor);
}
.m-bg-icon svg { width: 2.5rem; height: 2.5rem; }
.m-bg-itext { display: flex; flex-direction: column; line-height: 1.25; }
.m-bg-itext strong,
.m-bg-itext span {
    font-family: 'Figtree', sans-serif;
    font-weight: 300;        /* Figtree Light */
    font-size: 1rem;          /* 18 px @ 18-px-Root */
    color: var(--section-fg, inherit);
}
.m-bg-itext strong { color: var(--section-heading, var(--section-fg, inherit)); }

/* Icon-Liste (ul/li mit Icon + Farbe pro Zeile, ohne Card-Hintergrund).
 * Im Gegensatz zur Iconbox kompakt: kleine Icons (20 px), Text-Zeile pro li. */
.m-bg-iconlist-wrap { width: 100%; }
.m-bg-iconlist-title { font-weight: 700; font-size: 1.111rem; margin-bottom: 0.667rem; }
.m-bg-iconlist { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.444rem 1.222rem; }
.m-bg-iconlist--cols-1 { grid-template-columns: 1fr; }
.m-bg-iconlist--cols-2 { grid-template-columns: 1fr 1fr; }
.m-bg-iconlist--cols-3 { grid-template-columns: 1fr 1fr 1fr; }
.m-bg-iconlist li {
    display: flex; align-items: baseline; gap: 0.556rem;
    font-family: 'Figtree', sans-serif;
    font-weight: 300;
    font-size: 1rem;
    line-height: 1.45;
    color: var(--section-fg, inherit);
}
.m-bg-iconlist-icon {
    flex: 0 0 1.111rem;
    width: 1.111rem; height: 1.111rem;
    display: inline-flex; align-items: center; justify-content: center;
    color: var(--color-accent, #FFD200);  /* Default-Farbe wenn keine Inline-Color gesetzt */
    transform: translateY(0.111rem);       /* Icon optisch zur Textzeile ausrichten */
}
.m-bg-iconlist-icon svg { width: 1.111rem; height: 1.111rem; }
.m-bg-iconlist-text { flex: 1 1 0; min-width: 0; }

/* Responsive */
@media (max-width: 63.99em) {
    .m-bg-grid--c111,
    .m-bg-grid--c1111,
    .m-bg-grid--c11111 { grid-template-columns: 1fr 1fr; }
}
/* Tablet/Laptop (48–64em): 3-spaltige Inhalte auf 2 Cols downscalen.
 * Lange Labels / Worte in 3 schmalen Cols schieben die min-content der
 * äußeren Text-Col so weit auf, dass im 1:3-Layout (c13/c31) die Bild-Col
 * auf ~50px kollabiert. 2 Cols entspannen min-content ausreichend.
 * Betroffen: Iconbox-Liste, Icon-Liste, Multi-Column-Text. */
@media (min-width: 48em) and (max-width: 63.99em) {
    .m-bg-iconbox-list--cols-3,
    .m-bg-iconlist--cols-3 { grid-template-columns: 1fr 1fr; }
    .m-bg-text--cols-3 { columns: 2; }
}
@media (max-width: 47.99em) {
    .m-bg-grid--c11,
    .m-bg-grid--c11o-l,
    .m-bg-grid--c11o-r,
    .m-bg-grid--c12,
    .m-bg-grid--c21,
    .m-bg-grid--c13,
    .m-bg-grid--c31,
    .m-bg-grid--c111,
    .m-bg-grid--c1111,
    .m-bg-grid--c11111 { grid-template-columns: 1fr; }
    .m-bg-text--cols-2,
    .m-bg-text--cols-3 { columns: 1; }
    .m-bg-iconbox-list--cols-2,
    .m-bg-iconbox-list--cols-3 { grid-template-columns: 1fr; }
    .m-bg-iconlist--cols-2,
    .m-bg-iconlist--cols-3 { grid-template-columns: 1fr; }
    .m-bg-headline .m-bg-h1 { font-size: 1.333rem; }
    .m-bg-headline .m-bg-h2 { font-size: 1.556rem; }
}

/* <strong>/<b> global auf 600 (Semibold) setzen — gilt im gesamten Frontend
   (Box-Element, News-Cards, TinyMCE-Texte, Mega-Menu etc.). Bei Light-Schrift
   (300) als Basis ergibt der Browser-Default `font-weight: bolder` nur 400 —
   kaum sichtbarer Kontrast. 600 ist klar erkennbar, ohne zu fett zu wirken.
   Spezifischere Regeln (z.B. Modul-spezifische strong-Definitionen) gewinnen
   bei Bedarf weiterhin durch höhere Spezifität. */
strong,
b {
    font-weight: 600;
}

/*tabllen */

table tr > td, table tr > th {
    padding: 0.5rem 0.5rem;
    vertical-align: top;
    text-align: left;
}

/* === Sticky-Header mit Compact-Modus (analog stahlbauhoch3.de) ============
 * Header startet bei voller Höhe (8.611rem; ≈ 155 px @ 18 px root) und klebt
 * von Anfang an oben fest. Beim Scrollen > 100 px setzt m-header.js die
 * Klasse `.is-compact` → Header schrumpft auf 4.444rem (≈ 80 px), Logo-Halo
 * von 12.333rem auf 4rem, Steuerrad-Logo von 10.333rem auf 3.5rem.
 *
 * `body { padding-top: var(--m-header-h-full) }` kompensiert den entfallenen
 * Layout-Fluss — sonst rutscht der Hero unter den fixed Header.
 * `scroll-padding-top` sorgt, dass Anker (Fahrtenrevier-Orte, FAQ-Items …)
 * nicht hinter dem Header landen. */

:root {
    --m-header-h-full: 8.611rem;
    --m-header-h-compact: 4.444rem;
}

html { scroll-padding-top: var(--m-header-h-compact); }
body { padding-top: var(--m-header-h-full); }

#header {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    transition: box-shadow 0.25s ease;
}
#header .m-header-h,
#header .m-logo-circle,
#header .m-logo-steering {
    transition: height 0.25s ease, width 0.25s ease, left 0.25s ease;
}

#header.is-compact { box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); }
#header.is-compact .m-header-h    { height: var(--m-header-h-compact); }
/* Im Compact-Modus sitzt das Logo auf der gemeinsamen Inhalts-Linie
 * (var(--edge-pad)) — analog zu allen anderen Sektionen-Inhalten. */
#header.is-compact .m-logo-circle { width: 4rem;  height: 4rem; left: var(--edge-pad); }
#header.is-compact .m-logo-steering { width: 3.5rem; height: 3.5rem; }

/* Megamenu-Viewport hängt absolut am Header-Bottom — Top atmet mit der
 * Header-Höhe, sonst klafft im Compact-Modus eine Lücke zwischen Header
 * und aufgeklapptem Panel. */
#header.is-compact .m-megamenu-viewport { top: var(--m-header-h-compact); }

/* Mobile: Burger-Menü kann länger als der Viewport werden. Damit man
 * trotz fixed-Header bis zum Ende scrollen kann, bekommt der gesamte
 * Header eine eigene Scroll-Höhe (Touch-Scrolling glatt halten). */
@media (max-width: 1023px) {
    #header {
        max-height: 100vh;
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
    }
}

/* Tablet + Mobile (< 1024 px): Logo verkleinern + bündig auf Inhalts-Edge.
 * Token-Default `.m-logo-circle { 12.333rem }` ergibt bei kleinem
 * Root-Font (14/13/12 px) Logos von 173 / 160 / 148 px, die 30–50 px
 * unter den Header in den Hero ragen — wirkt überdimensioniert.
 * Mit 5.5rem (Halo) + 4.5rem (Steuerrad) sitzt das Logo komplett im
 * 8.611rem-Header und ragt nicht mehr aus. `left: 0` überschreibt das
 * `m-left-edge`-Token (-1rem nach links über Container). */
@media (max-width: 1023px) {
    .m-logo-circle {
        width: 8.5rem;
        height: 8.5rem;
        left: var(--edge-pad);
        top: 50%;
        transform: translateY(-50%);
    }
    .m-logo-steering {
        width: 7.2rem;
        height: 7.2rem;
    }
}

/* Desktop ≥ 1024 px im Vollmodus: Logo etwas größer als die Token-Defaults
 * (12.333rem Halo / 10.333rem Steuerrad). Halo +9.5 %, Steuerrad +11 %.
 * top + left bleiben unangetastet — Logo klebt via `top-0` (Tailwind) am
 * Header-Top und ragt via `m-left-edge: -1rem` (Token) links etwas über
 * den Container, sodass der Halo nach unten in den Hero und nach links
 * in den Edge-Rand ragt (Original-Design).
 *
 * Compact-Modus bleibt unangetastet — `#header.is-compact .m-logo-circle`
 * hat höhere Spezifität (0,1,2,0) und überschreibt diese Regel. */
@media (min-width: 1024px) {
    .m-logo-circle {
        width: 13.5rem;
        height: 13.5rem;
        left: var(--edge-pad);   /* synced zur Inhalts-Linie (statt m-left-edge: -1rem) */
    }
    .m-logo-steering {
        width: 11.5rem;
        height: 11.5rem;
    }
}

/* m-bfs-wrap nutzt im Modul-Output die Klassen `m-max-w m-px-edge` → 42.67 px
 * Inner-Padding bei vw < 1565. Box-element-Sektionen auf derselben Seite
 * nutzen aber die 1.5-rem-Gutter-Formel (24 px bei vw < 1565). Damit der
 * BFS-Section-Inhalt auf der gleichen x-Linie sitzt wie box-element-
 * Sektionen, wird das Padding auf die identische Formel umgestellt. */
.m-bfs-section > .m-bfs-wrap {
    max-width: none;
    padding-left:  max(1.5rem, calc((min(100vw, 1920px) - 1485px) / 2));
    padding-right: max(1.5rem, calc((min(100vw, 1920px) - 1485px) / 2));
}

/* === Box-/Kachel-Design (pflegbar via Page Composer → CSS-Optionen) ============
 * Border-Radius, Schatten und Rahmen werden pro Box-Klasse im Backend gepflegt
 * (Spalten border_radius, border_width, border_color, box_shadow in
 * rex_sws_css_options/category=box_class). Werte landen als CSS-Variablen
 * am gerenderten Card-Element via Inline-Style:
 *   --card-border-radius, --card-border-width, --card-border-color, --card-shadow
 *
 * Greift NUR, wenn die Variable im Inline-Style gesetzt ist (Attribute-Selector).
 * Ohne gesetzten Wert bleiben die Card-spezifischen Defaults (z. B.
 * .m-bg-col--card { border-radius: 0.222rem }) unangetastet. */
[style*="--card-border-radius"] {
    border-radius: var(--card-border-radius);
}
[style*="--card-shadow"] {
    box-shadow: var(--card-shadow);
}
[style*="--card-border-color"],
[style*="--card-border-width"] {
    border: var(--card-border-width, 1px) solid var(--card-border-color, currentColor);
}