/*
Theme Name: PLC Wien
Theme URI: https://gelugwien.at
Author: Jochum Media, Andreas Jochum
Author URI: https://www.jmx.at
Description: Eigenstaendiges Theme fuer das Panchen Losang Chogyen Gelug-Zentrum Wien. Ohne Seitenbaukasten, ohne jQuery. Termine stehen im Zentrum: serverseitig gerenderter Kalender, Terminlisten und Terminseiten mit strukturierten Daten. Auf Performance und auf eine Redaktion ausgelegt, in der sich auch Laien nicht verlaufen koennen.
Version: 1.1.0
Requires at least: 6.5
Tested up to: 7.1
Requires PHP: 8.1
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Update URI: false
Text Domain: plc
Tags: custom-menu, featured-images, accessibility-ready
*/

/* ==========================================================================
   1. Design-Tokens
   Eine Quelle fuer Farbe, Schrift, Abstand. Wer das Erscheinungsbild
   aendern will, aendert hier - nicht in den Komponenten weiter unten.
   ========================================================================== */

:root {
  /* Farben. Das Maroon ist die Leitfarbe (Ordensfarbe der Gelug-Tradition),
     Gold der Akzent. Alle Textfarben sind gegen ihren Grund auf
     mindestens 4.5:1 geprueft. */
  --c-ground:       #FAF8F5;
  --c-surface:      #FFFFFF;
  --c-sunk:         #F2EDE8;
  --c-ink:          #1F1A18;
  --c-ink-2:        #574C49;
  /* #857873 erreichte nur 4,02:1 auf --c-ground. Alle fuenf
     Verwendungsstellen stehen bei 13 px, es gilt also 4,5:1. */
  --c-ink-3:        #6E625E;
  --c-ink-3-invers: #A79B96;   /* 6,37:1 auf dem dunklen Fussgrund */
  --c-rule:         #E5DCD5;
  --c-rule-strong:  #CBBBB1;
  /* Nur fuer die Kontur von Bedienelementen (Eingabefelder, .btn--ghost,
     .nav-toggle): WCAG 1.4.11 verlangt dort 3:1, --c-rule-strong schafft
     1,86:1 auf Weiss (D-14). Gerechnet: 3,58:1 auf --c-surface, 3,38:1
     auf --c-ground, 3,08:1 auf --c-sunk - der dritte Wert entscheidet,
     weil die Kalender-Blaetterknoepfe auf /termin/ in einem section--sunk
     stehen. Karten-Hover und Trennlinien bleiben bei --c-rule-strong. */
  --c-rule-ctrl:    #95847B;
  --c-maroon:       #7A2430;
  --c-maroon-dark:  #5E1A24;
  --c-maroon-soft:  #F5E7E6;
  --c-gold:         #8A6718;
  --c-gold-soft:    #F7F0DD;
  --c-ok:           #2C6349;
  --c-ok-soft:      #E6F0EA;

  /* ----------------------------------------------------------------------
     Schrift: ZWEI Familien, SECHS Groessen, ZWEI Schnitte.

     Bewusst wenig. Hierarchie entsteht hier nicht durch immer neue
     Schriftgroessen, sondern durch Familie, Schnitt, Farbe und Abstand -
     das haelt die Seiten untereinander ruhig. Wer eine siebte Groesse
     braucht, hat meist ein Abstandsproblem.

     Systemschriften: kein externer Request, kein Layoutsprung beim Laden,
     auf jedem Geraet sofort da.
     ---------------------------------------------------------------------- */

  /* Georgia statt eines unbestimmten Stapels. "Iowan Old Style" ist unter
     Windows nicht installiert - dort landete der Stapel auf Palatino
     Linotype, auf dem Mac auf Iowan, auf Android auf Noto Serif. Der
     Entwurf existierte also gar nicht als festes Objekt.
     Entscheidend ist der Fettschnitt: Palatino Bold laeuft nur +2,5 %
     breiter als sein Regular und ist kaum als Bold erkennbar, Georgia
     Bold +15,6 % (aus der hmtx-Tabelle gemessen). */
  --f-display: Georgia, "Times New Roman", serif;
  --f-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  /* Nur fuer code/kbd/pre - dort ist gleiche Zeichenbreite inhaltlich
     richtig. Gestalterisch zaehlt sie nicht als dritte Schrift. */
  --f-mono: ui-monospace, SFMono-Regular, Consolas, monospace;

  /* Groessen: fluid zwischen Mobil und Desktop, ohne Media Query.
     hero  - nur der Aufmacher der Startseite
     xl    - Seitenueberschrift (H1) und Abschnittsueberschrift (H2)
     lg    - H3, Kartentitel, Terminnamen, Vorspann
     base  - Fliesstext
     sm    - Metazeilen, Bildunterschriften, Schaltflaechen
     xs    - Kicker, Datumsmarken, Etiketten */
  /* --fs-md kommt hinzu, --fs-hero entfaellt als Token: es hatte genau
     eine Verwendung (.hero__title) und gehoert damit an seine Stelle,
     nicht in die Skala. Die Zahl bleibt bei sechs.

     Warum --fs-md noetig ist: h3 trug bisher --fs-base, also exakt die
     Fliesstextgroesse. Weil die Serife eine kleinere x-Hoehe hat als die
     Grundschrift (Georgia 0,4814 gegen Segoe UI 0,5000 em), erschien die
     H3 OPTISCH KLEINER als der Absatz, den sie ueberschreibt. Auf UEBER
     UNS betraf das 38 Ueberschriften - die Seite hatte unterhalb der H2
     keine sichtbare Gliederung mehr. */
  --fs-xl:   clamp(1.55rem, 1.2rem + 1.7vw, 2.3rem);   /* 36,8 px  h1 */
  --fs-lg:   clamp(1.15rem, 1.05rem + 0.5vw, 1.4rem);  /* 22,4 px  h2 */
  --fs-md:   1.1875rem;                                /* 19   px  h3 */
  --fs-base: 1.0625rem;                                /* 17   px  Text */
  --fs-sm:   0.9375rem;                                /* 15   px  Meta */
  --fs-xs:   0.8125rem;                                /* 13   px  Etiketten */

  /* Zwei Schnitte. Mehr braucht es nicht, und Systemschriften haben
     ohnehin selten mehr als diese beiden verlaesslich. */
  --fw-normal: 400;
  --fw-bold: 600;

  /* Ziffern in Tabellen, Zeiten und Datumsmarken gleich breit - dafuer
     braucht es keine eigene Schreibmaschinenschrift. */
  --num: tabular-nums;

  /* Zeilenhoehen. Vorher standen sieben verschiedene Zahlen hart in den
     Komponenten - der einzige typografische Wert ohne Skala. */
  --lh-tight: 1.18;   /* Ueberschriften ab 22 px */
  --lh-snug:  1.35;   /* mehrzeilige Titel in Listen und Karten */
  /* 1.60 statt 1.65: sobald die Lesebreite wirklich greift, fallen die
     Absaetze bei 1,65 auseinander statt Bloecke zu bilden. */
  --lh-text:  1.60;   /* Fliesstext */

  /* Kein neuer Gestaltungswert, sondern eine Rechnung: 17 x 1,60 = 27,2 px.
     Ab hier werden die Abstaende im Fliesstext aus der Zeile abgeleitet,
     statt frei aus der --s-Skala gegriffen. */
  --lead: calc(var(--fs-base) * var(--lh-text));

  /* Abstaende: eine Skala, damit Abstaende nicht beliebig werden. */
  --s-1: 0.25rem;
  --s-2: 0.5rem;
  --s-3: 0.75rem;
  --s-4: 1rem;
  --s-5: 1.5rem;
  --s-6: 2rem;
  --s-7: 3rem;
  --s-8: 4rem;
  --s-9: 6rem;

  /* War 68ch - zwei Fehler in einem Wert.
     Schriftabhaengig: ch ist die Vorbreite der Null. Daraus entstanden
     DREI rechte Kanten in einer Spalte (h2 761, Absatz 623, h3 578 px).
     Und zu breit: an 20.000 Zeichen echtem Text dieser Website gemessen
     traegt die 623-px-Spalte 80,4 Zeichen, nicht 68. 33rem = 528 px
     ergibt gemessene 68,1 Zeichen. */
  --measure: 33rem;         /* Lesebreite Fliesstext, 528 px */
  --wide: 1180px;           /* Inhaltsbreite */
  --narrow: 780px;          /* Breite fuer Textseiten */

  --radius: 3px;
  /* Laufweite der 13-px-Versalzeilen. Fuenf Stellen hatten dafuer vier
     verschiedene Werte (.1 / .1 / .08 / .06 / .04em). */
  --track-caps: .08em;
  --shadow-1: 0 1px 2px rgba(31, 26, 24, .06), 0 2px 8px rgba(31, 26, 24, .04);
  --shadow-2: 0 2px 4px rgba(31, 26, 24, .07), 0 8px 24px rgba(31, 26, 24, .07);

  /* Bewusst nur hell. Bordeaux und Gold auf Warmweiss SIND der Entwurf;
     ein zweiter Token-Satz fuer Dunkel waere eine eigene Gestaltungs-
     leistung, die niemand beauftragt hat. Ohne diese Zeile zeichnen
     Browser mit Systemvorgabe "dunkel" Formularfelder, Scrollbalken und
     <details>-Pfeile in ihrer Dunkelvariante auf den hellen Grund (D-23). */
  color-scheme: light;
}

/* ==========================================================================
   2. Grundlagen
   ========================================================================== */

*, *::before, *::after { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
  /*
   * Die Kopfzeile klebt oben und misst je nach Breite 73 bis 109 px.
   * Ohne diesen Abstand landet jedes Sprungziel - der Sprunglink auf
   * #inhalt, die Gruppen bei den Lehrenden, #kalender - genau darunter.
   * Der unguenstigste Fall, aufgerundet: zu weit zu springen faellt
   * niemandem auf, zu wenig schon.
   */
  scroll-padding-top: calc(112px + var(--s-4));
}

body {
  margin: 0;
  background: var(--c-ground);
  color: var(--c-ink);
  font-family: var(--f-body);
  font-size: var(--fs-base);
  line-height: var(--lh-text);
  /* -webkit-font-smoothing und text-rendering bewusst entfernt: das
     erste tut unter Windows nichts und duennt den Satz auf dem Mac
     aus - es verschaerft genau die Plattformdifferenz, die der
     Schriftwechsel beseitigt. */
}

h1, h2, h3, h4, h5, h6 {
  font-family: var(--f-display);
  font-weight: var(--fw-bold);
  line-height: var(--lh-tight);
  /* Laufweite und Umbruch stehen im Abschnitt "Satzbild": negative
     Laufweite ist eine Korrektur fuer Displaygroessen und hat bei
     17 px nichts zu suchen. */
  margin: 0 0 var(--s-4);
  color: var(--c-ink);
}

/* Ueberschriften: siehe Abschnitt "Satzbild" weiter unten. */

p { margin: 0 0 var(--s-4); }

/*
 * Ohne diese Regel erbt <strong> den Browserwert 700 - und innerhalb einer
 * Ueberschrift (die schon 600 traegt) sogar 900. Auf UEBER UNS waren das
 * 55 beziehungsweise 11 Vorkommen: zwei zusaetzliche Schriftschnitte, die
 * niemand vorgesehen hat.
 */
strong, b { font-weight: var(--fw-bold); }
h1 strong, h2 strong, h3 strong, h4 strong, h5 strong, h6 strong,
h1 b, h2 b, h3 b, h4 b, h5 b, h6 b { font-weight: inherit; }

a { color: var(--c-maroon); text-decoration-thickness: 1px; text-underline-offset: 2px; }
a:hover { color: var(--c-maroon-dark); }

/* Sichtbarer Fokus - Pflicht, nicht Geschmackssache. Wird nur bei
   Tastaturbedienung gezeigt, damit Mausklicks keinen Rahmen hinterlassen. */
:focus-visible {
  outline: 2px solid var(--c-maroon);
  outline-offset: 2px;
  border-radius: 2px;
}

img, picture, svg, video {
  max-width: 100%;
  height: auto;
  display: block;
}

figure { margin: 0 0 var(--s-5); }
figcaption {
  font-size: var(--fs-sm);
  color: var(--c-ink-2);
  padding-top: var(--s-2);
}

hr {
  border: 0;
  border-top: 1px solid var(--c-rule);
  margin: var(--s-7) 0;
}

blockquote {
  margin: 0 0 var(--s-5);
  padding: var(--s-2) 0 var(--s-2) var(--s-5);
  border-left: 3px solid var(--c-maroon);
  font-family: var(--f-display);
  font-size: var(--fs-lg);
  color: var(--c-ink-2);
}

code, kbd, pre {
  font-family: var(--f-mono);
  font-size: var(--fs-sm);
}
pre {
  background: var(--c-sunk);
  padding: var(--s-4);
  overflow-x: auto;
  border-radius: var(--radius);
}

table { border-collapse: collapse; width: 100%; }

/* Breite Inhalte scrollen in sich, nie die ganze Seite. */
.table-wrap { overflow-x: auto; margin-bottom: var(--s-5); }

/* ==========================================================================
   2b. SATZBILD
   Aus der Begutachtung durch Typografie, Grafik und Lesbarkeitspruefung.
   Jede Regel hier ersetzt eine, die vorher an anderer Stelle stand -
   es kommt nichts additiv dazu.
   ========================================================================== */

/* ==========================================================================
   A. SATZSPIEGEL — das ist der eigentliche Eingriff
   Ersetzt style.css:248-258 vollstaendig.

   Gemessen auf /uber-uns/: von rund 40.000 Zeichen Fliesstext stehen
   37.544 (94 %) in 14 <details>-Bloecken. Der bisherige Selektor
   `.prose > p` ist ein Kind-Kombinator und erreicht Enkel nicht - diese
   Bloecke liefen ungedeckelt ueber 1116 px, die laengste Zeile mit rund
   115 Zeichen. Das ist der groesste Einzeleffekt auf dieser Website.
   ========================================================================== */

