/* ============================================================================
   PUSH-UA Gemeinschaft — components.css
   ----------------------------------------------------------------------------
   Hand-translated from docs/design-source/project/responsive/home.css, refactored
   so every value references a theme.json token (--wp--preset--* / --wp--custom--*).
   Loaded on the front end (functions.php) AND the editor (add_editor_style) so the
   two match.

   PORTED in phase 2 (home.css line refs):
     - :root font aliases + responsive --gutter/--maxw/--section-y      (home.css 16-28)
     - reset                                                            (home.css 30-36)
     - .wrap (section container)                                        (home.css 38)
     - .mono / .kicker                                                  (home.css 39-41)
     - .lang / .lang b / .lang a (+ ≥782 reveal)                        (home.css 79-80, 99)
       — styles the already-shipped pushua/language-switcher block markup.
   Phases 3/4 added the chrome + section/pattern families (see their sections).
   PHASE 6 added the EVENT FAMILY at the end of this file: the .ev-* / .poster /
   .date-badge / .tax-chip / .reg-badge selectors are the markup contract of the
   PLUGIN's EventView renderers (pushua-core ships ZERO CSS — these selectors ARE
   the theme↔plugin API; renaming one is a breaking change for the SSR blocks).
   PHASE 7 added FILTERING + AKTUELLES after it: .filter-rail, .fr-*, .zeitraum-toggle,
   .active-filters, .af-* (the FilterView contract); .post-grid, .post-card, .pc-*,
   .featured-post, .fp-*, .cat-badge (the PostView contract); the Aktuelles pagination
   restyle; .post-article + .post-cross-links, .pxl-*; and the sidebar post rows —
   same rule: these selectors are plugin API. The post-card family is VIEWPORT-query
   only (one photo-top layout at every width — no structural fold to drive off
   container width; the `ev` container budget stays events-only, §10).
   ⚠ COMMENT HAZARD (this exact header once broke the whole token layer): a glob
   list written with a star-slash sequence (".fr-*" directly followed by "/") CLOSES
   the CSS comment mid-sentence — the leftover prose parses as an invalid selector
   and the parser drops the ENTIRE NEXT RULE (here: the :root below — every --f-…
   alias, --gutter, --maxw; computed fonts fell to Times New Roman site-wide).
   Separate glob lists with COMMAS, never slashes (a Pest guard pins this).

   CANONICAL BREAKPOINTS (arch-ref §10 is the single source of truth — mirror it,
   never invent 768/1024/1440). WordPress-aligned tiers:
     Mobile <600 · Tablet 600-781 · Desktop 782-1199 · Ultra-wide >=1200.
   AUTHOR AGAINST THE SUPERSET, not just the 4 tiers:  600 / 700 / 782 / 1000 / 1200 / 1600.
   The token-scale vars below redeclare at 600/782/1200/1600; component LAYOUT *also*
   reflows at 700 (post cards -> 2-col) and 1000 (the FULL multi-column desktop layout —
   4-up grids; 4-up at 782 is too cramped). Mobile-first (min-width) + clamp() for type
   (scale), media queries for reflow. Container queries are for the plugin's event-card
   family ONLY (event-card / reihen-strip / event-cross-link-sidebar — the named `ev`
   container in the PHASE 6 section, incl. the poster→card degrade <420px), never page
   sections. As built, the plugin block pipeline (T4) ships NO CSS, so no second CSS
   codebase materialized and no shared breakpoint partial is needed — this file stays
   the single hand-authored source (arch-ref §10 reconciled in phase 6).
   ========================================================================== */

:root {
	/* Design-source font aliases → the theme.json preset families (single source). */
	--f-display: var(--wp--preset--font-family--fixel-display);
	--f-body: var(--wp--preset--font-family--inter);
	--f-mono: var(--wp--preset--font-family--ibm-plex-mono);

	/* Fluid layout scale — re-declared per breakpoint (home.css 21-28). */
	--gutter: 20px;
	--maxw: 1280px;
	--section-y: 40px;
	/* Sticky-header height — single source for the SectionSubnav sticky offset + the
	   scroll-spy JS rootMargin (codex css-port-2). Matches .site-header .bar at each tier. */
	--header-h: 56px;
}
@media (min-width: 600px) {
	:root { --gutter: 32px; --section-y: 48px; }
}
@media (min-width: 782px) {
	:root { --gutter: 40px; --section-y: 56px; --header-h: 64px; }
}
@media (min-width: 1200px) {
	:root { --gutter: 56px; --section-y: 64px; --maxw: 1280px; }
}
@media (min-width: 1600px) {
	:root { --gutter: 88px; --section-y: 80px; --maxw: 1440px; }
}

/* ── Reset (home.css 30-36) ─────────────────────────────────────────────── */
* { box-sizing: border-box; }
body {
	margin: 0;
	background: var(--wp--preset--color--bg);
	color: var(--wp--preset--color--ink);
	font-family: var(--f-body);
	-webkit-font-smoothing: antialiased;
}
/* Link color/decoration come from theme.json `styles.elements.link` (blue → blue-deep).
   Do NOT reset `a` globally here: an `a {…}` rule (specificity 0,0,1) loads after the
   global stylesheet and would override theme.json's low-specificity `:where(a)` token,
   flattening content links to body text. Chrome link resets (nav / buttons / cards) are
   scoped to their component classes in phases 3/4. */
/* Consistent a11y affordance: chrome/component hyperlinks carry NO underline at rest but DO
   underline on hover/focus. theme.json's own `:hover` underline is unreliable — WP emits
   a second base `text-decoration: none` for links that clobbers it — so own it here.
   Buttons are excluded; chrome links (nav, section-subnav, submenu) opt out via their own
   higher-specificity hover rules, keeping their border/background affordance. */
:where(a):not(.wp-element-button):hover,
:where(a):not(.wp-element-button):focus-visible { text-decoration: underline; }
/* a11y (WCAG 1.4.1, forms-a11y-audit F2): in-content BODY-PROSE links carry a REST-STATE
   underline. The brand blue (`--blue` #1c52cf) cannot reach the 3:1 link-vs-text contrast
   that a color-only affordance would require against the dark ink body text, so color alone
   is insufficient (axe `link-in-text-block`). This deliberately overrides the no-underline-at-
   rest convention above for PARAGRAPH prose only — chrome, nav, cards, and CTAs keep their
   color+border affordance. Scoped to `p a` (not `li a`) on purpose: component panels render
   their channel links in <li> (e.g. patterns' `.contact-live` list), and `li a` would outrank
   those components' `text-decoration:none` and underline them (codex review P3). Buttons excluded. */
.wp-block-post-content p a:not(.wp-element-button) { text-decoration: underline; }
button { cursor: pointer; font-family: inherit; }
img { max-width: 100%; height: auto; display: block; }

/* ── Section container + typographic utilities (home.css 38-41) ─────────── */
.wrap {
	max-width: var(--maxw);
	margin-inline: auto;
	padding-inline: var(--gutter);
}
/* Ultrawide framing (prototype parity): on screens wider than the content cap, draw a
   1px rule at each edge of the --maxw column to separate the content from the overflow.
   Full page-height lines on the root block wrapper; tracks --maxw (1280 → 1440 @1600).
   z-index 30 sits ABOVE the sticky header (z-index 20, ~line 261) so the frame reads as one
   continuous line down the whole page instead of being interrupted by the header band
   (user 2026-06-20). .wp-site-blocks is position:relative with no z-index → NOT a stacking
   context, so these pseudos and the header wrapper compare z-indexes directly in the root. */
@media (min-width: 1280px) {
	.wp-site-blocks { position: relative; }
	.wp-site-blocks::before,
	.wp-site-blocks::after {
		content: ""; position: absolute; top: 0; bottom: 0; width: 1px; z-index: 30;
		background: var(--wp--preset--color--rule); pointer-events: none;
	}
	/* max(0px, …): Chrome counts the vertical scrollbar in the min-width media query but
	   NOT in `50%`, so near 1280px the content box is < --maxw and the raw calc goes
	   negative — shoving the line past the edge and adding a horizontal scrollbar (the
	   classic "only when maximized" Win/Chrome bug). Clamp to 0 so the line sits flush. */
	.wp-site-blocks::before { left: max(0px, calc(50% - var(--maxw) / 2)); }
	.wp-site-blocks::after { right: max(0px, calc(50% - var(--maxw) / 2)); }
}
/* ╔═══════════════════════════════════════════════════════════════════════════╗
   ║ MONO TYPE SYSTEM (IBM Plex Mono)                                           ║
   ║ Three shared archetypes declare the family/size/tracking/transform ONCE    ║
   ║ here; component rules elsewhere carry only color + their own margin/layout. ║
   ║   • Eyebrow / kicker  — eyebrow-token size, kicker-tracking, W500, UPPER    ║
   ║   • Status / role tag — 10.5px, mono-tracking, W700, UPPER                  ║
   ║   • Data / note       — 0.04em tracking, W500 (lowercase values + notes)    ║
   ║ Regular mono weight is 500 (Medium), NOT 400 — IBM Plex Mono 400 reads too  ║
   ║ thin in-situ. Deliberate divergence from the prototype's 400. 600/700 below. ║
   ║ Standalone by design (own geometry/weight, NOT in a base): .hero-badge (the ║
   ║ lone W600), the card badges .goal-badge/.vorstand-badge/.dl-flag/.dl-badge/ ║
   ║ .steps-list .step-n (W700, pill/circle geometry), index numerals, IBAN.     ║
   ╚═══════════════════════════════════════════════════════════════════════════╝ */
.mono { font-family: var(--f-mono); font-weight: 500; }

/* ════ MONO EYEBROW / KICKER ARCHETYPE ═══════════════════════════════════════
   Every uppercase mono section/card kicker shares ONE fingerprint: IBM Plex Mono,
   eyebrow-token size, kicker-tracking (0.12em), weight 500, uppercase. Members below
   differ ONLY by color (+ each component keeps its own margin/layout on its own rule).
   To add a kicker: add its selector here and set its color on the class — never
   re-declare size/tracking/transform per class (that drift is what this consolidated).
   Sizes were normalized here (was a 10.5/11/12px spread) onto the eyebrow token. */
.kicker, .opener-eyebrow, .cf-eyebrow, .cl-eyebrow, .cl-lab,
.reg-kicker, .reg-konto-kicker, .dl-kicker, .dl-label, .steps-kicker,
.cta-band-eyebrow, .nlb-eyebrow, .bank-eyebrow, .bar-eyebrow,
.ci-kicker, .ci-visit-label, .es-kicker, .pcc-eyebrow,
.topic-label, .help-label, .projekt-eyebrow {
	font-family: var(--f-mono);
	font-size: var(--wp--preset--font-size--eyebrow);
	font-weight: 500;
	letter-spacing: var(--wp--custom--kicker-tracking);
	text-transform: uppercase;
}
.kicker { color: var(--wp--preset--color--blue); }

/* ── Canonical eyebrow → heading gap (single source of truth) ─────────────────
   Every eyebrow that directly precedes a SECTION/CARD heading gets ONE spacing,
   tiered by heading size to match the prototype: section headers (H2) = 12px, card
   headers (H3/H4) = 8px. Keyed via :has() on the eyebrow, so standalone labels
   (no following heading) are untouched. Page heroes (eyebrow → H1) are out of
   scope and keep their own spacing. The eyebrow's margin-bottom drives the gap;
   adjacent headings carry no top margin (the grid-child reset above + per-heading
   `margin:0`). Eyebrows that live in a flex column with its own `gap` are NOT
   listed here — there the container gap IS the eyebrow→heading spacing (margin
   would add on top), so those gaps are set to the tier value directly on the card
   (.projekt-body / .goal-card = 8, .theme-card-bar = 8, .link-card-body = 12).
   To add a new eyebrow: add its class to both lists (unless it's flex-gap). */
:is(.kicker, .opener-eyebrow, .cta-band-eyebrow, .nlb-eyebrow,
    .reg-kicker, .reg-konto-kicker, .dl-kicker, .steps-kicker, .pcc-eyebrow,
    .es-kicker, .cf-eyebrow, .bank-eyebrow, .team-cta-kicker,
    .ci-kicker):has(+ h2) {
	margin-block-end: 12px;
}
:is(.kicker, .opener-eyebrow, .cta-band-eyebrow, .nlb-eyebrow,
    .reg-kicker, .reg-konto-kicker, .dl-kicker, .steps-kicker, .pcc-eyebrow,
    .es-kicker, .cf-eyebrow, .bank-eyebrow, .team-cta-kicker,
    .ci-kicker):has(+ :is(h3, h4)) {
	margin-block-end: 8px;
}

/* ════ MONO STATUS / TAG ARCHETYPE (weight 700) ══════════════════════════════
   The 700-weight uppercase tags. Shared fingerprint: IBM Plex Mono, 10.5px, W700,
   mono-tracking, uppercase. Members differ only by color (+ margin/align). Card
   badges with their own pill geometry (goal/vorstand/dl/step-n) stay standalone. */
.role-commit, .team-role-lead {
	font-family: var(--f-mono);
	font-size: 10.5px;
	font-weight: 700;
	letter-spacing: var(--wp--custom--mono-tracking);
	text-transform: uppercase;
}

/* ══ MONO DATA / NOTE ARCHETYPE (lowercase values, notes, "soon" tags) ════
   Shared: IBM Plex Mono + 0.04em tracking. Per-member size/color/margin differ.
   Descendant-scoped .konto .bic / .nl .nl-soon stay standalone (specificity). */
.signup-note, .contact-note, .dl-meta, .reg-bic, .ci-role, .nlb-soon, .form-disabled-cta {
	font-family: var(--f-mono); font-weight: 500;
	letter-spacing: 0.04em;
}

/* ── DE/UK language switcher (home.css 79-80, 99) ───────────────────────────
   Styles the markup emitted by the shipped pushua/language-switcher block:
   <div class="lang"><b>DE</b><span aria-hidden>·</span><a …>UK</a></div>.
   Hidden < 782px (the header hosts it from the hamburger overlay in phase 3),
   shown inline ≥ 782px. The "·" separator is spaced by the flex gap. */
.lang {
	display: none;
	gap: 6px;
	font-family: var(--f-mono); font-weight: 500;
	font-size: 11px;
	color: var(--wp--preset--color--ink-soft);
}
.lang b { color: var(--wp--preset--color--ink); font-weight: 600; }
.lang a { color: var(--wp--preset--color--ink-soft); }
.lang a:hover { color: var(--wp--preset--color--blue); }
/* F3 (2026-06-18): give the DE/UK switcher a 44px-class tap target with NO layout
   shift. .site-header .lang shows at ALL widths (see :348), so "UK" (14x17) is a mobile
   touch target. An absolute ::before overlay grows the hit area on BOTH axes (a flex-gap
   sibling can't use negative margins without overlapping the "·"); the current-language
   DE is a non-interactive <b>, so only the UK link needs the larger target. */
.lang a { position: relative; display: inline-flex; align-items: center; }
.lang a::before { content: ""; position: absolute; inset: -12px -12px; }
@media (min-width: 782px) {
	.lang { display: flex; }
}

/* ============================================================================
   PHASE 3 — CHROME (header + footer)
   Ported from home.css (.btn 56-63, header 65-103, footer 287-326), retokenized.
   NOTE: the prototype's .nav-desktop/.nav-mobile/.hamb/.nav-toggle rules are NOT
   ported — the header uses core/navigation, so we style its emitted classes
   (.site-nav .wp-block-navigation*) to the same visual intent instead.
   ========================================================================== */

/* ── Buttons (home.css 56-63) ───────────────────────────────────────────── */
.btn {
	display: inline-flex; align-items: center; gap: 8px;
	border-radius: var(--wp--custom--pill-radius);
	font-weight: 600; font-size: 14px; padding: 12px 18px; white-space: nowrap; border: none;
}
.btn.lg { padding: 16px 28px; font-size: 15px; }
.btn-ink { background: var(--wp--preset--color--ink); color: var(--wp--preset--color--paper); }
.btn-blue { background: var(--wp--preset--color--blue); color: var(--wp--preset--color--paper); }
.btn-yellow { background: var(--wp--preset--color--yellow); color: var(--wp--preset--color--ink); }
.btn-outline { background: transparent; color: var(--wp--preset--color--ink); border: 1.5px solid var(--wp--preset--color--ink); }
.ar { width: 1em; height: 1em; }

/* ── Header (home.css 65-103, minus the phase-2 .lang rules) ────────────── */
/* Sticky lives on the template-part WRAPPER, not on .site-header. A sticky box only sticks
   within its PARENT's box: .site-header's parent is the <header> template-part wrapper, which is
   exactly header-tall (~78px), so sticking it THERE un-stuck after ~78px of scroll and the header
   rode the page off-screen (user 2026-06-20). The wrapper's own parent is .wp-site-blocks (full
   document height), so the sticky now holds the whole way down. z-index 20 stays above the section
   sub-nav (10) + content; the ≥1280 frame lines are lifted ABOVE it (z-index 30, ~line 123). */
.wp-site-blocks > header { position: sticky; top: 0; z-index: 20; }
.site-header {
	/* item 3 (user 2026-06-18): translucent until hovered. The header is sticky (via the wrapper
	   above), so no new occlusion (the global section[id] scroll-margin still compensates). The 88%
	   opacity + blur keep nav text readable ON THEIR OWN over scrolled content — touch has no
	   hover, so the resting state can't depend on it (adversarial-review §9.5). Goes fully
	   solid on pointer/keyboard interaction AND whenever the mobile menu is open. */
	background: color-mix(in srgb, var(--wp--preset--color--bg) 88%, transparent);
	-webkit-backdrop-filter: blur(10px);
	backdrop-filter: blur(10px);
	border-bottom: 1px solid var(--wp--preset--color--rule);
	transition: background-color 0.2s ease;
}
.site-header:hover,
.site-header:focus-within,
.site-header:has(.is-menu-open) {
	background: var(--wp--preset--color--bg);
}
/* Fallback for engines without color-mix(): a fully solid header (never an unreadable one). */
@supports not (background: color-mix(in srgb, red 50%, transparent)) {
	.site-header { background: var(--wp--preset--color--bg); }
}
.site-header .wrap { padding-block: 0; }
.site-header .bar { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding-block: 14px; }
.site-header .wp-block-site-title {
	font-family: var(--f-display); font-weight: 700; font-size: 20px; letter-spacing: -0.02em; margin: 0;
}
.site-header .wp-block-site-title a { color: var(--wp--preset--color--ink); }
@media (min-width: 782px) { .site-header .wp-block-site-title { font-size: 24px; } }

/* core/navigation styled to the prototype's .nav-desktop intent */
.site-nav { font-size: 15px; font-weight: 500; }
.site-nav .wp-block-navigation__container { gap: 24px; align-items: center; }
.site-nav .wp-block-navigation-item__content { color: var(--wp--preset--color--ink); border-bottom: 2px solid transparent; padding-bottom: 2px; }
.site-nav .wp-block-navigation-item__content:hover { color: var(--wp--preset--color--blue); border-bottom-color: var(--wp--preset--color--yellow); text-decoration: none; }
/* Active page — matches the prototype: blue label + yellow underline. Core never tags
   our custom-URL nav-links, so functions.php synthesizes the markers: aria-current="page"
   on the current item, the .is-current-ancestor class on a top-level item whose section
   the page lives in (e.g. "Über uns" while viewing Aktuelles). The two .current-menu-*
   selectors keep core's native states working should a page/post link ever be added. */
.site-nav .current-menu-item > .wp-block-navigation-item__content,
.site-nav .current-menu-ancestor > .wp-block-navigation-item__content,
.site-nav .wp-block-navigation-item__content[aria-current],
.site-nav .wp-block-navigation-item__content.is-current-ancestor { color: var(--wp--preset--color--blue); border-bottom-color: var(--wp--preset--color--yellow); text-decoration: none; }
/* Submenu chevron ("Über uns"): WP centres it on the tall line-box, which sits below
   the label's optical centre — lift it level with the text; small left gap off the label. */
.site-nav .wp-block-navigation__submenu-icon { align-self: center; margin: 0 0 0 6px; padding: 0; }
.site-nav .wp-block-navigation__submenu-icon svg { display: block; transform: translateY(-3px); }
/* Dropdown submenu — rounded card matching the prototype's .gnav-sub-inner: a paper
   panel with a hairline rule, soft shadow, and pill-rounded items that highlight on
   hover with a yellow-soft fill (its own affordance, so no underline / border here).
   Selector mirrors + outranks core's `.wp-block-navigation:not(.has-background)
   .wp-block-navigation__submenu-container` (0,3,0) so the paper bg + rule border win. */
.site-nav.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container {
	background: var(--wp--preset--color--bg);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: 14px;
	padding: 8px;
	min-width: 240px;
	box-shadow: 0 22px 50px -22px rgba(20, 28, 50, 0.22);
}
.site-nav.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
	border-bottom: 0; padding: 10px 14px; border-radius: 10px; font-size: 14px;
	color: var(--wp--preset--color--ink);
}
.site-nav.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container .wp-block-navigation-item__content:hover {
	background: var(--wp--preset--color--yellow-soft);
	color: var(--wp--preset--color--blue-deep);
	border-bottom-color: transparent; text-decoration: none;
}
/* Active dropdown item — the prototype's .gnav-sub a[data-sub-active]: blue label, no
   fill or underline (the dropdown highlights with a soft fill on HOVER only). Prefix
   mirrors the base submenu-item rule so it outranks its `color: ink`. */
.site-nav.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container .wp-block-navigation-item__content[aria-current] {
	color: var(--wp--preset--color--blue);
}

/* Spenden CTA — bridge class (is-style-*-cta stays deferred to phase 4) */
.header-cta-btn .wp-block-button__link {
	background: var(--wp--preset--color--ink); color: var(--wp--preset--color--paper);
	border-radius: var(--wp--custom--pill-radius);
	font-weight: 600; padding: 12px 18px; white-space: nowrap; border: none;
}

/* Re-collapse core Navigation's hardcoded 600px breakpoint to the 782 contract (arch-ref §10) */
@media (min-width: 600px) and (max-width: 781.98px) {
	.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) { display: none; }
	.wp-block-navigation__responsive-container-open:not(.always-shown) { display: flex; }
}
/* Language switcher + Spenden are bar siblings (core/navigation drops non-nav inner
   blocks on SSR), so they stay visible at all widths. Show the DE/UK toggle in the header
   even < 782 (overriding the phase-2 desktop-only default) so it stays reachable on mobile
   next to the hamburger; the `gap` spaces the bar-end cluster. */
.bar-end { display: flex; align-items: center; gap: 16px; }
.site-header .lang { display: flex; }

/* ── Footer (home.css 287-326) ──────────────────────────────────────────── */
/* Core's root block-gap puts 24px above the footer template part, leaving a strip
   of page background between the last section (often a full-bleed band) and the ink
   footer. Pull the footer flush to the content, as in the prototype. */
