/* =============================================================================
   CDU Selm – Haupt-Stylesheet
   Schrift: Inter (lokal, DSGVO-konform – kein Google-Fonts-CDN)
   Kein Inline-CSS erlaubt – alles läuft hier durch.
   ============================================================================= */

/* Schrift laden: Inter Variable Font (wght 100-900) aus /assets/fonts/ */
@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 100 900;
    font-display: swap;
    src: url('/assets/fonts/inter-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
                   U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122,
                   U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 100 900;
    font-display: swap;
    src: url('/assets/fonts/inter-latin-ext.woff2') format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF,
                   U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
                   U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* Fließtext-Schrift: IBM Plex Serif (lokal, DSGVO-konform – kein Google-CDN).
   Dateien liegen unter /assets/fonts/ mit den Original-IBM-Dateinamen.
   Geladen wird nur, was die Copy braucht: Regular/SemiBold/Bold + Kursiv. */
@font-face {
    font-family: 'IBM Plex Serif';
    font-style: normal; font-weight: 400; font-display: swap;
    src: url('/assets/fonts/IBMPlexSerif-Regular.woff2') format('woff2');
}
@font-face {
    font-family: 'IBM Plex Serif';
    font-style: italic; font-weight: 400; font-display: swap;
    src: url('/assets/fonts/IBMPlexSerif-Italic.woff2') format('woff2');
}
@font-face {
    font-family: 'IBM Plex Serif';
    font-style: normal; font-weight: 600; font-display: swap;
    src: url('/assets/fonts/IBMPlexSerif-SemiBold.woff2') format('woff2');
}
@font-face {
    font-family: 'IBM Plex Serif';
    font-style: normal; font-weight: 700; font-display: swap;
    src: url('/assets/fonts/IBMPlexSerif-Bold.woff2') format('woff2');
}
@font-face {
    font-family: 'IBM Plex Serif';
    font-style: italic; font-weight: 700; font-display: swap;
    src: url('/assets/fonts/IBMPlexSerif-BoldItalic.woff2') format('woff2');
}

/* HTML5-konforme [hidden]-Implementierung mit !important.
   Notwendig, damit JavaScript (element.hidden = true) Elemente
   tatsächlich versteckt, auch wenn ein Inline-Style display:block setzt. */
[hidden] { display: none !important; }


/* =============================================================================
   CSS CUSTOM PROPERTIES – Corporate Design
   ============================================================================= */
:root {
    /* --- Markenfarben (unveränderlich) --- */
    --rhoenblau:   #2d3c4b;
    --tuerkis:     #52b7c1;
    --gold:        #ffa600;

    /* Offizielle Markennamen als Aliase (AP-07/C-04) – identisch zum Portal
       (tokens.css). Bestandsnamen (--rhoenblau/--tuerkis/--gold) bleiben aus
       Kompatibilitätsgründen erhalten; neue Stellen nutzen die offiziellen
       Namen: Rhöndorf, Cadenabbia, Gold. */
    --color-rhoendorf:  var(--rhoenblau);
    --color-cadenabbia: var(--tuerkis);
    --color-gold:       var(--gold);

    /* --- Ableitungen Türkis --- */
    --tuerkis-light:  #7dcdd6;
    --tuerkis-dark:   #3a8a93;
    --tuerkis-subtle: #eaf7f8;

    /* --- Ableitungen Gold --- */
    --gold-light:  #ffbe45;
    --gold-dark:   #cc8500;
    --gold-subtle: #fff8e6;

    /* --- Ableitungen Rhöndorf-Blau --- */
    --rhoenblau-light: #4a5f72;
    --rhoenblau-dark:  #1d2830;

    /* --- AKZENTWELT (mode-abhängig) ---
       Partei = Mint/Türkis, Fraktion = Gold. Die Komponenten referenzieren
       --accent* statt der Marken-Literale; body.mode-fraktion schaltet um.
       Werte aus der Referenz (cdu-selm.html). */
    --accent:        #52b7c1;
    --accent-strong: #379ba5;
    --accent-tint:   #e4f5f7;
    --accent-faint:  #f3fafb;
    --on-accent:     #21303d;   /* dunkle Schrift auf Akzentflächen */

    /* --- Semantische Tokens Light Mode --- */
    --color-bg:           #ffffff;
    --color-bg-secondary: #f5f7f9;
    --color-surface:      #ffffff;
    --color-border:       #dde3e8;
    --color-text:         #2d3c4b;
    --color-text-muted:   #6b7f8e;
    --color-text-inverse: #ffffff;
    /* Standard-Textfarbe als semantischer Alias (folgt automatisch dem
       Light-/Dark-Override von --color-text). Wird u.a. für die Akkordeon-
       Überschriften genutzt, damit Gremien-/Gliederungs-Namen in neutralem
       Grau/Schwarz statt in der Effektfarbe stehen. */
    --text-main:          var(--color-text);
    /* Akzent-Überschrift (Rhöndorf-Blau auf Licht, hell im Dark Mode) */
    --text-heading:       #2d3c4b;

    /* Reference-Aliase: --line folgt automatisch dem Dim-Override von
       --color-border, sodass neue Komponenten reference-nah (--line) notiert
       werden können und der Dim-Modus dennoch greift. */
    --line:        var(--color-border);
    --line-soft:   var(--color-bg-secondary);

    /* Helle Flächen, die nachts (body.is-dim) abgesenkt werden (Referenzwerte) */
    --glass:        rgba(255,255,255,.70);   /* Glas-Header (etwas transparenter) */
    --glass-strong: rgba(255,255,255,.97);   /* Mobile-Nav-Dropdown    */
    --chip:         rgba(255,255,255,.92);   /* Label auf hellen Karten*/
    --switch-bg:    rgba(245,247,249,.70);   /* Umschalter-Gehäuse     */
    --ph-1: #eef1f4; --ph-2: #e3e8ed; --ph-3: #d9e0e6;  /* Foto-Platzhalter  */
    --pm-1: #e8edf1; --pm-2: #dde4ea;                    /* Blog-Media-Fläche */

    /* --- Typo ---
       --font-base / --font-head : Inter (UI + Überschriften, Extrabold, Tracking -10)
       --font-serif              : IBM Plex Serif (Fließtext, Sublines, Copy) */
    --font-base:  'Inter', system-ui, -apple-system, sans-serif;
    --font-head:  'Inter', system-ui, -apple-system, sans-serif;
    --font-serif: 'IBM Plex Serif', Georgia, 'Times New Roman', serif;
    --text-xs:   0.75rem;
    --text-sm:   0.875rem;
    --text-base: 1rem;
    --text-lg:   1.125rem;
    --text-xl:   1.25rem;
    --text-2xl:  1.5rem;
    --text-3xl:  1.875rem;
    --text-4xl:  2.25rem;
    --text-5xl:  3rem;

    /* --- Abstände --- */
    --space-1:  0.25rem;
    --space-2:  0.5rem;
    --space-3:  0.75rem;
    --space-4:  1rem;
    --space-5:  1.25rem;
    --space-6:  1.5rem;
    --space-8:  2rem;
    --space-12: 3rem;
    --space-16: 4rem;
    --space-20: 5rem;
    --space-24: 6rem;

    /* --- Layout (Referenzmaße) --- */
    --container-max: 1180px;
    --header-h:      64px;        /* 4px Akzentlinie + 60px Glas-Leiste (immer flach) */
    /* HYBRID „kantig": Flächen eckig (0), nur Bedienelemente leicht gerundet (2px),
       rund bleibt ausschließlich Avatare/Social über --radius-full. */
    --radius-sm:     2px;         /* Buttons, Chips, Switch */
    --radius:        0;           /* generische Flächen     */
    --radius-lg:     0;           /* Karten/große Flächen   */
    --radius-full:   9999px;

    /* --- Schatten --- Genau EIN dezenter Elevation-Schatten. Ruhende Flächen
       und Karten tragen keinen Schatten mehr; er bleibt echten „schwebenden"
       Elementen vorbehalten (Glas-Header, Mobil-Nav-Dropdown, sticky Mini-ID,
       Umschalter-Thumb, Overlays). Die früheren Abstufungen (sm/md/lg) entfallen. */
    --shadow: 0 2px 8px rgba(28,39,49,.10);

    /* --- Transition / Bewegung --- */
    --transition: 200ms ease;
    --transition-slow: 400ms ease;
    --ease: cubic-bezier(.4,0,.2,1);
    --t-accent: background-color .55s var(--ease), color .55s var(--ease),
                border-color .55s var(--ease), box-shadow .45s var(--ease);
    --t-dim: background-color .5s var(--ease), border-color .5s var(--ease);
}

/* Dark Mode entfernt (UI/UX-Entscheidung): die Seite ist immer hell.
   Nur die Hero-Hintergrundvideos schalten weiterhin nach System-Einstellung
   (per JS in main.js, ohne Header-Button). */

/* Dezenter „Abend-Modus" – KEIN echtes Dark Mode. main.js setzt body.is-dim,
   sobald das System auf dunkel steht (dann läuft auch das dunkle Hero-Video).
   Es werden nur die grellen Weißflächen ganz leicht abgedämpft; Text, Marke und
   Akzente bleiben unverändert – spürbar augenfreundlicher, aber weit von dunkel
   entfernt. Greift ausschließlich öffentlich (Portal & JU laden dieses
   Stylesheet nicht). */
body.is-dim {
    --color-bg:           #e8eaed;
    --color-bg-secondary: #dfe2e6;
    --color-surface:      #f0f2f4;
    --color-border:       #cfd5db;
    /* getokenisierte Hellflächen ebenfalls absenken (Referenzwerte) */
    --glass:        rgba(232,234,237,.84);
    --glass-strong: rgba(232,234,237,.97);
    --chip:         rgba(240,242,244,.92);
    --switch-bg:    rgba(216,221,226,.62);
    --ph-1: #d9dee3; --ph-2: #cfd5db; --ph-3: #c6cdd4;
    --pm-1: #d7dde2; --pm-2: #cdd4da;
}

/* Akzentwelt Fraktion = Gold. Schaltet die gesamte --accent*-Familie um;
   liegt auf <body>, gewinnt damit für den kompletten Seitenbaum gegen :root. */
body.mode-fraktion {
    --accent:        #ffa600;
    --accent-strong: #e2900a;
    --accent-tint:   #fff3df;
    --accent-faint:  #fffaf1;
}

/* Das CDU-Logo liegt auf weißem Grund. Damit im Dim-Modus kein heller „Kasten"
   um das Logo entsteht, bleibt die Kopfzeile weiß – nur der Seiteninhalt wird
   gedämpft. Die dunkle Navigation bleibt dadurch gut lesbar. */
/* Im Dim-Modus behält der Header bewusst seinen Glas-Effekt (var(--glass) ist
   nachts nur leicht abgesenkt). Das frühere erzwungene Weiß hatte das Glas im
   Abend-Modus ausgeschaltet. */


/* =============================================================================
   RESET & BASE
   ============================================================================= */
*, *::before, *::after {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}

html {
    scroll-behavior: smooth;
    font-size: 16px;
    -webkit-text-size-adjust: 100%;
}

body {
    /* Fließtext = IBM Plex Serif. Überschriften & UI setzen Inter explizit. */
    font-family: var(--font-serif);
    font-size: var(--text-base);
    line-height: 1.6;
    color: var(--color-text);
    background-color: var(--color-bg);
    -webkit-font-smoothing: antialiased;
    /* Kein horizontales Verrutschen/Zoomen mehr: clip kappt etwaigen seitlichen
       Überstand, OHNE einen Scroll-Container zu erzeugen – die iOS-Adressleisten-
       Mechanik (Root-Scroller) und der fixe Hero bleiben dadurch unberührt. */
    overflow-x: clip;
}

/* Überschriften: Inter Extrabold, Laufweite -10 (= -0.01em). */
h1, h2, h3, h4, h5, h6,
.hero__title, .section-title, .card__title, .team-card__name,
.editorial__card-title, .programm-kachel__title,
.site-footer__heading {
    font-family: var(--font-head);
    font-weight: 800;
    letter-spacing: -0.01em;
}

/* UI-Chrome bleibt Inter (Navigation, Buttons, Tabs, Labels, Meta, Formulare),
   damit nur die eigentlichen Copy-Texte serif laufen. */
.site-nav, .site-nav__link, .btn, .switch-opt, .tab, .filter-tabs,
.text-label, .card__meta, .theme-toggle, .antraege-pager__btn,
input, select, textarea {
    font-family: var(--font-base);
}

img, video {
    max-width: 100%;
    display: block;
}

a {
    /* Basis-Linkfarbe = dunkleres Cadenabbia (besserer Kontrast auf Weiß als das
       reine Mint, das nur noch als Deko-/Flächenfarbe dient – A.4). */
    color: var(--tuerkis-dark);
    text-decoration: none;
    transition: color var(--transition);
}
a:hover { color: var(--tuerkis-dark); text-decoration: underline; }

ul, ol { list-style: none; }

button {
    font-family: var(--font-base);
    cursor: pointer;
    border: none;
    background: none;
}


/* =============================================================================
   LAYOUT-HELFER
   ============================================================================= */
.container {
    max-width: var(--container-max);
    margin-inline: auto;
    padding-inline: var(--space-6);
}

.section {
    padding-block: var(--space-20);
}

.section--alt {
    background-color: var(--color-bg-secondary);
    border-top: 1px solid var(--color-border);
    border-bottom: 1px solid var(--color-border);
}


/* =============================================================================
   HEADER & NAVIGATION
   ============================================================================= */
.site-header {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    height: var(--header-h);
    /* Glas-Leiste volle Breite (Referenz): leicht transparent + Blur. Im
       Dim-Modus wird sie weiter oben wieder solide weiß (Logo-Kasten-Fix). */
    /* Standard = Glas-Leiste (gilt nach dem Scrollen und auf Unterseiten ohne Hero). */
    background: var(--glass);
    backdrop-filter: blur(16px) saturate(140%);
    -webkit-backdrop-filter: blur(16px) saturate(140%);
    border-bottom: 1px solid var(--line);
    z-index: 1000;
    transition: height .35s var(--ease), background-color .4s var(--ease), border-color .4s var(--ease), backdrop-filter .4s var(--ease);
}

/* Der Header hat immer dieselbe (flache) Höhe – kein Höhenwechsel beim Scrollen.
   .is-scrolled steuert nur noch Glas/Transparenz, nicht die Höhe. */

/* 4px-Akzentlinie über der Glas-Leiste; folgt der Akzentwelt (Mint/Gold). */
.accent-rule {
    height: 4px;
    background: var(--accent);
    transition: background-color .55s var(--ease), opacity .4s var(--ease);
}

/* =============================================================================
   SCHWEBENDER, TRANSPARENTER HEADER am Seitenanfang (nur Hero-Seiten /partei,
   /fraktion). main.js setzt .is-scrolled ab 50px Scroll; bis dahin ist der Header
   transparent und Logo/Navigation/Umschalter schweben über dem Hero-Video
   (heller Text). Weicher Übergang via Transition oben. Unterseiten (body.single-
   page) sind ausgenommen und bleiben immer Glas.
   ============================================================================= */
body:not(.single-page) .site-header:not(.is-scrolled) {
    background: transparent;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    border-bottom-color: transparent;
}
body:not(.single-page) .site-header:not(.is-scrolled) .accent-rule { opacity: 0; }
body:not(.single-page) .site-header:not(.is-scrolled) .site-header__social-link img { filter: brightness(0) invert(1); opacity: .85; }
body:not(.single-page) .site-header:not(.is-scrolled) .site-header__social-link:hover img { opacity: 1; }
body:not(.single-page) .site-header:not(.is-scrolled) .nav-burger { background: rgba(255,255,255,.10); border-color: rgba(255,255,255,.45); }
body:not(.single-page) .site-header:not(.is-scrolled) .nav-burger__bar { background: #fff; }
/* Helle Inline-Navigation nur am Desktop – das mobile Dropdown hat eine helle
   Fläche und behält dunkle Links. */
@media (min-width: 769px) {
    body:not(.single-page) .site-header:not(.is-scrolled) .site-nav__link { color: rgba(255,255,255,.92); }
    body:not(.single-page) .site-header:not(.is-scrolled) .site-nav__link:hover,
    body:not(.single-page) .site-header:not(.is-scrolled) .site-nav__link.is-active { color: #fff; background: rgba(255,255,255,.14); }
}

.site-header__inner {
    height: calc(var(--header-h) - 4px);
    display: flex;
    align-items: center;
    gap: var(--space-6);
}

/* Logo */
/* .site-header__logo → siehe LOGO(PNG)-Block weiter unten */

/* SVG-Logo entfernt – PNG wird verwendet */

/* Haupt-Navigation (zentriert, nimmt verfügbaren Platz ein) */
.site-nav {
    flex: 1;
    display: flex;
    justify-content: center;
}

.site-nav__list {
    display: flex;
    align-items: center;
    gap: var(--space-1);
}

.site-nav__link {
    display: block;
    padding: var(--space-2) var(--space-3);
    border-radius: var(--radius);
    font-size: var(--text-sm);
    font-weight: 500;
    color: var(--color-text);
    transition: color var(--transition), background-color var(--transition);
    white-space: nowrap;
}

.site-nav__link:hover {
    color: var(--tuerkis);
    background-color: var(--tuerkis-subtle);
}

/* Fraktion-Links haben Gold-Hover */
.site-nav__item--fraktion .site-nav__link:hover {
    color: var(--gold-dark);
    background-color: var(--gold-subtle);
}

/* Burger-Button (nur mobil sichtbar – siehe Media-Query) */
.nav-burger {
    display: none;
    flex-direction: column;
    justify-content: center;
    gap: 5px;
    width: 44px;
    height: 40px;
    padding: 0 9px;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
    cursor: pointer;
    flex-shrink: 0;
    transition: background var(--transition), border-color var(--transition), box-shadow var(--transition);
}
.nav-burger:hover { background: var(--color-bg-secondary); }
.nav-burger__bar {
    display: block;
    width: 100%;
    height: 2px;
    background: var(--color-text);
    border-radius: var(--radius-sm);
    transition: transform .22s ease, opacity .22s ease, background .22s ease;
}
.nav-burger[aria-expanded="true"] .nav-burger__bar:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nav-burger[aria-expanded="true"] .nav-burger__bar:nth-child(2) { opacity: 0; }
.nav-burger[aria-expanded="true"] .nav-burger__bar:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* Geöffnet: Burger nimmt die Effektfarbe der aktiven Ansicht an (Türkis/Gold)
   und hebt sich klar vom Header ab – wirkt weniger „nackt". */
body.nav-open .nav-burger {
    border-color: var(--tuerkis);
    box-shadow: 0 0 0 3px var(--tuerkis-subtle);
}
body.nav-open .nav-burger__bar { background: var(--tuerkis); }
body.mode-fraktion.nav-open .nav-burger {
    border-color: var(--gold);
    box-shadow: 0 0 0 3px var(--gold-subtle);
}
body.mode-fraktion.nav-open .nav-burger__bar { background: var(--gold); }


/* =============================================================================
   DUAL-FACE TOGGLE – Kern des Konzepts
   Standardmodus: 'partei' (Türkis). body.mode-fraktion schaltet um.
   ============================================================================= */

/* Fraktion-Nav-Items initial versteckt */
.site-nav__item--fraktion { display: none; }
.site-nav__item--partei   { display: flex; }

/* Im Fraktion-Modus umschalten */
body.mode-fraktion .site-nav__item--partei   { display: none; }
body.mode-fraktion .site-nav__item--fraktion { display: flex; }

/* nav-toggle entfernt – ersetzt durch .mode-switcher */

/* Aktiver Nav-Link (aktueller Abschnitt) */
.site-nav__link.is-active {
    color: var(--tuerkis);
    background-color: var(--tuerkis-subtle);
}
body.mode-fraktion .site-nav__link.is-active {
    color: var(--gold-dark);
    background-color: var(--gold-subtle);
}


/* =============================================================================
   ONEPAGER-SECTIONS sichtbar/versteckt
   ============================================================================= */
.onepager-partei,
.onepager-fraktion {
    transition: opacity var(--transition-slow);
    /* Kein background-color hier – sonst wird das Hero-Video verdeckt.
       Der Footer-Gap wird stattdessen über padding-top des Footers gelöst. */
}

/* Fraktion-Sections initial versteckt */
.onepager-fraktion { display: none; }

body.mode-fraktion .onepager-partei   { display: none; }
body.mode-fraktion .onepager-fraktion { display: block; }

/* Einzelseiten (Profil, Aktuelles-Beitrag, Statisch) haben nur den
   .onepager-partei-Container und keinen Fraktions-Onepager. Beim Modus
   „fraktion" (?ctx=fraktion) darf ihr Inhalt deshalb NICHT ausgeblendet
   werden – sonst bliebe nur Header und Footer übrig. Der Header behält
   trotzdem seine Fraktions-Optik. */
body.single-page .onepager-partei { display: block !important; }


/* =============================================================================
   TYPOGRAFIE-HELFER
   ============================================================================= */
.text-label {
    display: inline-flex;
    align-items: center;
    font-size: var(--text-xs);
    font-weight: 600;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--accent-strong);   /* folgt der Akzentwelt (Türkis-/Gold-dunkel) */
    margin-bottom: var(--space-2);
}
/* Akzentstrich vor dem Eyebrow (Referenz-Muster). */
.text-label::before {
    content: "";
    width: 26px;
    height: 2px;
    margin-right: 0.7rem;
    background: var(--accent);
    transition: background-color .55s var(--ease);
}

.section-title {
    font-size: var(--text-3xl);
    font-weight: 800;
    line-height: 1.2;
    color: var(--color-text);
    margin-bottom: var(--space-4);
}

.section-subtitle {
    font-size: var(--text-lg);
    color: var(--color-text-muted);
    max-width: 60ch;
    margin-bottom: var(--space-8);
}


/* =============================================================================
   BUTTONS
   ============================================================================= */
.btn {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    padding: var(--space-3) var(--space-6);
    border-radius: var(--radius-sm);     /* kantig: 2px statt Pille */
    font-size: var(--text-base);
    font-weight: 600;
    letter-spacing: -0.01em;
    /* Kein Bewegungs-Hover mehr: nur Farb-/Rahmenwechsel (t-accent) + Opacity. */
    transition: var(--t-accent), opacity var(--transition);
    cursor: pointer;
    border: 1.5px solid transparent;
    white-space: nowrap;
    /* Ein Button darf nie breiter als sein Container werden. */
    max-width: 100%;
    text-align: center;
}

/* Mobil dürfen (lange) Button-Beschriftungen umbrechen, statt den Viewport
   horizontal zu sprengen (z. B. „Zum Bürgerinformationssystem der Stadt Selm"
   im Fraktions-Anträge-Block). Kurze Buttons bleiben einzeilig. Verhindert das
   seitliche Verschieben/Zoomen über dem fixen Hero-Video. */
@media (max-width: 600px) {
    .btn { white-space: normal; }
}

/* Solid = Akzent der aktiven Ansicht (Mint/Gold), dunkle Schrift (--on-accent). */
.btn--primary {
    background-color: var(--accent);
    color: var(--on-accent);
    border-color: var(--accent);
}
.btn--primary:hover {
    background-color: var(--accent-strong);
    border-color: var(--accent-strong);
    color: var(--on-accent);
}

/* Ghost = Linie + Akzent-Hover. Rahmen aus dem Textton abgeleitet, damit er auch
   im Dim-Modus sichtbar bleibt (das helle --line war dort zu schwach). */
.btn--secondary {
    background-color: transparent;
    color: var(--color-text);
    border-color: color-mix(in srgb, var(--color-text) 28%, transparent);
}
.btn--secondary:hover {
    color: var(--accent-strong);
    border-color: var(--accent);
}

.btn--gold {
    background-color: var(--gold);
    color: var(--rhoenblau-dark);
    border-color: var(--gold);
}
.btn--gold:hover {
    background-color: var(--gold-dark);
    color: #fff;
    border-color: var(--gold-dark);
}


/* =============================================================================
   BARRIEREFREIHEIT – Sichtbarer Fokusring (WCAG 2.1 SC 2.4.7)
   Einheitlicher Tastatur-Fokus über alle interaktiven Elemente. Folgt der
   Akzentwelt (Mint/Gold). Nur :focus-visible, damit Mausklicks keinen Ring
   zeigen. Ersetzt frühere outline:none-Fallen durch einen klaren Indikator.
   ============================================================================= */
a:focus-visible,
button:focus-visible,
.btn:focus-visible,
.site-nav__link:focus-visible,
.switch-opt:focus-visible,
.filter-tabs .tab:focus-visible,
.nav-burger:focus-visible,
a.team-card:focus-visible,
.blog-card__more:focus-visible,
.org-link:focus-visible,
.pp-vcard-link:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
    outline: 2px solid var(--accent-strong);
    outline-offset: 2px;
}
/* Auf der Team-Karte zusätzlich den Namen unterstreichen (nicht nur Ring). */
a.team-card:focus-visible .team-card__name { text-decoration: underline; }


/* =============================================================================
   CARDS (Basis – wird in Sections überschrieben)
   ============================================================================= */
.card {
    background-color: var(--color-surface);
    border: 1px solid var(--line);
    border-radius: var(--radius-lg);
    overflow: hidden;
    transition: var(--t-accent);
}
.card:hover {
    border-color: var(--accent);
}

.card__body {
    padding: var(--space-6);
}

.card__title {
    font-size: var(--text-lg);
    font-weight: 700;
    color: var(--color-text);
    margin-bottom: var(--space-2);
}

.card__meta {
    font-size: var(--text-sm);
    color: var(--color-text-muted);
}


/* =============================================================================
   FOOTER
   ============================================================================= */
.site-footer {
    background-color: var(--rhoenblau);
    color: rgba(255,255,255,.75);
    /* Footer-Gap-Fix: margin-top wurde in padding-top umgewandelt.
       Padding liegt INNERHALB des Footers (mit Hintergrundfarbe) –
       kein durchscheinendes Video mehr zwischen letzter Section und Footer. */
    padding-top:    calc(var(--space-12) + var(--space-20));
    padding-bottom: var(--space-8);
    margin-top: 0;
}

.site-footer a {
    color: rgba(255,255,255,.75);
    transition: color var(--transition), transform var(--transition);
}
.site-footer a:hover { color: var(--accent); }

.site-footer__grid {
    display: grid;
    /* Marke/Kontakt links breiter, daneben die zwei Navigations-Spalten.
       minmax(0,...) verhindert Überlauf durch lange E-Mail/Namen. */
    grid-template-columns: minmax(0, 1.7fr) minmax(0, 1fr) minmax(0, 1fr);
    gap: var(--space-8);
    margin-bottom: var(--space-8);
}
@media (max-width: 720px) {
    .site-footer__grid { grid-template-columns: 1fr 1fr; }
    .site-footer__brand { grid-column: 1 / -1; }
}
@media (max-width: 420px) {
    .site-footer__grid { grid-template-columns: 1fr; }
}
.site-footer__brand .footer-social { margin-top: var(--space-4); }

.site-footer__heading {
    color: #fff;
    font-size: var(--text-sm);
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    margin-bottom: var(--space-4);
}

.site-footer__links li + li { margin-top: var(--space-2); }

.site-footer__links a {
    font-size: var(--text-sm);
}

.site-footer__bottom {
    border-top: 1px solid rgba(255,255,255,.15);
    padding-top: var(--space-6);
    /* Copyright (+ dezentes „Portal") links, Rechtliches rechtsbündig. */
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3) var(--space-6);
    font-size: var(--text-sm);
}
.site-footer__copy { white-space: nowrap; }
/* „Portal" dezent direkt neben dem Copyright (nicht mehr prominent rechts). */
.site-footer__copy .site-footer__login { margin-left: .35rem; }