/*
 * .not-prose: Bauteile im Fliesstext.
 *
 * Kalender, Lehrende, Downloads und Formulare werden per Shortcode IN
 * .prose gerendert (inc/shortcodes.php huellt jede Ausgabe in
 * <div class="not-prose">). Jede .prose-Regel schliesst deshalb aus, was
 * in diesem Umschlag steht - sonst bekommt der Monatsname des Kalenders
 * eine Linie und 528 px Lesebreite, und die Gruppenkoepfe der Lehrenden
 * zwei Linien uebereinander (gemessen auf /kalender/ und /lehrerinnen/,
 * Pruefbericht D-02).
 *
 * :not(:where(...)) statt :not(...): :where hat keine Spezifitaet, die
 * Regeln behalten also exakt ihr bisheriges Gewicht in der Kaskade. Ein
 * blosses :not(.not-prose *) haette jede Regel um eine Klasse angehoben
 * und still Bauteilregeln geschlagen, die heute gewinnen (etwa
 * .wp-block-column > :first-child oder .section-head h2 { margin: 0 }).
 */
.prose :is(p, ul, ol, dl, blockquote, summary,
           h1, h2, h3, h4, h5, h6):not(:where(.not-prose *)) {
  max-width: var(--measure);
}

/* Medien duerfen weiter ueber die volle Containerbreite laufen. */
.prose :is(figure, table, .table-wrap, .wp-block-gallery, .wp-block-embed,
           .gallery, .alignwide, .alignfull):not(:where(.not-prose *)) {
  max-width: none;
}

/* ZWINGEND. Die Redaktion legt Bilder nicht in <figure>, sondern in
   <p> und an fuenf Stellen sogar in Ueberschriften: auf /uber-uns/
   allein 48 Absaetze mit <img>, dazu zwei Galerien in <p>. Ohne diese
   Zeile schrumpfen die Bildstrecken der 14 Rueckblicke von 1116 auf
   528 px - derselbe Fehler wie vorher, nur andersherum. */
.prose :is(p, h1, h2, h3, h4, h5, h6):has(img, iframe, video, .gallery):not(:where(.not-prose *)) {
  max-width: none;
}

/* TEXTRAHMEN MITTIG, TEXT LINKSBUENDIG (einspaltige Seiten)

   Auf Seiten, Programmen, Beitraegen, Personen und Downloads steht die
   528-px-Lesespalte unter einem 1116 px breiten Aufmacher. Linksbuendig
   im Umschlag blieben rechts 588 px leer - die Seite sah aus, als fehle
   dort etwas (Rueckmeldung Andreas, 21.09.2026).

   Nicht die Absaetze einzeln zentrieren (margin-inline: auto): dann
   stuenden umflossene Bilder (figure.alignleft) am Rand des Umschlags,
   weit weg vom Text, und wuerden nicht mehr umflossen. Stattdessen
   bekommt der Textcontainer einen symmetrischen Innenabstand, so gross
   wie der Platz neben der Lesespalte. Alles, was heute breiter laufen
   darf (Medienliste oben, Bausteine, Spaltensatz), tritt mit demselben
   Mass als negativem Rand wieder heraus - nichts davon wird schmaler.

   Das Mass kommt aus Container-Einheiten: 100cqw ist die Breite des
   Umschlags (.wrap bzw. .wrap--narrow), fuer Container und Kinder
   dieselbe Bezugsgroesse. Unter 528 px wird der Abstand 0, die
   Mobilansicht aendert sich nicht. Die Terminseite ist zweispaltig und
   bleibt aussen vor - dort gibt die Spalte das Mass.

   Einzelne Bilder bleiben IM Rahmen: ein Bild allein in einem Absatz
   oder ein Bild-Block richtet sich an der Lesespalte aus und wird
   hoechstens 528 px breit (Rad des Lebens auf /kalender/: 529 -> 528).
   Links liegende Einzelbilder neben einer mittigen Spalte sahen aus wie
   verrutscht. Heraus treten nur Dinge, die die Breite brauchen:
   Bildstrecken (mehrere Bilder in einem Absatz), Galerien, Videos,
   Tabellen, Spaltensatz, Bausteine und alles mit "weite Breite". */
.page-article > .wrap { container-type: inline-size; }
.page-article .prose {
  --prose-rand: max(0px, calc((100cqw - var(--measure)) / 2));
  padding-inline: var(--prose-rand);
}
/* Auch eine Ebene tiefer: die 14 Rueckblicke auf /uber-uns/ liegen in
   <details>, und dort stehen die Bildstrecken und Videos. Das <details>
   selbst bleibt in der Spalte (Titelzeile buendig mit dem Text), seine
   breiten Kinder treten mit demselben Mass heraus. */
:is(.page-article .prose, .page-article .prose > details)
  > :is(table, .table-wrap, .wp-block-gallery, .wp-block-embed, .video-facade,
        .gallery, .alignwide, .alignfull, .wp-block-columns,
        .not-prose, .shortcode-block):not(.alignleft, .alignright),
:is(.page-article .prose, .page-article .prose > details)
  > figure:not(.wp-block-image, .alignleft, .alignright),
:is(.page-article .prose, .page-article .prose > details)
  > :is(p, h1, h2, h3, h4, h5, h6):has(iframe, video, .gallery, img ~ img) {
  margin-inline: calc(-1 * var(--prose-rand));
}

/* Eine herausgetretene Bildstrecke, die schmaler ist als der Umschlag,
   steht mittig unter der mittigen Spalte - sonst haengt sie links wie
   vorher der Text. Inline gesetzte Bilder richtet text-align aus, als
   Block gesetzte (Gutenberg-Bildblock, Bild in Ueberschrift) der
   automatische Rand. Galerien und Tabellen bleiben aussen vor: die
   Galerie ist ein Flex-Raster, in Tabellen wuerde text-align die
   Zellen zentrieren. */
:is(.page-article .prose, .page-article .prose > details)
  > :is(p, h1, h2, h3, h4, h5, h6):has(iframe, video, .gallery, img ~ img) {
  text-align: center;
}
:is(.page-article .prose, .page-article .prose > details)
  > :is(p, h1, h2, h3, h4, h5, h6):has(img ~ img) > img,
:is(.page-article .prose, .page-article .prose > details)
  > :is(p, h1, h2, h3, h4, h5, h6):has(img ~ img) > a > img {
  margin-inline: auto;
  /* Ein alignleft aus der Elementor-Zeit inmitten einer Bildstrecke
     liesse genau dieses eine Bild links haengen (/uber-uns/, Rueckblick
     mit 300er-Bild plus 225er-Bild). In einer Strecke gibt es nichts zu
     umfliessen. */
  float: none;
}

/* Der Akkordeon-Titel ist die Zeile, an der der Leser die Seite
   ueberfliegt. 14 Stueck, bisher 17 px im Fliesstextschnitt auf
   1116 px Breite. */
.prose summary:not(:where(.not-prose *)) {
  font-family: var(--f-display);
  font-size: var(--fs-md);
  font-weight: var(--fw-bold);
  line-height: var(--lh-snug);
  cursor: pointer;
}


/* ==========================================================================
   B. VERTIKALER RHYTHMUS
   Ersetzt p { margin: 0 0 var(--s-4) } fuer den Fliesstext und
   .prose > h2/h3 { margin-top: ... } (style.css:167, 257-258).

   Gemessen war: H2 oben 48 px, H2 unten 16 px, Absatz zu Absatz 16 px.
   Die Ueberschrift stand also von IHREM Text genauso weit entfernt wie
   zwei fremde Absaetze voneinander - sie gehoerte optisch zu niemandem.
   Ab jetzt ist der Abstand unter einer Ueberschrift immer kleiner als
   der Absatzabstand, und alle Werte sind Vielfache der Zeile (27,2 px).
   ========================================================================== */

.prose :is(p, ul, ol, dl, blockquote, figure, table):not(:where(.not-prose *)) {
  margin-block: 0 calc(var(--lead) * .60);      /* 16,3 px */
}
.prose h2:not(:where(.not-prose *))          { margin-block: calc(var(--lead) * 1.75) calc(var(--lead) * .35); }  /* 47,6 / 9,5 */
.prose h3:not(:where(.not-prose *))          { margin-block: calc(var(--lead) * 1.20) calc(var(--lead) * .30); }  /* 32,6 / 8,2 */
.prose :is(h4,h5,h6):not(:where(.not-prose *)) { margin-block: calc(var(--lead) * .95) calc(var(--lead) * .25); } /* 25,8 / 6,8 */

/* Bindet JEDE Ueberschrift an ihren Folgeabsatz, nicht nur h2 und h3. */
/*
 * Dieselbe Geste wie .section-head im Template, eine Stufe leiser.
 * "Über uns" hat 18 H2 und keinerlei Gliederung, "Programm" zwoelf.
 * Die Startseite enthaelt .prose kein einziges Mal - nachgezaehlt im
 * ausgelieferten HTML, nicht angenommen.
 */
.prose h2:not(:where(.not-prose *)) {
  padding-bottom: var(--s-2);
  border-bottom: 1px solid var(--c-rule);
}

/* Sicherheitsnetz fuer maßlose SVG im Fliesstext.
   Ein <svg> ohne width und height und ohne CSS-Groesse skaliert auf
   die Breite seines Containers. Auf "Seminare & Retreats" wurden aus
   acht 16-Pixel-Pfeilen so acht bildschirmbreite Keile.
   Die Reste sind entfernt, aber jeder Einbaucode, den die Redaktion
   kuenftig irgendwo hineinkopiert, bringt dasselbe Problem mit.
   Ein Symbol im Fliesstext ist zeilenhoch - mehr braucht es nicht. */
.prose svg:not([width]):not([height]):not(:where(.not-prose *)) {
  width: 1em;
  height: 1em;
  vertical-align: -0.125em;
}

/* Auch das Bauteil selbst (.not-prose) ausnehmen, nicht nur seine
   Kinder: auf /kalender/ folgt der Kalender-Umschlag auf eine H6 mit
   den Messenger-Links, und diese Regel nahm ihm den oberen Rand - der
   Monatskopf klebte an der Linkzeile (F-02). Ein Bauteil bringt seinen
   Abstand mit (9d), eine Ueberschrift darueber aendert das nicht. */
.prose :is(h1,h2,h3,h4,h5,h6) + *:not(:where(.not-prose, .not-prose *)) { margin-top: 0; }

.prose :is(ul, ol):not(:where(.not-prose *)) { padding-left: 1.4em; }
.prose li + li:not(:where(.not-prose *))     { margin-top: calc(var(--lead) * .25); }
.prose > :first-child { margin-top: 0; }
.prose > :last-child  { margin-bottom: 0; }


/* ==========================================================================
   C. UEBERSCHRIFTEN — ersetzt style.css:130-165
   ========================================================================== */

h1, h2, h3, h4, h5, h6 {
  font-family: var(--f-display);
  font-weight: var(--fw-bold);
  line-height: var(--lh-tight);
  margin: 0 0 var(--s-4);
  color: var(--c-ink);

  /* Negative Laufweite ist eine Korrektur fuer Displaygroessen.
     Pauschal auf sechs Ebenen gelegt traf sie auch die 34 Elemente,
     die auf /uber-uns/ bei 17 px stehen: -0,204 px pro Zeichen, in
     einer Grotesk bei Textgroesse schlicht falsch. Sie wird unten
     gezielt wieder vergeben. */
  letter-spacing: normal;

  /* Notnagel gegen deutsche Komposita in schmalen Kaesten. */
  overflow-wrap: break-word;

  /* Getrennte Ueberschriften sind unschoen, und zusammen mit
     text-wrap: balance waeren es zwei Eingriffe in denselben Umbruch. */
  hyphens: manual;
}

h1 { font-size: var(--fs-xl); }
h2 { font-size: var(--fs-lg); }
h3 { font-size: var(--fs-md); line-height: var(--lh-snug); }

/* h4 bis h6 nach dem Redaktionslauf.
   Sie standen auf Schnitt 400 und gedaempfter Farbe, weil 202 der 983
   Elemente dieser Ebenen falsch ausgezeichnet waren: 158 Absaetze mit
   ueber 120 Zeichen, 12 blosse Bildhuellen, 32 leere. Halbfett waeren
   daraus graue Kloetze geworden.
   Diese 202 sind inzwischen zu Absaetzen geworden (siehe Skript
   h456_bereinigen.php). Nachgezaehlt sind jetzt 100 Prozent der 781
   verbliebenen Elemente kuerzer als 120 Zeichen, also echte
   Ueberschriften. Sie duerfen deshalb wieder aussehen wie welche -
   vorher waren sie von einem Absatz nicht zu unterscheiden: gleiche
   Groesse, gleicher Schnitt, gleiche Familie.
   Keine neuen Werte: --fs-base und --fs-sm sind gesetzt, --fw-bold ist
   der zweite und letzte Schnitt.
   Weiterhin BEWUSST OHNE VERSALIEN - 221 dieser Ueberschriften sind
   zwischen 60 und 120 Zeichen lang, das waere eine Wand. */
h4 {
  font-family: var(--f-body);
  font-size: var(--fs-base);
  font-weight: var(--fw-bold);
  line-height: var(--lh-snug);
  color: var(--c-ink);
}

h5, h6 {
  font-family: var(--f-body);
  font-size: var(--fs-sm);
  font-weight: var(--fw-bold);
  line-height: var(--lh-snug);
  color: var(--c-ink-2);
}

/* Ausnahme fuer die Abschnittskoepfe: H1-Groesse und die Laufweite der
   grossen Grade. Der Seitentitel .page-header__title traegt dieselben
   Werte - sie stehen bei seiner Bauteildefinition in Abschnitt 10b, damit
   jeder Selektor genau EINE Definition hat (vorher stand er hier, in
   Abschnitt I und in 10b, und die letzte Fassung gewann still, D-11). */
.section-head :is(h1, h2) { font-size: var(--fs-xl); letter-spacing: -0.012em; }