.wp-site-blocks > footer { margin-block-start: 0; }
.site-footer { background: var(--wp--preset--color--ink); color: #fff; }
.site-footer .wrap { padding-block: clamp(40px, 4vw, 56px) 28px; }
.foot-cols { display: grid; grid-template-columns: 1fr; gap: 32px 40px; }
@media (min-width: 600px) { .foot-cols { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1000px) { .foot-cols { grid-template-columns: 1.5fr 1fr 1fr 1fr; } }
.foot-cols .about p { margin-top: 18px; font-size: 13px; line-height: 1.6; color: #b3bdd4; max-width: 280px; }
.foot-logo {
	display: inline-flex; align-items: center; gap: 10px;
	font-family: var(--f-display); font-weight: 900; font-size: 26px; letter-spacing: -0.04em; color: #fff;
}
.foot-logo .seal { display: flex; gap: 3px; }
.foot-logo .seal i { display: block; width: 5px; height: 34px; }
/* Footer section headings are <h2> for valid heading-order (forms-a11y-audit F4);
   styled here by class, not tag — keep selector + markup level in lock-step. */
.foot-col h2 {
	font-family: var(--f-body); font-size: 12px; letter-spacing: var(--wp--custom--kicker-tracking);
	text-transform: uppercase; color: var(--wp--preset--color--yellow); font-weight: 600; margin: 0;
}
.foot-col ul { list-style: none; padding: 0; margin: 16px 0 0; font-size: 14px; line-height: 2; }
.foot-col a { color: #dde3f1; }
.foot-lower {
	display: grid; grid-template-columns: 1fr; gap: 32px; margin-top: 44px; padding-top: 32px;
	border-top: 1px solid rgba(255, 255, 255, 0.08);
}
@media (min-width: 1000px) { .foot-lower { grid-template-columns: 1.4fr 1fr; gap: 40px; align-items: stretch; } }
.nl h2 { font-family: var(--f-display); font-size: 22px; font-weight: 700; letter-spacing: -0.015em; color: #fff; margin: 8px 0 14px; }
.nl .form { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
.nl input {
	flex: 1; min-width: 180px; padding: 13px 14px; border-radius: 10px;
	border: 1px solid rgba(255, 255, 255, 0.18); background: rgba(255, 255, 255, 0.05);
	color: #fff; font-family: inherit; font-size: 14px;
}
.nl input[disabled] { opacity: 0.55; cursor: not-allowed; }
.nl .nl-soon { font-family: var(--f-mono); font-weight: 500; font-size: 11px; letter-spacing: 0.04em; color: #b3bdd4; }
.konto {
	background: rgba(0, 0, 0, 0.25); border: 1px solid rgba(255, 255, 255, 0.08); border-radius: 14px;
	padding: 18px 20px; display: flex; flex-direction: column; gap: 6px;
}
.konto h2 { font-family: var(--f-body); font-size: 12px; letter-spacing: var(--wp--custom--kicker-tracking); text-transform: uppercase; color: var(--wp--preset--color--yellow); font-weight: 600; margin: 0; }
.konto .iban { font-family: var(--f-mono); font-weight: 500; font-size: 13px; color: #fff; letter-spacing: 0.02em; line-height: 1.4; margin: 0; }
.konto .bic { font-family: var(--f-mono); font-weight: 500; font-size: 11.5px; color: #b3bdd4; letter-spacing: 0.04em; margin: 0; }
/* PayPal alternative in the footer Spendenkonto box (yellow pill reads on the ink footer). */
.konto .konto-alt { font-family: var(--f-mono); font-weight: 500; font-size: 10.5px; letter-spacing: var(--wp--custom--mono-tracking); text-transform: uppercase; color: #b3bdd4; margin: 8px 0 0; }
.konto-paypal {
	display: inline-flex; align-self: flex-start; align-items: center; gap: 8px;
	background: var(--wp--preset--color--yellow); color: var(--wp--preset--color--ink);
	padding: 9px 16px; border-radius: var(--wp--custom--pill-radius);
	font-weight: 700; font-size: 13px; text-decoration: none;
}
.konto-paypal:hover, .konto-paypal:focus-visible { text-decoration: underline; }
.foot-util {
	display: flex; flex-direction: column; gap: 14px; justify-content: space-between; align-items: flex-start;
	margin-top: 24px; padding-top: 20px; border-top: 1px solid rgba(255, 255, 255, 0.08);
	font-size: 12px; color: #b3bdd4;
}
.foot-util .links { display: flex; flex-wrap: wrap; align-items: center; gap: 18px; }
.foot-util .links a { color: #b3bdd4; }
/* F3 (2026-06-18): the social row is 4 short single-line links (IG/FB/TG/YT, 12-17px
   wide); grow each tap target with the D14 padding+offset (horizontal too, since they're
   narrow). gap is 18px > 12px offset, so no overlap; visual size is unchanged. The legal
   links wrap, so they keep the plain hit area to avoid negative-margin row overlap. */
.foot-util .links.social a { display: inline-flex; align-items: center; padding: 12px 6px; margin: -12px -6px; }
@media (min-width: 782px) { .foot-util { flex-direction: row; align-items: center; } }

/* flag ribbon (blue over yellow) + the C1 logo seal — fills added (absent in home.css) */
.ribbon { display: flex; gap: 4px; width: 200px; height: 4px; margin-top: 32px; }
.ribbon .col { display: flex; flex-direction: column; flex: 1; }
.ribbon .col i { flex: 1; }
.ribbon .col i:first-child,
.foot-logo .seal i:first-child { background: var(--wp--preset--color--blue); }
.ribbon .col i:last-child,
.foot-logo .seal i:last-child { background: var(--wp--preset--color--yellow); }
/* col 1 = Ukraine (blue/yellow, above). col 2 = Germany: 3 stripes black/red/gold —
   the last (gold) reuses the yellow rule above; override first→black, add the red middle. */
.ribbon .col-de i:first-child { background: #161616; }
.ribbon .col-de i:nth-child(2) { background: #d83621; }

/* ============================================================================
   PHASE 4 — STATIC PATTERNS + PAGE TEMPLATES
   Ported from home.css (home sections) + translated from the per-page JSX (the
   five non-home pages have NO home.css source), all retokenized to theme.json
   presets/aliases. Width idiom: every section is an `alignfull` group carrying its
   bg, wrapping an inner `.wrap` (capped at --maxw). Display headings use weight 700
   (Fixel Display ships 500/600/700 — no 800/900 face; using 800 would faux-bold).
   ========================================================================== */

/* ── core/button CTA styles (register_block_style in functions.php) ──────────
   Resolves the phase-2 deferral: each registered is-style-*-cta now has matching
   CSS, so a Site-Editor choice always renders. Base button (ink bg, pill radius,
   padding, weight 600) comes from theme.json styles.elements.button. */
.wp-block-button.is-style-ink-cta > .wp-block-button__link {
	background: var(--wp--preset--color--ink); color: var(--wp--preset--color--paper); border: none;
}
.wp-block-button.is-style-blue-cta > .wp-block-button__link {
	background: var(--wp--preset--color--blue); color: var(--wp--preset--color--paper); border: none;
}
.wp-block-button.is-style-yellow-cta > .wp-block-button__link {
	background: var(--wp--preset--color--yellow); color: var(--wp--preset--color--ink); border: none;
}
.wp-block-button.is-style-outline-cta > .wp-block-button__link {
	background: transparent; color: var(--wp--preset--color--ink);
	border: 1.5px solid var(--wp--preset--color--ink);
}
/* CTA glyphs (design source Icon set — arrow / heart, line SVGs). Mask so the glyph
   inherits the link's currentColor. Per-button (heart only on Spenden, arrow on
   forward CTAs), so opt-in via class. cta-lg = the design's lg button size. */
.wp-block-button.cta-arrow > .wp-block-button__link,
.wp-block-button.cta-heart > .wp-block-button__link { display: inline-flex; align-items: center; gap: 8px; }
.wp-block-button.cta-arrow > .wp-block-button__link::after,
.wp-block-button.cta-heart > .wp-block-button__link::before {
	content: ""; width: 1.05em; height: 1.05em; flex-shrink: 0; background-color: currentColor;
	-webkit-mask-position: center; mask-position: center;
	-webkit-mask-size: contain; mask-size: contain;
	-webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
}
.wp-block-button.cta-arrow > .wp-block-button__link::after {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14M13 6l6 6-6 6'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14M13 6l6 6-6 6'/%3E%3C/svg%3E");
}
.wp-block-button.cta-heart > .wp-block-button__link::before {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 20s-7-4.35-9-9a5 5 0 0 1 9-3 5 5 0 0 1 9 3c-2 4.65-9 9-9 9z'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 20s-7-4.35-9-9a5 5 0 0 1 9-3 5 5 0 0 1 9 3c-2 4.65-9 9-9 9z'/%3E%3C/svg%3E");
}
.wp-block-button.cta-lg > .wp-block-button__link { padding: 16px 28px; font-size: 15px; }

/* ── Photo placeholder <Photo> (home.css 43-53) ─────────────────────────── */
.ph {
	position: relative; overflow: hidden; border-radius: var(--wp--custom--card-radius);
	background: #dad2c4; color: #5a4f3a; min-height: 120px;
}
.ph::before {
	content: ""; position: absolute; inset: 0;
	background-image: repeating-linear-gradient(135deg, rgba(0, 0, 0, 0.05) 0 1px, transparent 1px 9px);
}
.ph .lbl {
	position: absolute; left: 10px; bottom: 10px; font-family: var(--f-mono); font-weight: 500;
	font-size: 10px; letter-spacing: var(--wp--custom--mono-tracking); text-transform: uppercase; opacity: 0.85;
}
.ph.sky { background: #bcd2ef; color: #1c3f7d; }
.ph.warm { background: #e7d9b9; color: #5a4f3a; }
.ph.yellow { background: #ffe28a; color: #7a5400; }
.ph.crowd { background: #c7baa6; color: #3b3326; }
.ph.paper { background: #efe9da; color: #4a4233; }

/* ── Section wrapper + section head (home.css 156-171) ──────────────────── */
.sec { padding-block: var(--section-y); }
.sec.ruled { border-top: 1px solid var(--wp--preset--color--rule); }
/* Divider→kicker breathing (user request 2026-06-18): a ruled section's hairline sits
   directly above its head, so the kicker hugged the rule. Give the head clear air below
   the rule and keep the section FOOTPRINT constant by trimming the bottom the same 16px —
   the §10 --section-y rhythm BETWEEN sections is preserved. Scoped to .sec.ruled (0,2,0)
   so non-ruled / headless sections are untouched, and applied to the section box (not
   .sec-head) so it holds whether or not a head is present (adversarial-review §9.4). */
.sec.ruled { padding-block: calc(var(--section-y) + 16px) calc(var(--section-y) - 16px); }
/* Full-width sections own their vertical rhythm via padding-block + the .ruled border.
   The editor's default block-gap (24px) between sibling sections adds an unwanted gap —
   most visible as a cream strip above the dark stats / yellow band (and it pushed the
   .ruled divider 24px off the boundary). Zero it so sections sit flush, per the design. */
.wp-block-post-content > .alignfull { margin-block-start: 0; }

/* Same block-gap, one level down: every group below is a custom CSS grid that spaces
   itself with `gap`, but it's also .is-layout-flow, so the editor injects
   margin-block-start on each non-first child — shifting grid items 2+ DOWN in their
   cells (theme card 01 sat higher than 02–04; same latent bug on the stats row, hero,
   footer columns, project/goal cards…). Reset on DIRECT children only — nested prose
   keeps its own margins; row/column spacing is fully handled by each grid's `gap`.
   ⚠ MAINTENANCE: adding a new custom CSS grid? Add its selector to the list below,
   or its first child will float above the rest. */
.foot-cols > *, .foot-lower > *, .hero .grid > *, .hero-photos > *, .stats .grid > *,
.themes-grid > *, .band .wrap > *, .partners-grid > *, .sec-head-split > *,
.contact-grid > *, .field-grid > *, .section-opener .opener-head > *, .projekt-grid > *,
.projekt-card > *, .hero-solo .hero-aside > *, .split > *, .stats-light > *,
.goals-grid > *, .goal-card > *, .team-grid > *, .transparenz-row > *, .reg-dl > *,
.download-rows > *, .role-grid > *, .signup-grid > *, .steps-list li > *,
.partner-cta-grid > *, .cta-band > *, .nlb-grid > *, .ci-rows > *, .bar-cards > *,
.geld-panel > *, .bank-rows > *, .link-card > *, .reassure-grid > *, .cf-fields > *,
.event-cols > *,
.filter-rail > *, .fr-row > *, .fr-group > *, .fr-chips > *, .active-filters > *,
.post-grid > *, .post-card > *, .pc-body > *, .featured-post > *, .fp-body > *,
.post-cross-links > *, .pxl-section > * {
	margin-block-start: 0;
}
.sec-head { display: flex; flex-direction: column; gap: 16px; margin-bottom: 32px; }
.sec-head h2 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.025em;
	line-height: 1.0; font-size: clamp(30px, 4.2vw, 44px); margin: 0;
}
/* Feature-headline modifier (home.css 164 .sec-head h2.big). Canonical spec is
   weight 800, but display headings cap at 700 (Fixel Display ships 500/600/700 —
   see the Phase-4 header note); the 800→700 down-weight is the intentional font swap. */
.sec-head h2.big { font-weight: 700; letter-spacing: -0.03em; font-size: clamp(32px, 5vw, 56px); }
.sec-head .hl, .hero h1 .hl, .band h2 .hl {
	background: var(--wp--preset--color--yellow); padding: 0 10px;
	-webkit-box-decoration-break: clone; box-decoration-break: clone;
}
.sec-head .more {
	color: var(--wp--preset--color--blue); font-weight: 600; font-size: 14px;
	display: inline-flex; align-items: center; gap: 8px;
}
/* item 2b (2026-06-18): bottom-of-section "see all" link (home events slot). The rule
   above is scoped to .sec-head; this centers an equivalent link beneath a section's body.
   No underline — the prototype uses colour as the only link affordance. */
.more-foot { margin-block-start: 28px; text-align: center; }
.more-foot a {
	color: var(--wp--preset--color--blue); font-weight: 600; font-size: 14px;
	display: inline-flex; align-items: center; gap: 8px; text-decoration: none;
}
/* Self-service portal link (pushua/self-service-link block, home/archive arrow variant):
   the block renders a `.more` paragraph + arrow — the SAME affordance/class as „Alle Termine →“.
   `.sec-head .more` + the post-content rule style it on the home; style the link explicitly so the
   archive (not post-content, not in .sec-head) matches — blue, 600, underlined. The footer
   list-item instance is a plain link that inherits `.foot-col a`. */
.more .self-service-link {
	color: var(--wp--preset--color--blue); font-weight: 600; font-size: 14px;
	text-decoration: underline;
}
/* Footer: when the portal page is unseeded the block self-degrades to '' — hide the now-empty
   list-item so no blank bullet remains (codex P3). The inline authored markup leaves no
   whitespace inside the <li>, so :empty matches. */
.foot-col li:empty { display: none; }
@media (min-width: 782px) {
	.sec-head { flex-direction: row; align-items: flex-end; justify-content: space-between; }
}

/* ── Hero / PageHero (home.css 105-136) ─────────────────────────────────── */
.hero { padding-block: clamp(40px, 5vw, 72px) clamp(48px, 5vw, 80px); }
.hero .grid { display: grid; grid-template-columns: 1fr; gap: clamp(28px, 4vw, 56px); align-items: center; }
.hero-badge {
	display: inline-flex; align-self: flex-start; align-items: center; gap: 10px;
	padding: 6px 14px; background: var(--wp--preset--color--yellow-soft); border-radius: var(--wp--custom--pill-radius);
	/* 500 (Medium) — deliberately aligned to the regular-mono archetype (.mono is W500),
	   NOT the prototype's 600. The proto badge is 600 in JetBrains Mono; in IBM Plex Mono
	   600 reads heavier, so the consistency pass folds the badge onto the shared 500 weight. */
	font-size: 12px; font-weight: 500; font-family: var(--f-mono); color: var(--wp--preset--color--blue-deep); letter-spacing: 0.04em;
}
.hero-badge .dot { width: 6px; height: 6px; background: var(--wp--preset--color--blue); border-radius: 50%; }
.hero h1 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.035em;
	/* 0.92 not 1.0: Fixel Display sits taller in its line box than the design's Manrope,
	   so 1.0 reads looser — tightened to match the prototype's hero rhythm (font swap). */
	line-height: 0.92; margin-top: 18px; font-size: clamp(38px, 8.2vw, 76px);
}
.hero .lede {
	font-size: clamp(15px, 1.6vw, 18px); line-height: 1.55;
	color: var(--wp--preset--color--ink-soft); margin-top: 22px; max-width: 520px;
}
.hero .actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 28px; }
.hero-photos { display: grid; grid-template-columns: 1fr 1fr; grid-auto-rows: minmax(120px, 22vw); gap: 12px; }
.hero-photos .ph:nth-child(1), .hero-photos .ph:nth-child(4) { grid-column: 1 / 3; }
@media (min-width: 782px) { .hero-photos { grid-auto-rows: 160px; } }
@media (min-width: 1000px) {
	.hero .grid { grid-template-columns: 1.1fr 1fr; }
	.hero-photos { grid-auto-rows: 180px; }
}
@media (min-width: 1600px) { .hero h1 { font-size: clamp(76px, 5.4vw, 92px); } }

/* ── Stats / Impact strip (dark) (home.css 138-154) ─────────────────────── */
.stats { background: var(--wp--preset--color--ink); color: #fff; }
.stats .wrap { padding-block: clamp(28px, 3vw, 40px); }
.stats .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px 32px; align-items: center; }
.stat .num {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.02em;
	font-size: clamp(34px, 4vw, 44px); color: var(--wp--preset--color--yellow);
}
.stat .lab { font-size: 13px; color: #b3bdd4; margin-top: 4px; }
.stats .cta { grid-column: 1 / -1; display: flex; }
.stats .cta a {
	display: inline-flex; align-items: center; gap: 10px; padding: 13px 22px;
	border-radius: var(--wp--custom--pill-radius); border: 1.5px solid rgba(255, 255, 255, 0.25);
	color: #fff; font-weight: 600; font-size: 14px;
}
@media (min-width: 1000px) {
	.stats .grid { grid-template-columns: repeat(3, 1fr) auto; }
	.stats .cta { grid-column: auto; justify-content: flex-end; }
}

/* ── Theme cards — fill variant (home.css 232-248) ──────────────────────── */
.themes-grid { display: grid; grid-template-columns: 1fr; gap: 12px; }
@media (min-width: 600px) { .themes-grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1000px) { .themes-grid { grid-template-columns: repeat(4, 1fr); } }
.theme-card {
	color: #fff; padding: 24px; border-radius: var(--wp--custom--card-radius-lg); min-height: 200px;
	display: flex; flex-direction: column; justify-content: space-between;
}
/* 4-up only: anchor every card's paragraph on its FIRST LINE (like the prototype),
   so the heading grows upward from that line and the paragraph flows down. Reserve
   the heading band to its max height at this tier (3 lines) and bottom-align the
   heading into it — then idx + gap + heading-band are all fixed, so the paragraph
   starts at the same y in every card regardless of heading/paragraph length. At
   ≤2-up the copy already balances (equal line counts), so space-between is kept. */
@media (min-width: 1000px) {
	.theme-card { min-height: 240px; justify-content: flex-start; }
	.theme-card > .wp-block-group { margin-block-start: 34px; }
	.theme-card h3 {
		min-height: calc(3 * 1.1em);
		display: flex; flex-direction: column; justify-content: flex-end;
	}
}
.theme-card .idx { font-family: var(--f-mono); font-weight: 500; font-size: 11px; opacity: 0.9; }
.theme-card h3 { font-family: var(--f-display); font-weight: 700; font-size: 24px; line-height: 1.1; letter-spacing: -0.01em; margin: 0; }
/* Card title links use the card's own foreground (white on red/blue/ink, ink on yellow via
   .t-kultur), not theme.json elements.link blue — which would render the title invisible on
   the blue card (codex a11y-1). Underline-on-interaction is the non-colour link affordance (SC 1.4.1). */
.theme-card h3 a { color: inherit; text-decoration: none; }
.theme-card h3 a:hover, .theme-card h3 a:focus { text-decoration: underline; }
.theme-card p { font-size: 13.5px; line-height: 1.5; margin: 12px 0 0; opacity: 0.95; }
.theme-card.t-hilfe { background: var(--wp--preset--color--red); }
.theme-card.t-ankommen { background: var(--wp--preset--color--blue); }
.theme-card.t-kultur { background: var(--wp--preset--color--yellow); color: var(--wp--preset--color--ink); }
.theme-card.t-stimme { background: var(--wp--preset--color--ink); }

/* ── Mitmachen & Spenden band + tone variants (home.css 264-276) ────────── */
.band { background: var(--wp--preset--color--yellow); }
.band .wrap { padding-block: clamp(36px, 4vw, 56px); display: grid; grid-template-columns: 1fr; gap: 24px; align-items: center; }
/* Band eyebrow (design source = blue-deep mono kicker above the title). The base
   .kicker is blue; on the yellow band the design uses blue-deep. */
.band .kicker { color: var(--wp--preset--color--blue-deep); } /* gap via canonical eyebrow→heading rule */
.band h2 { font-family: var(--f-display); font-weight: 700; letter-spacing: -0.03em; line-height: 1.02; font-size: clamp(28px, 3.6vw, 40px); color: var(--wp--preset--color--ink); margin: 0; }
.band p:not(.kicker) { font-size: 15px; line-height: 1.55; color: var(--wp--preset--color--blue-deep); margin: 12px 0 0; max-width: 520px; }
.band .actions { display: flex; flex-wrap: wrap; gap: 12px; }
.band.band-ink { background: var(--wp--preset--color--ink); }
.band.band-ink h2 { color: #fff; }
.band.band-ink p { color: #b3bdd4; }
.band.band-paper { background: var(--wp--preset--color--paper); border-block: 1px solid var(--wp--preset--color--rule); }
.band.band-paper p { color: var(--wp--preset--color--ink-soft); }
@media (min-width: 782px) {
	.band .wrap { grid-template-columns: 1.4fr 1fr; }
	.band .actions { justify-content: flex-end; }
}

/* ── Partners / Förderer strip (home.css 278-285) ───────────────────────── */
.partners-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: center; }
@media (min-width: 600px) { .partners-grid { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1000px) { .partners-grid { grid-template-columns: repeat(5, 1fr); gap: 24px; } }
.partner {
	padding: 20px 16px; border: 1px solid var(--wp--preset--color--rule); border-radius: 12px; text-align: center;
	font-family: var(--f-mono); font-weight: 500; font-size: 12px; color: var(--wp--preset--color--ink-soft); letter-spacing: 0.05em;
}

/* ── SectionSubnav (sticky numbered scroll-spy; not in home.css) ─────────── */
.section-subnav {
	position: sticky; top: var(--header-h); z-index: 10; background: var(--wp--preset--color--bg);
	border-block: 1px solid var(--wp--preset--color--rule);
}
.section-subnav .wrap { display: flex; flex-wrap: wrap; gap: 14px 28px; padding-block: 14px; }
/* Neutralize core's flow-layout block-gap (margin-block-start on every non-first child),
   which in this flex row would shift items 2+ down and leave 01 sitting higher. */
.section-subnav .wrap > * { margin-block: 0; }
.section-subnav a {
	display: inline-flex; align-items: center; gap: 8px; font-family: var(--f-mono); font-weight: 500;
	font-size: 12px; letter-spacing: var(--wp--custom--mono-tracking); text-transform: uppercase;
	color: var(--wp--preset--color--ink-soft); border-bottom: 2px solid transparent; padding-bottom: 2px;
}
.section-subnav a .n { color: var(--wp--preset--color--blue); }
.section-subnav a:hover { color: var(--wp--preset--color--ink); text-decoration: none; }
.section-subnav a.is-active { color: var(--wp--preset--color--ink); border-bottom-color: var(--wp--preset--color--yellow); }

/* ── Empty state (placeholder for deferred dynamic/form content) ─────────── */
.empty-state {
	border: 1px dashed var(--wp--preset--color--rule); border-radius: var(--wp--custom--card-radius);
	padding: 32px; text-align: center; color: var(--wp--preset--color--ink-soft); font-size: 14px;
	background: var(--wp--preset--color--paper);
}
.empty-state .es-kicker {
	display: block; color: var(--wp--preset--color--blue); margin-bottom: 8px;
}
/* The PROTOTYPE's banner anatomy (gemeinschaft-shared.jsx EmptyState, review D6):
   icon disc + display title + body + next-step CTA — an empty calendar reads as
   an invitation, never a dead end. */
.empty-state.es-banner {
	display: flex; align-items: center; gap: 22px; text-align: left; padding: 40px 28px;
}
.empty-state.es-banner .es-kicker { margin-bottom: 0; }
.empty-state.es-banner .es-icon {
	flex-shrink: 0; width: 56px; height: 56px; border-radius: 50%;
	background: var(--wp--preset--color--bg); border: 1px solid var(--wp--preset--color--rule);
	position: relative;
}
.empty-state.es-banner .es-icon::after {
	content: ""; position: absolute; inset: 0; margin: auto; width: 22px; height: 22px;
	background: var(--wp--preset--color--ink-soft);
	mask: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.6"><rect x="3" y="4" width="18" height="17" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>') center / contain no-repeat;
}
.empty-state.es-banner .es-text { flex: 1; }
.empty-state.es-banner .es-text p { margin: 0; line-height: 1.5; }
.empty-state.es-banner .es-title {
	font-family: var(--f-display); font-size: 22px; font-weight: 700;
	letter-spacing: -0.015em; line-height: 1.2; color: var(--wp--preset--color--ink);
	margin: 6px 0 4px;
}
.empty-state.es-banner .es-cta {
	flex-shrink: 0; display: inline-flex; align-items: center; gap: 8px;
	background: var(--wp--preset--color--ink); color: #fff;
	padding: 12px 18px; border-radius: var(--wp--custom--pill-radius);
	font-weight: 600; font-size: 13px; text-decoration: none;
}
.empty-state.es-banner .es-cta:hover, .empty-state.es-banner .es-cta:focus-visible { text-decoration: none; opacity: 0.9; }
@media (max-width: 599.98px) {
	.empty-state.es-banner { flex-direction: column; text-align: center; }
}

/* ── Phase-6 dynamic-block slot (machine-addressable; codex F3) ───────────
   Stable insertion point: `.is-pushua-slot` group + metadata.name="pushua/slot-*".
   Phase 6 replaces the inner empty-state with the SSR event/Aktuelles blocks. The
   wrapper is layout-neutral on the front so it leaves no artifact when filled. */
.is-pushua-slot { display: block; }

/* PHASE 4 — EDITORIAL PAGES (Was-wir-tun, Über-uns, Mitmachen, Spenden, Kontakt) */
/* ============================================================================
   Consolidated bespoke layer for the five non-home editorial pages. Append to
   components.css (the global/shared layer above). Mobile-first; SUPERSET
   breakpoints 600 / 700 / 782 / 1000 / 1200 / 1600 — the FULL multi-column
   desktop layout fires at 1000 (arch-ref §10), card grids step at 600/700.
   Every colour = theme.json preset/accent token; fonts = --f-display/-body/-mono;
   radii/spacing/tracking = --wp--custom--* tokens. The only raw values are the
   dark-surface greys established on ink backgrounds in components.css
   (#b3bdd4 — the ONE on-ink grey, phase-4 guard + review D13 — and rgba(255,255,255,…)) and translucent white/paper tints on the
   yellow F4 direct-contact card (.direct-card / .direct-link — there is no token for
   a semi-opaque-on-yellow fill). Display headings cap at weight 700
   (Fixel Display ships 500/600/700). Links on coloured/dark surfaces set
   color:inherit (theme.json colours links blue — invisible on blue/ink) with
   underline-on-interaction as the non-colour affordance (WCAG SC 1.4.1).

   Shared NEW classes (deduped here, used by ≥2 pages): .hero-copy, .hero-aside,
   the offset photo-grid variant (.hero-photos.hero-offset, .hero-photos.offset),
   .contact-grid, .field/.field-grid/.field-full/.field-label, .form-disabled-cta,
   .fd-dot, .consent-block, .consent-row, .sec-anchor, .sec-head-split, .sec-intro.

   GOTCHAS & CONVENTIONS (added 2026-06-04, rendered-fidelity pass):
   • BLOCK-GAP vs CUSTOM GRIDS — every group rendered as a custom CSS grid is also
     `.is-layout-flow`, so the editor injects `margin-block-start: <block-gap>` on each
     non-first child, shifting grid items 2+ DOWN in their cells (this is why a card
     can sit higher than its row-mates). It is neutralized by the "block-gap, one level
     down" reset near `.sec` (and `.wp-block-post-content > .alignfull` for sections).
     ⚠ WHEN YOU ADD A NEW CUSTOM GRID, ADD ITS SELECTOR TO THAT RESET LIST — otherwise
     its first child will float above the rest. Row/column spacing = each grid's `gap`.
   • CTA ICONS — opt-in per button via `.cta-arrow` (forward actions) / `.cta-heart`
     (Spenden) + `.cta-lg` (large size); mask-image glyphs that inherit the link colour.
     Do NOT blanket-apply by button style (heart belongs only on "Spenden").
   • Full-width sections sit FLUSH (block-gap zeroed); each owns its rhythm via
     `padding-block` + the `.ruled` top border. Don't add inter-section margins.
   ========================================================================== */

/* ── Global in-page anchor offset ─────────────────────────────────────────
   Every id'd jump target (section subnavs, the Was-wir-tun hero pills
   #hilfe/#ankommen/#kultur/#stimme, the Spenden #geld/#sach, the
   Mitmachen/Über-uns subnav targets) clears the sticky header. :where() keeps
   specificity 0 so per-page scroll-margin tweaks below still win. */
:where(section[id], .sec[id], [id].sec) { scroll-margin-top: calc(var(--header-h) + 16px); }

/* ── Shared hero columns (canonical) ──────────────────────────────────────
   The .hero .grid (components.css) makes these two children grid cells. They
   need a base display so the bare markup (.hero-copy / .hero-aside) lays out
   on every page; per-page tweaks below scope to .hero-{spenden,wwt,mitmachen}. */
.hero-copy { display: flex; flex-direction: column; }
.hero-aside { display: flex; flex-direction: column; }

/* ── Shared offset photo grid (Kontakt + Mitmachen) ───────────────────────
   The staggered „Versatz" 2×2 mosaic. Two class targets exist in the markup —
   Kontakt carries `.hero-photos.hero-offset`, Mitmachen `.hero-photos.offset` —
   so both are unified into one rule set (identical intent). Overrides the global
   .hero-photos span rules: every tile is a uniform cell; the margin-top stagger
   only fires at ≥1000 (mobile stays flush so nothing overflows at 390). */
.hero-photos.hero-offset,
.hero-photos.offset {
	grid-template-columns: 1fr 1fr;
	grid-auto-rows: minmax(120px, 24vw);
	gap: 10px;
}
.hero-photos.hero-offset .ph:nth-child(1),
.hero-photos.hero-offset .ph:nth-child(4),
.hero-photos.offset .ph:nth-child(1),
.hero-photos.offset .ph:nth-child(4) { grid-column: auto; }
@media (min-width: 782px) {
	.hero-photos.hero-offset,
	.hero-photos.offset { grid-auto-rows: 150px; }
}
@media (min-width: 1000px) {
	/* Uniform-height tiles on auto rows (like the prototype): the row tracks absorb
	   the stagger margins so the −12px pull-up no longer makes a tile grow and overlap
	   its column-mate (Logistik over Sprachcafé). align-items:start stops the stretch. */
	.hero-photos.hero-offset,
	.hero-photos.offset { grid-auto-rows: auto; align-items: start; }
	.hero-photos.hero-offset .ph,
	.hero-photos.offset .ph { height: 160px; }
	.hero-photos.hero-offset .ph:nth-child(1),
	.hero-photos.offset .ph:nth-child(1) { margin-top: 0; }
	.hero-photos.hero-offset .ph:nth-child(2),
	.hero-photos.offset .ph:nth-child(2) { margin-top: 24px; }
	.hero-photos.hero-offset .ph:nth-child(3),
	.hero-photos.offset .ph:nth-child(3) { margin-top: -12px; }
	.hero-photos.hero-offset .ph:nth-child(4),
	.hero-photos.offset .ph:nth-child(4) { margin-top: 12px; }
}

/* ── Shared anchored-section helpers (Mitmachen + Über-uns idiom) ──────────
   Pull in-page jump targets clear of the sticky header (+ subnav where present). */
.sec-anchor { scroll-margin-top: calc(var(--header-h) + 64px); }
/* Split section head: heading block left, intro paragraph right (≥1000). */
.sec-head-split .sec-intro {
	font-size: clamp(15px, 1.6vw, 16px); line-height: 1.55;
	color: var(--wp--preset--color--ink-soft); margin: 0; max-width: 580px;
}
@media (min-width: 1000px) {
	.sec-head-split { display: grid; grid-template-columns: 1fr 2fr; gap: clamp(32px, 4vw, 56px); align-items: end; }
}

/* ── Shared two-track contact grid (Kontakt + Mitmachen) ───────────────────
   1-col mobile → form-track | aside-track at 1000; align-items:start so the
   aside doesn't stretch. Kontakt fills it with .contact-form-card + .contact-live;
   Mitmachen with .contact-form + .contact-info. */
.contact-grid { display: grid; grid-template-columns: 1fr; gap: 24px; align-items: start; }
@media (min-width: 1000px) { .contact-grid { grid-template-columns: 1.5fr 1fr; } }

/* ── Shared disabled-field styling (Mitmachen signup + contact previews) ───
   Non-submittable preview inputs (codex F3): dimmed + not-allowed; labels above
   stay full-contrast. */
.field-grid { display: grid; grid-template-columns: 1fr; gap: 16px; }
@media (min-width: 600px) { .field-grid { grid-template-columns: 1fr 1fr; } }
.field { display: flex; flex-direction: column; gap: 6px; }
.field-full { grid-column: 1 / -1; }
.field-label {
	font-family: var(--f-mono); font-weight: 500; font-size: 12px; color: var(--wp--preset--color--ink-soft);
	letter-spacing: var(--wp--custom--mono-tracking); text-transform: uppercase;
}
.field input, .field textarea {
	width: 100%; padding: 12px 14px;
	border: 1px solid var(--wp--preset--color--rule); border-radius: 10px;
	font-family: inherit; font-size: 14px;
	background: var(--wp--preset--color--bg); color: var(--wp--preset--color--ink);
}
.field textarea { resize: none; }
.field input[disabled], .field textarea[disabled] { opacity: 0.55; cursor: not-allowed; }

/* "Formular folgt" disabled-submit stand-in (non-submittable; codex F3) */
.form-disabled-cta {
	margin-top: 24px; display: flex; align-items: center; gap: 10px;
	padding: 14px 18px; border-radius: var(--wp--custom--pill-radius);
	border: 1px dashed var(--wp--preset--color--rule); background: var(--wp--preset--color--bg);
	font-size: 12px; color: var(--wp--preset--color--ink-soft); text-transform: none;
}
.form-disabled-cta .fd-dot {
	width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
	background: var(--wp--preset--color--yellow); border: 1px solid var(--wp--preset--color--rule);
}

/* Consent rows (disabled previews; Mitmachen signup + Kontakt) */
.consent-block { margin-top: 22px; display: flex; flex-direction: column; gap: 10px; }
.consent-row {
	display: flex; gap: 10px; align-items: flex-start; margin: 0;
	font-size: 13px; line-height: 1.45; color: var(--wp--preset--color--ink-soft);
}
.consent-row .box {
	width: 18px; height: 18px; flex-shrink: 0; margin-top: 1px;
	border: 1.5px solid var(--wp--preset--color--ink); border-radius: 5px;
	display: inline-flex; align-items: center; justify-content: center;
	font-size: 12px; line-height: 1; color: var(--wp--preset--color--paper);
}
.consent-row .box.is-checked { background: var(--wp--preset--color--ink); }

/* ════════════════════════════════════════════════════════════════════════
   PAGE — Was wir tun (page-was-wir-tun)
   Hero anchor-pill aside, per-theme section opener, static ProjektCard grid.
   ════════════════════════════════════════════════════════════════════════ */

/* ── Hero — anchor-pill aside ──────────────────────────────────────────── */
.hero-wwt .hero-aside { align-items: flex-start; }
.hero-pills {
	display: flex; flex-wrap: wrap; gap: 8px;
	font-family: var(--f-mono); font-weight: 500; font-size: 12px;
}
.hero-pills .pill { margin: 0; }
.hero-pills .pill a {
	display: inline-flex; align-items: center; gap: 8px;
	padding: 8px 14px; border-radius: var(--wp--custom--pill-radius);
	border: 1px solid var(--wp--preset--color--rule);
	background: var(--wp--preset--color--paper);
	color: var(--wp--preset--color--ink); text-decoration: none;
	letter-spacing: var(--wp--custom--mono-tracking); line-height: 1.2;
}
.hero-pills .pill a:hover,
.hero-pills .pill a:focus-visible {
	border-color: var(--wp--preset--color--ink);
	text-decoration: underline; text-underline-offset: 3px;
}
.hero-pills .pill .dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
/* Per-theme dot tint (decorative; the label carries the meaning). The yellow dot
   gets a hairline ring so it reads on the paper pill. */
.hero-pills .p-hilfe .dot { background: var(--wp--custom--accent--hilfe); }
.hero-pills .p-ankommen .dot { background: var(--wp--custom--accent--ankommen); }
.hero-pills .p-kultur .dot { background: var(--wp--custom--accent--kultur); box-shadow: inset 0 0 0 1px var(--wp--preset--color--rule); }
.hero-pills .p-stimme .dot { background: var(--wp--custom--accent--stimme); }
@media (min-width: 1000px) {
	.hero-wwt .grid { grid-template-columns: 1.1fr 1fr; }
	.hero-pills { flex-direction: column; align-items: flex-start; }
}

/* ── Theme section opener (accent bar + mono eyebrow + H2 + lede + link) ── */
.section-opener { scroll-margin-top: calc(var(--header-h) + 8px); }
.section-opener .opener-head {
	display: grid; grid-template-columns: 1fr;
	gap: 22px 48px; align-items: end; margin-bottom: 32px;
}
.section-opener .opener-eyebrow {
	display: flex; align-items: center; gap: 12px; line-height: 1; /* eyebrow→h2 gap via canonical rule */
}
/* chunkier 36×6 marker than the thin --accent-bar-width token, per the design source */
.section-opener .opener-eyebrow .bar {
	display: inline-block; width: 36px; height: 6px; border-radius: 3px; flex-shrink: 0;
}
/* Theme-section headline (design source ThemeBlock h2 = 52px). Without this it
   falls back to the global h2 element (44px / weight 600 / -0.02em / 1.08) — lighter
   than a normal .sec-head. Weight capped at 700 (Fixel Display max; see header note). */
.section-opener h2 {
	margin: 0; font-weight: 700; letter-spacing: -0.03em; line-height: 1.0;
	font-size: clamp(32px, 4.6vw, 52px);
}
.section-opener .opener-aside {
	display: flex; flex-direction: column; gap: 14px; align-items: flex-start;
}
.section-opener .opener-lede {
	margin: 0; max-width: 520px;
	font-size: var(--wp--preset--font-size--lede); line-height: 1.55;
	color: var(--wp--preset--color--ink-soft);
}
.section-opener .opener-link { margin: 0; }
.section-opener .opener-link a {
	display: inline-flex; align-items: center; gap: 8px;
	font-weight: 700; font-size: 14px; text-decoration: none;
}
.section-opener .opener-link a:hover,
.section-opener .opener-link a:focus-visible { text-decoration: underline; text-underline-offset: 3px; }

/* Per-theme accent: bar fill + eyebrow/link text. Yellow as TEXT fails AA on the
   page bg (1.4:1), so .t-kultur uses blue-deep for text (11:1) while the bar stays
   yellow (mirrors the design-source themeTextColor: yellow→blueDeep). */
.section-opener.t-hilfe .opener-eyebrow .bar { background: var(--wp--custom--accent--hilfe); }
.section-opener.t-hilfe .opener-eyebrow,
.section-opener.t-hilfe .opener-link a { color: var(--wp--custom--accent--hilfe); }

.section-opener.t-ankommen .opener-eyebrow .bar { background: var(--wp--custom--accent--ankommen); }
.section-opener.t-ankommen .opener-eyebrow,
.section-opener.t-ankommen .opener-link a { color: var(--wp--custom--accent--ankommen); }

.section-opener.t-kultur .opener-eyebrow .bar { background: var(--wp--custom--accent--kultur); }
.section-opener.t-kultur .opener-eyebrow,
.section-opener.t-kultur .opener-link a { color: var(--wp--preset--color--blue-deep); }

.section-opener.t-stimme .opener-eyebrow .bar { background: var(--wp--custom--accent--stimme); }
.section-opener.t-stimme .opener-eyebrow,
.section-opener.t-stimme .opener-link a { color: var(--wp--preset--color--ink); }

@media (min-width: 1000px) {
	.section-opener .opener-head { grid-template-columns: 1.1fr 1fr; }
}

/* ── ProjektCard grid (static placeholders; phase 6 makes them live) ─────── */
.projekt-grid { display: grid; grid-template-columns: 1fr; gap: 16px; }
/* Card grids reflow 1 → 2-col at 600 (the §10 per-block contract). The single
   (Hilfe) grid stays 1-col at every width. */
@media (min-width: 600px) {
	.projekt-grid { grid-template-columns: repeat(2, 1fr); }
	.projekt-grid.single { grid-template-columns: 1fr; }
}
.projekt-card {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg);
	overflow: hidden; display: grid; grid-template-columns: 1fr;
}
.projekt-card .ph { border-radius: 0; min-height: 180px; }
.projekt-card .projekt-body {
	padding: 24px; display: flex; flex-direction: column; gap: 8px;
}
.projekt-card .projekt-eyebrow { color: var(--wp--preset--color--ink-soft); } /* gap via canonical eyebrow→heading rule */
.projekt-card h3 {
	margin: 0; font-family: var(--f-display); font-weight: 700;
	font-size: var(--wp--preset--font-size--h3); line-height: 1.1; letter-spacing: -0.015em;
}
/* On the white paper card theme.json link blue is visible + AA (#1c52cf on #fff ≈
   6.6:1) → KEEP it (not color:inherit, which only applies on coloured cards);
   add underline-on-interaction. */
.projekt-card h3 a { text-decoration: none; }
.projekt-card h3 a:hover,
.projekt-card h3 a:focus-visible { text-decoration: underline; text-underline-offset: 3px; }
.projekt-card .projekt-sub {
	margin: 0; font-size: 14px; line-height: 1.55;
	color: var(--wp--preset--color--ink-soft);
}
.projekt-card .projekt-meta {
	margin: 8px 0 0; display: flex; flex-wrap: wrap; gap: 8px 16px;
	font-family: var(--f-mono); font-weight: 500; font-size: 11.5px; letter-spacing: 0.02em;
	color: var(--wp--preset--color--ink-soft);
}
.projekt-card .projekt-meta .m { display: inline-flex; align-items: center; gap: 6px; }
.projekt-card .projekt-meta .dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
/* Meta-dot tint per theme (decorative echo of the section accent). */
.t-hilfe .projekt-card .projekt-meta .dot { background: var(--wp--custom--accent--hilfe); }
.t-ankommen .projekt-card .projekt-meta .dot { background: var(--wp--custom--accent--ankommen); }
.t-kultur .projekt-card .projekt-meta .dot { background: var(--wp--custom--accent--kultur); box-shadow: inset 0 0 0 1px var(--wp--preset--color--rule); }
.t-stimme .projekt-card .projekt-meta .dot { background: var(--wp--custom--accent--stimme); }
/* Card CTA (design source ProjektCard cta = 13.5px / weight 700 / blue, inline w/ arrow).
   Without a rule it renders as default body copy (16px / 400). Blue on white paper is
   AA (#1c52cf on #fff ≈ 6.6:1) → KEEP blue; underline-on-interaction (SC 1.4.1). */
.projekt-card .projekt-cta { margin: 14px 0 0; font-size: 13.5px; line-height: 1; }
.projekt-card .projekt-cta a {
	display: inline-flex; align-items: center; gap: 8px;
	font-weight: 700; color: var(--wp--preset--color--blue); text-decoration: none;
}
.projekt-card .projekt-cta a:hover,
.projekt-card .projekt-cta a:focus-visible { text-decoration: underline; text-underline-offset: 3px; }
/* The single (Hilfe) card spans the full content width → photo-left | body-right
   already at 600. */
@media (min-width: 600px) {
	.projekt-grid.single .projekt-card { grid-template-columns: 280px 1fr; }
	.projekt-grid.single .projekt-card .ph { min-height: 100%; }
}
/* Multi-card cells are ~260px at 600 (2-up) — too narrow for a side photo; they
   stay stacked until 1000, where the cells widen to ~450px. */
@media (min-width: 1000px) {
	.projekt-grid:not(.single) .projekt-card { grid-template-columns: 180px 1fr; }
	.projekt-grid:not(.single) .projekt-card .ph { min-height: 100%; }
}

/* ════════════════════════════════════════════════════════════════════════
   PAGE — Über uns (page-ueber-uns)
   Solo-photo hero, Wer-wir-sind split + light stats, Ziele goal grid, Team grid,
   Transparenz (reg card + download card + Jahresberichte rows).
   ════════════════════════════════════════════════════════════════════════ */

/* ── Hero — single-photo aside variant (.hero-solo) ─────────────────────── */
.hero-solo .hero-aside { display: grid; }
.hero-solo .hero-aside .ph {
	min-height: 240px; border-radius: var(--wp--custom--card-radius-lg);
}
@media (min-width: 1000px) {
	.hero-solo .hero-aside .ph { min-height: 320px; }
}

/* Anchor sections clear the sticky header + subnav on in-page jumps. */
.wer-wir-sind, .ziele, .team, .transparenz { scroll-margin-top: calc(var(--header-h) + 60px); }

/* ── 01 Wer wir sind — two-column split + light stat grid ───────────────── */
.split { display: grid; grid-template-columns: 1fr; gap: 28px; }
.split-head h2 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.025em;
	line-height: 1.05; font-size: clamp(30px, 4.2vw, 44px); margin: 0; /* eyebrow→h2 gap via canonical rule */
}
.split-body { display: flex; flex-direction: column; gap: 18px; }
.split-body > p {
	font-size: clamp(15px, 1.5vw, 17px); line-height: 1.6;
	color: var(--wp--preset--color--ink); margin: 0;
}
@media (min-width: 1000px) {
	.split { grid-template-columns: 1fr 2fr; gap: 56px; }
}

/* Light stat grid — blue numbers on the page bg, mono labels (the dark .stats
   lives in the global layer). */
.stats-light {
	display: grid; grid-template-columns: 1fr 1fr; gap: 22px 18px;
	margin-top: 12px; padding-top: 28px; border-top: 1px solid var(--wp--preset--color--rule);
}
.stats-light .num {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.02em;
	font-size: clamp(30px, 3.4vw, 36px); color: var(--wp--preset--color--blue); margin: 0;
}
.stats-light .lab {
	font-family: var(--f-mono); font-weight: 500; font-size: 12.5px; letter-spacing: var(--wp--custom--mono-tracking);
	color: var(--wp--preset--color--ink-soft); margin: 4px 0 0;
}
@media (min-width: 600px) {
	.stats-light { grid-template-columns: repeat(4, 1fr); }
}

/* ── 02 Ziele — paper section + 2×2 goal-card grid ──────────────────────── */
.ziele { background: var(--wp--preset--color--paper); }
.ziele-intro {
	font-size: clamp(15px, 1.5vw, 16px); line-height: 1.55;
	color: var(--wp--preset--color--ink-soft); max-width: 580px; margin: -12px 0 28px;
}
.goals-grid { display: grid; grid-template-columns: 1fr; gap: 16px; }
@media (min-width: 700px) { .goals-grid { grid-template-columns: 1fr 1fr; } }
.goal-card {
	background: var(--wp--preset--color--bg); border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg); overflow: hidden;
	display: grid; grid-template-columns: 1fr; position: relative;
}
.goal-card::before {
	content: ""; position: absolute; top: 0; left: 0; bottom: 0; width: var(--wp--custom--accent-bar-width); z-index: 1;
}
.goal-card.g-hilfe::before { background: var(--wp--custom--accent--hilfe); }
.goal-card.g-ankommen::before { background: var(--wp--custom--accent--ankommen); }
.goal-card.g-kultur::before { background: var(--wp--custom--accent--kultur); }
.goal-card.g-stimme::before { background: var(--wp--custom--accent--stimme); }
.goal-card .ph { border-radius: 0; min-height: 160px; }
.goal-badge {
	position: absolute; top: 14px; left: 14px; display: inline-flex; align-items: center; gap: 6px;
	background: rgba(255, 255, 255, 0.92); padding: 4px 10px; border-radius: var(--wp--custom--pill-radius);
	font-family: var(--f-mono); font-size: 10px; font-weight: 700; letter-spacing: var(--wp--custom--mono-tracking);
	color: var(--wp--preset--color--ink); margin: 0;
}
.goal-badge .dot { width: 8px; height: 8px; border-radius: 50%; }
.goal-card.g-hilfe .goal-badge .dot { background: var(--wp--custom--accent--hilfe); }
.goal-card.g-ankommen .goal-badge .dot { background: var(--wp--custom--accent--ankommen); }
.goal-card.g-kultur .goal-badge .dot { background: var(--wp--custom--accent--kultur); }
.goal-card.g-stimme .goal-badge .dot { background: var(--wp--custom--accent--stimme); }
.goal-body { padding: 24px; display: flex; flex-direction: column; gap: 8px; }
.goal-tag {
	font-family: var(--f-mono); font-weight: 500; font-size: 11px; letter-spacing: var(--wp--custom--mono-tracking);
	color: var(--wp--preset--color--ink-soft); margin: 0;
}
.goal-body h3 {
	font-family: var(--f-display); font-weight: 700; font-size: clamp(20px, 2.2vw, 24px);
	letter-spacing: -0.015em; line-height: 1.1; margin: 0;
}
.goal-body p { font-size: 14px; line-height: 1.55; color: var(--wp--preset--color--ink-soft); margin: 0; }
@media (min-width: 1000px) {
	.goal-card { grid-template-columns: 160px 1fr; }
	.goal-card .ph { min-height: 100%; height: 100%; }
}

/* ── 03 Team — member-card grid (1→2→4) + Ehrenamt CTA card ──────────────── */
.team-intro {
	font-size: clamp(15px, 1.5vw, 16px); line-height: 1.55;
	color: var(--wp--preset--color--ink-soft); max-width: 580px; margin: -12px 0 28px;
}
.team-grid { display: grid; grid-template-columns: 1fr; gap: 14px; }
@media (min-width: 600px) { .team-grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1000px) { .team-grid { grid-template-columns: repeat(4, 1fr); } }
.team-card {
	background: var(--wp--preset--color--paper); border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius); overflow: hidden; position: relative;
	display: flex; flex-direction: column;
}
.team-card .ph { border-radius: 0; aspect-ratio: 4 / 5; min-height: 0; }
.vorstand-badge {
	position: absolute; top: 12px; left: 12px; display: inline-flex; align-items: center; gap: 6px;
	background: var(--wp--preset--color--ink); color: var(--wp--preset--color--yellow);
	padding: 4px 10px; border-radius: var(--wp--custom--pill-radius);
	font-family: var(--f-mono); font-size: 9.5px; font-weight: 700; letter-spacing: var(--wp--custom--mono-tracking); margin: 0;
}
.vorstand-badge .dot { width: 6px; height: 6px; background: var(--wp--preset--color--yellow); border-radius: 50%; }
.team-meta { padding: 16px; }
.team-name-row { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.team-name-row h3 {
	font-family: var(--f-display); font-weight: 700; font-size: 18px; letter-spacing: -0.01em; margin: 0; line-height: 1.15;
}
.team-idx { font-family: var(--f-mono); font-weight: 500; font-size: 10.5px; color: var(--wp--preset--color--ink-soft); margin: 0; }
.team-role-lead { color: var(--wp--preset--color--blue); margin: 6px 0 0; }
.team-role { font-size: 12px; line-height: 1.45; color: var(--wp--preset--color--ink-soft); margin: 8px 0 0; }
/* Ehrenamt CTA card — yellow fill, ink text; link inherits the card foreground
   (theme.json sets links blue, invisible on yellow), underline as the affordance. */
.team-card.team-cta {
	background: var(--wp--preset--color--yellow); border: none; color: var(--wp--preset--color--ink);
	padding: 20px; justify-content: space-between; gap: 16px; min-height: 280px;
}
.team-cta .team-cta-kicker {
	font-family: var(--f-mono); font-weight: 500; font-size: 11px; letter-spacing: var(--wp--custom--mono-tracking);
	color: var(--wp--preset--color--blue-deep); margin-block-start: 0; margin-inline: 0; /* bottom via canonical rule */
}
.team-cta h3 {
	font-family: var(--f-display); font-weight: 700; font-size: 22px; line-height: 1.1;
	letter-spacing: -0.02em; margin: 0 0 8px; color: var(--wp--preset--color--ink); /* top gap via canonical rule */
}
.team-cta p:not(.team-cta-kicker) { font-size: 12.5px; line-height: 1.5; color: var(--wp--preset--color--ink); margin: 0; } /* kicker→h3 gap via canonical rule */
.team-cta .team-cta-link { margin: 0; }
.team-cta .team-cta-link a {
	color: inherit; text-decoration: none; font-weight: 700; font-size: 13.5px;
}
.team-cta .team-cta-link a:hover, .team-cta .team-cta-link a:focus-visible { text-decoration: underline; }

/* ── 04 Transparenz — reg card + download card + Jahresberichte rows ─────── */
.transparenz { background: var(--wp--preset--color--paper); }
.transparenz-intro {
	max-width: 580px; margin: 0; font-size: clamp(15px, 1.5vw, 16px); line-height: 1.55;
	color: var(--wp--preset--color--ink-soft);
}
.transparenz-row { display: grid; grid-template-columns: 1fr; gap: 16px; }
@media (min-width: 1000px) { .transparenz-row { grid-template-columns: 1fr 1fr; } }
/* Vereinsregister info card (light) */
.reg-card {
	background: var(--wp--preset--color--bg); border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius); padding: 28px;
}
.reg-kicker { color: var(--wp--preset--color--blue); margin: 0; }
.reg-card h3 {
	font-family: var(--f-display); font-weight: 700; font-size: clamp(20px, 2vw, 22px);
	letter-spacing: -0.01em; line-height: 1.2; margin: 0 0 16px; /* top gap via canonical rule */
}
.reg-dl {
	display: grid; grid-template-columns: 130px 1fr; row-gap: 8px; column-gap: 12px;
	font-family: var(--f-mono); font-weight: 500; font-size: 13px; margin: 0;
}
.reg-dl dt { color: var(--wp--preset--color--ink-soft); margin: 0; }
.reg-dl dd { color: var(--wp--preset--color--ink); margin: 0; }
.reg-konto {
	margin-top: 18px; padding-top: 16px; border-top: 1px dashed var(--wp--preset--color--rule);
	display: flex; flex-direction: column; gap: 4px;
}
.reg-konto-kicker { color: var(--wp--preset--color--blue); margin: 0; }
.reg-iban { font-family: var(--f-mono); font-weight: 500; font-size: 13px; color: var(--wp--preset--color--ink); letter-spacing: 0.02em; margin: 0; }
.reg-bic { font-size: 11.5px; color: var(--wp--preset--color--ink-soft); margin: 0; }
/* Satzung download card (dark) */
.dl-card {
	background: var(--wp--preset--color--ink); color: #fff;
	border-radius: var(--wp--custom--card-radius); padding: 28px;
	display: flex; flex-direction: column; justify-content: space-between; gap: 24px;
}
.dl-kicker { color: var(--wp--preset--color--yellow); margin: 0; }
.dl-card h3 {
	font-family: var(--f-display); font-weight: 700; font-size: clamp(22px, 2.6vw, 28px);
	letter-spacing: -0.015em; line-height: 1.05; margin: 0 0 12px; color: #fff; /* top gap via canonical rule */
}
.dl-card-top p:not(.dl-kicker) { font-size: 14px; line-height: 1.55; color: #b3bdd4; margin: 0; }
.dl-cta { margin: 0; }
.dl-cta a {
	display: inline-flex; align-items: center; gap: 12px; align-self: flex-start;
	background: var(--wp--preset--color--yellow); color: var(--wp--preset--color--ink);
	padding: 14px 22px; border-radius: var(--wp--custom--pill-radius);
	font-weight: 700; font-size: 14px; text-decoration: none;
}
.dl-cta a:hover, .dl-cta a:focus-visible { text-decoration: underline; }
.dl-flag {
	background: var(--wp--preset--color--ink); color: var(--wp--preset--color--yellow);
	padding: 3px 8px; border-radius: 4px; font-family: var(--f-mono); font-size: 10px;
	font-weight: 700; letter-spacing: var(--wp--custom--mono-tracking); text-decoration: none;
}
/* Jahresberichte — header + download rows */
.jahresberichte { margin-top: 32px; }
.jb-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 16px; }
.jb-head h3 {
	font-family: var(--f-display); font-weight: 700; font-size: clamp(20px, 2.2vw, 24px);
	letter-spacing: -0.015em; margin: 0;
}
.jb-since {
	font-family: var(--f-mono); font-weight: 500; font-size: 11px; letter-spacing: var(--wp--custom--mono-tracking);
	color: var(--wp--preset--color--ink-soft); margin: 0;
}
.download-rows { display: grid; grid-template-columns: 1fr; gap: 12px; }
@media (min-width: 1000px) { .download-rows { grid-template-columns: repeat(3, 1fr); } }
.download-row {
	display: flex; align-items: center; gap: 14px; padding: 16px 18px;
	border: 1px solid var(--wp--preset--color--rule); border-radius: 12px;
	background: var(--wp--preset--color--bg); text-decoration: none; color: var(--wp--preset--color--ink);
}
/* card-style anchor: border is the hover affordance — opt out of the global link underline. */
.download-row:hover, .download-row:focus-visible { border-color: var(--wp--preset--color--blue); text-decoration: none; }
.dl-badge {
	min-width: 40px; height: 44px; padding: 0 8px; border-radius: 6px; flex-shrink: 0;
	background: var(--wp--preset--color--yellow-soft); color: var(--wp--preset--color--blue-deep);
	display: inline-flex; align-items: center; justify-content: center;
	font-family: var(--f-mono); font-size: 13px; font-weight: 700; letter-spacing: 0.04em;
}
.dl-text { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.dl-title { font-size: 14px; font-weight: 600; color: var(--wp--preset--color--ink); }
.dl-meta { font-size: 10.5px; color: var(--wp--preset--color--ink-soft); }
.dl-arrow { color: var(--wp--preset--color--blue); font-size: 16px; flex-shrink: 0; }
.jb-note {
	margin-top: 16px; font-size: 13px; line-height: 1.5; color: var(--wp--preset--color--ink-soft);
}
.jb-note a { color: var(--wp--preset--color--blue); }
.jb-note a:hover, .jb-note a:focus-visible { color: var(--wp--preset--color--blue-deep); }

/* ════════════════════════════════════════════════════════════════════════
   PAGE — Mitmachen (page-mitmachen)
   Offset hero (shared above), role cards, signup preview + aside, partner CTA
   cards + dark band, newsletter band, contact preview + info aside.
   ════════════════════════════════════════════════════════════════════════ */

/* ── Hero — copy left / offset photo grid right (grid + .hero-photos.offset
   shared above) ────────────────────────────────────────────────────────── */
.hero-mitmachen .grid { grid-template-columns: 1fr; }
@media (min-width: 1000px) { .hero-mitmachen .grid { grid-template-columns: 1.1fr 1fr; } }
.hero-mitmachen .hero-copy .kicker { margin-bottom: 14px; }

/* ── 01 Ehrenamt — text-only role cards (4-up single row at desktop) ─────── */
.role-grid { display: grid; grid-template-columns: 1fr; gap: 14px; }
@media (min-width: 600px) { .role-grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1000px) { .role-grid { grid-template-columns: repeat(4, 1fr); } }
.role-card {
	position: relative; overflow: hidden;
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius);
	padding: 28px 24px 24px;
	display: flex; flex-direction: column; gap: 12px;
}
.role-card::before {
	content: ""; position: absolute; top: 0; left: 0; right: 0; height: 4px;
}
/* Per-theme accent bar — secondary/Bereich scheme shared with the Projekt cards
   (hilfe=red · ankommen=blue · kultur=yellow · stimme=ink). The single mono line is
   the time-commitment only; the „01 · ROLLE" index was dropped (two mono labels
   crowded + wrapped on the narrow 4-up cards). The commitment stays neutral ink-soft
   and the bar carries the colour — like the Projekt cards' neutral meta + accent marker. */
.role-card.t-hilfe::before    { background: var(--wp--custom--accent--hilfe); }
.role-card.t-ankommen::before { background: var(--wp--custom--accent--ankommen); }
.role-card.t-kultur::before   { background: var(--wp--custom--accent--kultur); }
.role-card.t-stimme::before   { background: var(--wp--custom--accent--stimme); }
.role-meta { display: flex; align-items: center; gap: 12px; }
/* 600, not the archetype's 700 — as the card's sole mono eyebrow the heavier tag
   weight read too bold; 600 sits between the 500 regular tier and the 700 badges. */
.role-commit { color: var(--wp--preset--color--ink-soft); margin: 0; font-weight: 600; }
.role-card h3 {
	font-family: var(--f-display); font-weight: 700; font-size: 22px;
	letter-spacing: -0.015em; line-height: 1.15; margin: 0;
	/* German compounds (e.g. „Veranstaltungsorganisation“) must wrap, not clip,
	   in the narrow 4-up column — card has overflow:hidden. */
	overflow-wrap: break-word; hyphens: auto;
}
.role-card p { font-size: 13.5px; line-height: 1.55; color: var(--wp--preset--color--ink-soft); margin: 0; }

/* ── 02 Anmelden — non-submittable signup preview + aside + F4 fallback ──── */
.signup-grid { display: grid; grid-template-columns: 1fr; gap: 14px; }
@media (min-width: 1000px) { .signup-grid { grid-template-columns: 1.2fr 1fr; gap: clamp(24px, 3vw, 40px); align-items: start; } }
.signup-form {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg);
	padding: clamp(24px, 3vw, 36px);
}
.signup-form .kicker { margin-block-start: 0; margin-inline: 0; } /* bottom via canonical eyebrow→heading rule (H2 → 12px) */
.signup-form h2 {
	font-family: var(--f-display); font-weight: 700; font-size: clamp(24px, 3vw, 32px);
	letter-spacing: -0.02em; line-height: 1.1; margin: 10px 0 6px;
}
.signup-intro, .contact-note, .signup-note {
	font-size: 14px; line-height: 1.55; color: var(--wp--preset--color--ink-soft);
}
.signup-intro { margin: 0 0 24px; max-width: 520px; }
/* Help-area chips (disabled, non-interactive) */
.help-block { margin-top: 22px; }
.help-label { display: block; color: var(--wp--preset--color--ink-soft); margin-bottom: 10px; }
.help-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.help-chip {
	padding: 9px 16px; border-radius: var(--wp--custom--pill-radius);
	border: 1px solid var(--wp--preset--color--rule); background: transparent;
	font-size: 13.5px; font-weight: 500; color: var(--wp--preset--color--ink-soft);
}
.help-chip.is-on {
	border-color: var(--wp--preset--color--yellow); background: var(--wp--preset--color--yellow);
	color: var(--wp--preset--color--ink); font-weight: 600; opacity: 1;
}
.help-chip.is-on::before { content: "\2713\00a0"; }
.signup-note { margin: 14px 0 0; font-size: 11px; }

/* Aside: direct-contact (F4 fallback, yellow) + steps card */
.signup-aside { display: flex; flex-direction: column; gap: 14px; }
.kicker-on-yellow { color: var(--wp--preset--color--blue-deep); }
.direct-card {
	background: var(--wp--preset--color--yellow);
	border-radius: var(--wp--custom--card-radius-lg); padding: 26px;
}
.direct-card .kicker { margin-block-start: 0; margin-inline: 0; } /* bottom via canonical rule (H3 → 8px) */
.direct-card h3 {
	font-family: var(--f-display); font-weight: 700; font-size: 22px;
	letter-spacing: -0.015em; line-height: 1.15; margin: 0 0 8px;
	color: var(--wp--preset--color--ink);
}
.direct-card p:not(.kicker) { font-size: 13.5px; line-height: 1.5; color: var(--wp--preset--color--blue-deep); margin: 0; }
.direct-links { margin-top: 18px; display: flex; flex-direction: column; gap: 10px; }
/* Links sit on the yellow card → inherit the card foreground, never theme.json blue (a11y). */
.direct-link {
	display: flex; flex-direction: column; gap: 2px;
	padding: 12px 16px; border-radius: 12px;
	background: rgba(255, 255, 255, 0.55); border: 1px solid rgba(255, 255, 255, 0.7);
	color: var(--wp--preset--color--ink); text-decoration: none;
}
/* card-style anchor: background is the card affordance + the .dl-value underline below is
   the scoped link cue — opt the whole card out of the global link underline. */
.direct-link:hover, .direct-link:focus-visible { background: rgba(255, 255, 255, 0.8); text-decoration: none; }
.direct-link:hover .dl-value, .direct-link:focus-visible .dl-value { text-decoration: underline; }
.dl-label { color: var(--wp--preset--color--blue-deep); }
.dl-value { font-weight: 700; font-size: 14px; color: var(--wp--preset--color--ink); }
.steps-card {
	background: var(--wp--preset--color--bg);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg); padding: 26px;
}
.steps-kicker { color: var(--wp--preset--color--ink-soft); margin: 0; }
.steps-list { list-style: none; margin: 14px 0 0; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.steps-list li {
	display: grid; grid-template-columns: 28px 1fr; gap: 12px; align-items: start;
	font-size: 13.5px; line-height: 1.5; color: var(--wp--preset--color--ink);
}
.steps-list .step-n {
	width: 24px; height: 24px; border-radius: 50%;
	background: var(--wp--preset--color--blue); color: var(--wp--preset--color--paper);
	font-family: var(--f-mono); font-size: 11px; font-weight: 700;
	display: inline-flex; align-items: center; justify-content: center;
}

/* ── 03 Partner — CTA cards (3) + dark CTA band ─────────────────────────── */
.partner-cta-grid { display: grid; grid-template-columns: 1fr; gap: 14px; }
@media (min-width: 600px) { .partner-cta-grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1000px) { .partner-cta-grid { grid-template-columns: repeat(3, 1fr); } }
.partner-cta-card {
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg); padding: 28px;
	display: flex; flex-direction: column; justify-content: space-between; gap: 22px;
	min-height: 300px;
}
.partner-cta-card.tone-paper { background: var(--wp--preset--color--bg); }
.partner-cta-card.tone-yellow { background: var(--wp--preset--color--yellow); border-color: var(--wp--preset--color--yellow); }
.partner-cta-card.tone-sky { background: var(--wp--custom--accent--ankommen-soft); }
.pcc-top { display: flex; align-items: center; justify-content: space-between; }
.pcc-icon { font-size: 22px; line-height: 1; color: var(--wp--preset--color--ink); margin: 0; }
.pcc-idx { font-family: var(--f-mono); font-weight: 500; font-size: 11px; color: var(--wp--preset--color--ink-soft); letter-spacing: 0.08em; margin: 0; }
.pcc-eyebrow { margin: 22px 0 0; color: var(--wp--preset--color--blue); }
.partner-cta-card.tone-yellow .pcc-eyebrow { color: var(--wp--preset--color--blue-deep); }
/* ink-soft on yellow is only 4.18:1 (sub-AA); deepen the index to blue-deep (8:1). */
.partner-cta-card.tone-yellow .pcc-idx { color: var(--wp--preset--color--blue-deep); }
.partner-cta-card h3 {
	font-family: var(--f-display); font-weight: 700; font-size: 24px;
	letter-spacing: -0.015em; line-height: 1.1; margin: 0 0 12px; /* top gap via canonical rule */
}
.partner-cta-card p:not(.pcc-eyebrow) { font-size: 14px; line-height: 1.55; color: var(--wp--preset--color--ink); margin: 0; }
.partner-cta-card.tone-paper p, .partner-cta-card.tone-sky p { color: var(--wp--preset--color--ink-soft); }
/* CTA link inherits the card foreground (ink on every tone here), never theme.json blue (a11y). */
.pcc-cta { margin: 0; }
.pcc-cta a {
	display: inline-flex; align-items: center; gap: 8px;
	font-weight: 700; font-size: 14px; color: var(--wp--preset--color--ink); text-decoration: none;
}
.pcc-cta a:hover, .pcc-cta a:focus-visible { text-decoration: underline; }

/* Dark CTA band (existing partners + yellow CTA) */
.cta-band {
	margin-top: 24px; background: var(--wp--preset--color--ink); color: var(--wp--preset--color--paper);
	border-radius: 22px; padding: clamp(24px, 3vw, 32px);
	display: grid; grid-template-columns: 1fr; gap: 24px; align-items: center;
}
@media (min-width: 1000px) { .cta-band { grid-template-columns: 1.6fr 1fr; gap: 40px; } }
.cta-band-eyebrow { color: var(--wp--preset--color--yellow); margin: 0; }
.cta-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
.cta-chip {
	padding: 8px 14px; border-radius: 8px; border: 1px solid rgba(255, 255, 255, 0.18);
	font-family: var(--f-mono); font-weight: 500; font-size: 12px; letter-spacing: 0.02em; color: #fff;
}
.cta-chip-add {
	background: rgba(255, 255, 255, 0.08); border: 1px dashed var(--wp--preset--color--yellow);
	color: var(--wp--preset--color--yellow);
}
.cta-band-actions { display: flex; }
@media (min-width: 1000px) { .cta-band-actions { justify-content: flex-end; } }

/* ── Newsletter band (dark, non-submittable; mirrors footer .nl) ─────────── */
.newsletter-band { background: var(--wp--preset--color--ink); color: #fff; }
.newsletter-band .wrap { padding-block: clamp(40px, 4.5vw, 64px); }
.nlb-grid { display: grid; grid-template-columns: 1fr; gap: 24px; align-items: center; }
@media (min-width: 1000px) { .nlb-grid { grid-template-columns: 1.4fr 1fr; gap: clamp(32px, 4vw, 56px); } }
.nlb-eyebrow { color: var(--wp--preset--color--yellow); margin: 0; }
.newsletter-band h2 {
	font-family: var(--f-display); font-weight: 700; font-size: clamp(28px, 3.6vw, 40px);
	letter-spacing: -0.025em; line-height: 1.05; color: #fff; margin: 12px 0 16px;
}
.nlb-copy p:not(.nlb-eyebrow) { font-size: 16px; line-height: 1.55; color: #b3bdd4; margin: 0; max-width: 520px; }
.nlb-form { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
.nlb-form input {
	flex: 1; min-width: 200px; padding: 13px 14px; border-radius: 10px;
	border: 1px solid rgba(255, 255, 255, 0.18); background: rgba(255, 255, 255, 0.05);
	color: #fff; font-family: inherit; font-size: 14px;
}
.nlb-form input[disabled] { opacity: 0.55; cursor: not-allowed; }
.nlb-soon { font-size: 11px; color: #b3bdd4; }

/* ── Kontakt block (Mitmachen) — preview form + info aside (F4 fallback) ──── */
.contact-form {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg); padding: clamp(24px, 3vw, 36px);
}
.topic-block { margin-bottom: 24px; }
.topic-label { display: block; color: var(--wp--preset--color--ink-soft); margin-bottom: 10px; }
.topic-pills { display: flex; flex-wrap: wrap; gap: 8px; }
.topic-pill {
	padding: 9px 16px; border-radius: var(--wp--custom--pill-radius);
	border: 1px solid var(--wp--preset--color--rule); background: transparent;
	font-size: 13.5px; font-weight: 500; color: var(--wp--preset--color--ink-soft);
}
.topic-pill.is-on {
	border-color: var(--wp--preset--color--yellow); background: var(--wp--preset--color--yellow);
	color: var(--wp--preset--color--ink); font-weight: 600; opacity: 1;
}
.contact-note { margin: 14px 0 0; font-size: 11px; }
.contact-info {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius); padding: 24px;
}
.ci-kicker { color: var(--wp--preset--color--ink-soft); margin: 0; }
.ci-name { font-family: var(--f-display); font-weight: 700; font-size: 20px; letter-spacing: -0.01em; margin: 6px 0 0; }
.ci-role { font-size: 11.5px; color: var(--wp--preset--color--ink-soft); margin: 4px 0 0; }
.ci-rows {
	display: grid; grid-template-columns: 96px 1fr; row-gap: 8px; column-gap: 12px;
	margin: 18px 0 0; font-size: 14px; font-family: var(--f-mono); font-weight: 500;
}
.ci-rows dt { color: var(--wp--preset--color--ink-soft); margin: 0; }
.ci-rows dd { margin: 0; line-height: 1.5; color: var(--wp--preset--color--ink); }
/* Real channel links keep theme.json blue here (light card, AA contrast), underline on hover. */
.ci-rows dd a { color: var(--wp--preset--color--blue); text-decoration: none; }
.ci-rows dd a:hover, .ci-rows dd a:focus-visible { text-decoration: underline; }
.ci-visit { margin-top: 20px; padding-top: 18px; border-top: 1px dashed var(--wp--preset--color--rule); }
.ci-visit-label { color: var(--wp--preset--color--ink-soft); margin: 0 0 6px; }
.ci-visit p:not(.ci-visit-label) { font-size: 13.5px; line-height: 1.5; color: var(--wp--preset--color--ink); margin: 0; }

/* ════════════════════════════════════════════════════════════════════════
   PAGE — Spenden (page-spenden)
   Hero (lede-in-aside), Wohin accent-bar cards, Geldspende dark + yellow bank
   box, Sachspenden link card, Reassurance trio.
   ════════════════════════════════════════════════════════════════════════ */

/* ── Hero — lede + actions in the right column (ledeInAside) ─────────────── */
.hero-spenden h1 { font-size: clamp(40px, 8vw, 76px); }
.hero-spenden .hero-aside { gap: 22px; }
.hero-spenden .hero-aside .lede { margin-top: 0; max-width: 460px; }
.hero-spenden .hero-aside .actions { margin-top: 0; }
@media (min-width: 1000px) {
	.hero-spenden .grid { grid-template-columns: 1.1fr 1fr; align-items: end; }
}

/* ── sec-head H2 inline en-dash (muted, weight matched) ─────────────────── */
.sec-head h2 .dash { color: var(--wp--preset--color--ink-soft); font-weight: 700; }

/* ── Wohin — accent-bar theme cards (white card, left accent bar) ────────── */
.bar-cards { display: grid; grid-template-columns: 1fr; gap: 16px; }
@media (min-width: 600px) { .bar-cards { grid-template-columns: 1fr 1fr; } }
.theme-card-bar {
	position: relative; overflow: hidden;
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg);
	padding: 28px 28px 28px 32px;
	display: flex; flex-direction: column; gap: 8px; min-height: 220px; /* card rhythm = eyebrow→h3 tier (8px) */
}
.theme-card-bar::before {
	content: ""; position: absolute; top: 0; left: 0; bottom: 0; width: 6px;
}
.theme-card-bar.t-hilfe::before { background: var(--wp--custom--accent--hilfe); }
.theme-card-bar.t-ankommen::before { background: var(--wp--custom--accent--ankommen); }
.theme-card-bar h3 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.015em;
	line-height: 1.1; font-size: clamp(24px, 3vw, 28px); margin: 0;
}
.theme-card-bar p:not(.bar-eyebrow) { font-size: 15px; line-height: 1.55; color: var(--wp--preset--color--ink-soft); margin: 0; }

/* Shared accent eyebrow (mono dot + label) — Wohin / Sachspenden / Reassurance */
.bar-eyebrow {
	display: inline-flex; align-items: center; gap: 8px;
	color: var(--wp--preset--color--ink-soft); margin: 0;
}
.bar-eyebrow .dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; flex-shrink: 0; }
.t-hilfe > .bar-eyebrow { color: var(--wp--preset--color--red); }
.t-ankommen > .bar-eyebrow { color: var(--wp--preset--color--blue); }

/* ── Geldspende — dark section + yellow bank box ─────────────────────────── */
.geldspende { scroll-margin-top: var(--header-h); }
.geld-panel {
	background: var(--wp--preset--color--ink); color: #fff;
	border-radius: 22px; overflow: hidden;
	display: grid; grid-template-columns: 1fr;
}
@media (min-width: 1000px) { .geld-panel { grid-template-columns: 1fr 1.05fr; } }
.geld-copy {
	padding: clamp(28px, 4vw, 44px);
	display: flex; flex-direction: column; justify-content: space-between;
}
.kicker.on-ink { color: var(--wp--preset--color--yellow); }
.geld-copy h2 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.025em;
	line-height: 1.05; font-size: clamp(28px, 3.6vw, 40px); color: #fff;
	margin: 0 0 16px; /* eyebrow→h2 gap via canonical rule */
}
.geld-copy h2 .em-yellow { color: var(--wp--preset--color--yellow); }
.geld-copy > p:not(.kicker) { font-size: 15.5px; line-height: 1.6; color: #b3bdd4; margin: 0; max-width: 460px; }
.geld-copy .geld-fine { font-size: 13.5px; line-height: 1.6; color: #b3bdd4; margin: 14px 0 0; max-width: 460px; }
.geld-assure {
	display: flex; flex-wrap: wrap; gap: 10px 18px; margin-top: 32px;
	font-family: var(--f-mono); font-weight: 500; font-size: 11px;
	letter-spacing: var(--wp--custom--mono-tracking); color: #b3bdd4;
}
.geld-assure .assure { display: inline-flex; align-items: center; gap: 8px; margin: 0; }
.geld-assure .tick { width: 7px; height: 7px; border-radius: 50%; background: var(--wp--preset--color--yellow); flex-shrink: 0; }
.bank-box {
	background: var(--wp--preset--color--yellow); color: var(--wp--preset--color--ink);
	padding: clamp(28px, 4vw, 44px);
	display: flex; flex-direction: column;
}
.bank-eyebrow { color: var(--wp--preset--color--blue-deep); margin: 0; }
.bank-rows {
	margin-top: 18px;
	display: grid; grid-template-columns: 1fr; gap: 4px 16px;
	font-family: var(--f-mono); font-weight: 500; font-size: 13.5px; line-height: 1.5;
}
@media (min-width: 600px) { .bank-rows { grid-template-columns: 104px 1fr; row-gap: 14px; align-items: baseline; } }
/* blue-deep (8:1 on yellow) — ink-soft would fail AA on the yellow box (4.18:1). */
.bank-rows .bank-k {
	color: var(--wp--preset--color--blue-deep); letter-spacing: var(--wp--custom--mono-tracking);
	margin: 8px 0 0; font-size: 11px;
}
@media (min-width: 600px) { .bank-rows .bank-k { margin: 0; font-size: 13.5px; } }
.bank-rows .bank-v { margin: 0; color: var(--wp--preset--color--ink); }
.bank-rows .bank-v.strong { font-weight: 600; }
.bank-rows .bank-v.iban { font-weight: 700; font-size: 15px; letter-spacing: 0.04em; }
.bank-actions { margin: 26px 0 0; }
.bank-paypal {
	display: inline-flex; align-items: center; gap: 8px;
	background: var(--wp--preset--color--ink); color: var(--wp--preset--color--paper);
	padding: 12px 18px; border-radius: var(--wp--custom--pill-radius);
	font-weight: 700; font-size: 13.5px; text-decoration: none; white-space: nowrap;
}
.bank-paypal:hover, .bank-paypal:focus-visible { text-decoration: underline; color: var(--wp--preset--color--paper); }

/* ── Sachspenden — link card (photo + body) ─────────────────────────────── */
.link-card {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: 22px; overflow: hidden;
	display: grid; grid-template-columns: 1fr;
}
@media (min-width: 1000px) { .link-card { grid-template-columns: 320px 1fr; } }
.link-card .link-card-photo { border-radius: 0; min-height: 200px; height: 100%; }
.link-card-body {
	padding: clamp(24px, 3vw, 36px);
	display: flex; flex-direction: column; gap: 12px;
}
.link-card-body h2 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.02em;
	line-height: 1.05; font-size: clamp(26px, 3.4vw, 32px); margin: 0;
}
/* Title + "more" links carry the card's own foreground (not the global blue),
   so they read on the white card; underline-on-interaction is the affordance. */
.link-card-body h2 a { color: var(--wp--preset--color--ink); text-decoration: none; }
.link-card-body h2 a:hover, .link-card-body h2 a:focus-visible { text-decoration: underline; }
.link-card-body p:not(.bar-eyebrow) { font-size: 15.5px; line-height: 1.6; color: var(--wp--preset--color--ink-soft); margin: 0; }
.link-card-more { margin: 6px 0 0; }
.link-card-more a {
	display: inline-flex; align-items: center; gap: 8px;
	color: var(--wp--preset--color--blue); font-weight: 700; font-size: 14px; text-decoration: none;
}
.link-card-more a:hover, .link-card-more a:focus-visible { text-decoration: underline; }

/* ── Reassurance trio — 3 info cards ────────────────────────────────────── */
.reassure-grid { display: grid; grid-template-columns: 1fr; gap: 16px; }
@media (min-width: 600px) { .reassure-grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1000px) { .reassure-grid { grid-template-columns: repeat(3, 1fr); } }
.reassure-card {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg);
	padding: 28px;
	display: flex; flex-direction: column; justify-content: space-between; gap: 18px;
	min-height: 200px;
}
.reassure-top { display: flex; flex-direction: column; gap: 8px; } /* card rhythm = eyebrow→h3 tier (8px) */
.reassure-card h3 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.015em;
	line-height: 1.1; font-size: clamp(22px, 2.6vw, 24px); margin: 0;
}
.reassure-card p:not(.bar-eyebrow) { font-size: 14px; line-height: 1.55; color: var(--wp--preset--color--ink-soft); margin: 0; }
.reassure-card.a-ankommen > .reassure-top > .bar-eyebrow { color: var(--wp--preset--color--blue); }
.reassure-card.a-kultur > .reassure-top > .bar-eyebrow { color: var(--wp--preset--color--blue-deep); }
/* Eyebrow TEXT is blue-deep (yellow fails AA on white), but the accent DOT should
   stay yellow — currentColor would tint it blue-deep too. Hairline ring so yellow
   reads on the white card (mirrors the .t-kultur meta-dot treatment). */
.reassure-card.a-kultur > .reassure-top > .bar-eyebrow .dot {
	background: var(--wp--preset--color--yellow);
	box-shadow: inset 0 0 0 1px var(--wp--preset--color--rule);
}
.reassure-card.a-hilfe > .reassure-top > .bar-eyebrow { color: var(--wp--preset--color--red); }
.reassure-cta { margin: 0; }
.reassure-cta a {
	display: inline-flex; align-items: center; gap: 8px;
	color: var(--wp--preset--color--blue); font-weight: 600; font-size: 13.5px; text-decoration: none;
}
.reassure-cta a:hover, .reassure-cta a:focus-visible { text-decoration: underline; }

/* ════════════════════════════════════════════════════════════════════════
   PAGE — Kontakt (page-kontakt)
   Offset hero + shared .contact-grid (above). Adds the form-PREVIEW card (left)
   and the LIVE ink contact panel (right).
   ════════════════════════════════════════════════════════════════════════ */

/* ── LEFT — non-submittable form PREVIEW card (F3) ──────────────────────── */
.contact-form-card {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg);
	padding: clamp(22px, 3vw, 36px);
}
.cf-eyebrow { color: var(--wp--preset--color--blue); margin: 0; }
.contact-form-card h3 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.02em;
	line-height: 1.1; font-size: clamp(22px, 2.4vw, 28px);
	color: var(--wp--preset--color--ink); margin: 0 0 8px; /* top gap via canonical rule */
}
.cf-intro {
	font-size: var(--wp--preset--font-size--small); line-height: 1.55;
	color: var(--wp--preset--color--ink-soft); margin: 0 0 24px; max-width: 46ch;
}
.cf-fields { display: grid; grid-template-columns: 1fr; gap: 16px; }
@media (min-width: 600px) { .cf-fields { grid-template-columns: 1fr 1fr; } }
.cf-field { margin: 0; display: flex; flex-direction: column; gap: 6px; }
.cf-field.cf-full { grid-column: 1 / -1; }
.cf-field label {
	font-family: var(--f-mono); font-weight: 500; font-size: 12px; letter-spacing: var(--wp--custom--mono-tracking);
	text-transform: uppercase; color: var(--wp--preset--color--ink-soft);
}
/* Volunteer form's [checkbox interests] / [radio frequency] are wrapped in
   <fieldset class="cf-field cf-full"><legend>…</legend>. The browser-default
   <legend> is bold-sans + UA padding/border on the parent fieldset; reset the
   fieldset chrome and mirror the .cf-field label typography on <legend> so the
   group caption reads consistently with sibling field labels (validation pass
   css-3). */
.cf-field fieldset,
fieldset.cf-field {
	border: 0; padding: 0; margin: 0; min-width: 0;
}
.cf-field legend {
	font-family: var(--f-mono); font-weight: 500; font-size: 12px; letter-spacing: var(--wp--custom--mono-tracking);
	text-transform: uppercase; color: var(--wp--preset--color--ink-soft);
	margin-bottom: 0; /* parent .cf-field flex gap (6px) handles the vertical rhythm */
	padding: 0;
}
.cf-field .cf-opt { text-transform: none; letter-spacing: 0; opacity: 0.85; }
/* a11y (forms-a11y-audit F1+F6): the newsletter form reuses .cf-field/.cf-lang markup on
   the dark ink band (footer .nl + page .newsletter-band), where the base ink-soft label
   color (#54607a) fails AA (2.5:1). Lift labels/legends to the on-ink token (#b3bdd4 =
   8.38:1 on #16223d). Scoped under the dark ancestors so the light-surface contact form
   labels are untouched. F6: CF7's near-black .wpcf7-spinner is invisible on the band —
   recolor it to the brand yellow. */
.site-footer .nl .cf-field label,
.site-footer .nl .cf-field legend,
.newsletter-band .cf-field label,
.newsletter-band .cf-field legend { color: #b3bdd4; }
.site-footer .nl .wpcf7-spinner,
.newsletter-band .wpcf7-spinner { background-color: var(--wp--preset--color--yellow); }
.cf-field input,
.cf-field select,
.cf-field textarea {
	width: 100%; padding: 12px 14px; border-radius: 10px;
	border: 1px solid var(--wp--preset--color--rule);
	background: var(--wp--preset--color--bg);
	color: var(--wp--preset--color--ink);
	font-family: inherit; font-size: 14px; line-height: 1.4;
}
.cf-field textarea { resize: vertical; min-height: 96px; }
/* Disabled = preview state: dimmed + not-allowed, labels above stay full-contrast. */
.cf-field input[disabled],
.cf-field select[disabled],
.cf-field textarea[disabled] { opacity: 0.6; cursor: not-allowed; }
/* ── Select caret + topic lead-question lift (forms-corrections F10/F11; topic →
   pills, design-review 2026-06-20) ──────────────────────────────────────────
     1. .cf-field select — replace the native browser caret with an inline ink
        chevron (a brand affordance). Now serves the volunteer LANGUAGE select;
        the contact topic moved to pills. CF7's emitted select carries
        .wpcf7-form-control + .wpcf7-select but inherits .cf-field select geometry,
        so this rule reaches it.
     2. .cf-topic > legend — the contact topic is the routing decision: keep its
        caption lifted from the mono-cap-12px group-legend default to a 14px
        sentence-case ink read (the "Worum geht es?" lead question) above the
        pill cluster. */
.cf-field select {
	appearance: none; -webkit-appearance: none;
	font-family: var(--f-body);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath fill='none' stroke='%2316223d' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round' d='M1 1.5l5 5 5-5'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 14px center;
	background-size: 12px 8px;
	padding-right: 40px;
}
.cf-topic > legend {
	font-family: var(--f-display); font-weight: 600;
	font-size: 14px; letter-spacing: -0.005em;
	text-transform: none;
	color: var(--wp--preset--color--ink);
}
/* Non-submittable submit affordance (no <button>, no type=submit — F3). */
.cf-submit {
	display: inline-flex; align-items: center; justify-content: center; gap: 10px;
	margin-top: 24px; width: 100%; padding: 15px 24px;
	border-radius: var(--wp--custom--pill-radius);
	background: var(--wp--preset--color--ink); color: var(--wp--preset--color--paper);
	font-weight: 600; font-size: 15px; opacity: 0.5; cursor: not-allowed;
	user-select: none;
}
.cf-soon {
	margin: 12px 0 0; font-family: var(--f-mono); font-weight: 500; font-size: 11.5px;
	letter-spacing: var(--wp--custom--mono-tracking);
	color: var(--wp--preset--color--ink-soft);
}

/* ════════════════════════════════════════════════════════════════════════════
   FORMS — live CF7 chrome (phase 8 forms-corrections, F3/F4/F6/M2)

   The four form surfaces (kontakt, mitmachen-kontakt, volunteer/anmelden,
   newsletter band, footer mini-form) seed CF7 forms whose markup lives INSIDE
   our theme-authored <p class="cf-field"> / <p class="cf-actions"> /
   <p class="cf-consent"> / <fieldset class="cf-field cf-full"> wrappers. CF7
   itself emits `.wpcf7-form-control`, `.wpcf7-submit`, `.wpcf7-list-item`,
   `.wpcf7-acceptance`, `.wpcf7-not-valid-tip`, `.wpcf7-response-output`.

   Naming hygiene (post-C11 validation pass refined the original P2-C):
     - `.cf-actions`, `.cf-consent` are THEME MARKUP CLASSES on the wrapping
       <p>/<fieldset> in FormTemplates.php — descendant CSS reaches CF7's
       emitted controls because CF7 leaves theme-authored wrappers alone.
     - `.cf-chips` is a CF7 FORM-TAG CLASS OPTION (`class:cf-chips` on the
       [checkbox]/[radio] tag). CF7 lands it directly on the rendered
       `<span class="wpcf7-form-control wpcf7-checkbox cf-chips">`, so the
       flex-container rule below targets that span itself, not as a
       descendant. The list-item descendant rules still work normally.

   The <label>:has(input:checked) selector requires CF7's `use_label_element`
   form-tag option — without it CF7 emits sibling <input> + <span> instead
   of <label><input>…</label> and the chip's selected-state never lights up
   (adversarial review P1-B).

   The placeholder F3 fallback (`<span class="cf-submit">`, `.help-chip`,
   `.consent-row .box.is-checked`) stays styled in its own block above and
   stays untouched here — different surface, different markup contract. Both
   live (P2-B): the seeder failure path keeps the placeholder rendering
   brand-correctly.
   ──────────────────────────────────────────────────────────────────────── */

/* ── Submit — live form (F3) ────────────────────────────────────────────────
   Mirrors .btn-ink at .btn.lg sizing. Inline-flex, RIGHT-aligned in cf-actions
   (the F4 audit's anti-AI-slop rule: full-width primary actions on paper cards
   are the giveaway — keep submits compact + right-aligned, like .cl-cta does).
   The submit STAYS ACTIVE at rest: every form sets `acceptance_as_validation: on`
   (FormTemplates::additionalSettings), so an unchecked consent box validates on
   submit (inline accept_terms) instead of disabling submit. The :disabled rule
   below now only paints CF7's brief submitting state, not the privacy gate. */
.cf-actions {
	margin-top: 24px;
	display: flex; justify-content: flex-end; flex-wrap: wrap; gap: 12px;
}
/* CF7's `.wpcf7-spinner` is a flex sibling rendered AFTER the submit (visibility:hidden at rest
   but still taking space). With justify-content:flex-end it claimed the rightmost slot and shoved
   the compact submit ~72px left of the field edge — reading as neither centered nor flush right.
   Order the spinner before the submit so the button snaps flush to the right edge; the spinner
   then shows just left of the label while sending. Applies to every form — the paper-card submits
   and the newsletter pills+submit row alike. */
.cf-actions .wpcf7-spinner { order: -1; }
.cf-actions input.wpcf7-submit {
	display: inline-flex; align-items: center; justify-content: center; gap: 10px;
	/* Neutralize legacy `.nl input { flex:1; min-width:200px }` and `.nlb-form input { flex:1; min-width:200px }`
	   cascading into our submit on the dark band/footer (validation pass css-1). The compact
	   right-aligned shape is intentional — full-width primary CTAs on paper cards is the AI-slop
	   giveaway. */
	flex: 0 0 auto; min-width: 0;
	padding: 14px 28px;
	border: 0; border-radius: var(--wp--custom--pill-radius);
	background: var(--wp--preset--color--ink); color: var(--wp--preset--color--paper);
	font-family: inherit; font-weight: 600; font-size: 15px; line-height: 1.2;
	letter-spacing: -0.01em;
	cursor: pointer;
	transition: background-color 120ms ease;
}
.cf-actions input.wpcf7-submit:hover,
.cf-actions input.wpcf7-submit:focus-visible {
	background: var(--wp--preset--color--blue);
	outline: none;
}
.cf-actions input.wpcf7-submit:focus-visible {
	box-shadow: 0 0 0 3px var(--wp--preset--color--bg), 0 0 0 5px var(--wp--preset--color--blue);
}
.cf-actions input.wpcf7-submit:disabled {
	opacity: 0.45; cursor: not-allowed;
	background: var(--wp--preset--color--ink); color: var(--wp--preset--color--paper);
}
/* Dark-surface variants — the dark band + footer scope inverts ink/paper so the
   submit reads on near-black. Yellow on hover keeps the brand pop without
   shifting to blue (which is invisible on ink). */
.newsletter-band .cf-actions input.wpcf7-submit,
.site-footer .nl .cf-actions input.wpcf7-submit {
	background: var(--wp--preset--color--paper); color: var(--wp--preset--color--ink);
}
.newsletter-band .cf-actions input.wpcf7-submit:hover,
.newsletter-band .cf-actions input.wpcf7-submit:focus-visible,
.site-footer .nl .cf-actions input.wpcf7-submit:hover,
.site-footer .nl .cf-actions input.wpcf7-submit:focus-visible {
	background: var(--wp--preset--color--yellow); color: var(--wp--preset--color--ink);
}
/* Dark-surface focus halo — the light-surface halo (cream inner + blue outer) clashes on
   --ink and the blue ring is ~2.37:1 below SC 1.4.11. Mirror the chip/consent precedent
   by switching to ink inner (matches surface) + yellow outer (10.46:1 on --ink, AAA).
   Validation pass 3 css-1. */
.newsletter-band .cf-actions input.wpcf7-submit:focus-visible,
.site-footer .nl .cf-actions input.wpcf7-submit:focus-visible {
	box-shadow: 0 0 0 3px var(--wp--preset--color--ink), 0 0 0 5px var(--wp--preset--color--yellow);
}

/* Dark-surface input chrome — the C4 `.cf-field input` cascade (specificity 0,1,1)
   wins over `.nlb-form input` (0,1,1, source order) and `.nl input` (0,1,1) and
   would paint the band/footer email field with cream + ink (cut-out) instead of
   the transparent-white-on-near-black idiom established by the placeholder.
   Restored at (0,2,1) via the ancestor scope (validation pass css-2). */
.newsletter-band .cf-field input,
.newsletter-band .cf-field input[type="email"],
.site-footer .nl .cf-field input,
.site-footer .nl .cf-field input[type="email"] {
	background: rgba(255, 255, 255, 0.05);
	border: 1px solid rgba(255, 255, 255, 0.18);
	color: #fff;
}
.newsletter-band .cf-field input::placeholder,
.site-footer .nl .cf-field input::placeholder {
	color: rgba(255, 255, 255, 0.55);
}
.newsletter-band .cf-field input:focus-visible,
.site-footer .nl .cf-field input:focus-visible {
	border-color: rgba(255, 255, 255, 0.5);
	outline: 2px solid var(--wp--preset--color--yellow);
	outline-offset: 2px;
}

/* ── Chips — checkbox + radio clusters (F4) ─────────────────────────────────
   Used on volunteer interests ([checkbox]), volunteer frequency + newsletter
   language ([radio]). The <label>:has(input:checked) selector requires
   `use_label_element` on the form-tag (set in C5 / FormTemplates.php) so CF7
   wraps each option in <label>…</label> instead of emitting siblings.

   `.cf-chips` is a CF7 form-tag class option (`class:cf-chips`) that lands
   directly on CF7's emitted wrapper element — `<span class="wpcf7-form-control
   wpcf7-checkbox cf-chips">` (validation pass post-C11 confirmed CF7 puts the
   class on this inner span via checkbox.php's `$tag->get_class_option()`,
   NOT on a theme-side <p>/<fieldset>). So the flex-container rule keys on the
   element ITSELF, not as a descendant. The list-item rules below DO use
   descendant selectors because .wpcf7-list-item is a child of .cf-chips.

   Visually-hide the input via clip-path (NOT display:none — that strips it
   from the accessibility tree). Focus ring lands on the wrapping
   .wpcf7-list-item via :focus-within, NOT on the clipped <input> (its focus
   ring would be clipped along with it on iOS Safari — adversarial review M6 +
   WCAG 2.4.7). */
.cf-chips {
	display: flex; flex-wrap: wrap; gap: 8px;
}
.cf-chips .wpcf7-list-item { margin: 0; }
.cf-chips .wpcf7-list-item label {
	display: inline-flex; align-items: center; gap: 6px;
	padding: 9px 16px; border-radius: var(--wp--custom--pill-radius);
	border: 1px solid var(--wp--preset--color--rule); background: transparent;
	font-size: 13.5px; font-weight: 500; color: var(--wp--preset--color--ink-soft);
	cursor: pointer; user-select: none;
	transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease;
}
.cf-chips .wpcf7-list-item label:hover {
	border-color: var(--wp--preset--color--ink); color: var(--wp--preset--color--ink);
}
.cf-chips .wpcf7-list-item input[type="checkbox"],
.cf-chips .wpcf7-list-item input[type="radio"] {
	position: absolute; width: 1px; height: 1px;
	clip-path: inset(50%); -webkit-clip-path: inset(50%);
	overflow: hidden; white-space: nowrap; pointer-events: none;
}
.cf-chips .wpcf7-list-item label:has(input:checked) {
	border-color: var(--wp--preset--color--yellow);
	background: var(--wp--preset--color--yellow);
	color: var(--wp--preset--color--ink); font-weight: 600;
}
.cf-chips .wpcf7-list-item label:has(input:checked)::before {
	content: "\2713\00a0";
}
/* Focus ring on the WRAPPER (clipped input's own ring is clipped on iOS). */
.cf-chips .wpcf7-list-item:focus-within label {
	outline: 2px solid var(--wp--preset--color--blue);
	outline-offset: 2px;
}
/* Dark-surface chip variants — newsletter band + footer mini-form. Transparent
   inputs on near-black get a hairline white-alpha border; selected stays
   yellow-on-ink (the band's accent). */
.newsletter-band .cf-chips .wpcf7-list-item label,
.site-footer .nl .cf-chips .wpcf7-list-item label {
	border-color: rgba(255, 255, 255, 0.22); color: rgba(255, 255, 255, 0.78);
}
.newsletter-band .cf-chips .wpcf7-list-item label:hover,
.site-footer .nl .cf-chips .wpcf7-list-item label:hover {
	border-color: #fff; color: #fff;
}
.newsletter-band .cf-chips .wpcf7-list-item label:has(input:checked),
.site-footer .nl .cf-chips .wpcf7-list-item label:has(input:checked) {
	border-color: var(--wp--preset--color--yellow);
	background: var(--wp--preset--color--yellow);
	color: var(--wp--preset--color--ink);
}

/* ── Consent — [acceptance] (F4) ────────────────────────────────────────────
   Same use_label_element + :has(input:checked) pattern as cf-chips, but laid
   out as a row (NOT a pill cluster) — the consent text is a sentence, not a
   selectable label. The check renders as a 22×22 ink square with a white ✓,
   mirroring the placeholder's `.consent-row .box.is-checked` geometry. */
.cf-consent { margin-top: 18px; }
.cf-consent .wpcf7-acceptance { display: block; }
.cf-consent .wpcf7-list-item { margin: 0; }
.cf-consent .wpcf7-list-item label {
	display: flex; align-items: flex-start; gap: 12px;
	font-size: 13.5px; line-height: 1.5; color: var(--wp--preset--color--ink-soft);
	cursor: pointer;
}
.cf-consent .wpcf7-list-item label::before {
	content: "";
	flex-shrink: 0; width: 22px; height: 22px; margin-top: 1px;
	border-radius: 5px;
	border: 1px solid var(--wp--preset--color--rule);
	background: var(--wp--preset--color--paper);
	transition: background-color 120ms ease, border-color 120ms ease, box-shadow 120ms ease;
}
.cf-consent .wpcf7-list-item input[type="checkbox"] {
	position: absolute; width: 1px; height: 1px;
	clip-path: inset(50%); -webkit-clip-path: inset(50%);
	overflow: hidden; white-space: nowrap; pointer-events: none;
}
.cf-consent .wpcf7-list-item label:has(input:checked)::before {
	background: var(--wp--preset--color--ink);
	border-color: var(--wp--preset--color--ink);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round' d='M3.5 8.5l3 3 6-6'/%3E%3C/svg%3E");
	background-repeat: no-repeat; background-position: center;
	background-size: 16px 16px;
}
.cf-consent .wpcf7-list-item:focus-within label::before {
	outline: 2px solid var(--wp--preset--color--blue);
	outline-offset: 2px;
}
/* Dark-surface consent variant — newsletter band + footer mini-form. The
   square keeps an ink-on-paper read by inverting (paper-bordered transparent
   square; on check, paper fill + ink check). */
.newsletter-band .cf-consent .wpcf7-list-item label,
.site-footer .nl .cf-consent .wpcf7-list-item label { color: rgba(255, 255, 255, 0.82); }
.newsletter-band .cf-consent .wpcf7-list-item label::before,
.site-footer .nl .cf-consent .wpcf7-list-item label::before {
	border-color: rgba(255, 255, 255, 0.32); background: transparent;
}
.newsletter-band .cf-consent .wpcf7-list-item label:has(input:checked)::before,
.site-footer .nl .cf-consent .wpcf7-list-item label:has(input:checked)::before {
	background: var(--wp--preset--color--paper);
	border-color: var(--wp--preset--color--paper);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%231a1f2e' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round' d='M3.5 8.5l3 3 6-6'/%3E%3C/svg%3E");
	background-repeat: no-repeat; background-position: center;
	background-size: 16px 16px;
}

/* ════════════════════════════════════════════════════════════════════════════
   FORMS — UX polish (item 5, design-ux batch 2026-06-18)
   CSS-only on the live (seeded) CF7 markup, append-only BEFORE the EM-booking
   response-output source-order hazard below (adversarial-review §9.7 — no existing
   rule is moved). Addresses the audit's F1/F2/F4/F7/F8/F9/F10/F12 ("button + checkbox
   positions + text padding off"). F5's first-paint consent hint needs a FormTemplates
   markup change + a re-seed → deferred to a follow-up (TODOS).
   ──────────────────────────────────────────────────────────────────────── */

/* F1/F13/F9: live forms render .cf-field as block-flow children of form.wpcf7-form
   (margin:0) → consecutive fields had ZERO gap, so each label hugged the field above.
   Add inter-field rhythm; the contact grid (F2) resets it since `gap` owns spacing there. */
.wpcf7-form .cf-field + .cf-field { margin-top: 16px; }
/* F7: a touch more air between a chip group's legend and its chips (design WORUM mb:10). */
fieldset.cf-field { gap: 10px; }

/* F2: grid the LIVE contact form (the design 2-col grid lived on the .cf-fields placeholder,
   not on form.wpcf7-form). FULL-WIDTH BY DEFAULT so any CF7-injected child (hidden fieldset,
   response output, hidden inputs, consent, actions) can't land in a stray cell — only paired
   text fields opt into the 2-up (adversarial-review §9.6): name|email, phone|org pair; topic,
   message, consent, actions span full. */
@media (min-width: 600px) {
	.contact-form-card form.wpcf7-form {
		display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: start;
	}
	.contact-form-card form.wpcf7-form > * { grid-column: 1 / -1; }
	.contact-form-card form.wpcf7-form > .cf-field:not(.cf-full) { grid-column: span 1; }
	.contact-form-card form.wpcf7-form > .cf-field + .cf-field { margin-top: 0; }
}

/* Newsletter (dark band + footer) — the proto's SINGLE-PILL capsule (design-review 2026-06-22).
   The email field + submit share one rounded `.nl-inline` capsule (the email input is transparent
   inside it; a visually-hidden label gives the accessible name + a placeholder the visible hint, so
   the form drops the standalone E-Mail label row); the segmented DE/UK toggle is the row below and
   the Datenschutz consent the last row. The form is a plain vertical stack at every width — the
   capsule never needs to split — so NO container query is needed (this replaces the earlier
   container-reflow inline/stacked variant). Just pin CF7's `<div class="wpcf7">` wrapper full-width
   in the band's `.nlb-form` / footer's `.nl .form` ROW-flex parents (built for the old mini-form),
   so the form spans the column instead of shrink-wrapping to its content. Order email → submit →
   language → consent; the required consent validates ON SUBMIT (acceptance_as_validation), so it
   sitting after the in-capsule submit is the WAI/GOV.UK "don't disable submit" pattern, not a gate. */
.newsletter-band .nlb-form > .wpcf7,
.site-footer .nl .form > .wpcf7 { flex: 1 1 100%; width: 100%; min-width: 0; }

.nl-row { display: grid; grid-template-columns: 1fr; row-gap: 14px; }
.nl-row > .nl-inline,
.nl-row > .cf-lang,
.nl-row > .cf-consent { margin: 0; min-width: 0; }

/* The capsule: a rounded pill holding the transparent email input + the submit. */
.nl-inline {
	position: relative;
	display: flex; align-items: center; gap: 6px;
	padding: 4px 4px 4px 6px;
	border: 1px solid rgba(255, 255, 255, 0.14);
	border-radius: var(--wp--custom--pill-radius);
	background: rgba(255, 255, 255, 0.05);
}
/* Validation: CF7 injects `.wpcf7-not-valid-tip` INSIDE the email's `.wpcf7-form-control-wrap`,
   which lives inside the pill — left in flow it grows the capsule tall and jams the message next to
   the submit (codex P2). Pin it absolutely BELOW the capsule, turn the capsule border red on an
   invalid email, and reserve the space below the capsule ONLY while a tip is present (`:has()`), so
   it never overlaps the language row. The dark-surface tip colour comes from the
   `.newsletter-band/.site-footer .wpcf7-not-valid-tip` rule below. */
.nl-inline:has(.wpcf7-not-valid) { border-color: #e8a0a0; }
.nl-inline .wpcf7-not-valid-tip {
	position: absolute; left: 4px; right: 4px; top: calc(100% + 6px); margin: 0;
}
.nl-row:has(.nl-inline .wpcf7-not-valid-tip) > .nl-inline { margin-bottom: 42px; }
.nl-inline:focus-within {
	border-color: rgba(255, 255, 255, 0.5);
	outline: 2px solid var(--wp--preset--color--yellow); outline-offset: 2px;
}
/* `.nl-email` is a real `<p>` (so CF7's autop doesn't wrap a bare <label> in a margin-bearing <p>
   that would inflate the pill). It's the flex child that holds the field; the label, CF7's
   `.wpcf7-form-control-wrap` and the input are plain blocks inside it (the input fills via width
   100%, not nested flex). The wrap is forced static (CF7 sets it relative) so the absolute
   validation tip below anchors to the `.nl-inline` capsule, not the tiny inline wrap. */
.nl-inline > .nl-email { flex: 1 1 0; min-width: 0; margin: 0; }
.nl-inline .nl-email label { display: block; margin: 0; }
.nl-inline .nl-email .wpcf7-form-control-wrap { display: block; position: static; }
.nl-inline .nl-email input[type="email"] {
	width: 100%; min-width: 0; box-sizing: border-box; /* reset the legacy .nlb-form/.nl input
		min-width:200px so the field can shrink inside the pill on a narrow column (codex P2) */
	background: transparent; border: 0; outline: none;
	padding: 10px 14px; color: #fff;
	font-family: inherit; font-size: 14px; line-height: 1.4;
}
.nl-inline .nl-email input::placeholder { color: rgba(255, 255, 255, 0.5); }
.nl-inline > .cf-actions { position: relative; flex: 0 0 auto; margin: 0; }
/* The submit nests inside the pill (its dark-surface paper/yellow colours come from the
   .newsletter-band / .site-footer .cf-actions rules above); a touch smaller to fit the capsule. */
.nl-inline .cf-actions input.wpcf7-submit { padding: 11px 22px; font-size: 14px; }
/* CF7 always emits a `.wpcf7-spinner` next to the submit — visibility:hidden at rest but it STILL
   reserves width, which inside the fixed pill shrinks the email field (codex P2). Take it out of
   flow so it costs no space at rest; it shows just left of the button during submission. */
.nl-inline .cf-actions .wpcf7-spinner {
	position: absolute; right: calc(100% + 4px); top: 50%; margin: 0; transform: translateY(-50%);
}

/* Visually-hidden accessible name for the capsule's email field (the placeholder is the visible
   hint). Standard clip pattern, matching the .cf-chips input hiding. */
.nl-sr-only {
	position: absolute; width: 1px; height: 1px;
	clip-path: inset(50%); -webkit-clip-path: inset(50%);
	overflow: hidden; white-space: nowrap;
}

/* Language row: the eyebrow label + the segmented pill sit inline on one tight line (the pill wraps
   below the label only on a very narrow slot). */
.cf-lang > label {
	display: flex; align-items: center; flex-wrap: wrap; gap: 4px 12px;
}

/* Newsletter language = ONE segmented pill split in half (design-review 2026-06-22). Scoped via
   .cf-lang — the ONLY wrapper unique to the newsletter language field — because .cf-chips itself
   is shared by the contact topic + volunteer interests/frequency clusters, which must stay as
   separate wrapping pills. The two options become equal halves of one capsule: a bordered track
   (the outer pill, 999px) with the selected half filled yellow. inline-grid + grid-auto-columns:1fr
   keeps the halves exactly 50/50 regardless of the DE vs UK label lengths; the redundant ✓ is
   dropped (the fill is the indicator). Placed after the .cf-chips dark rules above so the equal
   per-label specificity resolves in source order. */
.cf-lang .cf-chips {
	display: inline-grid; grid-auto-flow: column; grid-auto-columns: 1fr;
	gap: 0; max-width: 100%; padding: 3px;
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--pill-radius);
	background: transparent;
}
.cf-lang .cf-chips .wpcf7-list-item { margin: 0; }
.cf-lang .cf-chips .wpcf7-list-item label {
	justify-content: center; width: 100%; margin: 0;
	padding: 8px 18px; border: none;
	border-radius: calc(var(--wp--custom--pill-radius) - 3px);
}
.cf-lang .cf-chips .wpcf7-list-item label:has(input:checked)::before { content: none; }
/* Dark-surface track hairline — match the input border on the band + footer. */
.newsletter-band .cf-lang .cf-chips,
.site-footer .nl .cf-lang .cf-chips { border-color: rgba(255, 255, 255, 0.18); }

/* The band keeps the wider form column (the compact inline row reads better with room than in the
   1.4fr/1fr minor column) — top-aligned to the copy. */
@media (min-width: 1000px) {
	.newsletter-band .nlb-grid { grid-template-columns: 1fr 1fr; align-items: start; }
}

/* F8: align the consent box to the design (18px square, 1.5px border, 10px gap) — the
   22px/1px box drifted larger + fainter than the chip family. */
.cf-consent .wpcf7-list-item label { gap: 10px; }
.cf-consent .wpcf7-list-item label::before { width: 18px; height: 18px; border-width: 1.5px; }

/* F12: keep CF7's spinner from wrapping / shifting the CTA on submit — a tighter inline margin. */
.cf-actions .wpcf7-spinner { margin-left: 12px; }

/* ── Live form input/select/textarea cascade ────────────────────────────────
   The .cf-field rule above (line ~1705) already styles input/select/textarea
   inside <p class="cf-field"> — that cascade reaches CF7's emitted controls
   because CF7 leaves the wrapping <p> untouched (it inserts <span class=
   "wpcf7-form-control-wrap">…<input class="wpcf7-form-control wpcf7-text">
   inside the <p>). No new rules needed here for the basic chrome. CF7's
   wpcf7-* classes inherit border/font/padding from the parent .cf-field rule.

   Live-form-only override: re-enable the input (the .cf-field input[disabled]
   rule on line ~1716 is the placeholder F3 dimming, ON BY DEFAULT in markup
   that lacks the seed). When CF7's live <input> renders, it has no `disabled`
   attribute, so the dim rule is harmless — keep it. */

/* ════════════════════════════════════════════════════════════════════════════
   FORMS — wpcf7 status-class response styling (phase 8 forms-corrections, F5/F6/M7)

   Five CF7 form status classes get distinct brand cards (M7 — the original plan
   styled .sent + .invalid only; .failed/.unaccepted/.spam/.aborted shipped as
   unstyled native red rectangles). Per-state contrast values pinned below
   (P3-A/P3-B); all pass WCAG AA on body text (≥4.5:1).

      class             when CF7 sets it       brand treatment      contrast
      ────────────────  ─────────────────────  ───────────────────  ────────
      .sent             mail_sent_ok           soft-green confirm   7.02:1
      .invalid          validation_error       soft-red error       4.76:1
      .unaccepted       privacy unchecked      soft-red error       4.76:1
      .spam             spam-flagged           soft-red error       4.76:1
      .aborted          submission cancelled   soft-red error       4.76:1
      .failed           wp_mail returned false rose retry card      9.05:1 (dark)

   Field-level .wpcf7-not-valid-tip is CF7's own per-field validation tip
   (injected by includes/js/index.js into .wpcf7-form-control-wrap). Adversarial
   review P1-A confirmed it carries CF7's localized invalid_required string from
   _messages (set by C1) — NOT browser HTML5. Style only, language is C1's job.

   The .anmeldung-box .wpcf7-response-output rule (line 2903) stays scoped —
   Events Manager bookings are a different UX surface and don't inherit the
   brand-card treatment. Cascade note: both .anmeldung-box .wpcf7-response-output
   and .wpcf7-form .wpcf7-response-output have equal (0,2,0) specificity, so this
   is a source-order tie — the .anmeldung-box block must remain AFTER the
   .wpcf7-form .wpcf7-response-output block to win. Reordering them (moving the
   .wpcf7-form rule below) would give EM bookings the brand confirmation card.
   ──────────────────────────────────────────────────────────────────────── */

/* Field-level validation tip — mono 12px, brand red, sits next to invalid field. */
.wpcf7-not-valid-tip {
	display: block; margin-top: 6px;
	font-family: var(--f-mono); font-weight: 500; font-size: 12px; line-height: 1.4;
	letter-spacing: var(--wp--custom--mono-tracking);
	color: #c0392b; /* 5.44:1 on --paper, 4.76:1 on #fdecec — both AA */
}
.wpcf7-form-control.wpcf7-not-valid {
	border-color: #c0392b;
}

/* Form-level response card — base shape (no color yet). The .wpcf7-response-output
   sits below the submit; CF7 toggles the form's class to .sent/.invalid/etc. on
   submit, our rules below light up the matching surface. */
.wpcf7-form .wpcf7-response-output {
	display: block; margin: 22px 0 0;
	padding: 16px 20px; border: 0; border-radius: 14px;
	font-family: inherit; font-size: 14.5px; line-height: 1.55; font-weight: 500;
	background: var(--wp--preset--color--bg);
	color: var(--wp--preset--color--ink);
}

/* SENT — the conversion moment. Brand confirmation: yellow eyebrow tone, ink
   heading, soft-green card. Pairs with C8's scroll-into-view (the user lands
   on this card right after submit). */
.wpcf7-form.sent .wpcf7-response-output {
	background: #e8f3ec; /* soft-green bg */
	color: #1f5c2e;      /* 7.02:1 — AAA */
	border-left: 3px solid #2f6f3f;
	font-weight: 600;
}
/* The placeholder-pattern's success affordance (kicker → heading) is mirrored
   here via ::before on the response output — gives the success text a brand
   eyebrow without requiring extra markup from CF7. */
.wpcf7-form.sent .wpcf7-response-output::before {
	content: "DANKE";
	display: block; margin-bottom: 4px;
	font-family: var(--f-mono); font-weight: 500; font-size: 11px;
	letter-spacing: var(--wp--custom--mono-tracking);
	text-transform: uppercase;
	color: #2f6f3f; opacity: 0.85;
}
:root[lang="uk"] .wpcf7-form.sent .wpcf7-response-output::before,
[lang="uk"] .wpcf7-form.sent .wpcf7-response-output::before { content: "ДЯКУЄМО"; }

/* INVALID / UNACCEPTED / SPAM / ABORTED — soft-red error card. Same treatment;
   the CF7 message text varies (validation_error / accept_terms / spam) — all
   from C1's _messages bundle. */
.wpcf7-form.invalid .wpcf7-response-output,
.wpcf7-form.unaccepted .wpcf7-response-output,
.wpcf7-form.spam .wpcf7-response-output,
.wpcf7-form.aborted .wpcf7-response-output {
	background: #fdecec;
	color: #c0392b; /* 4.76:1 on #fdecec — AA */
	border-left: 3px solid #c0392b;
}

/* FAILED — wp_mail() returned false (Mailpit down on dev / SMTP outage in
   prod before T9 lands FluentSMTP). Distinct rose card so the operator sees
   it differently from "you have invalid fields" at a glance. The voice is
   "try again" not "fix your input". CF7's mail_sent_ng message (C1) carries
   the German/Ukrainian copy. */
.wpcf7-form.failed .wpcf7-response-output {
	background: #fef0e7;
	color: #8a3a1f;
	border-left: 3px solid #c66128;
}

/* DARK-SURFACE VARIANTS — the newsletter band + footer mini-form sit on
   near-black ink. Red-on-ink reads as a system error; rose #f4b4b4 on the
   transparent card is brand-correct. */
.newsletter-band .wpcf7-form .wpcf7-response-output,
.site-footer .nl .wpcf7-form .wpcf7-response-output {
	background: rgba(255, 255, 255, 0.06);
	color: #fff;
	border-left-color: rgba(255, 255, 255, 0.32);
}
.newsletter-band .wpcf7-form.sent .wpcf7-response-output,
.site-footer .nl .wpcf7-form.sent .wpcf7-response-output {
	background: rgba(255, 204, 31, 0.14); /* yellow-tint */
	color: var(--wp--preset--color--yellow);
	border-left-color: var(--wp--preset--color--yellow);
}
.newsletter-band .wpcf7-form.sent .wpcf7-response-output::before,
.site-footer .nl .wpcf7-form.sent .wpcf7-response-output::before {
	color: var(--wp--preset--color--yellow);
}
.newsletter-band .wpcf7-form.invalid .wpcf7-response-output,
.newsletter-band .wpcf7-form.unaccepted .wpcf7-response-output,
.newsletter-band .wpcf7-form.spam .wpcf7-response-output,
.newsletter-band .wpcf7-form.aborted .wpcf7-response-output,
.newsletter-band .wpcf7-form.failed .wpcf7-response-output,
.site-footer .nl .wpcf7-form.invalid .wpcf7-response-output,
.site-footer .nl .wpcf7-form.unaccepted .wpcf7-response-output,
.site-footer .nl .wpcf7-form.spam .wpcf7-response-output,
.site-footer .nl .wpcf7-form.aborted .wpcf7-response-output,
.site-footer .nl .wpcf7-form.failed .wpcf7-response-output {
	background: rgba(255, 80, 80, 0.10);
	color: #f4b4b4; /* 9.05:1 on --ink — AAA */
	border-left-color: #f4b4b4;
}

/* Dark-surface field-level tip — same color so it reads consistently. */
.newsletter-band .wpcf7-not-valid-tip,
.site-footer .nl .wpcf7-not-valid-tip { color: #f4b4b4; }

/* Dark-surface invalid-border — the .newsletter-band/.site-footer .nl .cf-field input override
   (specificity 0,2,1) outranks the global `.wpcf7-form-control.wpcf7-not-valid { border-color }`
   (0,2,0), so the red invalid border never paints on the dark surfaces. Restore at matching
   specificity by chaining the .wpcf7-not-valid hook into the dark-surface input scope (validation
   pass css-2). */
.newsletter-band .cf-field input.wpcf7-not-valid,
.site-footer .nl .cf-field input.wpcf7-not-valid {
	border-color: #f4b4b4;
}

/* Dark-surface focus ring — the default :focus-within outline uses --blue (#1c52cf), which on
   --ink (#16223d) is 2.37:1 — below WCAG 2.2 SC 1.4.11 (3:1 minimum for non-text). Switch to
   --yellow (10.46:1 on --ink) on the dark band + footer (validation pass css-3). */
.newsletter-band .cf-chips .wpcf7-list-item:focus-within label,
.site-footer .nl .cf-chips .wpcf7-list-item:focus-within label,
.newsletter-band .cf-consent .wpcf7-list-item:focus-within label::before,
.site-footer .nl .cf-consent .wpcf7-list-item:focus-within label::before {
	outline-color: var(--wp--preset--color--yellow);
}

/* ── RIGHT — LIVE contact panel (F4 — the working path) ─────────────────────
   Ink surface so it reads as the primary, dependable channel beside the muted
   preview. Greys (#b3bdd4 / rgba-white) are the established on-ink footer tones.
   Links inherit the panel's white fg (theme.json link-blue would be invisible on
   ink) + underline-on-interaction as the non-colour affordance (SC 1.4.1). */
.contact-live {
	background: var(--wp--preset--color--ink); color: #fff;
	border-radius: var(--wp--custom--card-radius-lg);
	padding: clamp(22px, 3vw, 32px);
	display: flex; flex-direction: column; gap: 18px;
}
/* contact-live's flex gap (18px) sets the card's content rhythm (channels/foot); pull
   ONLY the eyebrow→heading boundary down to the 8px card tier without touching the rest. */
.cl-eyebrow { color: var(--wp--preset--color--yellow); margin: 0 0 -10px; }
.contact-live h3 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.02em;
	line-height: 1.12; font-size: clamp(21px, 2.3vw, 26px); color: #fff; margin: 0;
}
.cl-channels { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.cl-chan {
	display: flex; flex-direction: column; gap: 4px;
	padding: 16px 0; border-top: 1px solid rgba(255, 255, 255, 0.10);
}
.cl-chan:first-child { border-top: none; padding-top: 0; }
.cl-lab { color: var(--wp--preset--color--yellow); }
.cl-val { font-size: 17px; font-weight: 600; color: #fff; line-height: 1.35; }
.cl-val.cl-addr { font-weight: 500; font-size: 15px; }
/* Inherit the white panel fg, not theme.json link-blue (invisible on ink); underline on
   hover/focus is the non-colour link affordance (WCAG SC 1.4.1). */
.contact-live a { color: inherit; text-decoration: none; }
.contact-live a:hover,
.contact-live a:focus-visible { text-decoration: underline; }
.cl-hint { font-size: 13px; line-height: 1.5; color: #b3bdd4; }
.cl-foot {
	margin-top: 4px; padding-top: 18px; border-top: 1px dashed rgba(255, 255, 255, 0.14);
	display: flex; flex-direction: column; gap: 14px; align-items: flex-start;
}
.cl-langs { font-size: 13.5px; line-height: 1.5; color: #b3bdd4; }
.cl-langs strong { color: #fff; font-weight: 600; }
/* Yellow pill CTA — ink text on yellow is high-contrast; keep its own fg even on hover. */
.cl-cta {
	display: inline-flex; align-items: center; gap: 8px;
	padding: 13px 22px; border-radius: var(--wp--custom--pill-radius);
	background: var(--wp--preset--color--yellow); color: var(--wp--preset--color--ink) !important;
	font-weight: 700; font-size: 14px; white-space: nowrap;
}
@media (min-width: 700px) {
	.cl-foot { flex-direction: row; align-items: center; justify-content: space-between; }
}

/* ════════════════════════════════════════════════════════════════════════════
   PHASE 6 — EVENTS (the dynamic-block family; plan: phase6-dynamic-blocks)
   Ported from home.css 173-231 + gemeinschaft-shared.jsx (EventCard layout×size,
   DateBadge, TaxChip, RegBadge), retokenized. The PLUGIN renders this markup
   (EventView — raw HTML, no Gutenberg layout classes, so none of these need the
   block-gap reset list above) and ships ZERO CSS of its own: these selectors ARE
   the pattern↔plugin API.

   CONTAINER QUERIES (arch-ref §10 — the card family ONLY, never page sections):
   each event block's wrapper carries `.ev-cq` = named container `ev`. Cards reflow
   on their CONTAINER; the list grids (.ev-feature/.ev-beside/.ev-line/.ev-grid/
   .reihen-strip) reflow on the VIEWPORT (they are page-level layout).
   DEGRADE RULE: any `.poster` inside a container narrower than 420px restyles AS a
   card (paper/ink, single column) so the hero card can never overflow a sidebar
   rail — markup is identical, tokens only (EventView emits no inline colors).
   EXCEPTION (arch-ref §10): the standard `.ev-card` two-column fold keys on the
   VIEWPORT (@media 600px), scoped to .ev-grid/.ev-beside — a page grid hands every
   tier a ~330–410px cell, so container width can't tell a phone from a desktop grid
   cell. Standalone .ev-card stays stacked. See the `.ev-card` block below.
   ──────────────────────────────────────────────────────────────────────────── */

.ev-cq { container: ev / inline-size; }

/* ── Atom: date badge (DATEBADGE_SIZES; tones light|dark|hero; framed|bare) ── */
.date-badge {
	background: var(--wp--preset--color--bg);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: 12px; padding: 8px 12px; text-align: center; flex-shrink: 0;
	min-width: 64px;
}
.date-badge > span { display: block; }
.date-badge .db-dow, .date-badge .db-m, .date-badge .db-time {
	font-family: var(--f-mono); font-weight: 500; font-size: 10px;
	letter-spacing: 0.1em; color: var(--wp--preset--color--ink-soft);
}
.date-badge .db-d {
	font-family: var(--f-display); font-weight: 700; font-size: 26px;
	line-height: 1; margin: 2px 0; color: var(--wp--preset--color--blue);
}
.date-badge.sm { padding: 6px 10px; border-radius: 10px; min-width: 56px; }
.date-badge.sm .db-d { font-size: 22px; }
.date-badge.sm .db-dow, .date-badge.sm .db-m { font-size: 9.5px; }
.date-badge.lg { padding: 10px 14px; border-radius: 14px; min-width: 70px; }
.date-badge.lg .db-d { font-size: 30px; }
.date-badge.xl { padding: 18px 22px; border-radius: 18px; min-width: 116px; }
.date-badge.xl .db-d { font-size: 56px; line-height: 0.95; margin: 4px 0; }
.date-badge.xl .db-dow, .date-badge.xl .db-m { font-size: 12px; }
.date-badge.dark {
	background: rgba(255, 255, 255, 0.06); border-color: rgba(255, 255, 255, 0.15);
}
.date-badge.dark .db-d { color: #fff; }
.date-badge.dark .db-dow, .date-badge.dark .db-m { color: rgba(255, 255, 255, 0.72); } /* ≥AA on ink (D13) */
.date-badge.hero { background: var(--wp--preset--color--ink); border: none; }
.date-badge.hero .db-d { color: #fff; }
.date-badge.hero .db-dow { color: var(--wp--preset--color--yellow); letter-spacing: 0.14em; }
.date-badge.hero .db-m { color: #b3bdd4; }
.date-badge.hero .db-time {
	margin-top: 10px; padding-top: 10px; border-top: 1px solid rgba(255, 255, 255, 0.12);
	font-size: 13px; color: #fff; letter-spacing: 0.06em;
}
.date-badge.bare { background: none; border: none; padding: 0; border-radius: 0; min-width: 42px; }
/* Accent recolor (line-md tiles): yellow flips to blue-deep for contrast (design rule). */
.date-badge.accent-red .db-d { color: var(--wp--preset--color--red); }
.date-badge.accent-blue .db-d { color: var(--wp--preset--color--blue); }
.date-badge.accent-yellow .db-d { color: var(--wp--preset--color--blue-deep); }
.date-badge.accent-ink .db-d { color: var(--wp--preset--color--ink); }

/* ── Atom: taxonomy chip (TAXCHIP_COLORS per kind) ─────────────────────────── */
.tax-chip {
	display: inline-flex; align-items: center; gap: 6px;
	padding: 4px 10px; border-radius: var(--wp--custom--pill-radius);
	font-family: var(--f-mono); font-weight: 600; font-size: 10.5px;
	letter-spacing: 0.06em; text-decoration: none;
}
.tax-chip.md { padding: 6px 12px; font-size: 11px; }
.tax-chip.kategorie { background: var(--wp--preset--color--ink); color: #fff; }
.tax-chip.projekt { background: var(--wp--preset--color--yellow-soft); color: var(--wp--preset--color--blue-deep); }
.tax-chip.thema {
	background: transparent; color: var(--wp--preset--color--ink-soft);
	border: 1px solid var(--wp--preset--color--rule);
}
.tax-chip.reihe {
	background: var(--wp--preset--color--yellow-soft); color: var(--wp--preset--color--blue-deep);
	border: 1px solid var(--wp--preset--color--yellow);
}
.tax-chip.sprache {
	background: var(--wp--preset--color--bg); color: var(--wp--preset--color--ink-soft);
	border: 1px solid var(--wp--preset--color--rule);
}
.tax-chip .chip-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
.chip-dot.accent-red { background: var(--wp--preset--color--red); }
.chip-dot.accent-blue { background: var(--wp--preset--color--blue); }
.chip-dot.accent-yellow { background: var(--wp--preset--color--yellow); border: 1px solid var(--wp--preset--color--rule); }
.chip-dot.accent-ink { background: var(--wp--preset--color--ink); }

/* ── Atom: registration badge — phase-6 reachable: plaetze-frei / ohne-anmeldung /
   vorbei; warteliste is defined for phase-8 capacity. The yellow-soft pill is SHARED
   across the active states (design: "green dot only") — the DOT carries the status. ── */
.reg-badge {
	display: inline-flex; align-items: center; gap: 6px;
	padding: 4px 10px; border-radius: var(--wp--custom--pill-radius);
	font-family: var(--f-mono); font-weight: 700; font-size: 10.5px; letter-spacing: 0.06em;
	background: var(--wp--preset--color--yellow-soft); color: var(--wp--preset--color--blue-deep);
}
.reg-badge.md { padding: 5px 12px; font-size: 11px; }
.reg-badge .reg-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--wp--preset--color--blue); }
/* green = Plätze frei (spots free) — raw hex, matching the reg-badge tint convention. */
.reg-badge.plaetze-frei .reg-dot { background: #1a8a4f; }
.reg-badge.ohne-anmeldung .reg-dot { background: var(--wp--preset--color--blue); }
.reg-badge.warteliste .reg-dot { background: var(--wp--preset--color--yellow); }
.reg-badge.vorbei { background: #f1ece0; color: var(--wp--preset--color--ink-soft); }
.reg-badge.vorbei .reg-dot { background: var(--wp--preset--color--ink-soft); }

/* ── Shared card internals ─────────────────────────────────────────────────── */
.ev-kicker {
	display: block; font-family: var(--f-mono); font-weight: 500; font-size: 10px;
	color: var(--wp--preset--color--blue-deep); letter-spacing: 0.08em; text-transform: uppercase;
}
.ev-title { font-family: var(--f-display); font-weight: 700; letter-spacing: -0.01em; margin: 0; }
.ev-blurb {
	font-size: 13px; line-height: 1.5; color: var(--wp--preset--color--ink-soft); margin: 0;
	display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
.ev-meta {
	display: grid; grid-template-columns: auto 1fr; column-gap: 10px; row-gap: 5px;
	font-family: var(--f-mono); font-weight: 500; font-size: 12.5px; margin: 0;
}
/* #b3bdd4 — the ONE sanctioned on-ink grey (phase-4 guard) — replaces the
   prototype's second grey, which sat at 4.40:1 on ink (a hair under AA). D13. */
.ev-meta-k { color: #b3bdd4; letter-spacing: 0.06em; }
.ev-foot {
	display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap;
	gap: 8px; margin-top: auto; padding-top: 8px;
}
.ev-cta {
	display: inline-flex; align-items: center; gap: 6px;
	background: var(--wp--preset--color--ink); color: #fff;
	padding: 8px 14px; border-radius: var(--wp--custom--pill-radius);
	font-size: 12px; font-weight: 700; white-space: nowrap;
}
.ev-cta--yellow {
	background: var(--wp--preset--color--yellow); color: var(--wp--preset--color--ink);
	padding: 12px 20px; font-size: 14px;
}
.ev-photo { margin: 0; position: relative; overflow: hidden; }
.ev-photo .ev-img { width: 100%; height: 100%; object-fit: cover; }
/* Photo-less cards use the PROTOTYPE's tonal .ph family (home.css 44-53, already
   ported above for the hero) — EventView emits the tone class by thema accent
   (hilfe→warm, ankommen→sky, kultur→yellow, stimme→crowd, none→tan). The earlier
   phase-6 dark gradient was an invention; retired by the design review (D5). */
.ev-photo .ph { width: 100%; height: 100%; border-radius: 0; }
.ph-portrait { aspect-ratio: 4 / 5; }
.ph-landscape { aspect-ratio: 16 / 10; min-height: 200px; }
.ev-flag {
	position: absolute; top: 14px; left: 14px; z-index: 1;
	background: var(--wp--preset--color--yellow); color: var(--wp--preset--color--ink);
	padding: 6px 14px; border-radius: var(--wp--custom--pill-radius);
	font-family: var(--f-mono); font-weight: 700; font-size: 11px; letter-spacing: 0.08em;
}
.ev-recurrence {
	font-family: var(--f-mono); font-weight: 500; font-size: 11px;
	letter-spacing: 0.08em; color: #b3bdd4;
}
.ev-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
/* Long category/thema labels wrap to 2 lines in the narrow card rail — center the
   wrapped lines. justify-content centers the [dot + label] within the inline-flex chip;
   text-align on the label span centers its lines (text-align on the chip itself can't). */
.ev-chips .tax-chip { justify-content: center; }
.ev-chips .tax-chip .chip-label { text-align: center; }
/* Card-style anchors opt OUT of the global hover underline (373bb8b convention);
   their affordance is the border/translate below. */
.ev-row:hover, .ev-row:focus-visible, .ev-cta:hover, .ev-cta:focus-visible,
.ev-tile-text:hover, .ev-tile-text:focus-visible,
.tax-chip:hover, .tax-chip:focus-visible { text-decoration: none; }
/* …and every opt-out RESTORES a visible keyboard affordance (review D12 — the
   underline was the theme's only global focus signal; removing it without a
   replacement left the primary CTAs keyboard-invisible, WCAG 2.4.7). Focus
   mirrors hover across the family; rings stay within tokens. */
.ev-cta:focus-visible, a.tax-chip:focus-visible, .es-cta:focus-visible,
.archive-filter .tax-chip:focus-visible {
	outline: 2px solid var(--wp--preset--color--blue); outline-offset: 2px;
}
.poster .ev-cta:focus-visible { outline-color: #fff; } /* blue ring is weak on ink */
.ev-tile:focus-within { border-color: var(--wp--preset--color--ink); }
.ev-tile-text:focus-visible { outline: 2px solid var(--wp--preset--color--blue); outline-offset: -2px; }
.reihe-name:focus-visible { text-decoration: underline; }

/* ── Card: poster (dark hero; landscape = 2-col at width, portrait = stacked) ── */
.poster {
	background: var(--wp--preset--color--ink); color: #fff;
	border-radius: 22px; overflow: hidden;
	display: flex; flex-direction: column; min-height: 340px; height: 100%;
}
.poster .poster-body {
	padding: 20px 24px 24px; display: flex; flex-direction: column; gap: 12px; flex: 1;
}
.poster .ev-title { font-size: clamp(20px, 2.4vw, 27px); letter-spacing: -0.02em; line-height: 1.1; }
.poster:not(.poster--portrait) .ev-blurb { color: #dde3f1; font-size: 14px; }
.poster .ev-photo { flex-shrink: 0; }
.poster .poster-head { display: flex; align-items: center; gap: 16px; }
.poster .poster-head-tags { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }
.poster--portrait .ev-photo .date-badge { position: absolute; bottom: 16px; left: 16px; }
@container ev (min-width: 640px) {
	.poster:not(.poster--portrait) { display: grid; grid-template-columns: 1.1fr 1fr; min-height: 360px; }
	.poster:not(.poster--portrait) .ev-photo { height: 100%; }
	.poster:not(.poster--portrait) .ph-landscape { aspect-ratio: auto; height: 100%; }
	.poster:not(.poster--portrait) .poster-body { padding: 36px 36px 32px; }
	.poster:not(.poster--portrait) .ev-title { font-size: clamp(27px, 3.4cqi, 38px); }
}

/* DEGRADE (arch-ref §10): a LANDSCAPE poster in a rail < 420px presents AS a
   card. The portrait poster is exempt — it IS the narrow-friendly form (the
   .ev-feature column is 360px by design and must keep its featured poster). */
@container ev (max-width: 419.98px) {
	.poster:not(.poster--portrait) {
		background: var(--wp--preset--color--paper); color: var(--wp--preset--color--ink);
		border: 1px solid var(--wp--preset--color--rule); border-radius: 16px; min-height: 0;
	}
	.poster:not(.poster--portrait) .ev-blurb { color: var(--wp--preset--color--ink-soft); }
	.poster:not(.poster--portrait) .ev-title { font-size: 19px; }
	.poster:not(.poster--portrait) .ev-photo { aspect-ratio: 16 / 9; }
	.poster:not(.poster--portrait) .ph-portrait, .poster:not(.poster--portrait) .ph-landscape { aspect-ratio: 16 / 9; min-height: 0; }
	.poster:not(.poster--portrait) .ev-recurrence { color: var(--wp--preset--color--ink-soft); }
	.poster:not(.poster--portrait) .ev-meta-k { color: var(--wp--preset--color--ink-soft); }
	.poster:not(.poster--portrait) .date-badge.dark, .poster:not(.poster--portrait) .date-badge.hero {
		background: var(--wp--preset--color--bg); border: 1px solid var(--wp--preset--color--rule);
	}
	.poster:not(.poster--portrait) .date-badge.dark .db-d, .poster:not(.poster--portrait) .date-badge.hero .db-d { color: var(--wp--preset--color--blue); }
	.poster:not(.poster--portrait) .date-badge.dark .db-dow, .poster:not(.poster--portrait) .date-badge.hero .db-dow,
	.poster:not(.poster--portrait) .date-badge.dark .db-m, .poster:not(.poster--portrait) .date-badge.hero .db-m,
	.poster:not(.poster--portrait) .date-badge.hero .db-time { color: var(--wp--preset--color--ink-soft); border-color: var(--wp--preset--color--rule); }
}

/* ── Card: standard (light; image-top stacked  →  image-left two-column) ───────
   The two-column fold keys on the VIEWPORT (≥600px), NOT the .ev-cq container, and
   is scoped to the page-grid contexts (.ev-grid / .ev-beside). Why the exception to
   arch-ref §10's "card family = container queries": a page grid hands the card a
   ~330–410px cell at EVERY tier (mobile 1-up ≈ desktop 3-up ≈ tablet 2-up), so
   container width can't tell a phone apart from a desktop grid cell — only the
   viewport can. A standalone pushua/event-card (no grid ancestor) stays stacked. ── */
.ev-card {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg); overflow: hidden;
	display: flex; flex-direction: column; height: 100%;
}
.ev-card .ev-card-media { position: relative; display: flex; flex-direction: column; flex-shrink: 0; }
.ev-card .ev-card-media .date-badge { position: absolute; top: 10px; left: 10px; }
.ev-card .ev-card-media .ev-chips {
	flex-direction: row; flex-wrap: wrap; align-items: center; gap: 6px; padding: 12px 12px 14px;
}
/* Stacked: a compact 16:10 band on the FIGURE (real images + .ph alike) — the 4:5
   Instagram source is cropped to keep the mobile card short (truncation is fine). */
.ev-card .ev-photo { aspect-ratio: 16 / 10; }
.ev-card .ev-card-body {
	padding: 18px; display: flex; flex-direction: column; justify-content: space-between;
	gap: 12px; flex: 1;
}
.ev-card .ev-title { font-size: 19px; line-height: 1.18; margin-bottom: 8px; }
/* The card has room for a fuller description (esp. the half-height beside cards):
   6 lines vs the shared 3-line clamp (the poster keeps 3). */
.ev-card .ev-blurb { -webkit-line-clamp: 6; }
.ev-card .ev-meta-line {
	display: block; font-family: var(--f-mono); font-weight: 500; font-size: 12px;
	color: var(--wp--preset--color--ink-soft); letter-spacing: 0.02em; line-height: 1.35;
}
.ev-card .ev-meta-icons { display: grid; gap: 5px; margin-top: 12px; }
.ev-card--sm .ev-card-body { padding: 14px 16px 16px; }
.ev-card--sm .ev-title { font-size: 16px; margin-bottom: 4px; }
/* Two-column: image-left holds its 4:5 Instagram ratio, chips stack beneath it in
   the left rail; the right column takes title/blurb/meta/CTA. */
@media (min-width: 600px) {
	.ev-grid .ev-card, .ev-beside .ev-card { display: grid; grid-template-columns: 156px minmax(0, 1fr); }
	.ev-grid .ev-card .ev-card-media, .ev-beside .ev-card .ev-card-media { border-right: 1px solid var(--wp--preset--color--rule); }
	.ev-grid .ev-card .ev-card-media .ev-chips, .ev-beside .ev-card .ev-card-media .ev-chips {
		flex-direction: column; align-items: flex-start; flex: 1;
	}
	.ev-grid .ev-card .ev-photo, .ev-beside .ev-card .ev-photo { aspect-ratio: 4 / 5; }
	.ev-grid .ev-card--sm, .ev-beside .ev-card--sm { grid-template-columns: 120px minmax(0, 1fr); }
}

/* ── Card: line-sm (sidebar/mini row) + line-md (accent tile) ──────────────── */
.ev-row {
	display: flex; gap: 12px; align-items: center; padding: 10px 12px;
	background: var(--wp--preset--color--bg);
	border: 1px solid var(--wp--preset--color--rule); border-radius: 12px;
	color: var(--wp--preset--color--ink); transition: border-color 120ms ease;
}
.ev-row:hover, .ev-row:focus-visible { border-color: var(--wp--preset--color--ink); }
.ev-row .ev-row-text { min-width: 0; display: flex; flex-direction: column; }
.ev-row .ev-row-title { font-size: 13.5px; font-weight: 600; line-height: 1.25; margin-top: 2px; }
/* No colored left bar (proto parity) — the day-number accent on the bare date badge
   carries the thema tint instead. */
.ev-tile {
	background: var(--wp--preset--color--bg);
	border: 1px solid var(--wp--preset--color--rule); border-radius: 14px;
	padding: 16px; display: flex; gap: 14px; align-items: flex-start;
	position: relative; overflow: hidden; height: 100%;
}
.ev-tile .ev-tile-text { flex: 1; min-width: 0; display: flex; flex-direction: column; color: var(--wp--preset--color--ink); }
.ev-tile .ev-row-title { font-size: 14px; font-weight: 600; line-height: 1.25; margin-top: 4px; }
.ev-tile .ev-kicker { color: var(--wp--preset--color--ink-soft); }
.ev-tile:hover { border-color: var(--wp--preset--color--ink); }

/* ── List grids (VIEWPORT reflow — page-level layout, not container) ───────── */
.ev-feature { display: grid; grid-template-columns: 1fr; gap: 18px; align-items: stretch; }
/* The cards beside the tall portrait poster are a 2×2 grid of equal HALF-height rows
   (grid-auto-rows: 1fr) — the beside column stretches to the poster's height, so two
   rows of regular cards match one featured poster (design parity). */
.ev-beside { display: grid; grid-template-columns: 1fr; grid-auto-rows: 1fr; gap: 14px; }
.ev-line { display: grid; grid-template-columns: 1fr; gap: 12px; margin-top: 14px; }
.ev-grid { display: grid; grid-template-columns: 1fr; gap: 14px; margin-top: 14px; }
@media (min-width: 600px) {
	.ev-beside { grid-template-columns: 1fr 1fr; }
	.ev-line { grid-template-columns: 1fr 1fr; }
	.ev-grid { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 1000px) {
	.ev-feature { grid-template-columns: 360px minmax(0, 1fr); gap: 22px; }
	.ev-line { grid-template-columns: repeat(4, 1fr); }
	.ev-grid { grid-template-columns: repeat(3, 1fr); }
}

/* Reihen strip — count-adaptive columns with a CENTERED orphan row (flex, not grid).
   The desktop column count comes from the .rs-cols-{N} class (render: ≤4→N, 5–6→3,
   7+→4); narrower tiers cap it (≤2-up <782, ≤3-up <1000). justify-content:center +
   flex-grow:0 lets a partial last row center (5 @ 3-up = 3 + 2-centered); flex-shrink:1
   absorbs sub-pixel rounding so full rows never wrap early. Per-class basis (no calc
   min()/var division) keeps it robust. */
.reihen-strip { --rs-gap: 14px; display: flex; flex-wrap: wrap; gap: var(--rs-gap); justify-content: center; }
.reihen-strip > .reihe-card { flex: 0 1 100%; }
@media (min-width: 600px) {
	.rs-cols-2 > .reihe-card, .rs-cols-3 > .reihe-card, .rs-cols-4 > .reihe-card { flex-basis: calc((100% - var(--rs-gap)) / 2); }
}
@media (min-width: 782px) {
	.rs-cols-3 > .reihe-card, .rs-cols-4 > .reihe-card { flex-basis: calc((100% - 2 * var(--rs-gap)) / 3); }
}
@media (min-width: 1000px) {
	.rs-cols-4 > .reihe-card { flex-basis: calc((100% - 3 * var(--rs-gap)) / 4); }
}

/* Editor-only hint when a card has no renderable event (render.php). */
.ev-editor-note {
	font-family: var(--f-mono); font-size: 12px; color: var(--wp--preset--color--ink-soft);
	border: 1px dashed var(--wp--preset--color--rule); border-radius: 8px; padding: 10px 12px;
}

/* ── Reihen strip card (pushua/reihen-strip — series name + count + next pill) ──
   Proto: gemeinschaft-veranstaltungen.jsx ReihenStrip. Head row (name + "x kommende"
   pill) · next-event date pill · footer link. No cadence line. */
.reihe-card {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg);
	padding: 18px; display: flex; flex-direction: column; gap: 12px;
}
.reihe-card .reihe-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.reihe-card .reihe-name {
	font-family: var(--f-display); font-weight: 700; font-size: 17px;
	letter-spacing: -0.01em; line-height: 1.2; color: var(--wp--preset--color--ink); min-width: 0;
}
.reihe-card .reihe-count {
	flex-shrink: 0; font-family: var(--f-mono); font-weight: 700; font-size: 10.5px;
	letter-spacing: 0.06em; color: var(--wp--preset--color--blue-deep);
	background: var(--wp--preset--color--yellow-soft);
	padding: 3px 8px; border-radius: var(--wp--custom--pill-radius); white-space: nowrap;
}
.reihe-card .reihe-next-box {
	display: flex; gap: 12px; align-items: center; padding: 10px 12px;
	background: var(--wp--preset--color--bg);
	border: 1px solid var(--wp--preset--color--rule); border-radius: 10px;
	color: var(--wp--preset--color--ink); transition: border-color 120ms ease;
}
.reihe-card .reihe-next-box:hover, .reihe-card .reihe-next-box:focus-visible {
	border-color: var(--wp--preset--color--ink); text-decoration: none;
}
.reihe-card .reihe-next-box:focus-visible { outline: 2px solid var(--wp--preset--color--blue); outline-offset: 2px; }
.reihe-card .reihe-next-text { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.reihe-card .reihe-next-kicker {
	font-family: var(--f-mono); font-size: 10.5px; letter-spacing: 0.06em;
	color: var(--wp--preset--color--ink-soft);
}
.reihe-card .reihe-next-venue {
	font-size: 13px; color: var(--wp--preset--color--ink); line-height: 1.3;
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.reihe-card .more-link {
	margin-top: auto; display: flex; align-items: center; justify-content: space-between; gap: 8px;
	border-top: 1px solid var(--wp--preset--color--rule); padding-top: 12px;
	font-family: var(--f-mono); font-weight: 500; font-size: 11.5px;
	letter-spacing: 0.04em; color: var(--wp--preset--color--blue);
}
.reihe-card .more-link:hover, .reihe-card .more-link:focus-visible { text-decoration: underline; }

/* ── Breadcrumb (pushua/breadcrumb — event/projekt singles) ────────────────── */
.breadcrumb {
	display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
	font-family: var(--f-mono); font-weight: 500; font-size: 12px;
	letter-spacing: 0.04em; margin: 0 0 20px;
}
.breadcrumb a { color: var(--wp--preset--color--blue); }
.breadcrumb .sep { color: var(--wp--preset--color--ink-soft); }
.breadcrumb .current {
	color: var(--wp--preset--color--ink-soft);
	overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 60ch;
}

/* ── Single-event head (pushua/event-single) ───────────────────────────────── */
.event-single .es-head { display: flex; flex-direction: column; gap: 14px; margin-bottom: 24px; }
.event-single .es-title {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.025em;
	line-height: 1.02; font-size: clamp(32px, 5vw, 54px); margin: 0;
}
.event-single .es-sub { font-size: 17px; line-height: 1.55; color: var(--wp--preset--color--ink-soft); margin: 0; max-width: 640px; }
.event-single .es-hero { display: flex; flex-direction: column; gap: 20px; margin-bottom: 28px; }
.event-single .es-hero-meta { display: flex; flex-direction: column; align-items: flex-start; gap: 12px; }
.event-single .es-meta-row {
	font-family: var(--f-mono); font-weight: 500; font-size: 13px;
	letter-spacing: 0.02em; color: var(--wp--preset--color--ink);
}
.event-single .es-photo { border-radius: var(--wp--custom--card-radius-lg); }
.event-single .es-photo .ph, .event-single .es-photo { aspect-ratio: 16 / 10; min-height: 260px; }
@container ev (min-width: 640px) {
	.event-single .es-hero { display: grid; grid-template-columns: minmax(220px, 0.9fr) 1.4fr; align-items: start; }
}
.facts-grid {
	display: grid; grid-template-columns: 1fr; gap: 1px;
	background: var(--wp--preset--color--rule);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius); overflow: hidden; margin-bottom: 28px;
}
@media (min-width: 600px) { .facts-grid { grid-template-columns: 1fr 1fr; } }
.facts-grid .fact { background: var(--wp--preset--color--paper); padding: 14px 16px; display: flex; flex-direction: column; gap: 4px; }
.facts-grid .fact-k {
	font-family: var(--f-mono); font-weight: 500; font-size: 10.5px;
	letter-spacing: var(--wp--custom--kicker-tracking); color: var(--wp--preset--color--ink-soft);
}
.facts-grid .fact-v { font-size: 14.5px; font-weight: 600; line-height: 1.4; }
.event-single .es-body, .event-single .es-expect { max-width: 680px; }
.event-single .es-body p, .event-single .es-expect p { font-size: 15.5px; line-height: 1.65; }
.event-single .es-expect { margin-top: 24px; }
.event-single .es-expect h2 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.02em;
	font-size: clamp(22px, 3vw, 28px); margin: 0 0 10px;
}

/* ── Cross-link sidebar (pushua/event-cross-link-sidebar) + 2-col single ───── */
.event-cols { display: flex; flex-direction: column; gap: 32px; }
@media (min-width: 1000px) {
	.event-cols { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 40px; align-items: start; }
	.event-sidebar { position: sticky; top: 24px; }
}
.event-sidebar { display: flex; flex-direction: column; gap: 16px; }
.side-card {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg); padding: 18px;
}
.side-card .side-kicker {
	font-family: var(--f-mono); font-weight: 500; font-size: 11px;
	letter-spacing: var(--wp--custom--kicker-tracking); text-transform: uppercase;
	color: var(--wp--preset--color--ink-soft); margin: 0 0 12px;
	display: flex; align-items: center; gap: 8px;
}
.side-card .side-count {
	background: var(--wp--preset--color--bg); border-radius: var(--wp--custom--pill-radius);
	padding: 1px 8px; font-size: 10px; color: var(--wp--preset--color--ink-soft);
}
.side-card .side-card-body { display: flex; flex-direction: column; gap: 8px; }
.side-card .side-link { font-size: 14px; font-weight: 600; color: var(--wp--preset--color--blue); line-height: 1.4; }
.side-card .side-strong { font-family: var(--f-display); font-weight: 700; font-size: 16px; }
.side-card .more-link {
	font-family: var(--f-mono); font-weight: 500; font-size: 11.5px;
	letter-spacing: 0.04em; color: var(--wp--preset--color--blue);
}
.side-card .side-rows { display: flex; flex-direction: column; gap: 8px; }

/* ── Phase-6 page shells: archive heads, projekt head, Anmeldung placeholder ── */
.archive-head { display: flex; flex-direction: column; gap: 14px; margin-bottom: 8px; }
.archive-head h1 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.025em;
	line-height: 1.02; font-size: clamp(34px, 5.4vw, 58px); margin: 0;
}
.archive-head .archive-lede { font-size: 16.5px; line-height: 1.55; color: var(--wp--preset--color--ink-soft); margin: 0; max-width: 560px; }
.archive-head .more { margin: 0; }
/* The archive hero is a heading-only band, but its plain `.sec` carried a full --section-y top
   AND bottom — and the bottom stacked with the next `.sec.ruled`'s top air (block-gap + ~80px pad)
   to ~168px of dead space before the first content (the user's "whitespace before Reihen / Alle
   Termine"). Zero the hero's bottom (the ruled section owns that gap) and trim its top so the band
   reads as a compact page header, not a full section. Scoped via `.archive-head` so the event AND
   projekt archive heroes stay consistent; (0,2,0) beats the base `.sec { padding-block }`. */
.sec:has(> .archive-head) { padding-block: calc(var(--section-y) - 16px) 0; }
/* …and pull the FIRST ruled section's divider up toward the header: the standard ruled top air
   (--section-y + 16 ≈ 80px above the rule) is generous right after a heading-only band, leaving a
   big empty gap between the hero and the divider. Halve it for the section directly after the
   archive hero only — the Reihen↔Alle-Termine rhythm further down is untouched. (Sets only
   padding-block-START; the ≥1280 framing block adjusts the END + moves the rule onto `.wrap`,
   which still works.) */
.sec:has(> .archive-head) + .sec.ruled { padding-block-start: calc(var(--section-y) - 24px); }
.projekt-head { display: flex; flex-direction: column; gap: 14px; }
.projekt-head h1 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.025em;
	line-height: 1.02; font-size: clamp(32px, 5vw, 54px); margin: 0;
}
.projekt-head .projekt-lede p { font-size: 17px; line-height: 1.55; color: var(--wp--preset--color--ink-soft); margin: 0; max-width: 640px; }
.anmeldung-box {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: var(--wp--custom--card-radius-lg);
	padding: 24px; display: flex; flex-direction: column; gap: 12px;
	align-items: flex-start; margin-top: 28px;
}
.anmeldung-box p { margin: 0; max-width: 56ch; }

/* ── Design-review batch (D8/D9/D11/D14, prototype-sourced) ──────────────── */
/* D9: the body lede — the first description paragraph is the selling sentence
   (prototype: 24px display lede after the WORUM ES GEHT kicker). */
.es-body > p:first-child {
	font-family: var(--f-display); font-weight: 500; color: var(--wp--preset--color--ink);
	font-size: clamp(19px, 2.4vw, 24px); line-height: 1.4;
}
/* D11: blue pin/calendar meta icons (the prototype's wayfinding glyphs; the
   --pin/--cal hooks were already in the markup). */
.es-meta-row--pin::before, .ev-meta-line--pin::before,
.es-meta-row--cal::before, .ev-meta-line--cal::before {
	content: ""; display: inline-block; width: 13px; height: 13px;
	margin-right: 7px; vertical-align: -2px;
	background: var(--wp--preset--color--blue);
}
.es-meta-row--pin::before, .ev-meta-line--pin::before {
	mask: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2"><path d="M12 21s-6-5.1-6-10a6 6 0 1 1 12 0c0 4.9-6 10-6 10z"/><circle cx="12" cy="11" r="2.5"/></svg>') center / contain no-repeat;
}
.es-meta-row--cal::before, .ev-meta-line--cal::before {
	mask: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2"><rect x="3" y="4" width="18" height="17" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>') center / contain no-repeat;
}
.poster .ev-meta-line--pin::before, .poster .ev-meta-line--cal::before { background: #b3bdd4; }
/* D8: hero action row — Anmelden (#anmeldung) + Zum Kalender (?ics=1). */
.es-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 16px; }
.ev-cta--lg { padding: 12px 20px; font-size: 14px; }
.ev-cta--ghost {
	background: transparent; color: var(--wp--preset--color--ink);
	border: 1px solid var(--wp--preset--color--rule);
}
.ev-cta--ghost:hover { border-color: var(--wp--preset--color--ink); }
/* D7: dormant Reihe — the prototype's "wird angekündigt" pending state: a dashed box
   standing in for the next-event pill. */
.reihe-card.is-pending { border-style: dashed; }
.reihe-card .reihe-pending {
	padding: 10px 12px; background: var(--wp--preset--color--bg);
	border: 1px dashed var(--wp--preset--color--rule); border-radius: 10px;
	font-family: var(--f-mono); font-size: 11px; letter-spacing: 0.05em;
	color: var(--wp--preset--color--ink-soft); text-transform: uppercase;
}
/* D3: the static Themen quick-filter under the archive head (phase 7's
   FilterRail replaces this row on the same ?thema= URLs). */
.archive-filter { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 20px; }
.archive-filter .tax-chip.is-all {
	background: var(--wp--preset--color--ink); color: #fff; border-color: var(--wp--preset--color--ink);
}
/* D14: 44px-class touch targets on the small text links — visual size unchanged,
   the hit area grows (padding offset by negative margin). The reihe-strip footer link
   is excluded: it's now a full-width flex row with its own 12px top padding (already a
   large hit area), and the negative top margin would fight its border-top divider. */
.side-card .more-link, .side-card .side-link {
	display: inline-flex; align-items: center;
	padding-block: 12px; margin-block: -12px;
}

/* ============================================================================
   PHASE 7 — FILTERING + AKTUELLES (plan: phase7-aktuelles-filtering)
   ----------------------------------------------------------------------------
   The markup contracts of the PLUGIN's FilterView (.filter-rail, .fr-*, .af-*) and
   PostView (.post-card, .pc-*, .featured-post, .fp-*, .cat-badge) renderers — the
   plugin ships ZERO CSS; renaming a selector here breaks the SSR blocks.
   VIEWPORT media queries only (superset 600/700/782/1000/1200/1600): the
   post-card family has ONE photo-top layout at every width — no width-driven
   structural fold, so it stays OUT of the `ev` container-query budget (§10).
   Sources: gemeinschaft-veranstaltungen.jsx (FilterRail/ActiveFilters),
   gemeinschaft-aktuelles.jsx + gemeinschaft-shared.jsx (PostCard/FeaturedPost).
   ========================================================================== */

/* ── FilterRail (veranstaltungen.jsx §FilterRail) ─────────────────────────── */
/* The events rail is no longer a standalone section — it sits inline under the events-list head
   (see .event-toolbar below + archive-event.html). The paper-panel background + reduced section
   padding that lived here were retired with that move (2026-06-20). */
.filter-rail { display: flex; flex-direction: column; gap: 18px; }
/* Inline filter toolbar — the event rail now sits UNDER the .sec-head, between the title and the
   results (user 2026-06-20, archive-event.html). The .sec-head's 32px margin-bottom carries the
   title→toolbar gap; this carries the toolbar→results gap so the list isn't crammed against the
   facets. All widths. (The posts rail on /de/ keeps its own .sec--post-filter section spacing.) */
.event-toolbar { margin-bottom: 40px; }
.fr-row--top {
	display: flex; flex-wrap: wrap; align-items: center;
	justify-content: space-between; gap: 16px 24px;
}
.fr-row--split { display: grid; gap: 18px; }
@media (min-width: 1000px) { .fr-row--split { grid-template-columns: 1fr 1fr; gap: 32px; } }
.fr-group { display: flex; flex-direction: column; gap: 10px; }
.fr-group--zeitraum, .fr-row--top .fr-group { flex-direction: row; align-items: center; gap: 14px; }
/* item 4b (2026-06-18): collapsible facet groups — native <details>. Kategorie + Thema
   collapse by default (open only when a facet is active, server-rendered); Zeitraum +
   Sprache stay non-collapsible (plain .fr-group). The summary reuses .fr-label; the
   default disclosure marker is replaced by a rotating chevron. */
.fr-group--collapsible > summary.fr-label {
	display: flex; align-items: center; gap: 8px;
	cursor: pointer; list-style: none; user-select: none; padding-block: 4px;
}
.fr-group--collapsible > summary.fr-label::-webkit-details-marker { display: none; }
.fr-group--collapsible > summary.fr-label::after {
	content: ""; width: 7px; height: 7px; margin-inline-start: 2px;
	border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor;
	transform: translateY(-2px) rotate(45deg); transition: transform 0.15s ease;
}
.fr-group--collapsible[open] > summary.fr-label::after { transform: translateY(1px) rotate(-135deg); }
.fr-group--collapsible > summary.fr-label:focus-visible {
	outline: 2px solid var(--wp--preset--color--blue); outline-offset: 2px; border-radius: 2px;
}
.fr-row--top .fr-group { flex-wrap: wrap; }
.fr-label {
	font-family: var(--f-mono); font-size: 11px; letter-spacing: 0.1em;
	color: var(--wp--preset--color--ink-soft); flex-shrink: 0;
}
.fr-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.fr-chip {
	display: inline-flex; align-items: center; gap: 8px;
	padding: 8px 14px; border-radius: var(--wp--custom--pill-radius);
	border: 1px solid var(--wp--preset--color--rule);
	background: transparent; color: var(--wp--preset--color--ink);
	font-size: 12.5px; font-weight: 500; text-decoration: none;
}
.fr-chip:hover { border-color: var(--wp--preset--color--ink); text-decoration: none; }
.fr-chip.is-active {
	background: var(--wp--preset--color--ink); color: #fff;
	border-color: var(--wp--preset--color--ink);
}
.fr-count {
	padding: 1px 7px; border-radius: var(--wp--custom--pill-radius);
	background: var(--wp--preset--color--bg); color: var(--wp--preset--color--ink-soft);
	font-family: var(--f-mono); font-size: 10px; font-weight: 700;
}
.fr-chip.is-active .fr-count { background: var(--wp--preset--color--yellow); color: var(--wp--preset--color--ink); }
.fr-chip .chip-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
.zeitraum-toggle {
	display: inline-flex; background: #fff; padding: 3px;
	border: 1px solid var(--wp--preset--color--rule); border-radius: var(--wp--custom--pill-radius);
}
.zt-opt {
	padding: 7px 16px; border-radius: var(--wp--custom--pill-radius);
	font-family: var(--f-mono); font-size: 11px; letter-spacing: 0.08em;
	color: var(--wp--preset--color--ink-soft); text-decoration: none;
}
.zt-opt:hover { color: var(--wp--preset--color--ink); text-decoration: none; }
.zt-opt.is-active { background: var(--wp--preset--color--ink); color: #fff; font-weight: 700; }
.fr-search { display: flex; gap: 8px; max-width: 560px; }
.fr-search input[type='search'] {
	flex: 1; min-width: 0; padding: 12px 16px;
	border: 1px solid var(--wp--preset--color--rule); border-radius: 12px;
	background: #fff; color: var(--wp--preset--color--ink);
	font-family: inherit; font-size: 14px;
}
.fr-search-submit {
	padding: 12px 20px; border: none; border-radius: var(--wp--custom--pill-radius);
	background: var(--wp--preset--color--ink); color: #fff;
	font-family: inherit; font-size: 13.5px; font-weight: 700; cursor: pointer;
}

/* ── ActiveFilters + result count (the filter-meta swap region) ───────────── */
.filter-meta { margin-top: 18px; }
.active-filters { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }
.af-label, .af-count {
	font-family: var(--f-mono); font-size: 11px; letter-spacing: 0.1em;
	color: var(--wp--preset--color--ink-soft);
}
.af-chip {
	display: inline-flex; align-items: center; gap: 8px;
	background: #fff; border: 1px solid var(--wp--preset--color--rule);
	padding: 5px 6px 5px 12px; border-radius: var(--wp--custom--pill-radius);
	font-size: 12.5px; font-weight: 500; color: var(--wp--preset--color--ink);
	text-decoration: none;
}
.af-chip:hover { border-color: var(--wp--preset--color--ink); text-decoration: none; }
.af-chip .chip-dot { width: 7px; height: 7px; border-radius: 50%; }
.af-x {
	display: inline-flex; align-items: center; justify-content: center;
	width: 20px; height: 20px; border-radius: 50%;
	background: var(--wp--preset--color--bg); color: var(--wp--preset--color--ink-soft);
	font-size: 13px; line-height: 1;
}
.af-reset {
	font-family: var(--f-mono); font-size: 11px; letter-spacing: 0.06em;
	color: var(--wp--preset--color--blue);
	text-decoration: underline; text-underline-offset: 3px;
}
.af-count { letter-spacing: 0.06em; font-size: 11.5px; margin: 12px 0 0; }

/* ── Scope flip (the centered outline „Ältere Veranstaltungen →") ─────────── */
.ev-scope-flip { margin-top: 32px; display: flex; justify-content: center; }
.scope-flip-btn {
	display: inline-flex; align-items: center; gap: 10px;
	padding: 14px 28px; border: 1.5px solid var(--wp--preset--color--ink);
	border-radius: var(--wp--custom--pill-radius);
	color: var(--wp--preset--color--ink); font-size: 14px; font-weight: 600;
	text-decoration: none;
}
.scope-flip-btn:hover { background: var(--wp--preset--color--ink); color: #fff; text-decoration: none; }

/* ── PostCard (shared.jsx §PostCard — ONE markup for grid/teaser/related) ─── */
.post-grid { display: grid; gap: 18px; padding: 0; margin: 0; list-style: none; }
@media (min-width: 700px) { .post-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1000px) { .post-grid { grid-template-columns: repeat(3, 1fr); } }
.post-grid > li { margin: 0; }
.post-grid > li > .post-card { height: 100%; }
.post-card {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: 16px; overflow: hidden;
	display: flex; flex-direction: column;
}
.pc-photo { height: 160px; margin: 0; position: relative; }
.pc-photo img, .pc-photo .ph, .fp-photo img, .fp-photo .ph {
	width: 100%; height: 100%; object-fit: cover; display: block;
}
.pc-body { padding: 22px; display: flex; flex-direction: column; gap: 12px; flex: 1; }
.pc-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.pc-date {
	font-family: var(--f-mono); font-size: 10.5px; letter-spacing: 0.06em;
	color: var(--wp--preset--color--ink-soft);
}
.pc-title {
	font-family: var(--f-display); font-size: 20px; font-weight: 700;
	line-height: 1.15; letter-spacing: -0.01em; margin: 0;
}
.pc-title a { color: inherit; text-decoration: none; }
.pc-title a:hover { text-decoration: underline; text-underline-offset: 3px; }
.pc-excerpt { font-size: 13.5px; line-height: 1.55; color: var(--wp--preset--color--ink-soft); margin: 0; }
.pc-foot {
	margin-top: auto; display: flex; align-items: center;
	justify-content: space-between; gap: 12px;
}
.pc-projekt {
	font-family: var(--f-mono); font-size: 10px; letter-spacing: 0.06em;
	color: var(--wp--preset--color--ink-soft); min-width: 0;
}
.pc-read {
	font-size: 13px; font-weight: 600; color: var(--wp--preset--color--blue);
	text-decoration: none; white-space: nowrap; flex-shrink: 0;
	display: inline-flex; align-items: center;
	padding-block: 12px; margin-block: -12px; /* D14 hit area */
}
.pc-read:hover { text-decoration: underline; text-underline-offset: 3px; }

/* The post badge (shared.jsx CatBadge — thema accent preferred, category tone legacy) */
.cat-badge {
	display: inline-flex; align-items: center; gap: 7px;
	padding: 4px 11px; border-radius: var(--wp--custom--pill-radius);
	font-family: var(--f-mono); font-size: 10.5px; font-weight: 700; letter-spacing: 0.06em;
}
.cat-badge.md { padding: 6px 12px; font-size: 11px; }
.cat-badge .chip-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
.cat-badge.thema { background: var(--wp--preset--color--yellow-soft); color: var(--wp--preset--color--blue-deep); }
.cat-badge.cat.tone-blue { background: var(--wp--custom--accent--ankommen-soft); color: var(--wp--preset--color--blue-deep); }
.cat-badge.cat.tone-yellow { background: var(--wp--preset--color--yellow-soft); color: var(--wp--preset--color--blue-deep); }
.cat-badge.cat.tone-red { background: var(--wp--custom--accent--hilfe-soft); color: var(--wp--preset--color--red); }
.cat-badge.cat.tone-ink { background: var(--wp--custom--accent--stimme-soft); color: var(--wp--preset--color--ink); }

/* ── FeaturedPost (aktuelles.jsx §FeaturedPost — 2-col photo|body ≥700) ───── */
.featured-post {
	background: var(--wp--preset--color--paper);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: 22px; overflow: hidden;
	display: grid;
}
@media (min-width: 700px) { .featured-post { grid-template-columns: 1.2fr 1fr; min-height: 340px; } }
.fp-photo { margin: 0; position: relative; min-height: 220px; }
.fp-flag {
	position: absolute; top: 18px; left: 18px;
	display: inline-flex; align-items: center; gap: 6px;
	background: var(--wp--preset--color--yellow); color: var(--wp--preset--color--ink);
	padding: 6px 12px; border-radius: var(--wp--custom--pill-radius);
	font-family: var(--f-mono); font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em;
}
.fp-flag-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--wp--preset--color--red); }
.fp-body {
	padding: clamp(24px, 4vw, 36px) clamp(20px, 3.5vw, 32px);
	display: flex; flex-direction: column; justify-content: space-between; gap: 20px;
}
.fp-title {
	font-family: var(--f-display); font-size: clamp(24px, 3.2vw, 36px); font-weight: 700;
	letter-spacing: -0.025em; line-height: 1.05; margin: 12px 0 0;
}
.fp-title a { color: inherit; text-decoration: none; }
.fp-title a:hover { text-decoration: underline; text-underline-offset: 4px; }
.fp-excerpt { font-size: 15.5px; line-height: 1.6; color: var(--wp--preset--color--ink-soft); margin: 16px 0 0; }
.fp-projekt {
	margin-top: 16px; display: inline-flex; align-items: center; gap: 6px;
	font-family: var(--f-mono); font-size: 11px; letter-spacing: 0.06em;
	color: var(--wp--preset--color--ink-soft);
}
.fp-projekt-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--wp--preset--color--yellow); }
.fp-cta {
	align-self: flex-start; display: inline-flex; align-items: center; gap: 10px;
	background: var(--wp--preset--color--ink); color: #fff;
	padding: 14px 22px; border-radius: var(--wp--custom--pill-radius);
	font-size: 14px; font-weight: 700; text-decoration: none;
}
.fp-cta:hover { text-decoration: none; opacity: 0.92; }
.sec--featured-post + .sec--post-grid { padding-top: 0; }

/* ── Aktuelles pagination (core query-pagination as the design's outline pill) ─ */
.aktuelles-pagination { margin-top: 32px; gap: 12px; align-items: center; }
.aktuelles-pagination .wp-block-query-pagination-previous,
.aktuelles-pagination .wp-block-query-pagination-next {
	display: inline-flex; align-items: center; gap: 10px;
	padding: 14px 28px; border: 1.5px solid var(--wp--preset--color--ink);
	border-radius: var(--wp--custom--pill-radius);
	color: var(--wp--preset--color--ink); font-size: 14px; font-weight: 600;
	text-decoration: none;
}
.aktuelles-pagination .wp-block-query-pagination-previous:hover,
.aktuelles-pagination .wp-block-query-pagination-next:hover {
	background: var(--wp--preset--color--ink); color: #fff; text-decoration: none;
}
.aktuelles-pagination .wp-block-query-pagination-numbers {
	font-family: var(--f-mono); font-size: 12px; color: var(--wp--preset--color--ink-soft);
}
.aktuelles-pagination .wp-block-query-pagination-numbers .current { color: var(--wp--preset--color--ink); font-weight: 700; }

/* ── Single post article (single.html — prose measure; no prototype page) ─── */
.post-article { max-width: 760px; }
.post-article .breadcrumb { margin-bottom: 20px; }
.post-article .pc-meta--single { margin-bottom: 4px; }
.post-article .wp-block-post-title {
	font-family: var(--f-display); font-size: clamp(30px, 4.4vw, 44px); font-weight: 700;
	letter-spacing: -0.025em; line-height: 1.05; margin: 10px 0 18px;
}
.post-article-image { margin: 0 0 24px; }
.post-article-image img { border-radius: 16px; }
.post-article .wp-block-post-content { font-size: 16px; line-height: 1.65; }
.post-article .wp-block-post-content p { margin-block: 0 1em; }

/* ── Verknüpft (post-cross-links — end-of-article, the side-card idiom) ───── */
.post-cross-links {
	margin-top: 40px; border-top: 1px solid var(--wp--preset--color--rule);
	padding-top: 24px; display: flex; flex-direction: column; gap: 16px;
}
.pxl-label { font-family: var(--f-mono); font-size: 12px; letter-spacing: 0.12em; color: var(--wp--preset--color--blue); }
.pxl-section { display: flex; flex-direction: column; gap: 8px; }
.pxl-section-label {
	font-family: var(--f-mono); font-size: 11px; letter-spacing: 0.1em;
	color: var(--wp--preset--color--ink-soft);
}
.pxl-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.post-cross-links .side-rows { display: flex; flex-direction: column; gap: 8px; }
.post-cross-links .side-link {
	font-size: 14px; font-weight: 600; color: var(--wp--preset--color--blue); line-height: 1.4;
	display: inline-flex; align-items: center;
	padding-block: 12px; margin-block: -12px; /* D14 hit area */
}

/* ── Sidebar AKTUELLES-DAZU rows (dated post links in the event rail) ─────── */
.side-link--post { flex-direction: column; align-items: flex-start; gap: 2px; }
.side-link--post .side-post-title { font-size: 14px; font-weight: 600; color: var(--wp--preset--color--blue); }
.side-link--post .side-post-date {
	font-family: var(--f-mono); font-size: 10.5px; letter-spacing: 0.06em;
	color: var(--wp--preset--color--ink-soft);
}

/* ── Editor placeholder (post-card inside a Query Loop — plan R12) ────────── */
.post-card--editor-placeholder {
	border: 1px dashed var(--wp--preset--color--rule); border-radius: 16px;
	padding: 24px; font-family: var(--f-mono); font-size: 12px;
	color: var(--wp--preset--color--ink-soft);
}

/* ── Aktuelles hero row (lede + CTA aside) ────────────────────────────────── */
.ah-row { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 16px 32px; }
.ah-cta {
	display: inline-flex; align-items: center; gap: 8px;
	background: var(--wp--preset--color--ink); color: #fff;
	padding: 12px 20px; border-radius: var(--wp--custom--pill-radius);
	font-size: 14px; font-weight: 700; text-decoration: none; white-space: nowrap;
}
.ah-cta:hover { text-decoration: none; opacity: 0.92; }

/* ── Focus-visible pass (D12 — every new interactive surface gets a ring) ─── */
.fr-chip:focus-visible, .zt-opt:focus-visible, .af-chip:focus-visible,
.af-reset:focus-visible, .scope-flip-btn:focus-visible, .fp-cta:focus-visible,
.pc-read:focus-visible, .pc-title a:focus-visible, .fp-title a:focus-visible,
.ah-cta:focus-visible, .fr-search input:focus-visible, .fr-search-submit:focus-visible,
.post-cross-links .side-link:focus-visible, .side-link--post:focus-visible,
.aktuelles-pagination a:focus-visible {
	outline: 2px solid var(--wp--preset--color--blue); outline-offset: 2px;
	text-decoration: none;
}

/* ============================================================================
   PHASE 8 — BOOKINGS (the EM booking form in the Anmeldung slot)
   ----------------------------------------------------------------------------
   The plugin ships ZERO CSS; the EM-native booking form (rendered by
   event-anmeldung-placeholder.php for rsvp events — T6) is styled here against
   EM's own markup classes (.em-booking-form / .em-booking / inputs / submit).
   These EM selectors are the theme↔EM contract (like the .ev-* plugin contract):
   EM owns the markup, the theme owns the look. `.anmeldung-full` is our
   waitlist note shown above the form on a full event (T8). VIEWPORT queries
   only (superset 600/700/782/1000/1200/1600) — the booking form is a single
   stacked column at every width.
   ========================================================================== */

.anmeldung-box .anmeldung-full {
	font-size: 15px; line-height: 1.5; color: var(--wp--preset--color--ink-soft);
	background: var(--wp--preset--color--sky); border-radius: var(--wp--custom--card-radius);
	padding: 12px 16px; max-width: none; align-self: stretch;
}
.anmeldung-box .anmeldung-full strong { color: var(--wp--preset--color--ink); }

/* EM booking form — full width inside the Anmeldung card, one stacked column. */
.anmeldung-box .em-booking,
.anmeldung-box .em-booking-form { align-self: stretch; width: 100%; margin: 0; }
.anmeldung-box .em-booking-form p { max-width: none; margin: 0 0 14px; }
.anmeldung-box .em-booking-form label { display: block; font-weight: 600; font-size: 14px; margin-bottom: 4px; color: var(--wp--preset--color--ink); }
.anmeldung-box .em-booking-form input[type="text"],
.anmeldung-box .em-booking-form input[type="email"],
.anmeldung-box .em-booking-form input[type="tel"],
.anmeldung-box .em-booking-form input[type="number"],
.anmeldung-box .em-booking-form select,
.anmeldung-box .em-booking-form textarea {
	width: 100%; box-sizing: border-box;
	border: 1px solid var(--wp--preset--color--rule); border-radius: var(--wp--custom--card-radius);
	background: var(--wp--preset--color--base); color: var(--wp--preset--color--ink);
	padding: 10px 12px; font: inherit; font-size: 16px; /* ≥16 → no iOS zoom */
}
.anmeldung-box .em-booking-form input:focus-visible,
.anmeldung-box .em-booking-form select:focus-visible,
.anmeldung-box .em-booking-form textarea:focus-visible {
	outline: 2px solid var(--wp--preset--color--blue); outline-offset: 1px; border-color: transparent;
}
/* The submit — match the ink CTA the rest of the event page uses. */
.anmeldung-box .em-booking-form input[type="submit"],
.anmeldung-box .em-booking-form button[type="submit"],
.anmeldung-box .em-booking-submit input {
	appearance: none; cursor: pointer; border: 0;
	background: var(--wp--preset--color--ink); color: var(--wp--preset--color--base);
	border-radius: 999px; padding: 12px 22px; font-weight: 600; font-size: 15px;
}
.anmeldung-box .em-booking-form input[type="submit"]:hover,
.anmeldung-box .em-booking-form button[type="submit"]:hover { background: var(--wp--preset--color--blue); }
/* EM feedback / validation messages. */
.anmeldung-box .em-booking-message,
.anmeldung-box .wpcf7-response-output,
.anmeldung-box .em-booking-form .em-feedback { margin-top: 12px; font-size: 14px; line-height: 1.5; }
.anmeldung-box .em-booking-message.em-booking-message-error { color: var(--wp--preset--color--ink); }

/* ── Ultrawide framing — part 2 (todo-human #11) ──────────────────────────────────────────────
   At ≥1280 the horizontal hairline dividers AND every full-bleed section background stop at the
   --maxw column (flush to the .wp-site-blocks vertical frame drawn ~line 111), instead of bleeding
   to the viewport. Below 1280 nothing changes (full-bleed stays).

   WHY THIS LIVES AT THE END OF THE FILE (not in the frame @media block up top): a media query adds
   NO specificity, so the section-level zeroing here (.sec.ruled, .stats, .band*, .ziele, …) only
   beats the EQUAL-specificity base rules (.sec.ruled border-top ~510, .stats/.band/.section-subnav/
   .ziele/.transparenz/.newsletter-band backgrounds, all defined ABOVE) by SOURCE
   ORDER — which requires this block to come last. Putting it up top (the original mistake) let those
   later base rules win and the constrain silently no-op'd. Each background/border is re-applied on
   the class-scoped child .wrap (a DIFFERENT element, higher specificity — never a bare .wrap, which
   would hit chrome + every section); .wrap is max-width:--maxw centered, so its box edges land on
   the frame lines by construction. Editor note: the frame ::before/::after key off .wp-site-blocks
   (absent from the editor iframe), so the editor shows constrained sections without the frame line —
   a pre-existing asymmetry, intentional. */
@media (min-width: 1280px) {
	/* Divider: lift the .ruled border off the section onto its --maxw wrap. */
	.sec.ruled { border-top: 0; }
	.sec.ruled > .wrap { border-top: 1px solid var(--wp--preset--color--rule); }

	/* Divider→kicker breathing at ≥1280 (user request 2026-06-19). The rule just moved
	   onto the inset .wrap, so the section's top padding now sits ABOVE the rule and can
	   no longer push the head down — the blue kicker / accent eyebrow hugged the hairline
	   (measured 1px). The <1280 fix (line ~515: padding-top = --section-y + 16) is a no-op
	   in this regime for exactly that reason. Restore the air BELOW the rule on the wrap,
	   and trim the section's bottom by the same amount so the FOOTPRINT stays 2·--section-y
	   and the §10 inter-section rhythm is preserved (base padTop = S+16, +wrap gap, +bottom
	   ⟹ bottom = S − 16 − gap). One :root-free var keeps the two values from drifting; the
	   wrap inherits it from its section. A headless filter rail has NO head under its rule (filter
	   controls sit there by design) so the breathing would just bloat it: the posts rail
	   (.sec--post-filter, templates/home.html) renders a bare `.filter-rail`, so we exclude by that
	   shared trait via :has() rather than name-listing the class. The events rail USED to be such a
	   section too, but it now lives INSIDE its list section under the head (archive-event.html), so the
	   re-grant just below restores breathing whenever a ruled section has BOTH a head and a filter. */
	.sec.ruled:not(:has(.filter-rail)) {
		--divider-kicker-gap: 28px;
		padding-block-end: calc(var(--section-y) - 16px - var(--divider-kicker-gap));
	}
	.sec.ruled:not(:has(.filter-rail)) > .wrap { padding-block-start: var(--divider-kicker-gap); }

	/* The events list section now CONTAINS the filter rail (moved under its head, user 2026-06-20),
	   so the headless-rail exclusion above wrongly catches it via :has(.filter-rail) and would strip
	   the head's divider breathing — the "Alle Termine" kicker would hug the hairline. Re-grant the
	   normal content-section treatment for any ruled section that has BOTH a .sec-head and a filter
	   (the dedicated headless rails have NO .sec-head, so they stay excluded and keep their own fix). */
	.sec.ruled:has(.sec-head):has(.filter-rail) {
		--divider-kicker-gap: 28px;
		padding-block-end: calc(var(--section-y) - 16px - var(--divider-kicker-gap));
	}
	.sec.ruled:has(.sec-head):has(.filter-rail) > .wrap { padding-block-start: var(--divider-kicker-gap); }

	/* Posts filter rail (Aktuelles /de/) — same defect + fix, mirrored. It was excluded by the same
	   :not(:has(.filter-rail)) rule, so its first chip row (THEMA) hugged the hairline (1px) and a tall
	   page-tone band was stranded before the featured post (~160px @1440). Differences from the event
	   rail: it's a TRANSPARENT rail (no paper panel → top-only breathing, no bottom inset needed) and
	   it's followed by .sec--featured-post, which is NOT .ruled (no second hairline to drop). Close to
	   the same 48px toolbar gap (24px block-gap + 24px) so the filter reads as the feed's toolbar. */
	.sec.ruled.sec--post-filter > .wrap { padding-block-start: 28px; }
	.sec.ruled.sec--post-filter { padding-block-end: 0; }
	.sec--post-filter + .sec { padding-block-start: 24px; }

	/* Light/paper section backgrounds. */
	.ziele, .transparenz { background: transparent; }
	.ziele > .wrap,
	.transparenz > .wrap { background: var(--wp--preset--color--paper); }

	/* Sticky section sub-nav: stays sticky; its page-tone bg + top/bottom rules move onto the
	   wrap so the hairlines align to the frame (bg tone == page bg, so the move is visually quiet). */
	.section-subnav { background: transparent; border-block: 0; }
	.section-subnav > .wrap {
		background: var(--wp--preset--color--bg);
		border-block: 1px solid var(--wp--preset--color--rule);
	}

	/* Bold bands (decision: constrain everything). Mirror source order .band → -ink → -paper. */
	.stats, .band, .band.band-ink, .band.band-paper, .newsletter-band { background: transparent; }
	.band.band-paper { border-block: 0; }
	.stats > .wrap           { background: var(--wp--preset--color--ink); }
	.band > .wrap            { background: var(--wp--preset--color--yellow); }
	.band.band-ink > .wrap   { background: var(--wp--preset--color--ink); }
	.band.band-paper > .wrap {
		background: var(--wp--preset--color--paper);
		border-block: 1px solid var(--wp--preset--color--rule);
	}
	.newsletter-band > .wrap { background: var(--wp--preset--color--ink); }

	/* Header chrome — the sticky header's bottom hairline is full-bleed (.site-header is alignfull),
	   so it ran past the vertical dividers; constrain it to the frame column too (user 2026-06-20).
	   Border moves onto the direct-child .wrap (max-width:--maxw → box edges land on the frame lines),
	   so it stops between the two dividers. The wrap carries padding-block:0 (see ~line 283), so the
	   hairline sits at the same y as before. Below 1280 it stays full-width (no frame). */
	.site-header { border-bottom: 0; }
	.site-header > .wrap { border-bottom: 1px solid var(--wp--preset--color--rule); }

	/* Footer chrome — same constrain so its ink bg stops at the frame instead of bleeding to the
	   viewport edges (user 2026-06-20). The bg moves onto the direct-child .wrap (max-width:--maxw,
	   so its box edges land on the frame lines); .site-footer keeps color:#fff for the text inside.
	   Below 1280 the footer stays full-bleed (unchanged). */
	.site-footer { background: transparent; }
	.site-footer > .wrap { background: var(--wp--preset--color--ink); }
}

/* ── Self-service portal (`[pushua_self_service]` → SelfService\SelfServicePage) ──
   The token-gated /meine-anmeldungen/ page now rides the page-no-title template
   (SeedData), so SelfServicePage owns the page's ONE H1 in an editorial hero that
   mirrors .archive-head. Request / bookings / newsletter render as paper cards on the
   constrained content column — a focused utility surface, deliberately not the
   full-bleed editorial heroes. Form tokens reuse the .cf-field / .cf-actions treatment. */
/* Fill the content column (override the constrained content-size cap) + left-align the
   inner hero/body so the page edge-aligns with the chrome + editorial pages, not centered. */
.pushua-self-service { display: flex; flex-direction: column; max-width: none; }
.pushua-self-service .ss-hero { display: flex; flex-direction: column; gap: 14px; padding-block: var(--section-y) 0; max-width: 680px; }
.pushua-self-service .ss-hero h1 {
	font-family: var(--f-display); font-weight: 700; letter-spacing: -0.025em;
	line-height: 1.02; font-size: clamp(34px, 5.4vw, 58px); margin: 0;
}
.pushua-self-service .ss-lede {
	font-size: 16.5px; line-height: 1.55; color: var(--wp--preset--color--ink-soft);
	margin: 0; max-width: 560px;
}
.pushua-self-service .ss-body { display: flex; flex-direction: column; gap: 28px; padding-block: 32px var(--section-y); max-width: 540px; }

/* status notice (sent / cancelled / unsubscribed / expired) */
.pushua-self-service .pushua-ss-notice {
	margin: 0; padding: 14px 18px; border-radius: 12px;
	background: var(--wp--preset--color--bg);
	border: 1px solid var(--wp--preset--color--blue);
	color: var(--wp--preset--color--blue-deep); font-size: 15px; line-height: 1.5;
}

/* paper cards (request form, newsletter) */
.pushua-self-service .ss-card {
	background: var(--wp--preset--color--bg);
	border: 1px solid var(--wp--preset--color--rule);
	border-radius: 16px; padding: clamp(20px, 4vw, 30px);
}
.pushua-self-service .ss-newsletter { display: flex; flex-direction: column; gap: 16px; }
.pushua-self-service .ss-newsletter h2,
.pushua-self-service .ss-group-head {
	font-family: var(--f-display); font-weight: 600; letter-spacing: -0.015em;
	font-size: 21px; line-height: 1.2; margin: 0;
}

/* fields + buttons — mirror .cf-field input + .cf-actions input.wpcf7-submit */
.pushua-self-service .ss-form { display: flex; flex-direction: column; gap: 18px; }
.pushua-self-service .ss-field { display: flex; flex-direction: column; gap: 8px; }
.pushua-self-service .ss-field > span,
.pushua-self-service .ss-newsletter label > span:first-child {
	font-family: var(--f-mono); font-size: 12px; letter-spacing: 0.04em;
	text-transform: uppercase; color: var(--wp--preset--color--ink-soft);
}
.pushua-self-service input[type="email"],
.pushua-self-service select {
	width: 100%; padding: 12px 14px; border-radius: 10px;
	border: 1px solid var(--wp--preset--color--rule);
	background: var(--wp--preset--color--bg); color: var(--wp--preset--color--ink);
	font-family: inherit; font-size: 15px; line-height: 1.4;
}
.pushua-self-service button {
	display: inline-flex; align-items: center; justify-content: center; gap: 10px;
	align-self: flex-start;
	padding: 13px 26px; border: 0; border-radius: var(--wp--custom--pill-radius);
	background: var(--wp--preset--color--ink); color: var(--wp--preset--color--paper);
	font-family: inherit; font-weight: 600; font-size: 15px; line-height: 1.2;
	letter-spacing: -0.01em; cursor: pointer; transition: background-color 120ms ease;
}
.pushua-self-service button:hover,
.pushua-self-service button:focus-visible { background: var(--wp--preset--color--blue); outline: none; }
.pushua-self-service button:focus-visible {
	box-shadow: 0 0 0 3px var(--wp--preset--color--bg), 0 0 0 5px var(--wp--preset--color--blue);
}

/* bookings — upcoming (cancellable) + the past archive */
.pushua-self-service .ss-group { display: flex; flex-direction: column; gap: 14px; }
.pushua-self-service .ss-bookings { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.pushua-self-service .ss-booking {
	display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
	padding: 15px 18px; border-radius: 12px;
	border: 1px solid var(--wp--preset--color--rule); background: var(--wp--preset--color--bg);
}
.pushua-self-service .ss-booking.is-past { background: transparent; }
.pushua-self-service .ss-booking-title { font-weight: 600; font-size: 16px; }
.pushua-self-service .ss-booking.is-past .ss-booking-title { color: var(--wp--preset--color--ink-soft); font-weight: 500; }
.pushua-self-service .ss-booking-date { font-family: var(--f-mono); font-size: 13px; color: var(--wp--preset--color--ink-soft); }
.pushua-self-service .ss-booking-action { margin-left: auto; }
/* secondary (outline) treatment for the per-booking cancel vs the primary submits */
.pushua-self-service .ss-booking-action button {
	padding: 9px 18px; font-size: 14px;
	background: transparent; color: var(--wp--preset--color--blue-deep);
	border: 1px solid var(--wp--preset--color--rule);
}
.pushua-self-service .ss-booking-action button:hover,
.pushua-self-service .ss-booking-action button:focus-visible {
	background: var(--wp--preset--color--ink); color: var(--wp--preset--color--paper);
	border-color: var(--wp--preset--color--ink);
}
.pushua-self-service .ss-empty { margin: 0; font-size: 16px; color: var(--wp--preset--color--ink-soft); }

/* newsletter language + unsubscribe forms sit inline in the card */
.pushua-self-service .ss-newsletter form { display: flex; align-items: flex-end; gap: 12px; flex-wrap: wrap; margin: 0; }
.pushua-self-service .ss-newsletter label { display: flex; flex-direction: column; gap: 8px; margin: 0; }

/* ── Full-bleed band breathing (design-review 2026-06-25) ─────────────────────
   A .stats / .band / .newsletter-band is full-bleed colour and butts FLUSH against
   its neighbours (the editor block-gap is zeroed ~line 530), so the cream air ABOVE
   a band comes entirely from the PRECEDING section's padding-bottom. A .sec.ruled
   hands over its REDUCED bottom — the divider-rhythm trim --section-y − 16 (~525),
   and at ≥1280 an even smaller --section-y − 16 − 28 (~3478) — i.e. the tightest gap
   on the page. So the yellow Spenden band sat crammed against the posts (40px @1180,
   ~20px @1280) while every other section boundary breathed at 56–112px. The design
   proto gives bands GENEROUS air above (80–96px); restore at least the full
   --section-y here so every band gets even breathing above, symmetric with the plain
   .sec that follows it (already --section-y). Predecessor-only: the section BELOW a
   band keeps its own top air, so this never touches the navy stats ribbon's gap.

   End-of-file by the same source-order rule as the ultrawide block above:
   `.sec.ruled:has(+ .band)` is (0,3,0) — it BEATS the base `.sec.ruled` (0,2,0, ~525)
   on specificity below 1280, and TIES the ≥1280 trim (`.sec.ruled:not(:has(.filter-
   rail))`, 0,3,0, ~3478) but wins by coming later. One non-media rule covers both
   regimes because --section-y is already redeclared per tier. */
.sec:has(+ .stats), .sec:has(+ .band), .sec:has(+ .newsletter-band),
.sec.ruled:has(+ .stats), .sec.ruled:has(+ .band), .sec.ruled:has(+ .newsletter-band) {
	padding-block-end: var(--section-y);
}

/* ── Homepage ruled-divider rhythm (design-review 2026-06-25, user follow-up) ──
   A ruled→ruled boundary pays BOTH sections' padding either side of its hairline:
   base pt (--section-y + 16) + base pb (--section-y − 16) = 2·--section-y. Because
   that's a MULTIPLE of the token it balloons on wide screens (112px @1180, 128px
   @1280, 160px @1600) while every band / plain boundary stays at 1·--section-y —
   a 2:1 ratio that read as "some sections have huge gaps, some none." Tighten the
   home stack toward ~1.5:1 so the rule still signals a major break without the
   cavernous air: drop the below-rule air to --section-y (still clear of the kicker)
   and halve the above-rule tail to --section-y/2.

   Scoped to body.home (the static front page, page-id 761) — the /de/ Aktuelles
   index is .blog and every archive keeps the global 2·--section-y rhythm, so this
   touches only the page the user audited. The band-predecessor (Zuletzt → yellow)
   is EXCLUDED from the tail cut so the band-breathing rule above still hands it a
   full --section-y. Specificity: body.home .sec.ruled is (0,3,1) and the tail rule
   (0,6,1) — both clear the base (0,2,0) and the ≥1280 trim (0,3,0) at every tier,
   and pt is --section-y+16 in BOTH regimes so one non-media rule covers both. */
body.home .sec.ruled {
	padding-block-start: var(--section-y);
}
body.home .sec.ruled:not(:has(+ .stats)):not(:has(+ .band)):not(:has(+ .newsletter-band)) {
	padding-block-end: calc(var(--section-y) * 0.5);
}

/* ── Reduced motion (a11y) ────────────────────────────────────────────────────
   This theme carries no reduced-motion guard of its own. Motion is minimal (short
   color/border fades + one chevron transform), but honour the OS preference by
   neutralising all motion — theme and any unguarded third-party motion alike. */
@media (prefers-reduced-motion: reduce) {
	*,
	*::before,
	*::after {
		animation-duration: 0.01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.01ms !important;
		scroll-behavior: auto !important;
	}
}