.site-footer__legal {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3) var(--space-4);
    margin-left: auto;            /* rechtsbündig */
    font-size: var(--text-xs);
}
.site-footer__legal-sep { opacity: .4; }

.site-footer__login {
    opacity: .4;
    font-size: var(--text-xs);
    transition: opacity var(--transition);
}
.site-footer__login:hover { opacity: .8; color: #fff; }

/* Footer-Marke + Kontaktspalte (neues Muster: beide Navigationen + Kontakt) */
.site-footer__brandname { font-family: var(--font-head); font-weight: 800; font-size: var(--text-xl); letter-spacing: -.02em; color: #fff; margin-bottom: var(--space-3); }
.site-footer__blurb { font-family: var(--font-serif); font-size: var(--text-sm); line-height: 1.6; max-width: 34ch; margin-bottom: var(--space-4); }
/* Gliederungs-Name fett und etwas größer (führt die linke Footer-Spalte an). */
.site-footer__addr-name { display: inline-block; color: #fff; font-family: var(--font-base); font-weight: 800; font-size: var(--text-lg); letter-spacing: -.01em; margin-bottom: var(--space-2); }

/* Kontakt + Rechtliches + Copyright folgen dem Modus – nur die passende Variante
   (Partei ODER Fraktion) wird gezeigt; beide Navigationen bleiben dagegen immer. */
.site-footer__contact--fraktion,
.site-footer__legal--fraktion,
.site-footer__copy--fraktion { display: none; }
body.mode-fraktion .site-footer__contact--partei,
body.mode-fraktion .site-footer__legal--partei,
body.mode-fraktion .site-footer__copy--partei { display: none; }
body.mode-fraktion .site-footer__contact--fraktion { display: block; }
body.mode-fraktion .site-footer__legal--fraktion { display: flex; }
body.mode-fraktion .site-footer__copy--fraktion { display: inline; }

/* Social-Media-Icons auf der CV-/Profilseite (AP-14.3): lokale SVG via <img>.
   Icon dunkel (Türkis-Tönung) auf hellem Kreis, auf Hover Türkis-Fläche + weißes
   Icon. Funktioniert in Light & Dark Mode (Kreisfläche + Filter). */
.cv-social__link {
    display: inline-flex; align-items: center; justify-content: center;
    width: 38px; height: 38px;
    border: 1px solid var(--color-border); border-radius: 50%;
    background: var(--color-surface);
    transition: background .15s, border-color .15s;
}
.cv-social__link img {
    width: 19px; height: 19px;
    /* schwarzes Quell-Icon dezent dunkel einfärben (Seite ist immer hell) */
    filter: brightness(0) saturate(100%) opacity(.78);
}
.cv-social__link:hover { background: var(--tuerkis); border-color: var(--tuerkis); }
.cv-social__link:hover img { filter: brightness(0) invert(1); }

/* Social-Media-Icons im Footer (AP-14): lokale SVG-Dateien via <img>,
   per CSS-Filter weiß auf dem Rhöndorf-blauen Footer-Hintergrund. */
.footer-social {
    display: flex;
    gap: var(--space-3);
    margin-top: var(--space-4);
}
.footer-social__link {
    display: inline-flex;
    opacity: .75;
    transition: opacity var(--transition);
}
.footer-social__link:hover { opacity: 1; }
.footer-social__icon {
    width: 22px;
    height: 22px;
    /* Schwarze Quell-Icons (currentColor → black via <img>) zu Weiß invertieren */
    filter: brightness(0) invert(1);
}

/* =============================================================================
   AP-12: Amtsträger-Banner-Sektionen (vollflächig, Overlay gegenüber der Person)
   ============================================================================= */
.official { width: 100%; }
/* Dunkler Grund, damit vor dem Laden des Banner-Bilds NICHT das fixe Hero-Video
   durchscheint (Amtsträger werden zudem eager geladen, siehe officials.php). */
.official__media { position: relative; width: 100%; overflow: hidden; background: var(--rhoenblau); }
.official__img {
    display: block;
    width: 100%;
    /* Etwas niedriger (Nutzer-Feedback: war auf dem Mac zu hoch). */
    height: clamp(380px, 48vw, 600px);
    object-fit: cover;
    object-position: center;
}
.official__overlay {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    /* Inhalt auf Container-Breite einrücken (Text fluchtet mit dem übrigen
       Seiteninhalt); das Banner-Bild bleibt vollflächig. */
    padding-inline: max(var(--space-6), calc((100% - var(--container-max)) / 2 + var(--space-6)));
}
/* Person im linken Drittel => Overlay/Verlauf rechts (leere 2/3).
   Der Verlauf endet früh (transparent ab ~48%), damit die Person frei bleibt. */
.official--person-left .official__overlay {
    justify-content: flex-end;
    background: linear-gradient(270deg,
        color-mix(in srgb, var(--rhoenblau) 94%, transparent) 0%,
        color-mix(in srgb, var(--rhoenblau) 88%, transparent) 28%,
        transparent 48%);
}
/* Person im rechten Drittel => Overlay/Verlauf links */
.official--person-right .official__overlay {
    justify-content: flex-start;
    background: linear-gradient(90deg,
        color-mix(in srgb, var(--rhoenblau) 94%, transparent) 0%,
        color-mix(in srgb, var(--rhoenblau) 88%, transparent) 28%,
        transparent 48%);
}
.official__content {
    width: min(42%, 460px);
    padding: clamp(1.5rem, 4vw, 3rem) 0;
    color: #fff;
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
}
.official__role {
    font-size: var(--text-sm);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--accent);   /* Akzent-Eyebrow auf dem dunklen Banner-Overlay */
    margin: 0;
}
.official__name { font-size: clamp(1.6rem, 3vw, 2.4rem); font-weight: 800; margin: 0; color: #fff; }
.official__blurb { font-size: var(--text-base); line-height: 1.6; margin: 0; }
.official__cta { align-self: flex-start; margin-top: var(--space-2); }
.official__social { display: flex; gap: var(--space-3); margin-top: var(--space-2); }
.official__social-link { display: inline-flex; opacity: .85; transition: opacity var(--transition); }
.official__social-link:hover { opacity: 1; }
.official__social-link img { width: 22px; height: 22px; filter: brightness(0) invert(1); }

/* Mobile: Bild oben (an der Personenseite angedockt), Inhalte direkt darunter
   als voller blauer Block. Die Verlaufs-Regeln der Personenseite müssen hier
   überschrieben werden – daher gleiche Spezifität (kein durchscheinender
   Verlauf auf dem gestapelten Textblock). */
@media (max-width: 768px) {
    .official__media { display: flex; flex-direction: column; }
    .official__img {
        height: auto;
        aspect-ratio: 4 / 5;
        max-height: 60vh;
    }
    .official--person-left  .official__img { object-position: left center; }
    .official--person-right .official__img { object-position: right center; }
    .official__overlay,
    .official--person-left  .official__overlay,
    .official--person-right .official__overlay {
        position: static;
        background: var(--rhoenblau);
        justify-content: flex-start;
        align-items: stretch;
    }
    .official__content { width: 100%; }
}


/* =============================================================================
   SPACING: Erster Section-Abstand wegen fixed Header
   ============================================================================= */
.onepager-partei > section:first-child,
.onepager-fraktion > section:first-child {
    padding-top: calc(var(--header-h) + var(--space-8));
}


/* =============================================================================
   RESPONSIVE
   ============================================================================= */
@media (max-width: 768px) {
    :root {
        --text-3xl: 1.5rem;
        --text-4xl: 1.875rem;
        --text-5xl: 2.25rem;
        --header-h: 64px;   /* 4px Akzentlinie + 60px Leiste (mobil) */
    }

    /* Mobile-Navigation: Burger rechts, Nav als Dropdown unter dem Header. */
    .nav-burger { display: inline-flex; }
    .switch { margin-left: auto; }

    .site-nav {
        position: fixed;
        top: var(--header-h);
        left: 0;
        right: 0;
        flex: none;
        justify-content: flex-start;
        /* Glas-Dropdown (kohärent mit dem Header-Designsystem). */
        background: var(--glass-strong);
        backdrop-filter: blur(16px) saturate(140%);
        -webkit-backdrop-filter: blur(16px) saturate(140%);
        /* Border/Schatten NUR im geöffneten Zustand: das geschlossene Dropdown
           (max-height:0) würde sonst seine border-bottom als Strich direkt unter
           dem am Seitenanfang transparenten Header zeigen (Aufgabe #2). */
        border-bottom: 0 solid var(--color-border);
        box-shadow: none;
        max-height: 0;
        overflow: hidden;
        transition: max-height .25s ease;
        z-index: 999;
    }
    body.nav-open .site-nav {
        max-height: calc(100vh - var(--header-h));
        overflow-y: auto;
        border-bottom-width: 1px;
        box-shadow: var(--shadow);
    }
    .site-nav__list {
        flex-direction: column;
        align-items: stretch;
        gap: 0;
        padding: var(--space-2) var(--space-3) var(--space-4);
    }
    /* Vollwertige Menüzeilen: große Tap-Ziele, feine Trennlinien und ein
       Marken-Akzentbalken links auf Hover/aktiv – wirkt weniger „nackt". */
    .site-nav__link {
        padding: var(--space-4) var(--space-3);
        font-size: var(--text-lg);
        font-weight: 600;
        border-radius: 0;
        border-bottom: 1px solid var(--color-border);
        border-left: 3px solid transparent;
    }
    .site-nav__link:hover,
    .site-nav__link.is-active {
        border-left-color: var(--tuerkis);
        background: var(--tuerkis-subtle);
        color: var(--tuerkis-dark);
    }
    body.mode-fraktion .site-nav__link:hover,
    body.mode-fraktion .site-nav__link.is-active {
        border-left-color: var(--gold);
        background: var(--gold-subtle);
        color: var(--gold-dark);
    }

    .container { padding-inline: var(--space-4); }
    .section { padding-block: var(--space-12); }
}


/* =============================================================================
   LOGO (PNG)
   ============================================================================= */

.site-header__logo {
    flex-shrink: 0;
    max-width: 150px;
    display: flex;
    align-items: center;
    gap: var(--space-2);
    overflow: hidden;
}

.site-header__logo-img {
    height: 28px;
    width: auto;
    max-width: 110px;
    display: block;
    object-fit: contain;
}

/* Logo im Dark Mode nicht invertieren – CDU-Farben bleiben original */

.site-header__logo-text {
    font-size: var(--text-sm);
    font-weight: 700;
    color: var(--color-text);
    white-space: nowrap;
}


/* =============================================================================
   VIDEO-HINTERGRUND (fixed – bleibt beim Scrollen sichtbar)
   ============================================================================= */
.hero-video-bg {
    position: fixed;
    /* Full-bleed hinter dem Header: der Header ist am Seitenanfang transparent
       und schwebt über dem Hero-Video; beim Scrollen wird er zur Glas-Leiste.
       2px über den oberen Rand hinaus, damit mobil kein heller Subpixel-/
       Safe-Area-Streifen durchblitzt. */
    top: -2px;
    left: 0;
    width: 100%;
    height: calc(100vh + 4px);   /* Fallback ohne lvh-Support */
    height: calc(100lvh + 4px);  /* iOS: deckt den Bereich hinter den Adressleisten voll ab */
    object-fit: cover;
    z-index: -1;         /* hinter allem anderen */
    pointer-events: none;
}

/* Animierter, gebrandeter Fallback hinter dem fixed Hero-Video. Sichtbar, bis das
   Video seine Quelle hat (JS setzt sie erst in der aktiven Ansicht), bei Ladefehler
   und ganz ohne JS. Akzent-Glow folgt der Akzentwelt (Mint/Gold). Nur im Hero
   sichtbar, da alle folgenden Sektionen einen soliden Hintergrund tragen. */
.hero-fallback {
    position: fixed;
    /* Oben verankert + volle Displayhöhe (lvh) statt bottom-Anker: deckt auf iOS
       auch den Bereich hinter der unteren Adressleiste ab (kein Streifen mehr). */
    top: -2px; left: 0; right: 0; bottom: auto;
    height: calc(100vh + 4px);
    height: calc(100lvh + 4px);
    z-index: -2;
    pointer-events: none;
    background-color: #243240;
    background-image:
        radial-gradient(55% 55% at 18% 22%, var(--accent-tint), transparent 60%),
        linear-gradient(135deg, #2a3947 0%, #2d3c4b 45%, #1c2731 100%);
    background-size: 160% 160%, 100% 100%;
    background-position: 0% 0%, center;
    animation: heroDrift 24s ease-in-out infinite alternate;
}
@keyframes heroDrift {
    from { background-position: 0% 0%, center; }
    to   { background-position: 26% 30%, center; }
}

/* Alle Sections nach dem Hero bekommen einen soliden Hintergrund,
   damit das Video beim Scrollen hinter den Inhalten verschwindet */
.onepager-partei > section:not(.section--hero),
.onepager-fraktion > section:not(.section--hero) {
    background-color: var(--color-bg);
    position: relative;
}
.onepager-partei > section.section--alt {
    background-color: var(--color-bg-secondary);
    border-top: 1px solid var(--color-border);
    border-bottom: 1px solid var(--color-border);
}

/* Performance (B.2): weit unten liegende Onepager-Sektionen erst rendern, wenn
   sie in Sichtnähe kommen (natives CSS, kein Build). contain-intrinsic-size mit
   dem Schlüsselwort „auto" merkt sich die real gemessene Höhe, sodass Anker-
   sprünge (#partei-team …) und die Seitensuche zuverlässig bleiben. Der Hero
   ist ausgenommen (er ist sofort sichtbar und trägt das fixe Video). */
.onepager-partei > section:not(.section--hero),
.onepager-fraktion > section:not(.section--hero) {
    content-visibility: auto;
    contain-intrinsic-size: auto 720px;
}


/* =============================================================================
   HERO-SECTION
   ============================================================================= */
.section--hero {
    position: relative;
    min-height: 100vh;   /* Fallback */
    min-height: 100lvh;  /* volle Displayhöhe inkl. Bereich hinter der iOS-Adresszeile */
    display: flex;
    align-items: center;
    /* kein background-color – Video scheint durch */
    background: transparent;
    padding-top: var(--header-h);
}

/* Dezenter Rhöndorf-Verlauf über dem Hero: oben links voll, diagonal (135°) zur
   unteren rechten Ecke = Unterkante des Videos auf vollständig transparent. So
   bleiben Text und der oben schwebende, transparente Header lesbar, das Video
   wird zur Unterkante hin frei. Farbe = Rhöndorf-Blau rgb(45,60,75). */
.hero__overlay {
    position: absolute;
    inset: 0;
    background: linear-gradient(
        135deg,
        rgba(45, 60, 75, 0.85) 0%,
        rgba(45, 60, 75, 0.45) 55%,
        rgba(45, 60, 75, 0) 100%
    );
    pointer-events: none;
}

.hero__content {
    position: relative;   /* über dem Overlay */
    z-index: 1;
    padding-block: var(--space-20);
    max-width: 700px;
}

.hero__title {
    font-size: clamp(2.25rem, 5vw, 4rem);
    font-weight: 800;
    line-height: 1.1;
    color: #fff;
    margin-bottom: var(--space-4);
    letter-spacing: -0.02em;
}

.hero__subtitle {
    font-size: var(--text-xl);
    color: rgba(255, 255, 255, 0.85);
    margin-bottom: var(--space-8);
    max-width: 50ch;
}

/* Auf dunklen Flächen (Hero): heller Text, der Akzentstrich (::before) trägt
   weiterhin die Akzentwelt (Mint/Gold) – damit mode-unabhängig korrekt. */
.text-label--light {
    color: rgba(255,255,255,.82);
}

.hero__ctas {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-4);
}

/* Outline-Weiß Button für Hero */
.btn--outline-white {
    background-color: transparent;
    color: #fff;
    border-color: rgba(255, 255, 255, 0.6);
}
.btn--outline-white:hover {
    background-color: rgba(255, 255, 255, 0.15);
    border-color: #fff;
    color: #fff;
}

/* Mobile: Video läuft, kein Fallback nötig */
@media (max-width: 768px) {
    .hero__title {
        font-size: 2rem;
    }
    /* Hero etwas höher, damit die Sektion auf iOS Safari sicher hinter die untere
       Adressleiste reicht (kein heller Streifen am unteren Rand). */
    .section--hero {
        min-height: calc(100vh + 4rem);
        min-height: calc(100lvh + 4rem);
    }
    /* ENTSCHEIDEND: der fixe Videohintergrund + Fallback reichen großzügig über
       die Sektion hinaus (oben verankert, 120 % Displayhöhe), damit auf iOS
       Safari unten KEIN heller Streifen hinter der Adressleiste bleibt – auch
       wenn die Leiste ein-/ausfährt. Muss höher sein als die Sektion. */
    .hero-video-bg,
    .hero-fallback {
        height: 120vh;
        height: 120lvh;
    }
}


/* =============================================================================
   FRAKTION-HERO – blauer Overlay wie Partei, helle Schrift
   ============================================================================= */

/* Blauer Verlauf (identisch mit Partei-Stil): Rhöndorf oben links, diagonal auf
   vollständig transparent an der Unterkante. */
.hero__overlay--fraktion {
    position: absolute;
    inset: 0;
    background: linear-gradient(
        135deg,
        rgba(45, 60, 75, 0.82) 0%,
        rgba(45, 60, 75, 0.42) 55%,
        rgba(45, 60, 75, 0) 100%
    );
    pointer-events: none;
}

/* Rückwärtskompatibilität – gold bleibt als Alias */
.hero__overlay--gold { background: linear-gradient(135deg, rgba(29,40,48,.75) 0%, rgba(29,40,48,.50) 60%, rgba(29,40,48,.28) 100%); position:absolute; inset:0; pointer-events:none; }

/* Zweites Video-Element für Fraktion (gleiche fixed-Positionierung,
   nur sichtbar wenn body.mode-fraktion aktiv) */
.hero-video-bg--fraktion {
    display: none;
}
body.mode-fraktion .hero-video-bg {
    display: none;
}
body.mode-fraktion .hero-video-bg--fraktion {
    display: block;
}


/* =============================================================================
   BLOG-GRID
   ============================================================================= */
.blog-grid {
    display: grid;
    /* Feste Spaltenzahl (wie das funktionierende .editorial-Grid) + explizites
       Stretch: die höchste Card einer Reihe gibt die Reihenhöhe vor, die übrigen
       ziehen voll mit (kein auto-fill, das die Gleichhöhe je nach Browser brach).
       minmax(0,1fr) verhindert horizontalen Überlauf durch lange Titel. */
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--space-6);
    align-items: stretch;
}
@media (max-width: 860px) { .blog-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .blog-grid { grid-template-columns: 1fr; } }

.blog-card__img-wrap {
    display: block;
    overflow: hidden;
    /* Quadratisch – universell für 4:5, 1:1 und Querformat. */
    aspect-ratio: 1 / 1;
}

.blog-card__img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
    transition: transform var(--transition-slow);
}


.blog-card__excerpt {
    font-size: var(--text-sm);
    color: var(--color-text-muted);
    margin-top: var(--space-2);
}

/* Blog-Liste = dezente Karte (nutzt die .card-Basis: Rahmen/Fläche/Rundung).
   Hover = ruhiger Zustandswechsel über die Effektfarbe des Rahmens (siehe
   .card.blog-card:hover), ohne Bewegung, Schatten oder Foto-Zoom. */

/* Gleich hohe Blog-Karten – die höchste Karte einer Reihe (meiste Text) gibt die
   Reihenhöhe vor, die übrigen ziehen mit (Grid-Reihe + height:100%). KEIN
   Text-Abschnitt mehr: Titel und Teaser werden vollständig gezeigt (Aufgabe #3);
   „Weiterlesen" wird ans Kartenende geschoben. */
.blog-card { display: flex; flex-direction: column; height: 100%; }
.blog-card .card__body { display: flex; flex-direction: column; flex: 1; }


/* =============================================================================
   TEAM-GRID  (4 Spalten Desktop, randlose Karten)
   ============================================================================= */
.team-grid {
    display: grid;
    /* Desktop 4 Spalten: teamColumns()*2 in main.js ergibt genau zwei Reihen
       (8 Karten) in der Standard-Vorschau. Responsiv 4 -> 3 -> 2 -> 1. */
    grid-template-columns: repeat(4, 1fr);
    gap: var(--space-6);
}

@media (max-width: 1024px) { .team-grid { grid-template-columns: repeat(3, 1fr); } }
@media (max-width:  680px) { .team-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width:  400px) { .team-grid { grid-template-columns: 1fr; } }

/* Karte = Foto im 4:5-Rahmen mit „Bauchbinde": Name (+ Rolle) unten auf dem
   Foto, weiß auf Rhöndorf-Verlauf – an die Profilseite angelehnt. Wirkt für
   Foto- UND Initialen-Karten einheitlich, ohne Kartenrahmen und ohne Bewegung. */
.team-card {
    position: relative;
    display: block;
    cursor: pointer;
    overflow: hidden;
}

/* Foto-Bereich im Hochformat (2:3). Wird auch auf der Profilseite genutzt –
   dort ohne Bauchbinde-Overlay, deshalb bleibt diese Regel eigenständig. */
.team-card__photo-wrap {
    position: relative;
    aspect-ratio: 2 / 3;
    overflow: hidden;
    background: var(--color-bg-secondary);
}

.team-card__photo {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: top center;
    display: block;
}

/* Initialen-Fallback (füllt den Foto-Rahmen) */
.team-card__initials {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: clamp(1.25rem, 4vw, 2rem);
    font-weight: 800;
    color: #fff;
    letter-spacing: 0.05em;
    user-select: none;
    /* Fallback-Farbe, bis main.js die personenspezifische data-bg-Farbe setzt. */
    background-color: var(--rhoenblau);
}

/* Bauchbinde: unten über dem Foto, weißer Text auf Rhöndorf-Verlauf. */
.team-card__info {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    padding: 2.4rem var(--space-4) var(--space-3);
    background: linear-gradient(to top,
        rgba(45, 60, 75, 0.97) 0%,
        rgba(45, 60, 75, 0.90) 45%,
        rgba(45, 60, 75, 0) 100%);
    text-align: left;
}

.team-card__name {
    font-size: var(--text-lg);
    font-weight: 800;
    color: #fff;
    line-height: 1.2;
    letter-spacing: -0.01em;
    /* Vor-/Nachname brechen automatisch um; lange Namen brechen notfalls im Wort. */
    overflow-wrap: break-word;
    text-wrap: balance;
}

.team-card__role {
    font-size: var(--text-xs);
    /* Rolle immer weiß auf dem Rhöndorf-Balken – auch in der Fraktion (Gold war
       auf Dunkel schlecht lesbar). */
    color: rgba(255, 255, 255, 0.82);
    font-weight: 600;
    margin-top: 0.15rem;
    line-height: 1.25;
    /* Lange Funktionsbezeichnungen: Silbentrennung (lang="de") + Umbruch. */
    overflow-wrap: break-word;
    hyphens: auto;
}

/* Ruhiger Zustandswechsel bei Hover/Fokus: Akzentkante unten (keine Bewegung);
   Farbe folgt der Akzentwelt (Mint/Gold). Der Fokusring kommt global. */
.team-card::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 3px;
    background: var(--accent);
    opacity: 0;
    transition: opacity var(--transition);
}
.team-card:hover::after,
a.team-card:focus-visible::after {
    opacity: 1;
}