/* --fs-hero ist kein Token mehr. Der Wert steht unveraendert an seiner
   einzigen Verwendungsstelle (.hero__title, Abschnitt 6) - dort auch die
   negative Laufweite -0.018em: eine Korrektur fuer Displaygroessen, die
   nur dorthin gehoert, wo tatsaechlich gross gesetzt wird. */
h2, .card__title, .event-row__title { letter-spacing: -0.008em; }

/* text-wrap: balance ist die beste einzelne Zeile im Stylesheet -
   aber nur dort, wo sie greift. Browser schalten oberhalb von rund
   sechs Zeilen ab, auf einem 1030-Zeichen-h6 tut sie nichts.
   .hero__title, .page-header__title und .next-event__title tragen die
   Zeile in ihrer eigenen Definition. */
h1, h2, h3,
.card__title, .event-row__title { text-wrap: balance; }
h4, h5, h6 { text-wrap: initial; }


/* ==========================================================================
   D. SILBENTRENNUNG UND NOTNAEGEL
   <html lang="de"> steht bereits korrekt auf allen Seiten - die halbe
   Voraussetzung war erfuellt, im Stylesheet stand zu hyphens bisher
   nichts. Ehrlich eingeordnet: hyphens: auto haengt am Trennwoerterbuch
   des Systems und greift nicht ueberall. Es ist Vorsorge, kein Fix -
   deshalb kommt der Notnagel dazu, der IMMER wirkt.
   ========================================================================== */

.prose :is(p, li, dd, blockquote, summary):not(:where(.not-prose *)) {
  hyphens: auto;
  -webkit-hyphens: auto;
  hyphenate-limit-chars: 7 4 3;
  overflow-wrap: break-word;      /* faengt E-Mail-Adressen und URLs ab,
                                     die hyphens: auto nicht trennt */
}

:is(.card__title, .kategorie__name, .site-brand__name,
    .download-row__title, .event-row__title, dd, td, th) {
  overflow-wrap: break-word;
}

/* Einzelne Woerter in der Absatzendzeile - kostet nichts, reiner
   Fallback in Browsern, die es nicht koennen. */
.prose :is(p, li):not(:where(.not-prose *)), .card__excerpt {
  text-wrap: pretty;
}
/* .hero__lead und .page-header__lead tragen text-wrap: pretty in ihrer
   eigenen Definition (Abschnitte 6 und 10b). */


/* ==========================================================================
   E. ZIFFERN — die Voreinstellung dreht sich um
   Segoe UI setzt ohne Zutun tabellarisch (alle zehn Ziffern 0,5391 em).
   Im Fliesstext heisst das: "1. Jaenner 2026" mit einer ueberbreiten
   Eins, die mitten im Wortbild ein Loch reisst. Die 9 Stellen mit
   --num schalten weiterhin bewusst auf tabellarisch zurueck - sie
   bewirken jetzt erstmals etwas.
   ========================================================================== */

body { font-variant-numeric: proportional-nums; }

:is(table, .calendar, .bank-details, time,
    .next-event__when, .event-row__meta, .kategorie__zahl) {
  font-variant-numeric: var(--num);
}


/* ==========================================================================
   F. GLAETTUNG — zwei Zeilen ersatzlos streichen (style.css:126-127)
   -webkit-font-smoothing: antialiased tut unter Windows nichts und
   duennt den Satz auf dem Mac aus - es verschaerft also genau die
   Plattformdifferenz, die der Schriftwechsel beseitigen soll. Bei
   einer Serifenschrift ist das der Unterschied zwischen zart und
   kraftlos. text-rendering: optimizeLegibility ist in heutigen
   Browsern folgenlos bis teuer.
   ========================================================================== */

body {
  font-family: var(--f-body);
  font-size: var(--fs-base);
  line-height: var(--lh-text);
  /* -webkit-font-smoothing und text-rendering entfernt */
}
h1, h2, h3 { font-kerning: normal; }


/* ==========================================================================
   G. DIE ZWEI SEITEN, DIE KEIN .prose HABEN
   /download/ und /termin/ werden von allem oben nicht erreicht. Auf der
   Mediathek rendern 175 Blattelemente in vier Groessen (76x 13, 65x 15,
   33x 17, 1x 36,6 px) - und der Kategoriename stand mit 15 px KLEINER
   als der Dateititel mit 17 px darunter. Die Navigationsebene war
   schwaecher ausgezeichnet als die Inhaltsebene. Mit --fs-md ist das
   ohne neue Stufe geloest.

   Die Werte selbst stehen bei den Bauteilen: .kategorie__name und
   .kategorie__zahl in Abschnitt 9b, .site-footer__bottom in Abschnitt 12.
   Sie standen hier ein zweites Mal, und weil die Bauteile spaeter im
   Stylesheet kommen, gewann deren alte Fassung still: der Kategoriename
   war wieder 15 px, das Copyright stand mit --c-ink-3 bei 2,93:1 statt
   der gerechneten 6,37:1 (Pruefbericht D-03, D-11).

   .download-row__title bleibt bei --fs-base und bleibt in der
   Grundschrift - die Zeile soll unter der Kachel stehen, nicht
   neben ihr. Unveraendert.
   ========================================================================== */


/* ==========================================================================
   H. KOPFZEILE AUF DEM TELEFON
   Bei 375 px laesst sich jede Seite um 146 px seitlich wegschieben, der
   Menueknopf liegt teilweise ausserhalb. Ursache ist rein typografisch:
   .site-brand steht auf flex: none, und der 36 Zeichen lange
   Vereinsname (326 px in Palatino Bold, 361 px in Georgia Bold bei
   17 px) darf nicht brechen. Mit Georgia wird die Korrektur von
   optional zu zwingend: min-width: 0 an .site-brand__text - es steht
   bei der Bauteildefinition in Abschnitt 5, hier nur die Begruendung.
   ========================================================================== */


/* ==========================================================================
   I. KANTEN IM SEITENKOPF
   Bisher drei Breiten, keine davon mit der Textspalte geteilt:
   .page-header__title 24ch in Palatino 36,8 px = 441 px,
   .page-header__lead 54ch in Segoe UI 22,4 px = 638 px,
   Absatzspalte 623 px. Jetzt teilen alle drei dieselbe Bezugsgroesse:
   Titel calc(var(--measure) * .82) = 433 px, Vorspann var(--measure)
   = 528 px - eingetragen an den Bauteilen in Abschnitt 10b, damit jeder
   Selektor genau eine Definition hat.

   Der siebte Breitenwert im Stylesheet (46ch am .hero__lead) faellt
   damit auch weg. Bei 899 px Viewport hat er tatsaechlich gegriffen -
   ein Deckel ist also noetig, nur nicht in ch. 554 px entspricht der
   heutigen Hero-Spalte von 552 px, der Aufmacher bricht unveraendert:
   calc(var(--measure) * 1.05), eingetragen in Abschnitt 6.
   ========================================================================== */


/* ==========================================================================
   J. NETZ GEGEN DIE MIGRATIONSRESTE
   Geprueft am ausgelieferten HTML von /uber-uns/: 6 Absaetze <p></p>
   und 6 Absaetze, die nur ein geschuetztes Leerzeichen enthalten, dazu
   rund 7 leere Ueberschriften. Jeder davon traegt seinen vollen
   Vorschub - deshalb stehen zwischen zusammengehoerenden Absaetzen mal
   16, mal 44, mal 92 px. Das ist die zweite Ursache des zerfallenden
   Rhythmus, und kein CSS-Eingriff an den Abstaenden repariert sie.

   (Eine Begutachtung nannte 62 leere Absaetze. Nachgezaehlt: 48 davon
   enthalten ein Bild und sind nicht leer. Die belastbare Zahl ist 12.)

   Die Regel ist ein Netz, keine Loesung - die Elemente gehoeren im
   Editor geloescht.
   ========================================================================== */

.prose p:empty:not(:where(.not-prose *)),
.prose :is(h1,h2,h3,h4,h5,h6):empty:not(:where(.not-prose *)) { display: none; }
/* <p>&nbsp;</p> ist nicht :empty - die 6 Stueck muss die Redaktion
   von Hand entfernen. */


/* ==========================================================================
   K. EMOJI IN UEBERSCHRIFTEN — vorbereitet, aber nicht aktiv
   Ausgezaehlt im ausgelieferten HTML: Startseite 30 von 49
   Ueberschriften mit Emoji, 79 Emoji-Zeichen; /termin/ aehnlich;
   /uber-uns/ 8 von 57; /download/ null. Sie rendern aus Segoe UI
   Emoji - einer dritten, vollfarbigen Familie, die in keinem Token
   steht. Keine dieser Ueberschriften beginnt optisch dort, wo der Text
   darunter beginnt, weil die Emojibreite die Startkante verschiebt.

   Das ist eine Redaktionsentscheidung, keine CSS-Entscheidung, und
   deshalb ist hier nichts aktiv. Wenn die Emoji bleiben sollen, loest
   der Template-Weg das Satzproblem, ohne den Inhalt zu aendern: in
   inc/template-tags.php das fuehrende Emoji per preg_match aus dem
   Titel loesen und als eigenes Element davorsetzen. Dann steht die
   linke Textkante, und das Piktogramm laeuft nicht mehr auf
   Ueberschriftengroesse mit.
   ========================================================================== */

/*
.titel-marke {
  float: left;
  width: 1.4em;
  margin-left: -1.6em;
  font-size: .78em;
  line-height: inherit;
  text-align: left;
}
@media (max-width: 899px) {
  .titel-marke { float: none; margin-left: 0; margin-right: .2em; }
}
*/


/* ==========================================================================
   3. Layout
   ========================================================================== */

.wrap {
  width: 100%;
  max-width: var(--wide);
  margin-inline: auto;
  padding-inline: var(--s-5);
}
@media (min-width: 640px) { .wrap { padding-inline: var(--s-6); } }

.wrap--narrow { max-width: var(--narrow); }

/* Satzspiegel und Rhythmus: siehe Abschnitt "Satzbild" weiter unten.
   Nur die Bildregel bleibt hier. */
.prose img:not(:where(.not-prose *)) { border-radius: var(--radius); margin-block: var(--s-5); }

/*
 * ... aber NICHT fuer Bilder in Bauteilen.
 *
 * Die Regel darueber gilt freistehenden Bildern im Fliesstext. Bauteile
 * wie die Personenkachel oder die Video-Vorschau werden jedoch per
 * Shortcode IN den Inhalt gerendert und stehen damit ebenfalls in
 * .prose. Sie haben feste Rahmen mit overflow: hidden - ein Rand von
 * 24 Pixeln schiebt das Bild darin nach unten, oben bleibt der
 * Hintergrund stehen und unten wird abgeschnitten.
 *
 * Gemessen, bevor das hier stand: 28 Portraets auf der Lehrenden-Seite
 * und 26 Standbilder in der Mediathek sassen 24 Pixel zu tief. Bei
 * einem Kreis von 148 Pixeln ist das ein Sechstel.
 *
 * Wer einen fuenften Rahmen baut, traegt ihn hier nach. Es sind
 * dieselben Rahmen, die in plc_fokus_rahmen() stehen.
 */
.prose :is(.person__photo, .card__media, .event-row__thumb, .page-figure, .video-facade) img:not(:where(.not-prose *)) {
  margin-block: 0;
}

.section { padding-block: var(--s-8); }
.section--tight { padding-block: var(--s-7); }
.section--sunk { background: var(--c-sunk); }
.section--surface { background: var(--c-surface); }

.section-head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-3) var(--s-5);
  /* --s-7 wie .page-header: vom Kopf zum Inhalt derselbe Abstand, egal
     ob Band oder Abschnittskopf (D-15). */
  margin-bottom: var(--s-7);
  padding-bottom: var(--s-3);
  border-bottom: 2px solid var(--c-ink);
}
.section-head :is(h1, h2) { margin: 0; }
.section-head .section-more { font-size: var(--fs-sm); font-weight: var(--fw-bold); white-space: nowrap; }
/* Der Abschnittskopf traegt dieselben drei Zeilen wie das Band
   .page-header (Kicker, Titel, Vorspann - plc_seitenkopf() in
   inc/template-tags.php gibt beide Stile aus) mit denselben Abstaenden:
   Kicker zum Titel --s-3, Titel zum Vorspann --s-4, Kopf zum Inhalt
   --s-7. Vorspann und Kicker nehmen die volle Zeile, sonst setzte sie
   der Flex-Umschlag neben den Titel. */
.section-head :is(.kicker, .page-header__kicker, .page-header__lead) { flex-basis: 100%; }

/* Der Kicker benennt den Abschnitt, ohne eine Ueberschriftenebene zu
   verbrauchen - so bleibt die H-Struktur sauber. */
/*
 * Ein Etikett, eine Definition. Vorher stand dieselbe Auszeichnung drei
 * Mal getrennt im Stylesheet (.kicker, .subpages__title, .site-footer h2)
 * mit je eigener Laufweite - solche Kopien driften beim naechsten
 * Feinschliff auseinander.
 */
.kicker,
.page-header__kicker,
.subpages__title,
.site-footer h2 {
  font-family: var(--f-body);
  font-size: var(--fs-xs);
  font-weight: var(--fw-bold);
  line-height: var(--lh-snug);
  letter-spacing: var(--track-caps);
  text-transform: uppercase;
}

.kicker,
.page-header__kicker {
  color: var(--c-maroon);
  margin: 0 0 var(--s-3);
}
/* Auf Einzelseiten ist der Kicker der Rueckweg (Termin -> "Termine",
   Person -> "Lehrer*innen", D-15/UX-13): ein Link in der Farbe des
   Etiketts, ohne Dauerunterstreichung - die kaeme bei 13 px Versalien
   der Kopflinie in die Quere. Der Strich erscheint beim Zeigen und beim
   Tastaturfokus. Weil die Farbe allein kein Hinweis ist (GUT-D-04: ein
   verlinkter Kicker sah exakt aus wie ein unverlinkter), steht ein
   Pfeil nach links davor - das Zeichen fuer "zurueck", ohne die
   Kopflinie zu beruehren. Die zweite content-Deklaration mit dem
   Schraegstrich und leerem Alternativtext nimmt den Pfeil aus dem
   Vorlesetext (Screenreader sagen sonst "Pfeil nach links Termine");
   Browser ohne diese Syntax behalten die erste Deklaration und lesen
   den Pfeil mit - unschoen, nicht falsch. */
