/* ============================================================================
   Musikverein Illmensee — Design Tokens & Base Styles
   ----------------------------------------------------------------------------
   Quelle: Designsystem v0.1 (tokens.css aus dem MVI-Design-Export)
   Inhalt: CSS Custom Properties, Cassiopeia/Bootstrap-Overrides, Basis-Typo.
   Layout und Komponenten leben in eigenen Dateien.
   ============================================================================ */

/* ============================================================================
   INHALTSVERZEICHNIS — Navigations-Index (2026-06-03)
   ----------------------------------------------------------------------------
   Reine Lese-Hilfe. Jeder Eintrag entspricht einem bestehenden Abschnitts-
   Header weiter unten; per Editor-Suche (Cmd/Strg-F) nach dem Titel-Text
   springen. KEINE Kaskaden-Bedeutung — nur ein Kommentar. Reihenfolge =
   Quelltext-Reihenfolge (= Kaskade), NICHT umsortieren.

   FOUNDATION
     · Design Tokens & Base Styles ........ Custom Properties, Cassiopeia/
       Bootstrap-Overrides, color-scheme:only light (Force-Dark-Schutz)
     · Base styles ........................ html/body-Grundlagen
     · Typography utilities ............... .t-display/.t-body Bausteine

   PHASE 2 — HEADER & NAVIGATION
     · Phase 2 — Header & Navigation ...... Sticky-Header (Desktop-Nav) +
       Off-Canvas-Drawer (Mobile/Tablet ≤1050 px, --real-vh iOS-Fix,
       Z-Schema Header/Scrim/Drawer)

   PHASE 3 — STARTSEITE (Sektionen S-3 .. S-9)
     · PHASE 3 · HERO ..................... Hero-Slider (Ultrawide-Cap 850 px)
     · SEEFEST-UNTERSEITE HERO ............ nur /seefest (itemid-1081)
     · PHASE 3 · PAGE-LAYOUT · STARTSEITE (S-9)
     · PHASE 3 · TERMINE (S-3) ............ Termine-Strip (Slider-Lane)
     · PHASE 3 · AKTUELLES (S-4) .......... .mvi-news + Flyer-Card
     · PHASE 3 · ENSEMBLES (S-5)
     · PHASE 3 · MUSIKALISCHE AUSBILDUNG (S-6)
     · PHASE 3 · GRID-EXTENSION für bottom-c / bottom-d
     · PHASE 3 · SEEFEST-PROMO (S-7)
     · PHASE 3 · SPONSOREN-STRIP (S-8)
     · PHASE 3 · FOOTER (S-9)

   PHASE 3 — UNTERSEITEN (S-10 .. S-20)
     · S-10 — BEITRAGSSEITE (Article View) + S-10 Polish
     · „Unsere Register" (itemid 979): pid=4 Ignite-Profil + Lightbox
     · S-11: ÜBER-UNS — 2-Spalten + Sidebar + Stats
     · S-12: ÜBER-UNS — Archivierte Beiträge + S-12 Detail
     · PHASE 3 · CHRONIK (S-13) + Chronik pid=5 Lightbox
     · PHASE 3 · SPONSOREN (S-14) — Unsere-Sponsoren-Grid
     · PHASE 3 · TERMINE-SEITE (S-15) ..... DPCalendar-Vollseite (g-3/g-4)
     · PHASE 3 · BILDER-BEREICH (S-16)
     · PHASE 3 · KONTAKTE (S-17 / S-17b)
     · S-18 + S-19: KONTAKTE — Download-Bereich + Passive Mitgliedschaft
     · S-20: IMPRESSUM + DATENSCHUTZERKLÄRUNG (itemid 942 / 1221)

   IGNITE-GALERIE (querschnittlich, am Dateiende)
     · Galerie-Strip Chevron-Navigation (R4)
     · Ignite-Galerie — globale MVI-Typo (R5/R6)
   ============================================================================ */

/* ── Schriften lokal gehostet (2026-05-22) ────────────────────────────────
   Kein externer Aufruf an fonts.googleapis.com / fonts.gstatic.com /
   cdnjs.cloudflare.com mehr — Datenschutz (vgl. DECISIONS 2026-05-22).
   WOFF2 in ../fonts/, Font-Awesome-CSS lokal in css/.

   Rollback-Referenz — vorher extern geladen:
   @import url('https://fonts.googleapis.com/css2?family=Spectral:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400;1,500;1,600&family=Source+Sans+3:ital,wght@0,300;0,400;0,500;0,600;0,700;0,900;1,400;1,600&display=swap');
   @import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/brands.min.css');
   @import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/fontawesome.min.css');
   ──────────────────────────────────────────────────────────────────────── */

/* Font Awesome 6.5.0 — lokal (css/), Brands-Font in ../fonts/. */
@import url('fontawesome.min.css');
@import url('brands.min.css');

/* Google Fonts — lokal: Spectral (9 Varianten) + Source Sans 3 (8), WOFF2,
   latin-Subset, font-display:swap. Quelle google-webfonts-helper (byte-
   identisch zu den Google-Fonts-Dateien). */
@font-face { font-family: 'Spectral'; font-style: normal; font-weight: 300; font-display: swap; src: url('../fonts/spectral-v15-latin-300.woff2') format('woff2'); }
@font-face { font-family: 'Spectral'; font-style: normal; font-weight: 400; font-display: swap; src: url('../fonts/spectral-v15-latin-regular.woff2') format('woff2'); }
@font-face { font-family: 'Spectral'; font-style: normal; font-weight: 500; font-display: swap; src: url('../fonts/spectral-v15-latin-500.woff2') format('woff2'); }
@font-face { font-family: 'Spectral'; font-style: normal; font-weight: 600; font-display: swap; src: url('../fonts/spectral-v15-latin-600.woff2') format('woff2'); }
@font-face { font-family: 'Spectral'; font-style: normal; font-weight: 700; font-display: swap; src: url('../fonts/spectral-v15-latin-700.woff2') format('woff2'); }
@font-face { font-family: 'Spectral'; font-style: normal; font-weight: 800; font-display: swap; src: url('../fonts/spectral-v15-latin-800.woff2') format('woff2'); }
@font-face { font-family: 'Spectral'; font-style: italic; font-weight: 400; font-display: swap; src: url('../fonts/spectral-v15-latin-italic.woff2') format('woff2'); }
@font-face { font-family: 'Spectral'; font-style: italic; font-weight: 500; font-display: swap; src: url('../fonts/spectral-v15-latin-500italic.woff2') format('woff2'); }
@font-face { font-family: 'Spectral'; font-style: italic; font-weight: 600; font-display: swap; src: url('../fonts/spectral-v15-latin-600italic.woff2') format('woff2'); }
@font-face { font-family: 'Source Sans 3'; font-style: normal; font-weight: 300; font-display: swap; src: url('../fonts/source-sans-3-v19-latin-300.woff2') format('woff2'); }
@font-face { font-family: 'Source Sans 3'; font-style: normal; font-weight: 400; font-display: swap; src: url('../fonts/source-sans-3-v19-latin-regular.woff2') format('woff2'); }
@font-face { font-family: 'Source Sans 3'; font-style: normal; font-weight: 500; font-display: swap; src: url('../fonts/source-sans-3-v19-latin-500.woff2') format('woff2'); }
@font-face { font-family: 'Source Sans 3'; font-style: normal; font-weight: 600; font-display: swap; src: url('../fonts/source-sans-3-v19-latin-600.woff2') format('woff2'); }
@font-face { font-family: 'Source Sans 3'; font-style: normal; font-weight: 700; font-display: swap; src: url('../fonts/source-sans-3-v19-latin-700.woff2') format('woff2'); }
@font-face { font-family: 'Source Sans 3'; font-style: normal; font-weight: 900; font-display: swap; src: url('../fonts/source-sans-3-v19-latin-900.woff2') format('woff2'); }
@font-face { font-family: 'Source Sans 3'; font-style: italic; font-weight: 400; font-display: swap; src: url('../fonts/source-sans-3-v19-latin-italic.woff2') format('woff2'); }
@font-face { font-family: 'Source Sans 3'; font-style: italic; font-weight: 600; font-display: swap; src: url('../fonts/source-sans-3-v19-latin-600italic.woff2') format('woff2'); }

/* ── Dark Mode bewusst deaktiviert ────────────────────────────────────────
   Die Seite ist ausschließlich für ein helles Farbschema gestaltet
   (Vereinsfarben-Identität: Cream/Sand/Bordeaux). `color-scheme: only light`
   zusätzlich zum <meta name="color-scheme"> in index.php — Chrome (v. a.
   Android-Auto-Dark / chrome://flags „Auto Dark Mode for Web Contents")
   respektiert den Meta-Tag allein nicht zuverlässig; die CSS-Property auf
   :root ist der kanonische Opt-out. Steht direkt NACH den @import-Regeln —
   CSS verlangt @import vor allen Style-Regeln, eine Regel davor würde die
   Font-Imports ungültig machen. */
:root {
  color-scheme: only light;
}

:root {
  /* ── Brand colors — Bordeaux ─────────────────────────────────── */
  --brand-bordeaux:        #8c001c;
  --brand-bordeaux-deep:   #6c0015;
  --brand-bordeaux-soft:   #a92841;
  --brand-bordeaux-tint:   #f7e9ec;

  /* ── Brand colors — Vereinsgrün ──────────────────────────────── */
  --brand-green:           #326E32;
  --brand-green-deep:      #234d23;
  --brand-green-soft:      #4f8a4f;
  --brand-green-tint:      #e6efe6;

  /* ── Brand colors — Messing-Gold ─────────────────────────────── */
  --brand-gold:            #c49a3c;
  --brand-gold-deep:       #9a7826;
  --brand-gold-soft:       #d8b765;
  --brand-gold-tint:       #f6efd9;

  /* ── Neutrals ────────────────────────────────────────────────── */
  --neutral-white:         #ffffff;
  /* Hellere Variante von cream/sand — gemessen am Preview-Drawer
     (panel #fdfaf3, foot #f4efe3). Liegen zwischen white und cream/sand. */
  --neutral-cream-50:      #fdfaf3;
  --neutral-cream:         #faf6ef;
  --neutral-sand-50:       #f4efe3;
  --neutral-sand:          #efe7d6;
  --neutral-stone:         #d9d2c4;
  --neutral-grey-200:      #c8c2b6;
  --neutral-grey-400:      #8a8478;
  --neutral-grey-600:      #555049;
  --neutral-anthracite:    #1f1c18;
  --neutral-black:         #0a0908;

  /* ── Semantic surfaces & text ────────────────────────────────── */
  --bg-page:               var(--neutral-cream);
  --bg-surface:            var(--neutral-white);
  --bg-surface-warm:       var(--neutral-sand);
  --bg-inverse:            var(--neutral-anthracite);
  /* Drawer-spezifisch — vom Preview gemessen. */
  --bg-drawer:             var(--neutral-cream-50);
  --bg-drawer-foot:        var(--neutral-sand-50);

  --fg-primary:            var(--neutral-anthracite);
  --fg-secondary:          var(--neutral-grey-600);
  --fg-muted:              var(--neutral-grey-400);
  --fg-on-bordeaux:        #fdfaf3;
  --fg-on-green:           #fdfaf3;
  --fg-link:               var(--brand-bordeaux);
  --fg-link-hover:         var(--brand-bordeaux-deep);

  --border-subtle:         #e7e0d1;
  --border-default:        var(--neutral-stone);
  --border-strong:         var(--neutral-grey-400);

  /* Event tag accents (1:1 vom aktuellen Site-Mapping) */
  --event-aktive:          var(--brand-bordeaux);
  --event-jugend:          var(--brand-green);

  /* ── Type families ───────────────────────────────────────────── */
  --font-display:  "Spectral", "Iowan Old Style", "Hoefler Text", Georgia, serif;
  --font-body:     "Source Sans 3", "Source Sans Pro", -apple-system, "Segoe UI", sans-serif;
  --font-mono:     "JetBrains Mono", "SFMono-Regular", Consolas, monospace;

  /* ── Type scale (8px grid) ───────────────────────────────────── */
  --fs-xs:    0.75rem;    /* 12px – captions, labels */
  --fs-sm:    0.875rem;   /* 14px – meta, breadcrumbs */
  --fs-base:  1rem;       /* 16px – body */
  --fs-md:    1.125rem;   /* 18px – lead */
  --fs-lg:    1.375rem;   /* 22px – Sub-Heading */
  --fs-xl:    1.75rem;    /* 28px – h3 */
  --fs-2xl:   2.25rem;    /* 36px – h2 */
  --fs-3xl:   3rem;       /* 48px – h1 */
  --fs-4xl:   4rem;       /* 64px – display */

  /* Line heights */
  --lh-tight:   1.15;
  --lh-snug:    1.3;
  --lh-normal:  1.55;
  --lh-loose:   1.75;

  /* Letter spacing */
  --ls-display:  -0.01em;
  --ls-tight:    -0.005em;
  --ls-normal:   0;
  --ls-wide:     0.04em;
  --ls-eyebrow:  0.16em;

  /* ── Spacing (8px base) ──────────────────────────────────────── */
  --space-1:   4px;
  --space-2:   8px;
  --space-3:   12px;
  --space-4:   16px;
  --space-5:   24px;
  --space-6:   32px;
  --space-7:   48px;
  --space-8:   64px;
  --space-9:   96px;
  --space-10: 128px;

  /* ── Radii ───────────────────────────────────────────────────── */
  --radius-xs:  2px;
  --radius-sm:  4px;
  --radius-md:  8px;
  --radius-lg:  14px;
  --radius-xl:  24px;
  --radius-pill: 999px;

  /* ── Shadows ─────────────────────────────────────────────────── */
  --shadow-xs:    0 1px 2px rgba(31, 28, 24, 0.06);
  --shadow-sm:    0 2px 6px rgba(31, 28, 24, 0.08);
  --shadow-md:    0 8px 20px -6px rgba(31, 28, 24, 0.14);
  --shadow-lg:    0 20px 40px -12px rgba(31, 28, 24, 0.22);
  --shadow-photo: 0 1px 0 rgba(31, 28, 24, 0.04), 0 18px 32px -16px rgba(31, 28, 24, 0.28);

  /* ── Borders ─────────────────────────────────────────────────── */
  --border-w-thin:    1px;
  --border-w-default: 1.5px;
  --border-w-strong:  3px;

  /* ── Motion ──────────────────────────────────────────────────── */
  --ease-out:    cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
  --dur-fast:    140ms;
  --dur-base:    220ms;
  --dur-slow:    420ms;

  /* ── Layout ──────────────────────────────────────────────────── */
  --container-narrow: 720px;
  --container-base:   1080px;
  --container-wide:   1320px;
  --gutter:           24px;

  /* Beitragsseite / Article View — Lese-Spalte (S-10).
     856 px = tatsächlich gerenderte Breite im has-sidebar-left-Grid
     (R5 2026-05-18): vereinheitlicht normale Artikel + Über-Uns,
     konsistenter Lesefluss, kein visueller Sprung zwischen den
     Artikel-Typen (war 760). */
  --article-content-width: 856px;
  /* Über-Uns (S-11) Sidebar-Spaltenbreite — Mockup-Wert (Grid-Track,
     analog zur --article-content-width-Konvention). */
  --ueber-sidebar-w: 280px;
  /* Über-Uns Gap Sidebar↔Content — Mockup 56 px (kein --space-Token
     deckt 56; eigener Token = token-rein, analog --ueber-sidebar-w). */
  --ueber-col-gap: 56px;

  /* ============================================================
     Cassiopeia / Bootstrap 5 — Variable Overrides
     ============================================================ */

  /* Bootstrap primary → Bordeaux */
  --bs-primary:               var(--brand-bordeaux);
  --bs-primary-rgb:           140, 0, 28;
  --bs-secondary:             var(--brand-gold-deep);
  --bs-secondary-rgb:         154, 120, 38;
  --bs-success:               var(--brand-green);
  --bs-success-rgb:           50, 110, 50;

  /* Bootstrap links → Bordeaux */
  --bs-link-color:            var(--brand-bordeaux);
  --bs-link-color-rgb:        140, 0, 28;
  --bs-link-hover-color:      var(--brand-bordeaux-deep);
  --bs-link-hover-color-rgb:  108, 0, 21;

  /* Bootstrap body / surfaces */
  --bs-body-bg:               var(--bg-page);
  --bs-body-bg-rgb:           250, 246, 239;
  --bs-body-color:            var(--fg-primary);
  --bs-body-color-rgb:        31, 28, 24;
  --bs-emphasis-color:        var(--fg-primary);
  --bs-emphasis-color-rgb:    31, 28, 24;
  --bs-secondary-color:       var(--fg-secondary);
  --bs-tertiary-color:        var(--fg-muted);
  --bs-secondary-bg:          var(--bg-surface-warm);
  --bs-tertiary-bg:           var(--neutral-cream);

  /* Bootstrap typography */
  --bs-body-font-family:      var(--font-body);
  --bs-body-font-size:        var(--fs-base);
  --bs-body-font-weight:      400;
  --bs-body-line-height:      var(--lh-normal);
  --bs-font-sans-serif:       var(--font-body);
  --bs-font-monospace:        var(--font-mono);

  /* Bootstrap borders & radius */
  --bs-border-color:          var(--border-default);
  --bs-border-color-translucent: rgba(31, 28, 24, 0.12);
  --bs-border-width:          var(--border-w-thin);
  --bs-border-radius:         var(--radius-md);
  --bs-border-radius-sm:      var(--radius-sm);
  --bs-border-radius-lg:      var(--radius-lg);
  --bs-border-radius-xl:      var(--radius-xl);
  --bs-border-radius-pill:    var(--radius-pill);

  /* Bootstrap headings & focus */
  --bs-heading-color:         var(--brand-bordeaux);
  --bs-highlight-bg:          var(--brand-gold-tint);
  --bs-focus-ring-color:      rgba(140, 0, 28, 0.25);
  --bs-focus-ring-width:      0.25rem;

  /* Cassiopeia-specific template variables */
  --cassiopeia-color-primary:   var(--brand-bordeaux);
  --template-bg-light:          var(--bg-page);
  --template-bg-light-100:      var(--bg-page);
  --template-bg-light-90:       var(--bg-page);
  --template-bg-light-80:       var(--bg-surface-warm);
  --template-bg-dark:           var(--bg-inverse);
  --template-bg-dark-100:       var(--bg-inverse);
  --template-text-dark:         var(--fg-primary);
  --template-text-light:        var(--neutral-cream);
  --template-link-color:        var(--brand-bordeaux);
  --template-link-hover-color:  var(--brand-bordeaux-deep);
  --template-special-color:     var(--brand-gold);
  --template-special-color-hover: var(--brand-gold-deep);

  /* Cassiopeia color system hue (Bordeaux ≈ 348°) */
  --hue: 348;
}

/* ============================================================================
   Base styles
   ============================================================================ */

html {
  -webkit-text-size-adjust: 100%;
}

html,
body {
  font-family: var(--font-body);
  font-size: var(--fs-base);
  font-weight: 400;
  line-height: var(--lh-normal);
  color: var(--fg-primary);
  background-color: var(--bg-page);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  /* Off-Canvas-Drawer wird via translateX(100%) ausgelagert — kein
     horizontaler Scroll-Bar erzeugen. overflow-x: clip (statt hidden),
     damit position:sticky-Header weiter funktioniert: clip schneidet
     Overflow ab, ohne body zum Scroll-Container zu machen. */
  overflow-x: clip;
  max-width: 100%;
}

h1, h2, h3, h4, h5, h6 {
  font-family: var(--font-display);
  font-weight: 600;
  line-height: var(--lh-snug);
  color: var(--brand-bordeaux);
  letter-spacing: var(--ls-tight);
  text-wrap: balance;
}

h1 { font-size: var(--fs-3xl); line-height: var(--lh-tight); }
h2 { font-size: var(--fs-2xl); }
h3 { font-size: var(--fs-xl);  font-weight: 500; color: var(--fg-primary); letter-spacing: var(--ls-normal); }
h4 { font-size: var(--fs-lg);  font-weight: 500; color: var(--fg-primary); letter-spacing: var(--ls-normal); }
h5 { font-size: var(--fs-md);  font-weight: 500; color: var(--fg-primary); letter-spacing: var(--ls-normal); }
h6 {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 700;
  color: var(--brand-gold-deep);
  text-transform: uppercase;
  letter-spacing: var(--ls-eyebrow);
  line-height: 1;
}

p {
  text-wrap: pretty;
}

a {
  color: var(--fg-link);
  text-decoration-thickness: 1px;
  text-underline-offset: 2px;
  transition: color var(--dur-fast) var(--ease-out);
}

a:hover,
a:focus-visible {
  color: var(--fg-link-hover);
}

/* Outline nur bei echter Keyboard-Navigation (:focus-visible), nicht
   bei Mausklicks — verhindert den gepunkteten Rahmen auf angeklickten
   Links, behält aber Accessibility-Outline für Tab/Pfeiltasten.

   !important auf den Header- und Drawer-Scopes ist nötig: Cassiopeia
   und/oder Bootstrap setzen auf einigen Selektoren `outline: 1px dotted
   #ced4da` für `:focus` (ohne :focus-visible-Unterscheidung), das
   konkurriert mit unserer Regel in der Cascade. Die globale Regel
   (a/button ohne Scope) bleibt ohne !important — dort genügt sie. */
a:focus:not(:focus-visible),
button:focus:not(:focus-visible) {
  outline: none;
}

.container-header a:focus:not(:focus-visible),
.container-header button:focus:not(:focus-visible),
.mvi-drawer a:focus:not(:focus-visible),
.mvi-drawer button:focus:not(:focus-visible) {
  outline: none !important;
  box-shadow: none !important;
}

strong, b { font-weight: 600; }

code, kbd, samp, pre {
  font-family: var(--font-mono);
}

hr {
  border: 0;
  border-top: var(--border-w-thin) solid var(--border-subtle);
  margin: var(--space-5) 0;
}

::selection {
  background: var(--brand-bordeaux);
  color: var(--fg-on-bordeaux);
}

/* ============================================================================
   Typography utilities (composable building blocks)
   ============================================================================ */

.t-display {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-4xl);
  line-height: var(--lh-tight);
  letter-spacing: var(--ls-display);
  color: var(--fg-primary);
  text-wrap: balance;
}

.t-h1 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-3xl);
  line-height: var(--lh-tight);
  letter-spacing: var(--ls-tight);
  color: var(--brand-bordeaux);
  text-wrap: balance;
}

.t-h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-2xl);
  line-height: var(--lh-snug);
  letter-spacing: var(--ls-tight);
  color: var(--brand-bordeaux);
  text-wrap: balance;
}

.t-h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: var(--fs-xl);
  line-height: var(--lh-snug);
  letter-spacing: var(--ls-normal);
  color: var(--fg-primary);
}

.t-lead {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: var(--fs-md);
  line-height: var(--lh-loose);
  color: var(--fg-secondary);
  text-wrap: pretty;
}

.t-body {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: var(--fs-base);
  line-height: var(--lh-normal);
  color: var(--fg-primary);
  text-wrap: pretty;
}

.t-meta {
  font-family: var(--font-body);
  font-weight: 500;
  font-size: var(--fs-sm);
  line-height: var(--lh-snug);
  color: var(--fg-muted);
}

.t-eyebrow {
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--fs-xs);
  line-height: 1;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--brand-gold-deep);
}

.t-quote {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 400;
  font-size: var(--fs-xl);
  line-height: var(--lh-snug);
  color: var(--fg-primary);
}

/* Color hooks */
.u-on-bordeaux { color: var(--fg-on-bordeaux); }
.u-on-green    { color: var(--fg-on-green); }
.u-gold        { color: var(--brand-gold-deep); }
.u-bordeaux    { color: var(--brand-bordeaux); }
.u-green       { color: var(--brand-green); }

/* ============================================================================
   Phase 2 — Header & Navigation
   ----------------------------------------------------------------------------
   Heller Sticky-Header (Cream/White) mit dezenter Bordeaux-Unterkante.
   Logo links, Nav rechts, normale Schrift (kein Uppercase).
   Aktiver Menüpunkt: Bordeaux-Unterstrich.
   Desktop ≥1025 px: horizontale Navigation, Hover-Dropdowns.
   Mobile  ≤1024 px: Hamburger sichtbar, Off-Canvas-Drawer von rechts.
   Markup-Basis: Joomla 6 / Cassiopeia (mod_menu_dropdown-metismenu).
   ============================================================================ */

:root {
  /* Globaler Layout-Breakpoint — per User-Vorgabe auf 1050 px gesetzt:
     ≥ 1051 px Desktop-Layout, ≤ 1050 px Mobile (Drawer). Für spätere
     Phasen konsistent verwenden — CSS-@media nutzt den Hard-Wert. */
  --breakpoint-mobile: 1050px;

  --header-h-desktop: 88px;
  --header-h-tablet:  88px;
  --header-h-mobile:  72px;
  /* Top-Offset des Drawers — Drawer startet direkt unter dem Header,
     damit der Header (sticky, z-100) immer sichtbar und klickbar bleibt.
     Default 88 px für Desktop/Tablet, im Mobile-Media-Query auf 72 px
     überschrieben. Scrim verwendet denselben Offset. */
  --drawer-top:       var(--header-h-tablet);
  --header-pad-y:     14px;
  /* Header-Innenpadding folgt dem 1320-px-Container des Mockups: 48 px
     interne Padding + zentrierter Außenabstand. */
  --header-pad-x:     max(48px, calc((100vw - 1320px) / 2 + 48px));
  /* Drawer-Breite folgt Preview-Messung: 380 px standard (521-1050 px),
     320 px bei ≤ 520 px. Kein vw, damit Landscape (873x402) sauber bleibt. */
  --drawer-w:         380px;
  /* Z-Index-Schema (flach, per User-Vorgabe):
       Seiteninhalt < Header < Scrim < Drawer
     Damit Scrim und Drawer wirklich über dem Header liegen können,
     wird der Drawer per JS aus der Header-Hierarchie auf Body-Ebene
     gehoben (siehe collapse-metismenu.php). Sonst würde der Drawer
     im Stacking-Context des Headers gefangen und kann nie über
     einem Scrim sitzen, der über dem Header liegt. */
  --header-z:        100;
  --scrim-z:         101;
  --drawer-z:        102;
  --toggler-z:        50;  /* unter dem Drawer — wird beim Öffnen verdeckt */
  /* Semantic alias — gleicher Wert wie --fg-primary, separater Name fürs Lesen */
  --fg-default:       var(--fg-primary);
}

/* === PHASE 2 · HEADER & NAVIGATION ======================================= */
/* Sticky Header + Off-Canvas-Drawer (Mobile/Tablet) + horizontale Nav-Bar
   (Desktop). 16 Iterationen (S1-S16) — Detail in DECISIONS.md. Z-Schema:
   Header 100 / Scrim 101 / Drawer 102. Drawer wird per JS auf Body-Level
   verschoben, damit er aus dem Stacking-Context des Headers herauskommt. */

/* ── Header wrapper ───────────────────────────────────────────── */
/* WICHTIG: Diese Regel ist verbindlich (User-Vorgabe) — keine andere
   Regel darf position/top/z-index/background hier überschreiben.
   !important neutralisiert Cassiopeias `.container-header { position:
   relative !important }` Regel bei @media (max-width: 991.98px). */
header.header.container-header,
.container-header.header {
  position: sticky !important;
  top: 0 !important;
  z-index: var(--header-z) !important;
  background: rgba(255, 255, 255, 0.95);
  color: var(--fg-default);
  border-bottom: 4px solid var(--brand-bordeaux);
  box-shadow: 0 1px 0 0 var(--brand-gold);
  margin: 0;
  padding: var(--header-pad-y) var(--header-pad-x);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-5);
  min-height: var(--header-h-desktop);
  isolation: isolate;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}

.container-header.header > .grid-child {
  display: flex;
  align-items: center;
  min-width: 0;
  /* Cassiopeia injiziert padding:8px 8px 16px aufs .grid-child.container-nav
     — das pumpt den Header sonst auf. Wir setzen explizit auf 0. */
  padding: 0;
  margin: 0;
}

.container-header.header > .grid-child.container-nav {
  flex: 1 1 auto;
  justify-content: flex-end;
  padding: 0;
  margin: 0;
}

/* ── Logo / Brand ─────────────────────────────────────────────── */

/* Cassiopeia setzt .navbar-brand auf color:#fff (für sein Default-Dark-Theme).
   Wir überschreiben das, damit currentColor-SVGs nicht weiß-auf-weiß sind. */
.container-header.header .navbar-brand {
  display: inline-flex;
  align-items: center;
  color: var(--fg-default);
  text-decoration: none;
  margin: 0;
  padding: 0;
}

/* Logo-Container ohne Innenrand, damit das Logo bündig am Container-Rand sitzt. */
.container-header.header > .grid-child:first-child {
  padding-left: 0;
  margin-left: 0;
}

.container-header.header .navbar-brand .brand-logo {
  display: inline-flex;
  align-items: center;
  text-decoration: none;
  padding: 0;
  margin: 0;
  border-radius: 0;
  transition: opacity var(--dur-base) var(--ease-out);
}

.container-header.header .navbar-brand .brand-logo:hover,
.container-header.header .navbar-brand .brand-logo:focus-visible {
  opacity: 0.85;
}

/* Cassiopeia-Default-Logo (logo.svg mit fill:#fff) per CSS-content-Replacement
   durch das echte MVI-Logo ersetzen. Sobald in Joomla ein eigenes Logo-Asset
   hinterlegt ist, kann diese content-Regel entfernt werden. */
.container-header.header .navbar-brand .brand-logo .logo {
  content: url('/media/templates/site/cassiopeia_mvi/images/logo.png');
  display: block;
  height: 56px;
  max-height: 56px;
  width: auto;
  filter: none;
}

/* ── Desktop Navigation ───────────────────────────────────────── */
/* Cassiopeia setzt auf .navbar in seinen Mobile-Breakpoints margin-top:1rem.
   Höhere Specificity, um das auf allen Viewports zurückzusetzen. */
header.container-header.header .navbar {
  margin: 0;
  padding: 0;
  display: flex;
  align-items: center;
  flex-wrap: nowrap;
}

.container-header .collapse.navbar-collapse,
.container-header .navbar-collapse {
  flex: 0 1 auto;
}

.container-header .mod-menu.metismenu {
  display: flex;
  align-items: center;
  gap: var(--space-1);
  list-style: none;
  margin: 0;
  padding: 0;
}

.container-header .mod-menu.metismenu > li.metismenu-item {
  position: relative;
  margin: 0;
  padding: 0;
}

.container-header .mod-menu.metismenu > li > a {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 12px 14px;
  font-family: var(--font-body);
  font-size: 0.8125rem;        /* 13 px — Mockup-Match */
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--brand-bordeaux);
  border-bottom: 2px solid transparent;
  transition: color var(--dur-base) var(--ease-out),
              border-color var(--dur-base) var(--ease-out);
}

/* Chevron — inline-flex item, vertikal zentriert via parent align-items: center.
   Kein block/absolute Positioning. ~0.65 em visuelle Breite.
   Cassiopeia setzt .metismenu > li > a::after auf position:absolute;bottom:0;
   left:50%;right:50% (Hover-Underline). Wir überschreiben explizit. */
.container-header .mod-menu.metismenu > li.parent.deeper > a::after {
  content: "";
  display: inline-block;
  position: static;
  bottom: auto;
  left: auto;
  right: auto;
  margin: 0;
  background: none;
  width: 0.45em;
  height: 0.45em;
  flex: 0 0 auto;
  border-right: 1.5px solid currentColor;
  border-bottom: 1.5px solid currentColor;
  transform: rotate(45deg) translate(-0.05em, -0.1em);
  opacity: 0.55;
  transition: transform var(--dur-base) var(--ease-out),
              opacity var(--dur-base) var(--ease-out);
}

.container-header .mod-menu.metismenu > li.parent.deeper:hover > a::after,
.container-header .mod-menu.metismenu > li.parent.deeper:focus-within > a::after {
  /* ∨ → ∧ (Dropdown geöffnet) */
  transform: rotate(225deg) translate(-0.05em, -0.1em);
  opacity: 0.85;
}

/* Hover — gleicher Unterstrich wie aktiv, aber in --brand-bordeaux-soft.
   :focus-visible (Keyboard) bekommt den gleichen Strich. */
.container-header .mod-menu.metismenu > li > a:hover,
.container-header .mod-menu.metismenu > li > a:focus-visible {
  border-bottom-color: var(--brand-bordeaux-soft);
}

/* Aktiv — 2 px Bordeaux-Underline via border-bottom auf dem <a>. Spannt
   die volle Breite des Link-Texts (inkl. Padding + Chevron) wie im Mockup.
   Diese Regel kommt nach :hover, sodass ein aktives Item auch beim Hover
   den dunklen Bordeaux-Strich behält (nicht den softeren Hover-Strich). */
.container-header .mod-menu.metismenu > li.current > a,
.container-header .mod-menu.metismenu > li.active > a,
.container-header .mod-menu.metismenu > li > a[aria-current="page"] {
  color: var(--brand-bordeaux);
  border-bottom-color: var(--brand-bordeaux);
}

/* Hide metismenu's mobile-collapse togglers on desktop */
.container-header .mod-menu.metismenu .mm-toggler {
  display: none;
}

/* ── Desktop + Tablet Dropdowns (hover/focus) ≥641 px ─────────── */
@media (min-width: 1051px) {
  /* Drawer-Header und -Footer im Desktop-Layout ausblenden — sie gehören
     nur in den mobilen Off-Canvas-Drawer. */
  .mvi-drawer-head,
  .mvi-drawer-foot {
    display: none !important;
  }

  /* Hover-Brücke: Submenu darf nicht zumachen, wenn die Maus über die
     Lücke zwischen Parent-Item und Submenu wandert. Das Submenu hat
     padding-top, das den 6-px-Offset zur top:100% des Parents überspannt
     — so bleibt der Hover-Pfad geschlossen. */
  .container-header .mod-menu.metismenu > li.parent.deeper {
    /* Parent-LI bleibt im Hover-Status, solange die Maus über LI oder
       sein Submenu schwebt — die padding-top-Brücke unten sorgt dafür. */
  }

  /* Cassiopeia setzt .mm-collapse standardmäßig auf display: none — wir
     erzwingen display: block, damit Hover-Dropdowns reine CSS-Sache sind. */
  .container-header .mod-menu.metismenu .mm-collapse {
    display: block !important;
    list-style: none;
    margin: 0;
    /* padding-top deckt den 6-px-Hover-Gap zwischen Link-Bottom und
       Submenu-Top ab, damit der Hover nicht abreißt. */
    padding: 14px var(--space-2) var(--space-2);
    position: absolute;
    top: 100%;
    left: 0;
    min-width: 240px;
    background: var(--bg-surface);
    border: var(--border-w-thin) solid var(--border-subtle);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-md);
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transform: translateY(-6px);
    transition: opacity var(--dur-base) var(--ease-out),
                transform var(--dur-base) var(--ease-out),
                visibility var(--dur-base) var(--ease-out);
    z-index: 10;
    max-height: none;
    overflow: visible;
    background-clip: padding-box;
  }

  .container-header .mod-menu.metismenu > li.parent:hover > .mm-collapse,
  .container-header .mod-menu.metismenu > li.parent:focus-within > .mm-collapse,
  .container-header .mod-menu.metismenu > li.parent > .mm-collapse:hover {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transform: translateY(0);
  }

  .container-header .mod-menu.metismenu .mm-collapse > li {
    list-style: none;
    margin: 0;
    padding: 0;
    border-radius: var(--radius-sm);
    transition: background var(--dur-fast) var(--ease-out);
  }

  .container-header .mod-menu.metismenu .mm-collapse > li:hover,
  .container-header .mod-menu.metismenu .mm-collapse > li:focus-within {
    background: var(--brand-bordeaux-tint);
  }

  .container-header .mod-menu.metismenu .mm-collapse > li > a {
    display: block;
    padding: var(--space-3) var(--space-4);
    font-family: var(--font-body);
    font-size: var(--fs-sm);
    font-weight: 500;
    line-height: var(--lh-snug);
    color: var(--fg-primary);
    text-decoration: none;
    border-radius: var(--radius-sm);
    transition: color var(--dur-fast) var(--ease-out);
  }

  .container-header .mod-menu.metismenu .mm-collapse > li:hover > a,
  .container-header .mod-menu.metismenu .mm-collapse > li:focus-within > a {
    color: var(--brand-bordeaux);
    background: transparent;
  }

  /* Aktiver Submenu-Eintrag — Hintergrund auf li (gesamte Zeile),
     nicht nur auf den Link-Text. */
  .container-header .mod-menu.metismenu .mm-collapse > li.current,
  .container-header .mod-menu.metismenu .mm-collapse > li.active {
    background: var(--brand-bordeaux-tint);
  }

  .container-header .mod-menu.metismenu .mm-collapse > li.current > a,
  .container-header .mod-menu.metismenu .mm-collapse > li.active > a {
    color: var(--brand-bordeaux);
    background: transparent;
  }

  /* Hamburger nur auf Mobile sichtbar — Default versteckt */
  .container-header .navbar-toggler {
    display: none !important;
  }

  /* Force horizontal nav at ≥641 px: Bootstrap's .collapse:not(.show) {display:none}
     und .navbar-expand-lg-Bedingungen werden überschrieben. */
  .container-header .collapse.navbar-collapse,
  .container-header .navbar-collapse {
    display: flex !important;
    position: static !important;
    transform: none !important;
    visibility: visible !important;
    width: auto !important;
    height: auto !important;
    max-width: none !important;
    background: transparent !important;
    box-shadow: none !important;
    border: 0 !important;
    padding: 0 !important;
    overflow: visible !important;
  }

  /* Force mod-menu UL horizontal — Bootstrap / metismenu setzt column. */
  .container-header .mod-menu.metismenu {
    display: flex !important;
    flex-direction: row !important;
    align-items: center !important;
    justify-content: flex-end;
    flex-wrap: nowrap !important;
  }

  /* Items dürfen nicht wrappen */
  .container-header .mod-menu.metismenu > li.metismenu-item {
    flex: 0 0 auto;
    white-space: nowrap;
  }
}

/* ── Mobile (≤1050 px): Hamburger + Off-Canvas Drawer ──────────── */
@media (max-width: 1050px) {
  :root {
    --header-pad-x: 24px;
  }

  header.header.container-header,
  .container-header.header {
    min-height: var(--header-h-mobile);
    padding-block: 12px;
  }

  .container-header.header .navbar-brand .brand-logo .logo {
    height: 44px;
    max-height: 44px;
  }

  /* Hamburger sichtbar — Rechteck mit abgerundeten Ecken (6 px) lt. Preview */
  .container-header .navbar-toggler {
    display: inline-grid !important;
    position: relative;
    z-index: var(--toggler-z);
    place-items: center;
    width: 44px;
    height: 44px;
    padding: 0;
    background: transparent;
    border: var(--border-w-thin) solid var(--border-default);
    border-radius: 6px;
    color: var(--fg-default);
    cursor: pointer;
    transition: background var(--dur-base) var(--ease-out),
                border-color var(--dur-base) var(--ease-out),
                color var(--dur-base) var(--ease-out);
  }

  /* Hamburger im Open-State komplett ausblenden — der runde X-Button im
     Drawer-Head übernimmt das Schließen. Vorher morphte der Hamburger
     zum X (Phase-2-S7); aktuelle Designentscheidung: zwei „Schließen"-
     Elemente waren redundant. Display:none mit !important, weil
     spätere Phase-2-Regeln Background-Defaults durchsetzen. */
  .container-header .navbar-toggler[aria-expanded="true"] {
    display: none !important;
  }

  /* Kein Hover-Background-Wechsel — der Button bleibt im Ruhezustand
     transparent. Vorher hatte :hover einen sand-farbenen Fill, der nach
     dem Schließen hängenblieb (Cursor steht weiter auf dem Button) und
     cremig wirkte. */
  .container-header .navbar-toggler:hover {
    background: transparent;
    border-color: var(--border-strong);
  }

  /* Active/Focus: kein Bordeaux-Filled-State beim Klick. Per User-Vorgabe. */
  .container-header .navbar-toggler:active,
  .container-header .navbar-toggler:focus,
  .container-header .navbar-toggler:focus-visible {
    background-color: transparent !important;
    box-shadow: none !important;
    outline: none !important;
    border-color: var(--border-default) !important;
  }

  /* Im offenen Zustand darf der Bordeaux-Background-State (oben) für die
     Open-State-Optik gelten — :active/:focus dürfen ihn nicht zurücksetzen. */
  .container-header .navbar-toggler[aria-expanded="true"]:active,
  .container-header .navbar-toggler[aria-expanded="true"]:focus,
  .container-header .navbar-toggler[aria-expanded="true"]:focus-visible {
    background-color: var(--brand-bordeaux) !important;
    border-color: var(--brand-bordeaux) !important;
  }

  /* 3-Bar Hamburger via .icon-menu */
  .container-header .navbar-toggler .icon-menu {
    position: relative;
    display: block;
    width: 18px;
    height: 2px;
    background: currentColor;
    border-radius: 1px;
    transition: background var(--dur-fast) var(--ease-out);
  }

  .container-header .navbar-toggler .icon-menu::before,
  .container-header .navbar-toggler .icon-menu::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    height: 2px;
    background: currentColor;
    border-radius: 1px;
    transition: transform var(--dur-base) var(--ease-out);
  }

  .container-header .navbar-toggler .icon-menu::before { top: -6px; }
  .container-header .navbar-toggler .icon-menu::after  { top: 6px;  }

  /* Open-State — Bars verschwinden + werden zu X. Hamburger selbst
     bekommt Bordeaux-Bg (über der Mobile-Top-Level-Regel oben). */
  .container-header .navbar-toggler[aria-expanded="true"] .icon-menu {
    background: transparent;
  }

  .container-header .navbar-toggler[aria-expanded="true"] .icon-menu::before {
    transform: translateY(6px) rotate(45deg);
  }

  .container-header .navbar-toggler[aria-expanded="true"] .icon-menu::after {
    transform: translateY(-6px) rotate(-45deg);
  }

  /* Off-Canvas-Drawer von rechts. Bootstrap-Collapse aushebeln und volle
     Viewport-Höhe erzwingen — sonst überschreibt Bootstrap inline height.
     Transition-Werte 1:1 vom Preview: transform 360ms cubic-bezier(0.16,1,0.3,1).
     Visibility-Diskret-Transition mit 360ms-Delay sorgt dafür, dass der
     Drawer beim Schließen erst komplett rausfliegt, dann unsichtbar wird
     (sonst snappt er sofort weg). Beim Öffnen visibility instant. */
  .mvi-drawer.collapse,
  .mvi-drawer {
    display: block !important;
    position: fixed !important;
    top: var(--drawer-top) !important;
    right: 0 !important;
    bottom: 0 !important;
    left: auto !important;
    width: var(--drawer-w) !important;
    max-width: none !important;
    /* Drawer-Höhe = sichtbarer Viewport minus Header-Höhe.
       --real-vh wird per JS aus window.innerHeight gesetzt (auf resize,
       orientationchange, DOMContentLoaded) — bezieht die mobile Browser-UI
       (Adressleiste, Tab-Bar) verlässlich mit ein. 100dvh als Fallback
       für Browser ohne JS oder vor JS-Init. Vom Viewport-Wert wird der
       Drawer-Top-Offset abgezogen, damit Drawer + Header zusammen exakt
       den sichtbaren Bereich füllen. */
    height: calc(var(--real-vh, 100dvh) - var(--drawer-top)) !important;
    background: var(--bg-drawer) !important;
    color: var(--fg-primary);
    transform: translateX(100%);
    transition: transform 360ms cubic-bezier(0.16, 1, 0.3, 1),
                visibility 0s linear 360ms;
    z-index: var(--drawer-z);
    /* Outer-Overflow: hidden — der Scroll passiert NUR im mittleren
       Menu-Bereich (siehe Layout-Regel weiter unten). */
    overflow: hidden !important;
    overscroll-behavior: contain;
    box-shadow: -24px 0 60px rgba(20, 14, 12, 0.25) !important;
    border-left: var(--border-w-thin) solid var(--border-subtle) !important;
    padding: 0 !important;
    visibility: hidden;
  }

  .mvi-drawer.collapse.show,
  .mvi-drawer.show {
    transform: translateX(0);
    visibility: visible;
    transition: transform 360ms cubic-bezier(0.16, 1, 0.3, 1),
                visibility 0s linear 0s;
  }

  /* Drawer-Head: Titel "Musikverein Illmensee e.V." + Schließen-Button.
     Eingefügt durch HTML-Override templates/cassiopeia_mvi/html/mod_menu/
     collapse-metismenu.php. */
  .mvi-drawer-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    padding: 22px 26px;
    border-bottom: var(--border-w-thin) solid var(--border-subtle);
    background: var(--bg-drawer);
  }

  .mvi-drawer-eyebrow {
    font-family: var(--font-body);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--brand-bordeaux);
  }

  .mvi-drawer-close {
    width: 40px;
    height: 40px;
    border: var(--border-w-thin) solid var(--border-default);
    border-radius: 999px;
    background: transparent;
    color: var(--fg-default);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    padding: 0;
    transition: background var(--dur-base) var(--ease-out),
                color var(--dur-base) var(--ease-out),
                border-color var(--dur-base) var(--ease-out);
  }

  .mvi-drawer-close:hover,
  .mvi-drawer-close:focus-visible {
    background: var(--brand-bordeaux);
    color: var(--fg-on-bordeaux);
    border-color: var(--brand-bordeaux);
    outline: none;
  }

  .mvi-drawer-close svg {
    width: 20px;
    height: 20px;
    display: block;
  }

  /* Drawer-Menüpunkte gestapelt, numeriert */
  .mvi-drawer .mod-menu.metismenu {
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    counter-reset: mvi-nav;
    padding: 14px 0;
    flex: 1;
  }

  .mvi-drawer .mod-menu.metismenu > li.metismenu-item {
    /* Cassiopeia/Bootstrap setzt .metismenu-item auf display: flex und
       padding: 8.8px 17.6px (von .nav-item-Default-Styling), wodurch das
       LI ca. 18 px höher ist als der Link drin → Items wirken zu hoch.
       Block-Display + Padding/Margin explizit 0 setzen, damit die LI-
       Höhe exakt der Link-Höhe folgt. */
    display: block;
    padding: 0;
    margin: 0;
    counter-increment: mvi-nav;
    border-bottom: var(--border-w-thin) solid rgba(20, 14, 12, 0.06);
  }

  /* Item-Sizing folgt Preview-Messung Tablet/Landscape (521-1050 px):
     padding 18 26, label 26 px, num-column 44 px, gap 14 px. */
  .mvi-drawer .mod-menu.metismenu > li > a {
    display: grid;
    grid-template-columns: 44px 1fr auto;
    align-items: center;
    gap: 14px;
    padding: 18px 26px;
    font-family: var(--font-display);
    font-size: 26px;
    font-weight: 500;
    letter-spacing: -0.01em;
    line-height: 1.1;
    text-transform: none;
    text-align: left;
    color: var(--fg-default);
    border-bottom: 0;
    text-decoration: none;
    position: relative;
  }

  .mvi-drawer .mod-menu.metismenu > li > a::before {
    content: "0" counter(mvi-nav);
    font-family: var(--font-display);
    font-style: italic;
    font-weight: 400;
    font-size: 13px;
    font-variant-numeric: tabular-nums;
    color: var(--brand-gold);
    opacity: 0.85;
    letter-spacing: var(--ls-normal);
    text-transform: none;
    align-self: center;
    /* Cassiopeia ::after-Underline-Hack neutralisieren */
    position: static;
    background: none;
    height: auto;
    margin: 0;
  }

  /* Chevron (>) für Parent-Items — nur einer (Cassiopeia / metismenu
     mm-toggler unten ausgeblendet, keine Duplikate). */
  .mvi-drawer .mod-menu.metismenu > li.parent.deeper > a::after {
    content: "";
    width: 8px;
    height: 8px;
    border: 0;
    border-right: var(--border-w-default) solid var(--neutral-grey-400);
    border-bottom: var(--border-w-default) solid var(--neutral-grey-400);
    transform: rotate(-45deg);
    opacity: 1;
    margin-left: auto;
    align-self: center;
    position: static;
    background: none;
  }

  .mvi-drawer .mod-menu.metismenu > li > a:hover,
  .mvi-drawer .mod-menu.metismenu > li > a:focus-visible {
    color: var(--brand-bordeaux);
    background: rgba(108, 0, 21, 0.04);
    text-decoration: none;
  }

  /* Aktiver Eintrag: Highlight auf LI (volle Drawer-Breite garantiert),
     Bordeaux-Side-Rail via box-shadow inset auf LI. Link nur Color +
     text-decoration: none (gegen Browser-Default-Underline für <a>). */
  .mvi-drawer .mod-menu.metismenu > li.current,
  .mvi-drawer .mod-menu.metismenu > li.active {
    background: rgba(108, 0, 21, 0.05);
    box-shadow: inset 3px 0 0 var(--brand-bordeaux);
  }

  .mvi-drawer .mod-menu.metismenu > li.current > a,
  .mvi-drawer .mod-menu.metismenu > li.active > a,
  .mvi-drawer .mod-menu.metismenu > li > a[aria-current="page"] {
    color: var(--brand-bordeaux);
    background: transparent;
    text-decoration: none;
    border-bottom: 0;
    box-shadow: none;
  }

  /* Mobile-Submenü: Accordion-Verhalten. Klick auf .mm-toggler-Button
     (rechts neben dem Link) klappt das Submenü auf/zu. Klick auf den
     Link selbst navigiert wie gewohnt. */

  /* Parent-LI bekommt position:relative, damit der absolute Toggler
     darin verankert ist. */
  .mvi-drawer .mod-menu.metismenu > li.parent.deeper {
    position: relative;
  }

  /* Chevron-Pseudo am Link ausblenden — der Toggler-Button trägt sein
     eigenes Chevron (sichtbar + klickbar). Vermeidet zwei Chevrons. */
  .mvi-drawer .mod-menu.metismenu > li.parent.deeper > a::after {
    display: none;
  }

  /* Toggler-Button: 56-px-Klickfläche am rechten Rand des LIs. Liegt
     visuell ÜBER dem Link, damit Klicks auf den Chevron-Bereich nicht
     den Link triggern. Hintergrund transparent — sichtbares Chevron
     kommt aus dem ::before-Pseudo des Togglers. */
  .mvi-drawer .mod-menu.metismenu .mm-toggler {
    display: block;
    position: absolute;
    top: 0;
    right: 0;
    width: 56px;
    height: 53px;          /* matched die Item-Höhe (link 52 + 1 border) */
    background: transparent;
    border: 0;
    padding: 0;
    margin: 0;
    cursor: pointer;
    z-index: 2;
    appearance: none;
  }

  .mvi-drawer .mod-menu.metismenu .mm-toggler:focus {
    outline: none;
  }

  /* Chevron-Pseudo am Toggler — rotiert 90° beim Öffnen. */
  .mvi-drawer .mod-menu.metismenu .mm-toggler::before {
    content: "";
    position: absolute;
    top: 50%;
    right: 22px;
    width: 8px;
    height: 8px;
    border: 0;
    border-right: var(--border-w-default) solid var(--neutral-grey-400);
    border-bottom: var(--border-w-default) solid var(--neutral-grey-400);
    transform: translateY(-50%) rotate(-45deg);
    transform-origin: center;
    transition: transform 360ms cubic-bezier(0.16, 1, 0.3, 1);
  }

  .mvi-drawer .mod-menu.metismenu > li.is-open > .mm-toggler::before {
    transform: translateY(-50%) rotate(45deg);
  }

  /* Bootstrap setzt auf .mm-toggler::after eine Dropdown-Triangle aus
     border-top + transparente Seiten — die zeigt sich neben unserem
     eigenen Chevron als Doppel-Indikator. Explizit ausblenden. */
  .mvi-drawer .mod-menu.metismenu .mm-toggler::after {
    display: none;
  }

  /* Submenu-Container: animierte max-height (Wert wird per JS gesetzt).
     Cassiopeia/metismenu setzt .mm-collapse standardmäßig auf
     position: absolute — dadurch verlässt es den Layout-Flow und schiebt
     keine Geschwister-Items nach unten. Wir erzwingen position: static
     plus volle Breite, damit das Submenü zwischen den Parent- und das
     nächste Item geschoben wird. */
  .mvi-drawer .mod-menu.metismenu .mm-collapse {
    display: block !important;
    position: static !important;
    width: 100% !important;
    list-style: none;
    margin: 0;
    padding: 0;
    max-height: 0;
    overflow: hidden;
    background: rgba(20, 14, 12, 0.04);
    transition: max-height 360ms cubic-bezier(0.16, 1, 0.3, 1);
  }

  /* Submenu-Items — kleiner, eingerückt, dezent.
     display: block ist Pflicht — Cassiopeia setzt .metismenu-item (auch
     auf Level 2!) sonst auf display: flex, dadurch shrinkt das <a> als
     Flex-Item auf Content-Breite und Highlight färbt nicht die volle
     Drawer-Breite. */
  .mvi-drawer .mod-menu.metismenu .mm-collapse > li {
    display: block;
    list-style: none;
    margin: 0;
    padding: 0;
    border-bottom: var(--border-w-thin) solid rgba(20, 14, 12, 0.05);
    transition: background var(--dur-fast) var(--ease-out);
  }

  .mvi-drawer .mod-menu.metismenu .mm-collapse > li:last-child {
    border-bottom: 0;
  }

  .mvi-drawer .mod-menu.metismenu .mm-collapse > li > a {
    display: block;
    width: 100%;
    box-sizing: border-box;
    /* Eingerückt — alignt mit dem Label-Start des Parent-Items
       (Counter-Spalte 36 + gap 12 = 48 px). Bei ≤520 px ist das
       Drawer-Padding 22, also 22 + 48 = 70 px Einrückung. */
    padding: 12px 22px 12px 70px;
    font-family: var(--font-display);
    font-size: 15px;
    font-weight: 500;
    line-height: 1.35;
    color: var(--fg-default);
    text-decoration: none;
    transition: color var(--dur-fast) var(--ease-out);
  }

  /* Highlight liegt am LI — färbt damit die volle Drawer-Breite,
     unabhängig davon dass das <a> innen ist (display: block + 100%). */
  .mvi-drawer .mod-menu.metismenu .mm-collapse > li:hover,
  .mvi-drawer .mod-menu.metismenu .mm-collapse > li:focus-within {
    background: rgba(108, 0, 21, 0.04);
  }

  .mvi-drawer .mod-menu.metismenu .mm-collapse > li:hover > a,
  .mvi-drawer .mod-menu.metismenu .mm-collapse > li:focus-within > a {
    color: var(--brand-bordeaux);
  }

  .mvi-drawer .mod-menu.metismenu .mm-collapse > li.current,
  .mvi-drawer .mod-menu.metismenu .mm-collapse > li.active {
    background: rgba(108, 0, 21, 0.06);
  }

  .mvi-drawer .mod-menu.metismenu .mm-collapse > li.current > a,
  .mvi-drawer .mod-menu.metismenu .mm-collapse > li.active > a {
    color: var(--brand-bordeaux);
  }

  /* Drawer-Foot: statische Inhalte (Probelokal/Kontakt/Claim) aus dem
     HTML-Override. */
  .mvi-drawer-foot {
    padding: 22px 26px 28px;
    border-top: var(--border-w-thin) solid var(--border-subtle);
    background: var(--bg-drawer-foot);
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin-top: auto;
  }

  .mvi-drawer-foot-row {
    display: flex;
    flex-direction: column;
    gap: 2px;
  }

  /* Foot-Texte alle in --fg-default (Anthrazit) wie im Preview — kein
     Muted-Grey. */
  .mvi-drawer-foot-label {
    font-family: var(--font-body);
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--fg-default);
  }

  .mvi-drawer-foot-val {
    font-family: var(--font-body);
    font-size: 14px;
    color: var(--fg-default);
  }

  /* Drawer-Inhalt als Flex-Column. Drei feste Bereiche:
       Head (flex 0 0 auto)   — bleibt immer oben sichtbar
       Menu (flex 1 1 auto)   — scrollt wenn Inhalt nicht passt
       Foot (flex 0 0 auto)   — bleibt immer unten sichtbar
     align-items: stretch / flex-wrap: nowrap explizit, weil Bootstrap/
     Cassiopeia sonst align-items: center und flex-wrap: wrap setzt
     (Inhalte würden horizontal in mehrere Flex-Spalten brechen). */
  .mvi-drawer.collapse,
  .mvi-drawer {
    display: flex !important;
    flex-direction: column !important;
    align-items: stretch !important;
    flex-wrap: nowrap !important;
    /* overflow: hidden auf dem Drawer-Container — der Scroll passiert
       NUR im mittleren Menu-Bereich, nicht am Drawer-Outer. */
    overflow: hidden !important;
  }

  .mvi-drawer-head,
  .mvi-drawer-foot {
    flex: 0 0 auto;
  }

  /* Scrollbarer Mittelteil — Menu-UL bekommt overflow-y: auto und
     -webkit-overflow-scrolling: touch für Momentum-Scroll auf iOS. */
  .mvi-drawer .mod-menu.metismenu {
    flex: 1 1 auto !important;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    overscroll-behavior: contain;
  }

  /* Scrim als persistentes ::before auf <html> — NICHT auf .container-header,
     weil dort backdrop-filter:blur(8px) gesetzt ist. Per CSS-Spec macht
     backdrop-filter (wie filter/transform) das Element zum containing-block
     für fixed-positionierte Descendants, wodurch ein .container-header::before
     mit position:fixed/inset:0 nur die Header-Bounds (~72 px hoch) abdeckt,
     nicht den ganzen Viewport. <html> ist garantiert die viewport-Größe. */
  html::before {
    content: "";
    position: fixed;
    /* Scrim startet unter dem Header — gleicher Offset wie der Drawer.
       Damit bleibt der sticky Header bei offenem Drawer ungedimmt und
       sichtbar/klickbar. */
    top: var(--drawer-top);
    left: 0;
    right: 0;
    bottom: 0;
    background: rgba(20, 14, 12, 0.55);
    backdrop-filter: blur(2px);
    -webkit-backdrop-filter: blur(2px);
    z-index: var(--scrim-z);
    pointer-events: none;
    opacity: 0;
    visibility: hidden;
    transition: opacity 220ms cubic-bezier(0.16, 1, 0.3, 1),
                visibility 0s linear 220ms;
  }

  html:has(.mvi-drawer.show)::before {
    opacity: 1;
    visibility: visible;
    transition: opacity 220ms cubic-bezier(0.16, 1, 0.3, 1),
                visibility 0s linear 0s;
  }

  /* Scroll-Lock auf html UND body — iOS Safari sperrt das Body-Scroll nur
     dann zuverlässig, wenn auch html overflow:hidden bekommt. */
  html:has(.mvi-drawer.show),
  body:has(.mvi-drawer.show) {
    overflow: hidden;
  }

  /* Bei offenem Drawer: Header von sticky auf fixed. Der Scroll-Lock oben
     (html { overflow: hidden }) nimmt dem position:sticky-Header seinen
     Scroll-Container — er fiele sonst auf seine Fluss-Position (Dokument-
     Oberkante) zurück und säße nach dem Scrollen oberhalb des Viewports.
     position: fixed ist viewport-relativ und damit immun gegen den
     Scroll-Lock; der Header bleibt oben sichtbar. z-index (100) kommt
     unverändert aus der Header-Basisregel. */
  html:has(.mvi-drawer.show) header.header.container-header,
  html:has(.mvi-drawer.show) .container-header.header {
    position: fixed !important;
    top: 0 !important;
    left: 0 !important;
    right: 0 !important;
  }

  /* Kompensiert den Fluss-Verlust des jetzt fixed-Headers: ohne diese
     Padding-Reserve spränge der restliche Seiteninhalt beim Drawer-Öffnen
     um die Header-Höhe nach oben. --drawer-top entspricht exakt der
     Header-Höhe (88/72 px) → der Inhalt bleibt ruhig stehen. */
  body:has(.mvi-drawer.show) {
    padding-top: var(--drawer-top);
  }
}

/* Tablet-Breakpoint (521-1049 px): Header bleibt auf Desktop-Höhe (88 px)
   und Desktop-Logo (56 px) — User-Vorgabe. Drawer/Hamburger-Logik aus dem
   @media (max-width: 1050 px)-Block oben bleibt aktiv; wir überschreiben
   nur die Header- und Logo-Maße zurück auf Desktop-Werte. */
@media (min-width: 521px) and (max-width: 1050px) {
  header.header.container-header,
  .container-header.header {
    min-height: var(--header-h-tablet);
    padding-block: var(--header-pad-y);
  }

  .container-header.header .navbar-brand .brand-logo .logo {
    height: 56px;
    max-height: 56px;
  }
}

/* Sub-Breakpoint für schmale Mobile-Viewports (≤ 520 px): Drawer wird
   noch schmaler (320 px), Item-Sizing reduziert sich. Werte 1:1 aus dem
   Preview übernommen (drawer 320, link padding 14 22, label 22 px,
   num column 36 px). Header- und Logo-Größen ebenfalls reduziert. */
@media (max-width: 520px) {
  :root {
    --drawer-w: 320px;
    /* Drawer (und Scrim) starten bei ≤ 520 px direkt unter dem 72-px-
       Header — nicht unter dem 88-px-Default. */
    --drawer-top: var(--header-h-mobile);
  }

  header.header.container-header,
  .container-header.header {
    min-height: var(--header-h-mobile);
    padding-block: 12px;
  }

  .container-header.header .navbar-brand .brand-logo .logo {
    height: 44px;
    max-height: 44px;
  }

  /* Drawer-Item-Sizing für schmale Mobile-Viewports (≤ 520 px) — Preview-
     Match. Selector verwendet .mvi-drawer, weil der Drawer per JS auf
     Body-Level steht und .container-header-Ancestor nicht mehr matched. */
  .mvi-drawer .mod-menu.metismenu > li > a {
    grid-template-columns: 36px 1fr auto;
    gap: 12px;
    padding: 14px 22px;
    font-size: 22px;
  }

  .mvi-drawer-head,
  .mvi-drawer-foot {
    padding-left: 22px;
    padding-right: 22px;
  }
}

/* Druck-Ansicht: Sticky-Header / Schatten / Backdrop-Blur entfernen, damit
   der Print-Output kein doppeltes Header-Layout zeigt. */
@media print {
  header.header.container-header,
  .container-header.header {
    position: static;
    background: transparent;
    border-bottom: var(--border-w-thin) solid var(--border-subtle);
    box-shadow: none;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    padding: var(--space-3) 0;
  }
  .container-header .navbar-toggler,
  .container-header .navbar-collapse { display: none; }
}

/* === PHASE 3 · HERO ====================================================== */
/* Hero-Sektion als mod_custom auf banner-Position.
   Layout: <section.mvi-hero> > <.mvi-hero__media> ( <img.mvi-hero__photo>
     + <.mvi-hero__overlay> ) + <.mvi-hero__content>.
   Bild als echtes <img> mit object-fit: cover + object-position: center center.
   Höhen-Cap pro Viewport via --hero-h-* Tokens — bei breiten Viewports
   greift der Cap, das Bild wird vertikal zentriert gecroppt. Aktuelles
   Bild (2560×853) hat die Kapelle bereits vertikal zentriert komponiert. */

:root {
  --hero-h-desktop:   550px;
  --hero-h-tablet:    300px;
  --hero-h-mobile:    220px;
  --hero-h-ultrawide: 850px;   /* ≥ 2560 px — knapp unter Nativ-Bildhöhe 853 px */

  /* Overlay deaktiviert — das Bild bleibt brilliant, das Bordeaux-Panel
     trägt seinen eigenen Lesbarkeits-Kontrast. Bei Bedarf einen Gradient
     zurücksetzen, sobald Texte ohne Panel platziert werden sollen. */
  --hero-overlay: none;
}

/* Banner-Container Reset — nur greifen, wenn ein .mvi-hero darin liegt
   (Hero-Modul aktiv). DJ-Slider-Banner auf Unterseiten bleibt unangetastet. */
.container-banner:has(.mvi-hero) {
  padding: 0;
  margin: 0;
  max-width: none;
}
.container-banner:has(.mvi-hero) .mod-custom {
  padding: 0;
  margin: 0;
}

/* Hero-Wurzel ----------------------------------------------------------- */
.mvi-hero {
  position: relative;                              /* Anker für absoluten __content */
  width: 100%;
  overflow: hidden;
  border-bottom: 1px solid var(--brand-gold);
}
/* Über-Uns-Itemids: Mockup-Hero ohne Gold-Unterkante (Startseite +
   übrige Hero-Seiten behalten den Strich — scoped). */
body.itemid-1002 .mvi-hero,
body.itemid-979 .mvi-hero,
body.itemid-937 .mvi-hero,
body.itemid-938 .mvi-hero {
  border-bottom: 0;
}

/* Media-Container: hält <img> + Overlay, clippt überstehende Bildhöhe. */
.mvi-hero__media {
  position: relative;
  width: 100%;
  overflow: hidden;
  max-height: var(--hero-h-desktop);
}

/* Das echte <img>: object-fit: cover füllt den Container,
   object-position: center center hält die vertikale Mitte des Bildes
   im Sichtfeld. Bild (2560×853) hat die Kapelle vertikal zentriert
   komponiert — center center crop schneidet symmetrisch oben + unten.
   (Seefest-Unterseite überschreibt object-position separat, scoped —
   siehe „SEEFEST-UNTERSEITE HERO" weiter unten.) */
.mvi-hero__photo {
  display: block;
  width: 100%;
  height: auto;
  max-height: var(--hero-h-desktop);
  object-fit: cover;
  object-position: center center;
}

/* Ultrawide ≥ 2560 px: Höhen-Cap anheben. Bei sehr breiten Viewports
   skaliert object-fit:cover das 3:1-Bild auf die volle Breite hoch und
   beschneidet bei 550-px-Cap Ober-/Unterkante zu stark — die Köpfe der
   hinteren Reihe verschwinden. --hero-h-ultrawide (850 px) liegt knapp
   unter der nativen Bildhöhe (853 px) → nahezu volle Bildfläche, ohne
   dass cover seitlich zu beschneiden beginnt. object-fit/object-position
   bleiben unverändert. */
@media (min-width: 2560px) {
  .mvi-hero__media,
  .mvi-hero__photo {
    max-height: var(--hero-h-ultrawide);
  }
}

/* === SEEFEST-UNTERSEITE HERO (nur /seefest, Menüpunkt itemid-1081) ========
   Hero = mod_custom (docs/hero-seefest.html, banner-Position) mit dem
   Seefest-Zeltfoto (4:3, 1920×1440). Problem: ein 4:3-Bild liegt mit
   `height:auto` IMMER über dem `--hero-h-*`-Cap → Hero klemmt hart auf
   den Cap und springt am 1050-px-Breakpoint (300→550 px), während der
   Startseiten-Hero (3:1-Panorama, nie gecappt) flüssig mitskaliert.
   Lösung: erzwungenes 3:1-Seitenverhältnis (2560/853 = Startseite.jpg)
   → `height:auto` liefert width·853/2560 (bei jedem VP unter dem Cap,
   Cap damit inaktiv) → Höhe skaliert flüssig, exakt identisch zur
   Startseite. `object-fit: cover` + `object-position: center 10%`
   croppen das 4:3-Bild in die 3:1-Box (Zeltdach + Publikum sichtbar,
   weniger Decke). Scoped auf `body.itemid-1081` — Startseite + alle
   anderen Hero-Seiten unberührt. */
body.itemid-1081 .mvi-hero__photo {
  object-position: center 10%;
  aspect-ratio: 2560 / 853;
}

/* Overlay ist standardmäßig deaktiviert — nur Hero-Sektionen mit
   Text-Content brauchen den Lesbarkeits-Wash. */
.mvi-hero__overlay {
  position: absolute;
  inset: 0;
  background: none;
  pointer-events: none;
}

/* Modifier .mvi-hero--has-text aktiviert den Gradient-Wash. */
.mvi-hero--has-text .mvi-hero__overlay {
  background: var(--hero-overlay);
}

/* Content-Container ist ein Bordeaux-Panel mit Cream-Texten — eigenes
   "Card"-Element unten-links, schwebt vor dem Foto. Größe richtet sich
   nach Inhalt (inline-flex). Modifier-gescoped, damit Heroes ohne Texte
   keinen leeren Panel-Streifen zeigen. */
.mvi-hero--has-text .mvi-hero__content {
  position: absolute;
  bottom: 32px;
  left: 32px;
  right: auto;
  padding: 20px 28px 24px;
  max-width: 440px;
  display: inline-flex;
  flex-direction: column;
  gap: 10px;
  background: rgba(140, 0, 28, 0.45);
  border-radius: var(--radius-md);
}

/* Typografie im Hero ----------------------------------------------------- */
/* text-shadow auf allen Texten — sichert Lesbarkeit auf Bildbereichen,
   die der --hero-overlay-Gradient nicht stark genug abdunkelt. */
/* Eyebrow: plain Text auf dem Bordeaux-Panel. */
.mvi-hero__eyebrow {
  margin: 0;
  padding: 0;
  background: none;
  border-radius: 0;
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: rgba(245, 240, 235, 0.78);
  text-shadow: none;
}

/* Title auf dem Panel: kein text-shadow nötig — Panel trägt Kontrast.
   Clamp 22..2.4vw..38: schlanker, passend zum kompakten Panel. */
.mvi-hero__title {
  margin: 0;
  font-family: var(--font-display);
  font-size: clamp(22px, 2.4vw, 38px);
  font-weight: 600;
  line-height: 1.1;
  color: var(--neutral-cream);
  text-shadow: none;
}

/* Sub: plain Text auf dem Bordeaux-Panel, helleres Cream als Eyebrow für
   bessere Lesbarkeit (88% vs 75%). */
.mvi-hero__sub {
  margin: 0;
  padding: 0;
  background: none;
  border-radius: 0;
  font-family: var(--font-body);
  font-size: 14px;
  font-weight: 500;
  color: rgba(245, 240, 235, 0.88);
  text-shadow: none;
}

/* Hero-spezifische CTA-Variante: gefüllt Bordeaux mit Cream-Text. Auf dem
   hellen Bandfoto-Hintergrund braucht der Button eine echte Fläche statt
   nur Border. Globale .mvi-btn--ghost-light bleibt Cream-on-Dark für
   andere Komponenten.

   Hohe Spezifität (.mvi-hero.mvi-hero--has-text + .mvi-hero__content + a-Tag
   = 0,4,1) + !important, weil der spätere globale ghost-light-Block im
   File identische Spezifität (0,2,0) hat und durch Quellreihenfolge gewinnen
   würde. */
.mvi-hero.mvi-hero--has-text .mvi-hero__content a.mvi-btn--ghost-light,
.mvi-hero.mvi-hero--has-text .mvi-hero__content .mvi-btn--ghost-light {
  background: var(--neutral-cream) !important;
  border: 1px solid var(--neutral-cream) !important;
  color: var(--brand-bordeaux) !important;
  font-size: 13px !important;
  font-weight: 600 !important;
  padding: 8px 18px !important;
  text-shadow: none !important;
  box-shadow: none !important;
  align-self: flex-start !important;
}
.mvi-hero.mvi-hero--has-text .mvi-hero__content a.mvi-btn--ghost-light:hover,
.mvi-hero.mvi-hero--has-text .mvi-hero__content .mvi-btn--ghost-light:hover {
  background: var(--neutral-sand) !important;
  border-color: var(--neutral-sand) !important;
  color: var(--brand-bordeaux) !important;
}

/* CTA: echter Ghost — transparent + heller Border.
   Token-konform: --border-w-default (1.5 px), --space-3 (12 px) und
   --space-5 (24 px) für Padding, --radius-sm (4 px) für Radius. */
.mvi-hero .mvi-btn--ghost-light,
.mvi-btn--ghost-light {
  display: inline-flex;
  align-items: center;
  padding: var(--space-3) var(--space-5);
  border: var(--border-w-default) solid var(--neutral-cream);
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--neutral-cream);
  font-family: var(--font-body);
  font-size: 14px;
  font-weight: 600;
  text-decoration: none;
  transition: background 200ms ease;
  align-self: flex-start;
}

.mvi-hero .mvi-btn--ghost-light:hover,
.mvi-btn--ghost-light:hover {
  background: rgba(255, 255, 255, 0.15);
  color: var(--neutral-cream);
}

.mvi-hero .mvi-btn--ghost-light:focus-visible,
.mvi-btn--ghost-light:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 3px;
}

/* Tablet: 521 .. 1050 px ------------------------------------------------ */
@media (max-width: 1050px) {
  .mvi-hero__media,
  .mvi-hero__photo {
    max-height: var(--hero-h-tablet);
  }
  .mvi-hero__content {
    padding: 0 32px 28px;
    gap: 10px;
    max-width: 480px;
  }
  /* Title ist auf Tablet komplett ausgeblendet. */
  .mvi-hero__title {
    display: none;
  }
}

/* Mid-Range (1051..1280 px): Sub ausblenden — bei flacherem 3:1-Bild
   würde das Panel sonst die mittlere Reihe der Kapelle verdecken.
   Sub kommt erst ab 1281 px wieder zurück. Mobile ist via .mvi-hero__content
   display:none ohnehin abgedeckt. */
@media (max-width: 1280px) {
  .mvi-hero__sub {
    display: none;
  }
}

/* Tablet exklusiv (ohne Mobile): Content komplett ausblenden — nur das
   Bild bleibt sichtbar. Sauberer Hero ohne Text-Overlay. Mobile (≤ 520)
   regelt seinen eigenen `display: none` weiter unten.
   Selektor muss `.mvi-hero--has-text` mit-tragen, damit er gegen die
   Spezifität 0,2,0 der Panel-Default-Regel (display: inline-flex) gewinnt. */
@media (min-width: 521px) and (max-width: 1050px) {
  .mvi-hero--has-text .mvi-hero__content,
  .mvi-hero__content {
    display: none;
  }
}

/* Social Buttons im Hero ------------------------------------------------ */
/* Floatender Pillen-Stack rechts oben — nur auf der Startseite via Snippet
   ausgeliefert (andere Hero-Module rendern den .mvi-hero__social-Block nicht). */
.mvi-hero__social {
  position: absolute;
  top: 20px;
  right: 24px;
  display: flex;
  flex-direction: row;
  gap: 10px;
  z-index: 2;
}

.mvi-hero__social-btn > i.fa-brands {
  font-size: 18px;
  line-height: 1;
}

.mvi-hero__social-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: rgba(245, 240, 235, 0.20);
  border: 1.5px solid rgba(245, 240, 235, 0.55);
  color: var(--neutral-cream);
  text-decoration: none;
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  transition: background 220ms ease, border-color 220ms ease, transform 220ms ease;
}

.mvi-hero__social-btn:hover {
  background: rgba(196, 154, 60, 0.35);
  border-color: var(--brand-gold);
  color: var(--neutral-cream);
  transform: scale(1.08);
}

.mvi-hero__social-btn:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 3px;
}

/* Mobile: ≤ 520 px ------------------------------------------------------ */
@media (max-width: 520px) {
  .mvi-hero__media,
  .mvi-hero__photo {
    max-height: var(--hero-h-mobile);
  }
  /* Hero auf Mobile zeigt nur das Bild — Text-Overlay komplett aus, weil
     der 131-px-Hero zu flach für Eyebrow + Title + Sub + Button ist und
     der primäre CTA in die Drawer-Navigation gewandert ist.
     Selektor mit `.mvi-hero--has-text`, damit er gegen die Panel-Default-
     Regel (display: inline-flex) gewinnt. */
  .mvi-hero--has-text .mvi-hero__content,
  .mvi-hero__content {
    display: none;
  }
  /* Social-Buttons werden auf schmalen Phones ausgeblendet —
     der Hero ist dort ohnehin nur ein flacher Streifen, mehr UI
     stört die Komposition. */
  .mvi-hero__social {
    display: none;
  }
}

/* === PHASE 3 · PAGE-LAYOUT · STARTSEITE (S-9) ============================= */
/* Auf der Startseite (view-featured) belegt der Component-Bereich die volle
   Viewport-Breite. Sidebar-Module werden bewusst nicht angezeigt — die
   neuen Phase-3-Sektionen (Termine, Aktuelles, Ensembles, Promo, Sponsoren)
   tragen den Content selbst. Auf Unterseiten greift diese Regel nicht,
   dort bleibt die Sidebar wie konfiguriert. */
body.view-featured .container-component {
  width: 100% !important;
  max-width: 100% !important;
  flex: none !important;
}

body.view-featured .container-sidebar-left,
body.view-featured .container-sidebar-right {
  display: none !important;
}

/* === PHASE 3 · TERMINE (S-3) ============================================== */
/* Foundation für Phase-3-Sektionen (mvi-section / __inner / __head).
   Wird hier eingeführt, weil Termine die erste Sektion ist, die das Schema
   nutzt — folgende Sektionen (Aktuelles, Ensembles, Promo, Sponsoren)
   teilen dieselbe Foundation und ergänzen nur eigene Modifier. */
.mvi-section {
  padding: var(--space-8) var(--space-7);             /* 64 48 */
  background: var(--bg-surface);
}

.mvi-section--alt {
  /* Reserviert für cream/sand-Alternation in späteren Sektionen.
     Termine erbt zwar diese Klasse, überschreibt den Hintergrund aber nicht
     — entspricht dem Preview-Verhalten (Termine bleibt weiß). */
}

.mvi-section__inner {
  max-width: var(--container-wide);                   /* 1320 */
  margin: 0 auto;
}

.mvi-section__head {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: end;
  gap: var(--space-5);                                /* 24 */
  margin: 0 0 var(--space-6);                         /* mb 32 */
}

.mvi-section__eyebrow {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  font-family: var(--font-body);
  font-size: var(--fs-xs);                            /* 12 */
  font-weight: 600;
  letter-spacing: var(--ls-eyebrow);                  /* 0.16em */
  text-transform: uppercase;
  color: var(--brand-gold-deep);
  margin: 0;
  /* Eyebrow soll nie umbrechen — Inhalt ist immer kurz (max 25 Zeichen),
     ::before-Strich + uppercase letter-spacing können auf knappen Tablet-
     Breiten in 2 Zeilen umkippen. nowrap erzwingt 1 Zeile. */
  white-space: nowrap;
}
.mvi-section__eyebrow::before {
  content: "";
  display: block;
  width: 28px;
  height: var(--border-w-default);                    /* 1.5px */
  background: var(--brand-gold);
  flex: 0 0 auto;
}

.mvi-section__title {
  font-family: var(--font-display);
  font-size: 44px;
  font-weight: 600;
  line-height: 1.1;
  letter-spacing: var(--ls-tight);
  color: var(--brand-bordeaux);
  margin: 0;
}

.mvi-section__more {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-family: var(--font-body);
  font-size: var(--fs-sm);                            /* 14 */
  font-weight: 600;
  color: var(--brand-bordeaux);
  text-decoration: none;
  border-bottom: var(--border-w-thin) solid var(--brand-bordeaux);
  padding: 0 0 2px;
  white-space: nowrap;
  transition: color var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out);
}
.mvi-section__more:hover,
.mvi-section__more:focus-visible {
  color: var(--brand-bordeaux-deep);
  border-bottom-color: var(--brand-bordeaux-deep);
}
.mvi-section__more:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 3px;
}

.mvi-section__empty {
  font-family: var(--font-body);
  color: var(--fg-muted);
  margin: 0;
}

/* Termine-Sektion: rechtes Head-Cluster (More-Link + Slider-Nav) ---------- */
/* Custom gap 18 px — vom Preview gemessen (zwischen --space-4 16 und
   --space-5 24). Lässt sich kompakter packen, ohne dass More-Link und
   Pfeil-Buttons zu eng aneinander kleben. */
.mvi-termine-actions {
  display: flex;
  align-items: center;
  gap: 18px;
}

/* Slider-Nav ---------------------------------------------------------------- */
.mvi-slider-nav {
  display: flex;
  gap: var(--space-2);
}
.mvi-slider-btn {
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  background: var(--bg-surface);
  border: var(--border-w-thin) solid var(--border-subtle);
  border-radius: var(--radius-pill);
  color: var(--brand-bordeaux);
  cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease-out),
              color       var(--dur-fast) var(--ease-out);
}
.mvi-slider-btn:not(:disabled):hover,
.mvi-slider-btn:not(:disabled):focus-visible {
  border-color: var(--brand-bordeaux);
  color: var(--brand-bordeaux-deep);
}
.mvi-slider-btn:disabled {
  color: var(--fg-muted);
  cursor: default;
  opacity: 0.5;
}
.mvi-slider-btn:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 2px;
}

/* Event-Track: horizontale CSS scroll-snap Slider-Lane -------------------- */
.mvi-event-track {
  display: flex;
  gap: var(--space-4);                                /* 16 */
  overflow-x: auto;
  overflow-y: hidden;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  /* Padding gibt Tiles 4 px Atem (kein Scrollbar-Raum nötig, da hidden). */
  padding: var(--space-1);
  /* Negative Margin kompensiert das Padding visuell — Tile-Kanten an
     Section-Inner-Kante. */
  margin: 0 calc(var(--space-1) * -1);
  /* Scrollbar ausblenden (Firefox + IE/Edge) — Slider wird über Prev/Next
     bedient, Touch-Swipe funktioniert unverändert. */
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.mvi-event-track::-webkit-scrollbar {
  display: none;                                      /* Webkit */
}
.mvi-event-track:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 4px;
  border-radius: var(--radius-sm);
}

/* Event-Tile: weiße Karte mit dezenter Vollumrandung, farbiger Top-Akzent.
   Border-Setup: 1 px solid border-subtle auf Right/Bottom/Left, oben 3 px in
   der Modifier-Farbe (bordeaux/green). Box-sizing border-box → Tile-Breite
   240 px inkl. Border, Content-Breite 240 - 2*18 - 2 = 202.
   Tiles sind bewusst NICHT klickbar — der Termine-Strip ist reine Info-
   Anzeige, Detail-Navigation erfolgt über „Alle Termine →". */
.mvi-event-tile {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);                                /* 8 */
  flex: 0 0 240px;
  background: var(--bg-surface);
  border-radius: var(--radius-md);                    /* 8 */
  border: var(--border-w-thin) solid var(--border-subtle);
  border-top: var(--border-w-strong) solid var(--brand-bordeaux);
  padding: var(--space-4) 18px;                       /* 16 18 */
  scroll-snap-align: start;
  cursor: default;
  pointer-events: none;                               /* keine Interaktion auf Tile + Kinder */
}
.mvi-event-tile--bordeaux {
  border-top-color: var(--brand-bordeaux);
}
.mvi-event-tile--green {
  border-top-color: var(--brand-green);
}

.mvi-event-tile__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
}
.mvi-event-tile__date {
  display: flex;
  align-items: baseline;
  gap: 6px;
}
.mvi-event-tile__day {
  font-family: var(--font-display);
  font-size: 28px;
  font-weight: 700;
  line-height: 1;
  letter-spacing: var(--ls-tight);
  color: var(--brand-bordeaux);
}
.mvi-event-tile--bordeaux .mvi-event-tile__day { color: var(--brand-bordeaux); }
.mvi-event-tile--green    .mvi-event-tile__day { color: var(--brand-green); }

.mvi-event-tile__month {
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--fg-muted);
}

.mvi-event-tile__chip {
  font-family: var(--font-body);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  padding: 3px var(--space-2);                        /* 3 8 */
  border-radius: var(--radius-pill);
  white-space: nowrap;
  background: var(--brand-bordeaux-tint);
  color: var(--brand-bordeaux);
}
.mvi-event-tile--green .mvi-event-tile__chip {
  background: var(--brand-green-tint);
  color: var(--brand-green);
}

.mvi-event-tile__title {
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 600;
  line-height: 1.25;
  color: var(--fg-primary);
  margin: 0;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  /* min-height hält Tiles auch bei 1-zeiligen Titeln gleich hoch
     (2 lines × line-height 1.25 = 40px). */
  min-height: calc(2 * 1.25em);
}

.mvi-event-tile__meta {
  font-family: var(--font-body);
  font-size: var(--fs-xs);                            /* 12 */
  font-weight: 500;
  color: var(--fg-muted);
}

/* Cassiopeia card-chrome neutralizer ---------------------------------------
   DPCalendar-Modul sitzt in container-top-a. Cassiopeia wrappt es mit
   <div class="card"><div class="card-body"> — wir machen den Wrapper
   transparent + padding-frei, damit unsere Section edge-to-edge erscheint.
   Scope: nur view-featured (Startseite), nur container-top-a — andere
   Positionen / Seiten behalten die Standard-Card-Chrome. */
body.view-featured .container-top-a > .card,
body.view-featured .container-top-a > .card > .card-body {
  background: transparent;
  border: 0;
  padding: 0;
  margin: 0;
  box-shadow: none;
  border-radius: 0;
}

/* site-grid gibt container-top-a 16 px Gutter links/rechts (Cassiopeia-Default).
   Unsere Termine-Sektion will edge-to-edge wirken — Breakout-Trick mit
   100 vw + Margin-Negation. Limited auf view-featured + container-top-a,
   damit andere Seiten/Positionen unbeeinflusst bleiben. */
body.view-featured .container-top-a .mvi-section--termine {
  width: 100vw;
  margin-left:  calc(50% - 50vw);
  margin-right: calc(50% - 50vw);
}

/* Responsive Anpassungen ---------------------------------------------------
   Drei Zonen (1050 = --breakpoint-mobile-Token aus dem Header-System):
   ≥ 1051       Desktop — Default-Werte oben.
   521 – 1050   Tablet  — Head bleibt 2-Spalten-Row, Tile-Spacing reduziert.
   ≤ 520        Mobile  — Head kollabiert zur Single-Column, Tile minimaler. */
@media (max-width: 1050px) {
  /* Tablet: Tiles kompakter (weniger Padding, kleinerer Title), mehr Platz
     für folgende Sektionen. Head bleibt in Row, weil Eyebrow + Title links
     und More-Link + Slider rechts auf Tablet-Breite ergonomisch passen. */
  .mvi-section__title {
    font-size: 36px;
  }
  .mvi-event-tile {
    flex-basis: 200px;                                /* war 260 — 3 voll + Peek bei 834 Inner */
    padding: var(--space-3);                          /* 12 */
  }
  .mvi-event-tile__title {
    font-size: var(--fs-sm);                          /* 14 */
  }
}

/* Mid-Range + Mobile: Right-Cluster hidden + Section-Padding reduziert.
   Beide Regeln gelten gemeinsam auf Phones bis kleine Phablet/Portrait-
   Tablets, weil das Grid-Head bei 521–640 sonst overflowt (Title-min +
   Right-Cluster-min > head-Breite). Hidden Right gibt dem Title vollen
   Inner; reduziertes Padding gibt zusätzlich 48 px horizontalen Raum.
   `.mvi-termine-actions` (More-Link + Prev/Next-Buttons) entfällt damit
   bis 640 — „Alle Termine"/„Archivierte Beiträge" über Menü erreichbar,
   Slider per Touch-Swipe bedienbar. */
@media (max-width: 640px) {
  .mvi-section {
    /* Section-Padding-X reduziert: 48 → 24. Mit nur 48 px horizontalem
       Gesamtpadding hat der Inner-Content deutlich mehr Atemraum auf
       schmalen + mid-range Viewports. */
    padding-left: var(--space-5);                     /* 24 */
    padding-right: var(--space-5);                    /* 24 */
  }
  .mvi-section--termine .mvi-termine-actions,
  .mvi-section--aktuelles .mvi-termine-actions {
    display: none;
  }
}

@media (max-width: 520px) {
  /* Mobile-only Tuning: Head kollabiert zur Single-Column (kein `auto`-
     Track mehr nötig, da Right-Cluster ohnehin hidden), Title + Eyebrow
     verkleinert für Phone-Breiten, Tile-Layout auf 48 % flex-basis. */
  .mvi-section__head {
    grid-template-columns: 1fr;
    align-items: start;
    /* Head→Track-Abstand auf Mobile zusätzlich reduziert (32 → 24), weil
       die ausgeblendete Actions-Zeile bereits viel Höhe einspart und
       der Block insgesamt kompakter wirken soll. */
    margin-bottom: var(--space-5);                    /* 24 */
  }
  .mvi-section__title {
    font-size: 28px;
  }
  .mvi-section__eyebrow {
    font-size: 11px;
  }
  .mvi-event-tile {
    flex-basis: 48%;                                  /* 2 Karten voll sichtbar, dritte rechts off-track als Scroll-Reserve */
  }
  .mvi-event-tile__day {
    font-size: var(--fs-lg);                          /* 22 */
  }
}

/* === PHASE 3 · AKTUELLES (S-4) ============================================ */
/* News-/Beitrags-Sektion auf der Startseite. Foundation (mvi-section__head /
   eyebrow / title / more) wird aus S-3 wiederverwendet. Section-Background
   bewusst transparent — die page-cream-Farbe scheint durch und erzeugt
   visuelle Trennung zur weißen Termine-Sektion oberhalb. */
.mvi-section--aktuelles {
  background: transparent;
}

/* Sub-Text unter dem Title (nur in Aktuelles bisher benutzt — Foundation für
   spätere Sektionen, die ebenfalls einen Sub-Untertitel brauchen).
   17 px ist off-Scale (zwischen --fs-sm 14 und --fs-md 18), aber per
   Playwright vom Preview gemessen und visuell harmonischer als 18. */
.mvi-section__sub {
  font-family: var(--font-body);
  font-size: 17px;
  font-weight: 400;
  line-height: var(--lh-normal);                      /* 1.55 */
  color: var(--fg-secondary);
  margin: 0;
  max-width: 560px;
}

/* News-Track: auf Desktop + Tablet horizontal scroll-snap + Edge-to-Edge-
   Breakout (margin -48 kompensiert section-padding 48, padding 0 48 macht
   den Content wieder gleich zum Inner-Block). Auf Mobile column-stack. */
.mvi-news {
  display: flex;
  flex-direction: row;
  gap: var(--space-5);                                /* 24 */
  overflow-x: auto;
  overflow-y: hidden;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  /* Inner-konform wie .mvi-event-track (Termine): 4-px-Peek statt Full-Bleed,
     damit die Aktuelles-Sektion rechts bündig mit Termine/Ensembles endet
     (r1236 ≈ Section-Inner). padding-LR + margin = --space-1 (4) wie der Track;
     unten --space-2 (8) bleibt als Card-Shadow-Raum. Der frühere Edge-to-Edge-
     Bleed mit rechts angeschnittener Karte (Scroll-Hint) entfällt bewusst
     zugunsten gleicher rechter Kante (DECISIONS 2026-06-03). */
  padding: 0 var(--space-1) var(--space-2);           /* 0 4 8 */
  margin: 0 calc(var(--space-1) * -1);                /* -4 / -4 — wie .mvi-event-track */
  scroll-padding-left: var(--space-1);                /* 4 — = padding-left, card[0] rastet bündig am Inner-Rand ein */
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.mvi-news::-webkit-scrollbar {
  display: none;
}
.mvi-news:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 4px;
  border-radius: var(--radius-sm);
}

/* News-Card — weiße Karte mit dezenter Border + xs-Shadow, scroll-snap-aligned.
   Card-Breiten: Desktop 380, Tablet 320, Mobile 100 % (siehe Media-Queries).
   Hover-Effekt: translateY(-2px) + Shadow-Boost xs → md (1:1 vom Preview).
   Liegt auf der gesamten Card (nicht auf dem Photo!) — Photo skaliert nicht. */
.mvi-card {
  display: flex;
  flex-direction: column;
  flex: 0 0 380px;
  background: var(--bg-surface);
  border: var(--border-w-thin) solid var(--border-subtle);
  border-radius: var(--radius-lg);                    /* 14 */
  box-shadow: var(--shadow-xs);
  overflow: hidden;
  scroll-snap-align: start;
  transition: transform var(--dur-base) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out);
}
.mvi-card:hover,
.mvi-card:focus-within {
  transform: translateY(-2px);
  box-shadow: var(--shadow-md);
}

/* Photo-Link: wrappt das .mvi-card__photo-Div in einen Anchor — Klick aufs
   Bild öffnet die Beitrags-Detail-Seite (selbe URL wie der „Weiterlesen"-Link).
   Auf Hover/Focus skaliert das Photo dezent (Scale 1.03), Photo-Container
   hat `overflow: hidden` → Skalierung wird visuell geclippt. */
.mvi-card__photo-link {
  display: block;
  text-decoration: none;
  color: inherit;
  outline: none;
  -webkit-tap-highlight-color: transparent;
}
.mvi-card__photo-link:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 2px;
}

/* Card-Photo: 4:3 Aspect, Background-Image inline gesetzt im Override.
   ::before = Gradient-Overlay für Caption-Lesbarkeit, ::after = Caption
   via `content: attr(data-label)`. Kein Hover-Effekt auf dem Photo selbst
   — der gesamte Card-Hover (translateY + Shadow) liegt auf .mvi-card. */
.mvi-card__photo,
.mvi-photo {
  position: relative;
  aspect-ratio: 4 / 3;
  background-color: var(--neutral-sand);              /* Fallback wenn kein Bild */
  background-size: cover;
  background-position: center;
  overflow: hidden;
}
.mvi-card__photo::before,
.mvi-photo::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    rgba(31, 28, 24, 0) 55%,
    rgba(31, 28, 24, 0.55) 100%
  );
}
.mvi-card__photo::after,
.mvi-photo::after {
  content: attr(data-label);
  position: absolute;
  bottom: var(--space-3);                             /* 12 */
  left: 14px;
  right: 14px;
  font-family: var(--font-display);
  font-size: var(--fs-xs);                            /* 12 */
  font-weight: 400;
  font-style: italic;                                 /* Preview-Match (Aktuelles + Ensembles) */
  line-height: 1.3;
  letter-spacing: 0.01em;
  color: rgba(253, 250, 243, 0.92);                   /* cream-92 */
  pointer-events: none;
}

/* Fallback-Placeholder für Beiträge ohne Beitragsbild (2026-05-23):
   das PHP-Override (`mod_articles/default.php`) schreibt das Inline-
   `style="background-image: url(...)"`-Attribut NUR wenn ein
   `image_intro` gepflegt ist. Cards ohne Bild haben daher **kein**
   `style`-Attribut → `:not([style])` matched genau diesen Fall.
   Branded-Placeholder: Bordeaux-Hintergrund + MVI-Logo zentriert als
   dezentes Wasserzeichen. Gradient-`::before` durch das Logo ersetzt
   (kein dunkler Wash auf Bordeaux-BG nötig), Caption-`::after`
   ausgeblendet (kein Foto → keine Foto-Caption „Foto · …"). */
.mvi-card__photo:not([style]),
.mvi-photo:not([style]) {
  background-color: var(--brand-bordeaux);
}
.mvi-card__photo:not([style])::before,
.mvi-photo:not([style])::before {
  background: none;                                   /* Gradient-Overlay weg */
  background-image: url('/media/templates/site/cassiopeia_mvi/images/logo.png');
  background-repeat: no-repeat;
  background-position: center center;
  background-size: 45%;                               /* Logo zentriert, ~45 % Card-Breite */
  opacity: 0.40;                                      /* Wasserzeichen — Polish 2026-05-23 (0.18 → 0.30 → 0.40) */
}
.mvi-card__photo:not([style])::after,
.mvi-photo:not([style])::after {
  display: none;                                      /* keine „Foto · …"-Caption ohne Foto */
}

/* Flyer-Card (2026-05-23 R2): Beiträge mit Custom Field `beitragstyp=flyer`
   sollen das Flyer-Plakat vollständig zeigen (kein Cropping, kein Repeat).
   R1-Ansatz (`background-image` mit `background-size: contain`) versagte
   bei Hochformat-Plakaten (Repeat) und Querformat (Crop). R2 nutzt ein
   echtes `<img>`-Element mit `object-fit: contain` — zuverlässig für beide
   Orientierungen.
   PHP-Override rendert für Flyer-Cards stattdessen:
     <div class="mvi-card__photo mvi-card__photo--flyer">
       <img src="..." alt="Titel" loading="lazy">
     </div>
   (statt des Standard-`<div style="background-image: url(...)">`).
   - aspect-ratio aufgehoben → Card-Höhe passt sich dem Bildverhältnis an.
   - Padding für Letterbox-Charakter um das Bild.
   - Pseudo-Elemente (Gradient + Caption) deaktiviert — Flyer-Plakat trägt
     eigenen Titel.
   - Lead-Text wird vom PHP-Override für Flyer bereits unterdrückt. */
.mvi-card__photo--flyer {
  aspect-ratio: unset;
  height: auto;
  background: var(--neutral-cream);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--space-3);
}
.mvi-card__photo--flyer img {
  display: block;
  width: 100%;
  height: auto;
  max-height: 400px;
  object-fit: contain;
  border-radius: var(--radius-sm);
}
.mvi-card__photo--flyer::before,
.mvi-card__photo--flyer::after {
  display: none;
}
/* Kategorie-spezifischer Letterbox-Hintergrund (R3-Polish 2026-05-23) —
   Bordeaux/Grün/Gold-deep statt cream, damit der Flyer-Frame zur Card-
   Badge-Farbe passt. Modifier `--bordeaux/--green/--gold` kommt aus
   `$modifier` (catid 125/126/127). gold-deep statt --brand-gold, weil
   der hellere Gold-Ton sich vom Letterbox-Hintergrund zu wenig absetzt. */
.mvi-card__photo--flyer.mvi-card__photo--bordeaux {
  background: var(--brand-bordeaux);
}
.mvi-card__photo--flyer.mvi-card__photo--green {
  background: var(--brand-green);
}
.mvi-card__photo--flyer.mvi-card__photo--gold {
  background: var(--brand-gold-deep);
}

.mvi-card__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);                                /* 10 in preview, 12 grid-konform */
  padding: var(--space-5) 26px 28px;                  /* 24 26 28 — 26/28 off-grid (preview-Werte) */
}

.mvi-card__meta {
  display: flex;
  align-items: center;
  gap: var(--space-3);                                /* 12 */
  margin: 0;
}

.mvi-card__date {
  font-family: var(--font-body);
  font-size: 13px;                                    /* zwischen fs-xs 12 und fs-sm 14 — Preview-Wert */
  font-weight: 500;
  color: var(--fg-muted);
}

.mvi-card__title {
  font-family: var(--font-display);
  font-size: 22px;
  font-weight: 600;
  line-height: 1.25;
  letter-spacing: var(--ls-tight);
  color: var(--brand-bordeaux);
  margin: 0;
  /* 2-Line-Clamp hält die Card-Höhen vergleichbar, auch wenn Artikel-Titel
     stark variieren (Joomla-Beiträge haben echte, ungleich-lange Titel). */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* Klickbarer Karten-Titel — geteilte Utility für Aktuelles (S-4),
   Ensembles (S-5) und Ausbildung (S-6). Der <a> wickelt den <h3>; der
   <h3> behält seine eigene Bordeaux-Farbe. Bootstrap unterstreicht
   nackte <a> → `text-decoration: none` ist nötig; der Hover-Farbwechsel
   braucht ohnehin eine Regel. Resting-State ist pixelgleich zum
   ungewickelten Titel → keine Baseline-Drift. */
.mvi-title-link {
  display: block;
  text-decoration: none;
  color: inherit;
  -webkit-tap-highlight-color: transparent;
}
.mvi-title-link > * {
  transition: color var(--dur-fast) var(--ease-out);
}
.mvi-title-link:hover > *,
.mvi-title-link:focus-visible > * {
  color: var(--brand-bordeaux-deep);
}
.mvi-title-link:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 2px;
}

.mvi-card__lead {
  font-family: var(--font-body);
  font-size: 15px;                                    /* zwischen fs-sm 14 und fs-base 16 — Preview-Wert */
  font-weight: 400;
  line-height: var(--lh-normal);                      /* 1.55 */
  color: var(--fg-secondary);
  margin: 0;
  /* 5-Line-Clamp begrenzt sehr lange Intro-Texte — passt zur Preview-Höhe
     (~ 120 px bei 15 px lh 1.55 = 5 Zeilen). */
  display: -webkit-box;
  -webkit-line-clamp: 5;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.mvi-card__link {
  font-family: var(--font-body);
  font-size: var(--fs-sm);                            /* 14 */
  font-weight: 600;
  color: var(--brand-bordeaux);
  text-decoration: none;
  border-bottom: var(--border-w-thin) solid var(--brand-bordeaux);
  padding: 0 0 2px;
  align-self: flex-start;                             /* schmal — schrumpft nicht auf Card-Breite */
  white-space: nowrap;
  transition: color var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out);
}
.mvi-card__link:hover,
.mvi-card__link:focus-visible {
  color: var(--brand-bordeaux-deep);
  border-bottom-color: var(--brand-bordeaux-deep);
}
.mvi-card__link:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 3px;
}

/* Tag-Pill: kleine Marker neben dem Datum, gefüllt mit Modifier-Farbe.
   `::before` setzt einen 6 × 6 Cream-Dot vor den Tag-Text. */
.mvi-tag {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 5px var(--space-3);                        /* 5 10/12 → 12 grid-konform */
  border-radius: var(--radius-pill);                  /* 999 */
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--neutral-cream-50);
}
.mvi-tag::before {
  content: "";
  display: block;
  width: 6px;
  height: 6px;
  background: currentColor;
  border-radius: 50%;
  flex: 0 0 auto;
  opacity: 0.85;
}
.mvi-tag--bordeaux { background: var(--brand-bordeaux); }
.mvi-tag--green    { background: var(--brand-green);    }
.mvi-tag--gold     { background: var(--brand-gold-deep); }

/* Cassiopeia card-chrome Neutralizer + Breakout für top-b ----------------- */
body.view-featured .container-top-b > .card,
body.view-featured .container-top-b > .card > .card-body {
  background: transparent;
  border: 0;
  padding: 0;
  margin: 0;
  box-shadow: none;
  border-radius: 0;
}
body.view-featured .container-top-b .mvi-section--aktuelles {
  width: 100vw;
  margin-left:  calc(50% - 50vw);
  margin-right: calc(50% - 50vw);
}

/* Responsive Tablet (521–1050) ------------------------------------------- */
@media (max-width: 1050px) {
  .mvi-card {
    flex-basis: 320px;
  }
  /* Untertitel auf Tablet & Mobile ausblenden — Eyebrow + H2 reichen als
     Section-Intro, der Sub-Lead-Satz wirkt auf schmaleren Viewports
     redundant und drückt die Cards nach unten. (Briefing schrieb
     `__desc`; tatsächlicher Selektor im Markup ist `__sub`.) */
  .mvi-section--aktuelles .mvi-section__sub {
    display: none;
  }
}

/* Mobile-Toggle-Button + Outline-Variante.
   .mvi-news-mobile-cta ist auf Desktop+Tablet hidden, erscheint nur ≤ 520 px
   unter dem Karten-Stack als „Alle X Beiträge anzeigen ∨" / „Weniger ∧"
   Toggle. Button bleibt sichtbar — anders als bei One-Way-Expand. */
.mvi-news-mobile-cta {
  display: none;
}

/* Toggle-Button Innenleben: zwei Text-Varianten (more/less) + Chevron.
   Ein Text ist immer sichtbar (per `.is-expanded`-Klasse umgeschaltet). */
.mvi-news-toggle-btn {
  width: 100%;
  border-radius: var(--radius-pill);                  /* 999 — pill-Form für vollbreite CTAs */
  /* iOS-spezifisch:
     - `touch-action: manipulation` — eliminiert die 300-ms-Click-Verzögerung
       (Double-Tap-Zoom-Warten). Click feuert sofort beim touchend.
     - `-webkit-touch-callout: none` — kein Long-Press-Context-Menü.
     - `user-select: none` — kein Text-Highlight auf den Toggle-Spans. */
  touch-action: manipulation;
  -webkit-touch-callout: none;
  user-select: none;
}
/* Outline-only in ALLEN Interaktions-States (Touch/Mouse/Keyboard).
   Der Toggle-Button soll nie eingefärbt erscheinen — kein filled
   active/focus/hover, auch nicht beim Keyboard-Tab. iOS-Tap-Highlight
   wird zusätzlich auf alle interaktiven Elemente in der Sektion gesetzt. */
.mvi-news-toggle-btn:hover,
.mvi-news-toggle-btn:focus,
.mvi-news-toggle-btn:focus-visible,
.mvi-news-toggle-btn:focus:not(:focus-visible),
.mvi-news-toggle-btn:active {
  background: transparent !important;
  color: var(--brand-bordeaux) !important;
  outline: none !important;
  box-shadow: none !important;
}

/* iOS-Tap-Highlight komplett unterdrücken — sonst blitzt nach Tap kurz ein
   semi-transparenter Bordeaux-Cast auf Button/Karten. */
.mvi-news-toggle-btn,
.mvi-card,
.mvi-card__link {
  -webkit-tap-highlight-color: transparent;
}
.mvi-news-toggle-btn__text-less {
  display: none;
}
.mvi-news-toggle-btn.is-expanded .mvi-news-toggle-btn__text-more {
  display: none;
}
.mvi-news-toggle-btn.is-expanded .mvi-news-toggle-btn__text-less {
  display: inline;
}

/* CSS-Chevron (border-trick): 10×10 Quadrat, nur Right+Bottom-Border, 45°
   gedreht → zeigt nach unten ∨. Beim Expand auf -135° → zeigt nach oben ∧. */
.mvi-news-toggle-btn__chevron {
  display: inline-block;
  width: 10px;
  height: 10px;
  border-right: var(--border-w-default) solid currentColor;
  border-bottom: var(--border-w-default) solid currentColor;
  transform: rotate(45deg);
  transition: transform var(--dur-base) var(--ease-out);
  margin-left: var(--space-2);
  margin-bottom: 3px;
}
.mvi-news-toggle-btn.is-expanded .mvi-news-toggle-btn__chevron {
  transform: rotate(-135deg);
  margin-bottom: -3px;
}

.mvi-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  font-family: var(--font-body);
  font-size: 15px;                                    /* zwischen fs-sm 14 und fs-base 16 — visuelle Balance */
  font-weight: 600;
  line-height: 1.2;
  text-decoration: none;
  padding: var(--space-3) var(--space-6);             /* 12 32 */
  border-radius: var(--radius-sm);                    /* 4 */
  cursor: pointer;
  transition: background-color var(--dur-fast) var(--ease-out),
              color var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out);
}

.mvi-btn--outline {
  background: transparent;
  border: var(--border-w-default) solid var(--brand-bordeaux);   /* 1.5 — Preview-näher als 1 */
  color: var(--brand-bordeaux);
}
.mvi-btn--outline:hover,
.mvi-btn--outline:focus-visible {
  background: var(--brand-bordeaux);
  color: var(--fg-on-bordeaux);                       /* cream-50 */
  border-color: var(--brand-bordeaux);
}
.mvi-btn--outline:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 2px;
}

/* Responsive Mobile (≤ 520): Cards stacken vertikal, nur erste 3 Cards
   sichtbar + CTA-Button am Ende. Kein Slider, kein Edge-to-Edge-Breakout.
   .mvi-section--aktuelles .mvi-termine-actions hidden via gemeinsame
   Regel weiter oben im Termine-Mobile-Block. */
@media (max-width: 520px) {
  .mvi-news {
    flex-direction: column;
    gap: 18px;                                        /* Preview-Wert, off-grid */
    overflow: hidden;                                 /* clippt Karten 4+ via max-height */
    scroll-snap-type: none;
    padding: 0 0 var(--space-2);
    margin: 0;
    /* max-height wird per JS gesetzt (collapsed = 3-Karten-Höhe;
       expanded = scrollHeight). 500 ms ist langsamer als Drawer-Submenu
       (420 ms) — gibt iOS Zeit, Click-Resolution sauber abzuschließen.
       Easing: `cubic-bezier(0.16, 1, 0.3, 1)` (ease-out, identisch zum
       Drawer-Submenu) — schnell anfangs, sanft auslaufend. */
    transition: max-height 500ms cubic-bezier(0.16, 1, 0.3, 1);
  }
  /* Karten 4+ sind im Flow (display: flex) — werden nur vom max-height
     des Tracks geclippt. Damit ist die Höhen-Animation kontinuierlich,
     statt einem display:none-Sprung.
     flex: 0 0 auto = behalte Content-Größe, kein shrink (sonst quetschen
     sich 8 Cards in die collapsed max-height statt zu clippen). */
  .mvi-card {
    flex: 0 0 auto;
  }
  /* Während der max-height-Animation: Card-Links nicht klickbar. Schützt
     gegen iOS-Click-Through, wenn der User-Finger durch den Layout-Shift
     plötzlich über einem Card-Link landet. Gilt auch für den Photo-Link-
     Wrap (Bild ist auf Mobile ebenfalls klickbar). Nach `transitionend`
     wird die Klasse wieder entfernt (siehe JS). */
  .mvi-news.is-animating .mvi-card__link,
  .mvi-news.is-animating .mvi-card__photo-link {
    pointer-events: none;
  }
  /* Instant-Collapse: max-height-Wechsel ohne Animation. Wird vom JS für
     genau einen Frame gesetzt, dann wieder entfernt — danach läuft beim
     Expand wieder die normale 500-ms-Transition. */
  .mvi-news.is-instant {
    transition: none !important;
  }
  .mvi-card__body {
    padding: 18px 20px 22px;                          /* Preview-Werte */
  }
  .mvi-card__title {
    font-size: var(--fs-md);                          /* 18 — fast Preview's 20 */
  }
  /* Mobile-CTA aktivieren. Margin-top 16 sorgt für Touch-sicheren Abstand
     zur letzten sichtbaren Karte (Card 3 hat einen `__link` am unteren
     Rand — ohne Abstand könnte Tap auf Toggle versehentlich den Link
     treffen). position + z-index defensive gegen Stacking-Probleme. */
  .mvi-news-mobile-cta {
    display: flex;
    justify-content: center;
    margin-top: var(--space-4);                       /* 16 */
    position: relative;
    z-index: 2;
  }
}

/* === PHASE 3 · ENSEMBLES (S-5) ============================================ */
/* Statischer mod_custom-Block auf Position bottom-a (Snippet docs/ensembles.html).
   Zwei gleichwertige Karten (Aktive Kapelle / Jugendkapelle) mit Foto oben,
   Body mit Role-Badge, Titel, Lead und 3-spaltigem Stats-Cluster. Foundation
   .mvi-section* wird wiederverwendet — eigene Klassen nur für Grid + Karten. */

/* Cassiopeia card-chrome Neutralizer für bottom-a (gleicher Mechanismus wie
   top-a/top-b). Joomla wrappt mod_custom typischerweise in <div class="card">
   <div class="card-body">. Wir entfernen Background/Border/Padding, damit die
   Section bündig vom Page-Cream auf das eigene weiße Karten-Layout übergeht. */
body.view-featured .container-bottom-a > .card,
body.view-featured .container-bottom-a > .card > .card-body {
  background: transparent;
  border: 0;
  padding: 0;
  margin: 0;
  box-shadow: none;
  border-radius: 0;
}
/* Edge-to-Edge-Breakout für bottom-a — site-grid lässt 16 px Gutter L/R, wir
   ziehen die Section auf volle Viewport-Breite (gleich wie Termine/Aktuelles). */
body.view-featured .container-bottom-a .mvi-section--ensembles {
  width: 100vw;
  margin-left:  calc(50% - 50vw);
  margin-right: calc(50% - 50vw);
}

/* Grid-Wrapper: 2 Spalten Desktop+Tablet, 1 Spalte Mobile. ----------------- */
.mvi-ensembles {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-6);                                /* 32 */
}

/* Karte: weiße Surface mit dezenter Border + xs-Shadow, gleiche Sprache wie
   .mvi-card (Aktuelles). Overflow:hidden klippt das Photo am border-radius.
   Hover-/Focus-Within-Effekt 1:1 aus S-4 übernommen (translateY -2 +
   shadow-md, 220 ms ease-out). Cursor bleibt default auf der Card — pointer
   nur auf den klickbaren Elementen (.mvi-ens__photo-link, .mvi-ens__more),
   analog .mvi-card in S-4: Text/Stats sind nicht klickbar, Hover-Lift
   trotzdem auf der gesamten Card. */
.mvi-ens {
  display: flex;
  flex-direction: column;
  background: var(--bg-surface);
  border: var(--border-w-thin) solid var(--border-subtle);
  border-radius: var(--radius-lg);                    /* 14 */
  box-shadow: var(--shadow-xs);
  overflow: hidden;
  transition: transform var(--dur-base) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out);
}
.mvi-ens:hover,
.mvi-ens:focus-within {
  transform: translateY(-2px);
  box-shadow: var(--shadow-md);
}

/* Foto-Link: wrappt das .mvi-ens__photo-Div in einen Anchor — Klick aufs
   Bild öffnet die jeweilige Ensemble-Detailseite (Aktive Kapelle /
   Jugendkapelle). Analog zu .mvi-card__photo-link in S-4. */
.mvi-ens__photo-link {
  display: block;
  text-decoration: none;
  color: inherit;
  -webkit-tap-highlight-color: transparent;
}
.mvi-ens__photo-link:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 2px;
}

/* Foto: full-bleed Card-Top, aspect-ratio 4/3 Desktop, 16/9 ab Tablet.
   Wird als background-image über Inline-Style vom Snippet gesetzt — kein
   <img>, damit object-fit / object-position trivial steuerbar bleibt und der
   Browser direkt mit background-size cover arbeitet. */
.mvi-ens__photo {
  width: 100%;
  aspect-ratio: 4 / 3;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  background-color: var(--neutral-sand);              /* Fallback bei ladenden Bildern */
}

/* JUKA-Foto: `background-size: 115%` (statt cover) zoomt das 4:3-Bild
   leicht hinein → auch auf Desktop (4:3-Box) entsteht jetzt 15 % Overflow
   zum Pannen (vorher cover = kein Desktop-Crop). `background-position:
   60% 15%` schiebt den Ausschnitt nach rechts (weg von den Fahrrädern am
   linken Rand) und nach oben (der „JUKA"-Banner bleibt sichtbar). 115 %
   per Crop-Sim als Optimum gewählt: 120 % schnitt den Banner oben an,
   110 % ließ die Fahrräder zu sichtbar. Scoped via aria-label, damit
   Aktive Kapelle + S-4-Karten (.mvi-photo) unberührt bleiben. */
.mvi-ens__photo[aria-label*="Jugendkapelle"] {
  background-size: 115%;
  background-position: 60% 15%;
}

/* Body-Block: Padding 48 (Desktop) / 32 (Tablet) / 24 (Mobile), kleine vertikale
   Gap zwischen Role/Title/Lead/Stats. */
.mvi-ens__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);                                /* 12 — Preview misst 14, --space-3 hält 8-Grid */
  padding: var(--space-7);                            /* 48 */
}

/* Role-Badge: gleicher Eyebrow-Stil wie Section-Eyebrow, mit eigenem
   ::before-Strich in der jeweiligen Modifier-Farbe (currentColor). Section-
   Eyebrow nutzt 28 × 1.5 in gold; Card-Eyebrow ist 24 × 1.5 — kürzer, weil
   im engeren Card-Body kompakter wirkend. Modifier --bordeaux/--green setzt
   die Color, der Strich erbt sie via currentColor. */
.mvi-ens__role {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);                                /* 8 — kompakter als Section-Default 12, entspricht Preview-Wert 10 (auf nächstes Token gerundet) */
  align-self: flex-start;
  font-family: var(--font-body);
  font-size: var(--fs-xs);                            /* 12 — Preview hat 11, Token-Annäherung wie Section-Eyebrow Mobile */
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: var(--ls-eyebrow);                  /* 0.16em */
  color: var(--brand-bordeaux);
  margin: 0;
}
.mvi-ens__role::before {
  content: "";
  display: block;
  width: 24px;
  height: var(--border-w-default);                    /* 1.5 */
  background: currentColor;
  flex: 0 0 auto;
}
.mvi-ens__role--bordeaux { color: var(--brand-bordeaux); }
.mvi-ens__role--green    { color: var(--brand-green); }

/* Card-Title: Spectral wie Section-Title, aber kleiner (Card-Hierarchie).
   32 / 26 / 24 entsprechen Preview-Werten — analog zur Foundation .mvi-section__title
   (44/36/28) sind das custom px-Werte (off Token-Set), weil das Mockup
   spezifische Schriftgrößen pro Stufe wählt.

   `hyphens: auto` erlaubt Silbentrennung (z.B. „Jugend-/kapelle") bei sehr
   schmalen Cards. Tritt nur am Übergang Mobile→Tablet auf (VP 521–539,
   Card-Body-Inner 159–168 px, „Jugendkapelle" natürliche Breite 168 px).
   Ohne Hyphenation bräche der Browser hart im Wort um (overflow-wrap:
   break-word vom Cassiopeia-Default). `lang="de-de"` ist auf <html>
   gesetzt → der Browser nutzt das deutsche Silbentrennungs-Wörterbuch. */
.mvi-ens__title {
  margin: 0;
  font-family: var(--font-display);
  font-size: 32px;
  font-weight: 600;
  line-height: var(--lh-tight);                       /* 1.15 */
  letter-spacing: var(--ls-tight);                    /* -0.005em */
  color: var(--brand-bordeaux);
  hyphens: auto;
  -webkit-hyphens: auto;
  /* Wort min 7 Zeichen, mind. 4 vor und 3 nach dem Strich. Verhindert, dass
     der Browser kurze Wörter wie „Aktive" (6) in „Akti-ve" zerlegt — bei
     mehrwortigen Titeln wird stattdessen am Leerzeichen umbrochen
     („Aktive | Kapelle"). Lange Komposita ohne Leerzeichen wie
     „Jugendkapelle" (13) werden weiterhin sauber an Silbe getrennt
     („Jugend-kapelle"). */
  hyphenate-limit-chars: 7 4 3;
  -webkit-hyphenate-limit-before: 4;
  -webkit-hyphenate-limit-after: 3;
}

/* Lead-Text: gleiche Lesetypografie wie .mvi-card__lead in Aktuelles. */
.mvi-ens__lead {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--fs-base);                          /* 16 */
  font-weight: 400;
  line-height: var(--lh-normal);                      /* 1.55 */
  color: var(--fg-primary);
}

/* Stats-Cluster: 3 Spalten flex row mit fester Gap. Margin-top trennt vom
   Lead-Block; border-top + padding-top setzen einen visuellen Trennstrich
   zwischen Beschreibung und Stats (Preview-Match: 1 px border-subtle,
   padding 16).

   `flex-wrap: wrap` schützt vor Overflow bei langen Stat-Werten
   („Freitags" + „1896" zusammen sprengen bei Tablet-Range 521–833 die
   Card-Breite). Bei Overflow bricht das letzte Stat auf eine zweite Zeile;
   `row-gap` ist kleiner als `column-gap`, damit der vertikale Wrap-Abstand
   nicht überzogen wirkt. Preview hat `nowrap` — funktioniert dort nur mit
   sehr kurzen Stat-Werten (60/28/150). */
.mvi-ens__stats {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  column-gap: var(--space-5);                         /* 24 */
  row-gap: var(--space-3);                            /* 12 */
  margin-top: var(--space-2);                         /* 8 */
  padding-top: var(--space-4);                        /* 16 */
  border-top: var(--border-w-thin) solid var(--border-subtle);
}

/* Einzelne Stat: vertikal gestapelt — große Zahl/Kurzwert oben, Label klein
   darunter. Inline-flex erlaubt natürliche Min-Width, kein Stretch. */
.mvi-ens__stat {
  display: inline-flex;
  flex-direction: column;
  gap: var(--space-1);                                /* 4 */
}

/* Number/Headline-Slot: 28 px Spectral 600. Negative letter-spacing -0.01em
   per --ls-display für dichtere Optik (Preview misst -0.02em — wir nutzen
   den nächstgelegenen Token). */
.mvi-ens__stat-num {
  font-family: var(--font-display);
  font-size: var(--fs-xl);                            /* 28 */
  font-weight: 600;
  line-height: 1;
  letter-spacing: var(--ls-display);                  /* -0.01em */
  color: var(--fg-primary);
}

/* Label-Slot: 11 px (off Token-Set wie Eyebrow Mobile), getrackt 0.08em.
   Color = muted-grey, gleicher Token wie Termine-Tile-Meta. */
.mvi-ens__stat-lbl {
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 400;
  line-height: 1.4;
  letter-spacing: 0.08em;                             /* zwischen --ls-wide 0.04 und --ls-eyebrow 0.16 */
  color: var(--fg-muted);
}

/* Mehr-erfahren-Link: reiner Text-Link am Ende des Bodys. Analog .mvi-card__link
   (Aktuelles) in Farbe + Schrift, aber OHNE border-bottom (User-Vorgabe).
   Hover wechselt nur die Farbe — kein zusätzliches Unterstrich-Element. */
.mvi-ens__more {
  align-self: flex-start;
  margin-top: var(--space-2);                         /* 8 — Body-gap (12) + 8 = 20 zwischen Stats-Bottom und Link */
  font-family: var(--font-body);
  font-size: var(--fs-sm);                            /* 14 */
  font-weight: 600;
  color: var(--brand-bordeaux);
  text-decoration: none;
  white-space: nowrap;
  -webkit-tap-highlight-color: transparent;
  transition: color var(--dur-fast) var(--ease-out);
}
.mvi-ens__more:hover,
.mvi-ens__more:focus-visible {
  color: var(--brand-bordeaux-deep);
}
.mvi-ens__more:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 3px;
}

/* Responsive Tablet (521–1050) ------------------------------------------- */
@media (max-width: 1050px) {
  /* Photo wechselt auf 16/9 — mehr Breite, kompaktere Karten-Höhe, weil
     Karten auf Tablet nebeneinander sehr schmal werden (~300 px). */
  .mvi-ens__photo {
    aspect-ratio: 16 / 9;
  }
  /* Grid-Gap auf Tablet enger (24 statt 32) — bei 300-px-Karten wirkt 32 zu
     viel Luft. Preview-Match. */
  .mvi-ensembles {
    gap: var(--space-5);                              /* 24 */
  }
  .mvi-ens__body {
    padding: var(--space-6);                          /* 32 */
  }
  .mvi-ens__title {
    font-size: 26px;
  }
  /* Stat-num kleiner auf Tablet — Preview reduziert von 28 auf 24, damit die
     3 Stats nebeneinander in der schmalen Card nicht überlaufen. */
  .mvi-ens__stat-num {
    font-size: 24px;
  }
  /* Section-Sub im Header analog zu Aktuelles ausblenden — Eyebrow + Title
     reichen auf schmaleren Viewports, der Sub-Lead drückt sonst die Karten
     unnötig nach unten. */
  .mvi-section--ensembles .mvi-section__sub {
    display: none;
  }
}

/* Responsive Mobile (≤ 520) ----------------------------------------------- */
@media (max-width: 520px) {
  .mvi-ensembles {
    grid-template-columns: 1fr;
    gap: var(--space-5);                              /* 24 */
  }
  .mvi-ens__body {
    padding: var(--space-5);                          /* 24 — Preview misst 22, --space-5 hält 8-Grid */
  }
  .mvi-ens__title {
    font-size: 24px;
  }
  /* Stat-num auf Mobile noch eine Stufe kleiner (22 statt 24) — Preview-Match. */
  .mvi-ens__stat-num {
    font-size: 22px;
  }
}

/* === PHASE 3 · MUSIKALISCHE AUSBILDUNG (S-6) ============================== */
/* Statischer mod_custom-Block auf Position bottom-b (Snippet docs/ausbildung.html).
   Drei Stufen-Karten (Früherziehung / Blockflöte / Instrumentalausbildung) mit
   Badge (AB X JAHRE — dreigeteilt: kleines „AB" / große Zahl / „Jahre"), Title,
   Lead-Text und Mehr-erfahren-Link. Sektion-Background ist sand, hebt sich
   vom weißen Page-Hintergrund ab und gruppiert die drei Stufen optisch. */

/* Cassiopeia card-chrome Neutralizer für bottom-b (analog top-a/top-b und
   bottom-a). Joomla wrappt mod_custom in <div class="card"><div class="card-body">. */
body.view-featured .container-bottom-b > .card,
body.view-featured .container-bottom-b > .card > .card-body {
  background: transparent;
  border: 0;
  padding: 0;
  margin: 0;
  box-shadow: none;
  border-radius: 0;
}
/* Edge-to-Edge-Breakout — gleiches Pattern wie Termine/Aktuelles/Ensembles. */
body.view-featured .container-bottom-b .mvi-section--ausbildung {
  width: 100vw;
  margin-left:  calc(50% - 50vw);
  margin-right: calc(50% - 50vw);
}

/* Sektion-Hintergrund Sand — unterscheidet diese „Stufen"-Sektion vom weißen
   Ensembles-Block direkt darüber. */
.mvi-section--ausbildung {
  background: var(--bg-surface-warm);                 /* sand #efe7d6 */
}

/* Grid-Wrapper: 3 Spalten auf Desktop + Tablet, 1 Spalte auf Mobile.
   Card-Breiten sind gleichmäßig (kein Content-Sizing) — alle drei Stufen
   bekommen visuell denselben Raum. */
.mvi-ausbildung-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--space-5);                                /* 24 */
}

/* Karte: weiße Surface mit dünner Border subtil + dickem Gold-Top-Akzent.
   Border-Setup ist identisch zur Termine-Tile-Sprache (`.mvi-event-tile` hat
   ebenfalls 1px subtle umlaufend + 3px Modifier-Akzent oben) — die Gold-
   Linie hebt die Ausbildungs-Stufe als „Akzent-Block" hervor und harmoniert
   mit dem Gold-deep der Altersziffer im Badge. */
.mvi-ausbildung-card {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);                                /* 12 */
  background: var(--bg-surface);
  border: var(--border-w-thin) solid var(--border-subtle);
  border-top: var(--border-w-strong) solid var(--brand-gold);
  border-radius: var(--radius-md);                    /* 8 */
  box-shadow: var(--shadow-xs);
  padding: var(--space-6);                            /* 32 */
  transition: transform var(--dur-base) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out);
}
.mvi-ausbildung-card:hover,
.mvi-ausbildung-card:focus-within {
  transform: translateY(-2px);
  box-shadow: var(--shadow-md);
}

/* Age-Badge: drei-Spans-Cluster mit gemeinsamer Baseline (kleines „AB"
   versetzt zur großen Zahl). flex row mit gap 8 hält die Spans dicht
   beieinander; align-items: baseline sorgt für optisches „auf einer Linie"
   trotz drei verschiedener Font-Sizes. */
.mvi-ausbildung-card__age {
  display: flex;
  flex-direction: row;
  align-items: baseline;
  gap: var(--space-2);                                /* 8 */
}

/* "ab" → AB: kleines Source-Sans-Label in Muted-Grey, uppercase + getrackt.
   13 px ist off-Token (Preview-Wert), nutzen wir 1:1 wie Stat-Lbl-Pattern. */
.mvi-ausbildung-card__age-prefix {
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 500;
  line-height: 1.55;
  letter-spacing: var(--ls-wide);                     /* 0.04em */
  text-transform: uppercase;
  color: var(--fg-muted);
}

/* Die Altersziffer ist das visuelle Highlight: 56 px Spectral 600 in
   Gold-Deep. Verwendet --ls-display (-0.01em) als nächstgelegener Token
   zum Preview's -0.02em (siehe Stat-Num-Decision in S-5). */
.mvi-ausbildung-card__age-num {
  font-family: var(--font-display);
  font-size: 56px;
  font-weight: 600;
  line-height: 1;
  letter-spacing: var(--ls-display);                  /* -0.01em */
  color: var(--brand-gold-deep);
}

/* „Jahre" — kleinere Spectral-Variante in derselben Gold-Farbe. */
.mvi-ausbildung-card__age-unit {
  font-family: var(--font-display);
  font-size: var(--fs-md);                            /* 18 */
  font-weight: 500;
  line-height: 1.55;
  color: var(--brand-gold-deep);
}

/* Card-Title: Spectral wie Section-Title, kleiner (Card-Hierarchie).
   22 / 20 / 20 entspricht Preview-Werten — die Tablet+Mobile-Reduktion auf
   20 hält die Card kompakt auf engen Viewports. */
.mvi-ausbildung-card__title {
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--fs-lg);                            /* 22 */
  font-weight: 600;
  line-height: var(--lh-snug);                        /* 1.3 — Preview 1.25, Token-Annäherung */
  color: var(--brand-bordeaux);
  /* Konsistent zur Ensembles-Card: lange Komposita („Instrumentalausbildung")
     werden bei sehr schmalen Viewports an Silben getrennt statt mitten im
     Wort gebrochen. Siehe DECISIONS „S-5 Title-Wrap-Fix". */
  hyphens: auto;
  -webkit-hyphens: auto;
  hyphenate-limit-chars: 7 4 3;
  -webkit-hyphenate-limit-before: 4;
  -webkit-hyphenate-limit-after: 3;
}

/* Lead-Text: dieselbe Lese-Typografie wie .mvi-card__lead (Aktuelles), aber
   1 Punkt kleiner (14 statt 16) — der Card-Body hier ist kompakter. */
.mvi-ausbildung-card__text {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--fs-sm);                            /* 14 */
  font-weight: 400;
  line-height: var(--lh-normal);                      /* 1.55 */
  color: var(--fg-secondary);
}

/* Mehr-erfahren-Link: Foundation-Variante mit Bordeaux-Border-Bottom (anders
   als .mvi-ens__more in S-5 — dort hat User explizit keinen Border verlangt;
   hier folgen wir dem Preview-Design, das den Border zeigt). */
.mvi-ausbildung-card__link {
  align-self: flex-start;
  margin-top: var(--space-1);                         /* 4 — Card-Gap deckt schon 12 ab, kleine Zusatz-Distanz */
  font-family: var(--font-body);
  font-size: var(--fs-sm);                            /* 14 */
  font-weight: 600;
  color: var(--brand-bordeaux);
  text-decoration: none;
  border-bottom: var(--border-w-thin) solid var(--brand-bordeaux);
  padding: 0 0 2px;
  white-space: nowrap;
  -webkit-tap-highlight-color: transparent;
  transition: color var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out);
}
.mvi-ausbildung-card__link:hover,
.mvi-ausbildung-card__link:focus-visible {
  color: var(--brand-bordeaux-deep);
  border-bottom-color: var(--brand-bordeaux-deep);
}
.mvi-ausbildung-card__link:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 3px;
}

/* Responsive Tablet (521–899) -------------------------------------------- */
/* Grid kollabiert ab VP < 900 auf single-column. Bewusste Abweichung vom
   globalen Projekt-Breakpoint (1050): bei VP 900–1050 sind 3 schmale Cards
   à ~270 px noch lesbar und harmonisch — single-column dort würde die Cards
   unnötig breit machen. Bei VP < 900 (insb. 600–768) wären 3 Cards mit
   minmax(0, 1fr) so eng, dass Titel mitten im Wort umbrochen würden;
   single-column gibt jedem Card die volle Inner-Breite. */
@media (max-width: 899px) {
  .mvi-ausbildung-grid {
    grid-template-columns: 1fr;
    gap: var(--space-4);                              /* 16 — vertikale Lücke zwischen den 3 gestapelten Cards */
  }
  .mvi-ausbildung-card {
    padding: var(--space-5);                          /* 24 */
  }
  .mvi-ausbildung-card__title {
    font-size: var(--fs-md);                          /* 18 — Token-Annäherung zum Preview-Tablet-Wert */
  }
  /* Section-Sub im Header analog zu Aktuelles/Ensembles ausblenden — auf
     schmaleren Viewports reichen Eyebrow + Title als Section-Intro. */
  .mvi-section--ausbildung .mvi-section__sub {
    display: none;
  }
}

/* Responsive Mobile (≤ 520) ----------------------------------------------- */
/* Mobile erbt Single-Column-Grid + Card-Padding + Title-Size aus dem Tablet-
   Block. Nur die age-num-Größe variiert (Mobile etwas kleiner, da Body-
   Padding hier 24 ist und mehr vertical-rhythm ausgleicht). */
@media (max-width: 520px) {
  .mvi-ausbildung-card__age-num {
    font-size: 48px;
  }
}

/* === PHASE 3 · GRID-EXTENSION für bottom-c / bottom-d ==================== */
/* Cassiopeia's site-grid `grid-template-areas` kennt nur bot-a und bot-b.
   Damit unsere zusätzlichen Positionen bottom-c (Seefest, S-7) und bottom-d
   (Sponsoren, S-8) im Grid landen — und nicht auf `grid-area: auto`
   springen, was sie überlappend mit top-a rendern würde — erweitern wir die
   Grid-Areas explizit. Sowohl Mobile (Default) als auch Desktop (≥992px)
   Variante bekommen die zwei neuen Zeilen. */
@supports (display: grid) {
  .site-grid {
    grid-template-areas:
      ". banner banner banner banner ."
      ". top-a top-a top-a top-a ."
      ". top-b top-b top-b top-b ."
      ". comp comp comp comp ."
      ". side-r side-r side-r side-r ."
      ". side-l side-l side-l side-l ."
      ". bot-a bot-a bot-a bot-a ."
      ". bot-b bot-b bot-b bot-b ."
      ". bot-c bot-c bot-c bot-c ."
      ". bot-d bot-d bot-d bot-d .";
  }
  @media (min-width: 992px) {
    .site-grid {
      grid-template-areas:
        ". banner banner banner banner ."
        ". top-a top-a top-a top-a ."
        ". top-b top-b top-b top-b ."
        ". side-l comp comp side-r ."
        ". bot-a bot-a bot-a bot-a ."
        ". bot-b bot-b bot-b bot-b ."
        ". bot-c bot-c bot-c bot-c ."
        ". bot-d bot-d bot-d bot-d .";
    }
  }
}
.container-bottom-c { grid-area: bot-c; }
.container-bottom-d { grid-area: bot-d; }

/* Cassiopeia setzt `.container-top-a/b, .container-bottom-a/b > * { flex: 1 }`
   nur für die Default-Positions. Ohne diese Regel collapsed unsere `.card`
   im container-bottom-c/d auf width 0 (flex-child ohne flex-grow). Wir
   spiegeln die Regel 1:1 für die neuen Positions. */
.container-bottom-c, .container-bottom-d {
  position: relative;
}
.container-bottom-c > *,
.container-bottom-d > * {
  flex: 1;
  margin: 0.5em 0;
}
@media (max-width: 991.98px) {
  .container-bottom-c, .container-bottom-d {
    flex-direction: column;
  }
  .container-bottom-c > *,
  .container-bottom-d > * {
    flex: 0 auto;
  }
}

/* === PHASE 3 · SEEFEST-PROMO (S-7) ========================================= */
/* mod_custom „Seefest-Promo" auf Position bottom-c. Vollbreiter Foto-Banner
   mit Dunkel-Scrim. FESTE Höhe (542/480/420) + overflow:hidden → Content
   wird bei Overflow geclippt statt die Sektion zu strecken (verhindert den
   scheinbaren Zoom: bei min-height wuchs die Sektion auf >800px und der
   cover-Crop wirkte herangezoomt). Desktop ≥1051: Eyebrow + Titel +
   kompaktes 3-Spalten-Programm-Grid + Ghost-Button, unten ausgerichtet.
   Tablet/Mobile ≤1050: Programm-Grid ausgeblendet → Kurzversion (Eyebrow +
   Titel + Info-Zeile + Button), zentriert. Markup: docs/seefest.html.
   Foto banner-gecroppt (1920×788, JPG ~544 KB q88) → object-fit: cover,
   object-position center 60% (untere Bildhälfte = mehr Publikum). */

/* Cassiopeia card-chrome Neutralizer für bottom-c (analog bottom-d / S-8). */
body.view-featured .container-bottom-c > .card,
body.view-featured .container-bottom-c > .card > .card-body {
  background: transparent;
  border: 0;
  padding: 0;
  margin: 0;
  box-shadow: none;
  border-radius: 0;
}
/* Edge-to-Edge-Breakout (volle Viewport-Breite, wie Sponsoren-Strip). */
body.view-featured .container-bottom-c .mvi-section--seefest {
  width: 100vw;
  margin-left:  calc(50% - 50vw);
  margin-right: calc(50% - 50vw);
}

/* Die SEKTION richtet vertikal aus (column-flex + justify-content:center),
   nicht das Inner. Frühere Variante (flex-row + align-items:stretch +
   inner height:100%) kollabierte das Inner in diesem Cassiopeia-Card-
   Kontext auf ~414 px → Eyebrow oben geclippt, Leerraum unten. bg/scrim
   sind position:absolute → bleiben aus dem Flex-Flow. */
.mvi-promo {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: center;                   /* vertikal zentriert — gleichmäßiger Abstand oben/unten (alle Viewports) */
  height: 542px;                             /* FEST (nicht min-height) — Desktop */
  /* .mvi-section vererbt `padding: 64 48` + `box-sizing: border-box`.
     Bei fester Höhe würde das die Flex-Content-Box auf 542-128 = 414 px
     stauchen (Inner overflowt → Eyebrow geclippt, 64 px Leerraum unten).
     Full-Bleed-Banner braucht kein Section-Padding — Inner bringt eigenes. */
  padding: 0;
  overflow: hidden;                          /* Content-Overflow wird geclippt */
  isolation: isolate;                        /* eigener Stacking-Context für Scrim/Content */
}

/* Hintergrund-Foto als Cover-Layer (nur JPG, Option B — kein WebP).
   Robust gegen beide Markup-Varianten: `.mvi-promo__bg` kann direkt das
   <img> sein ODER ein <picture>-Wrapper mit innerem <img> (je nachdem,
   welches Snippet im mod_custom-Modul steckt). Beide werden absolut auf
   den Banner-Bereich gelegt + object-fit: cover. object-position
   center 60% → untere Bildhälfte (mehr Publikum, weniger Himmel). Kein
   transform/scale — der frühere „Zoom" kam allein vom Höhen-Bug. */
.mvi-promo__bg {
  position: absolute;
  inset: 0;
  z-index: 0;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 60%;
}
.mvi-promo__bg img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 60%;
}

/* Dunkel-Wash: links dicht (Textzone lesbar), rechts klar (See sichtbar).
   Farbe = --neutral-anthracite (#1f1c18) als rgba — Token kann nicht in
   rgba() interpoliert werden, daher Literal mit dokumentierter Herkunft. */
.mvi-promo__scrim {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(
    110deg,
    rgba(31, 28, 24, 0.78) 0%,
    rgba(31, 28, 24, 0.40) 60%,
    rgba(31, 28, 24, 0.10) 100%
  );
}

.mvi-promo__inner {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  gap: var(--space-5);                       /* 24 — Content / Programm / Button */
  width: 100%;
  max-width: var(--container-wide);          /* 1320 */
  margin: 0 auto;
  padding: var(--space-5) var(--space-7);    /* 24 / 48 — vertikal knapp, damit alles in 542 ohne Clip passt */
}

/* Info-Zeile + Kurztext — nur in der Tablet/Mobile-Kurzversion sichtbar
   (Desktop zeigt stattdessen das Programm-Grid). */
.mvi-promo__where {
  display: none;
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--fs-base);                 /* 16 */
  font-weight: 500;
  color: var(--neutral-cream);
}
.mvi-promo__intro {
  display: none;
  margin: var(--space-3) 0 0;                /* 12 — Abstand zur Info-Zeile */
  max-width: 480px;
  font-family: var(--font-body);
  font-size: 15px;                           /* zwischen fs-sm 14 und fs-base 16 — Spec */
  font-weight: 400;
  line-height: var(--lh-normal);             /* 1.55 */
  color: rgba(250, 246, 239, 0.92);          /* --neutral-cream (#faf6ef) @ 0.92 */
}

/* ── Content (Eyebrow + Titel) ── */
.mvi-promo__eyebrow {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-xs);                   /* 12 */
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.16em;                    /* Preview-Match */
  color: var(--brand-gold-soft);
}
.mvi-promo__title {
  margin: var(--space-4) 0 0;                /* 16 Atem zum Eyebrow */
  font-family: var(--font-display);
  font-size: 56px;                           /* über fs-Skala — Preview-Messung Desktop */
  font-weight: 600;
  line-height: 1.08;
  color: var(--neutral-cream);
}
.mvi-promo__title em {
  font-style: normal;
  font-weight: 400;
  color: var(--brand-gold-soft);
}
/* ── 3-Spalten-Programm-Grid — Desktop ≥1051 (kompakt, für feste 542 px).
   Tablet/Mobile: komplett ausgeblendet (siehe Media-Queries). ── */
.mvi-promo__program {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;                                 /* Spec v3 — war 24 */
}
.mvi-promo__col {
  display: flex;
  flex-direction: column;
  background: rgba(255, 255, 255, 0.08);     /* leicht aufgehellt auf dunklem Grund */
  border: var(--border-w-thin) solid rgba(255, 255, 255, 0.15);
  border-radius: var(--radius-md);           /* 8 */
  padding: 12px 16px;                        /* Spec v3 — kompakter (war 16/20) */
}
.mvi-promo__day {
  display: block;
  margin-bottom: var(--space-2);             /* 8 — kompakter (war 12) */
  font-family: var(--font-body);
  font-size: 10px;                           /* Spec v3 */
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.16em;
  color: var(--brand-gold-soft);
}
.mvi-promo__slot {
  display: flex;
  flex-direction: column;
  gap: 2px;                                  /* enge Zeilen innerhalb eines Blocks */
}
/* Trennlinie zwischen Block A und B — nur Sonntag hat zwei Slots. */
.mvi-promo__slot + .mvi-promo__slot {
  margin-top: var(--space-2);                /* 8 */
  padding-top: var(--space-2);               /* 8 */
  border-top: var(--border-w-thin) solid rgba(255, 255, 255, 0.1);
}
.mvi-promo__time {
  font-family: var(--font-body);
  font-size: 11px;                           /* Spec v3 */
  font-weight: 400;
  color: var(--neutral-stone);
}
.mvi-promo__act-title {
  margin: 0;
  font-family: var(--font-body);
  font-size: 14px;                           /* Spec v3 */
  font-weight: 600;
  color: var(--neutral-cream);
}
/* Untertitel (nur „Käthe Kächele") — in der Spec ohne eigene Stilangabe;
   an die Acts-Zeile angelehnt + kursiv zur Abgrenzung vom Act-Titel. */
.mvi-promo__act-sub {
  margin: 0;
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 400;
  font-style: italic;
  color: var(--neutral-stone);
}
.mvi-promo__acts {
  margin: 0;
  font-family: var(--font-body);
  font-size: 12px;                           /* Spec v3 */
  font-weight: 400;
  line-height: 1.4;                          /* kompakter für mehrzeilige Act-Listen */
  color: var(--neutral-stone);
}
.mvi-promo__price {
  margin-top: 2px;
  font-family: var(--font-body);
  font-size: 11px;                           /* Spec v3 */
  font-weight: 400;
  color: var(--brand-gold-soft);
}

/* Ghost-Button: heller Glas-Look auf dunklem Grund. Bewusst Cream-Text,
   NICHT Bordeaux (Preview-Mockup zeigte Bordeaux auf dunklem Foto =
   unlesbar — als Mockup-Bug eingestuft, Christoph bestätigt Cream).
   Linksbündig unter dem Programm-Grid. */
.mvi-promo .mvi-btn--ghost {
  align-self: flex-start;                    /* linksbündig, kein Stretch */
  width: fit-content;                        /* nie full-width (auch nicht Mobile) */
  background: rgba(255, 255, 255, 0.12);
  border: var(--border-w-thin) solid rgba(255, 255, 255, 0.6);
  border-radius: var(--radius-md);           /* 8 */
  padding: 14px 22px;                        /* Preview-Messung */
  font-size: var(--fs-sm);                   /* 14 */
  font-weight: 600;
  color: var(--neutral-cream);
  transition: background-color 220ms var(--ease-out);
}
.mvi-promo .mvi-btn--ghost:hover {
  background: rgba(255, 255, 255, 0.22);
}
.mvi-promo .mvi-btn--ghost:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 2px;
}

/* ── Tablet ≤ 1050: Kurzversion — Programm-Grid raus, Info-Zeile rein,
   Content vertikal zentriert, feste Höhe 480 ── */
@media (max-width: 1050px) {
  .mvi-promo {
    height: 480px;                           /* justify-content:center bereits in der Basis */
  }
  .mvi-promo__inner {
    gap: var(--space-4);                     /* 16 */
    padding: var(--space-7);                 /* 48 */
  }
  .mvi-promo__program {
    display: none;                           /* Programm-Grid nur Desktop */
  }
  .mvi-promo__where,
  .mvi-promo__intro {
    display: block;
  }
  .mvi-promo__title {
    font-size: 40px;                         /* Preview-Messung Tablet */
  }
}

/* ── Mobile ≤ 520: feste Höhe 420, Titel kleiner, engeres Padding ── */
@media (max-width: 520px) {
  .mvi-promo {
    height: 420px;
  }
  .mvi-promo__inner {
    padding: var(--space-6);                 /* 32 */
  }
  .mvi-promo__title {
    font-size: 30px;                         /* Preview-Messung Mobile */
  }
}

/* === PHASE 3 · SPONSOREN-STRIP (S-8) ======================================= */
/* Wird vom mod_custom Layout-Override `_:sponsoren`
   (templates/cassiopeia_mvi/html/mod_custom/sponsoren.php) gerendert.
   Position bottom-d. Der Strip listet alle Bilddateien aus
   /images/02_sponsoren/ in zufälliger Reihenfolge auf — horizontaler
   Scroll-Strip analog Termine-Tile (S-3). */

/* Cassiopeia card-chrome Neutralizer für bottom-d (analog top-a/b und
   bottom-a/b). */
body.view-featured .container-bottom-d > .card,
body.view-featured .container-bottom-d > .card > .card-body {
  background: transparent;
  border: 0;
  padding: 0;
  margin: 0;
  box-shadow: none;
  border-radius: 0;
}
/* Edge-to-Edge-Breakout */
body.view-featured .container-bottom-d .mvi-section--sponsoren {
  width: 100vw;
  margin-left:  calc(50% - 50vw);
  margin-right: calc(50% - 50vw);
}

/* Section-Hintergrund Sand — gleiche Töne wie Ausbildungs-Sektion;
   gruppiert die Sponsoren visuell als „Ausklang"-Block der Startseite. */
.mvi-section--sponsoren {
  background: var(--bg-surface);                     /* weiß #ffffff — sicherer Farbwechsel Ausbildung(creme)→Sponsoren(weiß)→Footer(dunkel), unabhängig von der temporären Seefest-Sektion */
}

/* Sektion-Header ist kompakter als die anderen Phase-3-Sektionen:
   - Eyebrow + Title-Block links, More-Link rechts
   - Title ist KEIN großer Display-Heading, sondern eine 18px-Subline
     („Ein herzliches Dankeschön an alle…") — visuell unauffälliger,
     damit die Logos den Fokus behalten
   - margin-bottom 24 (statt Default 32) */
.mvi-section--sponsoren .mvi-section__head {
  align-items: center;
  margin-bottom: var(--space-5);                     /* 24 */
}

.mvi-section--sponsoren .mvi-section__title {
  font-family: var(--font-display);
  font-size: var(--fs-md);                           /* 18 */
  font-weight: 500;
  font-style: italic;                                /* Preview-Match — gibt der Dankes-Subline einen warmen Ton */
  line-height: var(--lh-normal);                     /* 1.55 — exakt Preview */
  color: var(--fg-secondary);                        /* anthrazit-grau, nicht bordeaux */
  letter-spacing: var(--ls-normal);
  margin-top: var(--space-2);                        /* 8 — kleiner Atem zwischen Eyebrow und Sub-Text, matched Preview */
}

/* Sponsor-Strip: Wrapper mit overflow:hidden, innerer Track läuft per
   CSS-Animation (`mvi-marquee`) kontinuierlich nach links. Der Track enthält
   2 × Original-Set (Klon im PHP, aria-hidden). Animation animiert
   `translate3d(0)` → `translate3d(-50%)` — bei -50% steht das Klon-Set
   genau an der Original-Position, der CSS-`infinite`-Loop springt zurück
   zu 0 visuell nahtlos.

   Geschwindigkeit: JS berechnet `--carousel-duration` aus
   `trackHalfWidth / 80 px/sec` und setzt es als Inline-Style auf dem
   Wrapper. Resize → debounced neu berechnet. Damit ist die gefühlte
   Geschwindigkeit auf allen Viewports gleich (~80 px/s).

   Hover/Focus-Within pausiert via `.is-paused`-Klasse;
   `prefers-reduced-motion` stoppt die Animation komplett (CSS-only). */
.mvi-sponsor-strip {
  position: relative;
  overflow: hidden;
  width: 100%;
  /* Vertikaler Padding-Buffer: gibt Card-Hover-Transform (translateY -1)
     und Focus-Outline (2 px solid gold + 2 px offset) Platz oben/unten.
     Ohne diesen Puffer würde overflow:hidden den Outline-Ring auf dem
     oberen+unteren Card-Rand abschneiden. Horizontal bleibt der Clip
     hart am Border-Edge — das Marquee-Looping funktioniert unverändert,
     weil padding ON the inside of the clip-region wirkt. */
  padding: var(--space-1) 0;                          /* 4 px vertical */
  /* Default für den Fall, dass JS nicht oder noch nicht durchlief.
     100 s entspricht ~890 px (≈ ein gemittelter Track-Halb-Wert für
     ein Vereins-Logo-Set) — Browser fängt damit minimal-sanft an,
     JS überschreibt sofort mit der echten Berechnung. */
  --carousel-duration: 100s;
}
.mvi-sponsor-strip:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 4px;
  border-radius: var(--radius-sm);
}

.mvi-sponsor-strip__track {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  gap: 14px;                                          /* Preview-Wert, off-Grid */
  width: max-content;                                 /* Track = Original × 2 breit */
  will-change: transform;
  animation: mvi-marquee var(--carousel-duration, 100s) linear infinite;
  /* Touch-Action lässt vertikales Scrollen der Seite passieren — User soll
     den Strip nicht mit dem Daumen wegscrollen müssen, wenn er die Seite
     scrollen will. */
  touch-action: pan-y;
}
@keyframes mvi-marquee {
  from { transform: translate3d(0, 0, 0); }
  to   { transform: translate3d(-50%, 0, 0); }
}

/* Hover-/Focus-Within-Pause: User-Cursor auf dem Strip pausiert die
   Animation, damit Tooltips lesbar bleiben und Klicks auf Logos präzise
   möglich sind. */
.mvi-sponsor-strip:hover .mvi-sponsor-strip__track,
.mvi-sponsor-strip.is-paused .mvi-sponsor-strip__track {
  animation-play-state: paused;
}

@media (prefers-reduced-motion: reduce) {
  /* Stoppt die CSS-Animation komplett — Track steht still bei
     translate3d(0). Inhalt bleibt voll lesbar, User kann manuell mit
     Prev/Next bedienen. */
  .mvi-sponsor-strip__track {
    animation: none !important;
    transform: translate3d(0, 0, 0) !important;
  }
}

/* Karussell wird ohne Bedienelemente ausgeliefert — kein Wrapper für
   Prev/Next nötig. „Alle Sponsoren →" steht alleine rechts im Header.
   Mobile-Hide liegt direkt auf der Foundation-Klasse (siehe Media-Query). */

/* Logo-Container ist eine eigenständige Card: weiße Surface mit dezenter
   subtler Border und kompaktem Innen-Padding. Fix-Maße 120×90 — schmal +
   leicht hoch (Hochformat-Tendenz), gibt jeder Marke einen visuell
   prominenteren Platz als das vorherige 160×72-Querformat. Logos
   unterschiedlicher Aspect-Ratios werden via `object-fit: contain` auf dem
   `<img>` egalisiert.

   Hover-Effekt: nur `translateY(-1)` + `border-color: bordeaux` — KEIN
   shadow-md-Lift wie bei den größeren Card-Typen (S-4/S-5/S-6). Begründung:
   ein dutzend kleiner Cards nebeneinander mit Lift-Shadow wäre visuell
   überfrachtet; Border-Color-Wechsel signalisiert Interaktivität subtiler. */
.mvi-sponsor-logo {
  flex: 0 0 160px;
  width: 160px;
  height: 100px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--bg-surface);
  border: var(--border-w-thin) solid var(--border-subtle);
  border-radius: var(--radius-md);                   /* 8 */
  padding: var(--space-2);                           /* 8 — Inner 144×84, gibt Logo viel Fläche */
  transition: transform var(--dur-base) var(--ease-out),
              border-color var(--dur-base) var(--ease-out);
}
.mvi-sponsor-logo:hover,
.mvi-sponsor-logo:focus-within {
  transform: translateY(-1px);
  border-color: var(--brand-bordeaux);
}

.mvi-sponsor-logo img {
  max-width: 100%;
  /* Card-Inner ist 144×84 (160×100 minus 2×8 padding). max-height 64 nutzt
     ~76 % der Inner-Höhe — Logo füllt den verfügbaren Platz gut aus,
     hochformatige Marken wirken kräftig, querformatige bleiben über
     max-width: 100% begrenzt. */
  max-height: 64px;
  width: auto;
  height: auto;
  object-fit: contain;
  /* Leichter Saturate-Dämpfer (Preview-Wert): Logos in unterschiedlichen
     Farbintensitäten werden visuell angeglichen, ohne sie zu entfärben.
     Auf Hover kommt die volle Sättigung zurück. */
  filter: saturate(0.95);
  transition: filter var(--dur-base) var(--ease-out);
}
.mvi-sponsor-logo:hover img,
.mvi-sponsor-logo:focus-within img {
  filter: saturate(1);
}

/* Responsive Tablet (521–1050) — Sektion-Header bleibt 2-spaltig, weil
   More-Link kompakt rechts neben Title passt. Strip-Layout unverändert
   (horizontaler Scroll). */
@media (max-width: 1050px) {
  .mvi-section--sponsoren .mvi-section__title {
    font-size: var(--fs-sm);                          /* 14 — Tablet kompakter */
    line-height: var(--lh-normal);
  }
}

/* Responsive Mobile (≤ 520) — User-Vorgabe: „Alle Sponsoren →"-Link
   ausblenden (Karussell-Autoplay läuft trotzdem). Pattern analog
   `.mvi-termine-actions` Mobile-Hide aus Termine/Aktuelles, hier direkt auf
   der Foundation-Klasse `.mvi-section__more` innerhalb der Sponsoren-
   Section, weil das Wrapper-Element nach dem Buttons-Entfernen entfällt.
   Cards bleiben 160×72 — auf 390 px Viewport sind das ~2 Logos sichtbar
   (Foundation-Mobile-Inner 342 / 174 per logo+gap = 1.96). */
@media (max-width: 520px) {
  .mvi-section--sponsoren .mvi-section__head {
    grid-template-columns: 1fr;
    align-items: start;
  }
  .mvi-section--sponsoren .mvi-section__more {
    display: none;
  }
}

/* === PHASE 3 · FOOTER (S-9) ================================================ */
/* Statisch im index.php gerendert (S-9 Strategie 1). Dunkler Footer mit
   Brand-Block links + 3 Nav-Spalten + Legal-Bar mit Admin-Link.

   Foundation-Klassen `.mvi-footer*` neu eingeführt — sektionsspezifisch,
   weil der Footer einen kontrastierenden dunklen Hintergrund hat. Die
   Foundation `.mvi-section*` würde mit ihren cream-/sand-Defaults nicht
   passen. */

.mvi-footer {
  background: var(--neutral-anthracite);              /* #1f1c18 */
  color: var(--neutral-stone);                        /* #d9d2c4 — heller cream-grey für Lesbarkeit auf dunkel */
  /* Padding: 48 oben+seitlich, 24 unten — User-Vorgabe (96 → 48), der
     dicke schwarze Bereich oben wurde als zu groß empfunden. */
  padding: var(--space-7) var(--space-7) var(--space-5);  /* 48 48 24 */
  width: 100%;
}

.mvi-footer__inner {
  display: grid;
  /* Fluide 2fr/1fr/1fr/1fr: Brand-Spalte doppelt so breit wie Nav-Spalten.
     Bei VP 1280 mit gap 48 ergibt das exakt 416/208/208/208 px (Preview-
     Match). Bei kleineren Desktop-Viewports schrumpfen alle Spalten
     proportional — kein Overflow mehr (war Problem bei festem
     `416 208 208 208`-Grid: 1184 px Soll, ab VP 1060 abwärts overflow). */
  grid-template-columns: 2fr 1fr 1fr 1fr;
  gap: var(--space-7);                                /* 48 */
  max-width: var(--container-wide);                   /* 1320 */
  margin: 0 auto;
}

/* Brand-Block (links): Vereinsname als Display-Schrift + Adress-Paragraph
   mit Telefon-Link und Vorsitzendem-Hinweis. */
.mvi-footer__brand {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);                                /* 12 */
}
.mvi-footer__brand-row {
  display: flex;
  align-items: baseline;
}
.mvi-footer__brand-name {
  font-family: var(--font-display);
  font-size: var(--fs-md);                            /* 18 */
  font-weight: 600;
  line-height: var(--lh-snug);                        /* ~1.55 (Preview misst 27.9/18) */
  color: var(--brand-gold-soft);                      /* identisch zu Nav-H4-Titeln — Marken-Konsistenz */
}
.mvi-footer__addr {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--fs-sm);                            /* 14 */
  font-weight: 400;
  line-height: var(--lh-loose);                       /* 1.6 — Preview misst 22.4/14 */
  color: var(--neutral-stone);
}
/* Telefon-Link bekommt Gold-Soft-Akzent — passt zur H4-Farbe der Nav-
   Spalten und macht die Telefonnummer als „Call-to-Action" prominent. */
.mvi-footer__addr a {
  color: var(--brand-gold-soft);                      /* #d8b765 */
  text-decoration: none;
  transition: color var(--dur-fast) var(--ease-out);
}
.mvi-footer__addr a:hover,
.mvi-footer__addr a:focus-visible {
  color: var(--brand-gold);                           /* etwas intensiver auf Hover */
}

/* Nav-Spalten: 3 Stück (Verein / Mitmachen / Service). H4-Titel oben in
   uppercase-Gold, darunter gestapelte Block-Links in stone-color. */
.mvi-footer__col {
  display: flex;
  flex-direction: column;
}
.mvi-footer__col h4 {
  margin: 0 0 var(--space-1);                         /* 0 0 4 */
  font-family: var(--font-body);
  font-size: var(--fs-xs);                            /* 12 */
  font-weight: 700;
  letter-spacing: var(--ls-eyebrow);                  /* 0.16em */
  text-transform: uppercase;
  color: var(--brand-gold-soft);
}
.mvi-footer__col a {
  display: block;
  padding: var(--space-1) 0;                          /* 4 vertical — komfortabler Tap-Target */
  font-family: var(--font-body);
  font-size: var(--fs-sm);                            /* 14 */
  font-weight: 400;
  color: var(--neutral-stone);
  text-decoration: none;
  transition: color var(--dur-fast) var(--ease-out);
}
.mvi-footer__col a:hover,
.mvi-footer__col a:focus-visible {
  color: var(--brand-gold-soft);
}

/* Legal-Bar: feine Trennlinie + flex space-between auf Desktop/Tablet,
   stack auf Mobile. */
.mvi-footer__legal {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--space-3);                                /* 12 */
  max-width: var(--container-wide);
  margin: var(--space-7) auto 0;                      /* 48 top — Abstand zur Nav darüber */
  padding-top: var(--space-4);                        /* 16 */
  /* Border-Top auf dunklem Hintergrund: rgba(255,255,255,0.06) ist visuell
     eine sehr leichte Aufhellung des Anthracite — sichtbar als Linie, aber
     nicht aufdringlich. Token-Set hat keine border-on-dark-Variante,
     dieser Wert wird hier direkt verwendet (User-Spec). */
  border-top: 1px solid rgba(255, 255, 255, 0.06);
  font-family: var(--font-body);
  font-size: var(--fs-xs);                            /* 12 */
  color: var(--fg-muted);                             /* #8a8478 — Copyright dezent */
}

.mvi-footer__legal-links {
  display: flex;
  align-items: center;
  gap: var(--space-5);                                /* 24 — gemütlicher Abstand zwischen Impressum/Datenschutz/Admin */
}
.mvi-footer__legal-links a {
  color: var(--brand-gold-soft);
  text-decoration: none;
  transition: color var(--dur-fast) var(--ease-out);
}
.mvi-footer__legal-links a:hover,
.mvi-footer__legal-links a:focus-visible {
  color: var(--brand-gold);
}

/* Admin-Link: dezenter Lock-Icon-Link, ganz rechts in der Legal-Bar.
   Default 50 % gedimmt, auf Hover voll sichtbar — soll nicht auffallen,
   aber für Eingeweihte erreichbar (Tooltip „Backend"). Color bleibt
   stone/muted, nicht gold — das Icon ist die Funktion, nicht der Akzent. */
.mvi-footer__admin {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--fg-muted) !important;                  /* override .mvi-footer__legal-links a gold-Default */
  opacity: 0.5;
  transition: opacity var(--dur-fast) var(--ease-out);
}
.mvi-footer__admin:hover,
.mvi-footer__admin:focus-visible {
  color: var(--fg-muted) !important;
  opacity: 1;
}

/* Responsive ≤ 1050 — User-Vorgabe: auf Tablet + Mobile wird nur die
   Legal-Bar gezeigt. Brand-Block + Nav-Spalten sind ausgeblendet, weil
   die mobile Navigation komplett über den Drawer im Header läuft — ein
   redundanter Footer-Nav darunter ist nicht nötig. Padding wird auf das
   notwendige Minimum reduziert (16 vertical, 48 horizontal). Trennlinie
   border-top auf Legal-Bar entfällt, sonst hängt eine Linie ohne Kontext
   im Raum. */
@media (max-width: 1050px) {
  .mvi-footer {
    padding: var(--space-4) var(--space-7);           /* 16 vertical, 48 horizontal */
  }
  .mvi-footer__inner {
    display: none;
  }
  .mvi-footer__legal {
    margin-top: 0;
    padding-top: 0;
    border-top: 0;
  }
}

/* Responsive Mobile (≤ 520) — Legal-Bar stackt vertikal (Copyright oben,
   Links unten). Auf Mobile auch padding-x leicht reduzieren, damit lange
   Copyright-Zeile nicht zu eng am Bildrand klebt. */
@media (max-width: 520px) {
  .mvi-footer {
    padding: var(--space-4) var(--space-5);           /* 16 vertical, 24 horizontal */
  }
  .mvi-footer__legal {
    flex-direction: column;
    align-items: flex-start;
    gap: var(--space-3);
  }
}

/* ============================================================
   S-10 — BEITRAGSSEITE (Article View)
   ============================================================
   Joomla rendert die Article-View (com_content view=article) ohne
   eigenen Itemid → der aktive Itemid ist 101 (Startseite). Folge:
   alle Modulzuweisungen der Startseite (Hero, Termine, Aktuelles,
   Ensembles, Ausbildung, Sponsoren) erscheinen MIT auf der
   Beitragsseite, der Article-Inhalt liegt mittendrin.

   Lösung: Auf `body.view-article` werden die Startseite-Module-
   Container ausgeblendet. Sidebar bleibt aktiv (Vorgabe). Header
   und Footer bleiben unverändert. */

/* --- S-10 Phase 1: Startseite-Modul-Container ausblenden -------- */
/* .container-banner BLEIBT sichtbar — Hero-Modul rendert auch auf
   Article-View (User-Vorgabe S-10 Korrektur 2026-05-15). */
body.view-article .container-top-a,
body.view-article .container-top-b,
body.view-article .container-bottom-a,
body.view-article .container-bottom-b,
body.view-article .container-bottom-c,
body.view-article .container-bottom-d {
  display: none !important;
}

/* Hero-Variante auf Article-View: nur Foto, kein Text/CTAs/Social-Icons.
   Der Hero wirkt damit als reine Marken-Visitenkarte zwischen Header
   und Beitragsseite-Inhalt — der Article-Title übernimmt die
   inhaltliche Kommunikation. */
body.view-article .mvi-hero__content,
body.view-article .mvi-hero__social {
  display: none;
}
body.view-article .mvi-hero__overlay {
  background: none;
}

/* --- S-10-9: Breadcrumb (Startseite / Aktuelles / Titel) -------- */
/* Sitzt als erstes Element im .com-content-article (vor dem Titel),
   erbt damit die 720-px-Lese-Spalte.
   S-12 Polish 2026-05-20 (Fix 2): `view-article` → `:is(view-article,
   view-archive)` erweitert. Spezifität bleibt identisch (`:is()` nimmt die
   höchste Innenspezifität — beide Selektoren sind 0,1,0 body-class) →
   bestehende view-article-Seiten unverändert; itemid-938 (view-archive)
   erbt jetzt das Breadcrumb-Styling. */
:is(body.view-article, body.view-archive) .com-content-article > .mvi-breadcrumb,
body.view-archive .com-content-archive > .mvi-breadcrumb,
body.view-list.itemid-934 .mvi-cal-wrapper > .mvi-breadcrumb,
body.com_igallery.view-category .ig-main-scope-wrapper.profile-1 > .mvi-breadcrumb,
body.com_contact.view-category .com-contact-category > .mvi-breadcrumb {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
  margin-bottom: var(--space-5);
}
:is(body.view-article, body.view-archive, body.view-list.itemid-934, body.com_igallery.view-category, body.com_contact.view-category) .mvi-breadcrumb a,
:is(body.view-article, body.view-archive, body.view-list.itemid-934, body.com_igallery.view-category, body.com_contact.view-category) .mvi-breadcrumb__link {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  color: var(--fg-muted);
  text-decoration: none;
  transition: color var(--dur-base) var(--ease-out);
}
:is(body.view-article, body.view-archive, body.view-list.itemid-934, body.com_igallery.view-category, body.com_contact.view-category) .mvi-breadcrumb a:hover,
:is(body.view-article, body.view-archive, body.view-list.itemid-934, body.com_igallery.view-category, body.com_contact.view-category) .mvi-breadcrumb__link:hover {
  color: var(--brand-bordeaux);
}
:is(body.view-article, body.view-archive, body.view-list.itemid-934, body.com_igallery.view-category, body.com_contact.view-category) .mvi-breadcrumb__sep {
  color: var(--fg-muted);
  font-size: var(--fs-sm);
  user-select: none;
}
:is(body.view-article, body.view-archive, body.view-list.itemid-934, body.com_igallery.view-category, body.com_contact.view-category) .mvi-breadcrumb__current {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--fg-primary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 360px;
}
@media (max-width: 520px) {
  :is(body.view-article, body.view-archive, body.view-list.itemid-934, body.com_igallery.view-category, body.com_contact.view-category) .mvi-breadcrumb__current {
    max-width: 180px;
  }
}

/* --- S-10 Phase 2: Article-Container + Titel ------------------- */

/* Article rendert in einer schmalen Lese-Spalte (720 px), zentriert.
   Galerie und Pagenavigation brechen in späteren Phasen aus dieser
   Spalte aus auf full container-wide (1320 px). */
body.view-article .com-content-article.item-page {
  max-width: var(--article-content-width);
  margin: 0 auto;
  padding: var(--space-7) var(--space-7) var(--space-9);
  box-sizing: content-box;
}
@media (max-width: 520px) {
  body.view-article .com-content-article.item-page {
    padding-left: var(--space-5);
    padding-right: var(--space-5);
  }
}

/* Joomla rendert zwei .page-header-Blöcke unter view-article:
   1. <h1> Startseite </h1>  — vom Menüpunkt (Itemid 101) → ausblenden
   2. <h2> {Article-Title} </h2> — der eigentliche Titel → stylen */
body.view-article .com-content-article > .page-header:has(> h1) {
  display: none;
}
body.view-article .com-content-article > .page-header:has(> h2) {
  margin: 0 0 var(--space-5);
}
body.view-article .com-content-article > .page-header > h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(var(--fs-3xl), 4vw, var(--fs-4xl));   /* 48→64, harmonisch (kein Fullwidth mehr) */
  line-height: 1.1;
  letter-spacing: normal;
  color: var(--brand-bordeaux);
  margin: 0;
  text-wrap: balance;
  hyphens: auto;
  -webkit-hyphens: auto;
  hyphenate-limit-chars: 7 4 3;
}
/* ≤1050: Titel auf die responsiven Größen (clamp-min wäre 48 px, auf
   Mobile in der ~342-px-Spalte unharmonisch). 38 / 28 wie Pre-Fullwidth. */
@media (max-width: 1050px) {
  body.view-article .com-content-article > .page-header > h2 { font-size: 38px; }
}
@media (max-width: 520px) {
  body.view-article .com-content-article > .page-header > h2 { font-size: 28px; }
}

/* --- S-10 Phase 3: Article-Meta (Badge + Datum) ----------------- */

/* Inline-Meta-Block — Tag-Pill (Catid-Modifier) + Veröffentlichungs-
   datum mit „·"-Trenner. S-10 Polish: sitzt jetzt ÜBER dem Titel
   (Breadcrumb → Meta → Titel → Bild), daher margin-bottom = Abstand
   zum Titel (16) statt zuvor zum Bild (32). */
body.view-article .com-content-article > .mvi-article-meta {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 14px;
  margin: 0 0 var(--space-4);
}
body.view-article .mvi-article-meta__date {
  display: inline-flex;
  align-items: center;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 15px;
  letter-spacing: 0.01em;
  font-variant-numeric: tabular-nums;
  color: var(--neutral-anthracite);
}
body.view-article .mvi-article-meta__date::before {
  content: "·";
  margin-right: 14px;
  color: var(--border-subtle);
  font-weight: 400;
}

/* S-10 Polish-Reset (2026-05-17): Der Fullwidth-Breakout für
   Breadcrumb + Meta + Titel wurde wieder ENTFERNT — alle drei sitzen
   jetzt (wie der Fließtext) in der zentrierten Lese-Spalte
   (--article-content-width 856). Kein Breakout, keine negativen
   Margins; es gelten wieder die Standard-Regeln (3868/3933/3964),
   die .com-content-article zentriert per margin:0 auto. */

/* --- S-10 Phase 4: Beitragsbild (figure.item-image) ------------- */

/* Joomla rendert `images_fulltext` als `<figure class="left item-image">`
   mit Class `left` als Default-Float-Alignment. Wir neutralisieren den
   Float, geben dem Bild ein festes 16:9-Verhältnis (4:3 auf Mobile)
   und runden die Ecken passend zum übrigen Designsystem. */
body.view-article .com-content-article figure.item-image {
  position: relative;
  margin: 0 0 var(--space-7);
  float: none;
  width: 100%;
  overflow: hidden;
  border-radius: var(--radius-md);         /* clippt Gradient/Caption rund (img hat radius-md) */
}
body.view-article .com-content-article figure.item-image img {
  display: block;
  width: 100%;
  aspect-ratio: 16 / 9;
  object-fit: cover;
  border-radius: var(--radius-md);
  border: 1px solid var(--border-subtle);
}
@media (max-width: 520px) {
  body.view-article .com-content-article figure.item-image img {
    aspect-ratio: 4 / 3;
  }
}

/* S-10 Polish-Fix 4 (2026-05-17): Bildunterschrift NICHT mehr als
   <figcaption> unter dem Bild, sondern als data-label-Attribut →
   per ::after AUF dem Bild (analog .mvi-card__photo::after auf der
   Startseite). Gradient-Overlay (::before) + Caption (::after) NUR
   wenn data-label vorhanden (kein Alt-Text → figure ohne data-label
   → kein dunkler Wash, keine Caption — folgt der Spec-Verbal-
   Anforderung; das Spec-CSS-Snippet hatte ::before ungescoped,
   was ohne Caption nur sinnlos abdunkeln würde). */
body.view-article .com-content-article figure.item-image[data-label]::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    to bottom,
    rgba(31, 28, 24, 0) 55%,
    rgba(31, 28, 24, 0.55) 100%
  );
  pointer-events: none;
  z-index: 1;
}
body.view-article .com-content-article figure.item-image[data-label]::after {
  content: attr(data-label);
  position: absolute;
  bottom: var(--space-3);                  /* 12 px */
  left: var(--space-4);                    /* 16 px */
  right: var(--space-4);
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-xs);                 /* 12 px */
  color: rgba(245, 240, 235, 0.92);        /* cream */
  z-index: 2;
  pointer-events: none;
}
/* Joomla-Default figcaption auf .item-image unterdrücken — Caption rendert
   stattdessen über `data-label="…"::after` (PHP-Override default.php, siehe
   DECISIONS 2026-05-17 „S-10 Polish-Imgflow"). Defensive Suppression für
   den Fall, dass der Editor doch einen <figcaption> generiert. */
body.view-article .com-content-article figure.item-image figcaption {
  display: none;
}

/* Flyer-Artikel (2026-05-23): Beitragstyp `flyer` zeigt das Bild ohne
   Cropping — Flyer-Plakate enthalten Text-im-Bild der nicht beschnitten
   werden darf. Klasse `.com-content-article--flyer` setzt der PHP-Override
   wenn das Custom Field `beitragstyp=flyer` ist. `object-fit: contain` +
   `aspect-ratio: auto` gibt dem Bild seine natürliche Form. Cream-Hintergrund
   hinter dem Bild (für Letterboxing). Gradient + Caption deaktiviert. */
body.view-article .com-content-article--flyer figure.item-image {
  background-color: var(--neutral-cream);
}
body.view-article .com-content-article--flyer figure.item-image img {
  aspect-ratio: auto;
  object-fit: contain;
  height: auto;
  border: 0;                                /* kein Border auf Cream-Letterbox */
}
body.view-article .com-content-article--flyer figure.item-image[data-label]::before,
body.view-article .com-content-article--flyer figure.item-image[data-label]::after {
  display: none;
}

/* --- S-10 Phase 5: Body-Prose + Blockquote ---------------------- */

/* Lesefreundliche Typografie für den Artikel-Body. 17 px / lh 1.7
   matched die HTML-Referenz (.mvi-prose) — die optimale Balance
   zwischen Lesegröße und Zeilenhöhe für narrative Texte. */
body.view-article .com-content-article__body {
  font-family: var(--font-body);
  font-size: 17px;
  line-height: 1.7;
  color: var(--neutral-anthracite);
}
body.view-article .com-content-article__body > p {
  margin: 0 0 var(--space-5);
}
body.view-article .com-content-article__body > p:last-child {
  margin-bottom: 0;
}

/* ============================================================
   S-10 Polish (2026-05-17) — Padding-Fix + Intro-Lead + Drop Cap
   ============================================================ */

/* K1 — Mobile-Padding-Fix: Auf ≤520 px sitzt .com-content-article
   im .container-component, das per .site-grid (CSS-Grid,
   column-gap 16) einen 16-px-Gutter erhält → effektiver Einzug
   40 px (16 Grid-Gutter + 24 Article-Padding) statt 24 wie auf der
   Startseite. Lösung: Breakout auf volle Viewport-Breite (identisch
   zum Pattern der Startseite-Sektionen / Galerie / Pagenav), das
   eigene 24-px-Padding bleibt → Content-Einzug exakt 24 px, volle
   390-px-VP genutzt. `border-box` nötig, damit width:100vw + padding
   keinen horizontalen Overflow erzeugt. Desktop unverändert. */
@media (max-width: 520px) {
  body.view-article .com-content-article.item-page {
    box-sizing: border-box;
    width: 100vw;
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
  }
}

/* K3 — Intro-Lead: erster Body-Absatz als ruhiger Source-Sans-
   Italic-Einstieg in Sekundärfarbe (kompensiert das bewusst nicht
   gerenderte Joomla-Lead-Element, S-10 C). Polish-Fix 2: Größe jetzt
   = Fließtext (17 px, NICHT `--fs-base` 16 — Spec-Token-Referenz hätte
   das Spec-Ziel „gleiche Größe wie Fließtext" verfehlt, da der Body
   hartcodiert 17 px nutzt). Nur Italic + Sekundärfarbe heben den
   Einstieg ab, kein Größenkontrast mehr.
   Polish-Fix 4 (2026-05-17): Der erste Absatz wird im PHP-Override
   in einen eigenen `.com-content-article__intro`-Wrapper VOR das Bild
   gerendert (Body-Split). Lead + Drop Cap zielen daher jetzt auf
   `.com-content-article__intro > p` statt `.__body > p:first-of-type`
   — sonst bekäme der erste Absatz des Rest-Bodys (nach dem Bild)
   fälschlich Lead+Drop-Cap. */
/* S-10 / R3 (2026-05-18): Erster Absatz = LEAD für ALLE Artikel global
   (User-Auftrag — der auf Über-Uns eingeführte Lead-Stil gefällt und
   soll überall gelten). 19 px (Mockup-Lead-Wert, etablierter
   kommentierter Rohwert), NICHT kursiv, --fg-primary, KEIN Drop-Cap.
   Früher: Italic/Sekundär 17 + Spectral-Drop-Cap (+Mobile-Fallback);
   früherer Über-Uns-scoped Override entfällt (global jetzt identisch). */
body.view-article .com-content-article__intro > p:first-of-type {
  font-family: var(--font-body);
  font-style: normal;
  font-size: 19px;                         /* Lead (Mockup-Wert, kein --fs-Token) */
  line-height: 1.55;
  color: var(--fg-primary);
  margin-bottom: var(--space-6);           /* 32 px (Abstand zum Bild) */
}
/* Kein Drop-Cap mehr — ::first-letter neutralisiert (falls UA/Erbe). */
body.view-article .com-content-article__intro > p:first-of-type::first-letter {
  font-family: inherit;
  font-size: inherit;
  font-weight: inherit;
  color: inherit;
  float: none;
  line-height: inherit;
  margin: 0;
}

/* Zwischenüberschriften: Spectral Bordeaux, deutlich abgesetzt mit
   margin-top, scroll-margin-top für Anker-Sprünge unter dem 88-px-Header. */
body.view-article .com-content-article__body > h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 28px;
  line-height: 1.2;
  letter-spacing: -0.005em;
  color: var(--brand-bordeaux);
  margin: var(--space-7) 0 var(--space-4);
  scroll-margin-top: 100px;
}
body.view-article .com-content-article__body > h2:first-child {
  margin-top: 0;
}
body.view-article .com-content-article__body > h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 22px;
  line-height: 1.3;
  color: var(--brand-bordeaux);
  margin: var(--space-6) 0 var(--space-3);
  scroll-margin-top: 100px;
}

/* Blockquote: 3-px-Bordeaux-Border-Left, Spectral italic, leichte
   Hervorhebung. Foundation für Editoren, die Zitate setzen wollen. */
body.view-article .com-content-article__body blockquote {
  margin: var(--space-6) 0;
  padding: var(--space-3) var(--space-5);
  border-left: var(--border-w-strong) solid var(--brand-bordeaux);
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 400;
  font-size: var(--fs-lg);
  line-height: var(--lh-snug);
  color: var(--neutral-anthracite);
}
body.view-article .com-content-article__body blockquote > p:last-child {
  margin-bottom: 0;
}

/* Listen mit konsistentem Spacing. */
body.view-article .com-content-article__body ul,
body.view-article .com-content-article__body ol {
  margin: 0 0 var(--space-5);
  padding-left: var(--space-6);
}
body.view-article .com-content-article__body li {
  margin-bottom: var(--space-2);
}
body.view-article .com-content-article__body li:last-child {
  margin-bottom: 0;
}

/* Inline-Bilder im Body — falls Editoren Bilder im Fließtext einfügen,
   bekommen sie konsistente Rundung + Spacing. */
body.view-article .com-content-article__body img {
  max-width: 100%;
  height: auto;
  border-radius: var(--radius-md);
  margin: var(--space-5) 0;
  display: block;
}

/* Inline-Links: Bordeaux-Unterstrich (analog Foundation). */
body.view-article .com-content-article__body a {
  color: var(--brand-bordeaux);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  transition: color var(--dur-base) var(--ease-out);
}
body.view-article .com-content-article__body a:hover {
  color: var(--brand-bordeaux-deep);
}

/* Mobile-Reduktion der Body-Typografie. */
@media (max-width: 520px) {
  body.view-article .com-content-article__body {
    font-size: 16px;
    line-height: 1.65;
  }
  body.view-article .com-content-article__body > h2 {
    font-size: 22px;
    margin-top: var(--space-6);
  }
  body.view-article .com-content-article__body > h3 {
    font-size: 19px;
  }
  body.view-article .com-content-article__body blockquote {
    font-size: var(--fs-md);
    padding: var(--space-2) var(--space-4);
  }
}

/* --- S-10 Phase 6: Ignite Gallery — Output stylen --------------- */

/* Ignite-Gallery rendert per Shortcode als `<div class="ig-main-scope-
   wrapper profile-3 …"> > .ig-gallery-wrapper > .ig-thumbs-grid >
   .ig-thumbs-grid-block > .ig-grid-img-link(a) > img`. Wir machen daraus
   einen horizontalen Scroll-Strip (analog Termine-Strip S-3). Den
   kompletten 2-spaltigen Section-Header (Eyebrow + Titel links,
   „Alle Fotos →" rechts) rendert das Content-Plugin
   `plg_content_mvi_gallery_link` als echten `.mvi-gallery-head`-DOM-
   Block VOR der Galerie (onContentPrepare) — frühere CSS-Pseudo-
   Eyebrow/Titel + nachgestellter Link sind ersetzt (S-10-6 Polish). */

/* Gemeinsamer Breakout für Header UND Strip aus der 720-px-Lesespalte
   auf **container-wide mit 24-px-Guttern** (NICHT 100vw) — gleiche
   Breite wie die Startseiten-Sektionen (Termine S-3 / Aktuelles S-4).
   Box 1232 px @ VP1280 / 1320 gecappt ≥1368 / 342 @ VP390, je 24 px
   Abstand zum Viewport. Das innere padding (var(--gutter)) setzt den
   Content nochmals 24 px ein → Content-Breite = .mvi-section__inner
   (1184 @1280). margin-left zentriert den Block über der schmalen
   Spalte (100% = 720). Header + Strip exakt gleich breit/zentriert. */
body.view-article .com-content-article__body .mvi-gallery-head,
/* itemid-979 („Unsere Register", natives pid=4) UND itemid-937
   („Chronik", S-13) sind hier AUSGENOMMEN:
   - 979: Diagnose 2026-05-18 — der Sidebar-Overlap kam allein aus diesem
     globalen Breakout (width:min(...) + negativem margin-left). Ohne
     die Regel sitzt die pid=4-Galerie ohne jede width/margin-Angabe
     sauber in der Content-Spalte (settled @1280 = x408/w800).
   - 937: Die Chronik-Galerien sitzen in `.mvi-epoch__body`-Blöcken der
     Zeitleiste und sollen IN der Content-Spalte bleiben (kein Breakout
     auf container-wide). Ohne :not(.itemid-937) würde jede Epoch-Galerie
     aus der Lesespalte rauslaufen — visuell bricht das die Bullet-/Linie-
     Alignierung. */
body.view-article:not(.itemid-979):not(.itemid-937) .com-content-article__body .ig-main-scope-wrapper {
  position: relative;
  box-sizing: border-box;
  width: min(var(--container-wide), calc(100vw - 2 * var(--gutter)));
  margin-left: calc(
    (min(var(--container-wide), calc(100vw - 2 * var(--gutter))) - 100%) / -2
  );
  margin-right: 0;
  padding-left: var(--gutter);
  padding-right: var(--gutter);
}
/* Strip + Grid füllen den Breakout-Wrapper voll (kein eigener
   width-Constraint, der sie einschränkt). */
body.view-article .com-content-article__body .ig-main-scope-wrapper .ig-gallery-wrapper,
body.view-article .com-content-article__body .ig-main-scope-wrapper .ig-thumbs-grid {
  width: 100%;
  max-width: none;
  margin-left: 0;
  margin-right: 0;
}

/* === „Unsere Register" (itemid 979): natives Ignite-Profil pid=4 ========
   Galerie sitzt vom globalen S-10-Breakout ausgenommen (:not(.itemid-979)
   oben) sauber in der Content-Spalte. Dieser Block: MVI-Vereinheitlichung
   der pid=4-Galerie (Großbild + Caption + horizontaler Thumb-Strip) auf
   den Look der Beitrags-Galerie (pid=3 /seefest). Analyse-Stand
   2026-05-18 (Live-DOM /ueber-uns/unsere-register). Lightbox = eigener
   Block weiter unten (siehe „ig-lightbox"). */

/* (A) Abstand Lead-Absatz → Großbild = --space-4 (16) — aber AUSSERHALB
   der Karte. Befund 2026-05-19: `margin-top` am Bild erzeugte die
   16-px-Lücke INNERHALB von .ig-slideshow-item-inner-lboxon (Cream-bg
   + 1-px-Border) = „weißer Strich oben". Lösung: Abstand auf die
   .ig-slideshow-Bühne (Flex-Item → kein Collapse) legen, Bild-
   margin-top auf 0. So sitzt der Abstand vor der Karte, nicht darin. */
/* (R5-1) `body.itemid-979 .ig-slideshow { margin-top }` ENTFERNT —
   kein Extra-Abstand mehr vor der Galerie-Karte (Bild-margin-top:0
   bleibt; Lead→Bild-Abstand = Prosa-margin der Lead-Absatzes). */
body.itemid-979 .ig-slideshow-image {
  margin-top: 0 !important;
  object-fit: cover !important;       /* füllt die Box randlos, wie Beitragsbilder */
  border-radius: 0 !important;        /* Radius kommt vom Container */
}

/* (P2) Großbild + Caption als EINE gerundete Karte: Container
   .ig-slideshow-item-inner-lboxon bekommt --radius-md + subtilen Rahmen
   + overflow:hidden → alle vier Ecken gerundet, Caption-Leiste mit-
   geclippt. Identisch zu Beitragsbildern (radius-md, border-subtle). */
body.itemid-979 .ig-slideshow-item-inner-lboxon {
  border-radius: var(--radius-md);
  overflow: hidden;
  border: var(--border-w-thin) solid var(--border-subtle);
  background: transparent;            /* Bild deckt cover-randlos; kein Cream-Peek */
  anchor-name: --ig979-card;          /* (R4-3) Anker für orientierungsunabh. Pfeile (Chromium); Fallback s.u. */
}

/* (R5-2) Slideshow-Pfeile = rechteckiger dunkler Kasten + Ignites
   natives Pfeil-SVG (identisch zur Lightbox). Befund 2026-05-19:
   Lightbox-Referenz `.ig-lightbox-button-left` nutzt DASSELBE Ignite-
   SVG `<polyline fill=none stroke-width=2>`, computed Stroke
   `rgba(255,255,255,0.7)`, transparent, kein Radius. → ::after-Chevron
   (R4) ENTFERNT, Ignite-SVG WIEDER sichtbar (gleiches Markup = exakt
   gleiche Pfeilform), Stroke weiß (--fg-on-bordeaux). Kasten:
   rechteckig (border-radius:0), dunkel color-mix(--neutral-black 35%),
   Hover 58 %, Pfeil per Flexbox exakt zentriert. Position bleibt
   (R4): 23%-Token-Fallback + Anchor-Positioning (Chromium) relativ
   zur Bildkarte. Scope nur `.ig-slideshow` (Lightbox unberührt). */
body.itemid-979 {
  --ig979-arrow-edge: 23%;
}
body.itemid-979 .ig-slideshow .ig-slideshow-button {
  box-sizing: border-box !important;
  /* (R7-1) Sauberer quadratischer 44×44-Kasten — EIN Grauton.
     Befund 2026-05-19: das SVG-Element trägt einen EIGENEN bg
     (`rgba(0,0,0,0.3)` von Ignites `ignitegallery.css`) ÜBER unserem
     Button-bg → zwei Grautöne im SVG-Bereich. Fix: nativer Button
     `background:transparent`, eigener Kasten via `::before`, SVG-bg
     ebenfalls transparent → nur eine Graufläche. (R6-1 `padding:0`
     bleibt — neutralisiert Ignites Default `padding:25 25 25 0`.) */
  width: 44px !important;
  height: 44px !important;
  min-height: 0 !important;
  padding: 0 !important;
  top: 50% !important;
  transform: translateY(-50%) !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  background: transparent !important;          /* (R7-1) statt color-mix → ::before zeichnet */
  color: var(--fg-on-bordeaux) !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  opacity: 1;
  overflow: hidden !important;
  position: relative;                          /* (R7-1) Kontext fürs ::before */
}
/* (R7-1) Der Kasten: einzige Graufläche, hinter SVG. */
body.itemid-979 .ig-slideshow .ig-slideshow-button::before {
  content: "";
  position: absolute;
  inset: 0;
  background: color-mix(in srgb, var(--neutral-black) 35%, transparent);
  z-index: 0;
  transition: background var(--dur-base) var(--ease-out);
}
body.itemid-979 .ig-slideshow .ig-slideshow-button:hover::before,
body.itemid-979 .ig-slideshow .ig-slideshow-button:focus-visible::before {
  background: color-mix(in srgb, var(--neutral-black) 58%, transparent);
}
body.itemid-979 .ig-slideshow .ig-slideshow-button-left {
  left: var(--ig979-arrow-edge) !important;
  right: auto !important;
}
body.itemid-979 .ig-slideshow .ig-slideshow-button-right {
  right: var(--ig979-arrow-edge) !important;
  left: auto !important;
}
/* Ignites natives Pfeil-SVG sichtbar (wie Lightbox), weißer Stroke,
   scharf bei jeder Größe (non-scaling), Flex-zentriert. SVG-eigenes
   bg (von Ignite `rgba(0,0,0,0.3)`) eliminiert + über ::before via z-index. */
body.itemid-979 .ig-slideshow .ig-slideshow-button svg {
  display: block !important;
  width: auto !important;
  height: 22px !important;
  margin: 0 !important;
  overflow: visible;
  background: transparent !important;          /* (R7-1) kill Ignites SVG-bg */
  position: relative;
  z-index: 1;                                  /* über ::before */
}
body.itemid-979 .ig-slideshow .ig-slideshow-button svg polyline,
body.itemid-979 .ig-slideshow .ig-slideshow-button svg * {
  stroke: currentColor !important;
  stroke-width: 2.5 !important;
  vector-effect: non-scaling-stroke;
  fill: none !important;
}
/* (R7-2) Pfeile INSIDE der Bildkarte (am inneren Rand), NICHT straddling
   die Kante. Befund: bei Querformat (Karte ≈ Stagebreite) ragt straddling-
   Pfeil über die Stage hinaus → wird von `.ig-slideshow{overflow:hidden}`
   (R6-2) abgeschnitten. Lösung: Anchor-Positioning OHNE translateX —
   Pfeil-linke-Kante = Karten-linke-Kante (left btn), Pfeil-rechte-Kante
   = Karten-rechte-Kante (right btn). Damit sitzen die Pfeile vollständig
   im Karten-overflow:hidden, kein Clipping unabhängig vom Format. */
@supports (left: anchor(--ig979-card left)) {
  body.itemid-979 .ig-slideshow .ig-slideshow-button {
    position-anchor: --ig979-card;
    top: anchor(--ig979-card center) !important;
    transform: translateY(-50%) !important;     /* nur vertikal zentriert */
  }
  body.itemid-979 .ig-slideshow .ig-slideshow-button-left {
    left: anchor(--ig979-card left) !important;
    right: auto !important;
  }
  body.itemid-979 .ig-slideshow .ig-slideshow-button-right {
    right: anchor(--ig979-card right) !important;
    left: auto !important;
  }
}

/* (R7-2+3) Stage `overflow:hidden` (R6-2) ZURÜCKGENOMMEN — sonst werden
   Pfeile bei Querformat-Karten (≈ Stagebreite) am Bildrand abgeschnitten.
   Anti-Flicker stützt sich jetzt allein auf `transition` + die ohnehin
   bestehenden Karten-overflow:hidden + Anchor-Positioning inside-card.
   MutationObserver (R7-Diagnose, 1,2 s nach Slide-Click): keine
   UL-Attribut-Mutationen → das beim Format-Wechsel beobachtete Flackern
   kommt nicht von UL-Höhe, sondern wahrscheinlich von der KARTEN-Breite
   (Ignite passt `.ig-slideshow-item-inner-lboxon` per Aspekt an).
   Transition auch dort + Bump 0.15→0.2s. */
body.itemid-979 .ig-slideshow {
  overflow: visible !important;
}
body.itemid-979 .igui-slideshow-items,
body.itemid-979 .ig-slideshow-items {
  transition: height 0.2s ease !important;
}
body.itemid-979 .ig-slideshow-item-inner-lboxon {
  transition: width 0.2s ease, height 0.2s ease !important;
}

/* (C) Caption als Bild-Overlay mit Gradient-Scrim (statt Cream-Block).
   Befund 2026-05-19: .ig-description-overlay liegt nativ als
   absolute Bottom-Overlay AUF dem Bild (OVERLAY bestätigt). MVI:
   dunkler Verlauf nach oben transparent, Titel Spectral creme,
   Personen Source Sans 3 creme — analog Beitragsbild-Caption.
   h3 responsiv (clamp) + Umbruch → kein Mobile-Clip. */
body.itemid-979 .ig-slideshow .ig-description-overlay {
  position: absolute;
  inset: auto 0 0 0;
  background: linear-gradient(
    to top,
    color-mix(in srgb, var(--neutral-black) 80%, transparent) 0%,
    color-mix(in srgb, var(--neutral-black) 45%, transparent) 55%,
    transparent 100%
  ) !important;
  border-top: 0 !important;
  padding: var(--space-7) var(--space-4) var(--space-4) !important;
  text-align: center;
}
body.itemid-979 .ig-description-overlay h3 {
  margin: 0;
  font-family: var(--font-display);
  font-size: clamp(var(--fs-md), 4.2vw, var(--fs-lg));
  font-weight: 600;
  line-height: 1.2;
  color: var(--fg-on-bordeaux);
  white-space: normal;
  overflow-wrap: normal;
  hyphens: auto;
}
body.itemid-979 .ig-description-overlay p {
  margin: 2px 0 0;
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  line-height: 1.35;
  color: color-mix(in srgb, var(--fg-on-bordeaux) 85%, transparent);
  white-space: normal;
  overflow-wrap: break-word;
}
/* (4) Mobile-Caption (≤520): Befund 2026-05-19 — Caption ist auch
   mobil ein OVERLAY auf dem Bild (capVsImg:OVERLAY) mit EIGENEM
   Gradient-Scrim, bereits zentriert + Spectral/Source-Sans. Daher
   `--fg-default/--fg-secondary` (dunkel) NICHT angewandt (auf dem
   dunklen Scrim unlesbar; creme = robust, auch falls Ignite die
   Caption auf einem echten Gerät darunter rendert — der eigene
   Gradient-bg bleibt am Element). Nur Padding gestrafft: Seiten/
   unten --space-2, oben minimaler Scrim-Verlauf. */
@media (max-width: 520px) {
  body.itemid-979 .ig-slideshow .ig-description-overlay {
    padding: var(--space-4) var(--space-2) var(--space-2) !important;
  }
  body.itemid-979 .ig-description-overlay p {
    font-size: 13px;
    line-height: 1.3;
  }
}
/* (R4-4) Mobile-Caption DEFENSIV: Playwright-Emulation behält
   `ig-notphone` (Ignite-Phone-Erkennung ist UA-basiert) → echtes
   Gerät kann die Caption anders rendern (ggf. links/darunter). Daher
   alle plausiblen Touch-/Schmalbreiten-Queries: Titel + Personenliste
   IMMER zentriert (mit !important), Spectral / Source Sans 3,
   creme-Token (auf Eigen-Scrim lesbar, robust auch falls Block
   darunter), Padding --space-2. (Befund: Emu zeigt bereits
   OVERLAY/center/Spectral-creme; dunkle Tokens wären auf dem Scrim
   unlesbar → bewusst creme. Nur am echten Gerät final verifizierbar.) */
@media (max-width: 768px), (pointer: coarse), (hover: none) {
  body.itemid-979 .ig-description-overlay,
  body.itemid-979 .ig-description-overlay h3,
  body.itemid-979 .ig-description-overlay p {
    text-align: center !important;
  }
  body.itemid-979 .ig-description-overlay h3 {
    font-family: var(--font-display) !important;
    color: var(--fg-on-bordeaux) !important;
  }
  body.itemid-979 .ig-description-overlay p {
    font-family: var(--font-body) !important;
    color: color-mix(in srgb, var(--fg-on-bordeaux) 85%, transparent) !important;
  }
  body.itemid-979 .ig-slideshow .ig-description-overlay {
    padding: var(--space-4) var(--space-2) var(--space-2) !important;
  }
}
/* (R7-4) Strategie-Wechsel: Overlay-Experiment auf Mobile AUFGEGEBEN
   (zu fragil — Ignite hat auf echtem ig-phone-UA einen eigenen Modus
   `.ig-image-descriptions-below` UNTER dem Bild, den unsere R5-Force-
   Overlay-Hacks nicht zuverlässig dominieren). Stattdessen:
   `.ig-image-descriptions-below` (nativ auf ig-phone) wieder sichtbar
   lassen und MVI-konform stylen — zentriert, Spectral-Titel, Source-
   Sans-Personenliste, Token-Farben (dunkel, auf Page-bg). Desktop-
   Overlay (siehe (C) oben) bleibt unangetastet. */
body.itemid-979 .ig-image-descriptions-below,
body.itemid-979 .ig-image-descriptions-below .ig-image-description {
  text-align: center !important;
  padding: var(--space-3) var(--space-4) 0 !important;
}
body.itemid-979 .ig-image-descriptions-below h3,
body.itemid-979 .ig-image-description h3 {
  margin: 0 !important;
  font-family: var(--font-display) !important;
  font-size: var(--fs-lg) !important;
  font-weight: 600 !important;
  line-height: 1.25 !important;
  color: var(--fg-default) !important;
}
body.itemid-979 .ig-image-descriptions-below p,
body.itemid-979 .ig-image-description p {
  margin: 2px 0 0 !important;
  font-family: var(--font-body) !important;
  font-size: var(--fs-sm) !important;
  line-height: 1.4 !important;
  color: var(--fg-secondary) !important;
}

/* (P4) Thumb-Strip 1:1 wie Beitrags-Galerie pid=3: 200×200-Kachel,
   --radius-md, subtiler Rahmen, Hover-Lift translateY(-2)+shadow-md,
   img object-fit:cover, KEINE Chevron-Pfeile — nur horizontal scrollbar,
   aktiver Thumb = weicher Gold-Schein (box-shadow) statt harter Outline.
   WICHTIG: Ignite legt die `<li>`-Thumbs per JS auf `position:absolute`
   in `ul.ig-slider-items` (+ transform-Offset für die Pfeil-Navigation).
   Für nativen Scroll: Items zurück in den Flow (position:static!),
   Track = ul auf `width:max-content` ohne JS-transform, Viewport =
   .ig-thumb-scroller-inner mit overflow-x:auto. Gold NUR im Below-
   Strip → kein Leak in die Lightbox-Vertikale (.ig-thumb-scroller-lbox). */
body.itemid-979 .ig-thumb-scroller-left,
body.itemid-979 .ig-thumb-scroller-right {
  display: none !important;
}
/* Scroll-Viewport = .ig-thumb-scroller-main-below selbst. Es ist ein
   FLEX-Item von .ig-gallery-wrapper → default min-width:auto ließ es auf
   die 4452-px-Trackbreite wachsen (Iter 2: nicht scrollbar). min-width:0
   zwingt es zurück auf Spaltenbreite, overflow-x:auto scrollt intern.
   Alle inneren Ebenen = max-content/visible (reine Pass-through). */
body.itemid-979 .ig-thumb-scroller-main-below {
  min-width: 0 !important;
  width: 100% !important;
  max-width: 100% !important;
  overflow-x: auto !important;
  overflow-y: hidden !important;
  /* (R5-3) oben --space-2 (Gap Bild→Strip); UNTEN --space-4: Befund
     2026-05-19 — der Container clippt mit overflow-y:hidden (zwingend
     bei overflow-x:auto) den Hover-Schatten (--shadow-md ragt ~22 px
     nach unten). Bottom-Padding = Schatten-Luft (wie pid=3-Referenz),
     KEIN Ignite-Reset/Spezifitäts-Problem (box-shadow war schon da). */
  padding: var(--space-2) 0 var(--space-4) !important;
  scroll-behavior: smooth;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
body.itemid-979 .ig-thumb-scroller-main-below::-webkit-scrollbar {
  display: none;
}
body.itemid-979 .ig-thumb-scroller-main-below .ig-thumb-scroller,
body.itemid-979 .ig-thumb-scroller-main-below .ig-thumb-scroller-horizontal,
body.itemid-979 .ig-thumb-scroller-main-below .ig-thumb-scroller-horizontal-inner,
body.itemid-979 .ig-thumb-scroller-main-below .ig-thumb-scroller-inner {
  overflow: visible !important;
  width: max-content !important;
  height: auto !important;
  transform: none !important;
}
/* Track: natürliche Breite, kein JS-transform */
body.itemid-979 .ig-thumb-scroller-main-below .ig-slider-items {
  position: static !important;
  width: max-content !important;
  height: auto !important;
  transform: none !important;
  white-space: nowrap;
  margin: 0 !important;
  padding: 0 !important;
  list-style: none !important;
}
/* Kachel: zurück in den Flow. (1) KEIN Rahmen/Box/Outline mehr —
   aktiver Thumb nur über Opacity (inaktiv 0.65 / aktiv 1, 0.2s).
   border-radius bleibt (gerundete Ecken sind kein „Rahmen").
   (5) Hover-Lift bit-identisch zu pid=3 (verifiziert: matrix(…,-2) +
   --shadow-md + 0.22s cubic-bezier(.16,1,.3,1)). */
body.itemid-979 .ig-thumb-scroller-main-below .ig-scroller-img-wrapper {
  position: static !important;
  float: none !important;
  transform: none !important;
  top: auto !important;
  left: auto !important;
  display: inline-block;
  box-sizing: border-box;
  width: 200px !important;
  height: 200px !important;
  margin: 0 var(--space-3) 0 0 !important;
  padding: 0 !important;
  border: 0 !important;
  border-radius: var(--radius-md);
  box-shadow: none !important;
  outline: none !important;
  overflow: hidden;
  cursor: pointer;
  vertical-align: top;
  opacity: 0.65;
  transition: opacity 0.2s var(--ease-out),
              transform var(--dur-base) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out);
}
/* (R4-5) Hover-Lift NUR auf echten Zeigegeräten (Maus). Befund: Ignite
   setzt die Aktiv-Klasse `.ig-active-thumb` erst bei touchend (nach dem
   Bildwechsel) — die einzige Aktiv-Klasse, keine separate Touch-Klasse.
   Auf Touch löst aber `:hover` (sticky-hover beim Tap) ein verfrühtes
   Opacity/Lift-Flackern VOR dem Wechsel aus. `@media (hover:hover) and
   (pointer:fine)` koppelt :hover von Touch ab → dort treibt
   ausschließlich `.ig-active-thumb` die Opacity (post-touchend). */
@media (hover: hover) and (pointer: fine) {
  body.itemid-979 .ig-thumb-scroller-main-below .ig-scroller-img-wrapper:hover {
    opacity: 1;
    transform: translateY(-2px) !important;
    box-shadow: var(--shadow-md) !important;
  }
}
body.itemid-979 .ig-thumb-scroller-main-below .ig-img-link {
  display: block !important;
  width: 100% !important;
  height: 100% !important;
  padding: 0 !important;
  margin: 0 !important;
}
body.itemid-979 .ig-thumb-scroller-main-below .ig-scroller-img {
  width: 100% !important;
  height: 100% !important;
  object-fit: cover !important;
  border-radius: 0 !important;
  margin: 0 !important;
}
/* (1) Aktiver Thumb: KEIN Gold-Schein/Rahmen/Outline mehr — nur volle
   Opacity (Hervorhebung rein über Helligkeit ggü. inaktiv 0.65). */
body.itemid-979 .ig-thumb-scroller-main-below .ig-scroller-img-wrapper.ig-active-thumb {
  opacity: 1;
  border: 0 !important;
  box-shadow: none !important;
  outline: none !important;
}

/* Scroll-zu-Galerie lässt Platz unter dem 88-px-Sticky-Header (z=100). */
body.itemid-979 .com-content-article__body .ig-main-scope-wrapper,
body.itemid-979 .ig-slideshow {
  scroll-margin-top: calc(var(--header-h-desktop) + var(--space-5));
}
/* Ignite-Bildzähler „1/21" (oben rechts, Galerie) ausblenden — NICHT
   .ig-description-overlay (= Caption). */
body.itemid-979 .ig-slideshow .ig-slideshow-overlay {
  display: none !important;
}

/* === „Unsere Register" pid=4 — Ignite-Lightbox (Vollbild) ============
   Ignite hängt die Lightbox an <body> → Scope `body.itemid-979
   .igui-lightbox.profile-4` (profile-4 = pid=4 = ausschließlich diese
   Galerie). KONSERVATIV: Ignites Positionierung/Funktion NICHT
   anfassen (Panel rendert bereits korrekt als Vollbild-Overlay) —
   nur MVI-Kosmetik, Caption sichtbar (P5), Gold-Leak begrenzen (P6),
   Mobile-Fit (P7), MVI-Look (P8). Analyse 2026-05-18. */
/* (P8) Warmer MVI-Dunkelgrund statt reinem Schwarz. */
body.itemid-979 .igui-lightbox.profile-4 {
  background: var(--neutral-black) !important;
}
/* (P5) Bildunterschrift VOLLSTÄNDIG: Ignite gibt dem Bottom-Wrapper
   ~60 px fix → mehrzeilige Personenliste wird abgeschnitten. Höhe
   auto, kein Clip, lesbarer Scrim nach oben. */
body.itemid-979 .igui-lightbox.profile-4 .ig-lightbox-bottom-wrapper,
body.itemid-979 .igui-lightbox.profile-4 .ig-lightbox-descriptions {
  height: auto !important;
  max-height: none !important;
  min-height: 0 !important;
  overflow: visible !important;
}
body.itemid-979 .igui-lightbox.profile-4 .ig-lightbox-bottom-wrapper {
  padding: var(--space-5) var(--space-5) var(--space-4) !important;
  background: linear-gradient(
    to top,
    color-mix(in srgb, var(--neutral-black) 88%, transparent),
    transparent
  ) !important;
  text-align: center;
  pointer-events: none;            /* blockiert Bild-/Nav-Klicks nicht */
}
body.itemid-979 .igui-lightbox.profile-4 .igui-lightbox-caption,
body.itemid-979 .igui-lightbox.profile-4 .ig-lightbox-descriptions {
  text-align: center !important;
}
body.itemid-979 .igui-lightbox.profile-4 .ig-lightbox-descriptions h3 {
  margin: 0 0 2px;
  font-family: var(--font-display);
  font-size: var(--fs-lg);
  font-weight: 600;
  line-height: 1.25;
  color: var(--fg-on-bordeaux);
}
body.itemid-979 .igui-lightbox.profile-4 .ig-lightbox-descriptions p {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  line-height: 1.4;
  color: color-mix(in srgb, var(--fg-on-bordeaux) 85%, transparent);
}
/* (P8) Toolbar oben: MVI-Typo, cremefarbene Zahlen/Icons. */
body.itemid-979 .igui-lightbox.profile-4 .igui-lightbox-toolbar,
body.itemid-979 .igui-lightbox.profile-4 .ig-lightbox-buttons {
  font-family: var(--font-body);
  color: var(--fg-on-bordeaux);
}
body.itemid-979 .igui-lightbox.profile-4 .ig-hits,
body.itemid-979 .igui-lightbox.profile-4 .ig-img-numbering {
  font-size: var(--fs-sm);
  color: color-mix(in srgb, var(--fg-on-bordeaux) 80%, transparent);
}
/* (1) Lightbox-Thumbs: KEIN Rahmen/Box/Outline (auch hier nicht) —
   aktiver Thumb nur über Opacity (inaktiv 0.65 / aktiv 1, 0.2s),
   konsistent zum Inline-Strip. */
body.itemid-979 .igui-lightbox.profile-4 .ig-scroller-img-wrapper {
  border: 0 !important;
  box-shadow: none !important;
  outline: none !important;
  border-radius: var(--radius-sm);
  overflow: hidden;
  opacity: 0.65;
  transition: opacity 0.2s var(--ease-out);
}
body.itemid-979 .igui-lightbox.profile-4 .ig-scroller-img-wrapper.ig-active-thumb,
body.itemid-979 .igui-lightbox.profile-4 .ig-scroller-img-wrapper:hover {
  opacity: 1;
  border: 0 !important;
  box-shadow: none !important;
  outline: none !important;
}
/* (P7) Mobile: rechte Vertikal-Thumbs ausblenden (Platz fürs Bild),
   Bild contain in den Restraum (Lupe/Bild nicht abgeschnitten),
   Caption kompakt. Panel-Positionierung bewusst NICHT überschrieben. */
@media (max-width: 520px) {
  body.itemid-979 .igui-lightbox.profile-4 .ig-lightbox-right-wrapper {
    display: none !important;
  }
  body.itemid-979 .igui-lightbox.profile-4 .igui-lightbox-items img,
  body.itemid-979 .igui-lightbox.profile-4 .ig-slideshow-image {
    max-width: 100vw !important;
    max-height: calc(100dvh - 132px) !important;
    object-fit: contain !important;
  }
  body.itemid-979 .igui-lightbox.profile-4 .ig-lightbox-bottom-wrapper {
    padding: var(--space-4) var(--space-3) !important;
  }
  body.itemid-979 .igui-lightbox.profile-4 .ig-lightbox-descriptions h3 {
    font-size: var(--fs-md);
  }
}

/* Leere JCE-Paragraphen ausblenden (erzeugen sonst unerwünschten
   vertikalen Abstand). `p:empty` + `:has(>br:only-child)` +
   `:has(>span:empty)`. ACHTUNG: ein literales `<p>&nbsp;</p>` ist
   per CSS NICHT selektierbar (nbsp ist ein Textknoten → kein :empty,
   kein Selektor matcht Textinhalt) — solche Fälle bräuchten einen
   Content-/Plugin-Fix. min-height:0 + margin-collapse fangen den Rest. */
/* WICHTIG: `:not(.com-content-article__intro)` — der Intro-Wrapper trägt
   ZUSÄTZLICH die Klasse `.com-content-article__body`. `br:only-child`
   ignoriert Textknoten, d. h. ein inhaltsvoller `<p>Text<br>Text</p>`
   (genau EIN <br>, sehr häufig) matcht `:has(> br:only-child)` und
   würde sonst den kompletten Lead-Absatz ausblenden (Bug Unsere
   Register, Diagnose 2026-05-18). Intro daher generell ausnehmen —
   nur der Rest-Body bekommt die Leer-Absatz-Bereinigung.

   MVI S-13 (2026-05-20): Selektor von `p` auf `> p` (Direct-Child)
   reduziert. Ohne `>` matchte die Regel auch VERSCHACHTELTE Absätze
   (z. B. `.mvi-epoch__body p` in der Chronik-Zeitleiste). Damit
   wurden `<p>Im Jahre 1896…<br></p>`-Patterns ausgeblendet, obwohl
   sie sichtbaren Text enthielten — Diagnose 2026-05-20: kompletter
   Epoch-1896-Fließtext display:none. Direct-Child-Restriktion
   schützt jede Verschachtelung (Epoch-Body, Blockquotes, Custom-
   Wrapper); für flache normale Artikel keine Änderung (deren `<p>`
   sind ohnehin Direct-Children des `__body`). */
body.view-article:not(.itemid-942):not(.itemid-1221) .com-content-article__body:not(.com-content-article__intro) > p:empty,
body.view-article:not(.itemid-942):not(.itemid-1221) .com-content-article__body:not(.com-content-article__intro) > p:has(> br:only-child),
body.view-article:not(.itemid-942):not(.itemid-1221) .com-content-article__body:not(.com-content-article__intro) > p:has(> span:empty) {
  display: none;
}
body.view-article .com-content-article__body p {
  min-height: 0;
}
/* Margin-Collapse zwischen (Rest-)Absatz und Galerie-Block bzw.
   nach der Galerie. `.mvi-article-gallery-wrapper` existiert in dieser
   Implementierung nicht — wirksame Klassen sind `.mvi-gallery-head`
   (Plugin-Header vor der Galerie) und `.ig-main-scope-wrapper`. */
body.view-article .com-content-article__body p + .mvi-gallery-head,
body.view-article .com-content-article__body p + .ig-main-scope-wrapper,
body.view-article .com-content-article__body .ig-main-scope-wrapper + p {
  margin-top: 0;
}

/* Galerie-Header (Plugin-Output): 2-spaltig, links Eyebrow+Titel,
   rechts „Alle Fotos →". border-top + padding-top + margin-top =
   48-px-Trennung vom Fließtext (analog .mvi-section__head). */
body.view-article .com-content-article__body .mvi-gallery-head {
  display: flex;
  justify-content: space-between;
  /* `center` (statt `flex-end`) — mit Nav als 3. flex-child sitzen die
     44-px-Buttons auf derselben Mittellinie wie Eyebrow+Titel und Link
     (R4 2026-05-23, Termine-Pattern). */
  align-items: center;
  gap: var(--space-5);
  margin-top: var(--space-7);
  margin-bottom: var(--space-5);
  padding-top: var(--space-7);
  border-top: var(--border-w-thin) solid var(--border-subtle);
}
/* Eyebrow nutzt jetzt die Projekt-Standard-Klasse .mvi-section__eyebrow
   (linker 28-px-Gold-::before-Strich + Typo, definiert ~Z. 1820). Die
   frühere .mvi-gallery-head__eyebrow-Regel ist entfernt; der 8-px-Gap
   Eyebrow→Titel wird via Titel-margin-top getragen (analog
   .mvi-section--sponsoren .mvi-section__title, S-8). */
.mvi-gallery-head__title {
  margin: var(--space-2) 0 0;                          /* 8 px Gap zum Eyebrow darüber */
  font-family: var(--font-display);
  font-size: 38px;                                     /* Desktop — Spec (fs-3xl wäre 48) */
  font-weight: 600;
  line-height: 1.15;
  color: var(--brand-bordeaux);
}
/* „Alle Fotos →" exakt wie .mvi-section__more. `text-decoration: none`
   ist zwingend: die S-10-Prosa-Link-Regel unterstreicht jeden <a> im
   Body zusätzlich → zusammen mit dem border-bottom ein DOPPEL-Strich.
   Nur der border-bottom soll der (einzige) Unterstrich sein. */
body.view-article .com-content-article__body .mvi-gallery-head .mvi-section__more {
  flex: 0 0 auto;
  font-family: var(--font-body);
  font-size: var(--fs-sm);                             /* 14 */
  font-weight: 600;
  color: var(--brand-bordeaux);
  text-decoration: none;
  border-bottom: var(--border-w-thin) solid var(--brand-bordeaux);
  white-space: nowrap;
}

/* Strip-Wrapper: nur noch der Scroll-Strip (Header übernimmt Trennung +
   Titel). Kein border-top/padding/Pseudo mehr. margin-bottom 0 →
   Abstand zur Prev/Next-Navigation = deren eigene margin-top
   (var(--space-7) = 48, S-10 Phase 7) → total 48 px (KORREKTUR 4). */
body.view-article .com-content-article__body .ig-main-scope-wrapper {
  margin-top: 0;
  margin-bottom: 0;
}

/* Ignites Thumbnail-Container → horizontaler Scroll-Strip. padding-top
   gibt dem Hover-Lift + Schatten Luft (overflow-x:auto ⇒ overflow-y
   clippt sonst). */
body.view-article .com-content-article__body .ig-main-scope-wrapper .ig-thumbs-grid {
  display: flex !important;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  gap: var(--space-3);                                 /* 12 */
  padding: var(--space-3) 0 var(--space-2);            /* 12 oben (Hover-Luft) / 8 unten */
  height: auto !important;
  position: static !important;
  scrollbar-width: none;                               /* Firefox */
  -ms-overflow-style: none;                            /* alt-Edge/IE */
}
body.view-article .com-content-article__body .ig-main-scope-wrapper .ig-thumbs-grid::-webkit-scrollbar {
  display: none;                                       /* WebKit/Blink */
}
/* Jedes Thumbnail = fixe 200-px-Kachel im Strip. Ignite positioniert
   die Blocks per JS `position:absolute` (data-igui-grid Stack) → per
   `!important` (schlägt Ignites Inline-Styles) zurück in den Flex-Fluss. */
body.view-article .com-content-article__body .ig-main-scope-wrapper .ig-thumbs-grid-block {
  flex: 0 0 200px;
  scroll-snap-align: start;
  aspect-ratio: 1 / 1;
  overflow: hidden;
  border-radius: var(--radius-md);
  position: static !important;
  top: auto !important;
  left: auto !important;
  transform: none !important;
  width: auto !important;                              /* flex-basis 200 bestimmt die Breite */
  height: auto !important;
  margin: 0 !important;
  padding: 0 !important;
  float: none !important;
  cursor: pointer;
  transition: transform var(--dur-base) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out);
}
/* Hover-Lift identisch .mvi-ens (S-5) / .mvi-card (S-4): transition
   transform+box-shadow --dur-base/--ease-out (oben, Z. ~4401),
   hover translateY(-2px) + --shadow-md. Per Playwright verifiziert
   1:1 deckungsgleich zu .mvi-ens. `transform !important` wegen des
   Ignite-JS-Resets (`transform:none !important`). `box-shadow`
   ebenfalls `!important` — rein defensiv gegen mögliche künftige
   Ignite-CSS-Spezifitäts-Konflikte; aktuell auch ohne wirksam
   (gemessen: shadow-md greift sauber, kein Konflikt). */
body.view-article .com-content-article__body .ig-main-scope-wrapper .ig-thumbs-grid-block:hover {
  transform: translateY(-2px) !important;
  box-shadow: var(--shadow-md) !important;
}
/* Link-Wrapper füllt die 200×200-Kachel, Bild deckt sie ab. */
body.view-article .com-content-article__body .ig-main-scope-wrapper .ig-grid-img-link {
  display: block;
  width: 100% !important;
  height: 100%;
}
body.view-article .com-content-article__body .ig-main-scope-wrapper .ig-thumbs-grid-image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Tablet 521–1050: Titel 30 px (Strip-Kachelbreite bleibt 200 px). */
@media (max-width: 1050px) {
  .mvi-gallery-head__title {
    font-size: 30px;                                   /* Tablet — Spec */
  }
}

/* Mobile ≤ 520: Breakout-Formel greift weiter (342 px @ VP390, 24 px
   je Seite) — KEIN width/margin-Reset mehr. Header bleibt 2-spaltig
   (row + space-between), „Alle Fotos →" steht auf ALLEN Viewports
   rechts (S-10-6 Mobile-Fix 2026-05-17). Nur Titel 24 px + kompakter
   margin-top. Strip scrollt weiter horizontal. */
@media (max-width: 520px) {
  body.view-article .com-content-article__body .mvi-gallery-head {
    flex-direction: row;
    justify-content: space-between;
    align-items: flex-end;
    gap: var(--space-3);
    margin-top: var(--space-6);
  }
  .mvi-gallery-head__title {
    font-size: 24px;                                   /* Mobile — Spec */
  }
}

/* --- S-10 Phase 7: Pagenavigation (Prev/Next Cards) ------------- */

/* Joomla rendert das pagenavigation-Plugin INNERHALB von
   .com-content-article (durch $this->item->pagination im Layout-
   Override). Wir brechen den Block aus der 720-Spalte aus auf
   container-wide — selber Mechanismus wie bei der Galerie (Phase 6). */
/* KORREKTUR S-10-6 (revidiert): border-top + padding-top WIEDER her-
   gestellt (vorige Iteration hatte ihn als „zweiten Strich" entfernt —
   User will den Trennstrich vor Prev/Next doch). Original-Stand:
   border-top 1px border-subtle + padding `var(--space-7) 0 space-8`. */
body.view-article .com-content-article > .mvi-postnav {
  position: relative;
  width: min(var(--container-wide), calc(100vw - 2 * var(--gutter)));
  left: 50%;
  transform: translateX(-50%);
  margin-top: var(--space-7);
  padding: var(--space-7) 0 var(--space-8);
  border-top: 1px solid var(--border-subtle);
}
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__inner {
  max-width: var(--container-wide);
  margin: 0 auto;
  padding-left: var(--space-7);
  padding-right: var(--space-7);
  box-sizing: border-box;
}
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__grid {
  display: grid;
  /* minmax(0,1fr) statt 1fr: 1fr = minmax(auto,1fr) lässt die Spalte nicht unter
     ihr min-content (= längstes unteilbares Wort) schrumpfen — ein langes
     Kompositum wie „Instrumentalausbildung" sprengt sonst auf schmalen Viewports
     (≤520) die Spalte und schiebt die rechte Card über den Viewport-Rand.
     minmax(0,…) erlaubt das Schrumpfen; bei genug Platz identisch zu 1fr. */
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: var(--space-4);
}
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__card {
  display: flex;
  flex-direction: column;
  gap: 0;
  padding: var(--space-4) var(--space-5);    /* 16 / 24 px (kompakt) */
  background: var(--bg-surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-md);
  text-decoration: none;
  color: inherit;
  transition: transform var(--dur-base) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out);
}
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__card:hover,
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__card:focus-visible {
  transform: translateY(-2px);
  box-shadow: var(--shadow-md);
  text-decoration: none;
}
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__card:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 2px;
}
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__card--next {
  text-align: right;
}
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--font-body);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: var(--ls-wide);
  text-transform: uppercase;
  color: var(--fg-muted);
}
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__card--next .mvi-postnav__eyebrow {
  align-self: flex-end;
}
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__arrow {
  font-family: var(--font-body);
  font-size: 14px;
  line-height: 1;
  font-weight: 400;
}
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__date {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-xs);                 /* 12 px (kompakt) */
  color: var(--fg-muted);
  margin-top: var(--space-1);              /* 4 px */
}
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-md);                 /* 18 px (kompakt) */
  line-height: 1.25;
  letter-spacing: -0.005em;
  color: var(--brand-bordeaux);
  margin-top: var(--space-1);              /* 4 px */
  /* Lange Kompositwörter (z. B. „Instrumentalausbildung") im schmalen Mobile-Slot
     umbrechen lassen statt überlaufen — härtet die geteilten Postnav-Regeln gegen
     künftige lange Titel (Paar zu minmax(0,1fr) am __grid). */
  overflow-wrap: anywhere;
}

/* Placeholder hält die Grid-Spalte frei, wenn prev oder next fehlt. */
:is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__placeholder {
  display: block;
}

/* Mobile (≤ 520): bleibt 2-spaltig, aber kompakt — nur Eyebrow + Datum
   (kein Titel). Breakout deaktiviert. */
@media (max-width: 520px) {
  body.view-article .com-content-article > .mvi-postnav {
    position: static;
    width: auto;
    transform: none;
    left: auto;
    padding: var(--space-6) 0 var(--space-7);
  }
  :is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__inner {
    padding-left: 0;
    padding-right: 0;
  }
  /* Grid bleibt 1fr 1fr (Desktop-Default) — kein Single-Column-Override. */
  :is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__card {
    padding: var(--space-3) var(--space-4);  /* 12 16 */
  }
  :is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__eyebrow {
    font-size: 10px;
  }
  :is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__date {
    font-size: 13px;
  }
  :is(body.view-article, body.view-archive, body.itemid-980, body.itemid-941) .mvi-postnav__title {
    display: none;
  }
}

/* R3 Fix 4: Über-Uns-Prev/Next zeigt auf Mobile den SEITENTITEL, nicht
   den Subtitle. Generisch (Aktuelles) blendet ≤520 den __title aus und
   zeigt nur __date (= Datum) — bei Über-Uns ist __date aber der
   Untertitel („Holz · Blech · Schlag") und __title der Seitenname
   („Unsere Register"). Daher SPEZIFISCH für die 4 Über-Uns-Itemids:
   __title wieder einblenden, __date (Untertitel) ausblenden → Card =
   Eyebrow + Seitentitel. Kein generisches Verhalten. */
@media (max-width: 520px) {
  body.itemid-1002 .mvi-postnav__title,
  body.itemid-979 .mvi-postnav__title,
  body.itemid-937 .mvi-postnav__title,
  body.itemid-938 .mvi-postnav__title,
  body.itemid-939 .mvi-postnav__title,
  body.itemid-940 .mvi-postnav__title,
  body.itemid-941 .mvi-postnav__title,
  body.itemid-1244 .mvi-postnav__title,
  body.itemid-1245 .mvi-postnav__title,
  body.itemid-982 .mvi-postnav__title,
  body.itemid-983 .mvi-postnav__title,
  body.itemid-975 .mvi-postnav__title,
  body.itemid-976 .mvi-postnav__title,
  body.itemid-977 .mvi-postnav__title,
  body.itemid-978 .mvi-postnav__title,
  body.itemid-998 .mvi-postnav__title,
  body.itemid-981 .mvi-postnav__title,
  body.itemid-980 .mvi-postnav__title {
    display: block;
  }
  body.itemid-1002 .mvi-postnav__date,
  body.itemid-979 .mvi-postnav__date,
  body.itemid-937 .mvi-postnav__date,
  body.itemid-938 .mvi-postnav__date,
  body.itemid-939 .mvi-postnav__date,
  body.itemid-940 .mvi-postnav__date,
  body.itemid-941 .mvi-postnav__date,
  body.itemid-1244 .mvi-postnav__date,
  body.itemid-1245 .mvi-postnav__date,
  body.itemid-982 .mvi-postnav__date,
  body.itemid-983 .mvi-postnav__date,
  body.itemid-975 .mvi-postnav__date,
  body.itemid-976 .mvi-postnav__date,
  body.itemid-977 .mvi-postnav__date,
  body.itemid-978 .mvi-postnav__date,
  body.itemid-998 .mvi-postnav__date,
  body.itemid-981 .mvi-postnav__date,
  body.itemid-980 .mvi-postnav__date {
    display: none;
  }
}

/* === S-11: ÜBER-UNS — 2-Spalten + Sidebar + Stats + Titel/Eyebrow ========= */
/* Greift auf body.has-sidebar-left (Joomla setzt das, sobald ein Modul auf
   sidebar-left zugewiesen ist — hier NUR die 4 Über-Uns-Itemids
   1002/979/937/938). NICHT mehr an view-article gebunden: itemid-938
   (Archivierte Beiträge) ist view-archive (Diagnose 2026-05-17), würde
   sonst aus Sidebar + 2-Spalten-Grid herausfallen. Startseite hat kein
   sidebar-left-Modul → unberührt. Gemeinsamer Parent = die Cassiopeia
   `.site-grid` (siehe DECISIONS 2026-05-17). */

/* --- Fix 1: 2-Spalten + FULL-BLEED-Banner, Desktop ≥1051 ----------------
   Banner muss wie Startseite/Seefest über die VOLLE Viewport-Breite
   (1280) gehen. Cassiopeias Basis-Grid hat dafür [full-start]/[full-end]-
   Lines; die frühere S-11-`grid-template-columns` (fixe Spalten ohne
   diese Lines) kappte den Banner auf 1232. Lösung: eigene Lines, Banner
   spannt full-start/full-end; Sidebar/Gap/Content per Line platziert.
   Äußere Spalten = `minmax(var(--gutter),1fr)` → wachsen auf breiten
   Viewports und ZENTRIEREN den 2-Spalten-Block; Minimum --gutter (24)
   auf schmalen. Content-Spalte gecappt auf
   `--container-wide − sidebar − gap` (= 1320−280−56 = 984) → der
   Block (Sidebar+Gap+Content) ist max --container-wide (1320), zentriert
   — wie der restliche Site-Content. R4-Fix der R3-Regression: R3 hatte
   feste 24-Außenspalten + `1fr`-Content → Content wuchs unbegrenzt
   (@1920 ≈ 1536 px, full-bleed statt zentriert). @1280 identisch zu R3
   (24/24, Content 896 — Symmetrie/Token bleibt). Banner spannt weiter
   full-start/full-end = volle Viewport-Breite (Fullbleed unberührt).
   (Diagnose 2026-05-18 @1280/1680/1920.) */
@media (min-width: 1051px) {
  body.has-sidebar-left .site-grid {
    grid-template-columns:
      [full-start] minmax(var(--gutter), 1fr)
      [main-start] var(--ueber-sidebar-w)
      [gap-start] var(--ueber-col-gap)
      [content-start] minmax(0, calc(var(--container-wide) - var(--ueber-sidebar-w) - var(--ueber-col-gap)))
      [main-end] minmax(var(--gutter), 1fr) [full-end];
    grid-template-areas: none;
    column-gap: 0;
  }
  body.has-sidebar-left .container-banner {
    grid-column: full-start / full-end;
    grid-row: 1;
  }
  body.has-sidebar-left .container-sidebar-left {
    grid-column: main-start / gap-start;
    grid-row: 2;
    /* Fix 3: bündig mit dem Breadcrumb. Content (.item-page) hat
       padding-top --space-7 (48); zusätzlich sitzt die Content-Box in
       derselben Grid-Row strukturell 16 px (=--space-4) tiefer als der
       Sidebar-Container (gemessen 2026-05-17) → +--space-4, damit der
       Eyebrow exakt auf Breadcrumb-Höhe startet.
       Default-Pfad gilt für Hero-Seiten (Über-Uns + Jugend) — Sidebar
       ist initial NICHT sticky (Hero in Row 1 schiebt Row 2 unter den
       sticky-Top 120 px). S-14-Sponsoren-Override siehe direkt unten. */
    padding-top: calc(var(--space-7) + var(--space-4));
    position: sticky;
    top: 120px;
    align-self: start;
  }
  /* S-14-Sponsoren (2026-05-21): Hero-lose Sidebar-Seiten — Sidebar ist
     ab Frame 1 sticky aktiv, weil Grid-Row-2-Default (~88, direkt unter
     Header) unter `top: 120px` liegt → sticky kicks in. Der +16-px-Grid-
     Strukturversatz ist hier nicht relevant (kein Hero in Row 1).
     Stattdessen: Eyebrow bündig zum Breadcrumb via padding-top --space-6
     (32 = sticky-Top 120 − Header-h 88, kompensiert den Sticky-Sprung).
     `:not(:has(.container-banner))` erkennt Hero-Abwesenheit strukturell
     — kein Itemid-Match nötig, wirkt auf jede künftige Hero-lose Sidebar-
     Seite (z. B. „Sponsor werden" 983, „Bilder"/„Kontakte" nach mod_
     custom-Swap). */
  body.has-sidebar-left:not(:has(.container-banner)) .container-sidebar-left {
    padding-top: var(--space-6);
  }
  body.has-sidebar-left .container-component {
    grid-column: content-start / main-end;
    grid-row: 2;
  }
  /* Content füllt seine (jetzt auf --container-wide gecappte, zentrierte)
     Spalte → Box-Rechts == Spalten-Rechts, symmetrisch zur Sidebar
     (S-10-max-width/Zentrierung aus; R3 Fix 2 + R4-Cap). */
  body.has-sidebar-left .com-content-article.item-page {
    margin-left: 0;
    max-width: none;
  }
}
/* 992–1050: Projekt-`.site-grid`-Desktop-Override (≥992) macht sonst
   2-spaltig — für den scoped Fall auf gestapelt zurück (comp über side-l,
   wie Mobile-Default <992). */
@media (min-width: 992px) and (max-width: 1050px) {
  body.has-sidebar-left .site-grid {
    grid-template-areas:
      ". banner banner banner banner ."
      ". comp comp comp comp ."
      ". side-l side-l side-l side-l ."
      ". side-r side-r side-r side-r ."
      ". bot-a bot-a bot-a bot-a ."
      ". bot-b bot-b bot-b bot-b ."
      ". bot-c bot-c bot-c bot-c ."
      ". bot-d bot-d bot-d bot-d .";
  }
}

/* --- Mockup-Parität: Über-Uns-Sidebar ist DESKTOP-ONLY ------------------
   Das Mockup blendet die „Über Uns"-Sidebar ≤1050 px komplett aus
   (Hamburger-Hauptnav genügt) — Live stapelte sie zuvor als großen
   Bordeaux-Block unter den Content. Bewusste Revision der früheren
   S-11-Stacking-Entscheidung (User-Auftrag „alles ans Mockup",
   Diagnose 2026-05-17). Leere `side-l`-Grid-Area ohne Element → 0-Höhe,
   kein Gap. */
@media (max-width: 1050px) {
  body.itemid-1002 .container-sidebar-left,
  body.itemid-979 .container-sidebar-left,
  body.itemid-937 .container-sidebar-left,
  body.itemid-938 .container-sidebar-left,
  body.itemid-939 .container-sidebar-left,
  body.itemid-940 .container-sidebar-left,
  body.itemid-941 .container-sidebar-left,
  body.itemid-1244 .container-sidebar-left,
  body.itemid-1245 .container-sidebar-left,
  body.itemid-982 .container-sidebar-left,
  body.itemid-983 .container-sidebar-left,
  body.itemid-975 .container-sidebar-left,
  body.itemid-976 .container-sidebar-left,
  body.itemid-977 .container-sidebar-left,
  body.itemid-978 .container-sidebar-left,
  body.itemid-998 .container-sidebar-left,
  body.itemid-981 .container-sidebar-left,
  body.itemid-980 .container-sidebar-left {
    display: none;
  }
}

/* --- Fix 2: Sidebar = mod_custom „.mvi-about-side" (Mockup-exakt) -------- */
/* Ersetzt das frühere mod_menu (hatte kein Untertitel-Feld). Markup:
   docs/ueber-uns-sidebar.html (Modul nur auf Itemids 1002/979/937/938).
   Aktiver Zustand OHNE Backend-PHP: Joomla setzt body.itemid-NNNN, der
   Link trägt data-itemid="NNNN" → reines CSS-Match (:is()-Gruppe unten).
   Px-Werte = Mockup-exakt (kein Spacing-Token deckt 18/14/13/17/12 px),
   konsistent zum etablierten S-11-Muster; Farben/Radius/Border = Token. */

/* Cassiopeia rendert das Sidebar-Modul als EIN Element
   `.sidebar-left.card` (Compound, NICHT `.sidebar-left .card`!) mit
   1px-Border + `margin:16px 0`, darin `.card-body` mit `padding:16px`.
   Ohne Reset: Komponente 280→246 px, +17 px Versatz, 16 px tiefer.
   Compound-Selektor + card-body-Reset → volle 280-px-Track-Breite,
   bündig oben (Diagnose 2026-05-17, Live-Ahnenkette). */
.sidebar-left.card:has(.mvi-about-side),
.sidebar-left.card:has(.mvi-about-side) .card-body {
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  box-shadow: none;
}

.mvi-about-side {
  display: flex;
  flex-direction: column;
  gap: 18px;                                          /* Mockup sideWrap-gap */
}
.mvi-about-side__head {
  display: flex;
  flex-direction: column;
  gap: 6px;                                           /* Mockup Eyebrow → Titel */
  padding: 0 0 var(--space-4);                        /* Mockup 0 0 16 */
  border-bottom: var(--border-w-thin) solid var(--border-subtle);
}
.mvi-about-side__eyebrow {
  font-family: var(--font-body);
  font-size: 11px;                                    /* Mockup-Eyebrow 11/600 */
  font-weight: 600;
  line-height: 1.55;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--brand-bordeaux);
}
.mvi-about-side__title {
  margin: 0;
  font-family: var(--font-display);
  font-size: 28px;                                    /* Mockup-Titel 28/600 */
  font-weight: 600;
  line-height: 1.1;
  letter-spacing: -0.005em;                           /* Mockup -0.14px @28 */
  color: var(--fg-primary);                           /* Mockup: Anthrazit, nicht Bordeaux */
}
.mvi-about-side__nav {
  display: flex;
  flex-direction: column;
  gap: 2px;                                           /* Mockup nav-gap */
}
.mvi-about-side__link {
  position: relative;                                 /* Anker für ::after-Chevron */
  display: grid;
  grid-template-columns: 32px 1fr;                    /* num | body (Chevron = absolut) */
  align-items: center;
  gap: var(--space-3);                                /* Mockup 12 */
  padding: var(--space-3) 30px var(--space-3) 14px;   /* rechts Platz für Chevron */
  border-radius: var(--radius-md);                    /* Mockup 8 */
  color: var(--fg-default);                           /* inaktiv Anthrazit (User 2026-05-17) */
  text-decoration: none;
  transition: background-color var(--dur-base) var(--ease-out),
              color var(--dur-base) var(--ease-out);
}
.mvi-about-side__num {
  font-family: var(--font-display);
  font-size: 13px;                                    /* Mockup-Num 13/400 */
  font-weight: 400;
  font-style: italic;                                 /* Mockup-Num Spectral italic */
  line-height: 1.55;
  color: var(--brand-gold-deep);                      /* Mockup inaktiv #9a7826 */
  font-variant-numeric: tabular-nums;
}
.mvi-about-side__body {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}
.mvi-about-side__label {
  font-family: var(--font-display);
  font-size: 17px;                                    /* Mockup-Label 17/500 */
  font-weight: 500;
  line-height: 1.25;
  letter-spacing: -0.005em;                           /* Mockup -0.085px @17 */
  color: var(--fg-default);                           /* inaktiv Anthrazit (User 2026-05-17) */
}
.mvi-about-side__hint {
  font-family: var(--font-body);
  font-size: 12px;                                    /* Mockup-Hint 12/400 */
  font-weight: 400;
  line-height: 1.55;
  letter-spacing: 0.02em;                             /* Mockup 0.24px @12 */
  color: var(--fg-secondary);                         /* inaktiv dezent (User 2026-05-17) */
}
/* Fix 6: Chevron als CSS-`::after` (NICHT mehr als <svg>-Element im
   Snippet) — der Joomla-WYSIWYG-Editor strippt Inline-SVG beim
   Einfügen, dadurch fehlte der Chevron live. `::after` ist das 3.
   Grid-Item (Spalte 16px) und damit robust gegen den Editor. */
/* Stray-Leftover des Backend-Editors (gestrippte <svg>-Hülle = 3.+
   Kind) ausblenden — sonst 4 Grid-Items → 2 Zeilen → zu hohe Box.
   Sauberes Snippet (nur num+body) ist davon unberührt (kein 3. Kind). */
.mvi-about-side__link > :nth-child(n+3) {
  display: none;
}
/* Chevron als CSS-Border-Pfeil (gedrehtes Quadrat) — crisp + größen-
   /strokesteuerbar wie das Mockup-SVG (das „›"-Glyph @16px war zu klein,
   User R3). border-color = currentColor → aktiv/inaktiv erbt von color. */
.mvi-about-side__link::after {
  content: "";
  position: absolute;
  right: 16px;
  top: 50%;
  width: 9px;
  height: 9px;
  border-top: 2px solid currentColor;
  border-right: 2px solid currentColor;
  transform: translateY(-50%) rotate(45deg);
  color: var(--fg-default);                           /* inaktiv Anthrazit */
  opacity: 0.6;
}
/* Hover (inaktiv) — nicht im Mockup, dezenter token-derived Bordeaux-Tint. */
.mvi-about-side__link:hover,
.mvi-about-side__link:focus-visible {
  background-color: color-mix(in srgb, var(--brand-bordeaux) 7%, transparent);
}

/* Aktiver Link = Mockup-Bordeaux-Box. Live: body.itemid-NNNN matcht
   data-itemid="NNNN". .is-active = optionaler Standalone-Preview-Hook.
   Über-Uns-Itemids (1002/979/937/938) + Jugend-Itemids
   (939/940/941/1244/1245) + Sponsoren-Itemids (982/983) —
   alle drei Bereiche nutzen das gleiche Sidebar-Pattern (mod_custom
   mit docs/{ueber-uns,jugend,sponsoren}-sidebar.html). */
:is(
  body.itemid-1002 .mvi-about-side__link[data-itemid="1002"],
  body.itemid-979  .mvi-about-side__link[data-itemid="979"],
  body.itemid-937  .mvi-about-side__link[data-itemid="937"],
  body.itemid-938  .mvi-about-side__link[data-itemid="938"],
  body.itemid-939  .mvi-about-side__link[data-itemid="939"],
  body.itemid-940  .mvi-about-side__link[data-itemid="940"],
  body.itemid-941  .mvi-about-side__link[data-itemid="941"],
  body.itemid-1244 .mvi-about-side__link[data-itemid="1244"],
  body.itemid-1245 .mvi-about-side__link[data-itemid="1245"],
  body.itemid-982  .mvi-about-side__link[data-itemid="982"],
  body.itemid-983  .mvi-about-side__link[data-itemid="983"],
  body.itemid-975  .mvi-about-side__link[data-itemid="975"],
  body.itemid-976  .mvi-about-side__link[data-itemid="976"],
  body.itemid-977  .mvi-about-side__link[data-itemid="977"],
  body.itemid-978  .mvi-about-side__link[data-itemid="978"],
  body.itemid-980  .mvi-about-side__link[data-itemid="980"],
  body.itemid-998  .mvi-about-side__link[data-itemid="998"],
  body.itemid-981  .mvi-about-side__link[data-itemid="981"],
  .mvi-about-side__link.is-active
) {
  background-color: var(--brand-bordeaux);
}
:is(
  body.itemid-1002 .mvi-about-side__link[data-itemid="1002"],
  body.itemid-979  .mvi-about-side__link[data-itemid="979"],
  body.itemid-937  .mvi-about-side__link[data-itemid="937"],
  body.itemid-938  .mvi-about-side__link[data-itemid="938"],
  body.itemid-939  .mvi-about-side__link[data-itemid="939"],
  body.itemid-940  .mvi-about-side__link[data-itemid="940"],
  body.itemid-941  .mvi-about-side__link[data-itemid="941"],
  body.itemid-1244 .mvi-about-side__link[data-itemid="1244"],
  body.itemid-1245 .mvi-about-side__link[data-itemid="1245"],
  body.itemid-982  .mvi-about-side__link[data-itemid="982"],
  body.itemid-983  .mvi-about-side__link[data-itemid="983"],
  body.itemid-975  .mvi-about-side__link[data-itemid="975"],
  body.itemid-976  .mvi-about-side__link[data-itemid="976"],
  body.itemid-977  .mvi-about-side__link[data-itemid="977"],
  body.itemid-978  .mvi-about-side__link[data-itemid="978"],
  body.itemid-980  .mvi-about-side__link[data-itemid="980"],
  body.itemid-998  .mvi-about-side__link[data-itemid="998"],
  body.itemid-981  .mvi-about-side__link[data-itemid="981"],
  .mvi-about-side__link.is-active
):hover {
  background-color: var(--brand-bordeaux);            /* Aktiv-Box bleibt Bordeaux */
}
:is(
  body.itemid-1002 .mvi-about-side__link[data-itemid="1002"],
  body.itemid-979  .mvi-about-side__link[data-itemid="979"],
  body.itemid-937  .mvi-about-side__link[data-itemid="937"],
  body.itemid-938  .mvi-about-side__link[data-itemid="938"],
  body.itemid-939  .mvi-about-side__link[data-itemid="939"],
  body.itemid-940  .mvi-about-side__link[data-itemid="940"],
  body.itemid-941  .mvi-about-side__link[data-itemid="941"],
  body.itemid-1244 .mvi-about-side__link[data-itemid="1244"],
  body.itemid-1245 .mvi-about-side__link[data-itemid="1245"],
  body.itemid-982  .mvi-about-side__link[data-itemid="982"],
  body.itemid-983  .mvi-about-side__link[data-itemid="983"],
  body.itemid-975  .mvi-about-side__link[data-itemid="975"],
  body.itemid-976  .mvi-about-side__link[data-itemid="976"],
  body.itemid-977  .mvi-about-side__link[data-itemid="977"],
  body.itemid-978  .mvi-about-side__link[data-itemid="978"],
  body.itemid-980  .mvi-about-side__link[data-itemid="980"],
  body.itemid-998  .mvi-about-side__link[data-itemid="998"],
  body.itemid-981  .mvi-about-side__link[data-itemid="981"],
  .mvi-about-side__link.is-active
) .mvi-about-side__num {
  color: var(--brand-gold);                           /* Mockup aktiv #c49a3c */
}
:is(
  body.itemid-1002 .mvi-about-side__link[data-itemid="1002"],
  body.itemid-979  .mvi-about-side__link[data-itemid="979"],
  body.itemid-937  .mvi-about-side__link[data-itemid="937"],
  body.itemid-938  .mvi-about-side__link[data-itemid="938"],
  body.itemid-939  .mvi-about-side__link[data-itemid="939"],
  body.itemid-940  .mvi-about-side__link[data-itemid="940"],
  body.itemid-941  .mvi-about-side__link[data-itemid="941"],
  body.itemid-1244 .mvi-about-side__link[data-itemid="1244"],
  body.itemid-1245 .mvi-about-side__link[data-itemid="1245"],
  body.itemid-982  .mvi-about-side__link[data-itemid="982"],
  body.itemid-983  .mvi-about-side__link[data-itemid="983"],
  body.itemid-975  .mvi-about-side__link[data-itemid="975"],
  body.itemid-976  .mvi-about-side__link[data-itemid="976"],
  body.itemid-977  .mvi-about-side__link[data-itemid="977"],
  body.itemid-978  .mvi-about-side__link[data-itemid="978"],
  body.itemid-980  .mvi-about-side__link[data-itemid="980"],
  body.itemid-998  .mvi-about-side__link[data-itemid="998"],
  body.itemid-981  .mvi-about-side__link[data-itemid="981"],
  .mvi-about-side__link.is-active
) .mvi-about-side__label {
  color: var(--fg-on-bordeaux);
}
:is(
  body.itemid-1002 .mvi-about-side__link[data-itemid="1002"],
  body.itemid-979  .mvi-about-side__link[data-itemid="979"],
  body.itemid-937  .mvi-about-side__link[data-itemid="937"],
  body.itemid-938  .mvi-about-side__link[data-itemid="938"],
  body.itemid-939  .mvi-about-side__link[data-itemid="939"],
  body.itemid-940  .mvi-about-side__link[data-itemid="940"],
  body.itemid-941  .mvi-about-side__link[data-itemid="941"],
  body.itemid-1244 .mvi-about-side__link[data-itemid="1244"],
  body.itemid-1245 .mvi-about-side__link[data-itemid="1245"],
  body.itemid-982  .mvi-about-side__link[data-itemid="982"],
  body.itemid-983  .mvi-about-side__link[data-itemid="983"],
  body.itemid-975  .mvi-about-side__link[data-itemid="975"],
  body.itemid-976  .mvi-about-side__link[data-itemid="976"],
  body.itemid-977  .mvi-about-side__link[data-itemid="977"],
  body.itemid-978  .mvi-about-side__link[data-itemid="978"],
  body.itemid-980  .mvi-about-side__link[data-itemid="980"],
  body.itemid-998  .mvi-about-side__link[data-itemid="998"],
  body.itemid-981  .mvi-about-side__link[data-itemid="981"],
  .mvi-about-side__link.is-active
) .mvi-about-side__hint {
  color: var(--fg-on-bordeaux);
  opacity: 0.7;                                       /* Mockup aktiv-Hint rgba .7 */
}
:is(
  body.itemid-1002 .mvi-about-side__link[data-itemid="1002"],
  body.itemid-979  .mvi-about-side__link[data-itemid="979"],
  body.itemid-937  .mvi-about-side__link[data-itemid="937"],
  body.itemid-938  .mvi-about-side__link[data-itemid="938"],
  body.itemid-939  .mvi-about-side__link[data-itemid="939"],
  body.itemid-940  .mvi-about-side__link[data-itemid="940"],
  body.itemid-941  .mvi-about-side__link[data-itemid="941"],
  body.itemid-1244 .mvi-about-side__link[data-itemid="1244"],
  body.itemid-1245 .mvi-about-side__link[data-itemid="1245"],
  body.itemid-982  .mvi-about-side__link[data-itemid="982"],
  body.itemid-983  .mvi-about-side__link[data-itemid="983"],
  body.itemid-975  .mvi-about-side__link[data-itemid="975"],
  body.itemid-976  .mvi-about-side__link[data-itemid="976"],
  body.itemid-977  .mvi-about-side__link[data-itemid="977"],
  body.itemid-978  .mvi-about-side__link[data-itemid="978"],
  body.itemid-980  .mvi-about-side__link[data-itemid="980"],
  body.itemid-998  .mvi-about-side__link[data-itemid="998"],
  body.itemid-981  .mvi-about-side__link[data-itemid="981"],
  .mvi-about-side__link.is-active
)::after {
  color: var(--fg-on-bordeaux);                       /* aktiver Chevron Cream */
  opacity: 1;
}

/* --- Fix 3: Stats-Leiste — Mockup-Stil mit Boxen (Revision 2026-05-17) --- */
body.view-article .com-content-article .mvi-stats {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-4);
  margin: var(--space-6) 0;
  /* Fix 8: dezenter grauer Trennstrich nach der Stats-Leiste
     (Mockup: Head-Sektion endet mit subtiler Linie). */
  padding-bottom: var(--space-6);
  border-bottom: var(--border-w-thin) solid var(--border-subtle);
}
/* Mockup-Stat: Cream-BG + subtiler 1-px-Rahmen (war 1.5-px-Gold/
   transparent — bewusste Kategorie-B-Rücknahme, User-Auftrag „Stats
   ans Mockup"). num Spectral 36 bordeaux, label 600 uppercase. */
body.view-article .com-content-article .mvi-stat {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);                                       /* Mockup 8 */
  background: var(--neutral-cream-50);                       /* Mockup rgb(253,250,243) */
  border: var(--border-w-thin) solid var(--border-subtle);   /* Mockup 1 px subtil */
  border-left: 3px solid var(--brand-gold);                  /* Fix 7: Gold-Strich links (Mockup 3px) */
  border-radius: var(--radius-md);
  padding: var(--space-4);                                   /* Mockup ~18/16 → 16 (Token) */
}
body.view-article .com-content-article .mvi-stat__num {
  font-family: var(--font-display);
  font-size: var(--fs-3xl);                                  /* Fix 7: groß ~48 (war clamp ~38) */
  font-weight: 600;
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--brand-bordeaux);
}
body.view-article .com-content-article .mvi-stat__lbl {
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 600;                                          /* Mockup 600 (war 400) */
  text-transform: uppercase;
  letter-spacing: 0.12em;                                    /* Mockup 1.32px @11 */
  color: var(--fg-muted);
}
/* Mobile (≤520): Stats bleiben 3-spaltig (User-Vorgabe — kein
   vertikales Stapeln). Content nur ~342 px → kompakt: Box ≈108 px,
   Gap/Padding minimal, Num --fs-md (18, „Freitags" passt), Label 10.
   (Diagnose 2026-05-18 @390: längster Num „Freitags" 8 Zeichen.) */
@media (max-width: 520px) {
  body.view-article .com-content-article .mvi-stats {
    grid-template-columns: repeat(3, 1fr);
    gap: var(--space-2);                                      /* 8 (war 16) */
  }
  body.view-article .com-content-article .mvi-stat {
    gap: var(--space-1);                                      /* 4 (war 8) */
    padding: var(--space-2);                                  /* 8 (war 16) */
  }
  body.view-article .com-content-article .mvi-stat__num {
    font-size: var(--fs-md);                                  /* 18 (war 48) — passt 3-spaltig */
  }
  body.view-article .com-content-article .mvi-stat__lbl {
    font-size: 10px;                                          /* kompakt (war 11) */
    letter-spacing: 0.06em;                                   /* weniger (war 0.12em) */
  }
}

/* --- Fix 1 (Rev 2026-05-17): Badge + Datum für Über-Uns-Itemids aus ----- */
/* Auf Über-Uns-Seiten ist die Catid-Badge („Verein"-Fallback) + Datum
   semantisch unpassend (statische Inhaltsseiten). Gleiche/​spätere
   Spezifität wie die S-10-Meta-Regel → gewinnt ohne !important. */
body.itemid-1002 .com-content-article > .mvi-article-meta,
body.itemid-979 .com-content-article > .mvi-article-meta,
body.itemid-937 .com-content-article > .mvi-article-meta,
body.itemid-938 .com-content-article > .mvi-article-meta,
body.itemid-939 .com-content-article > .mvi-article-meta,
body.itemid-940 .com-content-article > .mvi-article-meta,
body.itemid-941 .com-content-article > .mvi-article-meta,
body.itemid-1244 .com-content-article > .mvi-article-meta,
body.itemid-1245 .com-content-article > .mvi-article-meta,
body.itemid-982 .com-content-article > .mvi-article-meta,
body.itemid-983 .com-content-article > .mvi-article-meta,
body.itemid-975 .com-content-article > .mvi-article-meta,
body.itemid-976 .com-content-article > .mvi-article-meta,
body.itemid-977 .com-content-article > .mvi-article-meta,
body.itemid-978 .com-content-article > .mvi-article-meta,
body.itemid-998 .com-content-article > .mvi-article-meta,
body.itemid-981 .com-content-article > .mvi-article-meta,
body.itemid-942 .com-content-article > .mvi-article-meta,
body.itemid-1221 .com-content-article > .mvi-article-meta,
body.itemid-980 .com-content-article > .mvi-article-meta {
  display: none;
}

/* --- Fix 9: Über-Uns-Prev/Next bleibt in der Content-Spalte ------------
   Die S-10-7-`.mvi-postnav` bricht via left:50%/translateX/container-wide
   auf volle Breite aus (zentriert auf Viewport) — auf Über-Uns säße sie
   dadurch versetzt (Content-Spalte ist rechts der Sidebar, nicht
   viewport-zentriert). Mockup zeigt die Navigation IN der Lesespalte →
   Breakout für diese Itemids aufheben. border-top/padding/Grid/Cards
   (S-10-7) bleiben. */
body.itemid-1002 .com-content-article > .mvi-postnav,
body.itemid-979 .com-content-article > .mvi-postnav,
body.itemid-937 .com-content-article > .mvi-postnav,
body.itemid-938 .com-content-article > .mvi-postnav,
body.itemid-939 .com-content-article > .mvi-postnav,
body.itemid-940 .com-content-article > .mvi-postnav,
body.itemid-941 .com-content-article > .mvi-postnav,
body.itemid-1244 .com-content-article > .mvi-postnav,
body.itemid-1245 .com-content-article > .mvi-postnav,
body.itemid-982 .com-content-article > .mvi-postnav,
body.itemid-983 .com-content-article > .mvi-postnav,
body.itemid-975 .com-content-article > .mvi-postnav,
body.itemid-976 .com-content-article > .mvi-postnav,
body.itemid-977 .com-content-article > .mvi-postnav,
body.itemid-978 .com-content-article > .mvi-postnav,
body.itemid-998 .com-content-article > .mvi-postnav,
body.itemid-981 .com-content-article > .mvi-postnav,
body.itemid-980 .com-content-article > .mvi-postnav {
  position: static;
  width: auto;
  left: auto;
  transform: none;
}
body.itemid-1002 .mvi-postnav__inner,
body.itemid-979 .mvi-postnav__inner,
body.itemid-937 .mvi-postnav__inner,
body.itemid-938 .mvi-postnav__inner,
body.itemid-939 .mvi-postnav__inner,
body.itemid-940 .mvi-postnav__inner,
body.itemid-941 .mvi-postnav__inner,
body.itemid-1244 .mvi-postnav__inner,
body.itemid-1245 .mvi-postnav__inner,
body.itemid-982 .mvi-postnav__inner,
body.itemid-983 .mvi-postnav__inner,
body.itemid-975 .mvi-postnav__inner,
body.itemid-976 .mvi-postnav__inner,
body.itemid-977 .mvi-postnav__inner,
body.itemid-978 .mvi-postnav__inner,
body.itemid-998 .mvi-postnav__inner,
body.itemid-981 .mvi-postnav__inner,
body.itemid-980 .mvi-postnav__inner {
  max-width: none;
  padding-left: 0;
  padding-right: 0;
}

/* --- Fix 4: Titel sichtbar (h1) + Eyebrow für Über-Uns-Itemids ---------- */
/* S-10 versteckt `.page-header:has(>h1)` generisch (Joomla-Menü-h1 auf
   Aktuelles). Auf Über-Uns-Itemids (Seitenüberschrift aus → Titel IST ein
   h1) ist das der echte Titel → für diese Itemids wieder einblenden. */
body.itemid-1002 .com-content-article > .page-header,
body.itemid-979 .com-content-article > .page-header,
body.itemid-937 .com-content-article > .page-header,
body.itemid-938 .com-content-article > .page-header,
body.itemid-939 .com-content-article > .page-header,
body.itemid-940 .com-content-article > .page-header,
body.itemid-941 .com-content-article > .page-header,
body.itemid-1244 .com-content-article > .page-header,
body.itemid-1245 .com-content-article > .page-header,
body.itemid-982 .com-content-article > .page-header,
body.itemid-983 .com-content-article > .page-header,
body.itemid-975 .com-content-article > .page-header,
body.itemid-976 .com-content-article > .page-header,
body.itemid-977 .com-content-article > .page-header,
body.itemid-978 .com-content-article > .page-header,
body.itemid-998 .com-content-article > .page-header,
body.itemid-981 .com-content-article > .page-header,
body.itemid-942 .com-content-article > .page-header,
body.itemid-1221 .com-content-article > .page-header,
body.itemid-980 .com-content-article > .page-header {
  display: block !important;
  margin: 0 0 var(--space-5);
}
body.itemid-1002 .com-content-article > .page-header > h1,
body.itemid-979 .com-content-article > .page-header > h1,
body.itemid-937 .com-content-article > .page-header > h1,
body.itemid-938 .com-content-article > .page-header > h1,
body.itemid-939 .com-content-article > .page-header > h1,
body.itemid-940 .com-content-article > .page-header > h1,
body.itemid-941 .com-content-article > .page-header > h1,
body.itemid-1244 .com-content-article > .page-header > h1,
body.itemid-1245 .com-content-article > .page-header > h1,
body.itemid-982 .com-content-article > .page-header > h1,
body.itemid-983 .com-content-article > .page-header > h1,
body.itemid-975 .com-content-article > .page-header > h1,
body.itemid-976 .com-content-article > .page-header > h1,
body.itemid-977 .com-content-article > .page-header > h1,
body.itemid-978 .com-content-article > .page-header > h1,
body.itemid-998 .com-content-article > .page-header > h1,
body.itemid-981 .com-content-article > .page-header > h1,
body.itemid-942 .com-content-article > .page-header > h1,
body.itemid-1221 .com-content-article > .page-header > h1,
body.itemid-980 .com-content-article > .page-header > h1 {
  font-family: var(--font-display);
  font-weight: 600;
  /* Zurück auf S-10-Standard (identisch zu `.page-header > h2` — wie alle
     anderen Artikel). Iteration-3-Override (4.4vw≈56) zurückgenommen
     (User-Auftrag 2026-05-17). Responsive 38/28 via Media unten. */
  font-size: clamp(var(--fs-3xl), 4vw, var(--fs-4xl));
  line-height: 1.1;
  letter-spacing: normal;
  color: var(--brand-bordeaux);
  margin: 0;
  text-wrap: balance;
  hyphens: auto;
  -webkit-hyphens: auto;
  hyphenate-limit-chars: 7 4 3;
}
@media (max-width: 1050px) {
  body.itemid-1002 .com-content-article > .page-header > h1,
  body.itemid-979 .com-content-article > .page-header > h1,
  body.itemid-937 .com-content-article > .page-header > h1,
  body.itemid-938 .com-content-article > .page-header > h1,
  body.itemid-939 .com-content-article > .page-header > h1,
  body.itemid-940 .com-content-article > .page-header > h1,
  body.itemid-941 .com-content-article > .page-header > h1,
  body.itemid-1244 .com-content-article > .page-header > h1,
  body.itemid-1245 .com-content-article > .page-header > h1,
  body.itemid-982 .com-content-article > .page-header > h1,
  body.itemid-983 .com-content-article > .page-header > h1,
  body.itemid-975 .com-content-article > .page-header > h1,
  body.itemid-976 .com-content-article > .page-header > h1,
  body.itemid-977 .com-content-article > .page-header > h1,
  body.itemid-978 .com-content-article > .page-header > h1,
  body.itemid-998 .com-content-article > .page-header > h1,
  body.itemid-981 .com-content-article > .page-header > h1,
  body.itemid-942 .com-content-article > .page-header > h1,
  body.itemid-1221 .com-content-article > .page-header > h1,
  body.itemid-980 .com-content-article > .page-header > h1 {
    font-size: 38px;
  }
}
@media (max-width: 520px) {
  body.itemid-1002 .com-content-article > .page-header > h1,
  body.itemid-979 .com-content-article > .page-header > h1,
  body.itemid-937 .com-content-article > .page-header > h1,
  body.itemid-938 .com-content-article > .page-header > h1,
  body.itemid-939 .com-content-article > .page-header > h1,
  body.itemid-940 .com-content-article > .page-header > h1,
  body.itemid-941 .com-content-article > .page-header > h1,
  body.itemid-1244 .com-content-article > .page-header > h1,
  body.itemid-1245 .com-content-article > .page-header > h1,
  body.itemid-982 .com-content-article > .page-header > h1,
  body.itemid-983 .com-content-article > .page-header > h1,
  body.itemid-975 .com-content-article > .page-header > h1,
  body.itemid-976 .com-content-article > .page-header > h1,
  body.itemid-977 .com-content-article > .page-header > h1,
  body.itemid-978 .com-content-article > .page-header > h1,
  body.itemid-998 .com-content-article > .page-header > h1,
  body.itemid-981 .com-content-article > .page-header > h1,
  body.itemid-942 .com-content-article > .page-header > h1,
  body.itemid-1221 .com-content-article > .page-header > h1,
  body.itemid-980 .com-content-article > .page-header > h1 {
    font-size: 28px;
  }
}
/* Eyebrow (PHP fügt <span class="mvi-section__eyebrow mvi-article-eyebrow">
   aus dem ersten Body-h2 VOR dem Titel ein) — Basis-Look kommt von
   .mvi-section__eyebrow (gold-Strich + uppercase), hier nur Abstand. */
body.view-article .mvi-article-eyebrow {
  margin: 0 0 var(--space-2);
}
/* Über-Uns-Itemids: Eyebrow mockup-treu = Bordeaux, plain, KEIN
   Gold-Strich (Kategorie-B-Rücknahme, User-Auftrag „Eyebrow ans
   Mockup"). Andere Artikel behalten Gold + Strich (.mvi-section__
   eyebrow). */
body.itemid-1002 .mvi-article-eyebrow,
body.itemid-979 .mvi-article-eyebrow,
body.itemid-937 .mvi-article-eyebrow,
body.itemid-938 .mvi-article-eyebrow,
body.itemid-939 .mvi-article-eyebrow,
body.itemid-940 .mvi-article-eyebrow,
body.itemid-941 .mvi-article-eyebrow,
body.itemid-1244 .mvi-article-eyebrow,
body.itemid-1245 .mvi-article-eyebrow,
body.itemid-982 .mvi-article-eyebrow,
body.itemid-983 .mvi-article-eyebrow,
body.itemid-975 .mvi-article-eyebrow,
body.itemid-976 .mvi-article-eyebrow,
body.itemid-977 .mvi-article-eyebrow,
body.itemid-978 .mvi-article-eyebrow,
body.itemid-998 .mvi-article-eyebrow,
body.itemid-981 .mvi-article-eyebrow,
body.itemid-980 .mvi-article-eyebrow {
  gap: 0;
  color: var(--brand-bordeaux);
  margin: 0 0 14px;                                   /* Mockup headEyebrow */
}
body.itemid-1002 .mvi-article-eyebrow::before,
body.itemid-979 .mvi-article-eyebrow::before,
body.itemid-937 .mvi-article-eyebrow::before,
body.itemid-938 .mvi-article-eyebrow::before,
body.itemid-939 .mvi-article-eyebrow::before,
body.itemid-940 .mvi-article-eyebrow::before,
body.itemid-941 .mvi-article-eyebrow::before,
body.itemid-1244 .mvi-article-eyebrow::before,
body.itemid-1245 .mvi-article-eyebrow::before,
body.itemid-982 .mvi-article-eyebrow::before,
body.itemid-983 .mvi-article-eyebrow::before,
body.itemid-975 .mvi-article-eyebrow::before,
body.itemid-976 .mvi-article-eyebrow::before,
body.itemid-977 .mvi-article-eyebrow::before,
body.itemid-978 .mvi-article-eyebrow::before,
body.itemid-998 .mvi-article-eyebrow::before,
body.itemid-981 .mvi-article-eyebrow::before,
body.itemid-980 .mvi-article-eyebrow::before {
  display: none;                                      /* Mockup: kein Gold-Strich */
}

/* === S-12: ÜBER-UNS — Archivierte Beiträge (itemid-938, view-archive) ====
   Die Seite ist `view-archive`, nutzt aber das S-11-Layout-Grid via
   `has-sidebar-left` (Sidebar + 2-Spalten-Banner gelten dort schon).
   Spezifisch für die Archiv-Seite:
   - `.com-content-archive` (Joomla-Wrapper) füllt die Content-Spalte.
   - Titel-h1 + Lead + Filter-Bar + 2-Spalten-Card-Grid + Pagination.
   - Eyebrow „ARCHIV" wird über die bestehende S-11-itemid-938-Regel
     (Bordeaux plain, kein Gold-Strich) gestylt. */

/* --- Content-Spalte: Padding + Top-Spacing analog .com-content-article.
   S-12 Polish 2026-05-20 (Fix 3): padding-x 48 + padding-bottom 96 analog
   .com-content-article.item-page (Über-Uns) → identische Content-Breite
   (800 px @1280) + identische Bottom-Luft (96). Damit auch h1-Lauflänge
   identisch zu Unsere Register → Fix 8 (Titelgröße) implizit gelöst,
   da font-size diagnostisch schon identisch war (51.2/38/28 D/T/M). */
body.view-archive.itemid-938 .com-content-archive.mvi-arc {
  padding-top: var(--space-7);                          /* 48 — analog item-page */
  padding-right: var(--space-7);                        /* 48 — analog Reg */
  padding-bottom: var(--space-9);                       /* 96 — analog Reg */
  padding-left: var(--space-7);                         /* 48 — analog Reg */
  max-width: none;
  margin: 0;
}
/* Mobile: padding-x auf 0 (Cassiopeia-Default-Gutter übernimmt die Außen-
   Ränder). Analog .com-content-article.item-page (gemessen @390: pl/pr 0,
   x=16 ist der site-grid-gutter). */
@media (max-width: 520px) {
  body.view-archive.itemid-938 .com-content-archive.mvi-arc {
    padding-right: 0;
    padding-left: 0;
  }
}

/* S-11 hat den Titel-Selektor an `.com-content-article > .page-header > h1`
   gebunden — Archiv-Wrapper ist `.com-content-archive`, daher zusätzlicher
   Selektor. Werte identisch zur S-11-Regel (Spectral, Bordeaux, fluid). */
body.view-archive.itemid-938 .com-content-archive > .page-header {
  margin: 0 0 14px;                                     /* Mockup head Title→Lead 14 */
}
body.view-archive.itemid-938 .com-content-archive > .page-header > h1 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(var(--fs-3xl), 4vw, var(--fs-4xl));
  line-height: 1.1;
  letter-spacing: normal;
  color: var(--brand-bordeaux);
  margin: 0;
  text-wrap: balance;
  hyphens: auto;
  -webkit-hyphens: auto;
}
@media (max-width: 1050px) {
  body.view-archive.itemid-938 .com-content-archive > .page-header > h1 {
    font-size: 38px;
  }
}
@media (max-width: 520px) {
  body.view-archive.itemid-938 .com-content-archive > .page-header > h1 {
    font-size: 28px;
  }
}

/* --- Lead-Paragraph (statischer Text aus Mockup) ----------------------- */
/* S-12 Polish 2026-05-20 (Lead-Angleichung an Artikel-Intro): font-size
   17→19, line-height 1.6→1.55, max-width entfernt (volle Content-Spalte) —
   identische Lead-Typografie wie `.com-content-article__intro > p:first-
   of-type` (Z. 4150). */
body.view-archive.itemid-938 .mvi-arc__lead {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.55;
  color: var(--fg-primary);
  margin: 0 0 var(--space-6);                           /* 32 vor Filter (Luftigkeit) */
}

/* --- Filter-Bar -------------------------------------------------------- */
/* Mockup: weiße Box, 1 px subtler Border, radius 4, padding 14/16,
   2 Selects (Field-Stack mit Label) + Bordeaux-Button, gap 12.
   Limit-Select wird ausgeblendet (Mockup zeigt nur Monat+Jahr). */
body.view-archive.itemid-938 .mvi-arc-filter {
  display: flex;
  flex-wrap: wrap;                                       /* Search-Feld kann in eigene Zeile */
  align-items: flex-end;
  gap: var(--space-3);                                  /* 12 (Mockup) */
  padding: 14px 16px;                                   /* Mockup 14/16 — kein Token deckt 14 */
  background: var(--neutral-white);
  border: var(--border-w-thin) solid var(--border-subtle);
  border-radius: var(--radius-sm);
  /* S-12 Polish 2026-05-20 (Fix 7): mb 28→32 (--space-6) für mehr Luft
     Filter→Grid; konsistent zur Lead-Bottom-Margin (Token-Sym). */
  margin: 0 0 var(--space-6);
}
/* S-12 Search 2026-05-20: Search-Feld belegt eine eigene Zeile OBEN
   (volle Breite) → klar als „primärer" Filter erkennbar. Auf Mobile
   sowieso stacked, dort kein extra Effekt. Compound-Selektor (Spezifität
   0,3,2 statt 0,2,2) schlägt die generische `.mvi-arc-filter__field`-
   Regel (`flex: 1 1 0`) per Spezifität, position-unabhängig im File. */
body.view-archive.itemid-938 .mvi-arc-filter__field.mvi-arc-filter__field--search {
  flex: 1 1 100%;
}
body.view-archive.itemid-938 .mvi-arc-filter__fields {
  display: contents;                                    /* Joomla-fieldset transparent */
  border: 0;
  padding: 0;
}
body.view-archive.itemid-938 .mvi-arc-filter__field {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);                                  /* 4 (Mockup) */
  flex: 1 1 0;
  min-width: 0;
}
body.view-archive.itemid-938 .mvi-arc-filter__lbl {
  font-family: var(--font-body);
  font-size: 11px;                                      /* Mockup 10.5 — Token 11 + ls leicht reduziert */
  font-weight: 600;
  letter-spacing: 0.14em;                               /* Mockup 1.47 px @11 */
  text-transform: uppercase;
  color: var(--fg-muted);
  line-height: 1.2;
}
/* Joomla rendert die Select-Felder als `<select class="form-select">` —
   wir stylen beide (eigene Klasse für Theme-Hook + form-select für die
   Joomla-Output-Klasse).
   S-12 Polish 2026-05-20 (Fix 6): cream BG + stone Border + radius —
   Selects heben sich vom weißen Filter-Container ab. Padding-left
   8→12 px, damit der Text nicht am Border klebt. */
body.view-archive.itemid-938 .mvi-arc-filter__select,
body.view-archive.itemid-938 .mvi-arc-filter .form-select {
  appearance: none;
  -webkit-appearance: none;
  width: 100%;
  height: 38px;                                         /* Mockup 38 */
  padding: 0 28px 0 12px;                               /* Border-Innenabstand +4 */
  background: var(--bg-page)                            /* Cream #faf6ef */
              url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><path d='M1 1l4 4 4-4' fill='none' stroke='%231f1c18' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>")
              no-repeat right 10px center;
  border: var(--border-w-thin) solid var(--border-default);  /* Stone */
  border-radius: var(--radius-sm);                      /* 4 */
  font-family: var(--font-body);
  font-size: 16px;                                      /* Mockup 16 */
  color: var(--fg-primary);
  cursor: pointer;
  box-shadow: none;
}
body.view-archive.itemid-938 .mvi-arc-filter__select:focus-visible,
body.view-archive.itemid-938 .mvi-arc-filter .form-select:focus-visible {
  outline: 2px solid var(--brand-bordeaux);
  outline-offset: 2px;
}
/* S-12 Search 2026-05-20: Textfeld im MVI-Stil — analog zu den Selects
   (cream BG, stone Border, radius), aber ohne Caret-SVG; Padding-x
   identisch zur Select-Innenbreite (12 px). Focus-Ring in Gold-Akzent
   (statt Bordeaux wie Selects) — Search ist der primäre Filter, der
   Akzent unterscheidet ihn ohne aus dem Token-Vokabular zu fallen. */
body.view-archive.itemid-938 .mvi-arc-filter__input {
  appearance: none;
  -webkit-appearance: none;
  width: 100%;
  height: 38px;                                         /* identisch Selects */
  padding: 0 12px;
  background: var(--bg-page);                           /* Cream */
  border: var(--border-w-thin) solid var(--border-default);
  border-radius: var(--radius-sm);
  font-family: var(--font-body);
  font-size: var(--fs-base);                            /* 16 */
  color: var(--fg-primary);
  box-shadow: none;
}
body.view-archive.itemid-938 .mvi-arc-filter__input::placeholder {
  color: var(--fg-muted);
  opacity: 1;
}
body.view-archive.itemid-938 .mvi-arc-filter__input:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 2px;
}
/* Mockup zeigt nur Monat + Jahr — Limit bleibt im DOM (Joomla braucht
   ihn evtl.), wird funktional via display:none unterdrückt; Default
   "5" greift weiter beim Submit. */
body.view-archive.itemid-938 .mvi-arc-filter__field--limit {
  display: none;
}
body.view-archive.itemid-938 .mvi-arc-filter__actions {
  display: flex;
  align-items: stretch;
}
body.view-archive.itemid-938 .mvi-arc-filter__btn {
  background-color: var(--brand-bordeaux);
  color: var(--fg-on-bordeaux);
  border: var(--border-w-thin) solid var(--brand-bordeaux);
  border-radius: var(--radius-xs);                      /* Mockup 3 ≈ 2 */
  padding: 11px 18px;                                   /* Mockup 11/18 */
  font-family: var(--font-body);
  font-size: 14px;                                      /* Mockup 13.5 → 14 */
  font-weight: 600;
  letter-spacing: 0.02em;
  cursor: pointer;
  transition: background-color var(--dur-base) var(--ease-out),
              border-color var(--dur-base) var(--ease-out);
}
body.view-archive.itemid-938 .mvi-arc-filter__btn:hover,
body.view-archive.itemid-938 .mvi-arc-filter__btn:focus-visible {
  background-color: var(--brand-bordeaux-deep);
  border-color: var(--brand-bordeaux-deep);
}

/* --- Card-Grid --------------------------------------------------------- */
/* S-12 Polish 2026-05-20 (Fix 7): gap 18→24 (--space-5) — Token-konform,
   mehr Atmung zwischen Card-Zeilen, konsistent mit Filter/Lead-Margins. */
body.view-archive.itemid-938 .mvi-arc-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));     /* Mockup 2-col Desktop */
  gap: var(--space-5);                                  /* 24 */
  margin-bottom: var(--space-6);
}
@media (max-width: 520px) {
  body.view-archive.itemid-938 .mvi-arc-grid {
    grid-template-columns: minmax(0, 1fr);              /* 1 Spalte Mobile */
    gap: var(--space-4);                                /* 16 */
  }
}
body.view-archive.itemid-938 .mvi-arc-grid__empty {
  grid-column: 1 / -1;
  text-align: center;
  color: var(--fg-muted);
  font-family: var(--font-body);
  font-size: var(--fs-md);                              /* 18 — etwas prominenter */
  line-height: 1.55;
  max-width: 52ch;
  margin: 0 auto;
  padding: var(--space-8) var(--space-4);               /* 64 vertikal, Mobile-fit */
}

/* --- Card -------------------------------------------------------------- */
body.view-archive.itemid-938 .mvi-arc-card {
  display: flex;
  flex-direction: column;
  gap: 10px;                                            /* Mockup 10 (kein --space-Token) */
  background-color: var(--neutral-white);
  border: var(--border-w-thin) solid var(--border-subtle);
  border-radius: var(--radius-sm);                      /* Mockup 4 */
  padding: 22px 22px 20px;                              /* Mockup 22/22/20 */
  /* S-12 Polish 2026-05-20 (Fix 5): border-color für Hover/Focus-within
     mit-transitionen → bei Hover wechselt der subtle-Border auf Bordeaux. */
  transition: box-shadow var(--dur-base) var(--ease-out),
              transform var(--dur-base) var(--ease-out),
              border-color var(--dur-base) var(--ease-out);
}
body.view-archive.itemid-938 .mvi-arc-card:hover,
body.view-archive.itemid-938 .mvi-arc-card:focus-within {
  box-shadow: var(--shadow-md);
  transform: translateY(-2px);
  border-color: var(--brand-bordeaux);                  /* Fix 5: roter Rahmen */
}

/* Datum-Zeile (Day groß Bordeaux + MON · YEAR muted upper). */
body.view-archive.itemid-938 .mvi-arc-card__date {
  display: flex;
  align-items: baseline;
  gap: var(--space-2);
  margin-bottom: var(--space-1);
}
body.view-archive.itemid-938 .mvi-arc-card__day {
  font-family: var(--font-display);
  font-size: 22px;                                      /* Mockup 22 */
  font-weight: 600;
  color: var(--brand-bordeaux);
  line-height: 1;
  font-variant-numeric: tabular-nums;
}
body.view-archive.itemid-938 .mvi-arc-card__monyear {
  font-family: var(--font-body);
  font-size: 11px;                                      /* Mockup 11 */
  font-weight: 600;
  letter-spacing: 0.14em;                               /* Mockup 1.54 px @11 */
  text-transform: uppercase;
  color: var(--fg-muted);
  line-height: 1.4;
  display: inline-flex;
  align-items: baseline;
  gap: 4px;
}
body.view-archive.itemid-938 .mvi-arc-card__dot {
  color: var(--fg-muted);
  font-weight: 400;
}

/* Titel + Link. 2-Zeilen-Clamp gegen Höhensprünge bei langen Titeln
   (Mockup-Cards sind nominell 254 px hoch; bei 4-Zeilen-Titel würden sie
   ausreißen). */
body.view-archive.itemid-938 .mvi-arc-card__title {
  font-family: var(--font-display);
  font-size: 21px;                                      /* Mockup 21 */
  font-weight: 600;
  line-height: 1.2;                                     /* Mockup 25.2 ≈ 1.2 × 21 */
  color: var(--fg-primary);
  margin: 0;
  text-wrap: balance;
  display: -webkit-box;
  -webkit-line-clamp: 3;                                /* erlaubt 3, schneidet ab 4 */
  -webkit-box-orient: vertical;
  overflow: hidden;
}
body.view-archive.itemid-938 .mvi-arc-card__title a {
  color: inherit;
  text-decoration: none;
  background-image: none;                               /* S-10-Article-Body-Underline neutralisieren */
  border-bottom: 0;
}
body.view-archive.itemid-938 .mvi-arc-card__title a:hover,
body.view-archive.itemid-938 .mvi-arc-card__title a:focus-visible {
  color: var(--brand-bordeaux);
}

/* Excerpt. */
body.view-archive.itemid-938 .mvi-arc-card__excerpt {
  font-family: var(--font-body);
  font-size: 14.5px;                                    /* Mockup 14.5 */
  line-height: 1.55;                                    /* Mockup 22.475 ≈ 1.55 × 14.5 */
  color: var(--fg-secondary);
  margin: 0;
  /* Excerpt-Höhen-Cap auf ~3 Zeilen, falls Mockup-Konformität nötig. */
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* „Weiterlesen →"-Link (More). */
body.view-archive.itemid-938 .mvi-arc-card__more {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-top: auto;                                     /* an Card-Boden andocken */
  padding-top: var(--space-2);
  font-family: var(--font-body);
  font-size: 13px;                                      /* Mockup 13 */
  font-weight: 600;
  color: var(--brand-bordeaux);
  text-decoration: none;
  background-image: none;
  border-bottom: 0;
  align-self: flex-start;
}
body.view-archive.itemid-938 .mvi-arc-card__more:hover,
body.view-archive.itemid-938 .mvi-arc-card__more:focus-visible {
  color: var(--brand-bordeaux-deep);
}

/* --- Pagination (Joomla-Bootstrap-Markup, Mockup-Stil) ----------------- */
/* Live: <ul class="pagination"> > <li class="page-item"> > <a class="page-link">
   Aktive Seite: <li class="active page-item"> mit <a aria-current="true">. */
body.view-archive.itemid-938 .mvi-arc-pager .pagination {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 4px;
  padding: var(--space-5) 0 0;                          /* Mockup 24 top */
  margin: 0;
  list-style: none;
  flex-wrap: wrap;
}
body.view-archive.itemid-938 .mvi-arc-pager .pagination__wrapper {
  margin: 0;
}
body.view-archive.itemid-938 .mvi-arc-pager .page-item {
  margin: 0;
}
body.view-archive.itemid-938 .mvi-arc-pager .page-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 36px;                                      /* Mockup 36×36 */
  height: 36px;
  padding: 0 10px;
  background-color: transparent;
  color: var(--fg-primary);
  border: 0;
  border-radius: var(--radius-xs);                      /* Mockup 3 */
  font-family: var(--font-body);
  font-size: 14px;
  font-weight: 500;
  text-decoration: none;
  background-image: none;                               /* S-10-Link-Underline */
  transition: background-color var(--dur-base) var(--ease-out),
              color var(--dur-base) var(--ease-out);
}
body.view-archive.itemid-938 .mvi-arc-pager .page-link:hover,
body.view-archive.itemid-938 .mvi-arc-pager .page-link:focus-visible {
  background-color: var(--brand-bordeaux-tint);
  color: var(--brand-bordeaux);
}
body.view-archive.itemid-938 .mvi-arc-pager .active.page-item .page-link,
body.view-archive.itemid-938 .mvi-arc-pager .page-item .page-link[aria-current="true"] {
  background-color: var(--brand-bordeaux);
  color: var(--fg-on-bordeaux);
}
body.view-archive.itemid-938 .mvi-arc-pager .disabled.page-item .page-link {
  color: var(--fg-muted);
  cursor: not-allowed;
  opacity: 0.6;
}
/* Joomla rendert Pfeile als Icon-Spans (.icon-angle-*). Bordeaux-Tint
   bleibt subtil, currentColor steuert die Glyph-Farbe. */
body.view-archive.itemid-938 .mvi-arc-pager .page-link .icon-angle-left,
body.view-archive.itemid-938 .mvi-arc-pager .page-link .icon-angle-right,
body.view-archive.itemid-938 .mvi-arc-pager .page-link .icon-angle-double-left,
body.view-archive.itemid-938 .mvi-arc-pager .page-link .icon-angle-double-right {
  color: currentColor;
}

/* --- Mobile-/Tablet-Layout-Anpassungen --------------------------------- */
@media (max-width: 768px) {
  body.view-archive.itemid-938 .mvi-arc-filter {
    flex-wrap: wrap;
  }
  body.view-archive.itemid-938 .mvi-arc-filter__field {
    flex: 1 1 calc(50% - var(--space-3) / 2);           /* 2 Selects nebeneinander */
  }
  body.view-archive.itemid-938 .mvi-arc-filter__actions {
    flex: 1 1 100%;                                     /* Button volle Breite */
  }
  body.view-archive.itemid-938 .mvi-arc-filter__btn {
    width: 100%;
  }
}

/* --- Postnav: Navigation durch die 4 Über-Uns-Unterseiten -----------------
   Container content-spaltig, KEIN container-wide-Breakout (die Seite hat
   die Sidebar-Spalte). Card-/Grid-/__inner-Styling kommt aus dem Postnav-
   Block oben (per :is() um body.view-archive erweitert); der __inner-Reset
   (max-width none / padding 0) aus der S-11/S-12-itemid-938-Liste. Werte
   analog dem Über-Uns-Postnav-Container (S-10-7 / S-17). */
body.view-archive.itemid-938 .com-content-archive > .mvi-postnav {
  margin-top: var(--space-7);
  padding: var(--space-7) 0 var(--space-8);
  border-top: var(--border-w-thin) solid var(--border-subtle);
}
@media (max-width: 520px) {
  body.view-archive.itemid-938 .com-content-archive > .mvi-postnav {
    padding: var(--space-6) 0 var(--space-7);
  }
}

/* === S-12 Detail: Archiv-Detail-View (view-article.itemid-938) ============
   Wenn jemand /ueber-uns/archivierte-beitraege?view=article&id=...&catid=...
   aufruft, bleibt itemid=938 (Über-Uns-Menüpunkt) erhalten, aber Joomla
   rendert article/default.php. Die Seite ist ein ECHTER ARTIKEL, kein
   Statik-Page wie 1002/979/937 — daher müssen die S-11-Über-Uns-Wirkungen
   (h1 sichtbar, Eyebrow „Über Uns", Meta unterdrückt) für view-article auf
   itemid-938 gezielt zurückgenommen werden.
   PHP-Override (article/default.php) deckt schon ab: Breadcrumb 4-stufig,
   kein „Über Uns"-Eyebrow, Postnav-Branch via $mviIsArchivDetail. */

/* Fix 2: h1-Menü-Titel „Archivierte Beiträge" ausblenden — der echte
   Artikel-Titel ist im 2. .page-header als h2 (S-10-Default). Die
   S-11-Regel (Z. 5540) macht für itemid-938 alle .page-header sichtbar,
   weil dort (1002/979/937) der echte Titel als h1 rendert. Auf
   view-article-Detail ist h1 jedoch der falsche Menü-Titel. */
body.view-article.itemid-938 .com-content-article > .page-header:has(> h1:first-child) {
  display: none !important;
}

/* Fix 3a: Eyebrow .mvi-article-eyebrow wird im PHP-Override für
   $mviIsArchivDetail NICHT mehr gerendert. Defensiv: falls Joomla aus
   Plugin/Override-Stelle doch eine .mvi-article-eyebrow injiziert,
   garantiert verstecken. */
body.view-article.itemid-938 .com-content-article > .mvi-article-eyebrow {
  display: none;
}

/* Fix 3b: Badge + Datum (.mvi-article-meta) wieder zeigen. Die S-11-Regel
   (Z. 5504) blockt sie für itemid-938 (statischer Über-Uns-Kontext). Auf
   Archiv-Detail (view-article.itemid-938) ist es ein echter Artikel mit
   Kategorie — Badge + Datum gehören dazu (analog Normal-Artikel). */
body.view-article.itemid-938 .com-content-article > .mvi-article-meta {
  display: flex;
}

/* === PHASE 3 · CHRONIK (S-13) ============================================
   Foundation-CSS für drei Content-Strukturen, die der Redakteur als HTML-
   Blöcke im JCE-Editor pflegt — alle entweder scoped auf body.itemid-937
   (Stats-4-Spalten-Override) oder an dedizierte .mvi-epoch* / .mvi-chronik-*-
   Klassen gebunden (werden nur auf der Chronik verwendet). Foundation-CSS,
   das auf der Live-Seite erst greift, sobald Christoph das entsprechende
   Markup in den Beitrag (id=792?) einfügt. Diagnose 2026-05-20: Beitrag
   hat aktuell 15× <h2> + Fließtext + Ignite-Galerien, KEIN S-13-Markup.

   Mockup-Werte als kommentierte Rohwerte (Bullet 12 px, Linie 2 px, top
   11/9 px), analog zur etablierten S-11-Konvention (.mvi-about-side
   18/14/13/17 als Rohwerte). Token wo immer möglich. */

/* ---- 2a: Stats-Leiste — 4 Felder statt 3 (Override des S-11-Defaults) ---
   S-11 `.mvi-stats` ist 3-spaltig (Aktive Kapelle / Unsere Register). Die
   Chronik braucht 4 (1896 Gründung · 1946 Wiedergeburt · 1997 Jubiläum ·
   2022 Heute). Re-Use des bestehenden Stat-Box-Vokabulars (Cream-BG +
   3-px-Gold-Strich links + Spectral-Num bordeaux + label muted upper) —
   kein neues Pattern, nur Spalten-Override. */
body.view-article.itemid-937 .com-content-article .mvi-stats {
  grid-template-columns: repeat(4, minmax(0, 1fr));
  /* Abstand zur darunter folgenden Timeline (User-Spec 2026-05-20).
     S-11-Default mb ist --space-6 (32) — knapp; --space-7 (48) gibt
     der Timeline einen klaren Anlauf nach den Stats. */
  margin-bottom: var(--space-7);
}
/* Mobile ≤520: 2×2 (Spec-Option „4-spaltig wenn möglich, sonst 2×2"). Bei
   342-Inner-Content wären 4 Spalten je ~79 px — Labels „Gründungsjahr"
   (13 Zeichen × ~5.5 px @10/0.06em = ~72) bräuchten knapp die volle Box,
   2×2 (je ~167 px) gibt eindeutige Reserve. Mockup-iPhone-Screenshot zeigt
   ebenfalls 2×2. Die S-11-Mobile-Regel (R6) liefert kompakte Werte
   (gap --space-2, Num --fs-md 18, lbl 10 px / ls 0.06em) — die bleiben
   über den Selector-Match der S-11-Regel weiterhin aktiv. */
@media (max-width: 520px) {
  body.view-article.itemid-937 .com-content-article .mvi-stats {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* ---- Lead-Absatz vor .mvi-stats (Mockup-Pattern) -----------------------
   Backend rendert einen einleitenden `<p class="mvi-chronik-lead">` vor
   den Stats. Standard-Body-Stil ist S-10-`__body p` (17/1.7) — der Lead
   soll prominenter (19 px, --lh-normal 1.55) sein, analog der globalen
   S-10/R3-Lead-Konvention (`__intro > p:first-of-type` 19/normal).
   max-width 56ch hält den Absatz auf komfortabler Lese-Länge. */
body.view-article.itemid-937 .com-content-article__body .mvi-chronik-lead {
  font-family: var(--font-body);
  font-size: 19px;                                   /* Lead-Standard (Mockup-Rohwert; kein --fs-Token deckt 19) */
  line-height: var(--lh-normal);                     /* 1.55 (--lh-base existiert nicht; --lh-normal als Lead-konforme Wahl) */
  color: var(--fg-primary);
  max-width: none;                                   /* R3 (2026-05-20): volle Lesespalten-Breite (war 56ch — zu schmal für die einleitende Vereins-Zusammenfassung) */
  margin: 0 0 var(--space-6);                        /* 32 zur Stats-Leiste */
}

/* ---- 2b: Alternating Timeline (.mvi-timeline / .mvi-epoch / __media / __content)
   Neue HTML-Struktur (Backend 2026-05-20, verifiziert Live-DOM):
     <div class="mvi-timeline">
       <div class="mvi-epoch">
         <div class="mvi-epoch__media">           <!-- Galerie ODER figure -->
           <div class="ig-main-scope-wrapper">…</div>
           <!-- oder <figure class="mvi-epoch__figure">… -->
         </div>
         <div class="mvi-epoch__content">
           <h2 class="mvi-epoch__heading">1896 – 1925</h2>
           <p>Fließtext…</p>
         </div>
       </div>
       <div class="mvi-epoch">
         <div class="mvi-epoch__media mvi-epoch__media--empty"></div>
         <div class="mvi-epoch__content">…</div>
       </div>
       …
     </div>
   Desktop ≥1051: 2-Spalten-Grid mit mittiger Bordeaux-Linie. Ungerade
   Epochen Media links / Content rechts; gerade umgekehrt + Heading +
   Absätze rechtsbündig (Mockup-Pattern). Bullet auf .mvi-epoch::before,
   zentriert auf der Linie (left:50%) mit doppeltem Ring (--bg-page
   3 px + --brand-gold 4 px → „durchbohrt" die Linie sauber).
   Tablet/Mobile ≤1050: einspaltig, Linie + Bullet links (--space-4),
   Heading + Content linksbündig. */

/* Wrapper-Container — Position-Anker für die mittige Linie.
   padding-bottom 16 (--space-4) lässt die Linie nach der letzten Epoche
   noch knapp ausklingen, statt abrupt am Epoch-Bottom zu enden. */
.mvi-timeline {
  position: relative;
  padding-bottom: var(--space-4);              /* 16 — Linien-Ausklang */
}

/* Vertikale Linie — Desktop mittig, Mobile links. opacity 0.25 (dezenter
   als die alte 0.35, weil die zentrale Linie visuell prominenter wirkt).
   Polish R3 (2026-05-20): background als linearer Gradient mit Ausfaden
   ab 75 % → 100 % transparent. Damit endet die Linie nicht hart am
   letzten Bullet, sondern fadet sanft aus. */
.mvi-timeline::before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  width: 2px;
  background: linear-gradient(
    to bottom,
    var(--brand-bordeaux) 0%,
    var(--brand-bordeaux) 75%,
    transparent 100%
  );
  opacity: 0.25;
}
@media (min-width: 1051px) {
  .mvi-timeline::before {
    left: 50%;
    transform: translateX(-50%);
  }
}
@media (max-width: 1050px) {
  .mvi-timeline::before {
    /* Linie zentriert auf x=16 (Bullet-Mitte) → left = 16-1 = 15.
       --space-4 (16) als Anker, kompensiert um die halbe Linien-Breite. */
    left: calc(var(--space-4) - 1px);
  }
}

/* Epoch — Grid auf Desktop, Block auf Mobile. */
.mvi-epoch {
  position: relative;
  margin-bottom: var(--space-9);               /* 96 Desktop-Default */
}
.mvi-epoch:last-child,
.mvi-epoch:has(+ :not(.mvi-epoch)) {
  margin-bottom: 0;
}
@media (min-width: 1051px) {
  .mvi-epoch {
    display: grid;
    grid-template-columns: 1fr var(--space-8) 1fr;  /* col-left · 64 Bullet-Lücke · col-right */
    align-items: start;
  }
}
@media (max-width: 1050px) {
  .mvi-epoch {
    display: block;
    padding-left: var(--space-8);              /* 64: Platz für Bullet + Linie */
    margin-bottom: var(--space-7);             /* 48 (kompakter als Desktop) */
  }
}

/* Bullet — Desktop mittig auf der Linie (left 50%), Mobile links (--space-4).
   Doppelter Ring (3 px --bg-page + 4 px --brand-gold) gibt der Bullet einen
   sichtbaren „Crossover" über der Bordeaux-Linie. z-index:1 hält sie über
   der Linie. top: 11 px = Cap-Mitte für `--fs-2xl @ lh 1.2` (Box 43.2 →
   Cap-Mitte ~17 → Bullet-top 17-6=11). */
.mvi-epoch::before {
  content: "";
  position: absolute;
  top: 11px;
  width: 12px;                                 /* Mockup-Bullet (kein --space-Token deckt 12) */
  height: 12px;
  border-radius: 50%;
  background-color: var(--brand-bordeaux);
  box-shadow:
    0 0 0 3px var(--bg-page),                  /* weißer Inner-Ring trennt Bullet von Linie */
    0 0 0 4px var(--brand-gold);               /* Gold-Outer-Ring */
  z-index: 1;
}
@media (min-width: 1051px) {
  .mvi-epoch::before {
    left: 50%;
    transform: translateX(-50%);
  }
}
@media (max-width: 1050px) {
  .mvi-epoch::before {
    left: calc(var(--space-4) - 5px);          /* x=11 = Bullet-Mitte (16-5) auf Linie x=16 */
  }
}

/* Alternating — Desktop ≥1051: ungerade odd=1./3./5… media-links/content-rechts;
   gerade even=2./4./6… media-rechts/content-links + right-aligned. */
@media (min-width: 1051px) {
  /* Odd: Media in linker Spalte, Content in rechter (Default-Flow).
     `grid-row: 1` explizit, damit beide Kinder in derselben Zeile sitzen
     (sonst füllt CSS-Grid-Auto-Placement bei DOM-Reihenfolge media→content
     mit grid-column 1 / 3 das Pattern row1-col1 + row1-col3 korrekt — bei
     odd alles okay; bei even nicht — siehe Begründung even-Block unten). */
  .mvi-epoch:nth-child(odd) > .mvi-epoch__media {
    grid-column: 1;
    grid-row: 1;
  }
  .mvi-epoch:nth-child(odd) > .mvi-epoch__content {
    grid-column: 3;
    grid-row: 1;
    text-align: left;
  }
  /* Even: Media in rechter Spalte, Content in linker + right-aligned.
     `grid-row: 1` ist hier ZWINGEND: DOM-Reihenfolge ist media→content,
     beide mit explizitem grid-column. Bei DOM-Reihenfolge: media zuerst
     (col 3 row auto = 1), content zweiter (col 1 row auto → next free
     slot = row 2 col 1) → content rutscht in row 2 statt row 1. Mit
     explizitem `grid-row: 1` für beide bleiben sie aligned (Diagnose
     2026-05-20: ohne grid-row Diff content_y - media_y = 172 px). */
  .mvi-epoch:nth-child(even) > .mvi-epoch__media {
    grid-column: 3;
    grid-row: 1;
  }
  .mvi-epoch:nth-child(even) > .mvi-epoch__content {
    grid-column: 1;
    grid-row: 1;
    text-align: right;
  }
  .mvi-epoch:nth-child(even) > .mvi-epoch__content .mvi-epoch__heading,
  .mvi-epoch:nth-child(even) > .mvi-epoch__content p {
    text-align: right;
  }
  /* Strip-Spiegelung — Konvention REVIDIERT (Polish R2, 2026-05-20):
     Thumb 1 sitzt IMMER an der Linie (= innen). Bei odd ist Media links,
     Linie rechts vom Media — also Thumb 1 RECHTS innerhalb der Media-Box
     → `direction: rtl` auf Strip. Bei even ist Media rechts, Linie links
     vom Media — Thumb 1 LINKS innerhalb der Media-Box → ltr (Default).
     Wrapper bekommt `direction: ltr` zurück, damit innere Bilder/Texte
     nicht gespiegelt werden.
     Vorgänger-Variante (Polish v1) hatte Thumb 1 außen — Diagnose R2
     hat das als „erste/wichtigste Bilder an der Linie" revidiert. */
  body.itemid-937 .mvi-epoch:nth-child(odd) .mvi-epoch__media .ig-thumb-scroller-main-below {
    direction: rtl;
  }
  body.itemid-937 .mvi-epoch:nth-child(odd) .mvi-epoch__media .ig-scroller-img-wrapper {
    direction: ltr;
  }
  /* Even: ltr (Default) — Thumb 1 am linken Strip-Edge = nahe der Linie.
     Keine eigene Regel nötig, aber explizit dokumentiert. */
}

/* Heading — Spectral gold-deep, Cap-mittig zur Bullet-Position. Komplett
   in Gold (User-Spec 2026-05-20: Heading + Bindestrich + 2. Jahreszahl
   einheitlich `--brand-gold-deep`; em-Klasse strukturell, erbt color). */
.mvi-epoch__heading {
  margin: 0 0 var(--space-4);                  /* 16 Abstand zum Text */
  font-family: var(--font-display);
  font-size: var(--fs-2xl);                    /* 36 */
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: var(--ls-tight);
  color: var(--brand-gold-deep);
}
.mvi-epoch__heading em {
  font-style: normal;
  color: inherit;                              /* erbt --brand-gold-deep vom Heading */
}
@media (max-width: 1050px) {
  .mvi-epoch__heading {
    font-size: var(--fs-xl);                   /* 28 */
  }
  /* Bullet-top kompensieren für kleineres Heading-Cap (28/1.2 Box 33.6
     → Cap-Mitte ~14 → top 14-5=9). */
  .mvi-epoch::before {
    top: 9px;
    width: 10px;
    height: 10px;
  }
}

/* Content — Body-Prose-Typo (17/1.7 Desktop, 16/1.65 Mobile, matched S-10). */
.mvi-epoch__content {
  font-family: var(--font-body);
  font-size: 17px;
  line-height: 1.7;
  color: var(--fg-primary);
}
.mvi-epoch__content p {
  margin: 0 0 var(--space-5);                  /* 24 Absatz-Abstand */
}
.mvi-epoch__content p:last-child {
  margin-bottom: 0;
}
@media (max-width: 1050px) {
  .mvi-epoch__content {
    font-size: 16px;
    line-height: 1.65;
  }
}

/* Media — Container für Galerie ODER figure. Grid-Column wird oben pro
   nth-child gesetzt. */
.mvi-epoch__media {
  min-width: 0;                                /* erlaubt Galerie-Shrink in der Grid-Spalte */
}
/* Empty: opacity 0 hält die Grid-Spalte, ohne sichtbaren Inhalt zu zeigen
   (z. B. Epoche 1963-1980 ohne Galerie). display:block (oder grid-area
   automatisch) sorgt für korrekte Spaltenverteilung. */
.mvi-epoch__media--empty {
  opacity: 0;
  pointer-events: none;
}

/* Figure innerhalb __media — Bild volle Breite der Spalte, --radius-md
   gerundet, dezenter Border. Spezifität (0,3,2) schlägt S-10-`__body img`
   (0,2,2) → margin: 0 statt --space-5 0. */
body.view-article .com-content-article__body .mvi-epoch__figure {
  margin: 0;
}
body.view-article .com-content-article__body .mvi-epoch__figure img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: var(--radius-md);
  border: var(--border-w-thin) solid var(--border-subtle);
  margin: 0;
}
.mvi-epoch__figure figcaption {
  margin-top: var(--space-2);                  /* 8 */
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-xs);                     /* 12 */
  line-height: 1.5;
  color: var(--fg-muted);
}

/* pid=5-Strip innerhalb __media — Grid übernimmt den Spalten-Wechsel,
   keine eigene `margin-top` mehr nötig (Wrapper-Margins der globalen
   pid=5-Regel überschreiben). */
body.itemid-937 .mvi-epoch__media .ig-main-scope-wrapper {
  margin-top: 0;
  margin-bottom: 0;
}

/* ---- 2c: Overview-Tabellen „Vereinsgeschichte auf einen Blick" ----------
   Erwarteter Markup-Pattern:
     <section class="mvi-chronik-overview">
       <span class="mvi-section__eyebrow">PERSONEN</span>
       <h2 class="mvi-chronik-overview__title">Vereinsgeschichte auf einen Blick</h2>
       <p class="mvi-chronik-overview__sub">…</p>
       <div class="mvi-chronik-overview__cols">
         <div class="mvi-chronik-overview__col">
           <h3>Bisherige Vorstände</h3>
           <table class="mvi-chronik-table">…</table>
         </div>
         <div class="mvi-chronik-overview__col">…</div>
       </div>
     </section>
   Mockup-Refactor 2026-05-20: Header zentriert (Eyebrow + Title + Sub),
   Cols-Grid linksbündig, Tabellen-Zeilen mit border-bottom statt Zebra-
   Stripe, td:first gold-deep (statt muted), Col-Titel mit 2-px-Bordeaux-
   Underline. Background transparent (kein border-top mehr — Trennung
   übernimmt der margin-top zur Timeline). */
.mvi-chronik-overview {
  position: relative;                          /* R4 (2026-05-20): Anker für absolutes ::before */
  margin-top: var(--space-9);                  /* 96 — Abstand zur Timeline */
  padding: var(--space-8);                     /* 64 allseitig (Mockup-Rahmen-Padding) */
  background: var(--bg-surface);               /* R3 (2026-05-20): weiß (war --bg-surface-warm sand — zu warmtonig vor Cream-Body) */
  border: var(--border-w-thin) solid var(--border-subtle);
  border-radius: var(--radius-md);             /* R4: Border umlaufend, alle 4 Seiten 1-subtle */
  box-shadow: none;
  text-align: center;                          /* Eyebrow + Titel + Sub zentriert */
}
/* R4 (2026-05-20): Goldener Akzent-Strich AUF dem oberen Border zentriert
   (vorher R3: Inline-Strich innerhalb der Box als Block-Element). Position
   absolute mit `top: -2px` zieht die 3-px-Linie 2 px nach oben, sodass sie
   mittig auf der 1-px-Top-Border sitzt (1 px innen + 2 px außen). 80 px
   breit, zentriert via `left: 50%; translateX(-50%)`. Pill-Rundung 2 px
   (= --radius-xs). z-index:1 hebt den Strich über die Border. */
.mvi-chronik-overview::before {
  content: "";
  position: absolute;
  top: -2px;
  left: 50%;
  transform: translateX(-50%);
  width: 480px;                                /* R7 (2026-05-21): erneut verdoppelt (war 240) — Strich spannt jetzt ~60 % der 800-Box-Breite */
  height: 2px;                                 /* R5: dünner (war 3) — feiner Strich */
  background: linear-gradient(
    to right,
    transparent 0%,
    var(--brand-gold) 35%,
    var(--brand-gold) 65%,
    transparent 100%
  );                                           /* R6: Fade-Stops weiter nach innen (35/65 statt 20/80) → deutlich sichtbares Ein-/Ausfaden auf der größeren Breite */
  border-radius: 0;                            /* R5: Gradient-Fade ersetzt Pill-Rundung visuell */
  z-index: 1;
}
/* R8 (2026-05-21): Responsive Width-Overrides — Desktop-480 würde auf
   Tablet (Box 640) und Mobile (Box 342) den Box-Rahmen sprengen.
   Verkleinerte Werte halten den Strich innerhalb des Rahmens; Gradient-
   Stops (35/65) bleiben proportional → konsistenter Fade-Look. */
@media (max-width: 1050px) {
  .mvi-chronik-overview::before {
    width: 200px;                              /* Tablet (Box 640) → Strich ~31 % Box-Breite */
  }
}
@media (max-width: 520px) {
  .mvi-chronik-overview::before {
    width: 120px;                              /* Mobile (Box 342) → Strich ~35 % Box-Breite */
  }
}
.mvi-chronik-overview .mvi-section__eyebrow {
  display: inline-flex;                        /* Eyebrow-Standard (gold-Strich + Typo) */
  margin: 0 0 var(--space-3);                  /* 12 zum Titel */
}
.mvi-chronik-overview__title {
  margin: 0 0 var(--space-4);                  /* 16 zum Sub */
  font-family: var(--font-display);
  font-size: var(--fs-3xl);                    /* 48 — prominenter Section-Title */
  font-weight: 600;
  line-height: 1.15;
  letter-spacing: var(--ls-tight);
  color: var(--brand-bordeaux);
  text-align: center;
}
.mvi-chronik-overview__sub {
  margin: 0 auto var(--space-8);               /* 64 zum Cols-Grid */
  font-family: var(--font-body);
  font-style: normal;                          /* nicht mehr italic — Sub als ruhige Lese-Zeile */
  font-size: var(--fs-base);                   /* 16 */
  line-height: var(--lh-loose);                /* 1.75 (--lh-relaxed existiert nicht) */
  color: var(--fg-secondary);
  text-align: center;
  max-width: 52ch;
}
.mvi-chronik-overview__cols {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-8);                         /* 64 zwischen Spalten */
  text-align: left;                            /* Tabellen-Block linksbündig */
}
.mvi-chronik-overview__col h3 {
  margin: 0 0 var(--space-5);                  /* 24 zur Tabelle */
  padding-bottom: var(--space-3);              /* 12 vor dem Underline */
  border-bottom: 2px solid var(--brand-bordeaux);
  font-family: var(--font-display);
  font-size: var(--fs-lg);                     /* 22 */
  font-weight: 600;
  line-height: 1.25;
  letter-spacing: var(--ls-normal);
  color: var(--fg-default);                    /* Anthrazit (Alias zu --fg-primary) */
  text-align: left;                            /* explizit linksbündig (Header-Block ist sonst center) */
}
.mvi-chronik-table {
  width: 100%;
  border-collapse: collapse;
  font-family: var(--font-body);
  line-height: 1.55;
}
/* Kein Zebra-Stripe mehr — Zeilen über border-bottom abgesetzt. */
.mvi-chronik-table tr {
  border-bottom: var(--border-w-thin) solid var(--border-subtle);
}
.mvi-chronik-table tr:last-child {
  border-bottom: 0;
}
.mvi-chronik-table td {
  padding: var(--space-3) 0;                   /* 12 vertikal, 0 horizontal (Spalten via width) */
  border: 0;
  vertical-align: middle;
}
.mvi-chronik-table td:first-child {
  width: 35%;                                  /* Datumsspalte fix */
  padding-right: var(--space-5);               /* 24 zur 2. Spalte */
  color: var(--brand-gold-deep);               /* Gold-Akzent (vorher muted) */
  font-size: var(--fs-sm);                     /* 14 */
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.mvi-chronik-table td:last-child {
  color: var(--fg-default);                    /* Anthrazit */
  font-size: var(--fs-base);                   /* 16 */
}

/* Spalten-Differenzierung (Polish R2 2026-05-20):
   Vorstände-Spalte → bordeaux (Jahreszahl + Col-Title-Underline)
   Dirigenten-Spalte → gold-deep (Jahreszahl + Col-Title-Underline)
   Generische Regeln oben gelten als Default (gold-deep für td:first,
   bordeaux für Col-Title-Underline) — Modifier-Regeln überschreiben
   nur die abweichenden Werte. */
.mvi-chronik-overview__col--vorstaende .mvi-chronik-table td:first-child {
  color: var(--brand-bordeaux);                /* bordeaux statt gold-deep */
}
.mvi-chronik-overview__col--vorstaende h3 {
  border-bottom-color: var(--brand-bordeaux);  /* explizit (= generischer Default) */
}
.mvi-chronik-overview__col--dirigenten .mvi-chronik-table td:first-child {
  color: var(--brand-gold-deep);               /* gold-deep (= generischer Default) */
}
.mvi-chronik-overview__col--dirigenten h3 {
  border-bottom-color: var(--brand-gold-deep); /* gold statt bordeaux */
}

/* Tablet/Mobile ≤768: einspaltig. */
@media (max-width: 768px) {
  .mvi-chronik-overview__cols {
    grid-template-columns: 1fr;
    gap: var(--space-7);                       /* 48 zwischen gestapelten Spalten */
  }
  .mvi-chronik-overview__sub {
    margin-bottom: var(--space-7);
  }
  .mvi-chronik-overview__title {
    font-size: var(--fs-2xl);                  /* 36 auf Mobile */
  }
}
/* Mobile ≤520: kompakteres Rahmen-Padding. */
@media (max-width: 520px) {
  .mvi-chronik-overview {
    padding: var(--space-6) var(--space-4);    /* 32 vertikal / 16 horizontal */
  }
}

/* ---- 2d: Chronik-Galerie pid=5 (CHRONIKgalerie) — schlanker Strip -------
   Eigenes Ignite-Profil pid=5 für die Chronik (DECISIONS 2026-05-20):
   Klon von pid=3 mit 9 Spec-Flips:
   - thumb_width/height 200→160
   - thumb_layout = 'scroller'    (horizontale Scroll-Lane)
   - thumb_position = 'below'     (USER-SPEC sagte 'main' — invalid lt.
     forms/profile.xml [below/left/right/above]; auf 'below' korrigiert,
     Diagnose 2026-05-20. Mit show_large_image=0 erscheint nur der Strip)
   - show_large_image = 0         (kein Slideshow-Viewer)
   - arrows_left_right = 0        (keine Pfeile, DOM-Rest defensiv hidden)
   - thumb_scrollbar = 0          (kein sichtbarer Scrollbalken)
   - show_numbering = 0
   - plus_one = 0
   Shortcodes Artikel 302 („Chronik"): 7× |pid=3| → |pid=5|.

   Rollback-SQL:
     UPDATE mvi_content
       SET introtext = REPLACE(introtext, '|pid=5|', '|pid=3|')
       WHERE id = 302;
     DELETE FROM mvi_igallery_profiles WHERE id = 5;

   Ignite-Markup pid=5 nutzt `.ig-thumb-scroller-main-below` als Scroll-
   Viewport mit `.ig-scroller-img-wrapper`-Kacheln (NICHT `.ig-thumbs-
   grid`/`-block` — das ist nur in `thumb_layout: grid`). CSS-Strategie
   analog zu pid=4 (itemid-979), aber schlanker: Thumbs 160 statt 200,
   `--radius-sm` statt `--radius-md`, kein Opacity-Dimming (kein
   Slideshow-„aktiv"-Konzept), keine Pfeile. */

/* Slideshow-Bereich der pid=5-Galerie verstecken: Ignite rendert ihn
   trotz show_large_image=0 als DOM (data-ig-show-main-image="0") — er
   bleibt als Container-Stub stehen. Explizit hidden hält ihn aus dem
   Flow, damit der Strip direkt unter dem Heading/Lead sitzt.
   R10 (2026-05-21): `.ig-image-number` aus dem globalen body.itemid-
   937-Scope entfernt — die Regel verbarg fälschlich auch die Lightbox-
   Toolbar-Position („1/3" → nur „/3" sichtbar). Der Inline-Strip hat
   per DB-Profil `show_numbering=0` → braucht die CSS-Suppression
   ohnehin nicht. Die Lightbox (`lbox_show_numbering=1`) zeigt die
   Position jetzt korrekt. */
body.itemid-937 .ig-slideshow,
body.itemid-937 .ig-slideshow-overlay,
body.itemid-937 .ig-thumb-scroller-left,
body.itemid-937 .ig-thumb-scroller-right {
  display: none !important;
}

/* Wrapper-Abstände: dezent zum Heading/Fließtext. */
body.itemid-937 .ig-main-scope-wrapper {
  margin-top: var(--space-3);                  /* 12 */
  margin-bottom: var(--space-4);               /* 16 */
}

/* Scroll-Viewport (Ignite ist hier ein Flex-Item der Gallery-Wrapper-
   Box). `min-width: 0` zwingt zurück auf Spaltenbreite, `overflow-x:
   auto` scrollt intern. `padding-bottom` gibt dem Hover-Schatten Raum
   (overflow-y:hidden würde ihn sonst clippen). Pattern aus pid=4. */
body.itemid-937 .ig-thumb-scroller-main-below {
  min-width: 0 !important;
  width: 100% !important;
  max-width: 100% !important;
  overflow-x: auto !important;
  overflow-y: hidden !important;
  padding: 0 0 var(--space-3) !important;      /* 12 unten = Schatten-Luft */
  scroll-behavior: smooth;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
body.itemid-937 .ig-thumb-scroller-main-below::-webkit-scrollbar {
  display: none;
}

/* Inner-Container: max-content + sichtbar (Pass-Through; nur der
   äußere Viewport scrollt). */
body.itemid-937 .ig-thumb-scroller-main-below .ig-thumb-scroller,
body.itemid-937 .ig-thumb-scroller-main-below .ig-thumb-scroller-horizontal,
body.itemid-937 .ig-thumb-scroller-main-below .ig-thumb-scroller-horizontal-inner,
body.itemid-937 .ig-thumb-scroller-main-below .ig-thumb-scroller-inner {
  overflow: visible !important;
  width: max-content !important;
  height: auto !important;
  transform: none !important;
}

/* Slider-Items (UL): max-content, kein JS-transform, kein default-list. */
body.itemid-937 .ig-thumb-scroller-main-below .ig-slider-items {
  position: static !important;
  width: max-content !important;
  height: auto !important;
  transform: none !important;
  white-space: nowrap;
  margin: 0 !important;
  padding: 0 !important;
  list-style: none !important;
}

/* Kachel: 160×160 (Mockup-Rohwert — analog .mvi-about-side-Px-Werte
   nicht token-deckbar), --radius-sm (4) für schlankeren Look als pid=4
   (--radius-md). Kein Opacity-Dimming — alle Thumbs gleich relevant. */
body.itemid-937 .ig-thumb-scroller-main-below .ig-scroller-img-wrapper {
  position: static !important;
  float: none !important;
  transform: none !important;
  top: auto !important;
  left: auto !important;
  display: inline-block;
  box-sizing: border-box;
  width: 160px !important;
  height: 160px !important;
  margin: 0 var(--space-2) 0 0 !important;     /* 8 zwischen Thumbs */
  padding: 0 !important;
  border: 0 !important;
  border-radius: var(--radius-sm);             /* 4 */
  box-shadow: none !important;
  outline: none !important;
  overflow: hidden;
  cursor: pointer;
  vertical-align: top;
  opacity: 1;
  transition: transform var(--dur-base) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out);
}

/* Hover-Lift nur auf echten Hover-Geräten (Maus + Stift) — kein Touch-
   Sticky-Hover-Vor-Flash. `!important` schlägt Ignites JS-`transform:
   none!important`. Werte identisch `.mvi-card`/`.mvi-ens`/`pid=4`. */
@media (hover: hover) and (pointer: fine) {
  body.itemid-937 .ig-thumb-scroller-main-below .ig-scroller-img-wrapper:hover {
    transform: translateY(-2px) !important;
    box-shadow: var(--shadow-md) !important;
  }
}

/* Inner-Link + Bild füllen die 160-Box randlos. */
body.itemid-937 .ig-thumb-scroller-main-below .ig-img-link {
  display: block !important;
  width: 100% !important;
  height: 100% !important;
  padding: 0 !important;
  margin: 0 !important;
}
body.itemid-937 .ig-thumb-scroller-main-below .ig-scroller-img {
  width: 100% !important;
  height: 100% !important;
  object-fit: cover !important;
  border-radius: 0 !important;                 /* Radius am Wrapper */
  margin: 0 !important;
}

/* === Chronik pid=5 — Ignite-Lightbox (Vollbild) =====================
   Polish R3 (2026-05-20): MVI-Look auf der Lightbox der Chronik-
   Galerien. Klon des pid=4-Patterns (DECISIONS 2026-05-18, P5+P6+P7
   +P8), scoped `body.itemid-937 .igui-lightbox.profile-5` (Ignite
   vergibt die profile-5-Klasse automatisch — Live-Diagnose 2026-05-20
   bestätigt). KONSERVATIV: Ignites Positionierung/Funktion nicht
   anfassen — nur MVI-Kosmetik, Caption sichtbar, Mobile-Fit. */
/* MVI-Dunkelgrund statt reinem Schwarz. */
body.itemid-937 .igui-lightbox.profile-5 {
  background: var(--neutral-black) !important;
}
/* Bild — gerundete Ecken (analog pid=4 — Spec hat Radius). */
body.itemid-937 .igui-lightbox.profile-5 .ig-slideshow-image,
body.itemid-937 .igui-lightbox.profile-5 .igui-lightbox-items img {
  border-radius: var(--radius-md);
}
/* Caption-Container vollständig sichtbar: Ignite gibt dem Bottom-
   Wrapper ~60 px fix → mehrzeilige Personenliste wird abgeschnitten.
   Höhe auto, kein Clip, lesbarer Scrim nach oben. */
body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-bottom-wrapper,
body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-descriptions {
  height: auto !important;
  max-height: none !important;
  min-height: 0 !important;
  overflow: visible !important;
}
body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-bottom-wrapper {
  padding: var(--space-5) var(--space-5) var(--space-4) !important;
  background: linear-gradient(
    to top,
    color-mix(in srgb, var(--neutral-black) 88%, transparent),
    transparent
  ) !important;
  text-align: center;
  pointer-events: none;                        /* blockiert Bild-/Nav-Klicks nicht */
}
body.itemid-937 .igui-lightbox.profile-5 .igui-lightbox-caption,
body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-descriptions {
  text-align: center !important;
}
/* Titel (h3 — falls Ignite ihn rendert) — pid=5 hat lt. Diagnose
   2026-05-20 KEIN h3 (Backend-Pflege ohne Bildtitel), aber Regel
   defensiv ergänzt für künftige Pflege. */
body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-descriptions h3,
body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-title {
  margin: 0 0 2px;
  font-family: var(--font-display);
  font-size: var(--fs-lg);                     /* 22 */
  font-weight: 600;
  line-height: 1.25;
  color: var(--fg-on-bordeaux);                /* cream */
}
/* Beschreibung/Personen (p) — Source Sans cream. */
body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-descriptions p,
body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-description {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--fs-sm);                     /* 14 */
  line-height: 1.4;
  color: color-mix(in srgb, var(--fg-on-bordeaux) 85%, transparent);
}
/* Toolbar oben: MVI-Typo, cremefarbene Zahlen/Icons. */
body.itemid-937 .igui-lightbox.profile-5 .igui-lightbox-toolbar,
body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-buttons {
  font-family: var(--font-body);
  color: var(--fg-on-bordeaux);
}
body.itemid-937 .igui-lightbox.profile-5 .ig-hits,
body.itemid-937 .igui-lightbox.profile-5 .ig-img-numbering {
  font-size: var(--fs-sm);
  color: color-mix(in srgb, var(--fg-on-bordeaux) 80%, transparent);
}
/* Lightbox-Thumbs (rechte Vertikal-Leiste): kein Rahmen/Box/Outline,
   aktiver Thumb nur über Opacity (inaktiv 0.65 / aktiv 1) — konsistent
   zum Inline-Strip. */
body.itemid-937 .igui-lightbox.profile-5 .ig-scroller-img-wrapper {
  border: 0 !important;
  box-shadow: none !important;
  outline: none !important;
  border-radius: var(--radius-sm);
  overflow: hidden;
  opacity: 0.65;
  transition: opacity 0.2s var(--ease-out);
}
body.itemid-937 .igui-lightbox.profile-5 .ig-scroller-img-wrapper.ig-active-thumb,
body.itemid-937 .igui-lightbox.profile-5 .ig-scroller-img-wrapper:hover {
  opacity: 1;
  border: 0 !important;
  box-shadow: none !important;
  outline: none !important;
}
/* Mobile ≤520: rechte Vertikal-Thumb-Leiste ausblenden (Platz fürs
   Bild), Bild contain in den Restraum, Caption kompakt. Panel-
   Positionierung NICHT überschrieben. */
@media (max-width: 520px) {
  body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-right-wrapper {
    display: none !important;
  }
  body.itemid-937 .igui-lightbox.profile-5 .igui-lightbox-items img,
  body.itemid-937 .igui-lightbox.profile-5 .ig-slideshow-image {
    max-width: 100vw !important;
    max-height: calc(100dvh - 132px) !important;
    object-fit: contain !important;
  }
  body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-bottom-wrapper {
    padding: var(--space-4) var(--space-3) !important;
  }
  body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-descriptions h3,
  body.itemid-937 .igui-lightbox.profile-5 .ig-lightbox-title {
    font-size: var(--fs-md);
  }
}

/* === PHASE 3 · SPONSOREN (S-14) — Unsere-Sponsoren-Grid ====================
   Greift NUR auf itemid-982 (Unsere Sponsoren). Der Grid wird vom
   PHP-Branch $mviIsSponsor in article/default.php gerendert (glob() über
   images/02_sponsoren/). 38 Logo-Cards, Mockup-Layout: 5 Spalten Desktop,
   4 Tablet, 3 Mobile. Cards weiß mit dünnem Border, Logo zentriert mit
   object-fit:contain (Logos haben unterschiedliche Aspect-Ratios). Hover
   kombiniert .mvi-card-Lift + .mvi-arc-card-Bordeaux-Border.
   Sponsoren-Header (Anzahl + Gradient-Strich + Dank-Text) im Stil der
   Mockup-„22 PARTNER … Vielen Dank für die Unterstützung"-Zeile.
   ========================================================================= */

/* Sponsoren-Header: 3-Spalten-Grid (auto · 1fr Gradient-Strich · auto). */
body.view-article.itemid-982 .mvi-sponsors-header {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: var(--space-4);
  margin: var(--space-6) 0 var(--space-5);
  min-width: 0;                                       /* erlaubt Strich-Schrumpfen */
}
body.view-article.itemid-982 .mvi-sponsors-header__count {
  font-family: var(--font-body);
  font-size: 11px;                                    /* Eyebrow-Konvention */
  font-weight: 600;
  line-height: 1.55;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--brand-gold-deep);
}
body.view-article.itemid-982 .mvi-sponsors-header__rule {
  /* Horizontaler Bordeaux-Gradient-Strich, analog .mvi-timeline::before
     (vertikal) — fadet links und rechts aus, satter Mittelteil. */
  display: block;
  height: 1px;
  min-width: 0;                                       /* Schrumpfen erlaubt */
  background: linear-gradient(
    to right,
    transparent 0%,
    var(--brand-bordeaux) 25%,
    var(--brand-bordeaux) 75%,
    transparent 100%
  );
  opacity: 0.25;
}
body.view-article.itemid-982 .mvi-sponsors-header__note {
  font-family: var(--font-body);
  font-size: var(--fs-sm);                            /* 14 */
  color: var(--fg-muted);
  text-align: right;
}

/* Sponsoren-Grid: 5 → 4 → 3 Spalten. minmax(0,1fr) verhindert Overflow
   bei extra-langen Logos. */
body.view-article.itemid-982 .mvi-sponsors-grid {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: var(--space-3);                                /* 12 — kompakt wie Mockup */
  margin: 0 0 var(--space-7);
}
@media (max-width: 1050px) {
  body.view-article.itemid-982 .mvi-sponsors-grid {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }
}
@media (max-width: 520px) {
  body.view-article.itemid-982 .mvi-sponsors-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--space-2);                              /* 8 — engere Mobile */
  }
}

/* Sponsor-Card: weiße Karte mit dünnem Border, Logo zentriert. Hover
   kombiniert Card-Lift (translateY -2 + shadow-md analog .mvi-card)
   mit Bordeaux-Border-Wechsel (analog .mvi-arc-card:hover S-12). */
body.view-article.itemid-982 .mvi-sponsor-card {
  display: flex;
  align-items: center;
  justify-content: center;
  aspect-ratio: 3 / 2;
  padding: var(--space-3);
  background: var(--bg-surface);                      /* weiß */
  border: var(--border-w-thin) solid var(--border-subtle);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-xs);
  transition:
    transform var(--dur-base) var(--ease-out),
    box-shadow var(--dur-base) var(--ease-out),
    border-color var(--dur-base) var(--ease-out);
}
@media (hover: hover) and (pointer: fine) {
  body.view-article.itemid-982 .mvi-sponsor-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow-md);
    border-color: var(--brand-bordeaux);
  }
}
body.view-article.itemid-982 .mvi-sponsor-card img {
  display: block;
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;                                /* Aspect-Ratio bleibt */
}

/* === PHASE 3 · TERMINE-SEITE (S-15) ========================================
   Greift NUR auf body.view-list.itemid-934 (Joomla-Menüpunkt „Termine",
   com_dpcalendar/list-View). Komplettes Tabula-rasa-Override via
   templates/cassiopeia_mvi/html/com_dpcalendar/list/default.php — kein
   DPCalendar-Stock-CSS, eigene Klassen `.mvi-cal-*`.

   Polish 2026-05-21 (10 Fixes): Cards an Startseiten-Strip (S-3
   .mvi-event-tile) angeglichen — border-left statt border-top,
   Tag-Tint statt voll-Bordeaux, kompaktere Höhe, Titel nicht klickbar.
   Content-Breite auf --article-content-width (analog S-10 Beitragsseite).
   ========================================================================= */

/* --- FIX 10: Sidebar-right komplett aus, Component volle Breite -------- */
body.view-list.itemid-934 .container-sidebar-right {
  display: none;
}
body.view-list.itemid-934 .container-component {
  grid-column: 1 / -1;
}

/* --- FIX 2: Content-Breite analog Beitragsseite (--article-content-width
   = 856 px, zentriert). Kein eigenes max-width auf Lead mehr — der Lead
   erbt die Wrapper-Breite. ---------------------------------------------- */
body.view-list.itemid-934 .mvi-cal-wrapper {
  max-width: var(--article-content-width);            /* 856 — S-10/S-11-Standard */
  margin-inline: auto;
  padding-block: var(--space-7) var(--space-9);
  padding-inline: var(--gutter);
}
body.view-list.itemid-934 .mvi-cal-wrapper > .page-header {
  display: block;
  margin: 0 0 var(--space-5);
}
body.view-list.itemid-934 .mvi-cal-wrapper > .page-header > h1 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(var(--fs-3xl), 4vw, var(--fs-4xl));
  line-height: 1.1;
  letter-spacing: normal;
  color: var(--brand-bordeaux);
  margin: 0;
  text-wrap: balance;
}
@media (max-width: 1050px) {
  body.view-list.itemid-934 .mvi-cal-wrapper > .page-header > h1 {
    font-size: 38px;
  }
}
@media (max-width: 520px) {
  body.view-list.itemid-934 .mvi-cal-wrapper > .page-header > h1 {
    font-size: 28px;
  }
}

/* --- FIX 5: Eyebrow „KALENDER" — Bordeaux plain, kein Gold-Strich, identisch
   zu den migrierten Über-Uns/Jugend/Sponsoren-Itemids. ------------------ */
body.view-list.itemid-934 .mvi-article-eyebrow {
  gap: 0;
  color: var(--brand-bordeaux);
  margin: 0 0 14px;
}
body.view-list.itemid-934 .mvi-article-eyebrow::before {
  display: none;
}

/* --- Lead (volle Container-Breite, kein eigenes max-width) ------------- */
body.view-list.itemid-934 .mvi-cal__lead {
  font-family: var(--font-body);
  font-size: 19px;                                    /* MVI-Lead-Standard */
  line-height: var(--lh-normal);
  color: var(--fg-primary);
  margin: 0 0 var(--space-7);
}

/* --- FIX 7: Abo-Karte (Icon links + Buttons zentriert) --------------- */
body.view-list.itemid-934 .mvi-cal-subscribe {
  margin: 0 0 var(--space-6);
  padding: var(--space-5);
  background: var(--bg-surface);
  border: var(--border-w-thin) solid var(--border-subtle);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-xs);
}
body.view-list.itemid-934 .mvi-cal-subscribe__head {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin: 0 0 var(--space-3);
  color: var(--brand-bordeaux);
}
body.view-list.itemid-934 .mvi-cal-subscribe__icon {
  flex: 0 0 auto;
}
body.view-list.itemid-934 .mvi-cal-subscribe__title {
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--fs-lg);                            /* 22 */
  font-weight: 600;
  line-height: 1.25;
  color: var(--brand-bordeaux);
}
body.view-list.itemid-934 .mvi-cal-subscribe__text {
  margin: 0 0 var(--space-4);
  font-family: var(--font-body);
  font-size: var(--fs-base);
  line-height: var(--lh-normal);
  color: var(--fg-default);
}
/* FIX 7: Abo-Buttons zentriert (Mockup-Match). */
body.view-list.itemid-934 .mvi-cal-subscribe__btns {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-3);
}
body.view-list.itemid-934 .mvi-cal-subscribe__btn {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-4);
  border: var(--border-w-thin) solid var(--border-default);
  border-radius: var(--radius-sm);
  background: var(--bg-surface);
  color: var(--fg-default);
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 500;
  text-decoration: none;
  transition:
    border-color var(--dur-base) var(--ease-out),
    background-color var(--dur-base) var(--ease-out),
    color var(--dur-base) var(--ease-out);
}
body.view-list.itemid-934 .mvi-cal-subscribe__btn:hover,
body.view-list.itemid-934 .mvi-cal-subscribe__btn:focus-visible {
  border-color: var(--brand-bordeaux);
  background: color-mix(in srgb, var(--brand-bordeaux) 5%, transparent);
  color: var(--brand-bordeaux);
}
body.view-list.itemid-934 .mvi-cal-subscribe__dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  flex: 0 0 auto;
}
body.view-list.itemid-934 .mvi-cal-subscribe__btn--bordeaux .mvi-cal-subscribe__dot {
  background: var(--brand-bordeaux);
}
body.view-list.itemid-934 .mvi-cal-subscribe__btn--green .mvi-cal-subscribe__dot {
  background: var(--brand-green);
}
body.view-list.itemid-934 .mvi-cal-subscribe__arrow {
  margin-left: var(--space-1);
  color: var(--fg-secondary);
  font-size: 0.9em;
}
/* Abo-Item = Spalte: Kalendername-Überschrift + webcal-Button + Google-Button
   + dezenter https-Kopier-Button darunter. */
body.view-list.itemid-934 .mvi-cal-subscribe__item {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-1);
}
/* Kalendername als Spalten-Überschrift — macht die Zuordnung Aktive/Jugend
   eindeutig (Button-Text bleibt plattform-schlank). Farbton via Modifier. */
body.view-list.itemid-934 .mvi-cal-subscribe__cal-name {
  margin: 0 0 var(--space-1);
  font-family: var(--font-display);
  font-size: var(--fs-base);                          /* 16 */
  font-weight: 600;
  line-height: var(--lh-snug);
  text-align: center;
  color: var(--fg-default);
}
body.view-list.itemid-934 .mvi-cal-subscribe__cal-name--bordeaux {
  color: var(--brand-bordeaux);
}
body.view-list.itemid-934 .mvi-cal-subscribe__cal-name--green {
  color: var(--brand-green);
}
body.view-list.itemid-934 .mvi-cal-subscribe__copy {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  padding: var(--space-1) var(--space-2);
  border: 0;
  background: none;
  cursor: pointer;
  color: var(--fg-muted);
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 500;
  border-radius: var(--radius-sm);
  transition:
    color var(--dur-base) var(--ease-out),
    background-color var(--dur-base) var(--ease-out);
}
body.view-list.itemid-934 .mvi-cal-subscribe__copy:hover,
body.view-list.itemid-934 .mvi-cal-subscribe__copy:focus-visible {
  color: var(--brand-bordeaux);
  background: color-mix(in srgb, var(--brand-bordeaux) 6%, transparent);
}
body.view-list.itemid-934 .mvi-cal-subscribe__copy.is-copied {
  color: var(--brand-green);
}
body.view-list.itemid-934 .mvi-cal-subscribe__copy-icon {
  flex: 0 0 auto;
}

/* --- Filter-Toggle-Pills (unverändert) ------------------------------- */
body.view-list.itemid-934 .mvi-cal-filters {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-3);
  margin: 0 0 var(--space-6);
  padding: var(--space-3);
  background: var(--bg-surface);
  border: var(--border-w-thin) solid var(--border-subtle);
  border-radius: var(--radius-md);
}
body.view-list.itemid-934 .mvi-cal-filter {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-4);
  border: var(--border-w-thin) solid var(--border-default);
  border-radius: 999px;
  background: transparent;
  color: var(--fg-secondary);
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 600;
  cursor: pointer;
  transition:
    background-color var(--dur-base) var(--ease-out),
    border-color var(--dur-base) var(--ease-out),
    color var(--dur-base) var(--ease-out);
}
body.view-list.itemid-934 .mvi-cal-filter__check {
  opacity: 0;
  transition: opacity var(--dur-base) var(--ease-out);
}
body.view-list.itemid-934 .mvi-cal-filter.is-active .mvi-cal-filter__check {
  opacity: 1;
}
body.view-list.itemid-934 .mvi-cal-filter--bordeaux.is-active {
  background: var(--brand-bordeaux);
  border-color: var(--brand-bordeaux);
  color: var(--fg-on-bordeaux);
}
body.view-list.itemid-934 .mvi-cal-filter--green.is-active {
  background: var(--brand-green);
  border-color: var(--brand-green);
  color: var(--fg-on-bordeaux);
}

/* --- FIX 6: Gruppen-Header kompakter, 1-Zeile mit Separator-Punkt ----- */
body.view-list.itemid-934 .mvi-cal-groups {
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
  margin: 0 0 var(--space-7);
}
body.view-list.itemid-934 .mvi-cal-group__head {
  display: flex;
  align-items: baseline;
  gap: var(--space-2);
  margin: 0 0 var(--space-3);
  padding-bottom: var(--space-2);
  border-bottom: var(--border-w-thin) solid var(--border-subtle);
}
body.view-list.itemid-934 .mvi-cal-group__title {
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--fs-xl);                            /* 28 */
  font-weight: 600;
  color: var(--brand-bordeaux);
  line-height: 1.2;
}
body.view-list.itemid-934 .mvi-cal-group__sep {
  color: var(--fg-muted);
  font-size: var(--fs-base);
}
body.view-list.itemid-934 .mvi-cal-group__range {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  color: var(--fg-muted);
}
body.view-list.itemid-934 .mvi-cal-group__count {
  margin-left: auto;                                 /* immer rechtsbündig — unabhängig
                                                        davon ob ein __range-Subtitle
                                                        vorhanden ist (z. B. „Ab …"-Bucket) */
  flex: 0 0 auto;
  min-width: 24px;
  height: 24px;
  padding: 0 var(--space-2);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 999px;
  background: color-mix(in srgb, var(--brand-bordeaux) 8%, transparent);
  color: var(--brand-bordeaux);
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 600;
}
body.view-list.itemid-934 .mvi-cal-group__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);                                /* enger zwischen Cards */
}

/* --- FIX 3: Event-Card analog S-3 (.mvi-event-tile) — border-left 3px,
   weiße Surface, kompakte Höhe. FIX 8: Hover border-bordeaux. FIX 1:
   Titel nicht klickbar (PHP-Override liefert reinen Text). ------------- */
body.view-list.itemid-934 .mvi-cal-event {
  display: flex;
  align-items: center;                                /* vertikal mittig */
  gap: var(--space-3);
  padding: var(--space-3) var(--space-4);             /* 12 16 — ca. 20 % flacher */
  background: var(--bg-surface);
  border: var(--border-w-thin) solid var(--border-subtle);
  border-left: var(--border-w-strong) solid var(--brand-bordeaux);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-xs);
  transition:
    transform var(--dur-base) var(--ease-out),
    box-shadow var(--dur-base) var(--ease-out),
    border-color var(--dur-base) var(--ease-out);
}
body.view-list.itemid-934 .mvi-cal-event--green {
  border-left-color: var(--brand-green);
}
@media (hover: hover) and (pointer: fine) {
  body.view-list.itemid-934 .mvi-cal-event:hover {
    transform: translateY(-1px);
    box-shadow: var(--shadow-sm);
    border-color: var(--brand-bordeaux);              /* FIX 8 */
  }
  body.view-list.itemid-934 .mvi-cal-event--green:hover {
    border-color: var(--brand-green);
    border-left-color: var(--brand-green);
  }
}

/* Datum-Block: kompakt, ohne Border-Right (analog S-3-Strip). */
body.view-list.itemid-934 .mvi-cal-event__date {
  flex: 0 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  min-width: 48px;
}
body.view-list.itemid-934 .mvi-cal-event__day {
  font-family: var(--font-display);                   /* Spectral, wie S-3 */
  font-size: 28px;                                    /* identisch zu .mvi-event-tile__day */
  font-weight: 700;
  line-height: 1;
  letter-spacing: var(--ls-tight);
  color: var(--brand-bordeaux);
}
body.view-list.itemid-934 .mvi-cal-event--green .mvi-cal-event__day {
  color: var(--brand-green);
}
body.view-list.itemid-934 .mvi-cal-event__month {
  font-family: var(--font-body);                      /* Source Sans, wie S-3 */
  font-size: 11px;
  font-weight: 700;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--fg-muted);
}
body.view-list.itemid-934 .mvi-cal-event__weekday {
  font-family: var(--font-body);
  font-size: var(--fs-xs);                            /* 12 */
  color: var(--fg-muted);
}

body.view-list.itemid-934 .mvi-cal-event__content {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  align-items: flex-start;                            /* Tag-Pill nicht stretchen */
  gap: 4px;
  min-width: 0;
}
body.view-list.itemid-934 .mvi-cal-event__content > .mvi-cal-event__title,
body.view-list.itemid-934 .mvi-cal-event__content > .mvi-cal-event__meta {
  align-self: stretch;
}

/* FIX 4: Tag-Pill mit Tint-Background (analog .mvi-event-tile__chip S-3) —
   NICHT die generische .mvi-tag-Klasse (die hat voll-Bordeaux-BG für
   Article-Badges). Eigene scoped Klasse. */
body.view-list.itemid-934 .mvi-cal-event__tag {
  font-family: var(--font-body);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  padding: 3px var(--space-2);                        /* identisch zu __chip */
  border-radius: var(--radius-pill);
  white-space: nowrap;
}
body.view-list.itemid-934 .mvi-cal-event__tag--bordeaux {
  background: var(--brand-bordeaux-tint);
  color: var(--brand-bordeaux);
}
body.view-list.itemid-934 .mvi-cal-event__tag--green {
  background: var(--brand-green-tint);
  color: var(--brand-green);
}

body.view-list.itemid-934 .mvi-cal-event__title {
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--fs-md);                            /* 18, war 22 — kompakter */
  font-weight: 600;
  line-height: 1.3;
  color: var(--fg-primary);
}
body.view-list.itemid-934 .mvi-cal-event__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-3);
  font-family: var(--font-body);
  color: var(--fg-muted);
}
/* FIX 1 (2026-05-21): Uhrzeit prominenter ohne Clock-Icon und Ort-Anker
   — fs-sm statt fs-xs, weight 500, fg-secondary (besser lesbar als muted). */
body.view-list.itemid-934 .mvi-cal-event__time {
  font-size: var(--fs-sm);                            /* 14 */
  font-weight: 500;
  color: var(--fg-secondary);
}
/* Ort-Block (konditional, falls künftig gepflegt) bleibt im fg-muted-
   Schema mit kleinem Icon — visuell sekundär zur Uhrzeit. */
body.view-list.itemid-934 .mvi-cal-event__loc {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: var(--fs-xs);                            /* 12 */
  color: var(--fg-muted);
}
body.view-list.itemid-934 .mvi-cal-event__loc svg {
  flex: 0 0 auto;
  opacity: 0.65;
}

/* Mobile: noch kompakter. */
@media (max-width: 520px) {
  body.view-list.itemid-934 .mvi-cal-event {
    gap: var(--space-2);
    padding: var(--space-2) var(--space-3);
  }
  body.view-list.itemid-934 .mvi-cal-event__date {
    min-width: 40px;
  }
  body.view-list.itemid-934 .mvi-cal-event__day {
    font-size: var(--fs-lg);                          /* 22 */
  }
  body.view-list.itemid-934 .mvi-cal-event__title {
    font-size: var(--fs-sm);                          /* 14 */
  }
  body.view-list.itemid-934 .mvi-cal-event__meta {
    flex-direction: column;
    gap: 2px;
  }
  body.view-list.itemid-934 .mvi-cal-group__title {
    font-size: var(--fs-lg);
  }
}

body.view-list.itemid-934 .mvi-cal__empty {
  margin: var(--space-7) 0;
  padding: var(--space-5);
  background: var(--bg-surface);
  border: var(--border-w-thin) dashed var(--border-default);
  border-radius: var(--radius-md);
  text-align: center;
  color: var(--fg-muted);
  font-style: italic;
}

/* (Hinweis: das frühere .mvi-cal-pager-CSS [FIX 9] wurde mit Weg-B-light
   2026-06-02 entfernt — die S-15-Liste hat keine Server-Pagination mehr,
   alle Termine stehen in Zeit-Buckets. Selektor war markup-los/wirkungslos.) */

/* === PHASE 3 · BILDER-BEREICH (S-16) =======================================
   Greift auf body.com_igallery.view-category mit Itemids 975/976/977/978
   (Aktive Kapelle / Jugendkapelle / Archiv-AK / Archiv-JK).
   PHP-Overrides: default_header.php + default_menu.php in
   templates/cassiopeia_mvi/html/com_igallery/category/.
   Ignite-Profil pid=1 „BILDERgalerie" bleibt unangetastet (User-Vorgabe);
   Album-Detail-Ebene (3) rendert nativ über Ignite-Standard-Layouts —
   wir greifen NUR auf der Album-Übersicht (Ebene 1+2) ein, wo
   $this->categoryChildren befüllt ist. ========================================== */

/* Wrapper: max-width analog Sponsoren/Termine (--article-content-width 856),
   zentriert, mit Padding analog S-15. */
body.com_igallery.view-category .ig-main-scope-wrapper.profile-1 {
  max-width: var(--article-content-width);
  margin-inline: auto;
  padding-block: var(--space-7) var(--space-9);
  padding-inline: var(--gutter);
}

/* Eyebrow „BILDER · [BEREICH]" — Bordeaux plain, kein Gold-Strich
   (analog Über-Uns/Jugend/Sponsoren/Termine). */
body.com_igallery.view-category .ig-main-scope-wrapper.profile-1 .mvi-article-eyebrow {
  gap: 0;
  color: var(--brand-bordeaux);
  margin: 0 0 14px;
}
body.com_igallery.view-category .ig-main-scope-wrapper.profile-1 .mvi-article-eyebrow::before {
  display: none;
}

/* h1 analog S-10/S-11-Standard. */
body.com_igallery.view-category .ig-main-scope-wrapper.profile-1 > .page-header {
  display: block;
  margin: 0 0 var(--space-5);
}
body.com_igallery.view-category .ig-main-scope-wrapper.profile-1 > .page-header > h1 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(var(--fs-3xl), 4vw, var(--fs-4xl));
  line-height: 1.1;
  letter-spacing: normal;
  color: var(--brand-bordeaux);
  margin: 0;
  text-wrap: balance;
}
@media (max-width: 1050px) {
  body.com_igallery.view-category .ig-main-scope-wrapper.profile-1 > .page-header > h1 {
    font-size: 38px;
  }
}
@media (max-width: 520px) {
  body.com_igallery.view-category .ig-main-scope-wrapper.profile-1 > .page-header > h1 {
    font-size: 28px;
  }
}

/* Lead-Text. */
body.com_igallery.view-category .ig-main-scope-wrapper.profile-1 .mvi-rgal__lead {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: var(--lh-normal);
  color: var(--fg-primary);
  margin: 0 0 var(--space-7);
}

/* Anzahl-Badge oben rechts (im Head, neben Title). */
body.com_igallery.view-category .mvi-rgal__head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-3);
  margin: 0 0 var(--space-5);
}
body.com_igallery.view-category .mvi-rgal__count {
  flex: 0 0 auto;
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 600;
  line-height: 1.55;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--brand-gold-deep);
}

/* Album-/Jahr-Grid: 4 Cols Desktop, 2 Tablet, 1 Mobile. */
body.com_igallery.view-category .mvi-rgal-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--space-4);                                /* 16 */
  margin: 0 0 var(--space-7);
}
@media (max-width: 1050px) {
  body.com_igallery.view-category .mvi-rgal-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 520px) {
  body.com_igallery.view-category .mvi-rgal-grid {
    grid-template-columns: 1fr;
  }
}

/* Album-Card mit Cover-Foto + Overlay. */
body.com_igallery.view-category .mvi-rgal-card {
  position: relative;
  display: block;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  border-radius: var(--radius-md);
  background: var(--neutral-sand);
  box-shadow: var(--shadow-xs);
  text-decoration: none;
  color: var(--fg-on-bordeaux);
  transition:
    transform var(--dur-base) var(--ease-out),
    box-shadow var(--dur-base) var(--ease-out);
}
@media (hover: hover) and (pointer: fine) {
  body.com_igallery.view-category .mvi-rgal-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow-md);
  }
  body.com_igallery.view-category .mvi-rgal-card:hover .mvi-rgal-card__img {
    transform: scale(1.04);
  }
}
body.com_igallery.view-category .mvi-rgal-card__img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center center;
  transition: transform 0.45s var(--ease-out);
}
/* Gradient-Overlay für Titel-Lesbarkeit (transparent oben → dunkel unten). */
body.com_igallery.view-category .mvi-rgal-card::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    to bottom,
    rgba(31, 28, 24, 0) 35%,
    rgba(31, 28, 24, 0.78) 100%
  );
  pointer-events: none;
}
/* Anzahl-Badge oben rechts auf der Card. */
body.com_igallery.view-category .mvi-rgal-card__badge {
  position: absolute;
  top: var(--space-3);
  right: var(--space-3);
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px var(--space-1);                          /* R6 2026-05-23: 2/4 (war 3/8) — kompakter */
  background: rgba(245, 240, 235, 0.62);                /* R6 2026-05-23: deutlich transparenter (war 0.92) — Badge weniger dominant auf Desktop */
  color: var(--fg-default);
  font-family: var(--font-body);
  font-size: 10px;                                      /* R6 2026-05-23: 10 (war fs-xs 12) — dezenter; Mobile bekommt 11 */
  font-weight: 600;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
  border-radius: var(--radius-pill);
  white-space: nowrap;
}
body.com_igallery.view-category .mvi-rgal-card__badge svg {
  opacity: 0.7;
}
/* Titel unten links, Spectral Cream auf Gradient. */
body.com_igallery.view-category .mvi-rgal-card__title {
  position: absolute;
  left: var(--space-4);
  right: var(--space-4);
  bottom: var(--space-3);
  z-index: 2;
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--fs-base);                          /* R6 2026-05-23: 16 (war fs-lg 22) — Desktop dezenter, Tablet/Mobile-Overrides setzen 18 */
  font-weight: 600;
  line-height: var(--lh-snug);                        /* 1.3 — R6 2026-05-23, war 1.2 */
  color: var(--fg-on-bordeaux);
  text-shadow: 0 2px 6px rgba(0, 0, 0, 0.35);
  /* Defensiv: lange Titel auf 2 Zeilen begrenzen + harte Worttrennung,
     damit überlange Album-Namen nie aus dem Gradient-Overlay-Bereich
     ragen (Card hat ohnehin overflow: hidden). */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  word-break: break-word;
}
body.com_igallery.view-category .mvi-rgal-card__sub {
  position: absolute;
  left: var(--space-4);
  right: var(--space-4);
  bottom: calc(var(--space-3) + var(--fs-lg) * 1.2 + 4px);
  z-index: 2;
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
  color: rgba(245, 240, 235, 0.82);
  text-shadow: 0 1px 4px rgba(0, 0, 0, 0.45);
}
/* Tablet 521–1050 (2-spaltige Cards): Titel auf 18 (mehr Platz pro Card
   als Desktop 4-Col), Badge alpha 0.72 (weniger dezent als Desktop, da
   Cards größer und die Badge proportional ohnehin kleiner wirkt).
   R6 2026-05-23: stufenweise Anpassung 4-Col→2-Col→1-Col. */
@media (max-width: 1050px) {
  body.com_igallery.view-category .mvi-rgal-card__title {
    font-size: var(--fs-md);                          /* 18 */
  }
  body.com_igallery.view-category .mvi-rgal-card__badge {
    background: rgba(245, 240, 235, 0.72);
  }
}
/* Mobile: kleinere Padding + kleinerer Titel. */
@media (max-width: 520px) {
  body.com_igallery.view-category .mvi-rgal-card__title {
    font-size: var(--fs-md);                          /* 18 */
    left: var(--space-3);
    right: var(--space-3);
    bottom: var(--space-2);
  }
  body.com_igallery.view-category .mvi-rgal-card__sub {
    bottom: calc(var(--space-2) + var(--fs-md) * 1.2 + 4px);
    left: var(--space-3);
    right: var(--space-3);
  }
  /* Badge minimal dezenter (Card ist 1-spaltig, Badge proportional groß).
     R6 2026-05-23: font-size 11 + alpha 0.80 — zwischen Desktop-10/0.62
     und dem alten 12/0.92. */
  body.com_igallery.view-category .mvi-rgal-card__badge {
    top: var(--space-2);
    right: var(--space-2);
    font-size: 11px;
    background: rgba(245, 240, 235, 0.80);
  }
}

/* „Zum Archiv"-Foot-Link (nur Ebene 1, nicht Ebene 2). Rechts ausgerichtet. */
body.com_igallery.view-category .mvi-rgal-foot {
  display: flex;
  justify-content: flex-end;
  margin: 0 0 var(--space-5);
}
body.com_igallery.view-category .mvi-rgal-foot__link {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--brand-bordeaux);
  text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: border-color var(--dur-base) var(--ease-out);
}
body.com_igallery.view-category .mvi-rgal-foot__link:hover,
body.com_igallery.view-category .mvi-rgal-foot__link:focus-visible {
  border-bottom-color: var(--brand-bordeaux);
}

/* Empty-State (wenn Cat keine Children hat → wäre Album-Detail, dort ist
   das Ignite-Template aktiv; Empty hier nur Defensive). */
body.com_igallery.view-category .mvi-rgal__empty {
  margin: var(--space-7) 0;
  padding: var(--space-5);
  background: var(--bg-surface);
  border: var(--border-w-thin) dashed var(--border-default);
  border-radius: var(--radius-md);
  text-align: center;
  color: var(--fg-muted);
  font-style: italic;
}

/* --- S-16 Ebene 3: Album-Detail (Foto-Grid + Lightbox) --------------------
   Ignite rendert auf der Sub-Cat-Ebene ein JS-Masonry-Grid:
   `.ig-thumbs-grid` (Container, JS setzt visibility + fixe width/height)
   > `.ig-thumbs-grid-block` (Cell, JS setzt position:absolute + left/top)
   > `.ig-grid-img-link` (klickbar, öffnet Lightbox via JS, data-img-id)
   > `img.ig-thumbs-grid-image` (200×200-Thumbnail).

   FIX 4: JS-Masonry → CSS-Grid umstellen. Ignite-JS-inline-styles haben
   KEIN !important → unsere !important-Regeln gewinnen dauerhaft (auch
   nach Resize-Recalc). Lightbox-JS bleibt funktionsfähig (Click-Handler
   hängt an data-img-id, layout-unabhängig).
   ------------------------------------------------------------------------- */

/* FIX 3: Content-Mindesthöhe — verhindert dass die Sidebar bei kurzen
   Alben über den Footer hinausragt. */
body.com_igallery.view-category .ig-main-scope-wrapper.profile-1 {
  min-height: 60vh;
}

/* FIX 4: Grid-Container — JS-Masonry neutralisieren, CSS-Grid übernehmen. */
body.com_igallery.view-category .ig-thumbs-grid {
  display: grid !important;
  grid-template-columns: repeat(4, 1fr) !important;
  gap: var(--space-3) !important;
  width: auto !important;
  height: auto !important;
  visibility: visible !important;                     /* JS-hidden aufheben */
  margin: var(--space-5) 0 0;
}
@media (max-width: 1050px) {
  body.com_igallery.view-category .ig-thumbs-grid {
    grid-template-columns: repeat(3, 1fr) !important;
  }
}
@media (max-width: 520px) {
  body.com_igallery.view-category .ig-thumbs-grid {
    grid-template-columns: repeat(2, 1fr) !important;
  }
}
/* Grid-Cell — JS-Absolutpositionierung + fixe Maße neutralisieren. */
body.com_igallery.view-category .ig-thumbs-grid-block {
  position: static !important;
  left: auto !important;
  top: auto !important;
  width: auto !important;
  height: auto !important;
  margin: 0 !important;
}

/* FIX 1: Foto-Tile — abgerundete Kanten, 4:3-Crop, Hover-Zoom.
   Echte Klasse ist `.ig-grid-img-link` (div mit JS-Lightbox-Handler),
   nicht `.ig-thumb-link`. */
body.com_igallery.view-category .ig-grid-img-link {
  display: block;
  border-radius: var(--radius-md);
  overflow: hidden;
  aspect-ratio: 4 / 3;
  cursor: pointer;
  box-shadow: var(--shadow-xs);
  transition: box-shadow var(--dur-base) var(--ease-out);
}
body.com_igallery.view-category .ig-grid-img-link .ig-thumbs-grid-image {
  display: block;
  width: 100% !important;                             /* Ignite-200×200-attrs überschreiben */
  height: 100% !important;
  object-fit: cover;
  transition: transform 0.3s var(--ease-out);
}
@media (hover: hover) and (pointer: fine) {
  body.com_igallery.view-category .ig-grid-img-link:hover {
    box-shadow: var(--shadow-md);
  }
  body.com_igallery.view-category .ig-grid-img-link:hover .ig-thumbs-grid-image {
    transform: scale(1.04);
  }
}

/* Album-Detail: Eyebrow-Variante „Album · [Datum]" (gleicher Stil wie
   die Übersichts-Eyebrows — Bordeaux plain, S-16-Block deckt das ab). */


/* === PHASE 3 · KONTAKTE (S-17 / S-17b) =====================================
   com_contact-Migration. Greift auf „Erweiterter Vorstand" (Itemid 980,
   Kategorie 11) und „Ausbilder" (Itemid 941, Kategorie 113) — gemeinsamer
   Scope `:is(body.itemid-980, body.itemid-941)`. Gleiche Spezifität wie
   `body.itemid-980` (beide :is()-Argumente 0,1,1) → keine Cascade-
   Verschiebung gegenüber dem S-17-Stand. Das Layout beider Seiten ist 1:1
   identisch (flaches Personen-Grid, keine Sub-Kategorien) → kein bereich-
   spezifischer Block, nur die Scope-Erweiterung (S-17b 2026-05-22).
   PHP-Override: templates/cassiopeia_mvi/html/com_contact/category/default.php.
   Sidebar (.mvi-about-side) + 2-Spalten-Grid kommen aus S-11
   (has-sidebar-left); Eyebrow/Breadcrumb/h1 über die S-11/S-13-Jugend-
   Selektor-Listen (941 dort bereits enthalten) + Breadcrumb-:is(). ========== */

/* Wrapper — Lese-Spalten-Breite analog S-16/Artikel (--article-content-width),
   zentriert in der S-11-Content-Grid-Spalte. */
:is(body.itemid-980, body.itemid-941) .com-contact-category {
  max-width: var(--article-content-width);
  margin-inline: auto;
  padding-block: var(--space-7) var(--space-9);
  padding-inline: var(--gutter);
}

/* h1 — S-10/S-11/S-16-Standard (die S-11-h1-Regel ist `.com-content-article`-
   scoped → greift hier nicht; eigene Regel für den com_contact-Wrapper). */
:is(body.itemid-980, body.itemid-941) .com-contact-category > .page-header {
  display: block;
  margin: 0 0 var(--space-5);
}
:is(body.itemid-980, body.itemid-941) .com-contact-category > .page-header > h1 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(var(--fs-3xl), 4vw, var(--fs-4xl));
  line-height: 1.1;
  letter-spacing: normal;
  color: var(--brand-bordeaux);
  margin: 0;
  text-wrap: balance;
}
@media (max-width: 1050px) {
  :is(body.itemid-980, body.itemid-941) .com-contact-category > .page-header > h1 {
    font-size: 38px;
  }
}
@media (max-width: 520px) {
  :is(body.itemid-980, body.itemid-941) .com-contact-category > .page-header > h1 {
    font-size: 28px;
  }
}

/* Lead-Absatz — volle Content-Spalten-Breite (analog .mvi-chronik-lead). */
:is(body.itemid-980, body.itemid-941) .mvi-kt-lead {
  font-family: var(--font-body);
  font-size: var(--fs-md);
  line-height: var(--lh-normal);
  color: var(--fg-primary);
  max-width: none;
  margin: 0 0 var(--space-7);
}

/* --- Gruppen ------------------------------------------------------------- */
/* Eine Gruppe je Sub-Kategorie. Aktueller Stand: alle Kontakte flach in
   Kat 11 → genau ein Grid ohne Gruppen-Header. Sobald Sub-Kategorien
   angelegt sind, rendert der Override je Sub-Kat eine `.mvi-kt-group`. */
:is(body.itemid-980, body.itemid-941) .mvi-kt-groups {
  display: flex;
  flex-direction: column;
  gap: var(--space-7);
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-group__head {
  display: flex;
  align-items: baseline;
  gap: var(--space-4);
  margin: 0 0 var(--space-5);
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-group__title {
  flex: 0 0 auto;
  margin: 0;
  font-family: var(--font-display);
  font-size: 24px;                    /* Mockup-Rohwert (zwischen --fs-lg/--fs-xl) */
  font-weight: 600;
  line-height: 1.2;
  color: var(--brand-bordeaux);
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-group__rule {
  flex: 1 1 auto;
  height: 1px;
  background: linear-gradient(
    90deg,
    var(--border-subtle) 0%,
    color-mix(in srgb, var(--border-subtle) 40%, transparent) 70%,
    transparent 100%
  );
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-group__count {
  flex: 0 0 auto;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--fg-muted);
  white-space: nowrap;
}

/* --- Personen-Grid ------------------------------------------------------- */
:is(body.itemid-980, body.itemid-941) .mvi-kt-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--space-5);
}
@media (max-width: 1050px) {
  :is(body.itemid-980, body.itemid-941) .mvi-kt-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 520px) {
  :is(body.itemid-980, body.itemid-941) .mvi-kt-grid {
    grid-template-columns: 1fr;
  }
}

/* --- Personen-Karte ----------------------------------------------------- */
:is(body.itemid-980, body.itemid-941) .mvi-kt-card {
  display: flex;
  flex-direction: column;
  background: var(--bg-surface);
  border: var(--border-w-thin) solid var(--border-subtle);
  border-radius: var(--radius-sm);
  overflow: hidden;
  transition:
    transform var(--dur-base) var(--ease-out),
    box-shadow var(--dur-base) var(--ease-out),
    border-color var(--dur-base) var(--ease-out);
}
@media (hover: hover) and (pointer: fine) {
  :is(body.itemid-980, body.itemid-941) .mvi-kt-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow-md);
  }
}
/* Hover/Focus-within: Border wechselt auf Bordeaux (analog .mvi-arc-card
   S-12 / .mvi-sponsor-card S-14). */
:is(body.itemid-980, body.itemid-941) .mvi-kt-card:hover,
:is(body.itemid-980, body.itemid-941) .mvi-kt-card:focus-within {
  border-color: var(--brand-bordeaux);
}

/* Foto-/Avatar-Quadrat (1:1). Foto füllt per object-fit; ohne Foto
   übernimmt der Initialen-Avatar mit oklch-Farbverlauf. */
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__photo {
  position: relative;
  aspect-ratio: 1 / 1;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  background: var(--neutral-sand);
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Initialen-Fallback: ein 8-stufiger Hue-Zyklus (--kt-hue je Karte vom
   PHP-Override gesetzt). L/C der oklch-Stops sind konstant — nur der
   Hue variiert; der Verlauf ist das Mockup-Rezept (eine Recipe-Zeile,
   analog einem mehrteiligen Shadow-Token). */
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__photo--avatar {
  background: linear-gradient(
    155deg,
    oklch(0.42 0.10 var(--kt-hue)) 0%,
    oklch(0.28 0.06 var(--kt-hue)) 60%,
    oklch(0.20 0.04 var(--kt-hue)) 100%
  );
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__photo--c1 { --kt-hue: 8; }
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__photo--c2 { --kt-hue: 200; }
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__photo--c3 { --kt-hue: 145; }
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__photo--c4 { --kt-hue: 280; }
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__photo--c5 { --kt-hue: 32; }
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__photo--c6 { --kt-hue: 168; }
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__photo--c7 { --kt-hue: 255; }
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__photo--c8 { --kt-hue: 48; }
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__initials {
  font-family: var(--font-display);
  font-size: var(--fs-4xl);
  font-weight: 500;
  line-height: 1;
  color: color-mix(in srgb, var(--fg-on-bordeaux) 92%, transparent);
}

/* Karten-Körper. */
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  padding: var(--space-4) var(--space-4) var(--space-5);
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__role {
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--brand-bordeaux);
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__name {
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--fs-lg);
  font-weight: 600;
  line-height: var(--lh-tight);
  letter-spacing: var(--ls-tight);
  color: var(--fg-primary);
}

/* Kontaktzeilen — Hairline trennt Name von den Details. */
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__contact {
  list-style: none;
  margin: 0;
  padding: var(--space-3) 0 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  border-top: var(--border-w-thin) solid var(--border-subtle);
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__line {
  display: flex;
  align-items: flex-start;
  gap: var(--space-2);
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  line-height: var(--lh-normal);
  color: var(--fg-primary);
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__ico {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  margin-top: 1px;
  color: var(--brand-bordeaux);
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__addrline {
  display: block;
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__line a {
  color: var(--brand-bordeaux);
  text-decoration: none;
  overflow-wrap: anywhere;
  transition: color var(--dur-base) var(--ease-out);
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__line a:hover,
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__line a:focus-visible {
  color: var(--brand-bordeaux-deep);
  text-decoration: underline;
}
:is(body.itemid-980, body.itemid-941) .mvi-kt-card__text {
  margin: var(--space-2) 0 0;
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  line-height: var(--lh-normal);
  color: var(--fg-secondary);
}

/* Empty-State (Defensive). */
:is(body.itemid-980, body.itemid-941) .mvi-kt-empty {
  margin: var(--space-7) 0;
  color: var(--fg-muted);
  font-style: italic;
}

/* --- Postnav (Geschwister-Seiten im Kontakte- bzw. Jugend-Menü) --------- */
/* Card-Styling kommt aus dem Postnav-Block oben (per :is() um
   itemid-980/941 erweitert). Hier nur der Container — content-spaltig,
   KEIN container-wide-Breakout (die Seite hat die Sidebar-Spalte).
   __inner-Reset (max-width none / padding 0) kommt aus den S-11/S-13-
   Selektor-Listen (itemid-980 + itemid-941). */
:is(body.itemid-980, body.itemid-941) .com-contact-category > .mvi-postnav {
  margin-top: var(--space-7);
  padding: var(--space-7) 0 var(--space-8);
  border-top: var(--border-w-thin) solid var(--border-subtle);
}
@media (max-width: 520px) {
  :is(body.itemid-980, body.itemid-941) .com-contact-category > .mvi-postnav {
    padding: var(--space-6) 0 var(--space-7);
  }
}

/* === S-18 + S-19: KONTAKTE — Download-Bereich + Passive Mitgliedschaft ====
   S-18 (itemid-998): Download-Liste statt PhocaDownload-{filelist}-Stock-
   Output. S-19 (itemid-981): zweite PhocaDownload-Integration mit demselben
   `.mvi-dl-*`-Pattern — der Selektor unten ist `:is(body.itemid-998,
   body.itemid-981)` (specificity-neutral 0,1,1).
   Layout-Chrome (Sidebar / Breadcrumb / Eyebrow / h1 / Postnav) kommt aus
   den S-11-Selektor-Listen (oben um itemid-998 + itemid-981 erweitert).
   Hier nur die `.mvi-dl-`-Liste. Der PHP-Render-Helper (article/default.php,
   $mviIsKontaktDl) liest Dateigröße + Bildmaße zur Laufzeit aus dem Datei-
   system. Badge-Tints via color-mix() aus den Marken-Tokens (kein eigenes
   Tint-Token nötig). */

/* Lead volle Breite — analog Über-Uns/Jugend (kein max-width-Cap). */
:is(body.itemid-998, body.itemid-981) .com-content-article__intro > p {
  max-width: none;
}

:is(body.itemid-998, body.itemid-981) .mvi-dl-list {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

:is(body.itemid-998, body.itemid-981) .mvi-dl-item {
  display: flex;
  align-items: center;
  gap: var(--space-4);
  padding: var(--space-4) var(--space-5);
  background: var(--bg-surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-xs);
  transition: transform var(--dur-fast) var(--ease-out),
              box-shadow var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out);
}
:is(body.itemid-998, body.itemid-981) .mvi-dl-item:hover,
:is(body.itemid-998, body.itemid-981) .mvi-dl-item:focus-within {
  transform: translateY(-2px);
  box-shadow: var(--shadow-md);
  border-color: var(--brand-bordeaux);
}

:is(body.itemid-998, body.itemid-981) .mvi-dl-item__body {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
}

:is(body.itemid-998, body.itemid-981) .mvi-dl-item__title {
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--fg-primary);
}

:is(body.itemid-998, body.itemid-981) .mvi-dl-item__desc {
  margin: 0;
  font-size: var(--fs-sm);
  color: var(--fg-secondary);
}

:is(body.itemid-998, body.itemid-981) .mvi-dl-item__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-3);
  margin-top: 2px;
  font-size: var(--fs-xs);
  color: var(--fg-muted);
}

:is(body.itemid-998, body.itemid-981) .mvi-dl-item__badge {
  display: inline-flex;
  align-items: center;
  padding: 2px 8px;
  border-radius: var(--radius-pill);
  font-size: var(--fs-xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: var(--ls-wide);
}
:is(body.itemid-998, body.itemid-981) .mvi-dl-item__badge--jpg {
  background: color-mix(in srgb, var(--brand-bordeaux) 12%, var(--bg-surface));
  color: var(--brand-bordeaux);
}
:is(body.itemid-998, body.itemid-981) .mvi-dl-item__badge--png {
  background: color-mix(in srgb, var(--brand-gold) 22%, var(--bg-surface));
  color: var(--brand-gold-deep);
}

:is(body.itemid-998, body.itemid-981) .com-content-article__body .mvi-dl-btn {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-4);
  background: var(--brand-bordeaux);
  color: var(--fg-on-bordeaux);
  border-radius: var(--radius-sm);
  font-size: var(--fs-sm);
  font-weight: 600;
  text-decoration: none;
  transition: background var(--dur-fast) var(--ease-out);
}
:is(body.itemid-998, body.itemid-981) .com-content-article__body .mvi-dl-btn:hover,
:is(body.itemid-998, body.itemid-981) .com-content-article__body .mvi-dl-btn:focus-visible {
  background: var(--brand-bordeaux-deep);
  color: var(--fg-on-bordeaux);
}
:is(body.itemid-998, body.itemid-981) .com-content-article__body .mvi-dl-btn:focus-visible {
  outline: 2px solid var(--brand-gold);
  outline-offset: 2px;
}
:is(body.itemid-998, body.itemid-981) .com-content-article__body .mvi-dl-btn svg {
  flex: 0 0 auto;
}

:is(body.itemid-998, body.itemid-981) .mvi-dl-empty {
  margin: 0;
  font-size: var(--fs-sm);
  color: var(--fg-muted);
}

/* Mobile ≤ 520: Karte stapelt vertikal, Button volle Breite. */
@media (max-width: 520px) {
  :is(body.itemid-998, body.itemid-981) .mvi-dl-item {
    flex-direction: column;
    align-items: stretch;
    gap: var(--space-3);
  }
  :is(body.itemid-998, body.itemid-981) .com-content-article__body .mvi-dl-btn {
    justify-content: center;
    width: 100%;
  }
}

/* === S-20: IMPRESSUM + DATENSCHUTZERKLÄRUNG (itemid 942 / 1221) ============
   Rechtstexte. Schmale Lesespalte (720 px), eigene Typo + Inhaltsübersicht
   (ul.index) + Glossar (ul.glossary) + Struktur-Listen (ul.m-elements) +
   Seal (p.seal) — datenschutz-generator.de-Markup. Body-Split im PHP-
   Override übersprungen (kein Lead/Drop-Cap). h1, page-header-show und
   meta-hide für itemid-942/1221 sind in den S-11-Selektor-Listen ergänzt
   (oben in user.css). Prosa-Selektoren mit `.com-content-article__body`
   gescopt — schlägt die S-10-Direct-Child-Defaults (`body.view-article
   .com-content-article__body > h2`, Spezifität 0,2,2) via Tie + Source-
   Order (S-20 steht nach S-10). */

/* Sidebar (Joomla-Container) — falls einem Rechtstext-Menüpunkt ein
   sidebar-left/right-Modul zugewiesen würde: alle Viewports ausblenden. */
:is(body.itemid-942, body.itemid-1221) .container-sidebar-left,
:is(body.itemid-942, body.itemid-1221) .container-sidebar-right {
  display: none !important;
}

/* Lesedokument: schmale Spalte, zentriert. */
:is(body.itemid-942, body.itemid-1221) .com-content-article.item-page {
  max-width: var(--container-narrow);
  margin: 0 auto;
  padding: var(--space-7) var(--space-7) var(--space-9);
}

/* Body-Prose-Typo */
:is(body.itemid-942, body.itemid-1221) .com-content-article__body h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--fs-xl);
  color: var(--brand-bordeaux);
  margin-top: var(--space-7);
  padding-bottom: var(--space-3);
  border-bottom: 1px solid var(--border-subtle);
  scroll-margin-top: 100px;
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body h2:first-of-type {
  margin-top: 0;
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: var(--fs-lg);
  color: var(--fg-primary);
  margin-top: var(--space-6);
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body p {
  font-size: var(--fs-base);
  line-height: 1.7;
  margin-bottom: var(--space-4);
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul,
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ol {
  padding-left: var(--space-6);
  margin-bottom: var(--space-5);
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body li {
  margin-bottom: var(--space-2);
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body strong {
  font-weight: 600;
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body a {
  color: var(--brand-bordeaux);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 2px;
}

/* Inhaltsübersicht (ul.index) */
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul.index {
  list-style: none;
  padding: var(--space-4) var(--space-5);
  margin: 0 0 var(--space-7);
  background: var(--bg-surface);
  border: 1px solid var(--border-subtle);
  border-left: 3px solid var(--brand-bordeaux);
  border-radius: var(--radius-md);
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul.index li {
  padding: var(--space-1) 0;
  margin-bottom: 0;
  border: 0;
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul.index li::before {
  content: "→ ";
  color: var(--brand-bordeaux);
  font-weight: 600;
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul.index a.index-link {
  color: var(--fg-secondary);
  font-size: var(--fs-sm);
  text-decoration: none;
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul.index a.index-link:hover {
  color: var(--brand-bordeaux);
}

/* Struktur-Listen (ul.m-elements) — ohne Bullets, mit Trennlinien. */
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul.m-elements {
  list-style: none;
  padding-left: 0;
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul.m-elements li {
  padding: var(--space-3) 0;
  border-bottom: 1px solid var(--border-subtle);
  margin-bottom: 0;
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul.m-elements li:last-child {
  border-bottom: 0;
}

/* Glossar (ul.glossary) — Begriffsdefinitionen am Ende der Datenschutz-
   erklärung. */
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul.glossary {
  list-style: none;
  padding: var(--space-5);
  margin-top: var(--space-7);
  background: var(--bg-surface-warm);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-md);
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul.glossary li {
  padding: var(--space-3) 0;
  border-bottom: 1px solid var(--border-subtle);
  margin-bottom: 0;
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul.glossary li:last-child {
  border-bottom: 0;
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body ul.glossary strong {
  color: var(--brand-bordeaux);
}

/* Seal (Dr. Schwenke / datenschutz-generator.de-Hinweis am Ende). */
:is(body.itemid-942, body.itemid-1221) .com-content-article__body p.seal {
  margin-top: var(--space-7);
  padding-top: var(--space-5);
  border-top: 1px solid var(--border-subtle);
  font-size: var(--fs-xs);
  color: var(--fg-muted);
}
:is(body.itemid-942, body.itemid-1221) .com-content-article__body p.seal a {
  color: var(--fg-muted);
  font-size: var(--fs-xs);
}

@media (max-width: 520px) {
  :is(body.itemid-942, body.itemid-1221) .com-content-article.item-page {
    padding-left: var(--space-5);
    padding-right: var(--space-5);
  }
}

/* =========================================================================
   Galerie-Strip Chevron-Navigation (2026-05-23, R4-Konsolidierung)
   -------------------------------------------------------------------------
   Prev/Next-Chevrons für die zwei horizontal scrollenden Strip-Galerien:
   - Artikel-Galerie (pid=3): `.ig-thumbs-grid` in `.com-content-article__body
     .ig-main-scope-wrapper`. Nav sitzt als 3. flex-child im `.mvi-gallery-
     head` — analog `.mvi-termine-actions` aus S-3 (Eyebrow+Titel links,
     „Alle Fotos →" und Nav-Pärchen gruppiert rechts). Fallback ohne Head
     (catid 117 Seefest, itemid-Skip im Plugin): Nav als Geschwister nach
     dem Strip-Wrapper — Default-Layout (rechtsbündig, margin-top 12).
   - Chronik-Galerie (pid=5, itemid 937): `.ig-thumb-scroller-main-below` in
     `.mvi-epoch__media`. Markup ist Ignite-`thumb_layout:scroller` (nicht
     `.ig-thumbs-grid` — siehe DECISIONS 2026-05-23). Nav sitzt UNTER dem
     Strip im umschließenden `__media`-Cell. Default-Layout (rechtsbündig,
     margin-top 12) genügt — keine Article-spezifische Regel mehr nötig.
   - Auto-Hide (JS): nicht-scrollbare Strips (`scrollWidth <= clientWidth`)
     bekommen `nav.style.display = 'none'` — kein permanent disabled Pärchen
     mehr. Greift initial + bei resize (debounced 150 ms).
   Mobile ≤ 520: ausgeblendet (Touch-Scroll genügt). Mit dem head-internen
   Pattern reicht der einfache `.mvi-gallery-nav`-Selektor — keine
   Spezifitäts-Erhöhung mehr nötig (R2/R3-Specificity-Workaround entfällt).
   Markup wird vom Inline-Script am Ende von `com_content/article/default.php`
   per JS injiziert (idempotent via dataset-Guard). Button-Skin = `.mvi-slider-
   btn` (Termine-Foundation, Z. ~2000). */
.mvi-gallery-nav {
  display: flex;
  justify-content: flex-end;
  gap: var(--space-2);
  margin-top: var(--space-3);
}
/* In-Head-Placement (Termine-Pattern): Nav als 3. flex-child neben
   „Alle Fotos →". `flex: 0 0 auto` verhindert Shrink. margin-top auf 0
   resetten, da der head bereits flex-Container mit eigener vertikaler
   Ausrichtung ist (`align-items: center` auf head, s. Z. ~4979). */
body.view-article .com-content-article__body .mvi-gallery-head .mvi-gallery-nav {
  flex: 0 0 auto;
  margin-top: 0;
}
/* 3-Item-Layout mit `justify-content: space-between` würde Items zu
   „links / mitte / rechts" verteilen. `margin-right: auto` auf dem text-
   Block drückt ihn nach links und gruppiert Link + Nav rechts mit Gap. */
body.view-article .com-content-article__body .mvi-gallery-head .mvi-gallery-head__text {
  margin-right: auto;
}
@media (max-width: 520px) {
  .mvi-gallery-nav {
    display: none;
  }
}

/* =========================================================================
   Ignite-Galerie — globale MVI-Typo (2026-05-23, R5)
   -------------------------------------------------------------------------
   Ignite-Default für Lightbox-Toolbar, Counter, Hits und Captions ist
   `font-family: Arial, Helvetica, sans-serif !important` (gesetzt in
   /media/com_igallery/css/ignitegallery-42.css auf `.igui-lightbox-
   toolbar`, `.ig-img-numbering`, `.ig-hits` etc.). Da Ignite `!important`
   verwendet, MUSS unser Override ebenfalls `!important` setzen — sonst
   verliert er gegen Ignites Spezifität-unabhängigen `!important`-Schub.
   -------------------------------------------------------------------------
   Bestehende spezifische Blöcke (itemid-979/-937) bleiben — sie wirken
   für die spezifischen Profile zusätzlich. Color wird hier bewusst NICHT
   global gesetzt: sie ist kontextabhängig (dunkler Scrim vs. heller
   Hintergrund) und bleibt den itemid-Regeln bzw. Ignite-Defaults
   überlassen.
   ------------------------------------------------------------------------- */

/* Inline-Counter/Hits (Album-Detail Foto-Grid, außerhalb Lightbox). */
.ig-img-numbering,
.ig-hits {
  font-family: var(--font-body) !important;
}

/* Lightbox-Wurzel + Toolbar — Inheritance-Anker für Buttons/Counter. */
.igui-lightbox,
.igui-lightbox-toolbar,
.ig-lightbox-buttons {
  font-family: var(--font-body) !important;
}

/* Lightbox-Counter „N/M" + Aufrufe — Source Sans 3 16/600 cream (R6
   2026-05-23: Toolbar war 14/500 mit cream-Default-rgba(255,255,255,0.7),
   auf großem Lightbox-Schwarz zu klein/dünn. Token-`--fg-on-bordeaux`
   ist das volle warme Cream — höherer Kontrast). */
.igui-lightbox .ig-img-numbering,
.igui-lightbox .ig-hits {
  font-family: var(--font-body) !important;
  font-size: var(--fs-base) !important;                 /* 16 */
  font-weight: 600 !important;
  color: var(--fg-on-bordeaux) !important;
}

/* Caption-Titel (h3) überall in der Galerie — Spectral 600 (Display). */
.ig-description-overlay h3,
.ig-image-descriptions-below h3,
.ig-image-description h3,
.ig-lightbox-descriptions h3,
.ig-lightbox-title {
  font-family: var(--font-display) !important;
  font-weight: 600 !important;
}

/* Caption-Beschreibung (p / Generic-Text) — Source Sans 3 14/400. */
.ig-description-overlay p,
.ig-image-descriptions-below p,
.ig-image-description p,
.ig-lightbox-descriptions p,
.ig-lightbox-description {
  font-family: var(--font-body) !important;
  font-size: var(--fs-sm) !important;                   /* 14 */
  font-weight: 400 !important;
}