/* =============================================================================
   PROGRAMM-KACHELN
   ============================================================================= */
.programm-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: var(--space-6);
}

.programm-kachel {
    background: var(--color-surface);
    border: 1px solid var(--line);
    border-radius: var(--radius-lg);
    padding: var(--space-6);
    transition: var(--t-accent);
}
.programm-kachel:hover {
    border-color: var(--accent);
}

.programm-kachel__title {
    font-size: var(--text-lg);
    font-weight: 700;
    color: var(--color-text);
    margin-bottom: var(--space-2);
}

.programm-kachel__text {
    font-size: var(--text-sm);
    color: var(--color-text-muted);
    line-height: 1.6;
}


/* =============================================================================
   KONTAKTFORMULAR
   ============================================================================= */
.kontakt-wrap { max-width: 640px; }

.kontakt-form__row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--space-4);
}
@media (max-width: 600px) { .kontakt-form__row { grid-template-columns: 1fr; } }

.form-group { display: flex; flex-direction: column; gap: var(--space-2); margin-bottom: var(--space-4); }

.form-group label {
    font-size: var(--text-sm);
    font-weight: 600;
    color: var(--color-text);
}

.required { color: var(--tuerkis-dark); }
.optional  { font-weight: 400; color: var(--color-text-muted); font-size: var(--text-xs); }