:is(.kicker, .page-header__kicker) a {
  color: inherit;
  text-decoration: none;
}
:is(.kicker, .page-header__kicker) a::before {
  content: "\2190\00a0";
  content: "\2190\00a0" / "";
}
:is(.kicker, .page-header__kicker) a:hover,
:is(.kicker, .page-header__kicker) a:focus-visible {
  color: var(--c-maroon-dark);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
}

.grid { display: grid; gap: var(--s-5); }
.grid--2 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr)); }
.grid--3 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); }
/* auto-fill statt auto-fit: auto-fit zieht eine unvolle letzte Reihe
   auseinander, wodurch der Abstand zwischen zwei Portraets je nach
   Gruppengroesse zwischen 80 und 422 px sprang. .grid--3 bleibt auf
   auto-fit - es steht nur auf der Startseite und endet dort buendig. */
/* 150 statt 200 px Mindestbreite: bei 390 px Viewport (342 px innen)
   passte genau EINE Spalte, und 27 Lehrende standen auf rund 5.800 px
   untereinander. Zwei Kreise zu 148 px plus 24 px Luecke = 320 px haben
   Platz. Ergibt 2 Spalten ab ~340 px, unveraendert 5-6 auf dem Desktop
   (D-17). */
.grid--4 { grid-template-columns: repeat(auto-fill, minmax(min(100%, 150px), 1fr)); }

/* ==========================================================================
   4. Sprunglink
   Er existiert, er zeigt auf ein Ziel das es gibt, und er wird bei
   Tastaturfokus sichtbar. display:none wuerde ihn der Tastatur nehmen.
   ========================================================================== */

.skip-link {
  position: absolute;
  left: var(--s-4);
  top: var(--s-4);
  z-index: 200;
  transform: translateY(-200%);
  background: var(--c-maroon);
  color: #fff;
  padding: var(--s-3) var(--s-5);
  border-radius: var(--radius);
  font-weight: var(--fw-bold);
  text-decoration: none;
  transition: transform .15s ease;
}
.skip-link:focus { transform: translateY(0); color: #fff; }

/* Fuer Screenreader da, visuell nicht. */
.visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* ==========================================================================
   5. Kopfbereich und Navigation
   ========================================================================== */

/* ==========================================================================
   TITELBAND GANZ OBEN

   Der Vereinsname, in der Linkfarbe hinterlegt. Bewusst keine neue
   Farbe: Weiss auf --c-maroon ist im Haus schon gesetzt, siehe die
   Terminkarte .next-event auf der Startseite.

   Es scrollt mit weg - klebrig ist nur die Kopfzeile darunter, und
   zwei uebereinander klebende Baender fraessen auf dem Telefon ein
   Fuenftel der Hoehe.
   ========================================================================== */

.site-titelband {
  background: var(--c-maroon);
  color: #fff;
}

.site-titelband__titel {
  margin: 0;
  padding-block: var(--s-2);
  text-align: center;
  font-family: var(--f-display);
  font-size: var(--fs-base);
  font-weight: var(--fw-bold);
  line-height: var(--lh-snug);
  letter-spacing: -0.01em;
}

@media (max-width: 599px) {
  /* Eine Stufe kleiner, damit der 36 Zeichen lange Name in eine Zeile
     passt. Gemessen bei 375 px: mit 17 px zwei Zeilen und 62 px Band,
     mit 15 px eine Zeile und 39 px. */
  .site-titelband__titel { font-size: var(--fs-sm); }
}


.site-header {
  background: var(--c-surface);
  border-bottom: 1px solid var(--c-rule);
  position: sticky;
  top: 0;
  z-index: 100;
}

.site-header__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-5);
  min-height: 72px;
  padding-block: var(--s-3);
}

/* Der Seitenkopf ist ein Link, keine Ueberschrift. Genau deshalb
   entsteht hier keine zweite H1. */
.site-brand {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  text-decoration: none;
  color: var(--c-ink);
  /*
   * flex: none, seit der Vereinsname im Titelband oben steht und hier
   * nur noch das Logo haengt. Dazwischen stand hier eine Zeit lang
   * flex: 1 1 auto, weil der 36 Zeichen lange Name nicht umbrechen
   * durfte und die Kopfzeile bei 375 px um 182 px nach rechts schob.
   * Mit dem Namen ist auch der Grund weggefallen - und flex: 1 1 auto
   * liess die Marke 376 statt 51 Pixel breit werden, wodurch beide
   * Menuehaelften umbrachen.
   */
  flex: none;
  min-width: 0;
}
.site-brand img { width: auto; height: 48px; }
.site-brand__text { display: flex; flex-direction: column; line-height: var(--lh-tight); min-width: 0; } /* min-width: siehe Abschnitt H */
.site-brand__name {
  font-family: var(--f-display);
  font-size: var(--fs-base);
  font-weight: var(--fw-bold);
  letter-spacing: -0.01em;
}
.site-brand__sub {
  font-size: var(--fs-xs);
  color: var(--c-ink-3);
}
@media (max-width: 599px) {
  /* 15 statt 17 px: sonst bricht der Vereinsname auf drei Zeilen und die
     Kopfzeile waechst von 78 auf 105 px. */
  .site-brand__name { font-size: var(--fs-sm); }
  .site-brand__sub  { display: none; }
}

.nav-toggle {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  background: none;
  border: 1px solid var(--c-rule-ctrl);
  border-radius: var(--radius);
  padding: var(--s-2) var(--s-3);
  font: inherit;
  font-size: var(--fs-sm);
  font-weight: var(--fw-bold);
  color: var(--c-ink);
  cursor: pointer;
}
.nav-toggle:hover { border-color: var(--c-ink-3); }
.nav-toggle__bars { display: block; width: 18px; height: 2px; background: currentColor; position: relative; }
.nav-toggle__bars::before,
.nav-toggle__bars::after {
  content: ""; position: absolute; left: 0; width: 18px; height: 2px; background: currentColor;
}
.nav-toggle__bars::before { top: -6px; }
.nav-toggle__bars::after { top: 6px; }

/* Lupe in der Kopfzeile: ein Link auf die Suchseite, kein Aufklappfeld.
   Masse wie der Menueknopf, damit beide auf einer Linie sitzen -
   40 px sind zugleich das Mindestmass fuer eine Tippflaeche. */
.site-search {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border: 1px solid transparent;
  border-radius: var(--radius);
  color: var(--c-ink);
  text-decoration: none;
}
.site-search:hover {
  background: var(--c-sunk);
  color: var(--c-maroon);
}
.site-search__symbol { width: 20px; height: 20px; display: block; }

/* Auf der Suchseite selbst zeigt die Lupe, wo man ist. */
.search .site-search { color: var(--c-maroon); }

/*
 * Unter 600 px wird es in der Kopfzeile eng, und die Lupe hat den
 * Platz weiter verknappt.
 *
 * Gemessen bei 375 px, Kopfzeilenhoehe und Breite fuer den
 * Vereinsnamen:
 *     mit Text am Knopf          112 px   Name 149 px, fuenf Zeilen
 *     Abstand auf 12 px           112 px   Name 173 px
 *     Knopf nur als Symbol         77 px   Name 196 px
 *     beides                       77 px   Name 220 px
 *
 * Vor der Lupe waren es 78 px. Der Knopf ohne Beschriftung holt das
 * also vollstaendig zurueck - das Hamburgersymbol ist verstanden, und
 * der Text bleibt fuer Screenreader im Quelltext stehen.
 */
@media (max-width: 599px) {
  .site-header__inner { gap: var(--s-3); }

  .nav-toggle {
    /* 40 px bleibt das Mindestmass fuer eine Tippflaeche, auch ohne Text. */
    min-width: 40px;
    min-height: 40px;
    justify-content: center;
    padding: var(--s-2);
  }

  .nav-toggle__text {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }
}

.main-nav ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-1);
}
.main-nav a {
  display: block;
  padding: var(--s-2) var(--s-3);
  border-radius: var(--radius);
  text-decoration: none;
  font-size: var(--fs-sm);
  font-weight: var(--fw-bold);
  color: var(--c-ink);
}
.main-nav a:hover { background: var(--c-sunk); }
.main-nav .current-menu-item > a,
.main-nav .current_page_item > a,
.main-nav .current-menu-parent > a {
  color: var(--c-maroon);
  font-weight: var(--fw-bold);
  box-shadow: inset 0 -2px 0 var(--c-maroon);
}

/* --------------------------------------------------------------------------
   KOPFZEILE MIT LOGO IN DER MITTE

   Drei Menuepunkte, Logo, drei Menuepunkte, dann die Lupe.

   EIN <nav> mit zwei <ul>: fuer Screenreader ist das eine Landmark
   "Hauptnavigation", nicht zwei (vorher "Hauptnavigation" und
   "Hauptnavigation, Fortsetzung" fuer dasselbe Menue, UX-16). Die
   Aufteilung in Haelften macht plc_nav_haelfte() beim Ausgeben.

   Der Umschlag .site-nav-gruppe existiert nur fuer das Telefon: dort
   ist er das aufklappende Feld und haelt beide Listen zusammen.
   Ab 900 px loest display: contents den Umschlag UND das <nav> auf,
   damit die beiden Listen und das Logo als gleichrangige Kinder in
   derselben Flexzeile liegen - nur dann kann order das Logo dazwischen
   setzen. Die Landmark bleibt dabei erhalten: aktuelle Browser nehmen
   ein Element mit display: contents nicht mehr aus dem
   Zugaenglichkeitsbaum (der alte Fehler betraf Chrome vor 89 und
   Firefox vor 62).

   Im Quelltext steht das Logo vor dem Menue, im Bild dazwischen.
   Das ist die einzige Abweichung zwischen Lese- und Tabreihenfolge
   und sie betrifft genau ein Element: den Logolink, der ohnehin nach
   Hause fuehrt.
   -------------------------------------------------------------------------- */

@media (min-width: 900px) {
  .nav-toggle { display: none; }
  .site-nav-gruppe,
  .main-nav { display: contents; }

  .main-nav > ul:first-child { order: 1; }
  .site-brand { order: 2; }
  .main-nav > ul:last-child { order: 3; }
  .site-search { order: 4; }

  /* Beide Haelften bekommen gleich viel Raum, damit das Logo wirklich
     mittig sitzt und nicht dorthin rutscht, wo die Woerter kuerzer sind. */
  .main-nav > ul { flex: 1 1 0; min-width: 0; }
  .main-nav > ul:first-child { justify-content: flex-end; }
  .main-nav > ul:last-child { justify-content: flex-start; }

  .site-header__inner { gap: var(--s-4); }

  /*
   * Gegengewicht. Die Lupe steht nur rechts; ohne einen Platzhalter
   * gleicher Breite links saesse das Logo 36 Pixel neben der Mitte.
   * Ein Pseudoelement statt eines leeren div: es ist kein Inhalt und
   * soll auch keiner sein.
   */
  .site-header__inner::before {
    content: "";
    flex: none;
    width: 40px;
    order: 0;
  }
}

/* --------------------------------------------------------------------------
   BIS 900 PX: DAS MENUE KLAPPT AUF

   Genau EIN @media-Block fuer diese Breite. Vorher standen hier zwei
   mit derselben Bedingung: der aeltere setzte .main-nav wieder auf
   display: none und erwartete is-open auf dem <nav> selbst - das
   vergab nav.js laengst nicht mehr. Ergebnis war ein 40 px hohes
   leeres Feld mit sechs Links von 0 px Hoehe (Pruefbericht D-01).

   Reines <details>-Verhalten waere ohne JS moeglich, das Toggle wird
   aber fuer aria-expanded gebraucht. Ohne JS bleibt das Menue zu und
   alle Seiten sind ueber die Fusszeile erreichbar.
   -------------------------------------------------------------------------- */

@media (max-width: 899px) {
  /*
   * Logo links, Menueknopf und Lupe zusammen rechts. Ohne diese Zeile
   * verteilt justify-content: space-between die drei gleichmaessig und
   * der Menueknopf landet mitten im Nichts - eine Nebenwirkung davon,
   * dass die Marke seit dem Titelband nicht mehr waechst.
   */
  .site-brand { margin-right: auto; }

  /* Der Umschlag IST das Aufklappfeld. Die beiden Listen stehen
     darin untereinander und ergeben wieder eine durchgehende Liste. */
  .site-nav-gruppe {
    display: none;
    position: absolute;
    left: 0;
    right: 0;
    top: 100%;
    background: var(--c-surface);
    border-bottom: 1px solid var(--c-rule);
    box-shadow: var(--shadow-2);
    padding: var(--s-4) var(--s-5) var(--s-5);
  }
  .site-nav-gruppe.is-open { display: block; }

  .main-nav ul { flex-direction: column; gap: 0; }
  .main-nav li + li { border-top: 1px solid var(--c-rule); }
  /* Die Trennlinie muss auch zwischen den beiden Listen sitzen. */
  .main-nav > ul + ul > li:first-child { border-top: 1px solid var(--c-rule); }
  /* Eine Stufe groesser und mehr Hoehe: rund 50 px Tippflaeche je Punkt. */
  .main-nav a { padding: var(--s-3) var(--s-2); font-size: var(--fs-base); }
}

/* ==========================================================================
   6. Startseite: Aufmacher mit dem naechsten Termin
   Kein Slider. Ein Aufmacher, der eine Sache sagt - und die wichtigste
   Information der Seite ist, was als naechstes stattfindet.
   ========================================================================== */

.hero {
  background: var(--c-surface);
  border-bottom: 1px solid var(--c-rule);
}
.hero__inner {
  display: grid;
  gap: var(--s-7);
  padding-block: var(--s-8);
  align-items: start;
}
@media (min-width: 900px) {
  .hero__inner { grid-template-columns: 1.05fr 0.95fr; gap: var(--s-8); }
}

.hero__title {
  /* Einzelwert statt Token - die Groesse kommt genau hier einmal vor. */
  font-size: clamp(2rem, 1.35rem + 2.9vw, 3.1rem);
  line-height: var(--lh-tight);
  /* Negative Laufweite nur hier, wo tatsaechlich gross gesetzt wird. */
  letter-spacing: -0.018em;
  text-wrap: balance;
  margin-bottom: var(--s-5);
}
.hero__lead {
  font-size: var(--fs-lg);
  color: var(--c-ink-2);
  /* 554 px, aus --measure abgeleitet (Abschnitt I). 46ch stand hier
     noch einmal und gewann still: gemessen 463 statt 554 px (D-11). */
  max-width: calc(var(--measure) * 1.05);
  text-wrap: pretty;
  margin-bottom: var(--s-6);
}
.hero__actions { display: flex; flex-wrap: wrap; gap: var(--s-3); }

/* Die Karte des naechsten Termins. Sie ist das Herz der Startseite. */
.next-event {
  background: var(--c-maroon);
  color: #fff;
  border-radius: var(--radius);
  padding: var(--s-6);
  box-shadow: var(--shadow-2);
}
.next-event__kicker {
  font-size: var(--fs-xs);
  font-weight: var(--fw-bold);
  letter-spacing: var(--track-caps);
  text-transform: uppercase;
  color: #F0D9A8;
  margin: 0 0 var(--s-4);
  display: flex;
  align-items: center;
  gap: var(--s-2);
}
.next-event__when {
  font-variant-numeric: var(--num);
  font-size: var(--fs-sm);
  color: #F3DFDF;
  margin: 0 0 var(--s-2);
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-1) var(--s-4);
}
.next-event__title {
  /* Bewusst eine Stufe unter der Hero-Ueberschrift daneben. */
  font-size: var(--fs-lg);
  letter-spacing: -0.008em;
  text-wrap: balance;
  color: #fff;
  margin: 0 0 var(--s-4);
}
.next-event__title a { color: #fff; text-decoration: none; }
.next-event__title a:hover { color: #fff; text-decoration: underline; text-decoration-thickness: 2px; }
.next-event__meta {
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
  font-size: var(--fs-sm);
  color: #F3DFDF;
  margin-bottom: var(--s-5);
}
.next-event__meta strong { color: #fff; }
.next-event__excerpt { color: #F3DFDF; font-size: var(--fs-sm); margin-bottom: var(--s-5); }
.next-event .btn--ghost {
  border-color: rgba(255,255,255,.5);
  color: #fff;
}
.next-event .btn--ghost:hover { background: rgba(255,255,255,.12); border-color: #fff; color: #fff; }

/* Kein Termin in der Zukunft: ehrlich sagen statt leere Karte zeigen. */
.next-event--empty {
  background: var(--c-sunk);
  color: var(--c-ink-2);
  box-shadow: none;
  border: 1px solid var(--c-rule);
}
.next-event--empty .next-event__kicker { color: var(--c-maroon); }

/* ==========================================================================
   7. Schaltflaechen
   ========================================================================== */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--s-2);
  padding: var(--s-3) var(--s-5);
  border: 1px solid transparent;
  border-radius: var(--radius);
  font: inherit;
  font-size: var(--fs-sm);
  font-weight: var(--fw-bold);
  line-height: var(--lh-tight);
  text-decoration: none;
  cursor: pointer;
  transition: background-color .15s ease, border-color .15s ease, color .15s ease;
}
.btn--primary { background: var(--c-maroon); color: #fff; }
.btn--primary:hover { background: var(--c-maroon-dark); color: #fff; }
.btn--ghost { background: none; border-color: var(--c-rule-ctrl); color: var(--c-ink); }
.btn--ghost:hover { background: var(--c-sunk); border-color: var(--c-ink-3); color: var(--c-ink); }
.btn--small { padding: var(--s-2) var(--s-4); font-size: var(--fs-xs); }

/* ==========================================================================
   8. Termine: Liste, Karte, Datumsmarke
   ========================================================================== */

/* Die Datumsmarke. Sie macht das Datum zur schnellsten Information
   in der Liste - darum geht es auf dieser Seite. */
.date-badge {
  flex: none;
  width: 62px;
  text-align: center;
  background: var(--c-surface);
  border: 1px solid var(--c-rule);
  border-radius: var(--radius);
  overflow: hidden;
  line-height: var(--lh-tight);
}
.date-badge__month {
  display: block;
  background: var(--c-maroon);
  color: #fff;
  font-size: var(--fs-xs);
  font-weight: var(--fw-bold);
  letter-spacing: var(--track-caps);
  text-transform: uppercase;
  padding: 3px 0;
}
.date-badge__day {
  display: block;
  font-family: var(--f-display);
  /* --fs-lg, nicht --fs-xl: die Zahl sitzt in einem 62 Pixel breiten
     Kaestchen und darf nicht mitwachsen. */
  font-size: var(--fs-lg);
  font-weight: var(--fw-bold);
  padding: var(--s-2) 0 1px;
}
.date-badge__weekday {
  display: block;
  font-size: var(--fs-xs);
  color: var(--c-ink-3);
  padding-bottom: var(--s-2);
}
.date-badge--today .date-badge__month { background: var(--c-gold); }

.event-list { list-style: none; margin: 0; padding: 0; }
.event-list > li { border-bottom: 1px solid var(--c-rule); }
.event-list > li:first-child { border-top: 1px solid var(--c-rule); }

.event-row {
  display: flex;
  gap: var(--s-4);
  padding-block: var(--s-4);
  align-items: flex-start;
}
@media (min-width: 640px) { .event-row { gap: var(--s-5); } }

.event-row__body { min-width: 0; flex: 1; }
.event-row__title {
  font-size: var(--fs-lg);
  margin: 0 0 var(--s-2);
}
.event-row__title a { text-decoration: none; color: var(--c-ink); }
.event-row__title a:hover { color: var(--c-maroon); text-decoration: underline; }

.event-row__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-1) var(--s-4);
  font-size: var(--fs-sm);
  color: var(--c-ink-2);
}
.event-row__meta > span { display: inline-flex; align-items: center; gap: var(--s-1); }
.event-row__time { font-variant-numeric: var(--num); }

.event-row__thumb {
  flex: none;
  width: 96px;
  border-radius: var(--radius);
  overflow: hidden;
  background: var(--c-sunk);
}
.event-row__thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  aspect-ratio: 4 / 3;
  /* Der Bildausschnitt kommt als --fokus vom Bild selbst, siehe
     inc/bildausschnitt.php. Der zweite Wert ist die Vorgabe, wenn
     an dem Bild nichts eingestellt ist. */
  object-position: var(--fokus, 50% 50%);
}
@media (max-width: 639px) { .event-row__thumb { display: none; } }

/* Kompakte Terminzeile fuer Seitenleisten ("Weitere Termine", "Weitere
   Termine dieser Reihe"): weniger Hoehe, Titel in Metagroesse, kein
   Vorschaubild - die Spalte ist 320 px breit. Ersetzt den einzigen
   Inline-Stil des Themes, padding-block:.75rem (D-22). */
.event-row--compact { gap: var(--s-3); padding-block: var(--s-3); }
.event-row--compact .event-row__title { font-size: var(--fs-sm); }
.event-row--compact .event-row__thumb { display: none; }

/* Kennzeichnung der Terminart, z.B. Online / Hybrid / vor Ort.
   Bewusst auf a und span eingeschraenkt: WordPress gibt jedem
   Schlagwort-Archiv (/tag/...) die Body-Klasse "tag" (body_class(),
   is_tag()). Ein nacktes .tag traf damit das <body>-Element - die ganze
   Seite stand als inline-block mit 2px 8px Innenabstand eingerueckt
   im beigen Rand (F-01). Das Etikett kommt im Theme nur als
   <span class="tag"> und <a class="tag"> vor (template-tags.php,
   single-termin.php, single-download.php, single.php). */
a.tag,
span.tag {
  display: inline-block;
  font-size: var(--fs-xs);
  font-weight: var(--fw-bold);
  padding: 2px var(--s-2);
  border-radius: var(--radius);
  background: var(--c-gold-soft);
  color: var(--c-gold);
  text-decoration: none;
}
a.tag--online,
span.tag--online { background: var(--c-ok-soft); color: var(--c-ok); }
a.tag:hover { background: var(--c-rule); color: var(--c-ink); }

/* ==========================================================================
   9. Terminkalender (serverseitig gerendert)
   Jeder Tag ist eine Zelle, jeder Termin darin ein echter Link. Kein AJAX -
   deshalb ist der Kalender cachebar und die Termine sind verlinkt.
   ========================================================================== */

.calendar-nav {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--s-4);
  margin-bottom: var(--s-4);
}
/* Die Blaetterknoepfe an die Kanten, alles dazwischen (Monatsname und
   der Link "Heute") mittig - so bleibt der Kopf stabil, ob der
   "Heute"-Link da ist oder nicht. */
.calendar-nav > [rel="prev"] { margin-right: auto; }
.calendar-nav > [rel="next"] { margin-left: auto; }
/* "<- Aug 2026" brach bei 390 px in zwei Zeilen (D-07). */
.calendar-nav .btn { white-space: nowrap; }
.calendar-nav__month {
  font-family: var(--f-display);
  font-size: var(--fs-lg);
  font-weight: var(--fw-bold);
  margin: 0;
}
/* Monatsname und "Heute" stehen in einem Umschlag .calendar-nav__center
   (inc/calendar.php); der Link wird nur ausgegeben, wenn nicht der
   laufende Monat gezeigt wird. Beides mittig untereinander. */
.calendar-nav__center {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--s-1);
  text-align: center;
}
.calendar-nav__heute {
  font-size: var(--fs-sm);
  font-weight: var(--fw-bold);
  white-space: nowrap;
}
@media (max-width: 479px) {
  /* Auf dem Telefon: Monatsname (und "Heute") in eigener Zeile, die
     Knoepfe darunter an den Kanten - sonst muesste einer von dreien
     umbrechen. */
  .calendar-nav { flex-wrap: wrap; row-gap: var(--s-2); }
  .calendar-nav__center { flex-basis: 100%; order: -1; }
}

.calendar {
  width: 100%;
  table-layout: fixed;
  background: var(--c-surface);
  border: 1px solid var(--c-rule);
}
.calendar caption {
  caption-side: top;
  text-align: left;
  padding: 0 0 var(--s-3);
  font-size: var(--fs-sm);
  color: var(--c-ink-2);
}
.calendar th {
  font-size: var(--fs-xs);
  font-weight: var(--fw-bold);
  letter-spacing: var(--track-caps);
  text-transform: uppercase;
  color: var(--c-ink-2);
  background: var(--c-sunk);
  padding: var(--s-2);
  border-bottom: 1px solid var(--c-rule);
  text-align: center;
}
.calendar td {
  vertical-align: top;
  border: 1px solid var(--c-rule);
  padding: var(--s-2);
  /* 92 px als MINDESThoehe. Bei Tabellenzellen wirkt height genau so -
     die Zeile waechst mit dem Inhalt -, min-height ist dort laut
     Spezifikation wirkungslos; deshalb steht hier bewusst height.
     Serien fuellen Zellen mit vier und mehr zweizeiligen Eintraegen,
     nichts davon wird abgeschnitten (D-06). */
  height: 92px;
  font-size: var(--fs-xs);
}
.calendar td.is-empty { background: var(--c-ground); }
.calendar td.is-today { background: var(--c-gold-soft); }
.calendar td.is-past .calendar__daynum { color: var(--c-ink-3); }

.calendar__daynum {
  display: block;
  font-weight: var(--fw-bold);
  font-size: var(--fs-sm);
  margin-bottom: var(--s-1);
  color: var(--c-ink-2);
}
.calendar td.is-today .calendar__daynum { color: var(--c-gold); }

.calendar__events { list-style: none; margin: 0; padding: 0; }
.calendar__events li + li { margin-top: 2px; }
/* Zwei Zeilen statt einer abgeschnittenen: bei 140 px Innenbreite und
   13 px blieben nach Uhrzeit und Emoji rund 12 Zeichen, 23 von 23
   Eintraegen endeten mit "..." (D-06). Die Uhrzeit steht in der Liste
   darunter und faellt in der Zelle weg (inc/calendar.php); das Emoji
   bleibt, es ist der Farbcode, an dem Stammgaeste ihre Reihe erkennen
   (BUD-06). Der Volltitel steht im title-Attribut. */