.form-group input,
.form-group textarea {
    width: 100%;
    padding: var(--space-3) var(--space-4);
    border: 1.5px solid var(--color-border);
    border-radius: var(--radius);
    background: var(--color-surface);
    color: var(--color-text);
    font-family: var(--font-base);
    font-size: var(--text-base);
    transition: border-color var(--transition), box-shadow var(--transition);
}
.form-group input:focus,
.form-group textarea:focus {
    outline: none;
    border-color: var(--tuerkis);
    box-shadow: 0 0 0 3px rgba(82,183,193,.15);
}

.form-group textarea { resize: vertical; min-height: 140px; }

/* Datenschutz-Opt-in: inline, NICHT über .form-group (sonst wird die Checkbox
   durch .form-group input { width:100% } aufgeblasen). */
.kontakt-consent {
    display: flex;
    align-items: flex-start;
    gap: .6rem;
    margin-top: .85rem;
    font-size: .875rem;
    line-height: 1.5;
    cursor: pointer;
}
.kontakt-consent input {
    width: auto;
    flex: none;
    margin-top: .2rem;
}
.kontakt-consent a { color: var(--tuerkis-dark); }

.kontakt-form__disclaimer {
    font-size: var(--text-xs);
    color: var(--color-text-muted);
    margin-bottom: var(--space-6);
    line-height: 1.5;
}

.kontakt-success {
    padding: var(--space-6);
    background: var(--tuerkis-subtle);
    border: 1px solid var(--tuerkis);
    border-radius: var(--radius);
    color: var(--tuerkis-dark);
    font-weight: 500;
}

.kontakt-error {
    padding: var(--space-4);
    background: #fff5f5;
    border: 1px solid #f87171;
    border-radius: var(--radius);
    color: #b91c1c;
    margin-bottom: var(--space-4);
    font-size: var(--text-sm);
}


/* =============================================================================
   ANTRÄGE & ANFRAGEN TABELLE
   ============================================================================= */
.antraege-table-wrap { overflow-x: auto; }

.antraege-table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--text-sm);
    /* Feste Spaltenbreiten: kein Umspringen beim Blättern. */
    table-layout: fixed;
}
.antraege-table th:nth-child(1), .antraege-table td:nth-child(1) { width: 120px; }
.antraege-table th:nth-child(2), .antraege-table td:nth-child(2) { width: 110px; }
.antraege-table th:nth-child(4), .antraege-table td:nth-child(4) { width: 80px; }
.antraege-table td:nth-child(3) { overflow-wrap: anywhere; }

.antraege-table th {
    text-align: left;
    padding: var(--space-3) var(--space-4);
    font-size: var(--text-xs);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--color-text-muted);
    border-bottom: 2px solid var(--color-border);
}

.antraege-table td {
    padding: var(--space-3) var(--space-4);
    border-bottom: 1px solid var(--line);
    vertical-align: middle;
    color: var(--color-text);
}
/* Dezenter Zeilen-Hover (Akzentwelt = Gold in der Fraktion). */
.antraege-table tbody tr { transition: background-color var(--transition); }
.antraege-table tbody tr:hover { background: var(--accent-faint); }

.antrag-badge {
    display: inline-block;
    padding: 3px 10px;
    border-radius: var(--radius-sm);   /* kantig statt Pille */
    font-size: var(--text-xs);
    font-weight: 600;
    white-space: nowrap;
}
.antrag-badge--antrag  { background: var(--gold-subtle);   color: var(--gold-dark); }
.antrag-badge--anfrage { background: var(--tuerkis-subtle); color: var(--tuerkis-dark); }

/* --- Tracker-/Timeline-Optik (Muster) --------------------------------------- */
.tracker { position: relative; margin-top: var(--space-10); }
.tracker::before {
    content: ""; position: absolute; left: 16px; top: 12px; bottom: 12px; width: 2px;
    background: var(--line);
}
.track-item { position: relative; padding-left: 64px; margin-bottom: var(--space-5); }
.track-item:last-child { margin-bottom: 0; }
.track-marker {
    position: absolute; left: 0; top: 4px; width: 34px; height: 34px;
    border-radius: var(--radius-full);
    background: var(--color-surface); border: 2px solid var(--accent);
    display: grid; place-items: center; z-index: 1;
    transition: var(--t-accent);
}
.track-marker .m-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--accent); transition: background-color var(--transition); }
.track-card {
    background: var(--color-surface); border: 1px solid var(--line);
    border-radius: var(--radius-lg); padding: 1.3rem 1.5rem;
    transition: var(--t-accent);
}
.track-card:hover { border-color: var(--accent); }
.track-top { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; margin-bottom: .55rem; }
.track-date { font-size: var(--text-sm); color: var(--color-text-muted); white-space: nowrap; }
.track-card h3 { font-size: var(--text-lg); font-weight: 700; letter-spacing: -.01em; color: var(--color-text); margin-bottom: .4rem; line-height: 1.3; }
.track-pdf { display: inline-block; margin-top: .3rem; font-size: var(--text-sm); font-weight: 600; color: var(--accent-strong); }
.track-pdf:hover { color: var(--accent); }
@media (max-width: 680px) { .track-item { padding-left: 52px; } }

.antraege-table__date { white-space: nowrap; color: var(--color-text-muted); }

.antraege-table__pdf {
    font-weight: 600;
    color: var(--gold-dark);
    white-space: nowrap;
    font-size: var(--text-xs);
}
.antraege-table__pdf:hover { color: var(--gold); }

/* --- Anträge: Mobil-Cards (wie das Programm) + Pagination ----------------- */
/* Standard: Tabelle sichtbar, Cards versteckt. Unter 640px umgekehrt. */
.antraege-cards { display: none; }

@media (max-width: 639px) {
    .antraege-table-wrap { display: none; }
    .antraege-cards { display: grid; gap: var(--space-4); }
}

.antrag-card {
    background: var(--color-surface);
    border: 1px solid var(--line);
    border-left: 3px solid var(--accent);   /* Timeline-Akzent (Tracker-Geist) */
    border-radius: var(--radius-lg);
    padding: var(--space-5);
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    transition: var(--t-accent);
}
.antrag-card:hover {
    border-color: var(--accent);
}
.antrag-card__top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
}
.antrag-card__date { font-size: var(--text-xs); color: var(--color-text-muted); white-space: nowrap; }
.antrag-card__title {
    font-size: var(--text-base);
    font-weight: 700;
    color: var(--color-text);
    line-height: 1.35;
}
.antrag-card__pdf {
    align-self: flex-start;
    font-weight: 600;
    color: var(--gold-dark);
    font-size: var(--text-sm);
}
.antrag-card__pdf:hover { color: var(--gold); }

.antraege-controls {
    margin-top: var(--space-6);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--space-4);
}

.antraege-pager { display: flex; flex-wrap: wrap; gap: var(--space-2); justify-content: center; }
.antraege-pager__btn {
    min-width: 2.25rem;
    padding: .4rem .7rem;
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
    background: var(--color-surface);
    color: var(--color-text);
    font-size: var(--text-sm);
    font-weight: 600;
    cursor: pointer;
    transition: background-color var(--transition), color var(--transition), border-color var(--transition);
}
.antraege-pager__btn:hover:not(:disabled) { border-color: var(--gold); color: var(--gold-dark); }
.antraege-pager__btn.is-active {
    background: var(--gold);
    border-color: var(--gold);
    color: var(--rhoenblau-dark);
}
.antraege-pager__btn:disabled { opacity: .4; cursor: default; }

/* Kalender-Platzhalter */
.kalender-placeholder {
    padding: var(--space-16);
    text-align: center;
    background: var(--color-bg-secondary);
    border: 2px dashed var(--color-border);
    border-radius: var(--radius-lg);
    color: var(--color-text-muted);
}


/* =============================================================================
   FRAKTION – Akkordeon (Ausschüsse & Sonstige Gremien), Gold-Akzent
   ============================================================================= */
.fraktion-accordion { display: flex; flex-direction: column; gap: var(--space-4); }

.fraktion-acc__head {
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-4);
    padding: var(--space-6) var(--space-8);
    background: transparent;
    text-align: left;
    cursor: pointer;
    font: inherit;
}

.fraktion-acc__title {
    font-size: var(--text-lg);
    font-weight: 700;
    color: var(--text-main);
    line-height: 1.3;
}