.calendar__event {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
  overflow-wrap: break-word;
  text-decoration: none;
  color: var(--c-ink);
  background: var(--c-maroon-soft);
  border-left: 2px solid var(--c-maroon);
  padding: 2px var(--s-1) 2px 4px;
  border-radius: 1px;
  line-height: var(--lh-snug);
}
.calendar__event:hover { background: var(--c-maroon); color: #fff; }

/* Unter 700px ist ein 7-Spalten-Raster nicht lesbar. Dann wird aus dem
   Kalender eine Liste der Tage, die Termine haben. */
@media (max-width: 699px) {
  .calendar-grid-wrap { display: none; }
  .calendar-agenda { display: block; }
}
@media (min-width: 700px) {
  .calendar-agenda { display: none; }
}

.calendar-agenda { list-style: none; margin: 0; padding: 0; }
.calendar-agenda > li {
  display: flex;
  /* flex-start: ohne Ausrichtung wurde die Datumsmarke auf die Hoehe
     aller Termine des Tages gestreckt - bei drei Terminen ein leerer
     Kasten von 250 px (D-07). */
  align-items: flex-start;
  gap: var(--s-4);
  padding-block: var(--s-3);
  border-bottom: 1px solid var(--c-rule);
}
.calendar-agenda > li:first-child { border-top: 1px solid var(--c-rule); }
/* Mehrere Termine an einem Tag: eine Linie zwischen ihnen statt
   <hr class="my-6"> mit 64 px Luft. Der zweite und jeder weitere Titel
   folgt auf die Metazeile des vorigen Termins. */
.calendar-agenda .event-row__meta + .event-row__title {
  margin-top: var(--s-4);
  padding-top: var(--s-4);
  border-top: 1px solid var(--c-rule);
}

/* Sprungleiste unter dem Raster: die naechsten zwoelf Monate als Links,
   der gezeigte Monat traegt aria-current="page". Ersatz fuer die
   Monatsleiste des alten Termin-Plugins (PHP-10). Metagroesse, weil
   sie den Kalender ergaenzt und nicht mit ihm konkurriert. */
.calendar-jahresleiste {
  list-style: none;
  margin: var(--s-4) 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-1);
}
.calendar-jahresleiste a {
  display: inline-block;
  padding: var(--s-1) var(--s-2);
  border-radius: var(--radius);
  font-size: var(--fs-xs);
  font-weight: var(--fw-bold);
  font-variant-numeric: var(--num);
  text-decoration: none;
  color: var(--c-ink-2);          /* 7,8:1 auf --c-ground, 7,1:1 auf --c-sunk */
  white-space: nowrap;
}
.calendar-jahresleiste a:hover { color: var(--c-maroon); text-decoration: underline; text-underline-offset: 3px; }
.calendar-jahresleiste a[aria-current] {
  background: var(--c-maroon-soft);  /* Bordeaux darauf 8,2:1 */
  color: var(--c-maroon);
  box-shadow: inset 0 -2px 0 var(--c-maroon);
}

/* ==========================================================================
   9b. Downloads
   Format und Groesse stehen im Text, nicht nur als Symbol: wer auf
   Mobilfunk eine 19-MB-PDF anklickt, soll das vorher wissen.
   ========================================================================== */

/* Kategorien der Downloads: neun Kacheln mit Zaehler statt einer Wolke
   aus 45 Schlagworten. */
.kategorien {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr));
  gap: var(--s-2);
}

.kategorie {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-3);
  padding: var(--s-3) var(--s-4);
  background: var(--c-surface);
  border: 1px solid var(--c-rule);
  border-radius: var(--radius);
  text-decoration: none;
  color: var(--c-ink);
}
.kategorie:hover { border-color: var(--c-maroon); color: var(--c-maroon); }

/*
 * Die grosse Kachel mit Unterzeile. inc/shortcodes.php gibt diese drei
 * Klassen seit jeher aus, im Stylesheet standen sie nie. Folge auf
 * "Mediathek" und "Downloads": die Zaehler rutschten unter den Namen,
 * die Unterkategorien schrien so laut wie die Ueberschrift, und die
 * zehn Kacheln standen in drei verschiedenen Hoehen.
 */
.kategorie--gross {
  flex-direction: column;
  align-items: stretch;
  gap: var(--s-2);
}

.kategorie__kopf {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-3);
}

.kategorie__gruppen {
  /* Eine Aufzaehlung, keine zweite Ueberschrift. */
  font-size: var(--fs-sm);
  line-height: var(--lh-snug);
  color: var(--c-ink-3);
}

/* --fs-md in der Serife: die Navigationsebene darf nicht schwaecher
   stehen als die Dateititel (17 px) darunter - Begruendung in
   Abschnitt G. */
.kategorie__name {
  font-family: var(--f-display);
  font-size: var(--fs-md);
  font-weight: var(--fw-bold);
  line-height: var(--lh-snug);
}
.kategorie__zahl {
  flex: none;
  font-size: var(--fs-xs);
  font-variant-numeric: var(--num);
  color: var(--c-ink-3);
}

.download-list { list-style: none; margin: 0; padding: 0; }
.download-list > li { border-bottom: 1px solid var(--c-rule); }
.download-list > li:first-child { border-top: 1px solid var(--c-rule); }

.download-row {
  display: flex;
  align-items: center;
  gap: var(--s-4);
  padding-block: var(--s-4);
}

/* Die Endung als Marke - macht das Format auf einen Blick erkennbar. */
.download-row__ext {
  flex: none;
  width: 46px;
  padding: var(--s-2) 0;
  text-align: center;
  font-variant-numeric: var(--num);
  font-size: var(--fs-xs);
  font-weight: var(--fw-bold);
  letter-spacing: var(--track-caps);
  color: var(--c-maroon);
  background: var(--c-maroon-soft);
  border-radius: var(--radius);
}

.download-row__body { flex: 1; min-width: 0; }

.download-row__title {
  font-size: var(--fs-base);
  font-family: var(--f-body);
  font-weight: var(--fw-bold);
  margin: 0 0 2px;
  line-height: var(--lh-snug);
}
.download-row__title a { text-decoration: none; color: var(--c-ink); }
.download-row__title a:hover { color: var(--c-maroon); text-decoration: underline; }

.download-row__btn { flex: none; }

@media (max-width: 519px) {
  /* Auf schmalen Schirmen rutscht der Knopf unter den Titel, statt den
     Titel auf zwei Zeichen zusammenzuquetschen. */
  .download-row { flex-wrap: wrap; }
  .download-row__body { flex-basis: calc(100% - 46px - var(--s-4)); }
  .download-row__btn { margin-left: calc(46px + var(--s-4)); }
}

/* ==========================================================================
   9c. Video-Vorschau
   Vor dem Klick liegt hier nur ein Standbild - kein YouTube-Player, keine
   Verbindung zu Google. Deshalb sieht die Vorschau aus wie ein Player,
   ist aber nur ein Knopf mit Bild.
   ========================================================================== */

.video-facade {
  position: relative;
  margin: 0;
  background: var(--c-ink);
  border-radius: var(--radius);
  overflow: hidden;
  aspect-ratio: 16 / 9;
}

.video-facade__button {
  display: block;
  width: 100%;
  height: 100%;
  padding: 0;
  border: 0;
  background: none;
  cursor: pointer;
  color: #fff;
  text-align: left;
}

.video-facade__poster {
  /*
   * Absolut statt im Fluss. Im Knopf steht vor dem <img> ein
   * Leerraum-Textknoten aus dem Markup; der erzeugt einen Zeilenkasten
   * und schob das Standbild um 15 Pixel nach unten - unten wurde es
   * dann von overflow: hidden abgeschnitten. Abspielsymbol und
   * Beschriftung liegen ohnehin absolut und zeichnen darueber, weil sie
   * im Markup spaeter kommen.
   */
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: .82;
  /* Eine Dauer: zuvor war das Standbild nach 150 ms aufgehellt und
     wuchs danach noch einmal 150 ms weiter. */
  transition: opacity .15s ease, transform .15s ease;
}
.video-facade__button:hover .video-facade__poster { opacity: 1; transform: scale(1.02); }
/* .video-facade hat overflow: hidden und der Knopf fuellt sie ganz aus -
   der globale Fokusring zeichnete mit +2 px also im abgeschnittenen
   Bereich und war auf 26 Vorschauen unsichtbar. */
.video-facade__button:focus-visible { outline-offset: -3px; }

/* Abspielsymbol: ein Dreieck aus Rahmen, kein Bild und kein Icon-Font. */
.video-facade__play {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 62px;
  height: 62px;
  transform: translate(-50%, -50%);
  background: rgba(122, 36, 48, .92);
  border-radius: 50%;
  pointer-events: none;
}
.video-facade__play::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 54%;
  transform: translate(-50%, -50%);
  border-style: solid;
  border-width: 11px 0 11px 18px;
  border-color: transparent transparent transparent #fff;
}
.video-facade__button:hover .video-facade__play { background: var(--c-maroon); }

.video-facade__label {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  padding: var(--s-5) var(--s-4) var(--s-3);
  font-size: var(--fs-sm);
  font-weight: var(--fw-bold);
  line-height: var(--lh-snug);
  color: #fff;
  background: linear-gradient(to top, rgba(31, 26, 24, .88), transparent);
  pointer-events: none;
}

.video-facade iframe {
  display: block;
  width: 100%;
  height: 100%;
  border: 0;
}

.video-grid {
  display: grid;
  gap: var(--s-4);
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr));
  margin-bottom: var(--s-5);
}

/* Einzelne Einbettung im Fliesstext */
.wp-block-embed { margin-bottom: var(--s-5); }
.wp-block-embed .video-facade { max-width: 760px; }

/* ==========================================================================
   9d. Dynamische Bausteine im Inhalt
   Terminliste, Kalender, Lehrende, Downloads - ueber Shortcodes eingesetzt.
   ========================================================================== */

/* Der Umschlag jedes Bausteins traegt seinen Abstand zum Fliesstext
   selbst. Zweiter Selektor mit zwei Klassen, damit keine .prose-Regel
   (Spezifitaet 0,1,1: ".prose h6 + *") den Rand mehr wegnehmen kann -
   auf /kalender/ stand der Kalenderkopf sonst ohne Luft unter der
   Linkzeile (F-02). */
.shortcode-block,
.prose .not-prose { margin-block: var(--s-6); }
.shortcode-block > h2:first-child { margin-top: 0; }

/* Formulare im Inhalt */
.kontaktformular { max-width: 34rem; }
.kontaktformular p { margin-bottom: var(--s-4); }

/* ---------------------------------------------------------------------------
   MailPoet-Formular (/newsletter/)
   Das einzige Bauteil, das nicht aus dem Theme kommt. MailPoet schreibt
   Inline-Stile ins Markup (width:100%, padding:5px, font-size:16px) -
   die schlaegt nur !important, deshalb steht es genau dort und sonst
   nirgends. Ergebnis: Felder und Knopf sehen aus wie im Kontaktformular
   (D-05, UX-12); Farben, Groessen und Radius aus den Tokens.
   --------------------------------------------------------------------------- */
.mailpoet_form .mailpoet_paragraph { margin-bottom: var(--s-4); }
.mailpoet_form .mailpoet_text,
.mailpoet_form .mailpoet_textarea,
.mailpoet_form select {
  font: inherit;
  font-size: var(--fs-sm) !important;
  line-height: var(--lh-snug) !important;
  padding: var(--s-3) !important;
  background: var(--c-surface);
  color: var(--c-ink);
  border: 1px solid var(--c-rule-ctrl) !important;
  border-radius: var(--radius) !important;
}
.mailpoet_form .mailpoet_text:focus,
.mailpoet_form .mailpoet_textarea:focus { border-color: var(--c-maroon) !important; }
.mailpoet_form .mailpoet_submit {
  all: unset;
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: auto !important;
  padding: var(--s-3) var(--s-5) !important;
  margin: 0 !important;
  border: 1px solid transparent !important;
  border-radius: var(--radius);
  background: var(--c-maroon);
  color: #fff;
  font: inherit;
  font-size: var(--fs-sm) !important;
  font-weight: var(--fw-bold);
  line-height: var(--lh-tight) !important;
  cursor: pointer;
  transition: background-color .15s ease;
}
.mailpoet_form .mailpoet_submit:hover { background: var(--c-maroon-dark); }
.mailpoet_form .mailpoet_submit:focus-visible { outline: 2px solid var(--c-maroon); outline-offset: 2px; }
/* Sichtbare Beschriftungen, sobald die Redaktion sie im Formular-Editor
   einschaltet (heute nur Platzhalter, UX-12). */
.mailpoet_form label { display: block; font-size: var(--fs-sm); font-weight: var(--fw-bold); margin-bottom: var(--s-1); }
.mailpoet_form .mailpoet_validate_success { color: var(--c-ok); }
.mailpoet_form .mailpoet_validate_error { color: var(--c-maroon); }

/* ==========================================================================
   9e. Abstands-Hilfsklassen
   Ersetzen die Inline-Styles, die vorher in den Templates standen. Sie
   greifen auf dieselbe Abstandsskala zu wie alles andere - dadurch sind
   Abstaende auf Unterseiten und Startseite gleich, was vorher nicht der
   Fall war.
   ========================================================================== */

.m-0  { margin: 0; }
.mt-0 { margin-top: 0; }
.mb-0 { margin-bottom: 0; }

.mt-2 { margin-top: var(--s-2); }
.mt-3 { margin-top: var(--s-3); }
.mt-4 { margin-top: var(--s-4); }
.mt-5 { margin-top: var(--s-5); }
.mt-6 { margin-top: var(--s-6); }
.mt-7 { margin-top: var(--s-7); }

.mb-1 { margin-bottom: var(--s-1); }
.mb-2 { margin-bottom: var(--s-2); }
.mb-3 { margin-bottom: var(--s-3); }
.mb-4 { margin-bottom: var(--s-4); }
.mb-5 { margin-bottom: var(--s-5); }
.mb-6 { margin-bottom: var(--s-6); }

.my-6 { margin-block: var(--s-6); }

/* Ein Block, der sich oben absetzt - Fusszeilen von Artikeln, Anhaenge. */
.block-sep {
  margin-top: var(--s-6);
  padding-top: var(--s-5);
  border-top: 1px solid var(--c-rule);
}

/* Waagrechte Liste, z. B. Rechtliches in der Fusszeile. */
.inline-list {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-2) var(--s-5);
}

/* Kopf einer Personenseite: Bild neben Name. */
.person-head {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: var(--s-5);
  margin-bottom: var(--s-6);
}

.text-sm { font-size: var(--fs-sm); }
.text-muted { color: var(--c-ink-2); }
.text-warn { color: var(--c-maroon); font-weight: var(--fw-bold); }

/* ==========================================================================
   10. Karten (Angebote, Team, Beitraege)
   ========================================================================== */