.fraktion-acc__icon {
    position: relative;
    flex-shrink: 0;
    width: 1.1rem;
    height: 1.1rem;
}
.fraktion-acc__icon::before,
.fraktion-acc__icon::after {
    content: "";
    position: absolute;
    background: var(--gold-dark);
    transition: transform var(--transition), opacity var(--transition);
}
.fraktion-acc__icon::before { top: 50%; left: 0; right: 0; height: 2px; transform: translateY(-50%); }
.fraktion-acc__icon::after  { left: 50%; top: 0; bottom: 0; width: 2px; transform: translateX(-50%); }
.fraktion-acc__head[aria-expanded="true"] .fraktion-acc__icon::after {
    transform: translateX(-50%) scaleY(0);
}

.fraktion-acc__panel {
    padding: var(--space-6) var(--space-8) var(--space-8);
    border-top: 1px solid var(--color-border);
}

.fraktion-acc__subhead {
    font-size: var(--text-xs);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--color-text-muted);
    margin-bottom: var(--space-4);
}
.fraktion-acc__subhead + .team-grid { margin-bottom: var(--space-6); }

/* Stellvertreter-Namensliste (kompakt, verlinkt) */
.fraktion-deputies {
    font-size: var(--text-sm);
    line-height: 1.8;
    color: var(--color-text);
}
.fraktion-deputies a { color: var(--color-text); text-decoration: none; }
.fraktion-deputies a:hover { color: var(--gold-dark); text-decoration: underline; }

/* Sonstige Gremien: rein textliche Zeilen */
.fraktion-gremium-line {
    font-size: var(--text-sm);
    line-height: 1.8;
    color: var(--color-text);
    margin-bottom: var(--space-3);
}
.fraktion-gremium-line:last-child { margin-bottom: 0; }
.fraktion-gremium-label {
    font-weight: 700;
    color: var(--color-text);
    margin-right: .35rem;
}
.fraktion-gremium-line a { color: var(--color-text); text-decoration: none; }
.fraktion-gremium-line a:hover { color: var(--gold-dark); text-decoration: underline; }


/* =============================================================================
   VERANSTALTUNGS-CARDS  (RSVP, Partei + Fraktion)
   ============================================================================= */
/* Standard: zwei Cards nebeneinander (je 50% Breite) */
.event-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: var(--space-6);
}

/* Genau EIN aktives Event: Card nimmt die volle Breite ein */
.event-grid--single {
    grid-template-columns: 1fr;
}

@media (max-width: 720px) {
    .event-grid { grid-template-columns: 1fr; }
}

.event-card {
    display: flex;
    /* Grosszügiger Abstand zwischen Kalender-Kachel und Text (keine Überlappung) */
    gap: var(--space-8);
    padding: var(--space-6);
    background: var(--color-bg-secondary);
    border: 1px solid var(--line);
    border-radius: var(--radius-lg);
    transition: var(--t-accent);
}
.event-card:hover {
    border-color: var(--accent);
}

.event-card__date {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    width: 64px;
    height: 64px;
    border-radius: var(--radius-lg);
    background: var(--accent);
    color: var(--on-accent);
    transition: background-color var(--transition);
}
.event-card__day   { font-size: 1.4rem; font-weight: 800; line-height: 1.1; }
.event-card__month { font-size: .75rem; font-weight: 600; text-transform: uppercase; }

.event-card__body { min-width: 0; }

.event-card__badge {
    display: inline-block;
    font-size: .7rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    border-radius: var(--radius-sm);
    padding: .2rem .6rem;
    margin-bottom: var(--space-2);
    background: #d1fae5;
    color: #065f46;
}
.event-card__badge--wait   { background: #fef3c7; color: #92400e; }
.event-card__badge--closed { background: #e5e7eb; color: #4b5563; }

.event-card__title {
    font-size: var(--text-lg);
    font-weight: 700;
    color: var(--color-text);
    margin-bottom: var(--space-2);
}

.event-card__meta {
    font-size: var(--text-sm);
    color: var(--color-text-muted);
    line-height: 1.6;
    margin-bottom: var(--space-3);
}
.event-card__org { font-weight: 600; }

.event-card__desc {
    font-size: var(--text-sm);
    color: var(--color-text-muted);
    line-height: 1.6;
    margin-bottom: var(--space-4);
}

.event-card__cta { display: inline-block; }

@media (max-width: 480px) {
    .event-card { flex-direction: column; }
}


/* =============================================================================
   DUALER FOOTER  (Partei / Fraktion)
   ============================================================================= */
.footer-block--fraktion { display: none; }

body.mode-fraktion .footer-block--partei  { display: none; }
body.mode-fraktion .footer-block--fraktion { display: block; }


/* =============================================================================
   GESCHÄFTSSTELLE  (Text links, Cards rechts)
   ============================================================================= */
.geschaeftsstelle-layout {
    display: grid;
    grid-template-columns: 1fr 340px;
    gap: var(--space-12);
    align-items: start;
}

.geschaeftsstelle-intro {
    font-size: var(--text-base);
    color: var(--color-text-muted);
    line-height: 1.7;
    margin-bottom: var(--space-4);
}

.geschaeftsstelle-cards {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
    gap: var(--space-4);
}

@media (max-width: 768px) {
    .geschaeftsstelle-layout {
        grid-template-columns: 1fr;
    }
}


/* =============================================================================
   PROGRAMM-KACHELN  (ohne Emoji-Icon-Bereich)
   ============================================================================= */
.programm-kachel__title {
    font-size: var(--text-base);
    font-weight: 700;
    color: var(--color-text);
    margin-bottom: var(--space-2);
    border-left: 3px solid var(--tuerkis);
    padding-left: var(--space-3);
}


/* =============================================================================
   UMSCHALTER  (Partei / Fraktion) – Schieber mit gleitendem Thumb (Referenz)
   Markup: .switch > .switch-opt[data-mode] × 2 + .switch-thumb. Die Thumb-Position
   und der Aktiv-Zustand folgen body.mode-fraktion (kein JS für die Optik nötig);
   main.js toggelt die Klasse weiterhin und setzt aria-pressed.
   ============================================================================= */
.switch {
    position: relative;
    display: inline-flex;
    flex-shrink: 0;
    margin-left: auto;
    padding: 3px;
    background: var(--switch-bg);
    border: 1px solid var(--line);
    border-radius: var(--radius-full);   /* rund statt kantig (Nutzer-Wunsch) */
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    transition: var(--t-dim);
}
.switch-opt {
    position: relative;
    z-index: 1;
    flex: 1;
    min-width: 64px;
    padding: 6px 14px;
    font-family: var(--font-base);
    font-size: var(--text-sm);
    font-weight: 600;
    letter-spacing: -0.01em;
    text-align: center;
    color: var(--color-text-muted);
    background: transparent;
    border: 0;
    border-radius: var(--radius-full);
    cursor: pointer;
    transition: color .35s var(--ease);
}
/* aktiver Knopf folgt der Ansicht (Partei = Standard, Fraktion = body-Klasse) */
body:not(.mode-fraktion) .switch-opt--partei,
body.mode-fraktion .switch-opt--fraktion { color: var(--on-accent); }

.switch-thumb {
    position: absolute;
    top: 3px; left: 3px; bottom: 3px;
    width: calc((100% - 6px) / 2);
    z-index: 0;
    background: var(--accent);
    border-radius: var(--radius-full);
    box-shadow: 0 2px 6px rgba(28,39,49,.16);
    transition: transform .42s var(--ease), background-color .55s var(--ease);
}
body.mode-fraktion .switch-thumb { transform: translateX(100%); }

@media (max-width: 480px) {
    .switch-opt { min-width: 54px; padding: 6px 10px; font-size: var(--text-xs); }
}

/* ============================================================
   BLOG-ARTIKEL – Lesbarkeit des Fließtexts
   ============================================================ */
/* Größerer Abstand nach jedem Absatz für ruhigeres Schriftbild. */
.article-body p {
    margin-bottom: 1.5rem;
}
.article-body p:last-child {
    margin-bottom: 0;
}


/* =============================================================================
   UTILITIES  (ersetzen ehemalige Inline-Styles)
   ============================================================================= */
.muted { color: var(--color-text-muted); }

.section-cta {
    margin-top: var(--space-8);
    text-align: center;
}

.site-footer__address {
    font-style: normal;
    font-size: var(--text-sm);
    line-height: 2;
}

/* Zwei-Klick-Embed (Kalender): Container + injizierter iframe (vorher inline). */
.consent-embed {
    width: 100%;
    overflow: hidden;
    border-radius: var(--radius-lg);
    border: 1px solid var(--color-border);
}
.consent-embed__placeholder {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .9rem;
    text-align: center;
    min-height: 320px;
    padding: 2rem 1.5rem;
    background: var(--color-bg-secondary);
}
.consent-embed__frame {
    width: 100%;
    min-height: 650px;
    border: none;
    display: block;
}

/* Programm: ab Kachel 4 versteckt, gestaffeltes Einblenden (war inline <style>). */
.programm-kachel--hidden {
    display: none;
    opacity: 0;
    transform: translateY(12px);
    transition: opacity .35s ease, transform .35s ease;
}
.programm-kachel--hidden.is-visible {
    display: block;
    opacity: 1;
    transform: none;
}


/* =============================================================================
   HEADER-SOCIAL  (Instagram / Facebook prominent im Kopfbereich)
   ============================================================================= */
.site-header__social {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    margin-left: var(--space-2);
}
.site-header__social-link {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    border-radius: var(--radius-full);
    border: 1px solid transparent;
    transition: background var(--transition), border-color var(--transition);
}
.site-header__social-link img {
    width: 18px;
    height: 18px;
    display: block;
    /* Monochromes SVG via <img>: dezente graue Silhouette statt hartem Schwarz. */
    filter: brightness(0) opacity(.45);
    transition: filter var(--transition);
}
.site-header__social-link:hover {
    background: var(--accent);
    border-color: var(--accent);
}
.site-header__social-link:hover img { filter: brightness(0) invert(1); } /* weiß auf Akzent */

@media (max-width: 860px) {
    .site-header__social { display: none; } /* Platz im engen Header sparen */
}


/* =============================================================================
   FILTER-TABS  (redaktionelle Tabs/Textlinks statt Pills)
   Unterstreichung bei Hover/Aktiv; Effektfarbe folgt dem Modus.
   ============================================================================= */
.filter-tabs {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
    margin-bottom: var(--space-8);
}
.filter-tabs .tab {
    padding: .5rem 1.1rem;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);   /* kantig statt Pille */
    background: var(--color-surface);
    cursor: pointer;
    font-family: var(--font-base);
    font-size: var(--text-sm);
    font-weight: 600;
    color: var(--color-text-muted);
    text-decoration: none;
    transition: var(--t-accent);
}
.filter-tabs .tab:hover { border-color: var(--accent); color: var(--accent-strong); }
.filter-tabs .tab.is-active { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }


/* =============================================================================
   EDITORIAL-LAYOUT  (Aktuelles: drei gleichwertige Beiträge nebeneinander)
   Kein hervorgehobener Hero mehr – drei redaktionelle Teaser im Querformat,
   bewusst rahmenlos (Bild + Text), damit es nicht nach Standard-Karten-Raster
   aussieht.
   ============================================================================= */
.editorial {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--space-8);
    align-items: stretch;   /* gleich hohe Karten unabhängig von der Titellänge */
}

.editorial__card {
    display: flex;
    flex-direction: column;
    height: 100%;
    /* Dezente Karte – einheitlich mit Blog-Liste & Team. */
    background: var(--color-surface);
    border: 1px solid var(--line);
    border-radius: var(--radius-lg);
    overflow: hidden;
    transition: var(--t-accent);
}
.editorial__card:hover {
    border-color: var(--accent);
}

.editorial__card-img-wrap {
    display: block;
    overflow: hidden;
    /* Quadratisch (1:1) – einheitlich mit der Blog-Liste; bündig am Kartenrand. */
    aspect-ratio: 1 / 1;
    background: var(--color-bg-secondary);
}
.editorial__card-img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
}

.editorial__card-meta {
    font-family: var(--font-base);
    font-size: var(--text-xs);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--color-text-muted);
    padding: var(--space-4) var(--space-4) 0;
    margin-bottom: var(--space-2);
}
.editorial__card-title {
    font-size: var(--text-xl);
    line-height: 1.2;
    padding: 0 var(--space-4) var(--space-4);
    margin: 0;
    /* Kein line-clamp mehr: der Titel wird vollständig gezeigt; die Karten
       gleichen sich über align-items:stretch + height:100% in der Höhe an. */
}
.editorial__card-title a { color: var(--color-text); transition: color var(--transition); }
.editorial__card-title a:hover { color: var(--accent-strong); }