.card {
  display: flex;
  flex-direction: column;
  background: var(--c-surface);
  border: 1px solid var(--c-rule);
  border-radius: var(--radius);
  overflow: hidden;
  height: 100%;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.card:hover { border-color: var(--c-rule-strong); box-shadow: var(--shadow-1); }
.card__media { background: var(--c-sunk); }
.card__media img {
  width: 100%;
  aspect-ratio: 16 / 10;
  object-fit: cover;
  /* Der Bildausschnitt kommt als --fokus vom Bild selbst, siehe
     inc/bildausschnitt.php. Der zweite Wert ist die Vorgabe, wenn
     an dem Bild nichts eingestellt ist. */
  object-position: var(--fokus, 50% 50%);
}
.card__body { padding: var(--s-5); display: flex; flex-direction: column; gap: var(--s-2); flex: 1; }
.card__title { font-size: var(--fs-lg); margin: 0; }
.card__title a { text-decoration: none; color: var(--c-ink); }
.card__title a:hover { color: var(--c-maroon); text-decoration: underline; }
.card__excerpt { font-size: var(--fs-sm); color: var(--c-ink-2); margin: 0; }
.card__meta {
  font-size: var(--fs-xs);
  color: var(--c-ink-3);
  margin-top: auto;
  padding-top: var(--s-2);
}

/* ==========================================================================
   Einteilung der Lehrenden
   Sechs Gruppen in inhaltlicher Rangfolge, nicht alphabetisch. Die
   Sprungmarken oben ersparen das Scrollen durch 27 Kacheln.
   ========================================================================== */

.gruppen-nav {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-2);
  margin-bottom: var(--s-8);
  padding-bottom: var(--s-5);
  border-bottom: 1px solid var(--c-rule);
}

.gruppen-nav__punkt {
  display: inline-flex;
  align-items: baseline;
  gap: var(--s-2);
  padding: var(--s-2) var(--s-4);
  background: var(--c-surface);
  border: 1px solid var(--c-rule);
  border-radius: var(--radius);
  font-size: var(--fs-sm);
  font-weight: var(--fw-bold);
  text-decoration: none;
  color: var(--c-ink);
}
.gruppen-nav__punkt:hover { border-color: var(--c-maroon); color: var(--c-maroon); }

.gruppen-nav__zahl {
  font-size: var(--fs-xs);
  font-weight: var(--fw-normal);
  font-variant-numeric: var(--num);
  color: var(--c-ink-3);
}

.lehrgruppe { margin-bottom: var(--s-8); }
/* Sprungziel nicht unter die klebende Kopfzeile schieben. */
/* Der Abstand gilt jetzt fuer ALLE Sprungziele, siehe html-Regel im
   Grundlagenteil. Die Einzelregel hier wuerde ihn nur vervielfachen. */

.lehrgruppe__text {
  max-width: var(--measure);
  color: var(--c-ink-2);
  margin-bottom: var(--s-5);
}

/* Team: Portraet rund, Name darunter. */
.person { text-align: center; }
.person__photo {
  /* 148 statt 120 Pixel: bei 27 Portraets in einem Vierer-Raster ist das
     die Groesse, bei der ein Gesicht erkennbar wird, ohne dass die Kachel
     mehr Platz braucht. */
  width: 148px;
  height: 148px;
  margin: 0 auto var(--s-3);
  border-radius: 50%;
  overflow: hidden;
  background: var(--c-sunk);
}
.person__photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* 25 statt 50 Prozent als Vorgabe: bei einem Hochformat zeigt die
     Mitte die Brust, nicht den Kopf. Eingestellt wird der Ausschnitt
     am Bild selbst, siehe inc/bildausschnitt.php. */
  object-position: var(--fokus, 50% 25%);
}
/* Einzelportraet auf der Personenseite: dort steht kein zentrierter
   Kachelname darunter, sondern die linksbuendige Textspalte (.prose,
   33rem). Ein mittig gesetztes Foto ueber linksbuendigem Text wirkt
   versetzt (GUT-C-01), deshalb buendig mit der Spalte. */
/* Einzelportraet mittig ueber der mittig gesetzten Lesespalte (Abschnitt
   "Textrahmen mittig"); bis 21.09. links, als die Spalte noch links stand. */
.person__photo--einzel { margin-inline: auto; }
.person__name { font-size: var(--fs-base); margin: 0 0 var(--s-1); }
.person__name a { text-decoration: none; color: var(--c-ink); }
.person__name a:hover { color: var(--c-maroon); text-decoration: underline; }
.person__role { font-size: var(--fs-sm); color: var(--c-ink-2); margin: 0; }
@media (max-width: 479px) {
  /* "Kyabje LAMA ZOPA RINPOCHE" wird bei 17 px Georgia 600 in einer
     160-px-Spalte dreizeilig; 15 px reichen fuer zwei (D-17). */
  .person__name { font-size: var(--fs-sm); }
}

/* ==========================================================================
   10b. Seitenkopf der Unterseiten
   Dieselbe Gliederung wie die Abschnitte der Startseite: Kicker, Titel,
   Linie. Dadurch wirken Unterseiten nicht mehr wie ein fremdes Dokument.
   ========================================================================== */

.page-header {
  background: var(--c-surface);
  border-bottom: 1px solid var(--c-rule);
  padding-block: var(--s-8) var(--s-6);
  margin-bottom: var(--s-7);
}

/* Kicker-Abstand und Linkstil: siehe .kicker in Abschnitt 3 - dort steht
   die eine Definition fuer Band und Abschnittskopf. */

/* Die Lesebreiten leiten sich aus --measure ab (Abschnitt I): Titel
   .82 x 528 = 433 px, Vorspann 528 px. Die frueheren Werte 24ch und
   54ch standen hier und schlugen die dokumentierte Rechnung still. */
.page-header__title {
  font-size: var(--fs-xl);
  letter-spacing: -0.012em;
  text-wrap: balance;
  max-width: calc(var(--measure) * .82);
  margin: 0;
}

.page-header__lead {
  font-size: var(--fs-lg);
  color: var(--c-ink-2);
  max-width: var(--measure);
  text-wrap: pretty;
  margin: var(--s-4) 0 0;
}

/*
 * Das Beitragsbild als Band, nicht als Wand. Ungedeckelt stand auf der
 * Mediathek ein 710 Pixel hohes Bild zwischen Ueberschrift und Inhalt -
 * auf einem Notebook war danach nichts mehr zu sehen.
 */
.page-figure {
  margin-bottom: var(--s-7);
}
.page-figure img {
  width: 100%;
  max-height: 340px;
  object-fit: cover;
  /* Der Bildausschnitt kommt als --fokus vom Bild selbst, siehe
     inc/bildausschnitt.php. Der zweite Wert ist die Vorgabe, wenn an dem
     Bild nichts eingestellt ist: 50% 20% statt der Mitte, weil das Band
     bei fast jedem Bild mehr als ein Fuenftel abschneidet und bei
     Portraets und Thangkas das Wichtige oben liegt (vier angeschnittene
     Koepfe, Pruefbericht BUD-04). Dieselbe Vorgabe steht in
     plc_fokus_rahmen(). Hier stand danach noch ein zweites
     object-position: center - es hat den Fokus in jedem Band
     ueberschrieben, das Werkzeug war wirkungslos (D-11). */
  object-position: var(--fokus, 50% 20%);
  border-radius: var(--radius);
}

.page-content { padding-bottom: var(--s-7); }

/* Unterseiten-Verweise am Fuss einer Seite */
.subpages {
  margin-bottom: var(--s-8);
  padding-top: var(--s-5);
  border-top: 1px solid var(--c-rule);
}
.subpages__title {
  color: var(--c-ink-2);
  margin-bottom: var(--s-4);
}
.subpages__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-2) var(--s-3);
}
.subpages__list a {
  display: inline-block;
  padding: var(--s-2) var(--s-4);
  background: var(--c-sunk);
  border-radius: var(--radius);
  text-decoration: none;
  font-size: var(--fs-sm);
  font-weight: var(--fw-bold);
  color: var(--c-ink);
}
.subpages__list a:hover { background: var(--c-maroon-soft); color: var(--c-maroon); }

/* ==========================================================================
   11. Einzelne Terminseite
   ========================================================================== */

.event-header { border-bottom: 1px solid var(--c-rule); padding-bottom: var(--s-6); margin-bottom: var(--s-6); }
.event-header__tags { display: flex; flex-wrap: wrap; gap: var(--s-2); margin-bottom: var(--s-3); }

/* Einzeiler unter den Etiketten: was diese Terminart ist ("Puja:
   gemeinsame Rezitation ...", BUD-07) und ob der Termin Teil einer
   Reihe ist (inc/serien.php). Metagroesse, gedaempft - eine Auskunft,
   keine zweite Ueberschrift. */
.terminart-hinweis,
.serie-hinweis {
  font-size: var(--fs-sm);
  color: var(--c-ink-2);
  max-width: var(--measure);
  /* Unten --s-4, weil auf vergangenen Terminen direkt der Hinweiskasten
     .notice (mit m-0) folgt und sonst am Text klebt (GUT-D-02). Steht
     der Einzeiler als Letztes im Terminkopf, faellt der Abstand weg -
     dort liefert das Padding des Kopfs die Luft zur Linie. */
  margin: var(--s-2) 0 var(--s-4);
}
.serie-hinweis { margin-top: var(--s-3); }
.event-header > .terminart-hinweis:last-child { margin-bottom: 0; }

/* Hinweiskasten ueber der Terminliste auf /termin/ (Aenderungsvorbehalt,
   Signal/WhatsApp-Gruppe; Text aus dem Customizer, plc_termine_hinweis).
   Ruhiger als .notice: keine Bordeaux-Kante, weil er auf JEDER Ansicht
   steht und nichts Dringendes meldet - eine abgesetzte Flaeche mit
   Goldkante, und mit Rahmen, falls er einmal auf --c-sunk steht. */
.termine-hinweis {
  max-width: var(--measure);
  margin: 0 0 var(--s-6);
  padding: var(--s-4) var(--s-5);
  background: var(--c-sunk);
  border: 1px solid var(--c-rule);
  border-left: 3px solid var(--c-gold);
  border-radius: var(--radius);
  font-size: var(--fs-sm);
  color: var(--c-ink-2);       /* 7,1:1 auf --c-sunk */
}
.termine-hinweis p { margin: 0 0 var(--s-2); }
.termine-hinweis p:last-child { margin-bottom: 0; }

/* Die Fakten-Tabelle: Datum, Zeit, Ort, Lehrende. Als dl, weil es
   Begriffspaare sind - das liest ein Screenreader korrekt vor. */
.facts {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: var(--s-3) var(--s-5);
  margin: 0 0 var(--s-6);
  padding: var(--s-5);
  background: var(--c-sunk);
  border-radius: var(--radius);
  font-size: var(--fs-sm);
}
.facts dt { font-weight: var(--fw-bold); color: var(--c-ink-2); }
.facts dd { margin: 0; }
.facts dd time { font-variant-numeric: var(--num); }

.event-aside {
  background: var(--c-surface);
  border: 1px solid var(--c-rule);
  border-radius: var(--radius);
  padding: var(--s-5);
  font-size: var(--fs-sm);
}
.event-aside h2 { font-size: var(--fs-base); font-family: var(--f-body); }
/* Aufeinanderfolgende Kaesten in der Seitenleiste ("Weitere Termine
   dieser Reihe", "Weitere Termine", Spendenkonto): der Abstand ist eine
   Bauteilregel, nicht die Hilfsklasse mb-5 - die trug nur der erste
   Kasten, der zweite und dritte beruehrten sich (GUT-D-01). Ein noch
   vorhandenes mb-5 verdoppelt nichts: Geschwister-Raender fallen im
   Blockfluss zusammen. */
.event-aside + .event-aside { margin-top: var(--s-5); }

/* Bankdaten zum Kopieren: monospace, damit IBAN-Gruppen stimmen. */
.bank-details { font-variant-numeric: var(--num); font-size: var(--fs-xs); line-height: var(--lh-text); }

@media (min-width: 900px) {
  .event-layout { display: grid; grid-template-columns: 1fr 320px; gap: var(--s-8); align-items: start; }
}

/* ==========================================================================
   12. Seitenleiste, Fusszeile
   ========================================================================== */

.site-footer {
  background: var(--c-ink);
  color: #D9CFCB;
  padding-block: var(--s-8) var(--s-6);
  margin-top: var(--s-9);
  font-size: var(--fs-sm);
}
.site-footer h2 {
  color: #fff;
  margin-bottom: var(--s-4);
}
.site-footer a { color: #F0D9A8; }
.site-footer a:hover { color: #fff; }
.site-footer ul { list-style: none; margin: 0; padding: 0; }
.site-footer li + li { margin-top: var(--s-2); }
/* Die waagrechte Liste "Rechtliches" erbt den Abstand nicht - sonst
   steht das zweite Glied 8 px tiefer als das erste (D-03). */
.site-footer .inline-list li + li { margin-top: 0; }
.site-footer__cols {
  display: grid;
  gap: var(--s-7);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));
}
.site-footer__bottom {
  margin-top: var(--s-7);
  padding-top: var(--s-5);
  border-top: 1px solid rgba(255,255,255,.14);
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-3) var(--s-5);
  justify-content: space-between;
  font-size: var(--fs-xs);
  /* 6,37:1 auf --c-ink. --c-ink-3 stand hier und kam auf 2,93:1 - der
     einzige Kontrastfehler der Seite, auf jeder Seite (D-03). */
  color: var(--c-ink-3-invers);
}
.site-footer address { font-style: normal; }

/* ==========================================================================
   13. Seitennavigation, Formulare, Hinweise
   ========================================================================== */

.pagination {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-2);
  margin-top: var(--s-7);
  padding-top: var(--s-5);
  border-top: 1px solid var(--c-rule);
}
.pagination .page-numbers {
  display: inline-block;
  padding: var(--s-2) var(--s-3);
  border: 1px solid var(--c-rule);
  border-radius: var(--radius);
  text-decoration: none;
  font-size: var(--fs-sm);
  min-width: 2.5em;
  text-align: center;
}
.pagination .page-numbers:hover { background: var(--c-sunk); }
.pagination .page-numbers.current {
  background: var(--c-maroon);
  border-color: var(--c-maroon);
  color: #fff;
  font-weight: var(--fw-bold);
}