/* Drei gleichwertige Beiträge: auf Tablet etwas enger, darunter gestapelt
   (kein 2-Spalten-Zwischenschritt – das ließe bei genau 3 Beiträgen eine
   einzelne „Waise" in der zweiten Reihe stehen). */
@media (max-width: 860px) {
    .editorial { gap: var(--space-6); }
}
@media (max-width: 600px) {
    .editorial { grid-template-columns: 1fr; }
}


/* =============================================================================
   TEAM-CARD als Link  (ersetzt ehemaliges Inline-style auf <a class="team-card">)
   ============================================================================= */
a.team-card {
    display: block;
    color: inherit;
    text-decoration: none;
}


/* =============================================================================
   PROFILSEITE /team/{slug} – neues Layout (Hero · Sektionen · Visitenkarte)
   ============================================================================= */
/* Einheitliche Box-Breite mit /partei, /fraktion und /aktuelles (1200). */
.pp-wrap .container { max-width: var(--container-max); }

/* Mitscrollender Mini-Header. Dockt exakt unter dem (immer flachen) Header an
   – kein Abstand mehr. Glas-Effekt als kohärentes Designsystem mit dem Header:
   getönte Rhöndorf-Fläche + Blur, weißer Text bleibt lesbar. */
.mini-id { position: fixed; top: var(--header-h); left: 0; right: 0; z-index: 999;
    background: rgba(45, 60, 75, 0.78); color: #fff; height: 0; overflow: hidden;
    backdrop-filter: blur(16px) saturate(140%);
    -webkit-backdrop-filter: blur(16px) saturate(140%);
    transition: height .22s ease; box-shadow: 0 2px 8px rgba(0,0,0,.12); }
.mini-id.show { height: 64px; }
.mini-id .container { max-width: var(--container-max); display: flex; align-items: center; gap: 1rem; height: 64px; }
.mini-id__photo { width: 64px; height: 64px; object-fit: cover; object-position: top; flex: none; }
.mini-id__fallback { position: static; width: 64px; height: 64px; flex: none; display: flex;
    align-items: center; justify-content: center; color: #fff; font-family: var(--font-base);
    font-weight: 800; font-size: 1.2rem; }