input[type="text"], input[type="email"], input[type="search"],
input[type="url"], input[type="tel"], input[type="date"], textarea, select {
  width: 100%;
  max-width: 100%;
  font: inherit;
  font-size: var(--fs-sm);
  padding: var(--s-3);
  background: var(--c-surface);
  color: var(--c-ink);
  border: 1px solid var(--c-rule-ctrl);
  border-radius: var(--radius);
}
input:focus, textarea:focus, select:focus { border-color: var(--c-maroon); }

label { display: block; font-size: var(--fs-sm); font-weight: var(--fw-bold); margin-bottom: var(--s-1); }

.search-form { display: flex; gap: var(--s-2); }

.notice {
  padding: var(--s-4) var(--s-5);
  border-left: 3px solid var(--c-maroon);
  background: var(--c-maroon-soft);
  border-radius: var(--radius);
  margin-bottom: var(--s-5);
}
.notice p:last-child { margin-bottom: 0; }

.empty-state {
  padding: var(--s-7) var(--s-5);
  text-align: center;
  background: var(--c-sunk);
  border-radius: var(--radius);
  color: var(--c-ink-2);
}

/* ==========================================================================
   14. Gutenberg-Grundausstattung
   Damit die Redaktion die Standardbloecke nutzen kann, ohne dass das
   Layout kippt. Absichtlich sparsam - mehr Auswahl heisst mehr Fehler.
   ========================================================================== */

/* Spalten.
   Das Theme meldet wp-block-library ab (rund 70 KB fuer Bloecke, die hier
   nicht vorkommen). Die wenigen Bloecke, die die Redaktion wirklich
   benutzt, bekommen ihre Stile deshalb hier - das ist der Preis dafuer
   und deutlich guenstiger als die vollstaendige Bibliothek. */
.wp-block-columns {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-6);
  margin-bottom: var(--s-6);
  align-items: flex-start;
}
.wp-block-column {
  flex: 1 1 0;
  min-width: 0;
}
/* Im Spaltensatz gibt die Spalte das Mass vor, nicht --measure - sonst
   stuende der Text in einer Spalte noch einmal eingerueckt. */
.wp-block-column > * { max-width: none; }
.wp-block-column > :first-child { margin-top: 0; }
.wp-block-column > :last-child { margin-bottom: 0; }
.wp-block-column .wp-block-image { margin-bottom: 0; }
.wp-block-column img { border-radius: var(--radius); }

@media (max-width: 781px) {
  /* Unter 781px untereinander - dieselbe Schwelle wie im Block-Editor,
     damit Vorschau und Seite uebereinstimmen. */
  .wp-block-columns { display: block; }
  .wp-block-column { margin-bottom: var(--s-6); }
  .wp-block-column:last-child { margin-bottom: 0; }
}

/* ==========================================================================
   AUSGERICHTETE BILDER IM FLIESSTEXT

   Die Redaktion stellt Bilder oft links oder rechts neben den Text: im
   Bestand 146-mal alignleft und 122-mal alignright, verteilt auf 191
   Seiten, davon 170 Termine. Das ist kein Sonderfall, sondern die
   Regel - und es war kaputt.

   WAS SCHIEFGING
   Die Lesespalte ist 528 px breit (--measure). Ein umflossenes Bild kam
   mit 459 px plus 24 px Abstand daher; fuer den Text blieben 45 px, also
   ein Wort je Zeile. Zwei Ursachen zusammen:

     1. Die frueheren Regeln setzten zwar max-width: 50 %, aber
        .prose :is(figure, ...) { max-width: none } hat hoehere
        Spezifitaet und gewann. Die Begrenzung war nie wirksam.
     2. Gutenberg schreibt beim Aendern der Bildgroesse ein
        style="width:459px" INS BILD. Inline schlaegt jede Klasse.

   WIE ES JETZT GELOEST IST
   Begrenzt wird die FIGUR, nicht das Bild. Das Inline-width am Bild
   laeuft dann gegen das max-width: 100 % aus dem Grundlagenteil und
   gibt nach - max-width schlaegt width, auch inline.

   WARUM 12rem
   Gerechnet: 528 px Lesespalte minus 192 px Bild minus 24 px Abstand
   ergibt 312 px Text. Bei 17 px Segoe UI sind das rund 37 Zeichen je
   Zeile. Das ist knapp, aber lesbar. Ein groesseres Bild kippt den Satz
   sofort: bei 16rem waeren es 22 Zeichen, bei 20rem noch 7.

   Wer groessere Bilder neben Text will, braucht eine breitere
   Lesespalte - das waere eine Entscheidung gegen die gemessene
   Zeilenlaenge und gehoert nicht in eine Randnotiz.
   ========================================================================== */

.prose :is(.alignleft, .alignright):not(:where(.not-prose *)) {
  max-width: min(33%, 12rem);
  margin-block: var(--s-1) var(--s-4);
  /*
   * Nie zwei Bilder gleichzeitig im Umfluss.
   *
   * Auf Terminseiten stehen oft drei ausgerichtete Bilder kurz
   * hintereinander. Ohne clear stehen ein linkes und ein rechtes
   * nebeneinander und nehmen zusammen 432 der 528 px Lesespalte -
   * gemessen blieben 45 und 88 px Zeilenlaenge. Mit clear wartet jedes
   * Bild, bis das vorige durch ist; es bleibt immer bei einem Umfluss
   * und damit bei rund 312 px Text.
   *
   * Zwei Bilder bewusst nebeneinander sind damit nicht mehr moeglich.
   * Das ist Absicht: bei dieser Lesebreite waren es ohnehin nie zwei
   * Bilder mit Text, sondern zwei Bilder mit Silbensalat dazwischen.
   */
  clear: both;
}

.prose .alignleft:not(:where(.not-prose *))  { float: left;  margin-inline: 0 var(--s-5); }
.prose .alignright:not(:where(.not-prose *)) { float: right; margin-inline: var(--s-5) 0; }

/* Ein umflossenes Bild bricht die Abschnittskante der naechsten
   Ueberschrift auf. clear raeumt das auf, ohne den Umfluss zu beenden. */
.prose :is(h2, h3):not(:where(.not-prose *)) { clear: both; }

@media (max-width: 599px) {
  /*
   * Auf dem Telefon ist die Spalte 311 px breit. Ein Umfluss liesse
   * dort bestenfalls 95 px Text stehen - das ist kein Satz mehr.
   * Deshalb stehen die Bilder dort fuer sich, in voller Spaltenbreite.
   */
  .prose :is(.alignleft, .alignright):not(:where(.not-prose *)) {
    float: none;
    max-width: 100%;
    margin-inline: 0;
  }
}

/* Ausserhalb von .prose bleibt es beim Verhalten von WordPress. */
.alignleft { float: left; margin: 0 var(--s-5) var(--s-4) 0; max-width: 50%; }
.alignright { float: right; margin: 0 0 var(--s-4) var(--s-5); max-width: 50%; }
.aligncenter { margin-inline: auto; }
.alignwide, .alignfull { max-width: none; }
.wp-caption { max-width: 100%; }
.wp-caption-text, .wp-element-caption {
  font-size: var(--fs-sm);
  color: var(--c-ink-2);
  padding-top: var(--s-2);
}
.screen-reader-text {
  position: absolute !important;
  width: 1px; height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
}
.wp-block-button__link {
  display: inline-block;
  background: var(--c-maroon);
  color: #fff;
  padding: var(--s-3) var(--s-5);
  border-radius: var(--radius);
  text-decoration: none;
  font-size: var(--fs-sm);
  font-weight: var(--fw-bold);
}
.wp-block-table td, .wp-block-table th {
  border: 1px solid var(--c-rule);
  padding: var(--s-3);
  font-size: var(--fs-sm);
}
.wp-block-table th { background: var(--c-sunk); text-align: left; }

/* ==========================================================================
   15. Druck und Bewegungsreduktion
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
}

@media print {
  /* Alles, was auf Papier nicht bedienbar oder nicht Inhalt ist. Das
     Titelband ist Weiss auf Bordeaux und ohne Hintergrunddruck Weiss auf
     Weiss; die Seitenleiste "Weitere Termine" fuellte allein eine dritte
     Seite (Pruefbericht D-08). Der Spenden-Kasten mit IBAN bleibt: eine
     Terminseite wird ausgedruckt und ausgehaengt, und dort gehoert das
     Konto hin. */
  .site-header, .site-footer, .site-titelband, .nav-toggle, .skip-link,
  .pagination, .calendar-nav, .calendar-jahresleiste, .gruppen-nav { display: none !important; }
  /* Eigene Regel, weil ein Browser ohne :has() sonst die GANZE
     Selektorliste verwirft und Kopf und Fuss mitdruckt (GUT-D-03,
     Firefox ESR < 121, Safari < 15.4). So faellt dort nur die
     Seitenleiste nicht weg. */
  .event-aside:not(:has(.bank-details)) { display: none !important; }
  body { background: #fff; color: #000; font-size: 11pt; }
  a { text-decoration: underline; }
  /* Terminseiten werden ausgedruckt und ausgehaengt - die Fakten muessen mit. */
  .event-layout { display: block; }
  .facts { background: none; border: 1px solid #000; }
  .event-aside { background: none; border: 1px solid #000; }
  .next-event { background: none; color: #000; border: 2px solid #000; }
  .next-event__title, .next-event__title a, .next-event__meta, .next-event__when { color: #000; }
  /* Datumsmarke ohne Farbflaeche - ohne Hintergrunddruck waere der
     Monat sonst weiss auf weiss. */
  .date-badge { border-color: #000; }
  .date-badge__month,
  .date-badge--today .date-badge__month {
    background: none;
    color: #000;
    border-bottom: 1px solid #000;
  }
  /* Inline-Farben aus dem Inhalt (335 Termine mit gruenem oder rotem
     Text) drucken schwarz. */
  .prose [style*="color"] { color: #000 !important; }
  /* Ein Knopf ohne Ziel ist auf Papier nichts wert: die Adresse dazu. */
  .btn { background: none; color: #000; border: 1px solid #000; }
  .btn[href]::after { content: " (" attr(href) ")"; font-weight: var(--fw-normal); }
}

/* ==========================================================================
   SUCHE

   Bewusst wenig Eigenes: die Gruppenfilter nutzen .gruppen-nav__punkt
   von der Lehrenden-Seite, die Zaehler .kategorie__zahl aus der
   Mediathek, Dokumente ihre gewohnte .download-list. Neu ist nur die
   Trefferzeile - und die ist fuer alle drei uebrigen Gruppen
   dieselbe, weil in einer Ergebnisliste die Vergleichbarkeit mehr
   zaehlt als die Eigenart jeder Gattung.
   ========================================================================== */

.suche-feld { margin-bottom: var(--s-6); }
.suche-feld .search-form { max-width: var(--measure); }

.suche-gruppen {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-2);
  margin-bottom: var(--s-7);
}

/* Der aktive Filter traegt zusaetzlich aria-current - die Farbe allein
   waere fuer einen Screenreader keine Auskunft. */
.suche-gruppen .is-aktiv {
  border-color: var(--c-maroon);
  background: var(--c-maroon-soft);
  color: var(--c-maroon);
}

.suche-gruppe + .suche-gruppe { margin-top: var(--s-8); }

.section-head__meta {
  font-size: var(--fs-sm);
  color: var(--c-ink-3);
  white-space: nowrap;
}

.suche-liste {
  list-style: none;
  margin: 0;
  padding: 0;
}

.suche-treffer + .suche-treffer { border-top: 1px solid var(--c-rule); }

.suche-treffer__link {
  display: flex;
  align-items: center;
  gap: var(--s-4);
  padding: var(--s-3) 0;
  text-decoration: none;
  color: var(--c-ink);
}
.suche-treffer__link:hover .suche-treffer__titel { color: var(--c-maroon); text-decoration: underline; }
.suche-treffer__link:focus-visible { outline-offset: -2px; }

.suche-treffer__text {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.suche-treffer__titel {
  font-family: var(--f-display);
  font-size: var(--fs-md);
  font-weight: var(--fw-bold);
  line-height: var(--lh-snug);
}

.suche-treffer__meta {
  font-size: var(--fs-sm);
  color: var(--c-ink-3);
}

/* Ohne den Textcontainer stehen Titel und Meta bei den uebrigen
   Gruppen nebeneinander statt untereinander. */
.suche-treffer:not(.suche-treffer--video) .suche-treffer__link {
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
}

.suche-treffer__bild {
  flex: none;
  width: 112px;
  height: 63px;
  object-fit: cover;
  object-position: var(--fokus, 50% 50%);
  border-radius: var(--radius);
  background: var(--c-sunk);
}

.suche-mehr { margin: var(--s-5) 0 0; }

@media (max-width: 479px) {
  /* Auf dem Telefon nimmt das Standbild ein Drittel der Zeile -
     darunter bleibt fuer den Titel kein Satz mehr uebrig. */
  .suche-treffer__bild { width: 80px; height: 45px; }
}

/* --- Suche: Nachtraege -------------------------------------------- */

/* Rueckweg oben in der Einzelansicht einer Gruppe. Unten allein
   waeren es bei 20 Zeilen 20 Tabstopps bis zum Ausgang - das ist ein
   Tastaturweg-Fehler, kein Schoenheitsfehler. */
.suche-zurueck {
  margin: 0 0 var(--s-5);
  font-size: var(--fs-sm);
}

/* Platzhalter statt Fremdbild.
   plc_video_poster_url() faellt bei fehlender lokaler Datei auf
   i.ytimg.com zurueck. In einer Trefferliste darf das nicht
   passieren: die Seite wuerde dann ohne Zutun der Besucherin ein Bild
   von einem Google-Server laden - genau das, was die 46 lokalen
   Standbilder verhindern. Heute greift das nirgends (46 Videos, 46
   Dateien), es wird beim ersten neuen Video akut. Die Flaeche haelt
   die Zeilenhoehe konstant, damit die Liste nicht springt. */
.suche-treffer__bild--leer {
  display: block;
  background: var(--c-sunk);
  border: 1px solid var(--c-rule);
}