.mini-id__name { font-family: var(--font-base); font-weight: 800; font-size: 1.1rem; letter-spacing: -.01em; color: #fff; }

/* Hero */
.pp-hero { padding: calc(var(--header-h) + 2rem) 0 2.4rem; }
.pp-hero__grid { display: grid; grid-template-columns: 300px 1fr; gap: 2rem; align-items: stretch; }
.pp-hero__left .team-card__photo-wrap { width: 100%; }
.pp-box { background: var(--rhoenblau); color: #fff; border-radius: 0; padding: 1.8rem;
    display: flex; flex-direction: column; justify-content: space-between; gap: 1.6rem; }
.pp-name { font-size: clamp(2.2rem, 4.6vw, 3.3rem); color: #fff; line-height: 1.03; }
.pp-box__foot { display: flex; justify-content: space-between; align-items: flex-end; gap: 1.2rem; flex-wrap: wrap; }
.pp-contact { display: flex; flex-direction: column; gap: .4rem; }
.pp-c { font-family: var(--font-base); font-size: .98rem; line-height: 1.5; color: #fff; }
.pp-c a { color: #fff; text-decoration: none; }
.pp-c a:hover { text-decoration: underline; }
.pp-c__lbl { color: #fff; }
.pp-vcard-link { font-family: var(--font-base); font-weight: 600; font-size: .95rem; color: #fff;
    text-decoration: underline; white-space: nowrap; align-self: flex-end; }
.pp-vcard-link::before { content: "\2193 "; }
.pp-box__actions { display: flex; flex-direction: column; align-items: flex-end; gap: .8rem; }
.pp-social { display: flex; gap: .5rem; }
.mini-id__mail { font-family: var(--font-base); font-size: .85rem; color: rgba(255,255,255,.6); text-decoration: none; }
.mini-id__mail:hover { color: #fff; text-decoration: underline; }

/* Sektionen */
.pp-sec { padding: 2.8rem 0; }
.pp-sec--tight { padding: 1.4rem 0; }
.pp-sec__title { font-family: var(--font-base); font-weight: 800; font-size: 1.5rem; color: var(--color-text);
    margin-bottom: 1.2rem; border-left: 4px solid var(--tuerkis); padding-left: .6rem; }
/* Kein enger max-width-Deckel: „Über mich" füllt die 80%-Spalte und bricht
   nicht mehr zu früh um (steht damit näher an der Hard-Facts-Spalte). */
.prose-block { margin-bottom: 1.2rem; }
.prose-h { font-family: var(--font-base); font-weight: 800; font-size: 1rem; color: var(--text-heading); margin-bottom: .3rem; }
.prose-t { font-size: 1.05rem; line-height: 1.8; color: var(--color-text); }

/* „Über mich" als 80/20-Layout: Text links, Hard Facts rechts (Aufgabe #7). */
.pp-about { display: grid; grid-template-columns: 4fr 1fr; gap: clamp(1.25rem, 2.5vw, 2.2rem); align-items: start; }
.pp-about--solo { grid-template-columns: 1fr; }
.pp-about__aside { border-left: 1px solid var(--color-border); padding-left: clamp(1rem, 2vw, 1.6rem); }
/* AP15: keine Fließtexte -> Hard Facts flächig über die volle Breite verteilen
   (mehrspaltig, kein unmotivierter Leerraum links). Gilt auf allen Breakpoints:
   auto-fit stapelt mobil automatisch auf eine Spalte. */
.pp-about--facts { grid-template-columns: 1fr; }
.pp-about--facts .pp-about__aside {
    border: 0; padding: 0;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: clamp(1rem, 2.5vw, 1.8rem) clamp(1.5rem, 3vw, 2.4rem);
    align-items: start;
}
.pp-about--facts .prose-block--fact { margin-bottom: 0; }
/* Facts wie „Über mich": Label fett (.prose-h), Inhalt normal (.prose-t); nur
   etwas enger gestapelt als die langen Textblöcke. */
.prose-block--fact { margin-bottom: 1rem; }
.prose-block--fact:last-child { margin-bottom: 0; }
.pp-tags { display: flex; flex-wrap: wrap; gap: .4rem; margin-top: .35rem; }
.pp-tag { display: inline-flex; align-items: center; font-family: var(--font-base); font-size: .78rem; font-weight: 600;
    padding: .25rem .65rem; background: var(--tuerkis-subtle); color: var(--tuerkis-dark); border-radius: var(--radius-full); }

/* Fließende Ämter-/Gremien-Zeilen (Gruppe · Rolle) */
.amt-line { padding: .6rem 0; border-bottom: 1px solid var(--color-border); line-height: 1.4; }
.amt-line__grp { display: block; font-family: var(--font-base); font-weight: 600; font-size: 1rem; color: var(--color-text); }
.amt-line__role { display: block; font-family: var(--font-base); font-size: .9rem; color: var(--tuerkis-dark); margin-top: .1rem; }

/* Sektionen dezent unterschiedlich (ohne Flächen-Hintergrund) */
.sec--fraktion .pp-sec__title { border-left-color: var(--rhoenblau); }
.sec--fraktion .amt-line__role { color: var(--rhoenblau); }
.sec--kreistag .pp-sec__title { border-left-color: var(--gold); }
.sec--kreistag .amt-line__role { color: var(--gold-dark); }
.fr-headrole { font-family: var(--font-base); font-weight: 800; font-size: 1.3rem; color: var(--rhoenblau);
    line-height: 1.2; padding-bottom: .7rem; margin-bottom: 1.2rem; border-bottom: 2px solid var(--tuerkis); }
.sec--kreistag .fr-headrole { border-bottom-color: var(--gold); }
.fr-sub { margin-top: 1.5rem; }
.fr-sub__title { font-family: var(--font-base); font-weight: 700; font-size: .78rem; letter-spacing: .08em;
    text-transform: uppercase; color: var(--tuerkis-dark); margin-bottom: .3rem; }
.fr-deputy { margin-top: .9rem; }
.fr-deputy__title { font-family: var(--font-base); font-weight: 600; font-size: .72rem; letter-spacing: .06em;
    text-transform: uppercase; color: var(--color-text-muted); margin-bottom: .2rem; }

/* Visitenkarte unten */
.vcard-card { background: var(--rhoenblau); color: #fff; padding: 2.2rem 2rem; display: grid;
    grid-template-columns: 1fr auto; gap: 2rem; align-items: stretch; }
.vcard-card__name { font-size: 1.8rem; color: #fff; margin-bottom: 1rem; }
.vcard-card__contact { display: flex; flex-direction: column; gap: .4rem; }
.vcard-card__eyebrow { font-family: var(--font-base); font-weight: 600; font-size: .7rem; letter-spacing: .1em;
    text-transform: uppercase; color: rgba(255,255,255,.55); margin-bottom: .5rem; }
.vcard-card__right { display: flex; flex-direction: column; justify-content: space-between; align-items: flex-end; gap: 1.4rem; text-align: right; }
.vcard-card__social { display: flex; gap: .6rem; }
.s-link { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px;
    border: 1px solid rgba(255,255,255,.4); border-radius: 50%; }
.s-link img { filter: brightness(0) invert(1) opacity(.85); }

@media (max-width: 820px) {
    .pp-hero__grid, .vcard-card { grid-template-columns: 1fr; }
    /* Hard-Facts unter den Text stapeln; Trennlinie nach oben verlegen. */
    .pp-about { grid-template-columns: 1fr; }
    .pp-about__aside { border-left: 0; padding-left: 0; border-top: 1px solid var(--color-border); padding-top: 1.4rem; margin-top: .4rem; }
    /* Kurze Hard-Facts auf Mobil zweispaltig (sie sind knapp genug). */
    .pp-about__aside { display: grid; grid-template-columns: 1fr 1fr; gap: .9rem 1.3rem; align-items: start; }
    .pp-about__aside .pp-tags { grid-column: 1 / -1; }
    .pp-hero__left .team-card__photo-wrap { max-width: 300px; }
    .vcard-card__right { align-items: flex-start; text-align: left; }
    /* Mobil: Social-Buttons + vCard linksbündig (statt rechts). */
    .pp-box__actions { align-items: flex-start; }
    .pp-vcard-link { align-self: flex-start; }
}


/* =============================================================================
   BLOG-ARTIKEL – Titel neben Bild + Meta-/PDF-Kasten
   ============================================================================= */
/* Einheitliche Box-Breite (1200) wie der Rest der Seite. ALLE Elemente im
   Artikel (Foto, Kopfkasten, Body, Ansprechpartner) füllen diese Breite
   gleichmäßig aus – keine schmalere Textspalte mehr. */
/* Schmaler für bessere Lesbarkeit (Foto, Kopfkasten, Body, Ansprechpartner
   bleiben gemeinsam in dieser Box gleich breit). */
.article-wrap { max-width: 760px; }
.article-photo { width: 100%; height: auto; max-height: 90vh; object-fit: cover; display: block; border-radius: var(--radius-lg); margin-bottom: 1.4rem; }
.article-headbox { background: var(--rhoenblau); color: #fff; border-radius: var(--radius-lg); padding: 1.6rem 1.8rem; margin-bottom: 1.8rem; }
.article-headbox__title { color: #fff; font-size: clamp(1.6rem, 3.4vw, 2.3rem); line-height: 1.14; margin-bottom: 1.2rem; }
.article-headbox__foot { display: flex; justify-content: space-between; align-items: flex-end; gap: 1rem; flex-wrap: wrap; }
.article-headbox__meta { font-family: var(--font-base); font-size: .9rem; color: rgba(255,255,255,.8); }
.article-headbox__pdf { font-family: var(--font-base); font-size: .9rem; font-weight: 600; color: #fff; text-decoration: underline; white-space: nowrap; }
.article-headbox__pdf:hover { color: var(--tuerkis-light); }
/* Body über die volle Box-Breite – gleich breit wie Foto, Kopfkasten und
   Ansprechpartner (Nutzer-Vorgabe v0.71.7: alles gleich breit, keine Maßgrenze).
   Vollständige Rich-Text-Typo: Serif-Fließtext, Inter-Überschriften, Listen,
   Zitate, Bilder, Tabellen. Akzent (Links/Zitat) folgt der Akzentwelt. */
.article-body { font-family: var(--font-serif); font-size: 1.08rem; line-height: 1.8; color: var(--color-text); }
.article-body > *:first-child { margin-top: 0; }
.article-body p { margin: 0 0 1.4rem; }
.article-body h2 {
    font-family: var(--font-head); font-weight: 800; letter-spacing: -.01em;
    font-size: clamp(1.4rem, 2.6vw, 1.9rem); line-height: 1.2;
    margin: 2.2rem 0 .9rem; color: var(--color-text);
}
.article-body h3 {
    font-family: var(--font-head); font-weight: 700;
    font-size: clamp(1.2rem, 2vw, 1.45rem); line-height: 1.25;
    margin: 1.8rem 0 .7rem; color: var(--color-text);
}
.article-body h2:first-child, .article-body h3:first-child { margin-top: 0; }
.article-body ul, .article-body ol { margin: 0 0 1.4rem; padding-left: 1.4rem; }
.article-body ul { list-style: disc; }
.article-body ol { list-style: decimal; }
.article-body li { margin-bottom: .5rem; }
.article-body a { color: var(--accent-strong); text-decoration: underline; text-underline-offset: 2px; transition: color var(--transition); }
.article-body a:hover { color: var(--accent); }
.article-body blockquote {
    margin: 1.6rem 0; padding: .4rem 0 .4rem 1.3rem;
    border-left: 3px solid var(--accent); color: var(--color-text-muted); font-style: italic;
}
.article-body img { border-radius: var(--radius-lg); margin: 1.6rem 0; height: auto; }
.article-body figure { margin: 1.6rem 0; }
.article-body figcaption { font-family: var(--font-base); font-size: var(--text-sm); color: var(--color-text-muted); margin-top: .5rem; text-align: center; }
.article-body table { width: 100%; border-collapse: collapse; margin: 1.6rem 0; font-family: var(--font-base); font-size: var(--text-sm); }
.article-body th, .article-body td { text-align: left; padding: .6rem .8rem; border-bottom: 1px solid var(--line); vertical-align: top; }
.article-body th { font-weight: 700; color: var(--color-text-muted); text-transform: uppercase; letter-spacing: .04em; font-size: var(--text-xs); }
.article-back { margin-top: var(--space-12); }

/* Ansprechpartner unter dem Artikel (Personen-Kacheln, an .team-card angelehnt) */
.press-contacts { margin-top: var(--space-16); }
.press-contacts__title { font-size: clamp(1.2rem, 2.4vw, 1.5rem); margin-bottom: var(--space-6); }
/* Ansprechpartner = dieselbe Personen-Kachel (Foto 4:5 + Bauchbinde) wie das
   Team; die Kontaktkanäle (E-Mail/Telefon/Mobil) stehen darunter. */
.press-contacts__list {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(150px, 190px));
    justify-content: start;
    gap: var(--space-6);
}
.press-contact { display: flex; flex-direction: column; }
.press-contact__meta {
    margin-top: var(--space-3);
    display: flex; flex-direction: column; gap: .2rem;
}
.press-contact__c { font-size: var(--text-sm); color: var(--color-text); line-height: 1.5; word-break: break-word; }
.press-contact__c a { color: var(--color-text); text-decoration: none; }
.press-contact__c a:hover { color: var(--accent-strong); text-decoration: underline; }
.press-contact__lbl { color: var(--color-text-muted); }


/* =============================================================================
   AKTUELLES-LISTE  (/aktuelles) – Karten, Suche, Pagination im Token-Stil
   Ersetzt die vormaligen Inline-Styles; Akzent folgt der Akzentwelt (--accent).
   JS-Hooks (#blog-search, #blog-list-grid, data-title/-excerpt) bleiben.
   ============================================================================= */
.card.blog-card { transition: var(--t-accent); }
.card.blog-card:hover { border-color: var(--accent); }

.blog-card__cat {
    font-size: var(--text-xs); font-weight: 700; text-transform: uppercase;
    letter-spacing: .06em; color: var(--accent-strong); margin-bottom: var(--space-1);
}
.blog-card__more {
    display: inline-flex; align-items: center; gap: .35rem;
    margin-top: auto; padding-top: var(--space-3);   /* ans Kartenende */
    align-self: flex-start;
    font-size: var(--text-sm); font-weight: 600; color: var(--accent-strong);
    text-decoration: none; transition: gap var(--transition), color var(--transition);
}
.blog-card__more:hover { color: var(--accent); gap: .6rem; }

.blog-searchform { margin-bottom: var(--space-6); max-width: 480px; }
.blog-search {
    width: 100%; padding: .6rem 1rem;
    border: 1px solid var(--line); border-radius: var(--radius-sm);
    font-size: var(--text-sm); font-family: var(--font-base);
    background: var(--color-surface); color: var(--color-text);
    transition: var(--t-accent);
}
.blog-search:focus-visible { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-faint); }

.blog-searchinfo { margin-bottom: var(--space-5); font-size: var(--text-sm); color: var(--color-text-muted); }
.blog-searchinfo a { color: var(--accent-strong); }

.blog-pager { display: flex; justify-content: center; gap: .5rem; margin-top: var(--space-10); flex-wrap: wrap; }
.blog-pager__link {
    padding: .45rem .9rem; border: 1px solid var(--line); border-radius: var(--radius-sm);
    text-decoration: none; color: var(--color-text); font-size: var(--text-sm); font-weight: 600;
    transition: var(--t-accent);
}
.blog-pager__link:hover { border-color: var(--accent); color: var(--accent-strong); }
.blog-pager__link.is-active { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }


/* =============================================================================
   GLIEDERUNGEN – editorische Org-Reihen (alternierend) mit Personen-Lead-Card
   Inhalt kommt wie bisher aus dem Backend (Name, Beschreibung, Top-Person).
   ============================================================================= */
.org-rows { margin-top: var(--space-10); }
/* Desktop: Inhaltsteil immer 80 %, Personen-Card immer 20 % – die Seiten wechseln
   reihenweise (zickzack). Bei gespiegelten Reihen werden auch die Spalten
   getauscht (1fr 4fr), damit der Inhalt stets die breite Spalte belegt. */
.org-row { display: grid; grid-template-columns: 4fr 1fr; gap: clamp(1.25rem, 2.5vw, 2.2rem); align-items: center; }
.org-row.is-rev { grid-template-columns: 1fr 4fr; }
.org-row + .org-row { margin-top: clamp(2rem, 4vw, 3.2rem); padding-top: clamp(2rem, 4vw, 3.2rem); border-top: 1px solid var(--line); }
.org-row.is-rev .org-text  { order: 2; }
.org-row.is-rev .org-media { order: 1; }
.org-row--solo { grid-template-columns: 1fr; }
.org-name { font-size: clamp(1.6rem, 3vw, 2.3rem); font-weight: 800; letter-spacing: -.02em; color: var(--color-text); margin: .35rem 0 .8rem; line-height: 1.12; }
/* Kein enger max-width-Deckel mehr: der Text füllt die 80%-Spalte und bricht
   nicht mehr zu früh um (steht damit näher an der Personen-Card). */
.org-desc { font-family: var(--font-serif); color: var(--color-text-muted); line-height: 1.7; }
.org-desc p { margin-bottom: .8rem; }
.org-desc p:last-child { margin-bottom: 0; }
.org-link { display: inline-flex; align-items: center; gap: .45rem; margin-top: 1.2rem; font-size: .95rem; font-weight: 600; color: var(--accent-strong); transition: gap var(--transition), color var(--transition); }
.org-link:hover { gap: .75rem; color: var(--accent); }
.org-link .arr { transition: transform .25s var(--ease); }
.org-link:hover .arr { transform: translateX(3px); }

/* Lead-Person einer Gliederung = identische Personen-Kachel wie im Team-Grid
   (.team-card mit Bauchbinde), nur in der Breite auf die Seitenspalte begrenzt. */
.lead-card { max-width: 250px; width: 100%; margin-inline: auto; }

@media (max-width: 1024px) {
    .org-row { grid-template-columns: 1fr; gap: 2rem; }
    .org-row.is-rev { grid-template-columns: 1fr; }
    .org-row.is-rev .org-text  { order: 1; }
    .org-row.is-rev .org-media { order: 2; }
    /* Mobil: Card nicht über die volle Breite – höchstens so breit wie eine
       Personen-Card im Team-Raster und linksbündig unter dem Text. */
    .org-media { display: flex; justify-content: flex-start; }
    .lead-card { max-width: 200px; margin-inline: 0; }
}


/* =============================================================================
   KONTAKT-CTA-BAND – dunkle Rhöndorf-Karte (Mitmachen) + ausklappbares Formular
   ============================================================================= */
.cta-band__card {
    position: relative; overflow: hidden;
    background: var(--rhoenblau); color: #fff;
    border-radius: var(--radius-lg);
    padding: clamp(2rem, 4vw, 3.3rem);
    display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 1.8rem;
}
.cta-band__card::before {
    content: ""; position: absolute; left: -40px; bottom: -80px; width: 260px; height: 260px; border-radius: 50%;
    background: radial-gradient(circle, var(--accent) 0%, transparent 70%); opacity: .18;
    transition: background .6s var(--ease); pointer-events: none;
}
.cta-band__text { position: relative; z-index: 1; max-width: 560px; }
.cta-band__text h2 { color: #fff; font-size: clamp(1.5rem, 3vw, 2.2rem); font-weight: 800; letter-spacing: -.02em; margin: .55rem 0 .6rem; }
.cta-band__text p { font-family: var(--font-serif); color: rgba(255,255,255,.82); line-height: 1.65; }
.cta-band__actions { position: relative; z-index: 1; display: flex; flex-wrap: wrap; gap: .8rem; }
.cta-band__actions .arr { transition: transform .25s var(--ease); }
.cta-band__actions .btn:hover .arr { transform: translateX(3px); }
.kontakt-collapse { margin-top: var(--space-8); }
@media (max-width: 680px) { .cta-band__card { flex-direction: column; align-items: flex-start; } }


/* =============================================================================
   BEWEGUNG – Scroll-Reveal (dezent)
   Gate über html.js: ohne JavaScript ist .reveal-Inhalt voll sichtbar.
   main.js beobachtet .reveal und blendet es beim Einscrollen sanft ein. Parallax
   und Deko-Orbs wurden entfernt (ruhigerer, erwachsenerer Auftritt).
   Bei prefers-reduced-motion: Reveal sofort sichtbar.
   ============================================================================= */
html.js .reveal {
    opacity: 0;
    transform: translateY(8px);
    transition: opacity .5s var(--ease), transform .5s var(--ease);
}
html.js .reveal.revealed { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: .001ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: .001ms !important;
        scroll-behavior: auto !important;
    }
    html.js .reveal { opacity: 1; transform: none; }
}

/* ============================================================================
   Entwickler-Credit (statisch, oberhalb des Footers auf den Impressum-Seiten)
   ========================================================================== */
/* Ausrichtung: nur noetig, wenn der Credit zentriert stehen soll */
.dev-credit-line{
  text-align: center;
}

/* Entwickler-Credit — erbt Schriftart und Farbe des Footers */
.dev-credit{
  font-family: inherit;
  font-size: 12.5px;
  line-height: 1.5;
  color: inherit;
}
.dev-credit__label{
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  opacity: 0.6;
  margin-right: 9px;
}
.dev-credit__name{
  opacity: 0.9;
}
.dev-credit__sep{
  opacity: 0.4;
  margin: 0 7px;
}
.dev-credit__mail{
  color: inherit;
  text-decoration: none;
  opacity: 0.9;
  border-bottom: 1px solid transparent;
  transition: border-color 0.2s ease, opacity 0.2s ease;
}
.dev-credit__mail:hover{
  opacity: 1;
  border-bottom-color: currentColor;
}
.dev-credit__mail:focus-visible{
  outline: 1.5px solid currentColor;
  outline-offset: 2px;
  border-radius: 2px;
}
