/* BiBer – öffentliche Seite (self-hosted, „null extern").
   ============================================================================================
   GESTALTUNGSIDEE („heller Raum"):
   Die Seite hat einen hellen, leicht grauen GRUND (--canvas). Alles, was zusammengehört,
   liegt als weiße FLÄCHE (--surface) darauf. Struktur entsteht also durch Flächen und Abstand,
   nicht durch Rahmen und Linien. Das ist der gemeinsame Nenner der Vorbildseiten
   (stadt-salzburg.at, erwachsenenbildung-salzburg.at) und hat einen praktischen Nebeneffekt:
   Kontaktbox, Teaser-Karte, Download-Zeile & Co. sind weiß – auf weißem Grund waren sie
   vorher unsichtbar, auf dem grauen Grund treten sie von selbst hervor.

   Rot bleibt der Akzent und wird SPARSAM eingesetzt: Handlungsknöpfe, aktive Zustände,
   Akzentkanten. Gold (--gold, aus der BiBer-Onepage) ist die leise Zweitfarbe für
   Überschriften-Striche – zwei kräftige Farben nebeneinander würden sich gegenseitig
   entwerten.
   ============================================================================================
   FÜNF Rollen für dieselbe Farbe, und die Unterscheidung ist der ganze Trick. Wer eine neue
   rote Stelle baut, muss nur EINE Frage beantworten: ist das Rot hier eine Fläche oder eine
   Schrift – und wenn Schrift, worauf steht sie?

   --accent      = Markenrot als FLÄCHE (Knöpfe, Bänder, Menü- und Suchknopf). In BEIDEN Modi
   dasselbe #E2001A. Eine Fläche bringt ihren eigenen Hintergrund mit – sie muss sich nicht an
   den Seitengrund anpassen, und die Marke soll im Dunkelmodus nicht zu Rosa verblassen.
   --on-accent   = die Schrift AUF dieser Fläche. In beiden Modi weiß (auf #E2001A sind das
   4,95:1 – die 4,5:1 sind erfüllt).
   --accent-dark = dieselbe Fläche unter dem Mauszeiger, eine Spur dunkler. Auch in beiden
   Modi gleich, aus demselben Grund.
   --accent-ink  = Rot als SCHRIFT auf einer FLÄCHE (Wortmarke, aktiver Menüpunkt, Pfeile in
   Listen, Anrisse beim Überfahren). Hell ist das die volle Markenfarbe – auf Weiß erreicht sie
   4,95:1. Dunkel muss sie aufgehellt werden: auf der dunklen Karte kommt #E2001A nur auf 3,4:1.
   --link        = Rot als SCHRIFT auf dem SEITENGRUND (Textlinks, Brotkrumen). Braucht hell
   einen dunkleren Ton als --accent-ink, weil der graue Grund weniger Kontrast hergibt als Weiß
   (#E2001A schafft dort nur 4,25:1). Im Dunkelmodus fallen beide zusammen.
   Die Breiten (--col-page/--col-text/--pad-page) stehen weiter unten im Block und sind dort
   erklärt; sie hängen mit den „sizes"-Angaben in _app/templates/registry.php zusammen
   (welche Bildgröße der Browser lädt). */
:root{
  --accent:#E2001A; --accent-dark:#b80016; --on-accent:#ffffff; --accent-soft:#fdeff0;
  --accent-ink:#E2001A; --link:#b80016;
  --gold:#F2A900;
  /* --mark-* = das gefundene Suchwort in Treffern (Top-Suche + Suchseite). EIGENE Farbrolle,
     nicht --accent-soft: Das Rosa war auf Weiß kaum zu sehen und im Dunkelmodus überhaupt nicht
     (dunkles Weinrot auf dunkelgrauer Fläche) – die Hervorhebung hing allein an der Fettung.
     Goldtöne, weil Gold in dieser Gestaltung ohnehin die Hinweisfarbe ist (Bereichsstrich) und
     als Markierung von Fundstellen gelesen wird, ohne mit dem Markenrot zu konkurrieren. */
  --mark-bg:#ffdf9e; --mark-ink:#241a05;
  /* --a11y = die Werkzeugsäule (Kontrast, Schriftgröße, Vorlesen). Bewusst eine EIGENE Farbe
     und nicht das Markenrot: Rot ist auf dieser Seite die Farbe des Angebots („Termin
     vereinbaren"), und die Barrierefreiheit ist kein Angebot, sondern ein Werkzeug. Ein
     zweites rotes Element hätte mit den Handlungsknöpfen um Aufmerksamkeit gestritten und
     dabei beide entwertet. Grün steht daneben für sich – und sticht auf dem grauen Grund
     stärker heraus als die weiße Karte, die vorher dort stand.
     Wie beim Markenrot gilt: FLÄCHE in beiden Modi gleich, weiße Schrift darauf (5,05:1). */
  --a11y:#15803d; --a11y-dark:#0f6b33; --on-a11y:#ffffff;
  /* --read-mark = der Rahmen um den Absatz, der gerade vorgelesen wird. Er gehört zur
     Werkzeugsäule, trägt also deren Grün – aber als LINIE auf dem Seitengrund, nicht als
     Fläche. Deshalb eine eigene Rolle: im Dunkelmodus muss dieselbe Linie aufgehellt werden
     (das satte #15803d käme auf dem dunklen Grund nur auf 3,8:1), während die Fläche der
     Säule in beiden Modi gleich bleibt. Die Tönung darunter ist bewusst schwach – sie soll
     die Stelle zeigen, nicht den Text schwerer lesbar machen. */
  --read-mark:#15803d; --read-mark-bg:rgba(21,128,61,.09);
  /* --more-* = „weiterlesen" auf den Karten der Bereichsliste. EIGENE Rollen, obwohl der Ton
     einmal derselbe war wie bei der Werkzeugsäule: Dort ist er eine FLÄCHE, hier hängen Fläche,
     Schrift und Kontur an zwei Zuständen (dieselbe Unterscheidung wie beim Markenrot). Genau
     weil es eigene Rollen sind, ließ sich Issue #111 im Farbblock erledigen, ohne eine einzige
     Regel im Blatt anzufassen.
     WARUM nicht Rot: „weiterlesen" ist ein Knopf, kein Link. Rot ist auf dieser Seite die Farbe
     des Angebots („Termin vereinbaren") – auf zwölf Karten nebeneinander wurde daraus eine Wand
     roter Wörter, die lauter war als der Inhalt (Issue #61).

     ⚠️ SEIT ISSUE #111 PETROL STATT GRÜN (Stephan am 17.08.2026): Die Farbe kommt aus dem
     gedruckten Folder („BiBer Folder-aussen-10-23-Druck.pdf"), aus der Landkarte von Salzburg.
     Gemessen ist die Karte #91d1db – als SCHRIFT auf Weiß unbrauchbar, nur 1,7:1 bei nötigen
     4,5:1. Deshalb ist die Schrift-/Konturfarbe nicht der gemessene Wert, sondern DERSELBE
     FARBTON (188°), abgedunkelt bis er trägt: #2b7783 = 5,16:1 auf Weiß, praktisch das Gewicht
     des Grüns davor (5,02:1).
     ⚠️ Grün ist NICHT überall weg (Stephans Wahl): Werkzeugsäule/Vorlesen (--a11y) und die
     Lesemarke (--read-mark) bleiben grün. Wer sie später mitzieht, ändert genau jene Rollen –
     nicht diese.

     ⚠️⚠️ SECHS ROLLEN, WEIL DIE ZUSTÄNDE JE MODUS GETAUSCHT SIND (Stephan am 17.08. nach dem
     ersten Anlauf): Im HELLMODUS ist der Ruhezustand die FLÄCHE (#a4cddc mit schwarzer Schrift)
     und das Überfahren die KONTUR. Im DUNKELMODUS ist es genau umgekehrt – dort bleibt alles, wie
     es war: Kontur im Ruhezustand, Fläche beim Überfahren.
     Deshalb NICHT drei Rollen plus je eine Regel pro Modus, sondern sechs benannte Rollen und
     GENAU EINE Regel für den Knopf. Wer den Zustand tauschen will, tauscht Werte – kein
     Selektor muss dafür angefasst werden, und die Werte stehen weiter nur EINMAL je Modus.
     ⚠️ Die Kontur ist im Ruhezustand NICHT weg, sondern in der Farbe der Fläche. Ohne sie
     wüchse der Knopf beim Überfahren um 3 px und die Karte darunter würde zappeln.
     ℹ️ Schwarz auf #a4cddc = 12,3:1. Die FLÄCHE selbst kommt gegen die weiße Karte nur auf
     1,70:1 – unter den 3:1, die für die Erkennbarkeit eines Bedienelements gefordert sind
     (WCAG 1.4.11). Stephan gemeldet und von ihm so gewollt; wer das später heilen will, gibt
     dem Ruhezustand eine eigene, dunklere Konturfarbe (--more-line) statt der Flächenfarbe. */
  --more-bg:#a4cddc;      /* Ruhezustand: Fläche */
  --more-ink:#000000;     /* Ruhezustand: Schrift */
  --more-line:#a4cddc;    /* Ruhezustand: Kontur (= Fläche, hält die Größe stabil) */
  --more-bg-h:transparent;/* Überfahren: keine Fläche … */
  --more-ink-h:#2b7783;   /* … dafür Schrift … */
  --more-line-h:#2b7783;  /* … und Kontur in Petrol */
  /* --muted wird IMMER auf --canvas gemessen, dem dunkelsten Grund, auf dem es steht.
     Historie, weil es zweimal knapp war: Auf dem alten Grau (#eceef1) reichte #697178 mit
     4.27:1 nicht, #656d74 kam auf 4.52:1. Der Sandton (#fee7c4) ist eine Spur dunkler als das
     Grau – damit fiel #656d74 auf 4.37:1 zurück (gemessen an „Seite teilen:" und den
     Brotkrumen). Jetzt #5f666d: 4.80:1 auf Sand, 5.79:1 auf Weiß.
     ⚠️ Wer den Grundton ändert, misst diesen Wert neu: `node _app/tools/kontrast-pruefen.js`. */
  --ink:#141a1e; --text:#3a4145; --muted:#5f666d;
  /* --copy = die Farbe des TEXTS, den die Redaktion schreibt. Zwei Wege, absichtlich:
       1. am <body> – wirkt über die Vererbung auf Absätze, Listen und Akkordeon-Inhalte,
          also auf alles, was in den Textbausteinen getippt wird;
       2. ausdrücklich an den Baustein-Texten, die ihre Farbe selbst setzen MÜSSEN, weil sie
          auf einer Karte sitzen: .teaser-text, .download-note, .stat-label, .pl-lead.
     Was NICHT mitgeht, ist Beiwerk, das die Website selbst erzeugt – allen voran das
     automatische „Veröffentlicht am" (.page-pubdate trägt --text), dazu Brotkrumen,
     Suchvorschläge und Fußzeile. Genau dafür ist es eine eigene Rolle und nicht --text
     umgefärbt: --text ist der abgestimmte Ton fürs Beiwerk, --copy eine Aussage über INHALT.

     BiBer meldete am 2026-08-04, das dunkle Grau (#3a4145) wirke „ausgeblasst". Seither steht
     hier reines Schwarz – und im Dunkelmodus reines Weiß (Stephan am selben Tag: aufhellen).
     Text dunkler bzw. heller zu machen kann nie ein Kontrast-Problem erzeugen; wer die Werte
     dennoch ändert, misst nach: `node _app/tools/kontrast-pruefen.js`. */
  --copy:#000000;
  --line:#dee2e6; --canvas:#fee7c4; --soft:#f4f6f7; --surface:#ffffff;
  --bg:#ffffff;                       /* Flächen, die IMMER hell/neutral sein sollen (Panel) */
  /* --bar-* = eine Fläche, die in BEIDEN Modi dunkel bleibt (Servicezeile, eingeschalteter
     Umschalter). Bewusst NICHT --ink: das ist im Dunkelmodus fast weiß – die Servicezeile war
     damit hell auf hell und praktisch unlesbar. */
  --bar-bg:#141a1e; --bar-fg:#e8ecef;
  /* ZWEI Breiten, und das ist die wichtigste Gestaltungsentscheidung der Seite:

     --col-page = die Fluchtlinie. Kopfleiste, Servicezeile, Mega-Panel, Brotkrumen, Inhalt und
     Fußzeile teilen sie sich – Logo und Seitentitel beginnen dadurch auf DERSELBEN senkrechten
     Linie. Bis 1560px wächst die Seite mit dem Fenster mit, darüber steht sie mittig. Wer es
     breiter will, dreht genau an dieser einen Zahl (und an $layoutMax in der Vorlagen-Registry,
     die daraus die zu ladende Bildgröße ableitet).

     --col-text = wie breit FLIESSTEXT höchstens wird. Raster-Bausteine (Teaser, Kennzahlen,
     Chips, Verweislisten, Banner) nutzen die volle Breite, ein Absatz nicht: ab etwa 90 Zeichen
     findet das Auge den nächsten Zeilenanfang nicht mehr zuverlässig. stadt-salzburg.at lässt
     den Text mitwachsen und landet auf großen Schirmen bei ~190 Zeichen je Zeile – genau das
     wollen wir nicht.

     --col-list = das Maß dazwischen, für gestapelte ZEILEN (Akkordeon, Verweisliste, Downloads,
     Sprungmarken). Eine Zeile über die volle Breite zwingt das Auge, von der Beschriftung links
     bis zum Pfeil rechts durch viel Leere zu wandern; ein Raster aus Karten will die Breite
     dagegen sehr wohl. Ohne dieses dritte Maß stand ein schmales Akkordeon neben einer
     bildschirmbreiten Verweisliste – dieselbe Seite in zwei Breiten.

     --pad-page = Seitenrand, wächst mit dem Fenster (am Handy schmal, am Desktop großzügig). */
  --col-page:1560px; --col-list:62rem; --col-text:46rem; --pad-page:clamp(1.2rem,3vw,2.5rem);
  /* --pad-page-r = der Seitenrand RECHTS. Normalerweise derselbe wie links; steht die
     Werkzeugsäule offen und ist das Fenster zu schmal, um sie neben der Inhaltsspalte
     unterzubringen, wächst er um deren Breite. Die Säule liegt dann NEBEN dem Inhalt statt
     darüber – der einzige Weg, „immer sichtbar" und „verdeckt nie etwas" zugleich zu erfüllen.
     Warum eine Variable und nicht ein Rand am <body>: der Aufmacher und die randlosen Bänder
     rechnen mit 100vw. Ein schmalerer Body hätte sie um die halbe Streifenbreite verschoben.

     --bleed-fix gleicht genau das aus. Randlose Bausteine brechen mit
     `margin-left:calc(50% - 50vw)` aus der Spalte aus; diese Rechnung trifft den Fensterrand
     nur, solange die Spalte MITTIG steht. Sobald rechts mehr Rand ist als links, landet der
     Ausbruch um die halbe Differenz zu weit links – Aufmacher und rotes Band bekamen dadurch
     rechts einen Streifen. Der Ausgleich ist genau diese halbe Differenz. */
  --pad-page-r:var(--pad-page);
  --bleed-fix:calc((var(--pad-page-r) - var(--pad-page)) / 2);
  /* --kopf-luft = Abstand über und unter der Marke in der Kopfzeile. Die Kopfzeile hat
     bewusst KEINE feste Höhe: Sie ergibt sich aus Logohöhe + zweimal dieser Luft. Wer das
     Logo größer macht, muss die Kopfhöhe nicht nachziehen – sie wächst mit. */
  --kopf-luft:1.05rem;
  --r-sm:8px; --r:12px; --r-lg:18px;
  --shadow-1:0 1px 2px rgba(16,24,32,.04), 0 8px 22px -16px rgba(16,24,32,.45);
  --shadow-2:0 18px 50px -24px rgba(16,24,32,.55);
  --band:clamp(2rem,1.2rem + 2.4vw,3.4rem);   /* senkrechter Abstand zwischen Sinnabschnitten */
}
/* Dunkelmodus: NUR auf ausdrücklichen Wunsch (Issue #101, Stephan am 10.08.:
   „erster Aufruf (voreingestellt) ist immer light mode!").

   Bis dahin folgte die Seite der Systemvorgabe (@media prefers-color-scheme:dark). Wer sein
   Windows dunkel gestellt hat – und das ist inzwischen die Mehrheit –, bekam BiBer beim
   allerersten Besuch dunkel zu sehen. Der erste Eindruck einer Marke soll aber die Marke sein:
   weiße Flächen, Rot, das Logo in Schwarz. Der Dunkelmodus bleibt vollständig erhalten, er
   wird jetzt nur noch über den Kontrast-Knopf in der Werkzeugsäule eingeschaltet und in
   localStorage gemerkt (theme-init.js holt ihn beim nächsten Besuch vor dem ersten Bild
   zurück).

   ⚠️ Damit gibt es die Werte nur noch EINMAL. Vorher standen sie doppelt (Systemvorgabe /
   ausdrückliche Wahl), und genau dort war schon etwas auseinandergelaufen: die Rollen des
   „weiterlesen"-Knopfs (damals --more/--more-fill/--on-more, heute --more-*) standen nur in der
   Systemvorgabe. Wer den Knopf drückte, bekam die grüne Kontur des Hellmodus auf dunklem Grund.
   Beim Zusammenlegen mitgenommen. */
:root[data-theme="dark"]{
  /* Markenrot bleibt Markenrot – Fläche und Schrift darauf wie im Hellmodus. Nur das Rot,
     das als SCHRIFT auf dem dunklen Grund steht, wird aufgehellt. */
  --accent:#E2001A; --accent-dark:#b80016; --on-accent:#ffffff; --accent-soft:#2a1a1e;
  --accent-ink:#ff8090; --link:#ff8090;
  --gold:#f6c04e;
  --mark-bg:#6b5117; --mark-ink:#ffeec4;
  --ink:#f0f3f5; --text:#d2d9de; --muted:#98a2aa;
  --copy:#ffffff;                   /* Gegenstück zum Schwarz im Hellmodus (05.08.) */
  --line:#2b3238; --canvas:#0f1316; --soft:#1d242a; --surface:#191f24;
  --bg:#14181b; --bar-bg:#05090b; --bar-fg:#ccd4da;
  --read-mark:#5ec98a; --read-mark-bg:rgba(94,201,138,.12);
  /* ⚠️ IM DUNKELMODUS BLEIBT DER KNOPF, WIE ER WAR (Stephan am 17.08.: „im dark-mode bleibt er
     gesamt so, wie er jetzt ist"). Also Kontur im Ruhezustand, Fläche beim Überfahren – genau
     umgekehrt zum Hellmodus. Getauscht werden nur die Werte, nicht die Regel.
     Kontur aufgehellt, weil das satte #2b7783 auf der dunklen Karte nur auf 1,7:1 käme; #7cc8d4
     kommt auf #191f24 auf 8,77:1 – dieselbe Größenordnung wie das aufgehellte Grün davor
     (8,08:1). Hübsche Fügung: So landet der Ton fast genau auf dem gemessenen Kartenblau
     #91d1db – im Dunkelmodus steht also die Folder-Farbe selbst da. */
  --more-bg:transparent; --more-ink:#7cc8d4; --more-line:#7cc8d4;
  --more-bg-h:#2b7783;   --more-ink-h:#ffffff; --more-line-h:#2b7783;
  --shadow-1:0 1px 2px rgba(0,0,0,.5), 0 8px 22px -16px rgba(0,0,0,.9);
  --shadow-2:0 18px 50px -24px rgba(0,0,0,.95);
}
/* Schriftgröße-Stufen (Barrierefreiheits-Leiste) – skalieren alle rem-Maße. */
html[data-fs="1"]{font-size:112.5%}
html[data-fs="2"]{font-size:125%}
html[data-fs="3"]{font-size:140%}
*{box-sizing:border-box}
/* Sprünge innerhalb der Seite gleiten, statt zu springen: der Pfeilkreis im Aufmacher, der
   Nach-oben-Knopf, die Sprungmarken und die Brotkrumen. Ein harter Sprung lässt einen kurz
   nicht wissen, wo man gelandet ist — die Bewegung zeigt die Richtung mit.
   scroll-padding-top hält das Ziel unter der klebenden Kopfleiste hervor; ohne das landet
   jede angesprungene Überschrift dahinter. */
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;scroll-padding-top:5.5rem}
/* Wer „weniger Bewegung" eingestellt hat, bekommt den harten Sprung zurück. */
@media (prefers-reduced-motion:reduce){ html{scroll-behavior:auto} }
body{margin:0;font-family:"PT Sans","Segoe UI",Arial,sans-serif;color:var(--copy);
  background:var(--canvas);line-height:1.65;font-size:1.05rem}

/* ------------------------------- Lange Wörter (Issue #54) -------------------------------
   Deutsch baut Wörter wie „Studienberechtigungsprüfung" – 27 Zeichen, die in keine schmale
   Spalte passen. Gemessen am 2026-08-02 im echten Browser:
   • Kachel 279 px breit, Textkasten 237 px, der Titel 272 px → die Karte SCHNITT ihn ab
     (.pl-item trägt overflow:hidden, sonst stünde er über dem Nachbarn).
   • Am Handy (390 px) ragte eine ausgeschriebene Web-Adresse bis 502 px, also 112 px über den
     rechten Rand. Einen Schiebebalken gab es trotzdem nicht – den fängt html{overflow-x:clip}
     weiter unten schon ab. Man sah nur den abgeschnittenen Text.

   Zwei Regeln, in dieser Reihenfolge:
   1. hyphens:auto trennt nach deutschen Regeln MIT Trennstrich – die schöne Lösung. Sie setzt
      lang="de" voraus (steht im <html>) und ein Trennwörterbuch im Browser. Hat er keins,
      passiert einfach nichts – deshalb steht sie nie allein.
   2. overflow-wrap:break-word ist der Gurt darunter: greift NUR, wenn ein Wort auch in einer
      eigenen Zeile nicht passt, und bricht es dann hart um. Damit ist „abgeschnitten" baulich
      ausgeschlossen, in jedem Browser, auf jeder Breite. Vererbt sich vom body auf alles.

   Silbentrennung im FLIESSTEXT nur auf schmalen Fenstern: in einer breiten Spalte ist sie
   unnötig und macht den rechten Rand unruhig. Überschriften trennen immer – sie sind groß,
   ein einziges Wort füllt dort schnell die Zeile. */
body{overflow-wrap:break-word}
h1,h2,h3,h4,h5,h6,
.pl-title,.teaser-title,.cta-title,.entry-name,.contact-title,.downloads-title,
.sr-title,.sr-h2,.panel-head-title,.mega-top,.qs-top,.footer-section-title{
  -webkit-hyphens:auto;hyphens:auto}

/* Zeilenabstand UMBRECHENDER Karten-Überschriften. Sie hatten keinen eigenen und erbten
   deshalb die 1,65 des Fließtexts – gemessen: 33 px Abstand bei 20 px Schrift. Bei zwei
   Zeilen stand der Titel dadurch als loses Paar über der Karte statt als ein Block, und in
   einer Kachelreihe verschob das jede Karte anders (gemeldet von Stephan an den Buchtipps).
   1,25 ist derselbe Wert, den die anderen Oswald-Überschriften ohnehin fahren (h2, .cta-title).
   BEWUSST nur die Karten-Überschriften: Der Fließtext behält seine 1,65 – dort ist der luftige
   Abstand das, was die Seite lesbar macht. Die Seiten-H1/H2 haben eigene Werte und bleiben. */
.pl-title,.teaser-title,.entry-name,.contact-title,.downloads-title,
.sr-title,.sr-h2,.panel-head-title{line-height:1.25}
@media (max-width:640px){
  .content p,.content li,.pl-lead,.teaser-text,.contact-val{-webkit-hyphens:auto;hyphens:auto}
}

/* Textlinks tragen --link, nicht das reine Markenrot: #E2001A erreicht auf dem grauen Grund
   nur 4,25:1 und verfehlt die geforderten 4,5:1 knapp; auf dem dunklen Grund sind es sogar nur
   3,7:1. Ein Textlink kann überall stehen – auf dem Grund wie auf einer weißen Karte –, deshalb
   gilt für ihn der Ton, der auf dem SCHLECHTEREN der beiden Gründe noch trägt. Das Markenrot
   bleibt unangetastet, wo es als FLÄCHE auftritt (Knöpfe, Bänder). */
a{color:var(--link)}

/* ---------------- Externe Links: „hier geht es von der Website weg" (Issue #93) ----------------
   Jeder Link, der ein neues Fenster öffnet (target="_blank"), bekommt rechts ein kleines
   Kästchen-mit-Pfeil. Es ist ein HINWEIS, kein zweiter Knopf: als ::after gehört es zum Link
   selbst, ist also nichts, was man eigens anklicken könnte, und es wandert beim Umbruch mit
   dem letzten Wort mit statt allein in einer neuen Zeile zu landen.

   ⚠️ Die Farbe ist der Kern der Sache. Ein fertig gefärbtes SVG als background-image bliebe
   für immer in EINER Farbe – im Dunkelmodus (--link wird dort zu #ff8090), auf einem roten
   Handlungsband oder in der Fußzeile wäre es dann falsch. Deshalb wird das Zeichen als MASKE
   gelegt und die Fläche darunter mit `currentColor` gefüllt: So trägt das Symbol immer exakt
   den Ton des Links, an dem es hängt – ohne eine einzige Extra-Regel je Ort.

   @supports davor, weil ohne Maskenunterstützung ein VOLL GEFÜLLTES Kästchen stehen bliebe
   (die Fläche ist ja da, nur die Aussparung fehlte) – lieber gar kein Zeichen als ein roter
   Klotz hinter jedem Link. */
:root{
  --ico-extern:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13.5 4H20v6.5'/%3E%3Cpath d='M20 4l-8.5 8.5'/%3E%3Cpath d='M18 14.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4.5'/%3E%3C/svg%3E");
}
@supports ((-webkit-mask-image: none) or (mask-image: none)) {
  a[target="_blank"]::after{
    content:"";
    display:inline-block;
    width:.68em;height:.68em;
    margin-left:.3em;
    vertical-align:-.03em;
    background-color:currentColor;
    -webkit-mask:var(--ico-extern) center/contain no-repeat;
            mask:var(--ico-extern) center/contain no-repeat;
  }
}
/* Die Ausnahmen – überall dort trägt das ::after schon eine ANDERE Aufgabe, und zwei
   Bedeutungen in einem Pseudoelement gehen nicht:
     • .footer-logo a  – der Link ist ein Förderer-Logo, kein Text. Ein Symbol hinter einem
                         Bild sieht aus wie ein Fehler im Bild.
     • .share-link     – WhatsApp/E-Mail sind beschriftete Handlungsknöpfe; dass sie
                         wegführen, sagt schon ihr Name.
   ⚠️ Wo das ::after schon eine andere Aufgabe hat, genügt `content:none` NUR dann, wenn diese
   Ausnahme auch wirklich gewinnt. Trägt die andere Regel mehr Klassen (Stretched-Links,
   Verweisliste), gewinnt sie das `content` zurück – Breite, Höhe und Maske von oben kommen
   aber trotzdem durch, und das Ergebnis ist ein eingefärbtes Kästchen. Solche Fälle werden
   deshalb BEIM BAUSTEIN zurückgenommen, mit dessen eigener Spezifität:
     • .ll-list a                       – Verweisliste: „›" bei eigenen Zielen, das
                                          Extern-Zeichen bei fremden – beides dort gesetzt
     • .teaser.has-link .teaser-title a – Trefferfläche der ganzen Karte
     • .page-aside .pagelist .pl-title a – dasselbe in der Seitenspalte
   Hier bleiben nur die Fälle, in denen das ::after wirklich frei ist:
     • .footer-logo a  – der Link ist ein Förderer-Logo, kein Text. Ein Symbol hinter einem
                         Bild sieht aus wie ein Fehler im Bild.
     • .share-link     – WhatsApp/E-Mail sind beschriftete Handlungsknöpfe; dass sie
                         wegführen, sagt schon ihr Name. */
.footer-logo a[target="_blank"]::after,
.share-link[target="_blank"]::after{
  content:none;
}

/* Der rote Ring gilt für die TASTATUR, nicht für die Maus (:focus-visible statt :focus).
   Mit :focus blieb er nach jedem Klick stehen – am auffälligsten am Akkordeon, wo das
   angeklickte Fach einen roten Rahmen um die ganze Zeile behielt, obwohl der Ring dort nichts
   mehr zu sagen hatte: dass das Fach offen ist, sagt das Minus-Zeichen und die rote Schrift.
   Wer mit der Tabulatortaste unterwegs ist, bekommt ihn unverändert – ohne sichtbaren Fokus
   wüsste dort niemand, wo er gerade steht (WCAG 2.4.7). */
a:focus-visible,button:focus-visible,summary:focus-visible{
  outline:2px solid var(--accent-ink);outline-offset:2px}

/* „hidden" muss gewinnen. Ohne diese Regel schlägt jede Klasse mit eigenem display-Wert
   (z. B. .a11y-btn{display:inline-flex}) das hidden-Attribut aus dem Browser-Stylesheet –
   die Folge waren zwei sichtbare Knöpfe, die nichts taten:
     • „Vorlesen" erscheint erst, wenn der Browser Sprachausgabe kann (site.js nimmt hidden weg),
     • „Teilen" erst, wenn es das System-Teilen-Menü gibt (am Desktop meist nicht).
   Beide standen trotzdem da. Ein Knopf, der etwas verspricht und nichts tut, ist schlimmer
   als kein Knopf. */
[hidden]{display:none !important}

/* ---------------- Kopfleiste ----------------
   Marke links, Suche mittig, Menü-Knopf rechts – die Anordnung aller drei Vorbildseiten.
   Die Leiste bleibt beim Scrollen oben stehen: bei ~130 Seiten ist der Weg zum Menü der
   meistgegangene, und ihn zurückzuscrollen wäre reine Arbeit. (Das geht nur, weil
   html{overflow-x:clip} und nicht overflow-x:hidden gesetzt ist – hidden würde <html> zum
   Scroll-Container machen und sticky lahmlegen.) */
.site-header{background:var(--surface);border-bottom:1px solid var(--line);
  position:sticky;top:0;z-index:40}
.site-header-inner{max-width:var(--col-page);margin:0 auto;
  padding:var(--kopf-luft) var(--pad-page-r) var(--kopf-luft) var(--pad-page);
  display:flex;align-items:center;gap:.8rem 1.5rem}

/* ---------------- Marke: das BiBer-Logo ----------------
   Hier stand bis 2026-08-04 ein nachgebauter Schriftzug in Oswald. Jetzt liegt das echte Logo
   aus dem Marken-Ordner im Kopf – unverändert übernommen, nur in der Größe gesteuert.

   ZWEI Zahlen, mehr braucht es nicht:
     --logo-h    = Höhe des Logos. Die Breite rechnet der Browser aus dem Seitenverhältnis
                   (width/height stehen am <img>), das Logo kann also nie verzerren.
     --kopf-luft = Abstand über und unter dem Logo. Die Kopfzeile wächst damit von selbst mit,
                   statt eine feste Höhe zu tragen, die man beim Ändern der Logogröße vergisst.

   WARUM die Luft hier gesetzt wird und nicht im Bild: Die Originaldatei ist 160x150 und hat
   fast keinen eingebauten Rand (3px links, 4px rechts, 6px oben, 13px unten – gemessen an den
   Pixeln mit Deckkraft). Ohne eigenen Abstand klebte die Marke an Kante und Trennlinie.

   ⚠️ GRENZE DER SCHÄRFE: Die Datei ist 150px hoch. Bei doppelter Bildschirmauflösung reicht
   das bis 75px Anzeigehöhe. Wer --logo-h darüber dreht, braucht eine größere Datei – das
   Vektor-Original liegt im Marken-Ordner (Biber_Logo_11.ai, in Wahrheit ein PDF). */
.site-brand{--logo-h:4rem;
  display:flex;align-items:center;flex:0 0 auto;line-height:0;text-decoration:none}
.brand-logo{display:block;height:var(--logo-h);width:auto}

/* Das Logo ist schwarze Schrift mit rotem Punkt und verschwände im Dunkelmodus auf dem
   dunklen Kopf. Deshalb liegen zwei Fassungen im HTML und CSS zeigt genau eine. Der Weg über
   display: (statt <picture> mit media-Abfrage) ist der einzige, der auf den Umschalter in der
   Werkzeugsäule hört – der setzt :root[data-theme], und danach richtet sich seit Issue #101
   alles. Die Systemvorgabe entscheidet hier nichts mehr. */
.brand-logo-hell{display:none}
:root[data-theme="dark"] .brand-logo-dunkel{display:none}
:root[data-theme="dark"] .brand-logo-hell{display:block}

/* ---------------- Mega-Menü ----------------
   <details>/<summary>: klappt ohne JavaScript auf und ist von Haus aus tastaturbedienbar.
   site.js legt nur Komfort obendrauf (Esc, Klick daneben). */
.mega{margin-left:auto;flex:0 0 auto}
.mega-toggle{display:inline-flex;align-items:center;gap:.55rem;cursor:pointer;list-style:none;
  background:var(--accent);color:var(--on-accent);border-radius:999px;padding:.55rem 1.15rem;
  font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1.02rem;letter-spacing:.03em;
  user-select:none}
.mega-toggle::-webkit-details-marker{display:none}
.mega-toggle:hover{background:var(--accent-dark)}
/* Burger-Symbol: drei Balken, die beim Öffnen zum Kreuz werden. Rein dekorativ (aria-hidden) –
   die Beschriftung „Menü" steht daneben und sagt, was passiert. */
.mega-burger{display:inline-flex;flex-direction:column;justify-content:center;gap:4px;
  width:18px;height:14px}
.mega-burger i{display:block;height:2px;background:currentColor;border-radius:2px;
  transition:transform .18s ease,opacity .18s ease}
.mega[open] .mega-burger i:nth-child(1){transform:translateY(6px) rotate(45deg)}
.mega[open] .mega-burger i:nth-child(2){opacity:0}
.mega[open] .mega-burger i:nth-child(3){transform:translateY(-6px) rotate(-45deg)}

/* Das Panel hängt unter der GANZEN Kopfleiste, nicht unter dem Knopf: bei zehn Bereichen mit
   Unterpunkten braucht es die volle Breite. Position fix zur Kopfleiste über den Elternteil
   .site-header (position:sticky ist zugleich ein Bezugsrahmen). */
/* overscroll-behavior:contain – der Bildlauf bleibt IM Panel (Issue #89).
   Gemeldet als „die Trefferliste lässt sich nicht scrollen, es sieht so aus, als würde die
   Seite dahinter scrollen". Genau das passierte: Am Handy sitzt die Kopf-Suche IM Menü-Panel,
   das Panel ist der Bildlauf-Kasten. Ist er unten angekommen, reicht der Browser den nächsten
   Wisch von selbst an die Seite weiter (Scroll-Verkettung). Weil die Kopfleiste klebt und das
   Panel an ihr hängt, steht das Panel dabei still und der Seiteninhalt rauscht dahinter vorbei
   – gemessen: ein Wisch zu viel und die Seite stand auf y=1189, ohne dass sich im Panel etwas
   bewegt hätte. Beim Zuklappen findet man sich dann irgendwo mitten in der Seite wieder.
   `contain` beendet die Kette an der eigenen Kante, ohne sonst etwas zu ändern: innerhalb des
   Panels wird weiter ganz normal gescrollt. */
.mega-panel{position:absolute;left:0;right:0;top:100%;background:var(--surface);
  border-top:1px solid var(--line);box-shadow:var(--shadow-2);
  max-height:calc(100vh - 100%);overflow-y:auto;overscroll-behavior:contain;z-index:41}
.mega-inner{max-width:var(--col-page);margin:0 auto;padding:1.6rem var(--pad-page-r) 2rem var(--pad-page)}
/* Spaltensatz (columns) statt Raster (grid): Bereiche mit sieben Unterpunkten stehen neben
   solchen mit keinem. Ein Raster zwänge alle Zeilen auf die Höhe des größten Bereichs und
   risse Löcher; der Spaltensatz lässt die Blöcke einfach nachrücken und packt dicht.
   break-inside:avoid hält einen Bereich samt Unterpunkten zusammen. */
.mega-cols{list-style:none;margin:0;padding:0;
  columns:4 230px;column-gap:2.2rem}
.mega-col{break-inside:avoid;margin:0 0 1.6rem}
/* Die Bereichszeile ist FETT, in beiden Modi. Sie hatte bisher nur den goldenen Strich als
   Unterschied zu den Unterpunkten – auf dunklem Grund trägt eine Linie diese Unterscheidung
   nicht mehr, die Spalte las sich als eine einzige Liste. Gewicht wirkt in jeder Helligkeit. */
.mega-top{display:block;font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1.08rem;
  font-weight:700;
  color:var(--ink);text-decoration:none;padding-bottom:.45rem;margin-bottom:.5rem;
  border-bottom:2px solid var(--gold)}
/* Die Bereichszeile IST ein Link – in Ruhe sieht sie aber aus wie eine Überschrift (Oswald,
   fett, Strich darunter). Genau das war die Meldung: man hält die Spalte für eine reine
   Strukturansicht und klickt nur die Unterpunkte. Beim Überfahren wechselt deshalb nicht nur
   die Schrift auf Rot, sondern auch der goldene Strich – so meldet sich die ganze Zeile als
   EINE anfassbare Fläche zurück, nicht nur das Wort. Der Tastaturfokus bekommt dieselbe
   Auskunft; sonst wüsste nur die Maus, dass hier etwas zu holen ist. */
a.mega-top:hover,a.mega-top:focus-visible{color:var(--accent-ink);border-bottom-color:var(--accent-ink)}
.mega-sub{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.1rem}
/* Menüpunkte tragen --ink (dunkel fast weiß), nicht die gedämpfte Fließtextfarbe: das Panel ist
   eine Liste aus Zielen, kein Fließtext – jeder Punkt ist gleich wichtig, und im Dunkelmodus
   war --text auf dem Panelgrund sichtbar matter als die Bereichszeile darüber. */
.mega-sub a{display:block;text-decoration:none;color:var(--ink);font-size:.97rem;
  padding:.3rem .5rem;border-radius:var(--r-sm);line-height:1.35}
.mega-sub a:hover{background:var(--soft);color:var(--accent-ink)}
.mega .is-current{color:var(--accent-ink);font-weight:700}
.mega-sub .is-current{background:var(--accent-soft)}

/* Kopf-Suche. Am Desktop steht sie zwischen Marke und Menü-Knopf; auf schmalen Schirmen
   bekommt sie eine EIGENE ZEILE darunter, statt sich mit der Marke um denselben Platz zu
   streiten – dort wurde das Feld auf „Wonac…" zusammengequetscht. Sie am Handy ganz
   wegzulassen wäre die Alternative gewesen: bei rund 130 Seiten ist die Suche aber gerade
   dort der schnellste Weg und gehört sichtbar hin. */
/* --such-breite = die eine Zahl für die Breite der Kopf-Suche am PC. Der Aufklapper mit den
   Vorschlägen liest DIESELBE Zahl (siehe .qs-panel) – vorher hatte er eine eigene (42rem) und
   war dadurch deutlich breiter als das Feld, unter dem er hing. */
:root{--such-breite:42rem}
.site-search{display:flex;align-items:center;gap:.4rem;flex:1 1 22rem;max-width:30rem;min-width:0;order:2}
.site-search input{flex:1 1 auto;min-width:0}
.site-brand{order:1}
.mega{order:3}

/* ---------------- Kopfzeile am PC: Marke links, Suche MITTIG, Menü rechts ----------------
   Bis 2026-08-04 lag die Suche als drittes Flex-Element direkt neben der Marke und klebte an
   ihr; das Menü wurde mit margin-left:auto nach rechts gedrückt. Stephan: „mir klebt das
   Suchfeld zu sehr am Logo" und „mach das Suchfeld in der Mitte der Seite zentriert".

   Umgesetzt als Raster mit drei Spalten statt mit Flex. Der Grund ist genau die Zentrierung:
   Bei Flex müsste die Mitte zwischen zwei UNTERSCHIEDLICH breiten Nachbarn (Logo 68px,
   Menü-Knopf ~120px) ausbalanciert werden – sie säße immer ein Stück daneben. Zwei gleich
   große 1fr-Spalten links und rechts halten die Mitte wirklich mittig, egal wie breit Marke
   und Menü werden.

   minmax(0,…) in der Mittelspalte, damit sie unter das Wunschmaß schrumpfen DARF, wenn das
   Fenster eng wird – sonst schöbe sie den Menü-Knopf aus der Zeile. */
@media (min-width:861px){
  .site-header-inner{display:grid;grid-template-columns:1fr minmax(0,var(--such-breite)) 1fr;
    align-items:center;column-gap:2rem}
  .site-brand{grid-column:1;justify-self:start}
  .site-search{grid-column:2;justify-self:stretch;flex:1 1 auto;max-width:none}
  .mega{grid-column:3;justify-self:end;margin-left:0}
}
@media (max-width:860px){
  .site-header-inner{flex-wrap:wrap;row-gap:.65rem;gap:.6rem}
  /* Marke und Menü-Knopf bleiben in EINER Zeile, die Suche rutscht darunter – sonst wird der
     Kopf am Handy drei Zeilen hoch und schiebt den Inhalt weg.
     Der Schriftzug durfte hier schrumpfen (flex:1 1 0) und notfalls umbrechen. Ein Logo darf
     das nicht: Es würde stauchen. Es behält deshalb seine Größe (flex:0 0 auto) und wird
     stattdessen kleiner gesetzt. Neben dem Logo bleibt für den Menü-Knopf reichlich Platz –
     gemessen bis hinunter zu 320px Fensterbreite.

     Am Handy geht die Marke NÄHER an die Kante als am PC (Stephan 2026-08-04: „da kann es
     mehr zu den Kanten des weißen Bereiches gehen"). Der Kopf ist dort ohnehin knapp, und
     ein kleines Logo mit viel Luft ringsum wirkt verloren – lieber ein großes mit wenig.
     Gemeint ist die Luft OBEN UND UNTEN. Der linke Abstand bleibt --pad-page: Auf dieser
     Linie beginnt auch der Seitentitel und jeder Absatz darunter. Rückte die Marke davor,
     stünde sie sichtbar schief zu allem, was unter ihr steht. */
  :root{--kopf-luft:.65rem}
  .site-brand{--logo-h:3.4rem}
  .mega{order:2;flex:0 0 auto}
  .site-search{order:3;flex:1 1 100%;max-width:none}
}
@media (max-width:640px){
  .site-brand{--logo-h:3.1rem}
}

/* ---------------- Top-Suche: Aufklapper beim Tippen ----------------
   Der Aufklapper trägt die Bildsprache des Mega-Menüs: weiße Fläche, Schatten, Bereichszeile in
   Oswald mit goldenem Strich, Treffer eingerückt mit weicher Hover-Fläche.

   EINE SPALTE, nicht vier wie im Menü. Das Menü ist eine feste Struktur, die man ÜBERFLIEGT –
   dort rücken vier Spalten dicht. Eine Trefferliste ist eine REIHENFOLGE, die man von oben nach
   unten liest; im Spaltensatz stünde der zweitbeste Treffer rechts oben und der schlechteste in
   der Mitte. Farben und Formen sind dieselben, das Layout ist es bewusst nicht.

   Alles hier entsteht erst durch site.js. Ohne JavaScript existiert kein .qs-panel, und das
   Suchformular verhält sich wie vor der Top-Suche. */
.site-search{position:relative}

/* z-index 42: über der Kopfleiste (40) und über dem Menü-Panel (41). Beide sind nie gleichzeitig
   offen (sie schließen einander), die Reihenfolge muss aber trotzdem stimmen – etwa während der
   Schließ-Bewegung. */
/* Breite und linke Kante wie das Suchfeld darüber, nicht mehr eigenständig (Stephan
   2026-08-04: „die Suchergebnisse exakt unter dem Suchfeld"). Vorher stand hier fest
   min(42rem, …) – das war breiter als das Feld und ragte rechts darüber hinaus. 100 % meint
   jetzt die Breite von .site-search, also Eingabefeld samt „Suchen"-Knopf. */
.qs-panel{position:absolute;left:0;top:calc(100% + .45rem);
  width:100%;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  box-shadow:var(--shadow-2);z-index:42;
  /* Hoch genug für acht Treffer samt klebendem Fuß, aber nie höher als der Bildschirm.
     overscroll-behavior:contain aus demselben Grund wie beim Menü-Panel (Issue #89): Wer am
     PC im Aufklapper bis ans Ende rollt, schöbe sonst mit demselben Rad die Seite dahinter
     weiter, während der Aufklapper stehen bleibt. */
  max-height:min(78vh,40rem);overflow-y:auto;overscroll-behavior:contain}
.qs-inner{padding:.55rem}
.qs-list{list-style:none;margin:0;padding:0}

/* Bereichszeile = .mega-top in klein: Oswald, fett, goldener Strich. Das Gewicht trägt die
   Unterscheidung in beiden Helligkeiten, der Strich allein täte das im Dunkelmodus nicht. */
.qs-top{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1rem;font-weight:700;
  color:var(--ink);letter-spacing:.01em;
  padding:.5rem .55rem .3rem;margin:.55rem 0 .35rem;
  border-bottom:2px solid var(--gold)}
.qs-list>.qs-top:first-child{margin-top:0}

.qs-hit{display:block;text-decoration:none;color:var(--ink);
  padding:.4rem .55rem;border-radius:var(--r-sm);line-height:1.35}
/* is-active = mit den Pfeiltasten ausgewählt. Sieht bewusst genauso aus wie Hover: Es ist
   dieselbe Aussage („dieser Treffer ist gemeint"), nur mit einem anderen Eingabegerät. */
.qs-hit:hover,.qs-hit.is-active{background:var(--soft)}
.qs-hit:focus-visible{outline:2px solid var(--accent-ink);outline-offset:1px}
.qs-hit-title{display:block;font-weight:600}
.qs-hit-snip{display:block;font-size:.9rem;color:var(--text);margin-top:.1rem}

/* Hervorhebung des Suchworts.
   KEIN waagrechter Innenabstand. Im Deutschen steckt das gesuchte Wort meist MITTEN in einer
   Zusammensetzung – „Altenarbeit", „Beratungsstellen". Ein padding-left/right schiebt die
   Wortteile auseinander, und aus „Altenarbeit" wird sichtbar „Alten arbeit". Der Farbfleck
   allein markiert genug; die Höhe kommt über padding-block, das keine Buchstaben verschiebt.
   Farbe fest aus --mark-*, nicht geerbt: Auf der Hover-Fläche wäre sonst Markenrot auf hellem
   Grund gelandet, und Markenrot als Schrift auf Farbfläche ist hier ohnehin ausgeschlossen.
   Fett kommt dazu, damit die Hervorhebung nicht allein an der Farbe hängt. */
.qs-hit mark,.sr-snippet mark,.sr-title mark{background:var(--mark-bg);color:var(--mark-ink);
  font-weight:700;padding:.06em 0;border-radius:2px}

.qs-empty{padding:.7rem .55rem;color:var(--text)}
/* „Alle 17 Treffer anzeigen": letzter Eintrag der Auswahlliste, damit die Pfeiltaste ihn
   erreicht – nicht bloß ein Link darunter.
   KLEBT AM UNTEREN RAND: Acht Treffer mit Textausschnitt sind höher als der Aufklapper, der Fuß
   lag dadurch unerreichbar unter der Kante – man musste erst scrollen, um zu erfahren, dass es
   überhaupt mehr gibt. Anders als bei der Seitenspalte (Issue #40) ist das hier gefahrlos: Es
   klebt EINE Zeile, nicht ein Kasten, der höher werden kann als das Fenster. */
.qs-more-row{position:sticky;bottom:0;z-index:1;background:var(--surface)}
.qs-more{display:block;text-decoration:none;color:var(--link);font-weight:600;
  padding:.6rem .55rem;border-top:1px solid var(--line);border-radius:0}
.qs-more:hover,.qs-more.is-active{background:var(--soft)}

/* Kennzeichnung „Entwurf" – nur in der Entwurfs-Ansicht für Angemeldete. Gleiche Aussage wie
   die Kennzeichnung im Menü: das sehen Besucher noch nicht. */
.qs-draft{display:inline-block;margin-left:.4rem;font-size:.72rem;font-weight:700;
  text-transform:uppercase;letter-spacing:.05em;
  color:var(--on-accent);background:var(--muted);border-radius:999px;padding:.05rem .4rem;
  vertical-align:.08em}

/* Ansage für Screenreader („7 Treffer"). Für Augen unsichtbar, aber im Baum – ausgeblendet mit
   display:none würde sie nicht vorgelesen. */
.qs-status{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;border:0}

/* Text, den nur OHREN bekommen: unsichtbar, aber im Baum – also für Bildschirmleser UND für
   unser eigenes Vorlesen da. Gebraucht für die Wörter „Telefon", „E-Mail", „Adresse" vor den
   Kontaktzeilen: dort steht für Augen ein gezeichnetes Zeichen, das keinen Text hat.
   ⚠️ NICHT display:none und NICHT visibility:hidden – beides nimmt den Text auch den Ohren weg.
   Auch keine Höhe 0 ohne clip-path: manche Browser lesen dann gar nichts mehr. */
.nur-hoerbar{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;border:0}

/* ---------------- Handy: Suche IM Menü ----------------
   site.js schiebt dieses eine Formular unter 860px ins Menü-Panel (setupSearchPlacement).
   Damit hat die Kopfleiste nur noch Marke + „Menü": eine Zeile weniger, und die zwei roten
   Knöpfe unterschiedlicher Größe sind weg.

   BEWUSST NICHT KLEBEND. Das Feld samt Treffern oben festzuhalten hieße, einen Kasten
   festzuhalten, der höher werden kann als das Fenster – dieselbe Falle wie bei der klebenden
   Seitenspalte (Issue #40). Mitlaufen ist ehrlicher als eine zweite Bildlaufleiste. */
.mega-panel>.qs-in-menu{display:flex;flex-wrap:wrap;gap:.5rem;max-width:none;
  padding:1rem var(--pad-page-r) .5rem var(--pad-page)}
/* flex-basis 0, NICHT auto: In einer umbrechenden Reihe (flex-wrap) bricht der Browser lieber
   um, als ein Element zu schrumpfen. Mit der Grundbreite „auto" beansprucht das Feld die volle
   Zeile, und „Suchen" landete darunter. Mit 0 teilen sich beide eine Zeile. */
.qs-in-menu input[type=search]{flex:1 1 0;min-width:0;font-size:1.05rem;padding:.7rem 1.1rem}
.qs-in-menu button[type=submit]{padding:.7rem 1.2rem}
/* Im Menü ist der Aufklapper kein schwebender Kasten mehr, sondern der Inhalt des Panels.
   ⚠️ overflow:visible ist hier PFLICHT, nicht Kosmetik. Ohne Höhendeckel gibt es nichts zu
   rollen – ein `overflow-y:auto` macht den Kasten aber trotzdem zum Bildlauf-Ziel. Zusammen
   mit dem overscroll-behavior:contain der Grundregel verschluckt er dann jeden Wisch: der
   Kasten selbst kann sich nicht bewegen und reicht auch nichts mehr ans Menü-Panel weiter.
   Gemessen (390×844, echte Touch-Ereignisse): Trefferliste völlig unbeweglich, Panel-Rollwert
   blieb 0 von 378. Wer den Aufklapper aus dem Bildlauf herausnimmt, muss ihn ganz herausnehmen. */
.qs-in-menu>.qs-panel{flex:1 1 100%;position:static;width:auto;max-height:none;overflow:visible;
  border:0;border-radius:0;box-shadow:none;background:transparent}
.qs-in-menu>.qs-panel .qs-inner{padding:.4rem 0 .8rem}
/* Treffer da -> Navigation weicht. Feld leeren oder Esc -> sie ist zurück, an derselben Stelle. */
.mega-panel.qs-active>.mega-inner{display:none}

@media (max-width:860px){
  /* Der Aufklapper darf am Handy nicht schmaler sein als der Bildschirm. */
  .qs-panel{width:calc(100vw - 1.5rem)}
}

/* ---------------- Schleier hinter den Treffern ----------------
   Sobald Treffer stehen, wird die Seite dahinter unscharf und dunkler. Grund: Der Aufklapper
   liegt mitten in einer vollen Seite (Aufmacherbild, Kennzahlen, Fließtext) und musste sich
   gegen dieses Bildrauschen behaupten. Unschärfe nimmt dem Hintergrund die Aufmerksamkeit,
   ohne ihn zu verstecken – man sieht weiter, wo man ist.

   z-index 30: über dem Seiteninhalt (0–3), aber UNTER der Kopfleiste (40). Damit bleiben
   Suchfeld, Aufklapper und Menü-Knopf scharf, ohne dass irgendwo eine Ausnahme nötig wäre –
   die Kopfleiste ist ein eigener Stapel-Zusammenhang und liegt ohnehin darüber. Scharf bleibt
   ebenfalls die grüne Barrierefreiheits-Säule (z-index 55): ein Werkzeug, das man immer
   erreichen können muss, ist kein Seiteninhalt.

   Immer im Dokument, nur durchsichtig – wie beim Rechtsseiten-Panel (.panel-backdrop). Ein
   Element, das erst bei Bedarf entsteht, könnte nicht überblenden. backdrop-filter steht
   allein im offenen Zustand: So kostet der Schleier zugeklappt keine Rechenzeit.
   Kann ein Browser kein backdrop-filter, bleibt die Abdunklung – die Wirkung ist schwächer,
   aber die Absicht kommt an. */
.qs-veil{position:fixed;inset:0;z-index:30;opacity:0;pointer-events:none;
  transition:opacity .18s ease}
.qs-veil.is-on{opacity:1;pointer-events:auto;
  background:rgba(10,14,18,.34);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}
@media (prefers-reduced-motion:reduce){ .qs-veil{transition:none} }
/* Am Handy liegt das Suchfeld im Menü-Panel, und das deckt den Schirm schon selbst ab. Ein
   Schleier darunter wäre unsichtbar und nur Rechenarbeit. */
@media (max-width:860px){ .qs-veil{display:none} }
/* Auf dem Papier hat ein Schleier nichts zu suchen. */
@media print{ .qs-veil{display:none} }

/* Die dunkle Servicezeile über der Kopfleiste ist entfallen (siehe public_shell_top.php):
   Kontakt, Presse und Über uns stehen im Hauptmenü, ein zweiter Navigationsstreifen kostete
   nur Höhe. Damit sind auch alle .topbar-Regeln weg – toter Bauplan verwirrt beim nächsten
   Umbau mehr, als er nützt. */

/* ---------------- Übrige Navigationen (Fußzeile) ---------------- */
.site-nav ul{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:.2rem 1rem;align-items:center}
.site-nav a,.site-nav span{text-decoration:none;color:var(--ink);padding:.35rem .2rem;display:inline-block}
.site-nav a:hover{color:var(--accent-ink)}
.site-nav .is-current{color:var(--accent-ink);font-weight:600}
.site-nav ul ul{display:block;margin:.1rem 0 .3rem .8rem;gap:0}
.site-nav ul ul li{margin:.1rem 0}
.site-nav ul ul a{font-size:.95rem;color:var(--text)}

/* Fußzeilen-Navigation */
.site-footer .site-nav ul{gap:.2rem 1rem}
.site-footer .site-nav{margin-bottom:.6rem}

/* ---------------- Seitengerüst ----------------
   .site-main trägt den grauen Grund und NUR den senkrechten Rhythmus; die Lesebreite setzt
   .page-shell. Beides getrennt, weil der Aufmacher (.lead-hero) über die volle Breite gehen
   soll, der Text darunter aber nicht. */
.site-main{margin:0;padding:0}
/* EINE Breite für ein- und zweispaltige Seiten: der Seitentitel soll nicht springen, nur weil
   eine Seite eine Seitenspalte hat. Die Seitenspalte nimmt sich innerhalb dieser Breite ihre
   festen 340px, der Hauptinhalt bekommt den Rest. */
.page-shell{max-width:var(--col-page);margin:0 auto;padding:var(--band) var(--pad-page-r) var(--band) var(--pad-page)}

/* Lesebremse: Fließtext, Überschriften und Akkordeon bleiben schmal, damit die Zeilen nicht
   über die ganze Spalte laufen. Raster-Bausteine (Teaser, Kennzahlen, Chips, Verweisliste,
   Handlungsband) sind davon ausdrücklich AUSGENOMMEN – die leben von der Breite.
   Gilt in BEIDEN Vorlagen: früher stand hier „nur einspaltig, neben einer Seitenspalte ist der
   Hauptinhalt ohnehin schmal" – das stimmte bei 740px Hauptspalte, mit den heutigen 1100px
   nicht mehr (der Bildungsscheck-Text lief auf rund 130 Zeichen je Zeile).
   Die Seitenspalte braucht keine Ausnahme: sie ist mit 340px ohnehin schmaler als --col-text. */
.page-main .rte,
.page-main .content > h2{max-width:var(--col-text)}
/* Die Titelzone ist die EINZIGE Zone der Seite, neben der nie etwas steht: Brotkrumen, Titel
   und Lesehilfe liegen im Quelltext VOR dem Spaltenraster, der Inhalt beginnt immer darunter –
   auch die (klebende) Seitenspalte, die erst in .page-layout anfängt. Deshalb gilt hier als
   einziges Maß die volle Inhaltsbreite: der Titel soll nicht umbrechen, solange Platz da ist.
   Die Lesebremse (--col-text) galt hier fälschlich als Argument. Sie schützt FLIESSTEXT vor zu
   langen Zeilen; eine Überschrift liest man nicht Zeile für Zeile, sondern als Ganzes – ein
   Umbruch mitten im Titel („Weiterbil-dung") kostet dort mehr, als die Breite einbringt.

   Nachgemessen am 02.08. über alle 155 Seitentitel (scratchpad/titelbreiten.js, Oswald 600 in
   der wirklich gerenderten Größe). Längster Titel: „Anerkennung von im Ausland erworbenen
   Qualifikationen" mit 1152px bei 44px Schrift.
     ab 1281px Fenster : Platz 1131–1480px → ALLE 155 Titel stehen in EINER Zeile
     1150–1280px       : 1 Titel bricht (eben jener, 21px bzw. 105px zu lang)
     unter 1024px      : Umbruch unvermeidbar und richtig – dort ist er kein Schaden,
                         weil die Schrift mitschrumpft (clamp) und getrennt wird (hyphens).
   Vorher lag die Grenze bei 736px (--col-text): schon ein 25-Zeichen-Titel brach auf einem
   1920er Schirm um, obwohl 1480px frei waren.

   „Wird der Titel später verdeckt?" – nein, und zwar baulich: die Werkzeugsäule schwebt zwar
   fest am rechten Fensterrand, aber der Inhaltsspalte ist ihr Streifen über --pad-page-r
   ABGEZOGEN (siehe Barrierefreiheits-Säule weiter unten). Der Titel endet damit immer links
   von ihr – gemessen bei 2560/1920/1750/1600/1440/1280/1150px.

   ⚠️ Die alte Regel stand am 28.07. im SELBEN Deklarationsblock wie .rte und h2 darüber. Beim
   Umstellen der Titelzone auf --col-list sind die beiden stillschweigend mitgewandert: der
   Fließtext lief seither 992px breit, also rund 118 Zeichen je Zeile statt der angepeilten 90.
   Lehre: eine Selektorenliste ist EINE Entscheidung – wer nur einen Teil davon ändern will,
   muss ihn vorher herauslösen. */
.page-head,
.page-head h1{max-width:none}

/* Gestapelte Zeilen: mittleres Maß (siehe --col-list). Beim Akkordeon wird die BOX auf dieses
   Maß gesetzt, der Text darin zusätzlich auf Lesebreite – die Zeilen sollen gleich breit sein
   wie die Verweisliste daneben, der Fließtext darin trotzdem lesbar bleiben. */
.page-main .accordion,
.page-main .linklist,
.page-main .downloads,
.page-main .page-anchors,
/* Bereichsliste NUR in der Zeilen-Darstellung – „Kacheln" ist ein Raster und darf breit sein. */
.page-main .pagelist--liste,
/* Ein Handlungsband OHNE „randlos" ist eine Karte im Textfluss und folgt demselben Maß.
   Erst „randlos" macht daraus ein Band über die ganze Fensterbreite – dann gilt die Regel
   weiter unten und dieses max-width greift nicht mehr (full-bleed setzt es zurück). */
.page-main .cta:not(.full-bleed){max-width:var(--col-list)}
.accordion .accordion-body .rte,
.accordion .accordion-body > *{max-width:var(--col-text)}

/* Aufmacher ganz oben: sitzt außerhalb des Spaltenrasters und darf deshalb auch im
   Zweispalten-Layout randlos sein. Ohne „randlos" bleibt er in der Lesebreite. */
.lead-hero{position:relative;max-width:var(--col-page);margin:0 auto;padding:0 var(--pad-page-r) 0 var(--pad-page)}
.lead-hero .hero{margin:0;border-radius:0 0 var(--r-lg) var(--r-lg)}
.lead-hero .full-bleed{width:100vw;max-width:100vw;
  margin-left:calc(50% - 50vw + var(--bleed-fix));
  margin-right:calc(50% - 50vw - var(--bleed-fix));border-radius:0}
.lead-hero .full-bleed > .hero-body{width:100%;max-width:var(--col-page);
  margin-inline:auto;padding-inline:1.2rem}

/* Der Text im AUFMACHER sitzt senkrecht in der Mitte, nicht am unteren Rand: unten stünde er
   auf einem hohen Bildschirm hinter dem Falz. Waagrecht bleibt er links an der Fluchtlinie —
   dieselbe Linie, auf der Logo und Seitentitel beginnen.
   Ausdrücklich NUR für den Aufmacher; ein Banner mitten im Text behält seine Vorgabe (unten
   links), und die Textposition „mittig" am Baustein sticht das hier weiterhin. */
.lead-hero .hero:not(.hero--mitte){align-items:center}
/* Dazu der Verlauf: er lief von unten nach oben und hätte einen mittigen Text auf einem hellen
   Foto ungeschützt gelassen. Jetzt kommt die Deckung von LINKS, wo der Text steht, plus ein
   Rest unten für den Pfeilkreis. */
.lead-hero .hero:not(.hero--mitte)::after{
  background:linear-gradient(to right,rgba(0,0,0,.72) 0%,rgba(0,0,0,.52) 38%,rgba(0,0,0,.12) 68%,rgba(0,0,0,0) 88%),
             linear-gradient(to top,rgba(0,0,0,.45) 0%,rgba(0,0,0,0) 30%)}

/* Am PC rückt der Slogan-Block um GENAU SEINE EIGENE HÖHE nach unten. „Um seine eigene Höhe"
   ist wörtlich translateY(100%): Prozente beim Verschieben rechnen immer auf die Höhe des
   verschobenen Blocks selbst, nicht auf die des Aufmachers.

   Der Deckel dahinter ist kein Schmuck, sondern gemessen: der Aufmacher hat nicht überall
   gleich viel Luft. Bei 1920×1080 ist er 832px hoch und der Textblock 226px – die volle
   Verschiebung lässt unten noch 77px. Bei 1366×768 sind es nur 645px, dort wäre derselbe
   Block 15px unter den Bildrand gerutscht und abgeschnitten worden (der Aufmacher schneidet
   ab, sonst liefe das Foto aus dem Rahmen).

   Deshalb: verschiebe um die eigene Höhe, aber höchstens so weit, dass unten der Platz des
   Pfeilkreises frei bleibt (3,25rem Kreis + 1,15rem Abstand = 4,5rem). 50cqh − 50% ist genau
   die Luft unter dem mittig stehenden Block: cqh misst die Höhe des AUFMACHERS (dafür ist er
   eine Zeile darüber zum Größen-Container erklärt), % die des Blocks selbst.

   Nur die hohen Aufmacher (16:9 und fensterhoch) dürfen Größen-Container sein: ihre Höhe
   steht durch Seitenverhältnis bzw. Fensterhöhe fest und hängt nicht am Text. Ein Container
   dieser Art ignoriert seinen Inhalt beim Messen – bei einem flachen Band (3:1) könnte ein
   langer Titel dann unten herausragen statt das Band wachsen zu lassen.

   Unter 1024px bleibt alles wie bisher: dort ist die Luft unter dem Block (gemessen 62–159px)
   kleiner als der Block selbst, die Verschiebung liefe nur noch gegen ihren eigenen Deckel. */
@media (min-width:1024px){
  .lead-hero .hero--gross,.lead-hero .hero--fenster{container-type:size}
  .lead-hero .hero--gross:not(.hero--mitte) > .hero-body,
  .lead-hero .hero--fenster:not(.hero--mitte) > .hero-body{
    transform:translateY(clamp(0px,50cqh - 50% - 4.5rem,100%))}
}

/* ---------------- Pfeilkreis „hier geht es weiter" ----------------
   Sitzt am unteren Rand des Aufmachers, waagrecht mittig. Er ist bewusst KEIN gefüllter Knopf:
   ein roter Kreis auf dem Foto würde mit dem Handlungsknopf im Text um Aufmerksamkeit streiten.
   Stattdessen ein weißer Ring mit leichter Milchglas-Fläche — sichtbar auf hellen wie dunklen
   Bildstellen, ohne sich vorzudrängen. */
.hero-down{position:absolute;left:50%;bottom:1.15rem;transform:translateX(-50%);
  display:grid;place-items:center;width:3.25rem;height:3.25rem;border-radius:50%;
  color:#fff;text-decoration:none;border:2px solid rgba(255,255,255,.9);
  background:rgba(0,0,0,.28);backdrop-filter:blur(2px);
  box-shadow:0 2px 10px rgba(0,0,0,.35);z-index:3;
  animation:hero-down-wink 2.6s ease-in-out infinite}
.hero-down svg{width:1.6rem;height:1.6rem}
.hero-down:hover,.hero-down:focus-visible{background:rgba(0,0,0,.5);border-color:#fff;
  animation-play-state:paused}
.hero-down:focus-visible{outline:3px solid #fff;outline-offset:3px;
  box-shadow:0 0 0 6px rgba(0,0,0,.45)}
/* Die Bewegung ist der eigentliche Hinweis: ein stehender Pfeil wird übersehen. Zwei kurze
   Stupser, dann eine lange Pause — dauerhaftes Hüpfen zieht das Auge vom Text ab. */
@keyframes hero-down-wink{
  0%,58%,100%{transform:translateX(-50%) translateY(0)}
  66%{transform:translateX(-50%) translateY(.42rem)}
  74%{transform:translateX(-50%) translateY(0)}
  82%{transform:translateX(-50%) translateY(.42rem)}
  90%{transform:translateX(-50%) translateY(0)}
}
/* Wer Bewegung abbestellt hat, bekommt den Kreis ruhig — er bleibt vollständig bedienbar. */
@media (prefers-reduced-motion:reduce){ .hero-down{animation:none} }
/* Sehr flache Fenster (Notebook im Querformat, aufgeklappte Tastatur): dort zählt jeder
   Millimeter, der Kreis rückt näher an den Rand und wird kleiner. */
@media (max-height:560px){ .hero-down{width:2.6rem;height:2.6rem;bottom:.6rem} }
/* Am Handy entfällt der Kreis. Dort weiß jeder, dass eine Seite weitergeht — Wischen ist die
   Grundbewegung des Geräts, und niemand tippt auf einen Pfeil, um zu scrollen. Er kostete nur
   Platz, den Slogan und Knopf besser gebrauchen können.
   Und weil dieser Platz frei wird, rückt der Text wieder an den unteren Rand: im Hochformat
   schneidet der Bildausschnitt ohnehin eng um die Gesichter, und Text in der Mitte läge quer
   darüber. Unten steht er auf der ruhigen Zone des Bildes. */
@media (max-width:640px){
  .hero-down{display:none}
  .lead-hero .hero:not(.hero--mitte){align-items:flex-end}
  /* Dann muss auch die Deckung wieder von UNTEN kommen, wo der Text jetzt steht. */
  .lead-hero .hero:not(.hero--mitte)::after{
    background:linear-gradient(to top,rgba(0,0,0,.72) 0%,rgba(0,0,0,.45) 38%,rgba(0,0,0,0) 76%)}
}

/* ---------------- Brotkrumen ----------------
   Bei ~130 Seiten in vier Ebenen sind die Brotkrumen die Orientierung, nicht Zierde – deshalb
   dürfen sie sichtbar sein und nicht als graue Randnotiz verschwinden: unterstrichen, eine
   Spur größer, mit Luft zur Überschrift.
   Die aktuelle Stufe ist rot und fett. Sie steht auf dem SEITENGRUND, trägt also --link und
   nicht --accent: das Markenrot #E2001A erreicht auf dem grauen Grund nur 4,25:1 und verfehlt
   die 4,5:1 für normalen Text (im Dunkelmodus zeigt --link das aufgehellte Rot, dort passt es
   andersherum). Dieselbe Regel wie überall im Projekt: Markenrot trägt keine feine Schrift. */
.crumbs{margin:0 0 1.5rem}
/* Solange der Weg in eine Zeile passt, steht er in einer Zeile – dafür sorgt schon .page-head
   (Listenmaß statt Lesebreite, siehe dort). Passt er nicht, BRICHT er um (Issue #49).
   Vorher war die Zeile stattdessen schiebbar. Das war die schlechtere Wahl: am Handy lief der
   Weg bis hinauf zu 768px Fensterbreite über – bei 390px standen von 669px Weg ganze 352px im
   Bild –, und was man schieben muss, sieht man nicht. Ein Balken unter den Brotkrumen ist
   zudem genau die Art Bedienteil, die auf einem Tastenfeld-losen Gerät niemand trifft.
   Kein Umbruch bei fester Schwelle, sondern flex-wrap: eine Schwelle wäre entweder zu tief
   (zwischen 560 und 800px bliebe der Balken) oder zu hoch (Umbruch, wo Platz ist). So richtet
   es sich von selbst nach dem, was wirklich hineinpasst.
   Der Trenner „›" steht am ANFANG jeder Stufe und führt damit auch eine umgebrochene Zeile an –
   genau das sagt „hier geht der Weg weiter" und nicht „hier fängt ein neuer an". */
/* Ausrichtung an der SCHRIFTLINIE, nicht an der Mitte: bricht eine Stufe in sich um (auf 320px
   etwa „Schule, Lehre, Studium, Weiterbildung"), schwebte das „›" sonst mittig zwischen ihren
   beiden Zeilen statt die erste anzuführen. Bei einzeiligen Stufen ist beides dasselbe. */
.crumbs ol{list-style:none;margin:0;padding:0 0 .2rem;display:flex;flex-wrap:wrap;
  align-items:baseline;gap:.25rem .1rem;font-size:1rem}
/* flex:0 1 auto + min-width:0 statt 0 0 auto + nowrap: eine Stufe rutscht als GANZES in die
   nächste Zeile (ihre Ausgangsbreite ist die ungebrochene) und bricht nur dann in sich selbst,
   wenn sie allein keine Zeile füllt – etwa „Verlängerte Lehre / Teilqualifikation" auf 320px.
   Ohne das liefe ein langer Titel über den Rand hinaus und brächte die ganze Seite ins
   Schieben; das wäre schlimmer als der Balken, den wir gerade abgeschafft haben. */
.crumbs li{display:flex;align-items:baseline;flex:0 1 auto;min-width:0}
/* Trenner als CSS-Zeichen: rein dekorativ, wird nicht mit vorgelesen. Bewusst OHNE
   Unterstreichung – er gehört zu keiner Stufe. */
.crumbs li+li::before{content:"›";color:var(--muted);padding:0 .45rem;flex:0 0 auto;
  text-decoration:none}
.crumbs a{color:var(--muted);text-decoration:underline;text-underline-offset:.2em}
.crumbs a:hover{color:var(--link)}
/* Die aktuelle Stufe bleibt OHNE Unterstreichung: Sie ist kein Verweis, und unterstrichener
   Text sagt im Web „hier kann man klicken". Rot und fett heben sie deutlich genug ab. */
.crumbs [aria-current]{color:var(--link);font-weight:700}

/* ---------------- Titelzone ---------------- */
.page-head{margin:0 0 1.6rem}
.page-tools{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:1rem}

h1{font-family:"Oswald","Segoe UI",Arial,sans-serif;color:var(--ink);font-weight:600;
  font-size:clamp(1.9rem,1.4rem + 1.8vw,2.75rem);line-height:1.14;margin:0;
  letter-spacing:-.005em}
/* Goldener Strich unter der Hauptüberschrift – die eine Zierde, die sich die Seite gönnt.
   Übernommen aus der BiBer-Onepage („Unser Angebot"), dort ebenfalls unter der Überschrift. */
h1::after{content:"";display:block;width:3.5rem;height:4px;border-radius:2px;
  background:var(--gold);margin-top:.7rem}
h2{font-family:"Oswald","Segoe UI",Arial,sans-serif;color:var(--ink);font-weight:600;
  font-size:clamp(1.35rem,1.15rem + .6vw,1.7rem);margin:2rem 0 .6rem;
  scroll-margin-top:5.5rem}   /* Sprungziel darf nicht unter der klebenden Kopfleiste landen */
/* H3 = untergeordnete Überschrift (z. B. Seitenspalten-Überschriften – die sind bewusst H3
   ohne Anker). Gleiche Schrift wie H2, eine Stufe kleiner. .contact-title u. Ä. haben eigene
   Klassen und überschreiben das ohnehin. */
h3{font-family:"Oswald","Segoe UI",Arial,sans-serif;color:var(--ink);font-weight:600;
  font-size:1.15rem;margin:1.3rem 0 .45rem}
.content p{margin:.7rem 0}
/* Aufzählungen im FLIESSTEXT werden eingerückt – die Punkte sollen unter dem Text hängen.
   Bausteine sind technisch ebenfalls <ul> (Bereichsliste, Verweisliste, Downloads,
   Kontaktzeilen), aber keine Aufzählung: sie sind das Gerüst des Bausteins und beginnen auf
   derselben Fluchtlinie wie Überschrift und Text. Vorher rückte diese Regel sie mit ein –
   `.content ul` (0,1,1) ist spezifischer als `.pl-list` (0,1,0) und schlug deren margin:0
   (Issue #28); die Karten standen 23px weiter rechts als jeder Absatz darüber.
   Unterschieden wird an der KLASSE: Rich-Text-Listen haben keine, weil Blocks::sanitizeHtml
   jedes Attribut entfernt – jede Baustein-Liste trägt dagegen ihre eigene. */
.content ul:not([class]),.content ol:not([class]){margin:.7rem 0 .7rem 1.4rem}
.content .rte{margin:.2rem 0}
/* Am Handy war der Einzug einer Aufzählung zu teuer (Issue #47). Er kam aus DREI Quellen, die
   sich addierten: 1,4rem Einrückung von oben, die 40px, die jeder Browser einer Liste von sich
   aus für die Aufzählungszeichen gibt, und – im Akkordeon – noch einmal 0,9rem Kartenpolster.
   Zusammen rund 77px: bei 390px Bildschirmbreite ein Fünftel der Zeile, und der Text brach
   danach nach jedem vierten Wort um.
   Hier wird deshalb NICHT die Einrückung von oben allein zurückgenommen, sondern der Platz neu
   verteilt: kein zusätzlicher Rand mehr, dafür ein selbst gesetztes Polster, das genau das
   Aufzählungszeichen trägt. Die Liste bleibt sichtbar eingerückt, kostet aber ein Drittel.
   Die Regel gilt für ALLE Fließtext-Listen, nicht nur die im Akkordeon: sonst stünden zwei
   Listen auf derselben Seite verschieden weit rechts, je nachdem, ob sie in einem Fach liegen.
   Nummerierte Listen bekommen mehr, weil „10." breiter ist als ein Punkt. */
@media (max-width:560px){
  .content ul:not([class]){margin-left:0;padding-left:1.35rem}
  .content ol:not([class]){margin-left:0;padding-left:1.8rem}
}

/* Bild-Baustein. width/height stehen am <img> (verhindert das Springen des Layouts beim
   Laden), deshalb hier zwingend height:auto – sonst wird das Seitenverhältnis verzerrt. */
.fig{margin:1.25rem 0}
.fig picture{display:block}
.fig img{max-width:100%;height:auto;display:block;border-radius:8px}
.fig figcaption{margin-top:.4rem;font-size:.9rem;color:var(--muted);line-height:1.4}
/* Bildnachweis: gehört sichtbar zum Bild, soll die Unterschrift aber nicht übertönen –
   deshalb kleiner und leiser. Steht notfalls auch allein (Rechtepflicht hängt nicht an
   einer Unterschrift). */
.fig-credit{font-size:.85em;opacity:.85}
@media print{.fig img{max-width:60%}}
/* Bild schmaler im Text (Baustein-Einstellung „Breite auf der Seite"). Ohne Angabe bleibt es
   bei der ganzen Textbreite – das ist der Normalfall und für querformatige Fotos richtig.
   Gebraucht wird es bei HOCHKANTEN Motiven: Ein Buchcover über die volle Textbreite ist
   höher als der Bildschirm, bevor der erste Satz kommt. Linksbündig, nicht mittig: Der Text
   daneben beginnt links, und ein mittiges Bild ließe die Seite bei jedem Absatz neu einsetzen.
   Am Handy hebt sich die Begrenzung auf – ein Drittel von 390px wäre eine Briefmarke. */
.fig--halb{max-width:50%}
.fig--klein{max-width:33%}
@media (max-width:640px){.fig--halb,.fig--klein{max-width:100%}}

/* Fester Zuschnitt (Bild-Baustein mit Format): object-fit:cover schneidet aufs Format,
   der Fokuspunkt (data-focus -> object-position, von site.js gesetzt) hält die wichtige
   Stelle sichtbar. Leeres Format = kein .fig-frame = Original, frei skalierend. */
.fig-frame{position:relative;overflow:hidden;border-radius:8px}
.fig-frame picture{display:block;width:100%;height:100%}
.fig-frame img{width:100%;height:100%;object-fit:cover;object-position:50% 50%;border-radius:0}
.fig-1x1{aspect-ratio:1/1}
.fig-4x3{aspect-ratio:4/3}
.fig-3x2{aspect-ratio:3/2}
.fig-16x9{aspect-ratio:16/9}
.fig-3x4{aspect-ratio:3/4}
.fig-2x3{aspect-ratio:2/3}
@media print{.fig-frame{aspect-ratio:auto}.fig-frame img{height:auto;max-width:60%;object-fit:contain}}

/* Akkordeon (native details/summary – funktioniert ohne JS, druckbar) */
.accordion{margin:1rem 0;display:flex;flex-direction:column;gap:.5rem}
.accordion details{border:1px solid var(--line);border-radius:var(--r);background:var(--surface);
  box-shadow:var(--shadow-1)}
.accordion summary{cursor:pointer;padding:.7rem .9rem;font-weight:600;color:var(--ink);
  list-style:none;display:flex;align-items:center;gap:.9rem}
.accordion summary::-webkit-details-marker{display:none}
/* Das offene Fach trägt seine Überschrift in Rot – dieselbe Farbe wie das Minus-Zeichen
   daneben, damit Zeichen und Schrift dasselbe sagen. --accent-ink ist Rot als SCHRIFT auf
   einer Fläche (hell #E2001A auf Weiß = 4,9:1; dunkel das aufgehellte #ff8090), nicht das
   Flächenrot --accent. */
.accordion details[open] > summary{color:var(--accent-ink)}
.accordion .acc-title{min-width:0}
/* Plus und Minus rechts – groß und klassisch. Bewusst GEZEICHNET (zwei Balken) statt getippt:
   ein „+"/„–" aus der Schrift wechselt bei jeder Schriftart Größe und Strichstärke, und ein
   Minus säße nicht auf derselben Höhe wie der Querbalken des Plus. So bleibt der Querbalken
   liegen und nur der senkrechte Balken fährt zusammen – daraus entsteht die Bewegung. */
.accordion .acc-sign{position:relative;flex:0 0 auto;margin-left:auto;width:1.45rem;height:1.45rem}
.accordion .acc-sign::before,
/* Die zwei Balken sind ZEICHNUNG auf dem Karten-Grund, nicht die Fläche eines Knopfes –
   deshalb --accent-ink und nicht --accent-dark: ein dunkles Rot auf dunklem Grund verschwände. */
.accordion .acc-sign::after{content:"";position:absolute;left:0;right:0;top:50%;height:3px;
  border-radius:2px;background:var(--accent-ink);transform:translateY(-50%);
  transition:transform .28s ease}
.accordion .acc-sign::after{transform:translateY(-50%) rotate(90deg)}
.accordion details[open] .acc-sign::after{transform:translateY(-50%) rotate(90deg) scaleX(0)}
.accordion .accordion-body{padding:0 .9rem .8rem}
/* Beim Auf- und Zuklappen misst site.js die Höhe und lässt sie laufen (CSSOM, kein
   style-Attribut im HTML – die CSP verbietet nur letzteres). Ohne JavaScript klappt das
   Fach weiterhin sofort auf: <details> kann das von Haus aus. */
.accordion .accordion-body.is-animating{overflow:hidden;transition:height .28s ease}
@media (prefers-reduced-motion:reduce){
  .accordion .acc-sign::before,.accordion .acc-sign::after{transition:none}
  .accordion .accordion-body.is-animating{transition:none}
}

/* ------------------------------- Sprungmarken -------------------------------
   „Auf dieser Seite": Kurzwege zu den Überschriften. Hatte bisher gar kein Aussehen und
   erschien als Reihe nackter Links — auf einer langen Infoseite ist das aber das erste
   Orientierungsangebot und darf ruhig aussehen wie ein Inhaltsverzeichnis.
   Als Fläche gesetzt, damit klar ist: das gehört zusammen und ist nicht Fließtext. */
.page-anchors{display:flex;flex-wrap:wrap;gap:.5rem;margin:0 0 1.8rem;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  box-shadow:var(--shadow-1);padding:1rem 1.1rem;
  /* Klebt unter der Kopfleiste, damit die Abschnitte einer langen Seite durchklickbar bleiben
     (Issue #60). Sie soll BÜNDIG an der Kopfleiste sitzen – bliebe ein Spalt, scrollte der
     Inhalt sichtbar hindurch. Die genaue Unterkante misst site.js und legt sie als --anker-oben
     ab; sie ändert sich mit der Schriftgröße (A+/A−) und der Gerätebreite. 5,5rem ist der
     Rückfall ohne JavaScript – derselbe Wert wie bei scroll-padding-top. */
  position:sticky;top:var(--anker-oben,5.5rem);z-index:20}
/* Ist ein Hinweisband über dem Kopf, rutscht die Kopfleiste um dessen Höhe nach unten –
   die Anker-Leiste muss mit, sonst verschwindet sie dahinter. */
body.has-draft-bar .page-anchors{top:var(--anker-oben,calc(5.5rem + var(--draft-bar-h)))}
/* GEKLEBT: enger gesetzt, aber die Marken brechen weiter um – sie müssen ALLE lesbar bleiben.
   Der erste Anlauf zwang sie in eine einzige Zeile; dabei war die letzte Marke angeschnitten
   („Bachelorstudiu…"), und eine Sprungmarke, deren Beschriftung man nicht lesen kann, ist keine.
   Das Zusammendrücken bleibt trotzdem: geklebt darf die Leiste nicht so aussehen und so viel
   Platz brauchen wie im Ruhezustand. */
.page-anchors.is-stuck{padding:.5rem .9rem;gap:.4rem;
  box-shadow:0 10px 12px -10px rgba(0,0,0,.45)}
.page-anchors.is-stuck .anchor-badge{padding:.28rem .75rem;font-size:.88rem}

/* … AUSSER die Leiste würde festgenagelt zu hoch. Gemessen im Bestand: bis zu acht Marken je
   Seite; am Handy sind das rund 195px – ein Fünftel des Bildschirms, dauerhaft belegt (dieselbe
   Überlegung wie bei der mitlaufenden Seitenspalte). Erst DANN wird sie einzeilig und man
   schiebt sie seitlich. Ob dieser Fall vorliegt, kann CSS nicht wissen – es hängt an der
   gemessenen Höhe im wirklichen Fenster; site.js setzt die Klasse dazu. */
.page-anchors.is-stuck.is-eng{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:thin;
  /* Der Verlauf rechts ist das Zeichen „hier geht es weiter" – ohne ihn sieht die angeschnittene
     Marke am Rand nach Fehler aus statt nach Fortsetzung. Er muss am sichtbaren Rand kleben und
     NICHT mit dem Inhalt wandern: darum die Voreinstellung `scroll` (bei einem Scroll-Container
     heißt das „fest am Element"), nicht `local` – das wäre genau falsch herum. */
  background-image:linear-gradient(to right,transparent calc(100% - 2.4rem),var(--surface));
  background-repeat:no-repeat}
/* nowrap gilt NUR hier. Im umbrechenden Zustand muss eine sehr lange Beschriftung INNERHALB
   ihrer Blase umbrechen dürfen: „Bachelorstudium Gesundheits- und Krankenpflege" ist am Handy
   breiter als der Bildschirm und wurde sonst angeschnitten, obwohl die Leiste noch gar nicht
   eng war. Eine Marke, die man nicht zu Ende lesen kann, ist keine. */
.page-anchors.is-stuck.is-eng .anchor-badge{flex:0 0 auto;white-space:nowrap}
.anchor-badge{display:inline-flex;align-items:center;gap:.4rem;text-decoration:none;
  background:var(--soft);color:var(--ink);border:1px solid var(--line);border-radius:999px;
  padding:.4rem .9rem;font-size:.94rem;line-height:1.3;max-width:100%}
.anchor-badge::before{content:"↓";color:var(--accent-ink);font-weight:700}
.anchor-badge:hover{border-color:var(--accent-ink);color:var(--accent-ink);background:var(--accent-soft)}

/* Umschalter Einfache Sprache */
.lang-switch{margin:.4rem 0 1rem}
.lang-btn{display:inline-flex;align-items:center;gap:.4rem;background:var(--accent);color:var(--on-accent);
  border:0;border-radius:999px;padding:.55rem 1.1rem;font-size:1rem;cursor:pointer}
.lang-btn:hover{background:var(--accent-dark)}
.content-simple{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  box-shadow:var(--shadow-1);padding:1.2rem 1.4rem}
/* Die Einfach-Fassung beginnt fast immer mit einer H2 – und deren margin-top von 2rem läuft
   INNERHALB der weißen Fläche mit. Zusammen mit Rahmen und Innenabstand standen so 52px über
   der ersten Überschrift (gemessen 10.08.), die Fläche sah oben leer aus. Im Fließtext ohne
   eigene Fläche (.content normal) ist derselbe Abstand richtig und bleibt deshalb unangetastet.
   Unten dieselbe Rechnung: der letzte Absatz brachte seinen margin-bottom mit. */
.content-simple>*:first-child{margin-top:0}
.content-simple>*:last-child{margin-bottom:0}

/* ------------------------------- Seiten-Layout (Vorlagen) -------------------------------
   Einspaltig ('single') = wie bisher, Inhalt über die volle Breite (max 820px).
   Zweispaltig ('sidebar') = Hauptinhalt links, Seitenspalte rechts.
   ⚠️ Die Maße 1100/320 SPIEGELN die Registry ($layoutMax/$sideW in _app/templates/registry.php)
   und die dortigen „sizes" (welche Bildgröße der Browser lädt). Ändern sich die Werte dort,
   müssen sie hier mitgezogen werden. */
/* Die Lesebreite setzt .page-shell (siehe „Seitengerüst" weiter oben) – hier steht nur noch,
   wie die Spalten INNERHALB dieser Breite liegen. */
.page-layout--sidebar.has-aside{
  display:grid;
  /* Seitenspalte FEST, Hauptinhalt flexibel – so bekommt der Zugewinn auf großen Schirmen
     der Inhalt und nicht das Beiwerk (dasselbe Prinzip wie bei stadt-salzburg.at). */
  grid-template-columns:minmax(0,1fr) 340px;
  gap:2.5rem;
  align-items:start;
}
.page-main{min-width:0}                 /* verhindert, dass breite Inhalte die Spalte sprengen */
.page-main .region + .region{margin-top:1.5rem}
/* Seitenspalte OHNE eigene Fläche: ihre Bausteine (Kontaktbox, Downloads, Verweisliste) sind
   bereits weiße Karten auf grauem Grund. Läge darunter noch eine weiße Spaltenfläche, ergäbe
   das Karte-in-Karte – eine Rahmung, die nichts rahmt. Die Spalte wird also nur durch ihre
   Karten sichtbar (so machen es auch die Vorbildseiten). */
.page-aside{
  min-width:0;
  font-size:.96rem;
}
/* Die Spalte LÄUFT MIT (Issue #40). Auf einer langen Seite scrollt der Kontakt- oder
   Hinweis-Baustein sonst nach dem ersten Bildschirm aus dem Bild und ist genau dann weg, wenn
   der Text jemanden auf die Frage gebracht hat, die er beantwortet.

   Geklebt wird aber NUR, wenn die Spalte auch ins Fenster passt — deshalb hängt es an der
   Klasse `is-sticky`, die site.js setzt, und nicht allein am Medienabfrage-Zweig.
   Der erste Versuch (Issue #40, korrigiert nach Stephans Meldung) begrenzte stattdessen die
   Höhe und ließ die Spalte innen scrollen. Das war der falsche Ausweg: Bei fünf Bausteinen
   stand plötzlich eine zweite Bildlaufleiste mitten auf der Seite — ein Bedienteil, das niemand
   erwartet und das an einer Stelle sitzt, an der es wie ein Fehler aussieht. Eine Spalte, die
   höher ist als das Fenster, KANN man nicht ganz sichtbar halten; dann ist mitscrollen die
   ehrlichere Antwort als eine Leiste, die etwas verspricht, was sie nicht hält.

   `top` = Höhe der klebenden Kopfleiste plus Luft; dieselbe Größenordnung wie die
   scroll-margin-top der Überschriften, damit nichts unter dem Kopf verschwindet.
   Ohne JavaScript klebt gar nichts — die Spalte verhält sich dann wie vor Issue #40. */
@media (min-width:961px){
  .page-layout--sidebar.has-aside > .page-aside.is-sticky{
    position:sticky;
    top:5.5rem;
  }
}
.page-aside .region + .region{margin-top:1.6rem}
/* Überschriften der Seitenspalte. Bis 05.08.2026 standen sie auf 1,15 / 1,08rem – gemessen
   19,5 px gegen 16,8 px Fließtext daneben. Damit gliederten sie nichts: Sie sind die einzige
   Marke, an der man in der Spalte einen Baustein vom nächsten unterscheidet, und lagen kaum
   über dem Text. Jetzt 1,5rem (24 px), was die Staffel der Seite sauber fortsetzt:
   H1 44 – H2 im Haupttext 27 – Spaltenüberschrift 24 – Fließtext 16,8.
   Beide Ebenen gleich groß, weil sie in der Spalte dieselbe Rolle haben: „Weitere Buchtipps"
   und „BiBer Bibliothek" sind gleichrangig, nicht über- und untergeordnet. */
.page-aside h2,
.page-aside h3{font-size:1.5rem;margin-top:.2rem}
/* Hinweis: die Spalte ist nicht mehr getönt, ein Einfach-Sprache-Block darin bekommt deshalb
   seine eigene Fläche aus der allgemeinen .content-simple-Regel (früher wäre das doppelt
   gewesen und die Ausnahme stand hier). Abstände der Spalten-Bausteine: siehe unten bei den
   jeweiligen Bausteinen. */
/* Untereinander, sobald der Hauptspalte neben den festen 340px zu wenig bliebe. Die Grenze
   liegt bei 960 und nicht bei 820: mit dem breiteren Seitenrand blieben dort nur noch gut
   400px Hauptinhalt – zu wenig für Teaser-Karten oder eine Kennzahlen-Reihe. */
@media (max-width:960px){
  .page-layout--sidebar.has-aside{grid-template-columns:1fr;gap:1.6rem}
}

/* --------------------------- Randlose Bausteine („full-bleed") ---------------------------
   Ein Baustein darf aus der Inhaltsspalte ausbrechen und die volle Fensterbreite einnehmen.
   Die Rechnung dahinter: 50 % (= Mitte der Spalte) minus 50vw (= halbe Fensterbreite) landet
   genau am linken Fensterrand — das stimmt aber NUR, solange die Spalte mittig im Fenster
   steht. Deshalb gilt der Ausbruch ausschließlich im einspaltigen Layout; in der Vorlage
   „Inhalt mit Seitenspalte" sitzt der Hauptinhalt links, dort bliebe er schief. Ein dort
   gesetzter Haken wirkt schlicht nicht (der Banner bleibt in der Spalte) statt zu verrutschen.

   html{overflow-x:clip} ist der Sicherheitsgurt: 100vw zählt die Scrollleiste mit, ohne ihn
   entstünde am Desktop eine Querlaufleiste. Bewusst „clip" und nicht „hidden" — hidden würde
   aus <html> einen Scroll-Container machen (und damit position:sticky lahmlegen). */
html{overflow-x:clip}
.site-main--single .full-bleed{
  width:100vw;max-width:100vw;
  margin-left:calc(50% - 50vw + var(--bleed-fix));
  margin-right:calc(50% - 50vw - var(--bleed-fix));
  border-radius:0;
}
/* Der Inhalt eines randlosen Bausteins klebt nicht am Bildschirmrand, sondern steht auf der
   Fluchtlinie der Textspalte — sonst liest sich die Seite unter dem Banner „versetzt". */
.site-main--single .full-bleed > .hero-body{
  width:100%;max-width:var(--col-page);margin-inline:auto;padding-inline:var(--pad-page) var(--pad-page-r);
}

/* ------------------------------- Bild-Banner (Hero) -------------------------------
   Vollbreites Bild mit optionalem Titel/Kurztext/Button. Festes Seitenverhältnis ->
   HIER wird der Fokuspunkt sichtbar: object-fit:cover schneidet zu, object-position
   (aus data-focus, von site.js gesetzt) haelt die wichtige Stelle im Bild. Der dunkle
   Verlauf (Scrim) sichert die Lesbarkeit heller Schrift auf jedem Bild. */
.hero{position:relative;display:flex;align-items:flex-end;overflow:hidden;color:#fff;
  border-radius:12px;margin:1.6rem 0}
.hero--band{aspect-ratio:3/1;min-height:240px}
/* Ein Seitenverhältnis allein rechnet die Höhe aus der BREITE — auf einem 2000px breiten
   Bildschirm werden aus 16/9 über 1100px, und Slogan wie Knopf rutschen unter den Falz.
   Die Deckelung bindet die Höhe zusätzlich an die FENSTERHÖHE: Kopf, Aufmacher und der
   Pfeilkreis passen dadurch auf jedem Format gemeinsam auf den ersten Bildschirm.
   84svh statt der anfänglichen 74: seit die dunkle Servicezeile entfallen ist, ist oben eine
   Zeile frei geworden — und ein Aufmacher soll wirken, nicht bloß vorhanden sein. Es bleibt
   knapp genug, dass unter dem Bild noch etwas hervorschaut: man muss sehen, dass es weitergeht.
   svh statt vh wegen der ein- und ausfahrenden Browserleiste am Handy. */
.hero--gross{aspect-ratio:16/9;min-height:340px;max-height:min(84svh,52rem)}
/* „So hoch wie das Fenster": kein festes Seitenverhältnis, die Höhe kommt vom Fenster.
   svh statt vh, weil am Handy sonst die ein- und ausfahrende Browserleiste mitgerechnet wird
   (vh bleibt als Rückfall für ältere Browser stehen). Am Handy bewusst NICHT die volle Höhe:
   ein Querformat-Foto wird bei hohem, schmalem Rahmen zu einem senkrechten Streifen
   zusammengeschnitten — und man soll sehen, dass unter dem Banner noch etwas kommt. */
.hero--fenster{min-height:100vh;min-height:100svh}
@media (max-width:640px){ .hero--fenster{min-height:74svh} }
/* Textposition „mittig" (Vorgabe ist unten links). */
.hero--mitte{align-items:center;justify-content:center}
.hero--mitte .hero-body{text-align:center}
.hero-media{position:absolute;inset:0;z-index:0}
.hero-media picture{display:block;width:100%;height:100%}
.hero-media img{display:block;width:100%;height:100%;object-fit:cover;object-position:50% 50%}
.hero::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:linear-gradient(to top,rgba(0,0,0,.68) 0%,rgba(0,0,0,.30) 42%,rgba(0,0,0,0) 72%)}
.hero-body{position:relative;z-index:2;padding:1.4rem 1.6rem;max-width:46rem}
/* Gilt für H1 UND H2: der Banner-Titel ist eine H1, wenn der Banner als Aufmacher den
   Seitentitel trägt, sonst eine H2. Beide Fälle sollen gleich aussehen – deshalb hier
   ausdrücklich Farbe und Zierstrich der globalen h1-Regel zurücknehmen (die setzt dunkle
   Schrift und einen goldenen Strich – auf einem Foto beides falsch). */
.hero-title{color:#fff;margin:0 0 .5rem;font-size:clamp(1.7rem,1.2rem + 1.9vw,2.9rem);
  line-height:1.12;text-shadow:0 1px 4px rgba(0,0,0,.55);letter-spacing:-.005em}
.hero-title::after{display:none}
.hero-lead{color:#fff;margin:0 0 1.1rem;font-size:clamp(1.02rem,.95rem + .35vw,1.25rem);
  line-height:1.45;text-shadow:0 1px 4px rgba(0,0,0,.55);max-width:38rem}
.hero-actions{margin:0}
.hero-actions a{display:inline-block;background:var(--accent);color:var(--on-accent);text-decoration:none;
  padding:.6rem 1.25rem;border-radius:999px;font-weight:600;font-size:1.02rem}
.hero-actions a:hover{background:var(--accent-dark)}
/* Tastatur-Fokus IM Banner: die globale Regel zeichnet einen roten Rahmen – auf einem dunklen
   Foto ist Rot auf Rot kaum zu sehen. Hier deshalb weiß, mit dunklem Schlagschatten, damit er
   auch über einer hellen Bildstelle stehen bleibt. */
.hero-actions a:focus,.hero-actions a:focus-visible{
  outline:3px solid #fff;outline-offset:3px;box-shadow:0 0 0 6px rgba(0,0,0,.45)}
@media (max-width:560px){
  .hero-title{font-size:1.5rem}
  .hero-lead{font-size:1.02rem}
  .hero-body{padding:1.1rem 1.2rem}
}

/* ------------------------------- Teaser-Karten -------------------------------
   Raster aus Karten (Bild + Titel + Kurztext + Link). Mobil-zuerst: eine Spalte,
   ab mittlerer Breite zwei, ab breit die gewählte Spaltenzahl. Bild fest 4:3 (cover),
   Fokuspunkt (data-focus -> object-position, site.js) hält die wichtige Stelle. */
.teasers{display:grid;gap:1.2rem;margin:1.6rem 0;grid-template-columns:1fr}
@media (min-width:560px){ .teasers--2,.teasers--3,.teasers--4{grid-template-columns:repeat(2,1fr)} }
@media (min-width:820px){
  .teasers--2{grid-template-columns:repeat(2,1fr)}
  .teasers--3{grid-template-columns:repeat(3,1fr)}
  .teasers--4{grid-template-columns:repeat(4,1fr)}
}
.teaser{display:flex;flex-direction:column;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r);overflow:hidden;box-shadow:var(--shadow-1)}
/* Weiß aus demselben Grund wie bei .pl-media: ein freigestelltes PNG soll auf der Karte
   liegen, nicht auf einer getönten Platte. */
.teaser-media{aspect-ratio:4/3;overflow:hidden;background:#fff}
.teaser-media picture{display:block;width:100%;height:100%}
.teaser-media img{display:block;width:100%;height:100%;object-fit:cover;object-position:50% 50%}
.teaser-body{padding:.9rem 1.05rem;display:flex;flex-direction:column;gap:.4rem}
.teaser-title{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1.2rem;margin:0;color:var(--ink)}
.teaser-title a{color:inherit;text-decoration:none}
.teaser-text{margin:0;color:var(--copy);font-size:.96rem;line-height:1.45}
/* Ist ein Link gesetzt: ganze Karte klickbar (Stretched-Link über dem bloßen Titel-<a>). */
.teaser.has-link{position:relative;transition:border-color .15s,box-shadow .15s,transform .15s}
.teaser.has-link:hover{border-color:var(--accent-ink);box-shadow:0 10px 26px -18px rgba(0,0,0,.5);transform:translateY(-2px)}
.teaser.has-link:hover .teaser-title a{color:var(--accent-ink)}
.teaser.has-link .teaser-title a::after{content:"";position:absolute;inset:0}
/* ⚠️ Führt die Karte nach außen, mischt die allgemeine Extern-Regel (Issue #93) ihre Maße und
   die Maske in GENAU DIESE Fläche. Aus der kartendeckenden Fläche wird dann ein 0,68 em kleines,
   eingefärbtes Kästchen in der linken oberen Ecke – und die Karte ist nicht mehr anklickbar.
   Gemessen am 10.08.: 11 × 11 px statt 583 × 106 px. Ein `content:none` in der Ausnahmenliste
   weiter oben half NICHT, weil die Regel darüber mehr Klassen trägt und das `content`
   zurückgewinnt, während Breite, Höhe und Maske durchkommen. Deshalb hier, mit der Spezifität
   der Karte selbst. Ein Extern-Symbol bekommt sie bewusst nicht: Es läge über der Karte. */
.teaser.has-link .teaser-title a[target="_blank"]::after{
  width:auto;height:auto;margin-left:0;background-color:transparent;
  -webkit-mask:none;mask:none}
/* Am Handy blitzt beim Antippen einer solchen Karte der ganze Kartentext markiert auf – wie
   wenn man ihn kopieren wollte. Von Stephan gemeldet. Ursache ist die Fläche selbst: Der
   Finger landet auf Text, nicht auf einem Link, und der Browser beginnt eine Textauswahl,
   bevor der Klick durchgeht.
   ⚠️ Nur auf GERÄTEN OHNE MAUS: Am Rechner soll man Titel und Satz weiter markieren und
   kopieren können. `hover:none` trifft Berührungsgeräte – und nur dort ist die Auswahl
   ohnehin ein Versehen und kein Vorgang.
   ⚠️ Nur auf Karten MIT Fläche (.has-link): Eine Teaser-Karte ohne Link ist gewöhnlicher
   Text und bleibt markierbar.
   In der Bereichsliste braucht es das nicht mehr – dort ist die Fläche seit 06.08. weg. */
@media (hover:none){
  .teaser.has-link{-webkit-user-select:none;user-select:none}
}
@media print{
  .teasers{display:block}
  .teaser{break-inside:avoid;border:1pt solid #bbb;margin-bottom:.5rem}
  .teaser.has-link:hover{transform:none;box-shadow:none}
}

/* ------------------------------- Kontaktbox -------------------------------
   Gestylte Box mit Adresse/Telefon/E-Mail/Web/Öffnungszeiten. tel:/mailto:-Links
   werden vom Beacon automatisch als Anruf/Mail gezählt. Der Akzent-Streifen gibt der
   Box Identität – in weißem Inhalt wie in der getönten Seitenspalte. */
.contactbox{background:var(--surface);border:1px solid var(--line);border-left:5px solid var(--accent);
  border-radius:var(--r);padding:1.2rem 1.35rem;box-shadow:var(--shadow-1)}
.contact-title{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1.2rem;margin:0 0 .6rem;color:var(--ink)}
.contact-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.55rem}
.contact-row{display:flex;gap:.6rem;align-items:flex-start;line-height:1.4}
/* Das Zeichen ist eine Zeichnung in currentColor (siehe Blocks::contactIco) und bewusst GRAU:
   Es sagt nur, WAS in der Zeile steht – es ist keine Handlung. Vorher standen hier Emoji, die
   das Betriebssystem bunt zeichnet; zusammen mit roten Links war die Karte ein Farbfleck. */
.contact-ico{flex:0 0 auto;width:1.5em;display:flex;justify-content:center;color:var(--muted);
  padding-top:.12em}
.contact-ico .ci{width:1.15em;height:1.15em;display:block}
.contact-val{min-width:0;word-break:break-word}
/* Nummer und Adresse in der TEXTFARBE, nicht in Rot: In einer Karte stehen sie zu zweit oder
   zu dritt untereinander, und drei rote Zeilen schreien lauter als der Name darüber. Rot
   bleibt der Bewegung vorbehalten (Überfahren) – erkennbar als Link sind sie trotzdem, denn
   sie sind unterstrichen. Farbe allein wäre ohnehin zu wenig (WCAG 1.4.1). */
.contact-row a{color:var(--ink);text-decoration:underline;text-decoration-thickness:1px;
  text-underline-offset:.18em}
.contact-row a:hover{color:var(--accent-ink);text-decoration-thickness:2px}

/* ------------------------------- Dateien zum Herunterladen ----------------
   Liste aus anklickbaren Zeilen (derzeit PDF). Bewusst KEIN kleines Symbol neben dem Text,
   sondern eine ganze anklickbare Zeile: das trifft man auch am Handy und mit unruhiger Hand
   (WCAG 2.5.5 „Zielgröße"). Typ und Größe stehen IM Link – wer mit einem Screenreader liest,
   hört sie zusammen mit dem Namen; wer unterwegs surft, weiß vor dem Tippen, was kommt.
   Der Klick wird vom Beacon automatisch als „PDF heruntergeladen" gezählt (Endung .pdf). */
.downloads{margin:1.6rem 0}
.downloads-title{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1.2rem;
  margin:0 0 .6rem;color:var(--ink)}
.download-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.55rem}
.download-link{display:flex;gap:.8rem;align-items:center;padding:.85rem 1rem;text-decoration:none;
  color:var(--text);background:var(--surface);border:1px solid var(--line);
  border-left:5px solid var(--accent);border-radius:var(--r);box-shadow:var(--shadow-1)}
.download-link:hover,.download-link:focus-visible{background:var(--soft);border-color:var(--accent-ink)}
/* Schrift auf dem Typ-Kennzeichen: --on-accent wie auf jeder anderen Akzentfläche. Hier stand
   früher --surface, weil das Rot im Dunkelmodus aufgehellt war und weiße Schrift darauf nicht
   mehr trug. Seit die Fläche in beiden Modi #E2001A ist, gilt wieder die normale Regel –
   und --surface wäre im Dunkelmodus fast schwarz auf Rot. */
.download-ico{flex:0 0 auto;font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:.8rem;
  font-weight:600;letter-spacing:.06em;color:var(--on-accent);background:var(--accent);
  border-radius:6px;padding:.3rem .5rem;line-height:1}
.download-body{display:flex;flex-direction:column;gap:.15rem;min-width:0}
.download-name{font-weight:600;color:var(--ink);word-break:break-word}
.download-link:hover .download-name{text-decoration:underline}
.download-note{font-size:.92rem;color:var(--copy);line-height:1.35}
.download-meta{font-size:.85rem;color:var(--muted)}

/* ------------------------------- Kennzahlen -------------------------------
   Kacheln mit großer Zahl + Beschriftung („14 Beratungsstellen"). Auto-Raster. */
/* 160px Mindestbreite: am Handy passen damit ZWEI Kacheln nebeneinander (bei 190px war es nur
   noch eine, und vier Kacheln untereinander sind eine halbe Bildschirmseite). Am Desktop
   bestimmt weiterhin die Anzahl der Kacheln die Spalten, nicht die Mindestbreite. */
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,160px),1fr));gap:1rem;margin:var(--band) 0}
/* ⚠️ ZWEI SELEKTOREN FÜR EINE KACHEL – und der zweite hat mit Absicht keine Klasse.
   Seit Issue #106 darf eine Kennzahl ein Ziel haben; dann ist die GANZE Kachel der Knopf und
   kommt als <a> aus dem Renderer. Dieses <a> darf keine Klasse tragen, weil der Sammel-Lauf
   für interne Verweise wörtlich `<a href="page:ID">` sucht (Blocks::resolveInternalLinks) –
   eine Klasse dazwischen, und auf der Seite stünde „page:12". Darum hängt das Aussehen am
   ELTERNTEIL, genau wie bei den Knöpfen des Handlungsbands (.cta-actions a).
   `.stats > a` statt `.stats a`: Nur ein direktes Kind IST eine Kachel. */
.stat,
.stats > a{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  padding:1.4rem 1rem;box-shadow:var(--shadow-1);
  display:flex;flex-direction:column;gap:.2rem;text-align:center}
/* Der verlinkte Zustand. Bewusst KEINE Unterstreichung und keine eigene Farbe: Die Kachel ist
   schon eine Fläche, und die Zahl darin trägt bereits das Markenrot – ein unterstrichenes
   „14" in Rot sähe aus wie ein Fehler. Dass es weitergeht, sagt der Zeiger, der Rahmen beim
   Überfahren und das „›" hinter der Beschriftung. */
.stats > a{text-decoration:none;color:inherit;cursor:pointer;
  transition:border-color .15s,box-shadow .15s}
.stats > a:hover{border-color:var(--accent-ink);box-shadow:var(--shadow-2)}
/* Der rote Tastatur-Ring gilt für die ganze Kachel, nicht für den Text darin. */
.stats > a:focus-visible{outline:3px solid var(--accent-ink);outline-offset:3px}
/* Das Zeichen am Ende sitzt an der BESCHRIFTUNG, nicht am <a> – dieselbe Lösung wie in der
   Verweisliste: „›" bei eigenen Zielen, das Extern-Zeichen bei fremden.
   ⚠️ Und das ::after des <a> SELBST muss zurückgenommen werden. Die Kachel ist ein
   `flex-direction:column`; das allgemeine `a[target="_blank"]::after` würde dort zum DRITTEN
   Flex-Kind und stünde als einzelnes Kästchen in eigener Zeile unter der Beschriftung – das
   sieht aus wie ein Fehler, nicht wie ein Hinweis. `.stats > a[…]` ist spezifischer als
   `a[target="_blank"]`, `content:none` gewinnt also und das Pseudoelement entsteht gar nicht
   erst (nur DANN greift die Kurzfassung – siehe die Warnung weiter oben im Blatt). */
.stats > a .stat-label::after{content:" ›";font-weight:700;color:var(--accent-ink)}
.stats > a[target="_blank"]::after{content:none}
@supports ((-webkit-mask-image: none) or (mask-image: none)) {
  .stats > a[target="_blank"] .stat-label::after{
    content:"";display:inline-block;
    width:.68em;height:.68em;margin-left:.3em;vertical-align:-.03em;
    background-color:currentColor;
    -webkit-mask:var(--ico-extern) center/contain no-repeat;
            mask:var(--ico-extern) center/contain no-repeat;
  }
}
/* Die Kennzahl ist mit 2,2rem GROSSE Schrift – dort verlangt WCAG 3:1 statt 4,5:1, und das
   volle Markenrot erreicht das in beiden Modi. Sie darf deshalb kräftig bleiben.

   ⚠️ TRENNEN STATT ABHACKEN (17.08.2026, Seite „Messengerberatung"): Eine Kennzahl aus einem
   LANGEN Wort („anbieterunabhängig") passt in keine 160px-Kachel. Ohne Regel bricht der
   Browser hart nach Buchstaben um – „anbieterunab / hängig" liest sich wie ein Druckfehler,
   und weil das Raster alle Kacheln auf die Höhe der höchsten zieht, standen daneben drei halb
   leere Kästen. hyphens:auto trennt nach den deutschen Regeln und setzt einen Trennstrich;
   das dafür nötige lang="de" steht am <html>. overflow-wrap bleibt als Netz für den Fall,
   dass ein Wort auch getrennt nicht passt (Bindestrich-Ungetüme, sehr kleine Schrift). */
.stat-value{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:2.2rem;font-weight:600;
  line-height:1.1;color:var(--accent);hyphens:auto;overflow-wrap:break-word}
/* Der Ausreißer: ein einzelnes langes Wort (ab 13 Zeichen, im Renderer gezählt). Zwei Griffe,
   und beide sind nötig – gemessen, nicht geschätzt:
   1. Die Schrift eine Stufe kleiner. Mit 1,5rem/600 bleibt sie „große Schrift" im Sinn der
      WCAG (ab 18,66px fett genügen 3:1), also darf sie im Markenrot stehen.
   2. Das RASTER bekommt breitere Spalten (260 statt 160px). Ohne das nützt Griff 1 nichts:
      „anbieterunabhängig" braucht bei 1,5rem rund 200px, eine 160px-Kachel bietet 128px.
      Wer nur die Schrift schrumpft, landet bei Fließtextgröße und hat es nur verschoben. */
.stat-value-lang{font-size:1.5rem}
.stats-lang{grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr))}
.stat-label{font-size:.95rem;color:var(--copy);line-height:1.35}
/* Am Handy stehen ZWEI Kacheln nebeneinander – je rund 135px Innenbreite. Eine Kennzahl aus
   Ziffern („14") kommt damit aus, eine aus Wörtern nicht: „kostenlos" klebte bei 2,2rem am
   rechten Rand (Issue #43, gemeldet von Stephan). Die Zahl bleibt mit 1,7rem klar die größte
   Schrift der Kachel und liegt weiter über der WCAG-Schwelle für „große Schrift" (ab 18,66px
   fett genügen 3:1 – Markenrot schafft das in beiden Modi).
   Umbrechen lassen wäre die Alternative gewesen; sie kostet aber Höhe und reißt „seit 2008"
   auseinander. Kleiner setzen hält die Reihe in einer Flucht. */
@media (max-width:560px){
  /* ⚠️ Die verlinkte Kachel MUSS hier mitgenannt werden. Sie holt ihr Aussehen aus derselben
     Regel wie `.stat`, hat aber keine Klasse – wer nur `.stat` nachzieht, lässt am Handy jede
     verlinkte Kennzahl in der großen Polsterung stehen. (Genau die Sorte Fehler, die am
     Bildschirm des Entwicklers nie auffällt.) */
  .stat,
  .stats > a{padding:1.2rem .85rem}
  .stat-value{font-size:1.7rem}
  /* ⚠️ Muss hier MITWANDERN. Ohne diese Zeile gewinnt die Regel darüber (gleiche Spezifität,
     später im Blatt) und stellt auch das lange Wort wieder auf 1,7rem. Am Handy steht die
     lange Reihe ohnehin einspaltig (260px Mindestbreite passen dort nur einmal nebeneinander),
     Platz ist also da – es bleibt bei denselben 1,5rem wie am großen Bildschirm. */
  .stat-value-lang{font-size:1.5rem}
}

/* ------------------------------- Einträge: Personen und Standorte -------------------------
   EINE Bauweise für beides (2026-08-02): Bild links, Angaben rechts, ein Eintrag je Zeile.
   Wer die Team-Seite gelesen hat, findet sich auf einer Beratungsstellen-Seite sofort zurecht.

   Warum Zeilen und kein Kachelraster: In einer schmalen Kachel bricht „stellvertretender
   Geschäftsführer" dreizeilig um, und das Klappfach „Mehr zur Person" wird zum Streifen. In der
   Zeile bleibt der Name groß und die Angaben stehen ruhig untereinander.

   Warum überhaupt eine Karte: Vorher war ein Team-Eintrag aus Überschrift, zwei Absätzen und
   einem Klappfach zusammengesetzt – vier lose Elemente auf grauem Grund, und der Abstand
   ZWISCHEN zwei Personen war derselbe wie INNERHALB einer. Die weiße Fläche macht aus vier
   Teilen ein Ding; der rote Streifen links ist derselbe wie an der Kontaktbox. */
/* Zwei Karten nebeneinander, sobald der Platz reicht – und HÖCHSTENS zwei, auch auf einem sehr
   breiten Bildschirm. Beides steckt in der einen Mindestbreite:
     max( min(100%,30rem) , (100% - Spalt)/2 )
   Der rechte Teil ist die Obergrenze – eine Spalte ist nie schmaler als die halbe Zeile, also
   passen nie drei hinein. Der linke Teil ist die Untergrenze wie bisher: unter 30rem je Karte
   wird von selbst wieder einspaltig, und in einer Spalte unter 30rem läuft nichts über.
   Bewusst kein fester Umbruchpunkt in Pixeln: so stimmt die Regel auch in der schmalen
   Inhaltsspalte neben einer Seitenspalte, wo eine Media-Query danebengegriffen hätte. */
/* Gleich hohe Karten je Zeile (align-items voreingestellt = stretch): ein ungerader unterer Rand
   wirkt unsauber, sobald ein Name oder eine Funktionsbezeichnung zweizeilig umbricht. Der Inhalt
   bleibt dabei oben stehen (align-content am .entry), es entsteht also nur Fläche unten, kein
   verrutschter Text. */
.entrylist{list-style:none;margin:var(--band) 0;padding:0;display:grid;gap:1rem;
  grid-template-columns:repeat(auto-fit,minmax(max(min(100%,30rem),calc((100% - 1rem)/2)),1fr))}
/* … AUSSER solange ein Fach offen ist: dann zöge das Raster die Karte daneben auf die volle Höhe
   des aufgeklappten Textes – eine handhohe leere weiße Fläche, das eigentliche Übel. Für die
   Dauer des Aufklappens behält also jede Karte wieder ihre eigene Höhe. Es kann immer nur EIN
   Fach offen sein (site.js), der Fall ist damit klar begrenzt. Ohne :has()-Unterstützung bleibt
   es beim Mitwachsen – unschön, aber nichts geht kaputt. */
.entrylist:has(.entry-more[open]){align-items:start}
/* Die Bildspalte wächst mit: in einer breiten Karte 200px, in der halben nur noch ~120px.
   Ein festes Maß fräße in der Zweierreihe die halbe Textbreite. */
.entry{display:grid;grid-template-columns:clamp(7rem,26%,12.5rem) minmax(0,1fr);gap:1.2rem;
  align-items:start;align-content:start;
  background:var(--surface);border:1px solid var(--line);border-left:5px solid var(--accent);
  border-radius:var(--r);padding:1.2rem 1.35rem;box-shadow:var(--shadow-1);
  transition:box-shadow .15s,transform .15s}
/* Mit der Maus darüber: die Karte hebt sich einen Hauch – dieselbe Bewegung und derselbe
   Schatten wie bei Anriss- und Bereichskarten, damit sich alle Karten der Seite gleich anfühlen.
   BEWUSST OHNE roten Rand: bei jenen ist die GANZE Karte ein Link, hier sind es nur Nummer,
   E-Mail und das Klappfach – ein Akzentrand wäre ein Versprechen, das die Karte nicht hält.
   Nur mit echtem Zeigegerät (Issue #55: am Handy bliebe der Zustand am zuletzt Angetippten
   kleben). */
@media (hover:hover){
  .entry:hover{box-shadow:0 12px 30px -20px rgba(0,0,0,.55);transform:translateY(-2px)}
}
@media (prefers-reduced-motion:reduce){
  .entry{transition:none}
  .entry:hover{transform:none}
}
/* Quadrat: Personenbilder sind mal hoch, mal quer geliefert – ein festes Verhältnis hält die
   Spalte in einer Flucht, den Ausschnitt bestimmt der Fokuspunkt des Mediums. */
.entry-media{border-radius:var(--r-sm);overflow:hidden;background:#fff;aspect-ratio:1/1}
.entry-media picture{display:block;width:100%;height:100%}
.entry-media img{display:block;width:100%;height:100%;object-fit:cover;object-position:50% 50%}
/* Noch kein Foto: das Namenskürzel auf getönter Fläche. Bewusst groß und ruhig – es soll nach
   Absicht aussehen, nicht nach fehlendem Bild. */
/* AUSNAHME zur weißen Bildfläche darüber: Hier liegt kein Bild, sondern das Namenskürzel –
   und das steht auf einer GETÖNTEN Fläche, weil es nach Absicht aussehen soll und nicht nach
   fehlendem Bild. Der Kürzel-Ton (--muted) ist auf genau dieser Fläche gemessen. */
.entry-media--leer{display:flex;align-items:center;justify-content:center;
  background:var(--soft);border:1px solid var(--line)}
/* Die Fläche schrumpft in der Zweierreihe auf gut 120px – das Kürzel darf nicht dagegenstoßen.
   Bewusst vw statt cqw: Container-Abfragen bräuchten ein container-type auf jeder Karte, und
   dafür ist der Gewinn hier zu klein. */
.entry-initials{font-family:"Oswald","Segoe UI",Arial,sans-serif;
  font-size:clamp(1.5rem,7vw,2.4rem);font-weight:600;
  letter-spacing:.04em;color:var(--muted);line-height:1}
.entry-body{min-width:0;display:flex;flex-direction:column;gap:.45rem}
.entry-name{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1.25rem;margin:0;color:var(--ink)}
.entry-role{margin:0;color:var(--muted);font-size:.98rem;line-height:1.4}
.entry .contact-list{margin-top:.15rem}
/* Klappfach im Eintrag: KEIN zweiter Kasten. Auf der weißen Karte wäre eine zweite weiße
   Fläche mit Rahmen ein Kasten im Kasten – hier reicht die Zeile mit dem Pfeil. */
/* Das Klappfach folgt dem Akkordeon auf den normalen Seiten: geschlossen steht die Zeile in
   der Textfarbe, offen in Rot – dieselbe Regel, damit „offen" überall gleich aussieht. Rot ist
   sonst nur das Zeichen; drei rote Zeilen in einer Karte wären zu laut. */
.entry-more{margin-top:.35rem;border-top:1px solid var(--line);padding-top:.5rem}
.entry-more>summary{cursor:pointer;list-style:none;color:var(--ink);font-weight:700;
  font-size:.95rem;position:relative;padding-left:1.55rem}
.entry-more[open]>summary{color:var(--accent-ink)}
.entry-more>summary::-webkit-details-marker{display:none}
/* Plus und Minus GEZEICHNET wie im Akkordeon (zwei Balken): Der Querbalken bleibt liegen, der
   senkrechte fährt zusammen – daraus entsteht die Bewegung. Ein getipptes „+/–" würde bei
   jeder Schriftart anders aussehen und säße nicht auf derselben Höhe. */
.entry-more>summary::before,
.entry-more>summary::after{content:"";position:absolute;left:0;top:50%;width:1.05rem;height:3px;
  border-radius:2px;background:var(--accent-ink);transform:translateY(-50%);
  transition:transform .28s ease}
.entry-more>summary::after{transform:translateY(-50%) rotate(90deg)}
.entry-more[open]>summary::after{transform:translateY(-50%) rotate(90deg) scaleX(0)}
.entry-more>summary:focus-visible{outline:2px solid var(--accent-ink);outline-offset:2px}
/* Bewegung beim Auf- und Zuklappen: site.js misst die Höhe und lässt sie laufen – dieselbe
   Funktion und dieselbe Dauer wie beim Akkordeon, damit sich beides gleich anfühlt. */
.entry-more>.accordion-body.is-animating{overflow:hidden;transition:height .28s ease}
.entry-more-body{padding-top:.5rem;font-size:.98rem}
.entry-more-body>*:first-child{margin-top:0}
.entry-more-body>*:last-child{margin-bottom:0}
/* Wer hier berät: ein Name je Zeile (Stephan am 03.08.). Nebeneinander in Spalten musste das
   Auge bei jedem Namen neu ansetzen und die letzte Zeile stand halb leer – untereinander ist
   es eine Liste, die man von oben nach unten liest. Ohne Aufzählungspunkte: In der Karte trägt
   sonst nichts einen Punkt, und die Namen stehen ohnehin schon eingerückt unter ihrer Zeile. */
.entry-staff{list-style:none;margin:0;padding:0}
.entry-staff li{line-height:1.5}
.entry-staff-mehr{margin:.55rem 0 0;font-size:.94rem}
@media (max-width:640px){
  /* Am Handy klappt das Bild über den Text – dieselbe Regel wie bei der Bereichsliste. Und es
     wird flacher: ein Quadrat über die volle Breite schöbe die Angaben aus dem Bild. */
  .entry{grid-template-columns:1fr;gap:.9rem;padding:1rem 1.1rem}
  .entry-media{aspect-ratio:16/9}
  .entry-media--leer{aspect-ratio:auto;padding:1.1rem 0}

  /* AUSNAHME Personen (Issue #68): Bild LINKS und quadratisch, daneben NUR Name und Funktion.
     Alles darunter – Nummer, E-Mail, das Klappfach – läuft über die GANZE Karte.
     Grund ist der Unterschied im Motiv und in der Zeilenlänge: Ein Porträt über die volle
     Handy-Breite ist ein Bildschirm voll Gesicht und schiebt die Angaben unter die Falz; bei
     sieben Personen scrollt man an lauter Gesichtern vorbei. Eine E-Mail-Adresse oder die
     Aufzählung im Klappfach in einer 190px-Spalte ist aber genauso falsch – da bricht jede
     zweite Zeile um und der Eintrag wird zu einem langen Schlauch (gemeldet 03.08.).
     Die Standorte behalten das breite Bild – dort sind es Bezirkskarten, und die leben davon.

     Wie: display:contents löst die innere Hülle auf, damit ihre Kinder selbst im Raster der
     Karte liegen und einzeln platziert werden können. Ein HTML-Umbau wäre dafür nicht nötig –
     und er würde die Zeilen-Darstellung am Desktop mit betreffen, die gut ist wie sie ist. */
  .entrylist--personen .entry{
    /* Ein Drittel fürs Bild: Namen wie „Mag.a Barbara Brinkmann-Klinger" brauchen die Breite,
       sonst brechen sie in drei Zeilen und die Karte wächst am Bild vorbei ins Leere. */
    grid-template-columns:minmax(0,33%) minmax(0,1fr);
    grid-template-rows:auto auto;
    gap:.5rem .9rem}
  .entrylist--personen .entry-body{display:contents}
  /* Über beide Textzeilen: So bleibt das Bild oben stehen, egal ob der Name eine oder drei
     Zeilen braucht – und es bleibt quadratisch, weil das Seitenverhältnis die Höhe bestimmt. */
  .entrylist--personen .entry-media{grid-column:1;grid-row:1 / span 2;align-self:start;aspect-ratio:1/1}
  .entrylist--personen .entry-media--leer{aspect-ratio:1/1;padding:0}
  .entrylist--personen .entry-name{grid-column:2;grid-row:1;align-self:end}
  .entrylist--personen .entry-role{grid-column:2;grid-row:2;align-self:start}
  /* KEIN Kind-Selektor (>): display:contents ändert nur das Layout, nicht den DOM-Baum – die
     beiden bleiben Kinder von .entry-body und wären mit „>" nie getroffen worden. */
  .entrylist--personen .entry .contact-list,
  .entrylist--personen .entry .entry-more{grid-column:1 / -1;grid-row:auto}
}
@media print{
  .entry{break-inside:avoid;border:1pt solid #bbb;box-shadow:none}
  .entry-media--leer{display:none}          /* ein Kürzel ohne Bild ist auf Papier nur ein Fleck */
  /* ⚠️ ZUM DRITTEN MAL dieselbe Falle (Bereichsliste 05.08., Seitenspalte 06.08., hier am
     10.08. von Stephan an einem Ausdruck der Beratungsstellen gemeldet):
     **Ein Grid-Element mit display:none gibt seine SPALTE nicht frei.** Die Zeile darüber nimmt
     das Kürzel heraus, die reservierte Bildspalte bleibt stehen – und die Angaben rutschen per
     Auto-Platzierung genau dort hinein. Gemessen auf A4 hoch (Satzbreite 688px, Druck-Emulation):
     Angaben 163px statt 445px, die zweite Spalte stand leer. Auf dem Papier zerfiel dadurch
     jede Zeile („Mauttorpromenad / e 8", „Erwach- / senenbildung").
     Ohne Bild gibt es also auch keine Bildspalte. :has() prüft genau das – ein Eintrag MIT Foto
     behält seine zwei Spalten. */
  .entry:has(.entry-media--leer){grid-template-columns:minmax(0,1fr)}
  .entry-more{border-top:0}
  /* Das gezeichnete Plus/Minus vor „Es beraten Sie hier" gehört auf Papier nicht hin: Das Fach
     ist im Ausdruck ohnehin offen (site.js, prepareForPrint), das Zeichen wäre also ein roter
     Strich vor einer Zeile, an der es nichts mehr zu bedienen gibt. Beim Akkordeon im Text ist
     das seit Issue #25 schon so (.accordion .acc-sign) – die Karten hatten es nur nie
     mitbekommen. Mit dem Zeichen fällt auch sein Platzhalter links weg. */
  .entry-more>summary{padding-left:0}
  .entry-more>summary::before,
  .entry-more>summary::after{display:none}
}

/* ------------------------------- Handlungsband (CTA) -------------------------------
   „Sie haben Fragen? – Termin vereinbaren." Ein kräftiges Band unterbricht die Textwüste und
   sagt, was als Nächstes zu tun ist. Zwei Fassungen: kräftig (Akzentfläche) und leise
   (getönt) – auf einer Seite mit mehreren Bändern wäre alles-rot wirkungslos.
   Die Knöpfe tragen KEINE eigene Klasse (siehe Blocks::renderBlocks), das Aussehen hängt
   deshalb an ".cta-actions a". */
.cta{margin:var(--band) 0;border-radius:var(--r-lg);overflow:hidden}
.cta-body{padding:2rem 2.2rem}
.cta-title{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:clamp(1.4rem,1.2rem + .7vw,1.9rem);
  margin:0 0 .5rem;line-height:1.2}
.cta-text{margin:0 0 1.3rem;font-size:1.06rem;line-height:1.5;max-width:46rem}
.cta-actions{display:flex;flex-wrap:wrap;gap:.7rem}
.cta-actions a{display:inline-flex;align-items:center;border-radius:999px;padding:.7rem 1.4rem;
  text-decoration:none;font-weight:700;line-height:1.25}
/* Kräftig: Akzentfläche. Der ERSTE Knopf ist der Hauptweg (heller Block auf der Fläche),
   der zweite bleibt ein Umriss – sonst konkurrieren zwei gleich laute Angebote. */
.cta--kraeftig{background:var(--accent);color:var(--on-accent)}
.cta--kraeftig .cta-title{color:var(--on-accent)}
/* Diese beiden Knöpfe stehen auf WEISSER Fläche (--on-accent), nicht auf dem Seitengrund –
   dort gehört das volle Markenrot hin. --accent-ink wäre im Dunkelmodus das aufgehellte Rot
   und auf Weiß kaum zu lesen. Die einzige Ausnahme von „Rot als Schrift = --accent-ink". */
.cta--kraeftig .cta-actions a{background:var(--on-accent);color:var(--accent);
  border:2px solid var(--on-accent)}
.cta--kraeftig .cta-actions a:hover{background:transparent;color:var(--on-accent)}
.cta--kraeftig .cta-actions a+a{background:transparent;color:var(--on-accent)}
.cta--kraeftig .cta-actions a+a:hover{background:var(--on-accent);color:var(--accent)}
.cta--kraeftig .cta-actions a:focus-visible{outline:3px solid var(--on-accent);outline-offset:3px}
/* Leise: getönte Fläche mit Akzentkante links – dieselbe Handschrift wie Kontaktbox/Standort. */
.cta--leise{background:var(--surface);border:1px solid var(--line);border-left:5px solid var(--accent);
  box-shadow:var(--shadow-1)}
.cta--leise .cta-title{color:var(--ink)}
.cta--leise .cta-actions a{background:var(--accent);color:var(--on-accent);border:2px solid var(--accent)}
.cta--leise .cta-actions a:hover{background:var(--accent-dark);border-color:var(--accent-dark)}
.cta--leise .cta-actions a+a{background:transparent;color:var(--accent-ink)}
.cta--leise .cta-actions a+a:hover{background:var(--accent-soft)}

/* ---------------- Nächste Termine (KUNDEN-MODUL, Gitea #9) ----------------
   Kein Bestandteil des White-Label-CMS. Die paar Regeln stehen trotzdem hier und nicht in
   einer eigenen Datei: Ein zweites Stylesheet wäre ein zweiter Ladevorgang für zwölf Zeilen,
   und ohne den Baustein greift keine einzige davon.

   Bauform bewusst wie die Download-Liste: weiße Fläche, feine Kante, eine Zeile je Eintrag.
   Ein Termin ist KEIN Link – geklickt wird nur der Knopf darunter. Deshalb liegen die Zeilen
   ruhig da und laden nicht zum Klicken ein (kein Zeiger, kein Überfahr-Effekt). */
.termine{margin:var(--band) 0}
.termine-titel{margin:0 0 .7rem}
.termine-liste{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.4rem;
  max-width:var(--col-text)}
.termin{background:var(--surface);border:1px solid var(--line);border-radius:var(--r)}
/* Die GANZE Zeile ist der Link (Issue #9). Das Innenmaß sitzt deshalb am <a>, nicht am <li> –
   sonst wäre die Trefferfläche kleiner als der Kasten, den man sieht, und man klickt daneben.
   Kein „stretched link" über ein ::after: Das Pseudoelement trägt hier schon das Extern-Symbol
   (Issue #93), und zwei Aufgaben in einem gehen nicht. */
.termin-link{display:flex;flex-wrap:wrap;align-items:baseline;gap:.3rem .9rem;
  padding:.7rem .95rem;text-decoration:none;color:inherit;border-radius:var(--r)}
.termin-link:hover{background:var(--soft)}
/* Die Zeile ohne Link (falls keine Buchungsadresse eingetragen ist) bekommt dasselbe Maß. */
.termin:not(:has(.termin-link)){display:flex;flex-wrap:wrap;align-items:baseline;
  gap:.3rem .9rem;padding:.7rem .95rem}
/* Der Wochentag ist das, wonach man zuerst schaut – er bekommt das Gewicht, nicht die Uhrzeit. */
.termin-tag{font-weight:700}
.termin-zeit{font-variant-numeric:tabular-nums}
/* Die Art („Beratung", „Video") ist Beiwerk und rückt ans Ende der Zeile – auf schmalen
   Schirmen bricht sie in die zweite Zeile, statt die Uhrzeit zu verdrängen. */
/* Die Beratungsform ist Beiwerk und steht direkt hinter der Uhrzeit – sie erscheint ohnehin
   nur, wenn sie in der Liste etwas unterscheidet (siehe Termine::zeigtForm). */
.termin-art{color:var(--muted);font-size:.92rem}
/* Die Aufforderung sitzt am rechten Rand und schiebt alles davor nach links. Sie trägt die
   Linkfarbe, damit die Zeile als anklickbar zu erkennen ist: Datum und Uhrzeit stehen in der
   Fließtextfarbe, weil sie die ANGABE sind – gehandelt wird rechts.
   Am Handy bricht sie in eine zweite Zeile und bleibt dort rechtsbündig (nachgemessen bei
   390 px: Zeilenhöhe 80 px statt 50). Das ist gewollt – so steht die Aufforderung auf jedem
   Bildschirm an derselben Kante wie das Symbol dahinter. */
.termin-buchen{margin-left:auto;font-weight:600;color:var(--link)}
/* Das Extern-Symbol (Issue #93) steht am ENDE der Zeile, nicht mitten drin: Ohne diese Zeile
   hinge es an der Grundlinie des ersten Wortes und sähe aus, als gehörte es zum Datum. */
.termin-link::after{align-self:center;color:var(--link)}
.termin-link:hover .termin-buchen{text-decoration:underline}
.termine-leer{max-width:var(--col-text);color:var(--muted)}
.termine-mehr{margin:.9rem 0 0}
/* Derselbe Knopf wie im Handlungsband – ein zweites Knopf-Aussehen für dieselbe Handlung
   („weiter zur Terminseite") wäre eine überflüssige zweite Sprache. */
.termine-knopf{display:inline-flex;align-items:center;border-radius:999px;padding:.7rem 1.4rem;
  text-decoration:none;font-weight:700;line-height:1.25;
  background:var(--accent);color:var(--on-accent);border:2px solid var(--accent)}
.termine-knopf:hover{background:var(--accent-dark);border-color:var(--accent-dark)}
@media print{
  /* Auf Papier ist eine Terminliste eine Momentaufnahme – sie darf mit, aber ohne Knopf-Optik. */
  .termin{break-inside:avoid;border:1pt solid #bbb}
  .termine-knopf{border:0;padding:0;font-weight:400;background:none;color:#000}
}
/* Randlos: das Band füllt die Fensterbreite, der TEXT bleibt auf der Fluchtlinie der Spalte.
   NUR im einspaltigen Layout – genau wie der Ausbruch selbst (siehe „Randlose Bausteine").
   Der Zusatz `.site-main--single` fehlte hier und fiel erst auf, als ein randloses Handlungsband
   über den Verteiler (Issue #40) in einer 340px-Seitenspalte landete: Die Regel rechnet mit den
   Rändern des FENSTERS, und --pad-page-r ist zwischen 1151 und 1750px zusätzlich um die Breite
   der Barrierefreiheits-Säule größer. In der schmalen Spalte ergab das 40px links und 120px
   rechts – der Text stand sichtbar schief, und niemand hätte den Grund dort vermutet.
   Ohne die Regel gilt wieder das normale Innenmaß des Bausteins (.cta-body). */
.site-main--single .cta.full-bleed .cta-body{max-width:var(--col-page);margin-inline:auto;
  padding-inline:var(--pad-page) var(--pad-page-r)}
@media (max-width:560px){ .cta-body{padding:1.5rem 1.3rem} }

/* ------------------------------- Themen-Chips (quicklinks) -------------------------------
   Angetippte Kurzwege zu den häufigsten Themen. Vorbild: BiBer-Onepage („Wir informieren,
   beraten und orientieren u. a. zu:") und die beiden Erwachsenenbildungs-Seiten. */
.quicklinks{margin:var(--band) 0}
.ql-title{margin-top:0}
.ql-chips{display:flex;flex-wrap:wrap;gap:.7rem}
.ql-chips a{display:inline-flex;align-items:center;gap:.55rem;text-decoration:none;
  background:var(--surface);color:var(--ink);border:1px solid var(--line);
  border-radius:999px;padding:.65rem 1.2rem;line-height:1.3;box-shadow:var(--shadow-1);
  transition:border-color .15s,color .15s,transform .15s}
.ql-chips a:hover{border-color:var(--accent-ink);color:var(--accent-ink);transform:translateY(-1px)}
.ql-ico{width:1.25em;height:1.25em;flex:0 0 auto;color:var(--accent-ink)}
.ql-chips a:hover .ql-ico{color:inherit}

/* ------------------------------- Bereichsliste (pagelist) -------------------------------
   Zeigt die Seiten eines Ablage-Zweigs als Anrisse. Zwei Darstellungen:
   „liste"   = Text links, Bild rechts – die Bauform für Beiträge/Aktuelles (Vorbild
               tierheim-salzburg.at). Warum das Bild rechts steht und nicht links, steht
               weiter unten bei .pagelist--liste. Am Handy klappt das Bild über den Text.
   „kacheln" = dasselbe Material als Raster, wenn es mehr ums Stöbern als ums Lesen geht.
   Die ganze Karte ist klickbar (Stretched Link über dem Titel-<a>), nicht nur die Zeile. */
.pagelist{margin:var(--band) 0}
.pl-heading{margin-top:0}
.pl-list{list-style:none;margin:0;padding:0;display:grid;gap:1.2rem}
.pl-item{position:relative;display:grid;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r);box-shadow:var(--shadow-1);overflow:hidden;
  transition:border-color .15s,box-shadow .15s,transform .15s}
.pl-item:hover{border-color:var(--accent-ink);box-shadow:0 12px 30px -20px rgba(0,0,0,.55);transform:translateY(-2px)}
/* Der Bildkasten liegt WEISS unter dem Bild, in BEIDEN Modi – nicht auf der getönten Fläche.
   Grund sind Bilder mit durchsichtigem Grund: Die Bezirkskarten der Beratungsstellen sind
   freigestellte PNGs (an den Rändern gemessen: Alpha 0). Auf --soft schimmerte der kühle
   Grauton durch und stand als kalter Fleck in der warmen Seite; im Dunkelmodus verschwanden
   die Ortsnamen AUSSERHALB der Silhouette (dunkle Schrift auf dunklem Grund) ganz.
   Freigestellte Zeichnungen kommen aus einer hellen Welt – sie brauchen ihre helle Platte,
   auch nachts. Bei Fotos (deckend) ändert das nichts, dort ist der Kasten ohnehin verdeckt. */
.pl-media{overflow:hidden;background:#fff}
.pl-media picture{display:block;width:100%;height:100%}
.pl-media img{display:block;width:100%;height:100%;object-fit:cover;object-position:50% 50%}
/* position:relative, weil das Merkzeichen „schon angesehen" HIER DRIN in die Ecke gesetzt wird
   und nicht in die Ecke der ganzen Karte: In der Listenform steht dort das Bild, und ein
   unbesucht weißer Kreis auf einem Foto ist ein weißer Fleck. Siehe .pl-gelesen weiter unten. */
.pl-body{position:relative;padding:1.1rem 1.3rem;display:flex;flex-direction:column;gap:.4rem;min-width:0}
/* Hier stand .pl-date. Das Datum ist von den Karten entfallen (Issue #51): Es erschien nur bei
   Seiten, die schon einmal veröffentlicht waren – in derselben Liste trug also eine Karte ein
   Datum und die daneben keines, was wie ein Fehler aussah. Es steht jetzt am Ende der Seite
   selbst (.page-pubdate), wo es zur Sache gehört. */
.pl-title{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1.25rem;margin:0;color:var(--ink)}
.pl-title a{color:inherit;text-decoration:none}
/* KEIN Stretched Link mehr im Hauptinhalt (06.08.2026, Stephans Wunsch).
   Die Karte trägt ein sichtbares „weiterlesen" – dann muss der Klick auch dorthin gehen und
   nicht auf eine unsichtbare Fläche darüber. Gemessen war es genau umgekehrt: Ein Klick auf
   das Wort traf den Titel-Link, nicht das Wort. Und am Handy blitzte beim Antippen der ganze
   Kartentext markiert auf, weil die Berührung auf dem Text landete und nicht auf einem Link.
   Zwei ehrliche Ziele sind besser als eine unsichtbare Fläche: Titel und Knopf.

   ⚠️ In der SEITENSPALTE bleibt die Fläche (siehe unten): Dort gibt es kein „weiterlesen",
   nur einen grauen Winkel – ohne Fläche wäre allein der Titeltext anklickbar, und in einer
   44px-Zeile ist das eine unnötig kleine Zielfläche. Dieselbe Überlegung bei den
   Teaser-Karten: auch die haben bewusst keinen Knopf. */
.pl-item:hover .pl-title a{color:var(--accent-ink)}

/* ---------------- Merkzeichen „schon angesehen" (Issue #81) ----------------
   Nur wenn am Baustein angehakt (.pagelist--gelesen). Gedacht für Listen, durch die man
   mehrmals geht – Buchtipps, Presse: „sonst schaut sich ein Besucher 2× das gleiche Buch an".

   ⚠️ WIR SPEICHERN NICHTS. Weder bei uns noch auf dem Gerät des Besuchers. Gezeigt wird
   allein, was der Browser ohnehin weiß: seine eigene Chronik, über :visited. Kein Cookie,
   kein lokaler Speicher, kein JavaScript – die Website bleibt cookiefrei, die
   Datenschutzerklärung unverändert, und es gibt nichts zuzustimmen. Der Weg über
   sessionStorage hätte ein Abzeichen mit Wortlaut erlaubt, aber genau diesen Preis gekostet.

   ⚠️ Die Grenze, die daraus folgt: Browser sperren :visited hart ein, damit eine Website die
   Chronik nicht auslesen kann. Erlaubt sind NUR Farbangaben (color, background-color,
   border-color, outline-color) – und getComputedStyle liefert absichtlich falsche Werte.
   Ein Abzeichen mit dem Wort „gelesen" ist damit unmöglich; content lässt sich nicht ändern.
   Deshalb zwei Anzeigen nebeneinander:
     1. ein ruhiger Streifen an der linken Kante (Pseudoelement, das IMMER da ist – nur seine
        Farbe wechselt; anders ginge es nicht, Größe und Aufbau dürfen sich nicht ändern),
     2. eine leicht gedämpfte Titelfarbe.
   Nummer 2 ist der klassische Fall und funktioniert sicher. Nummer 1 ist die schönere und
   greift je nach Browser womöglich nicht – dann bleibt es bei der Farbe. Beides zusammen ist
   Absicht: Fällt das eine aus, sagt das andere noch etwas.

   ⚠️ Bewusst NICHT ausgegraut. „Schon gesehen" darf nicht wie „gesperrt" aussehen – das Buch
   bleibt voll lesbar, der Knopf „weiterlesen" behält seine Farbe.

   ⚠️ DREI ANLÄUFE, und die ersten beiden waren falsch – beide von Stephan bemerkt:
   1. „Ich sehe gar nichts." Der Streifen hing an einem Pseudoelement (::before) und war
      unbesucht `transparent`.
      ⚠️ Meine erste Erklärung dafür war FALSCH: Ich hielt Pseudoelemente für den Grund. Am
      06.08. mit einem Prüfstand in Stephans echtem Browser gemessen (acht Fälle nebeneinander):
      Pseudoelemente bekommen :visited sehr wohl. **Der einzige Grund ist die DURCHSICHTIGKEIT.**
      Siehe den Merksatz unten.
   2. Dann Streifen und Titelfarbe am Link selbst – und damit zwei neue Probleme:
      Eine umgefärbte Überschrift sieht nach kaputtem CSS aus, nicht nach „schon gelesen".
      Und beim Überfahren mit der Maus zuckte der Titel kurz rot und sprang sofort wieder
      auf Grau: `.pagelist--gelesen .pl-title a:visited` (drei Klassen) überstimmt
      `.pl-item:hover .pl-title a` (zwei) – sichtbar wurde nur der Übergang.
   3. Jetzt Stephans Vorschlag: ein kleines Häkchen im Kreis, unten rechts in der Karte.
      Der Titel bleibt völlig unangetastet, das Überfahren funktioniert wieder wie überall.

   Wie ein Zeichen entstehen kann, obwohl :visited nichts einblenden darf: Das Häkchen ist
   IMMER da – als eigener kleiner Link auf dieselbe Seite, also mit demselben Besucht-Zustand.
   Unbesucht ist es vollständig durchsichtig (Rahmen, Fläche und Zeichen), besucht bekommt es
   Farbe. Es ändert sich also nur Farbe, nie Größe oder Aufbau – genau das, was die Browser
   zulassen. `pointer-events:none`, denn es ist ein Zeichen und kein Ziel; aria-hidden und
   tabindex=-1, weil Titel und „weiterlesen" schon auf dieselbe Seite führen. */
/* ⚠️⚠️ DER MERKSATZ ZU :visited – am 06.08.2026 in Stephans echtem Browser gemessen, mit acht
   Fällen nebeneinander (Prüfstand `_besucht.php`, danach entfernt):

     Farbe DECKEND -> DECKEND  funktioniert   (Schrift, Fläche, Rahmen, auch an ::before)
     Farbe DURCHSICHTIG -> farbig  funktioniert NICHT

   Browser übernehmen die DECKKRAFT aus dem unbesuchten Zustand – sonst ließe sich die Chronik
   darüber auslesen. Was unsichtbar ist, bleibt unsichtbar, egal was die :visited-Regel sagt.
   Daran sind meine ersten zwei Anläufe gescheitert (Stephan: „beides gelesen – kein Häkchen").
   Und die Gegenprobe im selben Lauf: fett/unterstrichen ändert sich NICHT – nur Farben.

   Deshalb deckend in BEIDEN Zuständen: unbesucht in der Kartenfarbe – weiß auf weißer Karte,
   also praktisch unsichtbar, aber eben nicht durchsichtig. */
/* ⚠️ HIER KEINE CSS-VARIABLEN. Im Prüfstand vom 06.08. funktionierte genau dieser Kreis mit
   festen Farbwerten (Fall 6 wurde grün) – auf der Karte mit `var(--surface)` blieb er weiß.
   Der einzige Unterschied waren die Variablen. Browser lösen :visited über einen eigenen,
   abgespeckten Weg auf; `var()` kommt dort nicht zuverlässig an. Deshalb ausgeschrieben,
   und der Dunkelmodus als eigener Block darunter. Unschön, aber es ist der Unterschied
   zwischen „funktioniert" und „funktioniert nicht". */
/* Bezugspunkt ist .pl-body, nicht .pl-item – siehe die Begründung dort. Bei den KACHELN reicht
   .pl-body bis an die Kartenkante (nur der 1px-Rahmen liegt dazwischen), die Werte ergeben dort
   also dieselbe Stelle wie zuvor. In der LISTE endet .pl-body vor dem Bild – genau das ist der
   Zweck. */
.pl-gelesen{position:absolute;right:.7rem;bottom:.7rem;z-index:2;pointer-events:none;
  width:1.5rem;height:1.5rem;border-radius:50%;
  display:inline-flex;align-items:center;justify-content:center;
  border:1.5px solid #ffffff;background:#ffffff;color:#ffffff;
  font-size:.8rem;line-height:1;text-decoration:none;
  transition:color .15s,background-color .15s,border-color .15s}
.pl-gelesen:visited{border-color:#15803d;background:#15803d;color:#ffffff}
/* Das Wort „angesehen" links vom Kreis – dieselbe Regel, nur ohne Fläche: unbesucht in der
   Kartenfarbe, besucht in Grün. Rechts wird der Kreis freigehalten (.7rem Rand + 1.5rem Kreis
   + Abstand). Auch hier feste Farbwerte, keine Variablen – siehe oben. */
.pl-gelesen-wort{position:absolute;right:2.6rem;bottom:.7rem;height:1.5rem;z-index:2;
  display:inline-flex;align-items:center;pointer-events:none;
  color:#ffffff;font-size:.82rem;font-weight:600;line-height:1;text-decoration:none;
  white-space:nowrap;transition:color .15s}
.pl-gelesen-wort:visited{color:#15803d}
/* Am Handy wird die Karte zur schmalen Zeile; dort steht „weiterlesen" links und dieses Wort
   rechts in derselben Zeile. Etwas kleiner, damit dazwischen Luft bleibt (gemessen). */
@media (max-width:700px){ .pl-gelesen-wort{font-size:.75rem;right:2.4rem} }
/* Dunkelmodus: Kartenfarbe ist dort #191f24 (--surface), das Grün bleibt dasselbe. Seit
   Issue #101 gibt es nur noch EINE Weiche – den Umschalter in der Werkzeugsäule. */
:root[data-theme="dark"] .pl-gelesen{border-color:#191f24;background:#191f24;color:#191f24}
:root[data-theme="dark"] .pl-gelesen:visited{border-color:#5ec98a;background:#5ec98a;color:#0f1316}
:root[data-theme="dark"] .pl-gelesen-wort{color:#191f24}
:root[data-theme="dark"] .pl-gelesen-wort:visited{color:#5ec98a}
/* ---- In der SEITENSPALTE: „✓ angesehen" als eigene Zeile unter dem Titel (Stephan, 10.08.) ----
   Erst stand der Haken groß neben dem Cover. Stephans Rückmeldung nach dem Ansehen: kleiner,
   mit dem Wort daneben, und unter den Titel. Damit wandert das Zeichen aus der absoluten
   Positionierung in den normalen Textfluss – und die extra Lücke neben dem Bild wird wieder
   frei (der Zeilenabstand steht deshalb unten wieder auf .7rem).

   ⚠️ NICHT AUF DAS COVER – die Grenze von :visited (am 10.08. gebaut, gemessen, verworfen):
   Ein unbesuchter Haken darf nicht durchsichtig sein, sonst bleibt er es auch besucht (siehe
   den Merksatz weiter oben). Er ist deshalb unbesucht DECKEND in der Kartenfarbe – auf weißem
   Grund unsichtbar, mitten auf einem bunten Buchcover aber ein weißer Fleck. Bei 40 %
   Überlappung stanzte er sichtbar eine Delle in ALLE sechs Cover.

   ⚠️ DIE ZEILE IST IMMER DA, auch unbesucht – sie ist dann nur farblos. Anders geht es nicht:
   Verschwände sie, ließe sich über die Zeilenhöhe die Chronik auslesen, und genau das
   unterbinden die Browser. Der Platz ist deshalb bewusst knapp gehalten (1rem Zeile), und der
   Titel rückt nach oben statt mittig zu stehen – so liest sich die Lücke als Luft unter dem
   Titel und nicht als Loch. */
/* ⚠️ flex-direction:row MUSS hier stehen. Die Grundregel .pl-body setzt „column"; wer nur
   flex-wrap ergänzt, bekommt eine Spalte mit Umbruch – dann stehen Haken und Wort
   UNTEREINANDER, und `align-items:center` zentriert bei column die waagrechte Achse, also
   auch den Titel. Genau so sah es am 10.08. aus (Stephan: „Titel wieder linksbündig").
   Deshalb alle drei Achsen ausdrücklich: Richtung, Ausrichtung in der Zeile, Ausrichtung
   entlang der Zeile. */
.page-aside .pagelist .pl-body{position:static;
  display:flex;flex-direction:row;flex-wrap:wrap;
  align-items:center;justify-content:flex-start;
  /* Die Abstände selbst stehen weiter unten beim Spalten-Layout – siehe dort. */}
/* Der Titel nimmt die ganze Breite, Haken und Wort teilen sich die Zeile darunter.
   Reihenfolge per order: Im HTML steht das Wort vor dem Haken (auf der großen Karte sitzt es
   links vom Kreis) – hier soll der Haken vorne stehen. */
.page-aside .pagelist .pl-title{flex:0 0 100%;order:0}
/* Nur UMRISS statt gefüllter Fläche (Stephan, 10.08.): In der schmalen Spalte ist ein
   gefüllter grüner Punkt neben kleinem Text ein Klecks; der Umriss ist leiser und trotzdem
   eindeutig. Für :visited macht es die Sache sogar einfacher – die Fläche bleibt in BEIDEN
   Zuständen kartenfarben, es wechseln nur Rand und Zeichen. Deckend bleibt trotzdem alles
   (siehe Merksatz oben). */
.page-aside .pagelist .pl-gelesen{order:1;position:static;transform:none;
  width:1rem;height:1rem;font-size:.62rem;border-width:1.5px}
.page-aside .pagelist .pl-gelesen:visited{background:#ffffff;border-color:#15803d;color:#15803d}
.page-aside .pagelist .pl-gelesen-wort{display:inline-flex;order:2;position:static;
  right:auto;bottom:auto;height:auto;font-size:.72rem;font-weight:600}
@media print{ .pl-gelesen, .pl-gelesen-wort{display:none} }
/* Merkzeichen „noch kein Inhalt" – nur in der Redakteurs-Ansicht (Blocks setzt es dort).
   Derselbe goldene Punkt wie an den Entwurfs-Menüpunkten: dieselbe Farbe für „hier fehlt noch
   etwas". Er muss ÜBER dem Stretched Link liegen (z-index), sonst deckt die Trefferfläche der
   Karte ihn zu und sein title erscheint nie. */
.pl-flag{position:absolute;top:.7rem;right:.8rem;z-index:1;
  width:.5rem;height:.5rem;border-radius:50%;background:var(--gold)}
.pl-lead{margin:0;color:var(--copy);font-size:.98rem;line-height:1.5}

/* ---------------- Merkzeichen „Neu" ----------------
   Trägt der neueste Beitrag des Zweigs (der Renderer entscheidet das, siehe Blocks).

   Als BALKEN über die obere Kante des Bildes. Ein Etikett im Text hätte eine Zeile gekostet
   und wäre erst nach dem Titel aufgefallen; hier ist es das Erste, was man sieht, und kostet
   keine Höhe. Der erste Wurf setzte es über den Titel, aus Sorge um die Lesbarkeit auf
   wechselnden Motiven – der Balken löst genau das: Der Untergrund ist er selbst, nicht das
   Bild darunter. Auf einem weißen Buchrücken sitzt er so sicher wie auf einem dunklen.

   Akzentfarbe als FLÄCHE, nicht als Schrift: #E2001A erreicht als Text auf Weiß nur 4,25:1
   und verfehlt die geforderten 4,5:1 – als Fläche mit weißer Schrift stimmt der Kontrast
   (dieselbe Überlegung wie bei den Textlinks weiter oben).

   Über die GANZE Breite und nicht als Eckchen: Ein schräges Eckband ist die Machart von
   vorgestern, und es beschneidet in jeder Ecke ein Stück Motiv. Ein waagrechter Balken
   nimmt den obersten Streifen – bei einem Buchcover ist dort ohnehin nur Papier. */
.pl-media{position:relative}
.pl-neu{position:absolute;top:0;left:0;right:0;z-index:1;
  padding:.3rem .5rem;text-align:center;
  background:var(--accent);color:var(--on-accent);
  font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:.78rem;font-weight:600;
  letter-spacing:.14em;text-transform:uppercase;line-height:1.25}
/* Karte OHNE Bild: kein Balken möglich, dann ein Etikett über dem Titel (der Renderer setzt
   es dort hin). Es steht im normalen Fluss und braucht die Absolut-Regeln nicht. */
.pl-item--nomedia .pl-neu{position:static;align-self:flex-start;display:inline-block;
  margin:0 0 .25rem;padding:.12rem .5rem;border-radius:999px;
  font-size:.72rem;letter-spacing:.06em;text-align:left}
/* In der schmalen Seitenspalte bleibt es DIESELBE Machart – ein Balken im Bild –, nur kleiner
   und ohne Buchstabenabstand, damit „NEU" in 44px Breite Platz hat. Ein anderes Zeichen an
   anderer Stelle hieße: zwei Sprachen für dieselbe Aussage.
   Dazu wird die ganze Zeile hervorgehoben: roter Streifen links, wie ihn die Kontaktbox der
   Website schon trägt. Das ist die Hausform für „das hier ist wichtig" – und in einer Liste
   aus sechs gleich aussehenden Zeilen findet das Auge die eine sofort. */
.page-aside .pagelist .pl-neu{padding:.15rem .1rem;font-size:.6rem;letter-spacing:.02em}
/* Zwei Wortlaute, EIN Zeichen: „Neuester Eintrag" überall – nur im 44px schmalen Balken der
   Seitenspalte bleibt es beim kurzen „Neu" (dort passt der lange Wortlaut nicht, und der rote
   Streifen an der Zeile sagt ohnehin schon „hier"). Beide stehen im HTML; welcher erscheint,
   entscheidet der Ort. */
.pl-neu-kurz{display:none}
.page-aside .pagelist .pl-neu-lang{display:none}
.page-aside .pagelist .pl-neu-kurz{display:inline}
/* Zweiter Ort ohne Platz: die hochkante Liste am Handy. Dort wird die Karte zur Zeile mit
   einem nur 104px breiten Bild – „NEUESTER EINTRAG" brach dort auf zwei Zeilen um und deckte
   das halbe Cover zu (gemessen: 104×41px statt 104×25px). */
@media (max-width:700px){
  .pagelist--hoch .pl-neu-lang{display:none}
  .pagelist--hoch .pl-neu-kurz{display:inline}
}
.page-aside .pagelist .pl-item--neu{border-left:4px solid var(--accent);
  padding-left:calc(.6rem - 3px)}
/* „weiterlesen" ist ein Hinweis, kein zweiter Link – der Titel darüber ist bereits der Link.
   Deshalb aria-hidden im HTML: Screenreader lesen sonst zu jeder Karte ein Wort ohne Ziel. */
/* Als KNOPF gesetzt, nicht als Wort (Issue #61): Ein Knopf ist zwar verlinkt, aber kein Link –
   er wird nicht unterstrichen, also muss die Form die Aufgabe zeigen. Nur Umriss, kein gefülltes
   Feld: Gefüllt stünden auf einer Kachelreihe zwölf gleich schwere Knöpfe und überstimmten die
   Titel. Beim Überfahren füllt er sich – dann ist klar, welche Karte gerade dran ist.
   align-self hält ihn auf Textbreite; ohne das zöge die Flex-Spalte ihn über die ganze Karte. */
/* Seit 06.08.2026 ein echter <a>, kein <span> mehr – text-decoration also ausdrücklich weg,
   sonst käme die Unterstreichung der Textlinks durch und der Knopf sähe aus wie ein Link im
   Fließtext. Die Farbe trägt er schon. */
.pl-more{text-decoration:none;
  margin-top:auto;align-self:flex-start;display:inline-flex;align-items:center;gap:.3rem;
  padding:.42rem .95rem;border:1.5px solid var(--more-line);border-radius:999px;
  background:var(--more-bg);
  color:var(--more-ink);font-weight:700;font-size:.92rem;line-height:1.25;
  transition:background-color .15s,color .15s,border-color .15s}
.pl-more::after{content:"›";font-weight:700}
/* Der ganze Kartenrahmen ist die Trefferfläche, darum hängt der zweite Zustand an der Karte und
   nicht am Knopf selbst. Auf Geräten ohne Maus greift das nie – deshalb muss schon der
   Ruhezustand fertig aussehen.
   Welcher der beiden Zustände gefüllt ist und welcher die Kontur trägt, entscheiden allein die
   Rollen oben (im Hellmodus gefüllt→Kontur, im Dunkelmodus Kontur→gefüllt). */
.pl-item:hover .pl-more{background:var(--more-bg-h);border-color:var(--more-line-h);
  color:var(--more-ink-h)}

/* Veröffentlichungsdatum am Ende des Inhalts (Issue #51). Klein und gedämpft: Es steht direkt
   unter der redaktionellen Schlusszeile („Stand: 07/2026, LE") und darf die letzte Aussage des
   Textes nicht überstimmen. Auf Papier bleibt es ausdrücklich stehen – wer ein Blatt in der Hand
   hält, kann sonst nicht beurteilen, wie alt die Auskunft ist. */
.page-pubdate{margin:1.4rem 0 0;font-size:.86rem;color:var(--text)}
@media print{ .page-pubdate{margin-top:.6rem;font-size:8pt;color:#333} }

/* Liste: Text links, Bild RECHTS – und zwar mit Absicht.
   „Bild links" ist die klassischere Bauform, scheitert hier aber an der Wirklichkeit: in einer
   echten Liste hat mal die eine Seite ein Vorschaubild und die andere nicht. Mit dem Bild links
   beginnt der Text dann bei jeder zweiten Karte woanders, und die Liste franst aus. Steht das
   Bild rechts, fangen ALLE Karten an derselben Stelle an; eine Karte ohne Bild lässt ihren Text
   einfach weiter laufen. Der Blick findet den Einstieg dadurch immer an derselben Kante.
   grid-template-areas statt fester Spalten: so kann die Bildspalte ganz entfallen. */
.pagelist--liste .pl-item{grid-template-columns:minmax(0,1fr) 260px}
/* FESTES Seitenverhältnis – das war einmal anders und ist am 02.08.2026 bewusst umgedreht
   worden. Vorher zog das Bild auf die Texthöhe mit (align-self:stretch). Das sah bei kurzen
   Anrissen gut aus, hatte aber einen Haken, den man erst mit echtem Inhalt sieht: Der Bildkasten
   ändert damit seine FORM je nach Textlänge. Gemessen an den Bezirkskarten der Beratungsstellen:
   bei zwei Zeilen Anriss war der Kasten 260 × 226 (1,15 : 1) und die Karte vollständig – bei
   fünf Zeilen 260 × 287 (0,91 : 1), und `cover` schnitt links und rechts je rund 150 Pixel weg.
   Genau dort liegt der Osten des Landes. Niemand hätte das Bild angefasst; es hätte gereicht,
   den Anrisstext zu verlängern.
   Der Preis ist der weiße Rest unter dem Bild, wenn der Text länger wird – der ist sichtbar,
   aber harmlos. Ein angeschnittenes Bild ist es nicht: Es sieht richtig aus und ist falsch.
   1,15 : 1 ist die Form der Karten, die diese Liste trägt. Andere Bilder bekommen einen
   mittigen Ausschnitt; welchen, entscheidet ihr Fokuspunkt. */
.pagelist--liste .pl-media{order:2;align-self:start;aspect-ratio:1.15}
.pagelist--liste .pl-body{order:1}
.pagelist--liste .pl-item--nomedia{grid-template-columns:1fr}
@media (max-width:640px){
  /* Am Handy zurück zur klassischen Reihenfolge: dort steht ohnehin alles untereinander,
     und ein Bild UNTER dem Anriss wirkte wie ein nachgereichter Anhang. */
  .pagelist--liste .pl-item{grid-template-columns:1fr}
  .pagelist--liste .pl-media{order:0;aspect-ratio:16/9}
  .pagelist--liste .pl-body{order:1}
}
/* Kacheln: Raster aus Karten, Bild oben. min(100%,280px) hält am Handy eine Spalte. */
.pagelist--kacheln .pl-list{grid-template-columns:repeat(auto-fill,minmax(min(100%,280px),1fr))}
/* Feste Spaltenzahl, wenn sie im Baustein eingestellt ist (Issue #62). Sie ist eine OBERGRENZE,
   keine Vorschrift: Vier Kacheln auf einem Tablet wären je 190px breit, und darin bricht jeder
   zweite Titel um. Also stufenweise – erst ab 1000px gilt die volle gewählte Zahl, darunter
   höchstens zwei, am Handy immer eine. Ohne Einstellung bleibt es beim Auffüllen nach Platz. */
@media (min-width:701px){
  .pagelist--kacheln.pagelist--sp2 .pl-list,
  .pagelist--kacheln.pagelist--sp3 .pl-list,
  .pagelist--kacheln.pagelist--sp4 .pl-list{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (min-width:1000px){
  .pagelist--kacheln.pagelist--sp3 .pl-list{grid-template-columns:repeat(3,minmax(0,1fr))}
  .pagelist--kacheln.pagelist--sp4 .pl-list{grid-template-columns:repeat(4,minmax(0,1fr))}
}
.pagelist--kacheln .pl-item{grid-template-rows:auto 1fr}
.pagelist--kacheln .pl-media{aspect-ratio:16/9}
/* Karte ohne Vorschaubild: ruhige getönte Fläche an derselben Stelle. Ohne sie begänne der
   Titel bei bebilderten und unbebilderten Kacheln auf unterschiedlicher Höhe, und die Reihe
   sähe aus wie verrutscht. In der Zeilen-Darstellung braucht es das nicht – dort steht das
   Bild rechts und der Text beginnt ohnehin überall gleich. */
.pagelist--kacheln .pl-item--nomedia::before{content:"";aspect-ratio:16/9;background:var(--soft);
  border-bottom:1px solid var(--line)}
/* Hat KEINE Karte der Liste ein Bild, gibt es nichts auszurichten – dann wären es nur leere
   graue Kästen (gemeldet an der Seite „Lehre"). Die Klasse setzt der Renderer, weil nur er
   weiß, ob überhaupt ein Bild dabei ist; CSS allein sieht das nicht. Die Karten werden dann
   zu ruhigen Textkacheln. */
.pagelist--kacheln.pagelist--ohne-bilder .pl-item--nomedia::before{content:none}
.pagelist--kacheln.pagelist--ohne-bilder .pl-body{padding-top:1.25rem}

/* BLÄTTERLEISTE unter einer Bereichsliste. Erscheint nur, wenn es wirklich mehr als eine
   Seite gibt.

   scroll-margin-top am ganzen Kasten ist der eigentliche Trick: Jeder Blätter-Link trägt
   „#…" hinter der Adresse, der Browser springt beim Laden also von selbst zur Liste –
   Stephans „bei Klick wieder auf die erste Reihe". Ohne diesen Abstand landete die erste
   Kachelreihe UNTER dem klebenden Seitenkopf und man sähe sie nicht.

   Die Ziffern sind Links, keine Knöpfe (die Adresse lässt sich kopieren und als Lesezeichen
   ablegen) – sie tragen aber Knopf-Form, weil eine Reihe unterstrichener Ziffern wie ein
   zerfallener Satz aussieht. Die aktuelle Seite ist kein Link: Ein Link auf die Seite, auf
   der man steht, ist eine Sackgasse und wird von Screenreadern als Ziel angesagt. */
.pagelist{scroll-margin-top:6rem}
/* MITTIG (Stephans Wunsch vom 05.08.2026, bewusst erst nach dem Entfernen der Testeinträge
   umgesetzt – wie die Mitte wirkt, sieht man erst am echten Bestand). Die Leiste steht unter
   einem zentrierten Kachelraster; linksbündig hing sie daran wie ein loser Faden.
   ⚠️ Die Zählzeile „13–24 von 71" MUSS dafür in eine eigene Zeile: Sie stand mit
   `margin-left:auto` rechts, und ein automatischer Rand frisst genau den freien Platz, aus dem
   `justify-content:center` die Mitte bildet – die Ziffern wären nach links gerutscht und die
   Zeile trotzdem nicht rechts gewesen. */
.pl-pager{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:.4rem;margin:1.6rem 0 0}
.pl-page{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;
  padding:.45rem .7rem;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface);color:var(--ink);text-decoration:none;font-size:.98rem;
  transition:border-color .15s,background .15s,color .15s}
.pl-page:hover{border-color:var(--accent-ink);color:var(--accent-ink)}
/* Die aktuelle Seite trägt die Akzentfarbe als FLÄCHE – als bloßer Rahmen war sie in einer
   Reihe von zwölf Ziffern nicht zu finden. */
.pl-page.is-current{background:var(--accent);border-color:var(--accent);color:var(--on-accent);
  font-weight:600;cursor:default}
.pl-page--prev,.pl-page--next{gap:.35rem;font-weight:600}
/* „13–24 von 71": die Antwort auf „wo bin ich". Sie steht IMMER in einer eigenen Zeile unter
   den Ziffern und mittig darunter – siehe die Erklärung an .pl-pager. Bis zum 06.08.2026 stand
   sie am breiten Schirm rechts neben den Ziffern. */
.pl-pager-note{flex:1 1 100%;margin:.5rem 0 0;text-align:center;color:var(--muted);font-size:.9rem}

/* Auslassungspunkte zwischen weit auseinanderliegenden Ziffern. Am breiten Schirm stehen ALLE
   Ziffern da – dort behauptete ein „…" eine Lücke, die es nicht gibt. Deshalb erscheint es
   ausschließlich am Handy, zusammen mit dem Ausblenden der fernen Ziffern. Für Screenreader
   ist es aria-hidden: Wer die Leiste hört, bekommt weiterhin jede Seite einzeln angesagt –
   ausgeblendete Ziffern sind display:none und damit ohnehin nicht mehr in der Vorlesefolge,
   die verbleibenden reichen aus, und „drei Punkte" wäre kein Ziel. */
.pl-luecke{display:none}
@media (max-width:640px){
  /* Ziffern, die weder Anfang noch Ende noch Nachbar der aktuellen Seite sind: weg. Aus
     „1 2 3 4 5 6 7 8 9" wird „1 … 4 5 6 … 9" – das passt in eine Zeile, und die zwei Sprünge,
     die man wirklich braucht (ganz zurück, ans Ende), bleiben erreichbar. Welche Ziffer fern
     ist, entscheidet der Renderer (Blocks::render, Klasse pl-page--fern) – CSS kann nicht
     zählen, und zwei HTML-Fassungen wollte ich nicht. */
  .pl-page--fern{display:none}
  .pl-luecke{display:inline-flex;align-items:center;justify-content:center;
    min-width:1.2rem;color:var(--muted);font-size:.98rem;line-height:1}
  /* Die Leiste selbst darf am Handy enger stehen – bei 44px Mindestbreite je Ziffer plus
     „zurück"/„weiter" ist der Platz sonst knapp. Die Zielgröße bleibt über 40px (WCAG 2.5.5). */
  .pl-pager{gap:.3rem}
  /* Schmaler als am breiten Schirm, damit „‹ 1 … 4 5 6 … 9 ›" bei 390px mit Reserve in eine
     Zeile passt (gemessen: 321 von 352 Pixeln – mit den ursprünglichen 2,4rem waren es 346,
     also nur 6 Pixel Luft, und das hält keine andere Schriftgröße aus). Die Zielfläche bleibt
     rund 35 × 37 Pixel und damit über den 24 Pixeln, die WCAG 2.5.8 verlangt. */
  .pl-page{min-width:2.2rem;padding:.45rem .4rem}
  /* „zurück" und „weiter" nur noch als Pfeil. Die Wörter allein kosteten rund 160 Pixel –
     gemessen am 06.08.: mit ihnen brach die Leiste bei 390px auf DREI Zeilen um, obwohl von
     neun Ziffern nur fünf standen. Damit war der halbe Zweck verfehlt.
     ⚠️ NICHT display:none, sondern optisch versteckt: Der Pfeil trägt aria-hidden, der Link
     hätte sonst überhaupt keine Beschriftung mehr und würde als „Link" ohne Ziel angesagt.
     Dieselbe Machart wie .nur-hoerbar. */
  .pl-wort{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
    clip-path:inset(50%);white-space:nowrap;border:0}
  .pl-page--prev,.pl-page--next{gap:0}
}
/* Zweite Stufe für sehr schmale Geräte. Die Grenze liegt bei 380px, nicht höher: Bei 390px
   (das verbreitetste Telefonformat) passt „‹ 1 … 4 5 6 … 9 ›" mit Reserve, und die beiden
   Nachbarziffern sind die nützlichsten überhaupt – die verschenkt man nicht vorsorglich.
   Darunter wird es eng, dann fallen auch sie weg: „‹ 1 … 5 … 9 ›" braucht rund 190 Pixel und
   passt auf jedem Gerät. Erste und letzte Seite bleiben auch hier stehen; „ganz zurück" und
   „ans Ende" sind die Sprünge, die man auf einem kleinen Schirm am ehesten braucht, und den
   Schritt-für-Schritt-Fall tragen ohnehin „zurück"/„weiter". */
@media (max-width:380px){
  .pl-page--nah{display:none}
}

/* HOCHKANTES Bildfenster – am Baustein einstellbar, gedacht für Buchcover, Titelblätter und
   Plakate. Die Regeln stehen bewusst am ENDE des pagelist-Abschnitts: Sie haben dieselbe
   Spezifität wie die Querformat-Regeln darüber und gewinnen allein durch die Reihenfolge,
   auch in den Handy-Abfragen. Wer sie verschiebt, dreht die Wirkung um.
   2:3 ist die übliche Buchproportion (Taschenbuch wie Hardcover liegen dicht daran). */
.pagelist--hoch .pl-media{aspect-ratio:2/3}
/* Zeilen-Darstellung: die Bildspalte wird schmaler. Bei 260px wäre das Cover 390px hoch und
   überragte den zweizeiligen Anriss daneben um ein Vielfaches – die Karte stünde auf dem Bild
   statt umgekehrt. 200px ergeben 300px Höhe, etwa die Höhe von Titel plus Anriss plus Knopf. */
.pagelist--liste.pagelist--hoch .pl-item{grid-template-columns:minmax(0,1fr) 200px}
.pagelist--liste.pagelist--hoch .pl-item--nomedia{grid-template-columns:1fr}
/* Kacheln dürfen schmaler werden: Ein hochkantes Motiv braucht weniger Breite für dieselbe
   Wirkung, und aus einer Reihe Buchrücken wird so ein Regal statt einer Plakatwand.
   ⚠ NUR wenn keine feste Spaltenzahl eingestellt ist. Ohne das :not() überstimmt diese Regel
   die Spaltenwahl aus dem Baustein – sie hat dieselbe Spezifität und steht weiter unten. Bei
   „4 Kacheln nebeneinander" standen dann fünf da (am 05.08. genau so gemessen). Eine
   Einstellung, die stillschweigend nicht gilt, ist schlimmer als gar keine.
   ⚠ Und sie steht in einer min-width-Abfrage, damit sie der Handy-Regel weiter unten nicht in
   die Quere kommt. Das :not() hebt die Spezifität auf fünf Klassen – ohne die Abfrage gewann
   diese Regel auch am Handy, und dort stand danach wieder EINE Kachel je Zeile (am 05.08.
   gemessen, nachdem das :not() dazukam). Dieselbe Lehre wie so oft: Weiche angefasst, beide
   Zweige nachmessen. */
@media (min-width:641px){
  .pagelist--kacheln.pagelist--hoch:not(.pagelist--sp2):not(.pagelist--sp3):not(.pagelist--sp4) .pl-list{
    grid-template-columns:repeat(auto-fill,minmax(min(100%,220px),1fr))}
}
.pagelist--kacheln.pagelist--hoch .pl-item--nomedia::before{aspect-ratio:2/3}
@media (max-width:640px){
  /* HOCHKANT AM HANDY: eine ZEILE je Eintrag – Cover klein links, Text rechts. Gilt für beide
     Darstellungen, Liste wie Kacheln.

     Der Weg dorthin ging über zwei Sackgassen, beide gemessen, nicht geschätzt:
       • Eine Spalte mit Bild oben (wie im Querformat): das Cover wurde 342 × 513 Pixel groß
         und füllte den halben Bildschirm. Man scrollte durch Cover statt durch Titel.
       • Zwei Spalten nebeneinander (Stand 05.08.): das Bild passte, aber die Textspalte war
         nur 166 Pixel breit. Darin wurde derselbe Anriss 5 bis 11 Zeilen lang, die Karten
         waren 567 bis 686 Pixel hoch, und die Liste insgesamt 3 624 Pixel. Von Stephan am
         06.08. gemeldet.
     Beides ist derselbe Fehler: Bildgröße und Textbreite hingen aneinander, weil beide aus
     der Spaltenbreite kamen. Die Zeile trennt sie – das Cover bekommt eine FESTE Breite, der
     Text den ganzen Rest. Dieselbe Lösung wie bei den Personen-Karten der Teamseite.

     104px Cover ergeben in 2:3 rund 156px Höhe – etwa so hoch wie Titel, drei Zeilen Anriss
     und der Knopf zusammen. Damit steht neben dem Bild kein leerer Streifen. */
  .pagelist--hoch .pl-list{grid-template-columns:1fr}
  .pagelist--hoch .pl-item{grid-template-columns:104px minmax(0,1fr);grid-template-rows:auto}
  .pagelist--hoch .pl-media{order:0}
  .pagelist--hoch .pl-body{order:1;padding:.85rem 1rem .85rem .9rem}
  .pagelist--hoch .pl-item--nomedia{grid-template-columns:1fr}
  /* Der graue Platzhalter der bildlosen Kachel gehört zur SPALTEN-Form: Er richtet Karten
     mit und ohne Bild auf gleicher Höhe aus. In der Zeile beginnt der Text ohnehin überall
     links – dort wäre er nur ein leerer Kasten (dieselbe Überlegung wie bei .pagelist--liste). */
  .pagelist--kacheln.pagelist--hoch .pl-item--nomedia::before{content:none}
  /* Der Anriss wird nach drei Zeilen abgeschnitten. Ohne das bliebe der Grund des Umbaus zur
     Hälfte bestehen: Ein Anriss von elf Zeilen macht die Karte auch in der Zeile wieder
     doppelt so hoch wie die daneben, und in einer Liste aus zwölf Karten sieht ungleiche Höhe
     nach Fehler aus. Auf der Karte steht der ANREIZ, der ganze Text steht eine Seite weiter.
     Nur am Handy: am breiten Schirm ist Platz für den vollen Anriss. */
  .pagelist--hoch .pl-lead{display:-webkit-box;-webkit-box-orient:vertical;
    -webkit-line-clamp:3;line-clamp:3;overflow:hidden}
}

@media print{
  .pl-item{break-inside:avoid;border:1pt solid #bbb;box-shadow:none;transform:none}
  .pl-more{display:none}                 /* auf Papier führt „weiterlesen" nirgendwohin */
  /* Die zweite Zeile ist kein Doppel: Die Zeilen-Liste MIT hochkantem Bildfenster trägt DREI
     Klassen (.pagelist--liste.pagelist--hoch .pl-item) und schlug die Zwei-Klassen-Regel darüber –
     die 200px breite Bildspalte blieb im Druck leer stehen, obwohl .pl-media ausgeblendet ist.
     Am 10.08. im Testbrowser nachgestellt (Klasse nur dort gesetzt, keine Seite geändert):
     „471px 200px" statt einer vollen Spalte. Heute steht diese Kombination auf keiner Seite –
     sie ist im Baustein aber wählbar, und beim nächsten Mal soll sie nicht wieder auffallen. */
  .pagelist--liste .pl-item,
  .pagelist--liste.pagelist--hoch .pl-item{grid-template-columns:1fr}
}

/* ------------------------------- Verweisliste (linklist) -------------------------------
   „Mehr zum Thema". Ganze Zeile klickbar (Zielgröße, WCAG 2.5.5). Rechts ein Zeichen: bei
   einem eigenen Ziel der Pfeil („hier geht es weiter"), bei einem fremden das Extern-Symbol
   („hier geht es von der Website weg"). Beide kommen aus CSS und nicht aus dem HTML: Sie
   sind Zierde und hätten im Vorlese-Text nichts verloren. */
.linklist{margin:var(--band) 0}
.ll-title{margin-top:0}
.ll-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.5rem}
.ll-list a{display:flex;align-items:center;gap:.9rem;text-decoration:none;color:var(--text);
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  padding:.85rem 1.1rem;box-shadow:var(--shadow-1)}
.ll-list a::after{content:"›";margin-left:auto;color:var(--accent-ink);font-size:1.5rem;
  line-height:1;flex:0 0 auto;transition:transform .15s}
/* Führt die Zeile nach AUSSEN, trägt die ADRESS-MARKE unten das Extern-Zeichen – dann
   braucht die Zeile rechts keines mehr (Stephan, 11.08.: „mach alle links gleich mit dem
   Badge"). Damit sehen einfache Zeilen und Zeilen mit zwei Zielen gleich aus: Name oben,
   darunter eine Marke je Adresse, jede mit dem Zeichen.
   Zeilen auf eine EIGENE Seite behalten ihren Pfeil – dort gibt es keine Marke.

   ⚠️ `content:none` wirkt hier, weil diese Regel eine Stufe MEHR trägt als `.ll-list
   a::after` (das [target]-Merkmal zählt wie eine Klasse). In der allgemeinen
   Ausnahmenliste ganz oben wirkte dasselbe `content:none` NICHT – dort ist die Regel
   schwächer, und Maße plus Maske kämen durch.

   ⚠️⚠️ UND SIE MUSS DIE ZEILE TREFFEN, NICHT JEDEN LINK DARIN. Mit `.ll-list a` erwischte
   sie auch die Knöpfe der Doppelzeile (die liegen ja IN der Liste) – und nahm ausgerechnet
   dort das Zeichen weg, wo es hingehört. Im Screenshot sofort zu sehen, in keiner Zählung.
   `> li >` meint genau den Zeilen-Link. */
.ll-list > li > a[target="_blank"]::after{content:none}
.ll-list a:hover{border-color:var(--accent-ink);background:var(--accent-soft)}
.ll-list > li > a:hover::after{transform:translateX(3px)}
.ll-body{display:flex;flex-direction:column;gap:.15rem;min-width:0}
.ll-label{font-weight:700;color:var(--ink)}
.ll-list a:hover .ll-label{color:var(--accent-ink)}
.ll-note{font-size:.92rem;color:var(--muted);line-height:1.35}

/* ---- Zeile mit ZWEI Zielen (seit 11.08.2026) ----
   Der Ausnahmefall: Eine Einrichtung hat zwei Auftritte. Dann kann die Zeile nicht der Link
   sein – es gibt ja zwei –, also steht der Name als Text und darunter zwei kleine Knöpfe.
   Das <li> trägt hier selbst das Kleid, das sonst am <a> hängt; ohne das stünde die
   Ausnahme-Zeile als nackter Text zwischen lauter Karten. */
.ll-row--zwei{display:flex;flex-direction:column;gap:.55rem;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  padding:.85rem 1.1rem;box-shadow:var(--shadow-1)}
.ll-links{display:flex;flex-wrap:wrap;gap:.5rem}
/* EINE Bauform für beide Fälle: die Marke in der einfachen Zeile (.ll-host, ein Span im
   Link – die ganze Zeile bleibt ja das Ziel) und der eigene Knopf in der Zeile mit zwei
   Zielen (.ll-links a). Sie sehen absichtlich gleich aus; welcher Fall vorliegt, ist eine
   Frage der Daten und geht den Leser nichts an. */
.ll-host,
.ll-links a{display:inline-flex;align-items:center;gap:.35rem;
  border:1px solid var(--line);border-radius:999px;padding:.32rem .85rem;
  font-size:.9rem;line-height:1.3;text-decoration:none;color:var(--accent-ink);
  background:var(--soft);word-break:break-word;
  /* ⚠️ Der Knopf ist ein <a> IN der Liste und erbt sonst den Kartenschatten von
     „.ll-list a" – gleiche Spezifität, und box-shadow steht dort allein. Eine Marke mit
     Kartenschatten sieht aus wie eine Karte in der Karte. */
  box-shadow:none}
/* Die Marke ist keine eigene Zeile: in einer Spalten-Flexbox zöge sie sich sonst über die
   volle Breite und wäre ein Balken statt einer Marke. */
.ll-host{align-self:flex-start;margin-top:.2rem}
.ll-links a:hover,.ll-links a:focus-visible{border-color:var(--accent-ink);background:var(--accent-soft)}
.ll-list a:hover .ll-host{border-color:var(--accent-ink);background:var(--accent-soft)}
/* ⚠️ Dieselbe Falle wie beim Pfeil der einfachen Zeile (Issue #93): Die allgemeine
   Extern-Regel malt ihr Symbol per Maske in ::after. In einem Knopf, der ohnehin schon
   klein ist, säße es dann als eingefärbtes Kästchen im Text. Hier gehört es dazu – der
   Knopf führt fast immer nach außen –, es bekommt nur den Abstand, den ein Chip braucht. */
/* `content:""` gehört ausdrücklich dazu: Sonst erbt der Knopf das „›" von `.ll-list a::after`
   (er liegt ja IN der Liste) und trägt den Pfeil als Inhalt unter der Maske – unsichtbar,
   aber im Vorlese-Text und beim Kopieren da. Gemessen am 11.08.: content war `"›"`. */
.ll-links a[target="_blank"]::after{content:"";margin-left:.15rem}
/* Die Marke ist ein <span> und kann kein [target] tragen – die allgemeine Extern-Regel
   greift dort also nie. Sie führt aber IMMER nach außen (der Renderer setzt sie nur bei
   fremden Zielen), deshalb bekommt sie dasselbe Zeichen hier von Hand. */
.ll-host::after{content:"";display:inline-block;flex:0 0 auto;
  width:.9em;height:.9em;margin-left:.15rem;background-color:currentColor;
  -webkit-mask:var(--ico-extern) center/contain no-repeat;
          mask:var(--ico-extern) center/contain no-repeat}

/* In der schmalen Seitenspalte ist für Schatten und großes Polster kein Platz. */
.page-aside .ll-list a{padding:.6rem .75rem;box-shadow:none}
.page-aside .ll-row--zwei{padding:.6rem .75rem;box-shadow:none}

/* --------- Personen-/Standort-Karte IN DER SEITENSPALTE: gestapelt statt nebeneinander ---------
   Dieselbe Karte, andere Breite. Im Hauptinhalt stehen Bild und Angaben nebeneinander – das
   ist bei 1100px richtig. In der 340px-Spalte bleiben neben dem Bild noch gut 150px, und
   darin zerfällt alles: „Mag.a Christine Bauer-Grechenig" bricht in drei Zeilen und wird
   dabei mitten im Wort getrennt („Christi-ne"), die E-Mail-Adresse reißt am Bindestrich
   auseinander. Von Stephan am 11.08.2026 gemeldet: „sieht zerwürfelt aus".

   Deshalb hier dieselbe Antwort wie bei der Bereichsliste: Der ORT entscheidet, nicht der
   Redakteur. Eine Spalte ist immer schmal – eine Einstellung am Baustein wäre eine Wahl, die
   man nur falsch treffen kann.

   NUR ab 961px, denn nur dort IST die Spalte eine schmale Spalte. Darunter rutscht sie unter
   den Haupttext und ist so breit wie die Seite; dann gelten die normalen Regeln, und unter
   640px greift ohnehin die eigene Handy-Form der Personen-Karte. So kommen sich die drei
   Fassungen nicht in die Quere. */
@media (min-width:961px){
  .page-aside .entrylist{grid-template-columns:minmax(0,1fr);gap:.9rem;margin:1.4rem 0 0}
  .page-aside .entry{grid-template-columns:minmax(0,1fr);gap:.75rem;padding:1rem 1.1rem}
  /* Das Porträt steht oben und nimmt die HALBE Spaltenbreite (Stephan, 11.08.): groß genug,
     dass man das Gesicht erkennt, klein genug, dass zwei oder drei Ansprechpersonen
     untereinander keine Wand aus Gesichtern ergeben. Über die volle Breite war es eindeutig
     zu viel – eine Karte füllte fast den Sichtbereich.
     Als Anteil und nicht in Pixeln: Die Spalte ist heute 340px breit, das kann sich ändern;
     „halb so breit wie die Spalte" bleibt dann richtig. Quadratisch wie überall auf der
     Website – ein rundes Bild wäre die einzige runde Form im ganzen Auftritt. */
  .page-aside .entry-media{aspect-ratio:1/1;max-width:50%}
  /* ⚠️ ABER NICHT das Namenskürzel: Ohne Foto stünde sonst ein 280 × 280 großes graues
     Quadrat mit einem einzigen Buchstaben darin – im Hauptinhalt fällt das nicht auf, weil
     die Bildspalte dort nur ein Viertel breit ist. In der Spalte wäre es der auffälligste
     Teil der ganzen Karte, und er sagt nichts. Also dieselbe flache Form wie am Handy.
     Bewusst NICHT display:none: Die Karte ist hier einspaltig, ein fehlendes Kind gäbe zwar
     keine Rasterspur frei-Problem – aber das Kürzel IST die Auskunft „hier fehlt ein Foto",
     und die will man beim Durchsehen sehen. */
  .page-aside .entry-media--leer{aspect-ratio:auto;padding:1rem 0}
  /* ⚠️ KEINE Silbentrennung im Namen. Ein Personenname wird nicht getrennt – „Christi-ne"
     ist schlicht falsch, und in der schmalen Spalte trifft es fast jeden Namen. Umbrechen
     darf er weiterhin, nur eben an den Leerzeichen und Bindestrichen des Namens selbst. */
  .page-aside .entry-name{font-size:1.15rem;line-height:1.25;
    hyphens:none;-webkit-hyphens:none;overflow-wrap:break-word}
  .page-aside .entry-role{font-size:.9rem;line-height:1.35}
  /* Nummer und E-Mail eine Spur kleiner – eine E-Mail-Adresse ist ein Wort ohne Fugen, und
     jede Zehntel Schriftgröße entscheidet hier, ob sie in eine Zeile passt. */
  .page-aside .entry .contact-list{font-size:.9rem}
  .page-aside .entry .contact-list a{overflow-wrap:anywhere}
}
/* In der Spalte stehen die Bausteine dichter beieinander als im Hauptinhalt – dort trennt der
   große Bandabstand Sinnabschnitte, hier gehören sie als „Beiwerk" sichtbar zusammen. */
.page-aside .linklist,.page-aside .downloads,.page-aside .quicklinks,
.page-aside .pagelist{margin:1.4rem 0 0}

/* ------------------------------ Veranstaltungen (events) ------------------------------
   Ein Termin, den ein Mensch einträgt (nicht das Kunden-Modul „Nächste Termine"). Links die
   Datumsfahne, rechts Name, Zeit, Ort, Thema und ein Knopf. Der roten Linkspur folgend
   dieselbe Karte wie bei Personen und Standorten – wer die Website kennt, erkennt sie wieder.

   ⚠️ DIE GRID-FALLE, die in diesem Projekt DREIMAL zugeschlagen hat (Bereichsliste 05.08.,
   Seitenspalte 06.08., Beratungsstellen 10.08. – jedes Mal im Ausdruck): Ein reserviertes
   Raster mit einem fehlenden Kind gibt seine SPALTE NICHT frei; der Nachbar rutscht per
   Auto-Platzierung hinein und wird auf Fahnenbreite gequetscht. Hier kann die Fahne fehlen –
   ein Eintrag ohne Datum ist erlaubt. Deshalb ist EINSPALTIG der Normalfall, und die zweite
   Spalte entsteht erst, wenn die Fahne wirklich da ist. Diese Richtung ist die sichere:
   Kennt ein Browser :has() nicht, stapelt sich die Karte – unschön, aber nichts zerbricht. */
.events{margin:var(--band) 0}
.events-title{margin-top:0}
.event-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1rem}
.event{display:grid;grid-template-columns:minmax(0,1fr);gap:1.2rem;align-items:start;
  background:var(--surface);border:1px solid var(--line);border-left:5px solid var(--accent);
  border-radius:var(--r);padding:1.2rem 1.35rem;box-shadow:var(--shadow-1)}
.event:has(.event-date){grid-template-columns:auto minmax(0,1fr)}

/* Die Datumsfahne. Groß, weil „wann" auf einer Terminseite die erste Frage ist. Getönte
   Fläche statt Vollrot: Die Karte trägt links schon die rote Kante, und zwei rote Flächen
   nebeneinander lassen die Seite flackern. */
.event-date{margin:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  min-width:5.5rem;padding:.7rem .8rem;border-radius:var(--r-sm);
  background:var(--accent-soft);border:1px solid var(--line);line-height:1.1}
.event-day{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:2.4rem;font-weight:600;
  color:var(--accent-ink)}
.event-mon{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1.05rem;
  text-transform:uppercase;letter-spacing:.04em;color:var(--accent-ink)}
.event-year{font-size:.85rem;color:var(--muted);margin-top:.15rem}

.event-body{min-width:0;display:flex;flex-direction:column;gap:.45rem}
.event-name{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1.25rem;margin:0;color:var(--ink)}
.event-when{margin:0;font-weight:700;color:var(--ink);line-height:1.4}
.event-place,.event-topic{margin:0;color:var(--copy);line-height:1.45}
.event-note{margin:0;font-size:.92rem;color:var(--muted);line-height:1.4}
/* „Ort:" / „Thema:" – die Beschriftung soll die Zeile gliedern, nicht mit ihr konkurrieren. */
.event-lbl{color:var(--muted);font-weight:700}
.event-actions{margin:.3rem 0 0}
.event-actions a{display:inline-flex;align-items:center;gap:.4rem;border-radius:999px;
  padding:.6rem 1.3rem;text-decoration:none;font-weight:700;line-height:1.25;
  background:var(--accent);color:var(--on-accent)}
.event-actions a:hover,.event-actions a:focus-visible{background:var(--accent-dark)}

/* Am Handy steht die Fahne ÜBER dem Text und liegt quer: hochkant nähme sie ein Drittel der
   Zeilenbreite und der Ortsname bräche nach jedem zweiten Wort um. */
@media (max-width:560px){
  .event:has(.event-date){grid-template-columns:minmax(0,1fr)}
  .event-date{flex-direction:row;gap:.5rem;align-items:baseline;justify-content:flex-start;
    min-width:0;padding:.4rem .7rem}
  .event-day{font-size:1.7rem}
  .event-mon{font-size:1rem}
}
@media print{
  .event{break-inside:avoid;border:1pt solid #bbb;box-shadow:none}
  /* Auf Papier ist die Fahne reine Farbe: Das Datum steht eine Zeile weiter ausgeschrieben,
     und die Fläche kostet nur Toner. ⚠️ Sie wird deshalb NICHT auf display:none gesetzt –
     das wäre genau die Falle von oben (Spalte bleibt reserviert, Text wird gequetscht).
     Der Baustein selbst fällt weg, damit auch das Raster. */
  .event:has(.event-date){grid-template-columns:minmax(0,1fr)}
  .event-date{display:none}
  /* Der Knopf ist im Ausdruck kein Knopf mehr – ein Balken in Volltonfarbe, den niemand
     drücken kann. Die Adresse dahinter hängt site.js beim Drucken ohnehin an jeden Link. */
  .event-actions a{background:none;color:#000;padding:0;font-weight:700;text-decoration:underline}
}

/* ---------------- Bereichsliste IN DER SEITENSPALTE: kompakte Form ----------------
   Dieselbe Liste, andere Aufgabe. Im Hauptinhalt ist sie das Angebot der Seite und darf
   Platz nehmen: großes Bild, Anriss, „weiterlesen". In der 320px-Spalte ist sie Beiwerk –
   „was gibt es hier sonst noch". Dort zählt allein der Titel; ein Anriss, der nach jedem
   zweiten Wort umbricht, macht die Spalte zur zweiten Textseite und stiehlt dem Haupttext
   die Aufmerksamkeit.

   Deshalb entscheidet hier der ORT und nicht der Redakteur: Es gibt keine Einstellung am
   Baustein. Eine Spalte ist immer schmal – eine Wahl, die man nur falsch treffen kann, ist
   keine Wahl, sondern eine Falle.

   Anriss und Knopf werden ausgeblendet, nicht weggelassen: Der Renderer schreibt für alle
   Orte dasselbe HTML, und derselbe Baustein kann auf einer anderen Seite im Hauptinhalt
   stehen. Für Screenreader ist das unschädlich – der Titel darüber ist der Link, der Anriss
   nur seine Wiederholung, und „weiterlesen" trägt ohnehin aria-hidden.

   ⚠️ Alle Regeln hier tragen DREI Klassen (.page-aside .pagelist .pl-…). Zwei reichen nicht:
   Die Hochkant-Regeln weiter oben haben selbst schon zwei (.pagelist--liste.pagelist--hoch)
   und gewinnen sonst – gemessen, die Cover standen dann 90px breit statt 44px in der Spalte.
   Wer hier eine Klasse wegkürzt, macht die kompakte Form still wirkungslos. */
/* Abstand zwischen den Bausteinen der Spalte. Ohne ihn klebten Liste und Kontaktbox
   aneinander: Die vorhandene Regel trennt FÄCHER (.region + .region), zwei globale
   Bausteine stehen aber im selben Fach – da gab es nichts, was sie auseinanderhält.
   Bewusst EINE allgemeine Regel auf die Kinder von .content statt einer Liste von
   Bausteinklassen: Ein erster Versuch zählte „.contact" auf, die Kontaktbox heißt aber
   „.contactbox" – aufgefallen erst beim Nachmessen. Was man aufzählt, kann man vergessen. */
.page-aside .pagelist{margin-bottom:0}
.page-aside .content > * + *{margin-top:1.6rem}
/* Die Überschrift KLEBT innerhalb der Spalte. Die Größe kommt aus der gemeinsamen Regel für
   Spalten-Überschriften weiter oben, damit „Weitere Buchtipps" und „BiBer Bibliothek" gleich
   groß sind.

   Warum das nötig ist, obwohl die ganze Spalte schon klebt: Sie klebt nur, solange der
   Haupttext neben ihr läuft. An seinem Ende wird sie hochgeschoben – gemessen am 05.08.:
   bei 2000px Scrollstand stand die Überschrift bei −399px (also draußen), die Kontaktbox
   darunter aber noch bei +129px im Bild. Genau verkehrt herum: Die Beschriftung geht als
   Erstes, das Beschriftete bleibt. Mit sticky bleibt „Weitere Buchtipps" oben stehen,
   solange von der Liste noch etwas zu sehen ist.

   Der Hintergrund ist Pflicht, kein Schmuck: Ohne ihn liefen die Karten sichtbar hinter der
   Schrift durch. Der negative Rand plus dasselbe Polster hält die Fläche randlos bis an die
   Spaltenkanten, ohne dass die Schrift springt. */
.page-aside .pagelist .pl-heading{position:sticky;top:5rem;z-index:2;
  margin:0 -.4rem .7rem;padding:.35rem .4rem;background:var(--canvas)}
.page-aside .pagelist .pl-list{gap:.5rem}
/* Eine Zeile je Eintrag: kleines Bild links, Titel rechts – wie ein Buchrücken im Regal.
   Bild fest 44px: Ein Cover in 2:3 ergibt damit 66px Höhe, gerade genug zum Wiedererkennen. */
/* ⚠️ align-items:start statt center: Unter dem Titel steht die Zeile „✓ angesehen", die
   IMMER Platz belegt (bei unbesucht nur farblos – anders geht es nicht, siehe .pl-gelesen).
   Mittig ausgerichtet hinge der Titel dadurch sichtbar zu hoch; oben ausgerichtet liest sich
   der Raum darunter als Luft. Der Zeilenabstand steht wieder auf .7rem – die extra Lücke
   neben dem Bild brauchte nur die erste Fassung, in der der Haken dort saß. */
.page-aside .pagelist .pl-item{grid-template-columns:44px minmax(0,1fr);
  grid-template-rows:auto;align-items:start;gap:.7rem;
  padding:.5rem 1.5rem .5rem .6rem;box-shadow:none}
.page-aside .pagelist .pl-item:hover{transform:none;box-shadow:none}
/* Der graue Winkel am rechten Rand: das Zeichen dafür, dass die ganze Zeile weiterführt.
   Dieselbe Rolle wie „weiterlesen" auf der großen Karte, nur ohne Platzbedarf.
   aria-hidden braucht es nicht: Ein Pseudoelement steht nicht im Baum, Screenreader lesen
   den Titel als Link – der sagt bereits alles.

   ⚠️ ABSOLUT positioniert, NICHT als dritte Rasterspalte. Als Grid-Item wurde daraus ein
   handfester Fehler: Ein Pseudoelement hat order:0 wie das Bild, der Textblock aber order:1 –
   damit rutschte der Text hinter den Winkel und landete beim Auto-Placement in der zweiten
   Zeile, in der 44px schmalen Bildspalte. Der Titel brach dann nach jedem zweiten Buchstaben
   um („Alles / übera / ll auf / einma / l"). Absolut positioniert kann das nicht passieren,
   und es gilt auch für Karten ohne Bild. Der Platz dafür steckt im padding-right oben. */
.page-aside .pagelist .pl-item::after{content:"›";position:absolute;right:.55rem;top:50%;
  transform:translateY(-50%);color:var(--muted);font-size:1.5rem;line-height:1;
  transition:color .15s}
.page-aside .pagelist .pl-item:hover::after{color:var(--accent-ink)}
.page-aside .pagelist .pl-media{order:0;align-self:center;border-radius:4px;aspect-ratio:2/3}
/* ⚠️ Die Abstände stehen HIER, nicht oben beim Merkzeichen: Diese Regel hat dieselbe
   Spezifität und steht weiter unten – ein „gap" weiter oben verliert also. Genau das ist am
   10.08. zweimal passiert (erst beim .pl-item, dann hier): Kreis und „angesehen" klebten
   aneinander und am Titel, obwohl oben Werte standen. column-gap trennt Haken und Wort,
   row-gap den Titel von der Zeile darunter. */
.page-aside .pagelist .pl-body{order:1;padding:0;column-gap:.5rem;row-gap:.5rem;min-width:0}
.page-aside .pagelist .pl-title{font-size:.98rem}
.page-aside .pagelist .pl-lead,.page-aside .pagelist .pl-more{display:none}
/* Hier BLEIBT die ganze Zeile anklickbar (Stretched Link). Im Hauptinhalt ist er am 06.08.2026
   entfallen, weil dort ein sichtbares „weiterlesen" steht und der Klick dorthin gehört – in der
   Spalte gibt es das nicht, nur den grauen Winkel. Ohne die Fläche wäre allein der Titeltext
   anklickbar; in einer Zeile von 44 Pixeln Höhe wäre das eine unnötig kleine Zielfläche
   (WCAG 2.5.8) und für den Finger ein Ärgernis.
   Der Winkel oben ist ein Pseudoelement der Karte und liegt damit UNTER dieser Fläche – er ist
   Zierde, kein Ziel, das ist richtig so. */
.page-aside .pagelist .pl-title a::after{content:"";position:absolute;inset:0}
/* Dieselbe Rücknahme wie bei den Teaser-Karten – siehe dort. Bereichslisten verlinken zwar
   immer auf eigene Seiten, aber die Fläche darf nicht davon abhängen, dass das so bleibt. */
.page-aside .pagelist .pl-title a[target="_blank"]::after{
  width:auto;height:auto;margin-left:0;background-color:transparent;
  -webkit-mask:none;mask:none}
/* Karte ohne Bild: keine graue Platzhalterfläche in einer 320px-Spalte – dort fiele sie als
   leerer Kasten auf, statt etwas auszurichten. Der Titel rückt an den linken Rand. */
.page-aside .pagelist .pl-item--nomedia{grid-template-columns:minmax(0,1fr)}
.page-aside .pagelist .pl-item--nomedia::before{content:none}
/* Blättern gehört in den Hauptinhalt, nicht ins Beiwerk: Eine Ziffernleiste in der Spalte
   würde die Adresse der ganzen Seite ändern und damit auch den Haupttext neu laden. */
.page-aside .pagelist .pl-pager{display:none}

@media print{
  .cta{border:1pt solid #999;background:#fff;color:#000;break-inside:avoid}
  .cta-title,.cta--kraeftig .cta-title{color:#000}
  /* ⚠️ HIER STAND `.cta-actions{display:none}` – „ein Knopf auf Papier ist nur ein Kästchen".
     Der Gedanke stimmt, die Umsetzung war eine Sackgasse (17.08.2026, von Stephan bemerkt):
     Mit dem Knopf verschwand auch sein ZIEL. Auf dem Ausdruck der Messengerberatung stand
     „dürfen wir uns auf unserer Teamseite vorstellen" – und nirgends, wo diese Seite ist.
     Überall sonst macht es die Website umgekehrt: Die Verweisliste und die Themen-Chips
     schreiben auf Papier ihre Adresse aus, gerade damit man sie abtippen kann.

     Jetzt bleibt der Knopf als TEXT stehen, nur ohne Knopf-Kleid – gefüllte Flächen und
     Umrisse sind Bildschirm-Sprache. Die Adresse setzt die allgemeine Link-Regel weiter
     unten von selbst dahinter, bei eigenen Seiten wie bei fremden; gemessen im Druckmodus:
     „Unser Team (/ueber-uns/team/)" bzw. „(https://…)".

     ⚠️ DIE FARBE MUSS AN BEIDEN REGELN STEHEN, auch an der für den zweiten Knopf. Sonst
     schlägt die Bildschirmregel `.cta--kraeftig .cta-actions a+a{color:var(--on-accent)}`
     durch – sie hat mit zwei Klassen und zwei Typen die höhere Spezifität als
     `.cta .cta-actions a`. Gemessen am Ausdruck der Startseite: Der zweite Knopf kam WEISS
     heraus, also unsichtbar auf weißem Papier. Am Bildschirm wäre davon nie etwas
     aufgefallen – dieselbe Spezifitätsfalle wie schon bei der Verweisliste. */
  .cta-actions{display:block;gap:0;margin-top:.3rem}
  .cta .cta-actions a{display:inline;padding:0;border:0;background:none;color:#000;
    font-weight:700;text-decoration:underline}
  /* Nicht Knopf an Knopf, sondern lesbar getrennt – zwei Handlungen werden zwei Zeilen. */
  .cta .cta-actions a+a{display:block;margin-top:.2rem;color:#000;background:none}
  /* Die Adresse ist Beiwerk, nicht Teil der Beschriftung: klein und grau wie bei den
     Themen-Chips und in der Verweisliste. `inline-block` ist dabei kein Schmuck, sondern
     der Griff, mit dem sie aus der Unterstreichung des Links herausfällt – ein Inline-
     Pseudoelement zieht die Linie des Elternteils sonst mit durch die ganze Adresse.
     ⚠️ Und dann braucht es den Abstand als margin: Das Leerzeichen, mit dem der content
     beginnt, wirft ein inline-block am Anfang weg – ohne die Zeile klebte die Adresse am
     Wort („Unser Team(/ueber-uns/team/)"). */
  .cta .cta-actions a::after{display:inline-block;margin-left:.35em;
    font-weight:400;font-size:.8em;color:#333}
  .ql-chips a,.ll-list a{border:1pt solid #bbb;box-shadow:none;background:#fff}
  .ll-list a::after{content:""}
  /* ⚠️ AUF PAPIER IST DIE ZEILE KEINE FLEXBOX MEHR (Issue #102, 12.08.2026).
     Am Bildschirm stehen Text und Zeichen NEBENEINANDER: links der Name, rechts der Pfeil.
     Auf Papier tritt an die Stelle des Pfeils die AUSGESCHRIEBENE ADRESSE – und die ist ein
     einziges langes Wort. In einer Flexbox nimmt sich dieses Wort die ganze Breite, und der
     Name daneben wird auf null gequetscht: „Land Salzburg – Elternberatung – Frühe Hilfen"
     (122 Zeichen Adresse) stand als Buchstabensäule über eine ganze Druckseite, ein Zeichen
     je Zeile. Gemessen: Name 0 × 1029 px. Von Stephan am 11.08. im Ausdruck gemeldet.
     Elf weitere Zeilen waren leicht betroffen (Name auf 2–8 Zeilen umgebrochen).
     Als BLOCK gelesen gibt es kein Nebeneinander mehr: Name und Anriss über die volle
     Breite, die Adresse als eigene Zeile darunter – dort, wo man sie abtippen kann. */
  .ll-list > li > a{display:block}
  /* Die Adress-Marke fällt auf Papier weg: Hinter dem Zeilentext steht ohnehin die VOLLE
     Adresse (Regel weiter oben), die Marke sagte dasselbe noch einmal in Kurzform.
     `display:none` ist hier unbedenklich – sie steckt in einer Spalten-Flexbox, nicht in
     einem Raster; die Grid-Falle (eine Spur bleibt reserviert) kann also nicht auftreten. */
  .ll-host{display:none}
  /* ⚠️ UND DER ZEILEN-LINK MUSS SEINE ADRESSE ZURÜCKBEKOMMEN. Die Bildschirm-Regel
     `.ll-list > li > a[target="_blank"]::after{content:none}` ist SPEZIFISCHER als die
     allgemeine Adress-Regel `.content a[href^="http"]::after` – ohne diese Zeilen hätten
     alle 34 fremden Zeilen im Ausdruck gar keine Adresse mehr. Gemessen, nicht vermutet:
     Der Fehler entstand erst durch das Umstellen auf die Marke und wäre am Bildschirm
     unsichtbar geblieben. Eine Klasse mehr, damit nicht die Reihenfolge entscheidet. */
  .content .ll-list > li > a[target="_blank"]::after{
    content:" (" attr(href) ")";display:inline;width:auto;height:auto;margin:0;
    background-color:transparent;-webkit-mask:none;mask:none;
    font-size:.8em;color:#333}
}

/* Fußzeile als eigene weiße Fläche mit rotem Abschlussstrich oben: sie schließt die Seite ab,
   statt einfach auszulaufen. Der Strich nimmt die Marke aus der Kopfleiste wieder auf –
   oben und unten dieselbe Klammer. */
.site-footer{border-top:4px solid var(--accent);margin-top:0;background:var(--surface)}
/* Breiter als die Textspalte: die Fußzeile trägt zwei Spalten mit Logo-Reihen und bräuchte
   sonst Umbrüche mitten in einer Reihe. Dieselbe Breite wie Kopfleiste und Mega-Menü. */
/* Großzügig statt gedrängt: die Fußzeile klebt nicht, sie darf also atmen. Vorher standen
   Menüzeile, Knöpfe und Logos so dicht beieinander, dass „Gefördert von" wie ein Nachsatz
   wirkte statt wie ein eigener Abschnitt. */
.site-footer-inner{max-width:var(--col-page);margin:0 auto;
  padding:3.2rem var(--pad-page-r) 2.8rem var(--pad-page);font-size:.94rem}
.site-footer p{margin:.25rem 0}
.footer-section{margin:0 0 1.6rem}
.footer-section:last-child{margin-bottom:0}
.footer-text{white-space:normal;color:var(--muted)}
/* Die Rechtsseiten-Zeile („Impressum | Datenschutz | …").
   Impressum und Datenschutz sind Pflichtangaben – sie müssen auffindbar sein, nicht nur
   vorhanden. Deshalb in normaler Textfarbe und -größe statt als graue Kleinschrift. */
.footer-menu .site-nav a{color:var(--ink);font-size:1rem;text-decoration:underline;
  text-underline-offset:.22em;text-decoration-thickness:1px}
.footer-menu .site-nav a:hover{color:var(--link);text-decoration-thickness:2px}
/* Der Trennstrich gilt NUR, wenn die Zeile über die volle Breite läuft (Abschnitt „voll", also
   direkt im Fußzeilen-Kasten). Steht sie in einer Spalte, wäre es ein halber Strich quer durch
   die Fußzeile – der sähe nach Versehen aus. Das Kind-Zeichen `>` macht genau diesen
   Unterschied, ohne dass die Vorlage davon wissen muss. */
.site-footer-inner > .footer-menu{padding-bottom:1.4rem;margin-bottom:1.8rem;
  border-bottom:1px solid var(--line)}
/* Zwei-Spalten-Raster: Abschnitte „volle Breite" stehen darüber, links/rechts nebeneinander.
   Am Handy wird daraus eine Spalte (Reihenfolge bleibt: links vor rechts). */
/* Bewusst NICHT halbe-halbe: links stehen ein Menü und zwei Knöpfe, rechts zwei Logo-Reihen.
   Bei 50/50 bekamen die Logos zu wenig Breite und mussten klein bleiben — dabei sind sie eine
   Förderauflage und sollen lesbar sein. 40/60 gibt ihnen den Platz, ohne dass die Knöpfe zu
   schmal werden (Vorbild: erwachsenenbildung-salzburg.at). */
.footer-grid{display:grid;grid-template-columns:2fr 3fr;gap:2rem 3rem;align-items:stretch}
.footer-col{min-width:0}
/* Die linke Spalte trägt die Handlungs-Knöpfe, die rechte Förderer UND Partner – rechts ist
   also deutlich mehr. Die Knöpfe standen zwischenzeitlich am FUSS der Spalte; dadurch klaffte
   über ihnen eine hohe Lücke, und die Fußzeile wirkte auseinandergefallen. Leerraum OBEN liest
   sich wie ein Fehler, Leerraum UNTEN wie Luft. Sie beginnen deshalb oben – dort, wo der Blick
   nach der Menüzeile ohnehin ankommt. */
.footer-col-left{display:flex;flex-direction:column;justify-content:flex-start}
/* Untereinander statt nebeneinander: zwei Knöpfe in einer schmalen Spalte werden sonst zu zwei
   Stummeln mit Umbruch mittendrin. Gestapelt und über die volle Spaltenbreite sind sie das,
   was sie sein sollen – das deutlichste Angebot der ganzen Fußzeile. */
.footer-col-left .footer-btn-row{flex-direction:column;align-items:stretch}
.footer-col-left .footer-btn-row > li{width:100%}
.footer-right{text-align:right}
.footer-right .footer-logo-row,.footer-right .footer-btn-row,
.footer-right .site-nav ul{justify-content:flex-end}
@media (max-width:720px){
  .footer-grid{grid-template-columns:1fr;gap:2rem}
  .footer-right{text-align:left}
  .footer-right .footer-logo-row,.footer-right .footer-btn-row,
  .footer-right .site-nav ul{justify-content:flex-start}
  /* Einspaltig gibt es kein „unten" mehr, an dem sich etwas ausrichten könnte. */
  .footer-col-left{display:block}
  /* Die Knöpfe über die volle Breite: nebeneinander wären sie am Handy zwei Stummel. */
  .footer-btn-row{flex-direction:column}
  .footer-btn-row > li{width:100%}
}
/* Trennstriche in Fußzeilen-Menüs („Impressum | Datenschutz"), rein dekorativ. */
.site-footer .site-nav li{display:flex;align-items:center;gap:1rem}
.site-footer .site-nav li+li::before{content:"|";color:var(--line)}

/* Handlungs-Knöpfe („Termin vereinbaren"): kräftige Fläche, optionales Symbol + Zweitzeile.
   Sie sind das WICHTIGSTE in der Fußzeile — wer bis hierher gelesen hat, will anrufen oder
   einen Termin. Deshalb größer als der übrige Text und deutlich gesetzt.
   `align-items:stretch` an der Reihe ist der ganze Trick, damit beide Knöpfe GLEICH HOCH sind:
   der eine trägt eine Zweitzeile (Öffnungszeiten), der andere nicht. Mit `center` wuchs der
   erste und der zweite blieb ein Stummel — nebeneinander sah das nach Versehen aus. */
.footer-btn-row{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;
  align-items:stretch;gap:.8rem}
.footer-btn-row > li{display:flex}
.footer-btn{display:inline-flex;align-items:center;gap:.8rem;text-decoration:none;width:100%;
  background:var(--accent);color:var(--on-accent);border-radius:var(--r);
  padding:1rem 1.35rem;line-height:1.3;font-size:1.02rem;box-shadow:var(--shadow-1)}
.footer-btn:hover{background:var(--accent-dark)}
.footer-btn:focus-visible{outline:3px solid var(--ink);outline-offset:2px}
.footer-btn-ico{width:1.65rem;height:1.65rem;flex:0 0 auto}
.footer-btn-text{display:flex;flex-direction:column;justify-content:center;text-align:left}
.footer-btn-label{font-weight:700}
.footer-btn-sub{font-size:.88rem;opacity:.92}

/* Logo-Reihe (Partner/Förderer bzw. eigenes Logo). Logos werden NIE beschnitten, sondern in eine
   feste Höhe eingepasst (contain) – bei Wortmarken ist das Seitenverhältnis heilig. Weißer
   Untergrund, weil Logos meist für hellen Grund gemacht sind (trägt auch im Dunkelmodus). */
.footer-section-title{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1rem;font-weight:600;
  margin:0 0 .75rem;color:var(--muted);text-transform:uppercase;letter-spacing:.03em}
/* ⚠️⚠️ EINE LOGO-REIHE NORMIERT DIE HÖHE, NICHT DIE BREITE (Issue #107, 17.08.2026).
   Vorher war das ein Raster aus gleich breiten Zellen (`repeat(auto-fit,minmax(150px,1fr))`) –
   mit der Begründung, gleich breite Zellen brächen sauber auf 4 → 2 → 1 um, während flex-wrap
   bei verschieden breiten Logos ein 3+1 erzeugt, das wie ein Versehen aussieht.

   Das war der falsche Kompromiss, und am 17.08. pixelweise gemessen, warum: Wenn alle Zellen
   gleich breit sind, entscheidet allein das SEITENVERHÄLTNIS, wie hoch ein Logo wird. Das
   EU-Logo (4,55:1) wurde dadurch 38 px hoch, das Land Salzburg (2,12:1) 79 px – in derselben
   Reihe, bei derselben Zellbreite. Die Reihe sah beliebig aus, und die blaue EU-Flagge darin
   war nur 32 px hoch, wo die höchste fremde Marke 49 px hatte.

   Logos werden auf gleiche HÖHE gebracht – so macht es jeder Förderstreifen, und so ist die
   Reihe auch wirklich eine Reihe. Der Umbruch ist dann ungleichmäßig, aber ehrlich: Er folgt
   den Logos und nicht einem Raster, das sie verformt. */
/* ⚠️ Die WAAGRECHTE Lücke ist kleiner als die senkrechte (1rem gegen 1.4rem) – seit Stephans
   Wunsch, dass alle vier Fördererlogos in EINE Zeile passen (17.08.2026). Bei vier Logos zählen
   drei Lücken: 1.5rem kosteten 72 px der knappen Spaltenbreite, 1rem kosten 48. Senkrecht ist der
   Platz dagegen umsonst, und dort trennt die größere Lücke die Zeilen besser. */
.footer-logo-row{list-style:none;margin:0;padding:0;
  display:flex;flex-wrap:wrap;align-items:center;gap:1.4rem 1rem}
/* max-width als Notbremse: ein einzelnes sehr breites Logo darf die Seite nicht seitlich
   schiebbar machen. min-width:0 bleibt, damit ein Flex-Element schrumpfen DARF. */
.footer-logo{min-width:0;max-width:100%}
/* ⚠️ KEIN `margin-right:auto` mehr. Im Raster rückte es das Bild in seiner Zelle nach links;
   in einer Flexbox würde dieselbe Zeile die Nachbarn wegschieben – aus der Reihe würde ein
   Logo pro Zeile. Gebraucht wird es nicht mehr: Das Element ist jetzt so breit wie sein Bild. */
/* --logo-pad steht als Rolle da, weil die EU-Rechnung weiter unten sie BRAUCHT: --logo-h ist
   die Kachelhöhe inklusive Polsterung (box-sizing:border-box), das Bild darin ist also
   entsprechend kleiner. Wer hier die Polsterung ändert, ändert die Rechnung mit.
   ⚠️ Von .4rem auf .25rem verkleinert (17.08.2026): Die Polsterung kostete bei vier Logos
   4 × 13 px = 52 px WAAGRECHTE Breite in einer Spalte, in der jedes Pixel über „eine Zeile oder
   zwei" entscheidet – und zu sehen war sie nicht: Der Fuß ist im Hellmodus selbst weiß, die
   weiße Fläche hinter dem Logo also unsichtbar. Sie bleibt trotzdem stehen, denn im DUNKELMODUS
   trägt sie: Logos sind für hellen Grund gemacht. */
.footer-logo-row{--logo-pad:.25rem}
.footer-logo-img{display:block;width:auto;max-width:100%;object-fit:contain;
  background:#fff;border-radius:6px;padding:var(--logo-pad);height:var(--logo-h)}
/* Fördergeber-Logos sind eine Auflage, keine Zierde: sie müssen lesbar sein. Die Schriftzüge
   darin („Bundesministerium für Frauen, Wissenschaft und Forschung") waren bei 52 px nur noch zu
   erahnen. Die Höhe steht jetzt als EINE Zahl je Gruppe – vorher waren es zwei Grenzen (Höhe UND
   Breite), die sich gegenseitig aushebelten: In der Praxis gewann immer die Breite, die
   max-height von 92 px wurde nie erreicht. */
/* ⚠️ --logo-h ist die Höhe der KACHEL, die Polsterung eingeschlossen (box-sizing:border-box).
   Beim ersten Anlauf standen hier 64px – gemessen kam dabei ein 51px hohes Bild heraus, und die
   Fördererlogos wurden KLEINER als vorher (Marke 30 statt 41 px). 92px ist derselbe Wert, den
   vorher `max-height` trug: Damit ist jedes Logo mindestens so groß wie zuvor (Bild 79 px,
   Marken 47–55 px statt 41–55 px) – und die EU-Flagge kommt auf 79 px statt 32 px. */
/* ⚠️ DIE HÖHE IST HIER EINE PLATZFRAGE, KEINE GESCHMACKSFRAGE (Stephan am 17.08.2026: „alle vier
   Logos wieder in EINE Zeile … du kannst die Logos ruhig etwas kleiner machen, CSS meine ich").
   Der Streifen sitzt in der RECHTEN Fußzeilen-Spalte, und die ist schmal: gemessen 816 px bei
   1600er Fenster, 744 bei 1440, 650 bei 1280, 514 bei 1024.
   Zum Vergleich: Auf der Onepage passt alles in eine Zeile, weil der Streifen dort ein eigener
   Abschnitt über die GANZE Seitenbreite ist (Bootstrap-Container 1140 px) und dort 64 px hohe
   Bilder ohne Polsterung stehen.
   Die Summe der vier Logos beträgt rund 10,7 × Bildhöhe (die Seitenverhältnisse 4,55 / 2,47 /
   2,12 / 2,38 plus das größere EU-Maß), dazu Polsterung und drei Lücken. GEMESSEN, nicht
   gerechnet – die Zeilenzahl wurde bei zwölf Fensterbreiten gezählt:
     --logo-h 70px -> 744 px Streifen  => eine Zeile ab 1500
     --logo-h 61px -> 648 px Streifen  => eine Zeile ab etwa 1250
   Darunter sind es zwei Zeilen. Eine Zeile auch bei 1024 zu erzwingen hieße Bildhöhe ~40 px und
   Marken um 25 px – dann kann man die Schriftzüge nicht mehr lesen, und die Logos sind eine
   Auflage, keine Zierde.
   ⚠️ Die Stufe liegt bei 1500px und NICHT bei 1400: Bei 1440 (ein sehr verbreitetes
   Notebook-Format) ist die Spalte 744 px breit – genau so viel, wie der Streifen bei 70 px
   braucht. Gleich groß kippt durch Rundung, und der Streifen brach doch um. Gemessen, nicht
   überlegt: mit der Stufe bei 1400 meldete 1440 zwei Zeilen. */
.footer-logos-sm{--logo-h:70px}
.footer-logos-lg{--logo-h:100px}
@media (max-width:1500px){
  .footer-logos-sm{--logo-h:61px}
  .footer-logos-lg{--logo-h:88px}
}
/* Einspaltige Fußzeile (ab hier ist die Reihe wieder breit, aber das Fenster schmal): Ohne eine
   kleinere Stufe griffe `max-width:100%` am breiten EU-Verbund, und `object-fit:contain` legte
   das Logo mit weißen Balken in eine zu hohe Kachel – genau der Fehler, den die Reihe vorher
   hatte. Lieber alle Logos eine Stufe kleiner: Das Verhältnis untereinander bleibt gewahrt, und
   die EU-Auflage gilt weiter. */
@media (max-width:720px){
  .footer-logos-sm{--logo-h:66px}
  .footer-logos-lg{--logo-h:94px}
}
@media (max-width:420px){
  .footer-logos-sm{--logo-h:56px}
  .footer-logos-lg{--logo-h:80px}
}

/* ---------------- Das EU-Emblem (Förderauflage, Issue #107) ----------------
   Vorgabe der EU: Stehen Logos in EINER Reihe, muss die blaue Flagge so hoch sein wie das
   höchste Logo der Reihe. Gemeint ist die FLAGGE – nicht die Bilddatei, die daneben noch den
   Schriftzug „Kofinanziert von der Europäischen Union" trägt.

   Deshalb wird das so markierte Bild GRÖSSER gesetzt als die Reihenhöhe – so viel, dass die
   FLAGGE darin das Zielmaß erreicht. Zwei GEMESSENE Zahlen steuern das:

   • --eu-flagge-anteil = wie viel der BILDHÖHE die Flagge einnimmt. 0,85 ist an der gelieferten
     Datei ermittelt (546×120, Flagge 154×102 – pixelweise, nicht geschätzt).
     ⚠️ Wird die EU-Datei je getauscht oder beschnitten, ist DIESE Zahl nachzumessen. Sonst wird
     die Flagge still zu klein, und niemand merkt es.

   • --eu-ziel = wie hoch die Flagge werden soll, als Anteil der BILDHÖHE der Reihe.
     ⚠️ WARUM NICHT 1 (Stephan am 17.08.2026, nachdem er es gesehen hat: „viel zu groß"):
     Mit 1 wird die Flagge so hoch wie die Bildhöhe der Reihe – und damit anderthalbmal so hoch
     wie die höchste SICHTBARE Marke. Der Grund liegt in den anderen Dateien: Sie haben 32–41 %
     leere Fläche eingebacken, und zwar UNTERSCHIEDLICH viel. Bei gleicher Bildhöhe messen ihre
     Marken nur 59 % (Ministerium), 62 % (Land) und 68 % (wissen:stadt) davon. Die Auflage lautet
     „so hoch wie das höchste Logo" – nicht „so hoch wie dessen Kachel".
     Der höchste gemessene Anteil ist wissen:stadt mit 134/196 = 0,684. Hier stehen **0,70** –
     ⚠️ und die zwei Hundertstel sind Absicht: Mit genau 0,684 kam die Flagge am Handy durch
     RUNDUNG auf 33 px, wo wissen:stadt 34 px hatte. Ein Pixel, den kein Auge sieht – aber eine
     Auflage darf nie darunter liegen. 0,70 ist der kleinste Wert, der auch nach jeder Rundung
     trägt; am großen Bildschirm ist die Flagge damit 55 statt 54 px, also weiterhin „so hoch wie
     das höchste Logo".
     ⚠️ Die Zahl ist an den HEUTIGEN Dateien gemessen. Kommt ein Logo dazu oder wird eines
     beschnitten, gehört sie nachgemessen (Anteil = sichtbare Markenhöhe / Bildhöhe der Datei).
     Wer ohne Messung auf der sicheren Seite sein will, setzt 1: Dann ist die Auflage garantiert
     erfüllt, die Flagge aber sichtbar größer als ihre Nachbarn.

   Welches Bild das Emblem ist, sagt das Häkchen in der Fußzeilen-Verwaltung (Footer.php) – die
   Website kann es nicht sehen.

   ⚠️ Die Polsterung MUSS in der Rechnung stehen, weil --logo-h die KACHEL meint: erst das Bild
   aus der Kachel herausrechnen, dann skalieren, dann die Polsterung wieder aufschlagen. Ohne das
   fehlen der Flagge rund 2 px – wenig, aber die Auflage ist ein Maß und kein Gefühl. */
.footer-logo-row{--eu-flagge-anteil:.85; --eu-ziel:.70}
.footer-logo--eu .footer-logo-img{
  height:calc((var(--logo-h) - 2 * var(--logo-pad)) * var(--eu-ziel) / var(--eu-flagge-anteil)
              + 2 * var(--logo-pad))}
.footer-logo a{display:block}

/* ---------------- Förderband unter dem Aufmacher (nur Startseite) ----------------
   Auflage der Geldgeber: Die Logos müssen ohne Scrollen zu sehen sein. Im Fuß ist das für
   jemanden, der nur die Startseite überfliegt, nicht erfüllt. Der Streifen zeigt deshalb
   DIESELBEN Abschnitte ein zweites Mal (Häkchen je Abschnitt, Footer::renderHero) – keine
   zweite Liste, die getrennt gepflegt werden müsste.

   Eigene Fluchtlinie statt .page-shell: Er sitzt zwischen Aufmacher und Inhalt und soll in
   derselben Flucht stehen wie der Text darunter, ohne dessen oberen Abstand zu erben. */
.hero-band{max-width:var(--col-page);margin:0 auto;
  padding:1.15rem var(--pad-page-r) 0 var(--pad-page)}
.hero-band-inner{display:flex;flex-wrap:wrap;align-items:flex-end;gap:.7rem 2.4rem;
  padding-bottom:1.15rem;border-bottom:1px solid var(--line,rgba(0,0,0,.12))}
.hero-band .footer-section{margin:0}
.hero-band .footer-section-title{font-size:.7rem;letter-spacing:.07em;margin:0 0 .4rem;
  text-transform:uppercase;color:var(--muted)}
/* Kleiner als im Fuß – dort steht die Förderzeile ausführlich, hier geht es nur darum, DASS
   die Logos zu sehen sind (Stephan, 18.08.). */
.hero-band .footer-logo-row{--logo-h:44px;--logo-pad:0px;gap:.5rem 1.3rem}
/* Ohne weiße Kachel: Auf dem hellen Grund tragen sich die Logos selbst. */
.hero-band .footer-logo-img{background:transparent;padding:0;border-radius:0}
/* Im Dunkelmodus bekommen sie die Kachel zurück: Schwarze Schriftzüge (Bundesministerium,
   Land Salzburg) wären auf dunklem Grund sonst unlesbar – und eine Auflage, die man nicht
   lesen kann, ist keine erfüllte Auflage. */
:root[data-theme="dark"] .hero-band .footer-logo-row{--logo-pad:.25rem}
:root[data-theme="dark"] .hero-band .footer-logo-img{
  background:#fff;border-radius:6px;padding:var(--logo-pad)}
/* Steht das Band da, bringt der Inhaltsbereich darunter seinen eigenen oberen Abstand noch
   einmal mit: gemessen 106 px zwischen Bandlinie und erstem Baustein, waehrend zwei Bausteine
   im Text nur 53 px auseinanderstehen (Kennzahlen -> "Unser Angebot", Stephans Maszstab vom
   18.08.). Der erste Baustein bringt seinen Abstand selbst mit - der Rahmen darf ihn also
   nicht verdoppeln. Am Handy dieselbe Rechnung: 64 -> 32 px. */
.hero-band + .page-shell{padding-top:0}

@media (max-width:720px){
  .hero-band{padding-top:.9rem}
  .hero-band-inner{gap:.6rem 1.4rem;padding-bottom:.9rem}
  .hero-band .footer-logo-row{--logo-h:34px;gap:.4rem .9rem}
}
.footer-logo a:focus-visible{outline:3px solid var(--accent-ink);outline-offset:3px;border-radius:8px}
.muted{color:var(--muted)}

/* „Diese Seite hat noch keinen Inhalt." erscheint NUR in der Entwurfs-Ansicht und ist eine
   Nachricht an die Redaktion, nicht ans Publikum. Darum gedaempft und kursiv - kein Satz, den
   man fuer Seitentext haelt. (Sichtbarkeitsregel in public_page.php / public_panel.php) */
.empty-note{color:var(--muted);font-style:italic}

@media (max-width:560px){
  body{font-size:1rem}
  h1{font-size:1.6rem}
}

/* ---------------- Knöpfe + Seitenfuß (Drucken / Teilen) ----------------
   Drucken und Teilen stehen am ENDE des Artikels, nicht davor: sie sind Handlungen NACH dem
   Lesen. Oben stand vorher eine bunte Knopfleiste zwischen Überschrift und erstem Satz –
   genau dort, wo das Auge den Einstieg in den Text sucht (Muster stadt-salzburg.at). */
.act-btn{display:inline-flex;align-items:center;gap:.4rem;background:var(--accent);
  color:var(--on-accent);border:0;border-radius:999px;padding:.55rem 1.1rem;font-size:1rem;
  cursor:pointer;font-family:inherit;text-decoration:none}
.act-btn:hover{background:var(--accent-dark)}
/* Leiser Knopf: gleiche Form, aber ohne Farbfläche – für Nebenhandlungen wie „Drucken". */
.act-ghost{background:var(--surface);color:var(--ink);border:1px solid var(--line)}
.act-ghost:hover{background:var(--soft);border-color:var(--accent-ink);color:var(--accent-ink)}
/* „Einfache Sprache" ist ein Angebot, keine Hauptsache: heller Umriss statt kräftiger Fläche.
   Eingeschaltet (aria-pressed) kippt er auf die volle Fläche – dann IST er der aktive Zustand. */
.act-lang{background:var(--surface);color:var(--ink);border:1px solid var(--line)}
.act-lang::before{content:"◔";color:var(--accent-ink);font-weight:700}
.act-lang:hover{background:var(--soft);border-color:var(--ink)}
.act-lang[aria-pressed="true"]{background:var(--bar-bg);color:var(--bar-fg);border-color:var(--bar-bg)}
.act-lang[aria-pressed="true"]::before{color:var(--bar-fg)}

.page-foot{display:flex;flex-wrap:wrap;align-items:center;gap:.6rem 1rem;
  margin-top:var(--band);padding-top:1.2rem;border-top:1px solid var(--line)}
.share-group{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem;margin-left:auto}
/* „Seite teilen:" trägt seit Issue #108 zusätzlich .nur-hoerbar – es steht nur noch für Ohren
   da. Farbe und Größe bleiben hier stehen (sie kosten nichts) und wirken sofort wieder, falls
   die Beschriftung je zurückkommt. ⚠️ Die Regel darf nicht `position:static` o. Ä. setzen: sie
   steht WEITER unten in dieser Datei als .nur-hoerbar und würde das Verstecken aufheben. */
.share-label{color:var(--muted);font-size:.9rem}
.share-link{display:inline-flex;align-items:center;background:var(--surface);color:var(--ink);
  border:1px solid var(--line);border-radius:999px;padding:.4rem .8rem;font-size:.9rem;
  text-decoration:none;cursor:pointer;font-family:inherit}
.share-link:hover{border-color:var(--accent-ink);color:var(--accent-ink)}
@media (max-width:640px){ .share-group{margin-left:0;width:100%} }

/* Nur im Ausdruck sichtbare Elemente (Briefkopf/Fußzeile) am Bildschirm ausblenden. */
.print-only{display:none}

/* ------------------------------- Druck / PDF (Infoblatt) ------------------------------- */
@media print{
  /* Laufende Fußzeile auf JEDEM Blatt (Issue #50). Wer einen mehrseitigen Ausdruck aus der
     Hand legt, bringt die Blätter sonst durcheinander und merkt es beim Lesen nicht.
     Rechts die Zählung, links wann gedruckt wurde, in der Mitte von wem.

     Das sind echte @page-Randkästen, keine nachgebaute Fußzeile im Dokument. Nachgemessen am
     2026-07-30 mit Edge 150: die Kästen erscheinen auf allen Blättern, counter(pages) liefert
     die Gesamtzahl, und CSS-Variablen erreichen den Seiten-Kontext – auch solche, die
     JavaScript erst zur Laufzeit setzt. Deshalb kommen Datum und Name über Variablen herein:
     ein <style>-Block mit den Werten wäre an der CSP gescheitert.

     Ohne JavaScript bleiben die beiden Variablen leer. `content` ist dann eine leere
     Zeichenkette, der Kasten entsteht gar nicht erst – die Seitenzählung rechts steht aber
     trotzdem da, denn die kann CSS allein. Schlechter als vorher wird es also nie.

     Der untere Rand ist von 16 auf 18mm gewachsen: darunter liegt jetzt die Fußzeile. */
  @page{
    margin:16mm 14mm 18mm;
    @bottom-left  { content:var(--druck-datum,""); font-family:Arial,sans-serif; font-size:8pt; color:#555; }
    @bottom-center{ content:var(--druck-firma,""); font-family:Arial,sans-serif; font-size:8pt; color:#555; }
    @bottom-right { content:"Seite " counter(page) " / " counter(pages);
                    font-family:Arial,sans-serif; font-size:8pt; color:#555; }
  }
  .no-print{display:none !important}
  .print-only{display:block}
  html,body{background:#fff;color:#000;font-size:12pt}
  .site-main{max-width:100%;margin:0;padding:0}
  .page-shell{max-width:100%;margin:0;padding:0}
  .lead-hero{max-width:100%;padding:0}
  .page-head{margin-bottom:.8rem}
  h1::after{display:none}                 /* goldener Zierstrich ist Bildschirm-Schmuck */
  .page-foot{display:none}
  /* Sprungmarken sind auf Papier tote Knöpfe: man kann sie nicht antippen, und als
     Inhaltsverzeichnis taugen sie auf einem ein- bis zweiseitigen Infoblatt nicht. */
  .page-anchors{display:none}
  /* Auf Papier immer untereinander: Seitenspalte unter den Hauptinhalt, ohne Karten-Optik. */
  .page-layout--sidebar.has-aside{display:block}
  /* position:static ausdrücklich zurücknehmen: eine klebende Spalte (Issue #40) würde auf dem
     Papier auf der ersten Seite festfrieren. */
  .page-aside{background:#fff;border:0;padding:0;margin-top:1rem;font-size:inherit;
    position:static}

  /* Briefkopf. Seit 2026-08-04 das Logo statt des Schriftzugs; 14mm Höhe entspricht in etwa
     den 18pt, die der Schriftzug hoch war, und lässt dem Titel darunter denselben Platz.
     print-color-adjust: sonst sparen manche Browser das satte Rot des Punktes weg. */
  .print-head{border-bottom:2.5pt solid #E2001A;padding-bottom:6pt;margin-bottom:14pt}
  .print-logo{display:block;height:14mm;width:auto;
    -webkit-print-color-adjust:exact;print-color-adjust:exact}

  h1{color:#000;font-size:20pt}
  h2,h3{color:#000}
  a{color:#000;text-decoration:none}
  /* Links auf Papier ausschreiben (Papier ist nicht klickbar).
     Die Adresse bleibt AM STÜCK. Vorher stand hier word-break:break-all – das brach die
     Adresse an beliebiger Stelle um, gern direkt hinter einem Punkt („…studienplattform.a /
     t/"). Wer die Adresse abtippt, liest den Punkt am Zeilenende dann als Satzende und landet
     nirgends. Passt die Adresse nicht mehr in die Restzeile, rutscht sie als Ganzes in die
     nächste; eine Spur kleiner gesetzt, damit auch lange Adressen die Spaltenbreite halten.

     ⚠️ ABER NICHT MEHR MIT `white-space:nowrap` (Issue #102, 12.08.2026). Ein hartes „nie
     umbrechen" gilt auch dann noch, wenn die Adresse breiter ist als die ganze Druckseite –
     dann läuft sie über den Rand hinaus ins Nichts, und in einer Flexbox quetscht sie
     obendrein den Text daneben auf null (die Buchstabensäule der Verweisliste, siehe dort).
     `overflow-wrap:anywhere` sagt dasselbe eine Spur schwächer: Umbrochen wird ERST, wenn das
     Wort allein nicht in eine volle Zeile passt. Kurze und mittlere Adressen bleiben damit
     unverändert am Stück und rutschen als Ganzes weiter – nur die eine 122 Zeichen lange
     Landes-Adresse bricht, und das ist die einzige Alternative zum Abschneiden. */
  /* ⚠️ Das Extern-Symbol (Issue #93) muss auf Papier ausdrücklich zurückgenommen werden – und
     zwar die MASKENFLÄCHE, nicht nur der Inhalt. Die Regeln gleich darunter schreiben die
     Adresse in GENAU DASSELBE ::after; ohne diese Zeilen stünde sie in einem 0,68 em kleinen,
     eingefärbten Kästchen. Auf Papier sagt das Symbol ohnehin nichts: dass ein Link nach außen
     führt, verrät dort die ausgeschriebene Adresse. */
  a[target="_blank"]::after{
    display:inline;width:auto;height:auto;margin-left:0;
    background-color:transparent;-webkit-mask:none;mask:none}

  /* ⚠️ `.lead-hero` steht überall mit: Der Bild-Banner liegt VOR .page-shell und damit
     außerhalb von .content – die Regeln hier hätten ihn nie erfasst. Sein Knopf war auf
     Papier ein Wort ohne Ziel (17.08.2026, zusammen mit dem Handlungsband behoben). */
  .content a[href^="http"]::after,
  .content a[href^="/"]:not([data-print-url])::after,
  .content a[data-print-url]::after,
  .lead-hero a[href^="http"]::after,
  .lead-hero a[href^="/"]:not([data-print-url])::after,
  .lead-hero a[data-print-url]::after{
    font-size:.8em;color:#333;
    white-space:normal;word-break:normal;overflow-wrap:anywhere;hyphens:none}
  .content a[href^="http"]::after,
  .content a[href^="/"]:not([data-print-url])::after,
  .lead-hero a[href^="http"]::after,
  .lead-hero a[href^="/"]:not([data-print-url])::after{content:" (" attr(href) ")"}
  .lead-hero a[data-print-url]::after{content:" (" attr(data-print-url) ")"}
  /* Interne Verweise mit voller Adresse: site.js hängt sie beim Druck-Vorbereiten an. Ohne
     JavaScript greift die Zeile darüber und schreibt wenigstens den Pfad. */
  .content a[data-print-url]::after{content:" (" attr(data-print-url) ")"}

  /* ---- Verlinkte Kennzahl-Kachel auf Papier (Issue #106) ----
     Die Adresse schreibt die Regel darüber ins ::after des <a> – das genügt, die Kachel ist
     als Knopf also versorgt. WEG muss aber das Zeichen am LABEL:
       • „›" sagt auf Papier nichts. Darunter steht die ausgeschriebene Adresse.
       • Das Extern-Kästchen ist die DOKUMENTIERTE FALLE dieses Blattes, nur an einer neuen
         Stelle: Die allgemeine Rücknahme oben trifft `a[target="_blank"]::after`, mein Zeichen
         sitzt aber am `.stat-label` – ein eingefärbtes Maskenkästchen blieb also mitten im
         Text stehen. Im Druckabzug vom 17.08.2026 gesehen, nicht vermutet.
     ⚠️ `.content` MUSS davorstehen. Ohne es hätte diese Regel zwei Klassen, die
     Bildschirm-Regel `.stats > a[target="_blank"] .stat-label::after` aber zwei plus ein
     Merkmal – sie würde gewinnen, und der Fall „fremdes Ziel" blieb ungeheilt.
     Maße und Maske werden mit zurückgesetzt: die Vorsichtsmaßnahme, die dieses Blatt an jeder
     vergleichbaren Stelle trifft, falls `content` je zurückgewonnen wird. */
  .content .stats > a .stat-label::after,
  .content .stats > a[target="_blank"] .stat-label::after{
    content:none;display:inline;width:auto;height:auto;margin:0;
    background-color:transparent;-webkit-mask:none;mask:none}

  /* Karten mit Stretched Link (Bereichsliste, Teaser-Karten): Die Trefferfläche liegt im ::after
     – `content:""` plus `position:absolute; inset:0` über der ganzen Karte. Die Regeln oben
     schreiben die Adresse in GENAU DASSELBE ::after; sie blieb damit absolut positioniert und
     legte sich als Textblock über die Karte: oben links beginnend, quer über das Symbolbild und
     am Kartenrand abgeschnitten (von Stephan im Ausdruck gemeldet).
     Auf Papier ist eine Karte keine Trefferfläche – also zurück in den Textfluss. Die Adresse
     steht dann als eigene Zeile UNTER dem Kartentitel, wo man sie abtippen kann.
     Steht bewusst NACH den Regeln oben und mit einer Klasse mehr, damit die Reihenfolge im
     Stylesheet nicht darüber entscheidet, welche Regel gewinnt. */
  /* font-weight zurücknehmen: Das ::after sitzt IM Titel-<a> und erbte damit die fette Oswald
     der Überschrift – die Adresse las sich wie eine zweite Titelzeile statt wie eine Angabe. */
  .content .pagelist .pl-title a[href]::after,
  .content .teaser .teaser-title a[href]::after{
    position:static;inset:auto;display:block;margin-top:.1rem;font-weight:400}
  /* ⚠️ UND DER INHALT MUSS HIER NOCH EINMAL STEHEN – sonst bleibt die Karte im echten
     Ausdruck ohne Adresse (17.08.2026 gemessen, Startseite: „Persönliche Beratung" und
     zwei weitere). Der Grund ist eine Spezifitätsfalle mit doppeltem Boden:
       Bildschirm  `.teaser.has-link .teaser-title a::after`      -> drei Klassen
       Druck       `.content a[data-print-url]::after`            -> zwei
     Die Bildschirmregel gewinnt und setzt content auf "" (die Trefferfläche).
     Warum das nie auffiel: OHNE JavaScript greift `…a[href^="/"]:not([data-print-url])`,
     und das :not() zählt mit – drei, also gewinnt der Druck. Die Adresse war im Prüfstand
     also da und fehlte nur dort, wo es zählt: auf dem Papier eines echten Browsers, der
     `beforeprint` auslöst und data-print-url setzt. Wer den Druck ohne dieses Ereignis
     misst, sieht den Fehler nie. */
  .content .pagelist .pl-title a[data-print-url]::after,
  .content .teaser .teaser-title a[data-print-url]::after{
    content:" (" attr(data-print-url) ")"}
  .content .pagelist .pl-title a[href]:not([data-print-url])::after,
  .content .teaser .teaser-title a[href]:not([data-print-url])::after{
    content:" (" attr(href) ")"}

  /* ---- Bereichslisten auf Papier: Text statt Sujet ----
     Die Symbolbilder sind Schmuck, kein Inhalt. Wer eine solche Liste ausdruckt – in der
     Beratung oder für Mitarbeitende – braucht die Textauskunft: Titel, Anriss, Adresse. Der
     Bildkasten kostete dagegen ein Drittel der Kartenhöhe.
     Mit dem Bild muss auch der Ausricht-Platzhalter der bildlosen Karten weg (::before): Er ist
     nur dafür da, dass bebilderte und unbebilderte Karten am Bildschirm auf gleicher Höhe
     beginnen. Ohne Bilder wäre er ein grauer Kasten ohne Aufgabe. */
  .pagelist .pl-media{display:none}
  .pagelist--kacheln .pl-item--nomedia::before{content:none}
  /* Einspaltig statt Raster – wie bei den Teaser-Karten. Das Raster zwingt alle Karten einer
     Zeile auf die Höhe der größten und hinterlässt auf Papier große weiße Flächen. */
  .pl-list{display:block}
  .pl-item{break-inside:avoid;margin-bottom:.4rem;border:1pt solid #bbb;box-shadow:none}
  .pl-item:hover{transform:none;box-shadow:none}
  .pl-body{padding:.5rem .7rem}
  /* „weiterlesen ›" ist ein Klick-Hinweis. Auf Papier kann man nicht klicken – und die Adresse
     steht jetzt unter dem Titel. Dieselbe Überlegung wie beim Plus/Minus des Akkordeons. */
  .pl-more{display:none}

  /* ---- Bereichsliste IN DER SEITENSPALTE auf Papier ----
     Von Stephan am 05.08.2026 an einem Ausdruck gemeldet: Jeder Kartentitel zerfiel in
     Einzelwörter mit Trennstrichen („Alles / über- / all auf / ein- / mal"), die Karte war
     dreimal so hoch wie nötig.

     Die Ursache ist NICHT die Silbentrennung, sondern eine alte Bekannte (gemessen am
     06.08., A4 in der Druck-Emulation): Die kompakte Spaltenform ist ein Raster aus
     `44px minmax(0,1fr)`. Die Regel `.pagelist .pl-media{display:none}` weiter oben nimmt
     das Bild heraus – **ein Grid-Element mit display:none belegt keine Spalte mehr**, die
     reservierte 44px-Spalte bleibt aber stehen. Der Textblock rutscht per Auto-Platzierung
     hinein und muss sich in 44 Pixel quetschen. Gemessen: Titelbreite 583px am Bildschirm,
     **44px** auf Papier; Titelhöhe 20px gegen 155px; Karte 84px gegen 176px.

     Warum die Druck-Regel `.pagelist--liste .pl-item{grid-template-columns:1fr}` das nicht
     schon erledigt: Sie trägt ZWEI Klassen, die Spalten-Regeln tragen DREI – und die
     gewinnen auch im Druck. Deshalb stehen hier ausdrücklich drei.

     Die Antwort ist nicht ein anderes Raster, sondern GAR KEINS: Auf Papier ist „Weitere
     Buchtipps" eine Aufzählung. Karte, Trefferfläche und Winkel haben dort keine Aufgabe –
     man kann nichts davon antippen. Ein Titel je Zeile, die Adresse dahinter (die schreibt
     die Link-Regel ohnehin aus), fertig. */
  .page-aside .pagelist .pl-item{display:block;padding:.1rem 0;border:0;margin-bottom:.2rem}
  .page-aside .pagelist .pl-body{padding:0}
  /* Der graue Winkel ist das Papier-Gegenstück zu „weiterlesen" – und genauso sinnlos. */
  .page-aside .pagelist .pl-item::after{content:none}
  /* Der rote Streifen am neuesten Beitrag: auf Papier eine Farbe, die viele Drucker nicht
     bringen, an einer Stelle, die dann nur ein Einzug wäre. */
  .page-aside .pagelist .pl-item--neu{border-left:0;padding-left:0}
  /* Die Überschrift der Spalte klebt am Bildschirm (sticky). Auf Papier fröre sie auf dem
     ersten Blatt fest – dieselbe Falle wie bei der Spalte selbst weiter oben. */
  .page-aside .pagelist .pl-heading{position:static;margin:0 0 .3rem;padding:0;background:none}

  /* Akkordeons werden per JS aufgeklappt; Rahmen dezent. */
  .accordion details{border:1pt solid #bbb;background:#fff;break-inside:avoid}
  /* Auf Papier ist jedes Fach offen – ein Plus/Minus wäre dort eine Lüge. */
  .accordion .acc-sign{display:none}

  /* Bild-Banner auf Papier: kein Overlay/Weiß, Bild oben, Text darunter in Schwarz. */
  .hero{color:#000;display:block;aspect-ratio:auto;min-height:0;border-radius:0;margin:.6rem 0}
  /* Randlos gibt es auf Papier nicht – dort ist der Rand der Seitenrand. Die Regel muss
     genauso „schwer" sein wie die Bildschirm-Regel, sonst gewinnt der 100vw-Ausbruch. */
  .site-main--single .full-bleed{width:auto;max-width:100%;margin-left:0;margin-right:0}
  .site-main--single .full-bleed > .hero-body{max-width:none;padding-inline:0}
  .hero--fenster{min-height:0}
  .hero::after{display:none}
  .hero-media{position:static}
  .hero-media img{height:auto;max-width:60%;object-fit:contain}
  .hero-body{position:static;padding:.4rem 0;max-width:none}
  .hero-title,.hero-lead{color:#000;text-shadow:none}
  /* Der Knopf im Banner – dieselbe Behandlung wie im Handlungsband und bei den
     Veranstaltungen (17.08.2026): kein Volltonbalken, den niemand drücken kann, sondern
     ein Wort mit seiner Adresse dahinter. Die Adresse hängt site.js an (`.lead-hero`
     steht dort seit demselben Tag mit im Selektor). Eine Klasse mehr als nötig, damit
     nicht die Reihenfolge im Blatt über die Farbe entscheidet. */
  .hero .hero-actions a{display:inline;background:none;color:#000;padding:0;
    border:0;font-weight:700;text-decoration:underline}

  /* Fußzeile: Quelle, Kontakt, Datum + QR */
  .print-foot{display:flex;justify-content:space-between;align-items:flex-end;gap:14pt;
    border-top:1pt solid #999;margin-top:18pt;padding-top:8pt;font-size:9pt;color:#222}
  .print-foot-text p{margin:2pt 0}
  .print-qr{flex:0 0 auto;width:90px;height:90px}
  .print-qr svg{width:90px;height:90px}
}

/* ================= Barrierefreiheits-Säule + Nach-oben-Knopf =================
   Beide schweben am rechten Rand und teilen sich dieselben Maße, damit sie als EIN Angebot
   gelesen werden und nicht als zwei zufällig benachbarte Knöpfe.

   Die Grundfrage war: dauerhaft sichtbar, ohne je den Text zu verdecken. Der Weg dahin:
   • Auf breiten Fenstern ist rechts neben der Inhaltsspalte (--col-page, höchstens 1560px)
     ohnehin Platz. Dort steht die Säule offen — alle Knöpfe beschriftet, nichts zu suchen.
   • Darunter gibt es diesen Platz nicht. Die Säule klappt in einen runden Knopf zusammen, der
     sie auf Wunsch öffnet. Ein Klick ist billiger als ein verdeckter Absatz.
   Die Schwelle ist absichtlich großzügig (1400px): sie ist erreicht, wenn WIRKLICH Luft da ist,
   nicht wenn es rechnerisch gerade so hinkommt. */
:root{
  --dock-abstand:.9rem;               /* Abstand zum Fensterrand */
  --dock-rund:14px;
}

/* Der Sprunglink ist unsichtbar, bis ihn jemand mit der Tastatur erreicht — die übliche
   Bauweise. Bewusst NICHT display:none: was ausgeblendet ist, kann auch kein Tabulator finden. */
.a11y-skip{position:absolute;left:.6rem;top:.6rem;z-index:60;
  transform:translateY(-160%);transition:transform .18s ease;
  background:var(--bar-bg);color:#fff;text-decoration:none;font-size:.95rem;font-weight:600;
  padding:.6rem 1rem;border-radius:var(--r-sm);box-shadow:var(--shadow-2)}
.a11y-skip:focus{transform:translateY(0);outline:3px solid var(--accent);outline-offset:2px}
/* Zeigen darf er sich aber NUR, wenn wirklich eine Tastatur im Spiel ist. Der Nach-oben-Knopf
   stellt den Fokus absichtlich zurück an den Seitenanfang (site.js) — am Handy klappte der
   schwarze Balken „Zum Inhalt springen“ dadurch nach jedem Tippen auf, obwohl niemand
   tabuliert hatte (Issue #37). Genau diesen Unterschied kennt :focus-visible.
   Die @supports-Klammer ist Absicht: Browser ohne :focus-visible behalten den alten
   :focus-Weg — ein Sprunglink, den niemand mehr sieht, wäre der schlimmere Fehler. */
@supports selector(:focus-visible){
  .a11y-skip:focus:not(:focus-visible){transform:translateY(-160%);outline:0}
}

/* Mitlese-Markierung: der Absatz, der GERADE vorgelesen wird (Issue #35, gesetzt von site.js).
   `outline` und nicht `border`: die Linie liegt außerhalb des Kastens und kostet keinen Platz –
   ein Rahmen ließe die Seite bei jedem Absatzwechsel um ein paar Pixel zucken.
   scroll-margin-top hält den Absatz beim Nachführen unter der klebenden Kopfleiste hervor.
   Der Übergang ist kurz und betrifft nur die Farbe: die Markierung soll wandern, nicht tanzen. */
.is-reading{outline:3px solid var(--read-mark);outline-offset:5px;border-radius:5px;
  background:var(--read-mark-bg);transition:background-color .15s linear}
.site-main .is-reading{scroll-margin-top:6rem}
@media (prefers-reduced-motion:reduce){ .is-reading{transition:none} }
/* Auf dem Papier ist niemand mehr beim Zuhören. */
@media print{ .is-reading{outline:0;background:none} }

/* Die Säule ist GRÜN gefüllt (--a11y), nicht weiß wie eine Karte. Sie soll auffallen: für
   Menschen, die schlecht sehen oder vorlesen lassen, ist sie der wichtigste Knopf der Seite,
   und eine weiße Fläche auf hellgrauem Grund ist genau das Gegenteil von auffallen.
   Der dunklere Rand hält sie auch dann zusammen, wenn sie über einem Foto steht. */
.a11y-dock{position:fixed;z-index:55;right:var(--dock-abstand);top:50%;transform:translateY(-50%);
  display:flex;flex-direction:column;align-items:flex-end;gap:.25rem;padding:.4rem;
  background:var(--a11y);border:1px solid var(--a11y-dark);border-radius:var(--dock-rund);
  box-shadow:var(--shadow-2)}
.a11y-tools{display:flex;flex-direction:column;align-items:flex-end;gap:.25rem}
/* „Pause" steht NEBEN „Vorlesen", nicht darunter: es gehört zum selben Vorgang, und eine
   fünfte Zeile in der Säule sähe aus wie ein fünftes Werkzeug. Die Zeile erscheint erst
   während des Vorlesens und macht die Säule dann breiter – sie wächst nach LINKS in den
   Inhalt hinein. Genau deshalb sind Säule und Werkzeuge rechtsbündig (align-items:flex-end):
   die anderen Knöpfe bleiben stehen, wo sie waren. Wer sich vorlesen lässt, liest an dieser
   Stelle gerade nicht mit – der Platz ist dort im Moment das kleinere Übel. */
.a11y-readrow{display:flex;align-items:stretch;gap:.25rem}
/* Symbol oben, Wort darunter: eine Säule aus reinen Sinnbildern muss man raten, eine aus
   Wörtern wird zu breit. Beides zusammen ist schmal genug und trotzdem eindeutig. */
.a11y-btn{display:flex;flex-direction:column;align-items:center;gap:.1rem;
  width:4.15rem;padding:.45rem .2rem;background:transparent;color:var(--on-a11y);
  border:1px solid transparent;border-radius:10px;cursor:pointer;font-family:inherit;
  font-size:.72rem;line-height:1.2;text-align:center}
.a11y-sym{font-size:1.05rem;line-height:1.1;font-weight:700}
/* Gezeichnete Zeichen (Kontrast, Vorlesen) neben geschriebenen („A+", „A−", „❚❚"): 1,3rem ist
   die Größe, bei der beide gleich schwer wirken – der Buchstabe füllt seine Zeile nur zu rund
   drei Vierteln, die Zeichnung ihr Quadrat ganz. `display:block` nimmt die Zeilen-Grundlinie
   aus dem Spiel, sonst säße die Zeichnung um die Unterlänge zu tief. Farbe kommt über
   currentColor: im eingeschalteten Zustand (weiße Füllung) dreht sie sich von selbst mit. */
.a11y-ico{width:1.3rem;height:1.3rem;display:block}
/* Hervorheben beim Überfahren gibt es NUR, wo überfahren werden kann (Issue #55). Auf dem
   Handy gibt es kein Verlassen: der zuletzt angetippte Knopf behält den Hover-Zustand, bis man
   woanders hintippt („sticky hover"). Der Auslöser sah deshalb nach dem Zuklappen weiterhin
   eingeschaltet aus, obwohl die Säule zu war – die helle Füllung ist hier das Zeichen für
   „aktiv", und es blieb am falschen Zustand kleben. Dieselbe Überlegung, aus der weiter unten
   schon die Sprechblase mit (hover:hover) abgesichert ist. */
@media (hover:hover){
  .a11y-btn:hover{background:rgba(255,255,255,.18);border-color:rgba(255,255,255,.5);
    color:var(--on-a11y)}
}
/* Fokusring in WEISS: der rote Standardring wäre auf Grün kaum zu sehen. */
.a11y-btn:focus-visible{outline:2px solid #fff;outline-offset:1px}
/* Eingeschaltet: umgekehrte Farben. Auf grüner Fläche ist eine WEISSE Füllung das deutlichste
   Signal – ein weiterer Farbton wäre der dritte in einem 44px breiten Kasten. */
.a11y-btn[aria-pressed="true"]{background:#fff;color:var(--a11y);
  border-color:#fff;font-weight:700}
@media (hover:hover){
  .a11y-btn[aria-pressed="true"]:hover{background:#fff;color:var(--a11y-dark)}
}

/* Der Auslöser ist auf breiten Fenstern überflüssig – dort steht ohnehin alles offen. */
.dock-toggle{display:none;flex-direction:column;align-items:center;gap:.1rem;
  width:4.15rem;padding:.45rem .2rem;background:transparent;color:var(--on-a11y);
  border:1px solid transparent;border-radius:10px;cursor:pointer;font-family:inherit;
  font-size:.72rem;line-height:1.2}
.dock-ico{width:1.5rem;height:1.5rem}
/* Zwei Zeichen im selben Knopf, immer genau eines sichtbar (Issue #43). Der Zustand steht am
   Behälter – dieselbe Quelle, aus der auch das Auf-/Zuklappen selbst kommt (site.js setzt
   [data-zu]). So kann das Zeichen nicht stehenbleiben, wenn die Säule beim Fensterwechsel von
   allein aufgeht. Voreinstellung ist „zu": ohne JavaScript steht die Säule offen im HTML –
   und dann gehört das Kreuz hin. */
.dock-ico-zeichen,.dock-lbl-zeichen{display:none}
.a11y-dock[data-zu] .dock-ico-zeichen{display:block}
.a11y-dock[data-zu] .dock-lbl-zeichen{display:block}
.a11y-dock[data-zu] .dock-ico-zu,.a11y-dock[data-zu] .dock-lbl-zu{display:none}
/* ZUGEKLAPPT ist das Sinnbild alles, was der Knopf zeigt - das Wort steht dann nur noch als
   Sprechblase daneben und kostet keinen Platz. Also darf das Zeichen den Platz auch nutzen:
   24 px in einem 44x40-Knopf liessen ringsum Luft, und genau dieses Zeichen muss finden, wer
   schlecht sieht. 32 px fuellen den Knopf, ohne ihn zu sprengen.
   Die feste Hoehe haelt die gruene Kachel dabei exakt auf ihren gemessenen 55 px - ohne sie
   waere sie mit dem Zeichen mitgewachsen (Stephan, 18.08.: "groesse des gruen passt").
   AUFGEKLAPPT aendert sich nichts: dort faellt [data-zu] weg, das Kreuz bleibt bei 24 px wie
   die uebrigen Werkzeuge daneben. */
.a11y-dock[data-zu] .dock-toggle{height:2.5rem;padding:0 .1rem;justify-content:center}
.a11y-dock[data-zu] .dock-ico-zeichen{width:2rem;height:2rem}
@media (hover:hover){
  .dock-toggle:hover{background:rgba(255,255,255,.18);border-color:rgba(255,255,255,.5)}
}
.dock-toggle:focus-visible{outline:2px solid #fff;outline-offset:1px}

.dock-top{position:fixed;z-index:55;right:var(--dock-abstand);bottom:var(--dock-abstand);
  display:flex;flex-direction:column;align-items:center;gap:.1rem;
  width:4.15rem;padding:.5rem .2rem;
  background:var(--surface);color:var(--text);border:1px solid var(--line);
  border-radius:var(--dock-rund);box-shadow:var(--shadow-2);cursor:pointer;
  font-family:inherit;font-size:.72rem;line-height:1.2;
  opacity:0;transform:translateY(.5rem);transition:opacity .2s ease,transform .2s ease}
.dock-top svg{width:1.4rem;height:1.4rem}
/* Zwei Stufen: `hidden` nimmt ihn ganz aus dem Weg (auch für die Tastatur), `is-da` blendet ihn
   weich ein. Ohne die zweite Stufe würde er beim Scrollen hart aufpoppen. */
.dock-top[hidden]{display:none}
.dock-top.is-da{opacity:1;transform:translateY(0)}
/* Auch hier: kein klebender Hover-Zustand nach dem Antippen (Issue #55). */
@media (hover:hover){
  .dock-top:hover{background:var(--soft);color:var(--accent-ink);border-color:var(--accent-ink)}
}
.dock-top:focus-visible{outline:2px solid var(--accent-ink);outline-offset:2px}

/* --- Die drei Stufen, und warum es drei sind ---------------------------------------------
   Die Inhaltsspalte ist höchstens 1560px breit; Raster-Bausteine (Kennzahlen, Anrisse, Chips)
   nutzen sie ganz aus. Erst ab rund 1750px Fensterbreite bleibt daneben von selbst Platz.

   Stufe 1 (ab 1750px): breite Säule mit Wörtern, sie steht im ohnehin freien Rand.
   Stufe 2 (1150–1750px): schmale Säule, nur Sinnbilder – und die Seite reserviert ihr rechts
     einen Streifen (--pad-page-r). Die Säule liegt damit NEBEN dem Inhalt, nicht darüber.
     Die Wörter sind nicht verloren: sie fahren beim Überfahren und beim Tastatur-Fokus aus.
   Stufe 3 (unter 1150px): dort wäre ein reservierter Streifen zu teuer – er ginge von der
     Lesebreite ab. Die Säule klappt auf einen runden Auslöser zusammen und schwebt über der
     unteren rechten Ecke, wie man es von Handy-Anwendungen kennt.

   Nachgemessen mit werkzeuge/dock-test.js bei 2560 / 1920 / 1750 / 1700 / 1600 / 1440 / 1280 /
   1150 / 1024 / 768 / 390 / 320px. (Das Werkzeug prüfte anfangs mit offsetParent auf
   Sichtbarkeit – bei position:fixed ist der null, und es meldete überall fälschlich „frei".) */
@media (min-width:1151px) and (max-width:1750px){
  :root{--pad-page-r:calc(clamp(1.2rem,3vw,2.5rem) + 4.5rem)}
}
/* Auch der zusammengeklappte Auslöser braucht seinen Platz – er stand sonst mitten im
   Handlungsband und deckte dessen Überschrift zu. Nur bis hinunter zu 700px: darunter wäre ein
   fester Streifen teurer als der Schaden, den er verhindert (bei 390px ginge fast ein Fünftel
   der Lesebreite dafür drauf). Unterhalb schwebt der Knopf über der Ecke – dort verdeckt er
   Bildrand, nicht Text, weil auf schmalen Geräten alles einspaltig untereinander steht. */
@media (min-width:700px) and (max-width:1150px){
  :root{--pad-page-r:calc(clamp(1.2rem,3vw,2.5rem) + 3.6rem)}
}
@media (max-width:1750px){
  .a11y-btn,.dock-toggle{width:2.75rem;padding:.45rem .1rem;position:relative}
  .a11y-txt,.dock-lbl{
    position:absolute;right:calc(100% + .5rem);top:50%;transform:translateY(-50%) scale(.92);
    opacity:0;pointer-events:none;transition:opacity .14s ease,transform .14s ease;
    /* Dieselbe Farbfamilie wie die Säule: die Sprechblase fährt über den Seiteninhalt aus,
       und man soll auf einen Blick sehen, wozu sie gehört. */
    background:var(--a11y-dark);color:#fff;font-size:.8rem;white-space:nowrap;
    padding:.3rem .55rem;border-radius:var(--r-sm);box-shadow:var(--shadow-1)}
  /* Tastatur: die Beschriftung fährt beim Fokus aus. */
  .a11y-btn:focus-visible .a11y-txt,.dock-toggle:focus-visible .dock-lbl{
    opacity:1;transform:translateY(-50%) scale(1)}
  .dock-top{width:2.75rem;padding:.5rem .1rem}
  .dock-top-txt{display:none}
}
/* Maus: dasselbe beim Überfahren – aber NUR auf Geräten, die überhaupt überfahren können.
   Auf dem Handy gibt es kein Verlassen: der zuletzt angetippte Knopf behält den Hover-Zustand,
   bis man woanders hintippt („sticky hover"). Die Sprechblase „Ansicht" blieb deshalb stehen,
   nachdem man die Säule wieder zugeklappt hatte – ein Wort, das an nichts mehr hängt.
   Mit (hover:hover) erscheint sie dort gar nicht erst; angetippt wird ohnehin der Knopf und
   nicht seine Beschriftung. */
@media (max-width:1750px) and (hover:hover){
  .a11y-btn:hover .a11y-txt,.dock-toggle:hover .dock-lbl{
    opacity:1;transform:translateY(-50%) scale(1)}
}
/* --- eng oder flach: zusammengeklappt auf einen Auslöser, offen WAAGRECHT (Issue #55) ---
   Zwei Fälle, eine Bauweise: schmale Fenster (Handy) und flache Fenster (Notebook quer,
   aufgeklappte Bildschirmtastatur). In beiden ist die senkrechte Säule falsch – am Handy legte
   sie sich beim Aufklappen als hoher Streifen über den halben Text, im flachen Fenster reichte
   sie vom oberen bis zum unteren Rand. Deshalb standen hier schon vorher zwei gleichlautende
   Blöcke; sie sind jetzt einer.

   Offen wird daraus eine ZEILE, die vom Auslöser aus nach links wächst. row-reverse statt einer
   anderen Reihenfolge im HTML: der Auslöser ist dort das erste Kind und bleibt so in der Ecke
   stehen, wo er zugeklappt war – ein Knopf, der beim Aufklappen wandert, wird beim zweiten
   Tippen verfehlt. Die Zeile verdeckt eine Zeile statt einer Spalte, und zwar unten am Rand,
   wo auf schmalen Geräten ohnehin nichts als Fläche steht.

   flex-wrap ist der Notausgang: während des Vorlesens sind es sechs Knöpfe (Pause kommt dazu),
   das sind rund 300px – bei 320px Gerätebreite rutscht der letzte dann in eine zweite Zeile,
   statt aus dem Bild zu laufen. */
@media (max-width:1150px),(max-height:520px){
  .a11y-dock{top:auto;bottom:calc(var(--dock-abstand) + 4.2rem);transform:none;
    flex-direction:row-reverse;align-items:center;flex-wrap:wrap;justify-content:flex-end}
  .a11y-tools{flex-direction:row;align-items:center;flex-wrap:wrap;justify-content:flex-end}
  .dock-toggle{display:flex}
  /* Zu: nur der Auslöser bleibt stehen. Offen: die Knöpfe erscheinen links daneben. */
  .a11y-dock[data-zu] .a11y-tools{display:none}
  /* Die Sprechblase gehört jetzt ÜBER den Knopf. Links daneben (wie in der Säule) läge sie
     genau auf dem Nachbarknopf – in einer Zeile ist links kein freier Platz mehr. */
  .a11y-txt,.dock-lbl{right:auto;left:50%;top:auto;bottom:calc(100% + .45rem);
    transform:translateX(-50%) scale(.92)}
  .a11y-btn:focus-visible .a11y-txt,.dock-toggle:focus-visible .dock-lbl{
    transform:translateX(-50%) scale(1)}
}
/* Maus in einem schmalen/flachen Fenster: dieselbe Sprechblase, ebenfalls nach oben. Muss NACH
   der Regel oben stehen und dieselbe Wucht haben – sonst zieht die allgemeine Hover-Regel von
   weiter oben (translateY) die Blase wieder aus der Mitte. */
@media (max-width:1150px) and (hover:hover),(max-height:520px) and (hover:hover){
  .a11y-btn:hover .a11y-txt,.dock-toggle:hover .dock-lbl{transform:translateX(-50%) scale(1)}
}
@media (max-width:560px){ :root{--dock-abstand:.6rem} }

/* ---------------- Suche (Kopf-Suchfeld + Ergebnisseite) ----------------
   Das Feld trägt seit 2026-08-04 eine kräftige Kontur auf weißer Fläche. Vorher war es eine
   graue Fläche mit hauchdünner Linie – auf dem Sandton der Seite fiel es kaum auf, obwohl die
   Suche bei rund 130 Seiten der schnellste Weg ist.

   Weniger rund als vorher (999px Pille -> --r): Eine Pille liest sich wie ein Knopf. Ein Feld,
   in das man schreibt, ist ein Kasten – die kleinere Rundung sagt das, ohne hart zu wirken.

   DIE KONTUR IST SCHWARZ, NICHT ROT – und das ist eine Barrierefreiheits-Entscheidung, kein
   Geschmack. Zwischenstand am 2026-08-04 war eine rote Kontur im Normalzustand; damit hatte
   Rot keine Bedeutung mehr übrig, um den TASTATUR-FOKUS anzuzeigen. Wer sich mit der
   Tabulatortaste durch die Seite bewegt, muss auf einen Blick sehen, wo er steht. Also:
     Normalzustand = --ink  (hell schwarz, dunkel fast weiß) – ruhig, aber deutlich sichtbar
     Fokus         = --accent-ink (Markenrot) als Kontur PLUS Ring außerhalb des Feldes
   Zwei Merkmale beim Fokus (Farbwechsel und zusätzlicher Ring), damit er auch dann auffällt,
   wenn jemand Farben schlecht unterscheidet. Wer das je ändert, prüft es mit der
   Tabulatortaste nach – nicht mit der Maus. */
.site-search input[type=search]{padding:.55rem 1rem;
  border:2px solid var(--ink);border-radius:var(--r);
  font-size:.95rem;font-family:inherit;background:var(--surface);color:var(--ink);
  min-width:6rem;width:100%}
.site-search input[type=search]:focus{outline:3px solid var(--accent-ink);outline-offset:2px;
  border-color:var(--accent-ink)}
.site-search button{background:var(--accent);color:var(--on-accent);border:0;border-radius:999px;
  padding:.55rem 1.1rem;font-size:.95rem;cursor:pointer;font-family:inherit;flex:0 0 auto}
.site-search button:hover{background:var(--accent-dark)}
/* Das Feld auf der Suchseite ist dasselbe Bauteil, nur größer: Dort ist die Suche nicht ein
   Angebot neben anderen, sondern der Grund, warum man auf der Seite ist. Es steht bewusst
   NICHT in der Rasterspalte der Kopfzeile – hier gilt die Breite der Inhaltsspalte. */
.site-search-page{margin:1rem 0 1.4rem;max-width:none;display:flex;gap:.4rem}
.site-search-page input[type=search]{flex:1;min-width:0;font-size:1.1rem;padding:.75rem 1.15rem}
.site-search-page button{padding:.75rem 1.4rem;font-size:1.02rem}

/* Trefferliste als EINE weiße Fläche mit Trennlinien – nicht als Stapel Einzelkarten:
   Treffer sind eine Liste, keine Sammlung gleichrangiger Angebote. Auf dem grauen Grund
   braucht die Liste aber eine Fläche, sonst schwebt sie. */
.search-results{list-style:none;margin:1rem 0 0;padding:.4rem 1.4rem;display:flex;flex-direction:column;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow-1)}
.search-results li{border-bottom:1px solid var(--line);padding:1.1rem 0}
.search-results li:last-child{border-bottom:0}
.search-results .sr-title{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1.15rem;
  color:var(--accent-ink);text-decoration:none}
.search-results .sr-title:hover{text-decoration:underline}
.search-results .sr-snippet{margin:.3rem 0 .2rem;color:var(--ink)}
/* display:block, nicht inline: Bei Seiten OHNE Textausschnitt (noch ohne Inhalt) fehlt der
   Absatz, der vorher den Umbruch erzwang – Titel, Kennzeichen und Adresse standen dann in einer
   Zeile und lasen sich wie ein einziger Satz. */
.search-results .sr-url{display:block;margin-top:.25rem;font-size:.82rem;word-break:break-all}

/* ---------------- Suchseite: Zählung, Bereichs-Filter, Leerzustand ----------------
   Alles hier steht im ausgetauschten Fragment (public_search_results.php) und muss deshalb
   ohne JavaScript genauso aussehen wie danach – es gibt keine „Lade"-Zustände. */
.sr-count{margin:1.2rem 0 .2rem;color:var(--text)}
.sr-count strong{color:var(--ink)}
.sr-none{margin:1.2rem 0 .6rem;font-size:1.1rem;color:var(--ink)}
.sr-h2{font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1.15rem;font-weight:700;
  color:var(--ink);margin:1.8rem 0 .7rem}

/* Filter-/Vorschlagsknöpfe. Es sind LINKS, keine Schalter: Sie führen auf eine Adresse mit
   anderem Parameter, arbeiten also ohne Skript, sind verlinkbar und stehen im Verlauf. */
.sr-chips{list-style:none;margin:.5rem 0 0;padding:0;display:flex;flex-wrap:wrap;gap:.45rem}
.sr-chip{display:inline-flex;align-items:center;gap:.45rem;text-decoration:none;
  color:var(--ink);background:var(--surface);border:1px solid var(--line);
  border-radius:999px;padding:.35rem .85rem;line-height:1.3}
.sr-chip:hover{border-color:var(--accent-ink);color:var(--accent-ink)}
/* Der aktive Filter ist GEFÜLLT, nicht bloß umrandet: Eine Randfarbe allein verschwindet für
   viele Augen, und der Zustand „hier bin ich" ist die wichtigste Aussage der Zeile. */
.sr-chip.is-on{background:var(--accent);color:var(--on-accent);border-color:var(--accent)}
.sr-chip.is-on:hover{background:var(--accent-dark);color:var(--on-accent)}
/* Die Zahl sitzt in einer eigenen Kapsel – sonst liest sich „Beratung 12" wie ein Seitenname. */
.sr-chip-n{font-size:.8rem;font-weight:700;background:var(--soft);color:var(--text);
  border-radius:999px;padding:.02rem .42rem}
.sr-chip.is-on .sr-chip-n{background:rgba(255,255,255,.22);color:var(--on-accent)}
/* Größere Knöpfe im Leerzustand: Dort sind sie das Hauptangebot der Seite, nicht eine Nebenzeile. */
.sr-chips-lg .sr-chip{font-size:1.05rem;padding:.5rem 1.1rem}

/* Deckel erreicht. Gelber Hinweisstreifen statt roter Warnung: Es ist kein Fehler, sondern eine
   Auskunft – die Suche hat gearbeitet, es gibt nur mehr, als eine Liste sinnvoll fasst. */
.sr-capped{margin:1rem 0 0;padding:.7rem 1rem;color:var(--ink);
  background:var(--soft);border-left:4px solid var(--gold);border-radius:var(--r-sm)}

/* Standort-Karte (Klick-zum-Laden). Der Platzhalter ist selbst der Knopf; erst auf Klick
   lädt site.js Leaflet + die externen OpenStreetMap-Kacheln in .locmap-canvas. Die Karte sitzt
   in der dritten Spalte der Standort-Zeile (.entry-map), nicht mehr als Sammelkarte darunter. */
.locmap-ph{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;
  width:100%;background:var(--soft);border:1px dashed var(--line);border-radius:var(--r-sm);
  padding:1.2rem;color:var(--ink);font-family:inherit;font-size:.98rem;font-weight:600;cursor:pointer}
.locmap-ph:disabled{color:var(--muted);cursor:default}
.locmap-pin{display:block;width:1.6rem;height:1.6rem;color:var(--accent-ink)}
.locmap-pin svg{display:block;width:100%;height:100%}
.locmap-ph:focus-visible{outline:2px solid var(--accent-ink);outline-offset:2px}
@media (hover:hover){
  .locmap-ph:hover{background:var(--accent-soft);border-color:var(--accent-ink);border-style:solid}
}
/* EIGENER STAPELRAUM (position + z-index:0), sonst wandert die Karte beim Scrollen über die
   Kopfzeile: Leaflet vergibt intern hohe Werte – Kacheln 400, Bedienknöpfe 800, die Ecken sogar
   1000 –, und ohne eigenen Stapelraum gelten die für die ganze Seite. Die klebende Kopfzeile
   liegt auf 40, das Mega-Menü auf 41, die Werkzeugsäule auf 55: gegen 1000 verliert jede davon.
   Mit z-index:0 zählt nach außen nur noch diese 0, innen bleibt Leaflets Ordnung unangetastet. */
.locmap-canvas{position:relative;z-index:0;
  height:100%;min-height:11rem;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.locmap-canvas .leaflet-container{height:100%;width:100%;border-radius:var(--r-sm);background:var(--soft)}

/* Fingerzeig auf der Karte (Issue #88). Am Handy verschiebt EIN Finger die Seite und nicht
   mehr den Kartenausschnitt – zwei Finger bedienen die Karte. Eine Karte, die auf den Finger
   nicht reagiert, sieht aber kaputt aus; deshalb sagt sie es beim ersten Ein-Finger-Wisch
   selbst und blendet sich nach gut einer Sekunde wieder aus (site.js: mapZweiFinger).
   pointer-events:none ist Pflicht – der Hinweis darf die Geste nicht selbst abfangen.
   z-index über Leaflets eigener Ordnung (Kacheln 400, Bedienknöpfe 800, Ecken 1000); nach
   außen bleibt alles im Stapelraum von .locmap-canvas eingesperrt (z-index:0 dort). */
.locmap-fingerzeig{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  z-index:1100;margin:0;max-width:88%;text-align:center;
  padding:.6rem .9rem;border-radius:var(--r-sm);
  background:rgba(17,21,26,.88);color:#fff;font-size:.92rem;font-weight:600;line-height:1.35;
  pointer-events:none;opacity:0;transition:opacity .18s ease}
.locmap-fingerzeig.is-an{opacity:1}
@media (prefers-reduced-motion:reduce){ .locmap-fingerzeig{transition:none} }

/* Der Hinweis steht EINMAL je Baustein, UNTER der Liste und rechtsbündig – auf der Flucht der
   Kartenspalte, zu der er gehört. Vor dem ersten Klick die Auskunft, danach der Weg zurück;
   beide Fassungen stehen im HTML, site.js blendet die passende ein. So ist der Text auch ohne
   JavaScript zu lesen. */
.locmap-hinweis{margin:.8rem 0 0;color:var(--muted);font-size:.9rem;line-height:1.45;
  text-align:right}
.locmap-zeile{display:block}
@media (max-width:640px){
  /* Am Handy links: Der Satz braucht dort drei Zeilen, und rechtsbündiger Fließtext hat einen
     ausgefransten linken Rand – das Auge findet den nächsten Zeilenanfang nicht mehr. */
  .locmap-hinweis{text-align:left}
}
/* Der Widerruf ist ein Knopf, sieht aber aus wie ein Link: er steht mitten im Satz, und ein
   roter Knopf mitten in einer grauen Zeile wäre lauter als der Hinweis selbst. */
.locmap-widerruf{background:none;border:0;padding:0;font:inherit;color:var(--accent-ink);
  text-decoration:underline;cursor:pointer}
.locmap-widerruf:focus-visible{outline:2px solid var(--accent-ink);outline-offset:2px}

/* --- Standort-Zeile mit Karte -------------------------------------------------------------
   Standorte stehen IMMER einzeln in einer Zeile (anders als Personen, die zu zweit nebeneinander
   passen): In der vollen Breite ist rechts Platz für die Karte, und später für die Angabe, wer
   an diesem Ort berät.

   Der Umbruchpunkt ist gerechnet, nicht geraten – aus den Mindestbreiten, die die drei Spalten
   wirklich brauchen:
       Bild       7,0rem   (die schmalste Stufe der Bildspalte)
     + Angaben   18,0rem   (Symbolspalte + die längste Zeile: eine E-Mail-Adresse)
     + Karte     16,0rem   (darunter zeigt ein Kartenausschnitt nichts Erkennbares mehr)
     + 2 Spalten-Abstände (2 × 1,2rem) + Innenabstand (2 × 1,35rem) + Rahmen
     = rund 47rem
   Gemessen wird die LISTE (Container-Abfrage), nicht das Fenster: Neben einer Seitenspalte ist
   die Liste schmaler als das Fenster, eine Media-Query hätte dort danebengegriffen. */
.entrylist--standorte{grid-template-columns:1fr;container-type:inline-size}
/* Bis dahin: die Karte sitzt unter Bild und Angaben und nimmt die ganze Kartenbreite ein. */
.entry--mitkarte .entry-map{grid-column:1/-1;margin:.35rem 0 0}
@container (min-width:47rem){
  /* Die Karte wächst PROZENTUAL mit (28%) statt bis zu einem festen Höchstmaß: Ein fester
     Höchstwert holt sich das Raster als Erstes – direkt über dem Umbruchpunkt blieben dem Text
     dann nur noch gut 290px, während die Karte schon auf voller Größe stand. Die 18rem
     Mindestbreite der Angaben stehen ausdrücklich da, damit die Rechnung oben auch gilt. */
  .entrylist--standorte .entry--mitkarte{
    grid-template-columns:clamp(6rem,12%,9rem) minmax(18rem,1fr) minmax(16rem,28%)}
  /* Zurück in die dritte Spalte – und über die volle Höhe der Zeile, damit die Karte unten mit
     den Öffnungszeiten abschließt statt in der Luft zu hängen. */
  .entrylist--standorte .entry--mitkarte .entry-map{grid-column:auto;align-self:stretch;margin:0}
}
/* Platzhalter UND Karte füllen die Spalte ganz aus. Ohne die Breitenregel bliebe der
   Kartenkasten 2px breit: Er hat keinen eigenen Inhalt, aus dem eine Breite entstehen könnte –
   Leaflet baut sein Bild erst NACH dem Messen, und gemessen hätte es dann null. */
.entry-map{display:flex;min-height:11rem}
.entry-map>.locmap-ph,
.entry-map>.locmap-canvas{flex:1 1 auto;width:100%;min-width:0}
@media print{
  /* Auf Papier ist eine ungeladene Karte ein leerer Kasten und eine geladene ein grauer Fleck. */
  .entry-map,.locmap-hinweis{display:none}
  /* Und wieder: die Karte ist weg, ihre SPALTE nicht. Sobald die Liste breit genug für die
     dreispaltige Fassung ist – auf A4 quer sind es 1016px Satzbreite, also klar über den 47rem
     der Container-Abfrage –, blieb die dritte Spalte mit 268px leer stehen (gemessen 10.08. auf
     allen fünf Beratungsstellen-Seiten). Diese zwei Zeilen stehen NACH der Container-Abfrage und
     tragen zwei bzw. drei Klassen; nur so gewinnen sie gegen deren Spaltenvorgabe.
     Erklärung der Falle: bei .entry im Abschnitt „Eintragsliste". */
  .entrylist--standorte .entry--mitkarte{grid-template-columns:clamp(7rem,26%,12.5rem) minmax(0,1fr)}
  .entrylist--standorte .entry--mitkarte:has(.entry-media--leer){grid-template-columns:minmax(0,1fr)}
}

/* ------------------------------- Rechtsseiten-Panel -------------------------------
   Impressum/Datenschutz fahren von rechts ein, statt die Seite zu verlassen (site.js).
   Ohne JavaScript wird die Seite ganz normal aufgerufen – dieses Panel existiert dann nicht. */
html.has-panel{overflow:hidden}
.panel-backdrop{position:fixed;inset:0;z-index:80;background:rgba(0,0,0,.45);
  opacity:0;transition:opacity .22s ease}
.panel-backdrop.is-open{opacity:1}
.panel{position:fixed;top:0;right:0;z-index:81;width:min(46rem,100%);height:100%;
  display:flex;flex-direction:column;background:var(--bg);border-left:1px solid var(--line);
  box-shadow:-8px 0 28px rgba(0,0,0,.18);transform:translateX(100%);transition:transform .24s ease}
.panel.is-open{transform:translateX(0)}
.panel-head{display:flex;align-items:center;justify-content:space-between;gap:1rem;
  padding:.9rem 1.2rem;border-bottom:3px solid var(--accent);background:var(--surface)}
.panel-head-title{margin:0;font-family:"Oswald","Segoe UI",Arial,sans-serif;font-size:1.15rem;
  font-weight:600;color:var(--ink)}
.panel-close{border:1px solid var(--line);background:var(--bg);color:var(--ink);cursor:pointer;
  width:2.4rem;height:2.4rem;border-radius:50%;font-size:1.1rem;line-height:1;flex:0 0 auto}
.panel-close:hover{background:var(--soft)}
.panel-close:focus-visible,.panel-body:focus-visible{outline:3px solid var(--accent-ink);outline-offset:2px}
.panel-body{overflow-y:auto;padding:1.2rem 1.4rem 2.5rem;-webkit-overflow-scrolling:touch}
.panel-title{margin-top:0}
.panel-loading{color:var(--muted)}
@media (max-width:560px){
  .panel{width:100%;border-left:0}
  .panel-body{padding:1rem 1.1rem 2rem}
}
/* „Weniger Bewegung" respektieren: dann erscheint das Panel ohne Fahrt. */
@media (prefers-reduced-motion:reduce){
  .panel,.panel-backdrop{transition:none}
}

/* ---------------------------------------------------------------------------
   Entwurfs-Ansicht (nur für angemeldete Redakteure sichtbar)
   ---------------------------------------------------------------------------
   IMMER GELB, IMMER OBEN. Ein dezentes Band wäre der schlimmste aller Fehler: Wer
   die Vorschau für die fertige Seite hält, arbeitet im falschen Fenster weiter.
   Deshalb Warnfarbe, kräftige Schrift und ein echter Knopf für den Rückweg – nicht
   ein Textlink, den man erst suchen muss.

   Gelb (--gold) trägt schwarze Schrift und bleibt in beiden Modi lesbar – anders
   als Rot, das im Dunkelmodus nur ~3:1 erreicht. Den ZUSTAND sagt das Kurzwort
   links („Nicht öffentlich" / „Arbeitsstand" / „Vorschau"), nicht die Farbe: Ob
   man in einer Vorschau steckt, ist die wichtigere Frage als welcher Art sie ist.

   Das Band klebt oben und schiebt die (ebenfalls klebende) Kopfleiste um seine
   eigene Höhe nach unten – daher --draft-bar-h. Der Wert hier ist nur der
   Startwert für den ungebrochenen Fall; die WIRKLICHE Höhe misst preview.js und
   schreibt sie in dieselbe Variable (nötig, sobald der Text umbricht oder jemand
   die Schrift vergrößert). Ohne JavaScript bleibt es beim Startwert – dann kann
   die Kopfleiste im Umbruchfall etwas klemmen, das Warnband selbst ist aber
   unverändert da, und darauf kommt es an. */
:root{--draft-bar-h:3rem}
.draft-bar{position:sticky;top:0;z-index:60;
  display:flex;align-items:center;gap:.8rem;flex-wrap:wrap;
  min-height:var(--draft-bar-h);padding:.45rem var(--pad-page);
  background:var(--gold);color:#141a1e;font-size:.95rem;font-weight:600;
  box-shadow:0 4px 14px -6px rgba(0,0,0,.5)}
/* Die klebende Kopfleiste beginnt unter dem Band, statt es zu überdecken. */
body.has-draft-bar .site-header{top:var(--draft-bar-h)}
.draft-bar-tag{flex:0 0 auto;font-weight:800;text-transform:uppercase;letter-spacing:.05em;
  font-size:.75rem;padding:.25rem .6rem;border-radius:999px;
  background:#141a1e;color:var(--gold)}
/* ⚠️ flex-basis KLEIN (12rem), nicht `auto`. Mit `auto` ist die Ausgangsbreite die volle
   Textlänge in EINER Zeile – und eine umbrechende Flexbox verteilt zuerst auf Zeilen und
   schrumpft erst danach. Beim langen Satz der Suchseite flog dadurch der schwarze Rückweg-Knopf
   in die zweite Zeile (und bei rund 1000 px zerfiel das Band in drei Zeilen, mit dem Countdown
   UNTER dem Knopf – gemessen, Issue #87). Mit kleiner Basis passen alle vier Teile immer in
   eine Zeile, der Satz wächst in den Restplatz und bricht INTERN um: Kurzwort links, Knopf
   rechts oben, wie auf jeder Inhaltsseite. Am Handy gilt ohnehin die eigene Regel weiter unten. */
.draft-bar-txt{flex:1 1 12rem;min-width:12rem}
/* Countdown „endet in 12 Min." – ruhig, solange Zeit ist. Die Ziffern in Schreibmaschinenbreite,
   sonst zappelt die Leiste bei jeder Sekunde. Die letzten fünf Minuten dunkler und fett (is-knapp),
   abgelaufen als dunkles Feld (is-aus) – dann ist es keine Auskunft mehr, sondern eine Ansage. */
.draft-bar-rest{flex:0 0 auto;font-size:.85rem;font-weight:600;white-space:nowrap;
  font-variant-numeric:tabular-nums;opacity:.85}
/* KEINE Unterstreichung mehr im Warnzustand: Seit die Restzeit dabei groß und fett in der Mitte
   steht und ein echter Knopf danebensitzt, las sich der unterstrichene Text wie ein zweiter Link
   (Issue #86). Die Unterstreichung war die Hervorhebung von früher, als die Zahl klein und
   unauffällig am rechten Rand stand – jetzt tragen Größe, Gewicht und Platz die Betonung. */
.draft-bar-rest.is-knapp{opacity:1;font-weight:800}
.draft-bar-rest.is-aus{opacity:1;font-weight:800;background:#141a1e;color:var(--gold);
  padding:.25rem .6rem;border-radius:999px;text-decoration:none}
/* Rückweg als echter Knopf: dunkel auf gelb, damit er auch im Augenwinkel auffällt.
   margin-left:auto hält ihn rechts – auch dann noch, wenn das Band bei mittleren Fensterbreiten
   doch umbricht: dann steht er rechts UNTEN statt links unten und bleibt dort, wo man ihn sucht.
   In der ungebrochenen Zeile ändert die Auto-Kante nichts, weil der Satz daneben ohnehin allen
   Restplatz nimmt. Bei ZWEI Knöpfen (LIVE-Band) darf nur der erste sie bekommen – sonst teilen
   sich beide den Restplatz und stehen auseinandergezogen an den Rändern. */
.draft-bar-act{flex:0 0 auto;background:#141a1e;color:#fff;text-decoration:none;
  font-weight:700;padding:.35rem .85rem;border-radius:999px;white-space:nowrap;
  border:2px solid #141a1e;margin-left:auto}
.draft-bar-act ~ .draft-bar-act{margin-left:0}
.draft-bar-act:hover{background:#2b3238;border-color:#2b3238}
.draft-bar-act:focus-visible{outline:3px solid #141a1e;outline-offset:3px}

/* ------- Wird die Zeit knapp: Countdown und Knopf rücken in die Mitte (Issue #86) ----------
   Solange Zeit ist, steht die Restzeit klein und ruhig rechts – bei 25 Minuten gibt es nichts
   zu tun. Ab der Warnschwelle stellt sich die ganze Zeile um: Restzeit und Rettungsknopf
   wandern als Paar in die MITTE der Leiste, die Schrift wird größer. Eine Leiste, die immer
   laut ist, wird nicht mehr gelesen; diese wird genau einmal laut, und dann zu Recht.

   ⚠️ ECHTE MITTE nur mit `position:absolute`. Erster Versuch waren Auto-Ränder – damit steht
   die Gruppe in der Mitte des ÜBRIGEN Platzes, und weil links das Kurzwort (92 px) und rechts
   der Rückweg-Knopf (142 px) verschieden breit sind, saß sie gemessen 266 px neben der Mitte.
   Absolut positioniert hängt sie an der Leiste selbst und trifft sie auf den Punkt (die Leiste
   ist `position:sticky` und damit der Bezugsrahmen – ein zusätzliches `position:relative`
   braucht es nicht).

   Der Satz weicht dafür: Im Warnzustand ist die Restzeit die wichtigere Auskunft, und ohne das
   liefe die absolut gesetzte Gruppe über ihn hinweg. Was die Leiste ist, sagt das Kurzwort
   links ohnehin weiter. */
.draft-bar-zeit{display:inline-flex;align-items:center;gap:.7rem;flex:0 0 auto}
.draft-bar.is-knapp .draft-bar-zeit{position:absolute;left:50%;transform:translateX(-50%)}
.draft-bar.is-knapp .draft-bar-rest{font-size:1.15rem;font-weight:800;opacity:1}
.draft-bar.is-knapp .draft-bar-txt{display:none}

/* GRÜN, nicht rot. Rot gehört auf dieser Website dem Menü, der Suche und dem Angebot
   („Termin vereinbaren") – ein vierter roter Knopf ginge im Rot der anderen unter. Grün heißt
   hier schlicht „weiter" und ist im Frontend schon als Werkzeug-/Weiterlesen-Farbe eingeführt.
   Die Farbe steht FEST und kommt nicht aus einer Variablen: Das Band ist in beiden
   Helligkeiten gelb, also muss auch der Knopf darauf in beiden gleich aussehen – genau wie der
   schwarze Rückweg-Knopf daneben. #15803d trägt weiße Schrift mit 5,02:1.

   ⚠️ DIE KONTUR BLEIBT DUNKEL, und das ist keine Geschmacksfrage: Gemessen erreicht die grüne
   Fläche gegen das gelbe Band nur 2,50:1 – zu wenig für eine Bedienfläche, die sich von ihrem
   Grund abheben muss (gefordert sind 3,0). Grün UND Gold sind eben beide satte Farben. Mit der
   dunklen Kontur des Nachbarknopfs (8,74:1 gegen das Band) trägt die Grenze den Kontrast, und
   die Füllung darf die Farbe haben, die sie haben soll. Nebenbei sehen beide Knöpfe damit aus
   wie zwei Knöpfe derselben Leiste und nicht wie zwei Fundstücke. */
.draft-bar-weiter{background:#15803d}
.draft-bar-weiter:hover{background:#0f6b33}
/* Auf schmalen Schirmen gibt es keine Mitte zu verteilen: Kurzwort, Zeitgruppe und Rückweg
   füllen die Zeile schon aus, und eine absolut gesetzte Gruppe legte sich über die anderen.
   Dort bleibt alles im Fluss – erreichbar ist der Knopf so oder so. Die Grenze liegt bei
   760 px und nicht bei den sonst üblichen 560: Gemessen brauchen die drei Teile zusammen rund
   520 px, darunter wird es eng, und knapp ist hier so gut wie überlappt. */
@media (max-width:760px){
  .draft-bar.is-knapp .draft-bar-zeit{position:static;transform:none;margin-left:auto}
  .draft-bar.is-knapp .draft-bar-rest{font-size:1rem}
  .draft-bar.is-knapp .draft-bar-txt{display:block}
}
@media (max-width:560px){
  .draft-bar.is-knapp .draft-bar-zeit{flex-wrap:wrap;justify-content:flex-end}
}
/* Menüpunkte, die es öffentlich noch nicht gibt. Das Kennzeichen war eine gestrichelte
   Unterstreichung samt gedämpfter Schrift – und ist ein Punkt hinter dem Wort geworden.

   Grund: solange erst vier von 155 Seiten veröffentlicht sind, trägt FAST JEDER Menüpunkt
   dieses Kennzeichen. Aus der Ausnahme wurde damit der Normalfall, und eine Strichelung unter
   dreißig Zeilen liest sich nicht als Hinweis, sondern als unscharfe Schrift – die Striche
   laufen genau dort, wo die Unterlängen der Buchstaben sitzen. Dazu die gedämpfte Farbe: sie
   war als „noch nicht scharf gestellt" gemeint, machte im Dunkelmodus aber die ganze
   Navigation blass.

   Der Punkt sagt dasselbe, ohne die Schrift anzufassen: Farbe und Gewicht bleiben wie bei
   jedem anderen Menüpunkt, das Kennzeichen steht daneben statt darunter. Gold ist dabei kein
   neuer Einfall, sondern die Farbe des Entwurfsbandes ganz oben – dieselbe Bedeutung, dieselbe
   Farbe. Was der Punkt heißt, steht wie bisher im title (Menus.php setzt ihn).
   Sichtbar nur in der Redakteurs-Ansicht. */
.site-nav a.is-draft,.mega-sub a.is-draft,a.mega-top.is-draft{color:var(--ink)}
/* ⚠️ Die Zeile darüber setzt nur die RUHEFARBE – sie ist aber spezifischer als die
   Hover-Regeln der Navigation (`a.mega-top.is-draft` schlägt `a.mega-top:hover`) und stand
   weiter unten, hat deren Rot also mitverschluckt. Weil in der Redakteurs-Ansicht fast jeder
   Punkt ein Entwurf ist, blieb das Menü beim Überfahren praktisch überall stumm (gemessen,
   Gitea #85). Der Hover wird darum hier ausdrücklich zurückgeholt – für ALLE drei Orte, an
   denen der Entwurfspunkt vorkommt, sonst hinkt einer nach. */
.site-nav a.is-draft:hover,.site-nav a.is-draft:focus-visible,
.mega-sub a.is-draft:hover,.mega-sub a.is-draft:focus-visible,
a.mega-top.is-draft:hover,a.mega-top.is-draft:focus-visible{color:var(--accent-ink)}
a.mega-top.is-draft:hover,a.mega-top.is-draft:focus-visible{border-bottom-color:var(--accent-ink)}
.site-nav a.is-draft::after,.mega-sub a.is-draft::after,a.mega-top.is-draft::after{
  content:"";display:inline-block;width:.42rem;height:.42rem;margin-left:.42rem;
  border-radius:50%;background:var(--gold);vertical-align:.1em}
/* Am Handy bricht das Band auf zwei Zeilen (Kurzwort + Knopf oben, Satz darunter). Die Höhe
   wächst entsprechend mit – dieselbe Zahl, an der auch die Kopfleiste hängt. */
@media (max-width:560px){
  :root{--draft-bar-h:4.7rem}
  .draft-bar{gap:.4rem .6rem;padding:.45rem var(--pad-page);font-size:.85rem}
  .draft-bar-txt{min-width:0;order:3;flex:1 1 100%}
  /* Hier bekommt AUCH der zweite Knopf die Auto-Kante zurück (die Grundregel nimmt sie ihm).
     Grund: Am Handy passen die beiden Knöpfe des LIVE-Bandes nie nebeneinander – gemessen bei
     390 px sind es 208 + 130 px auf 352 px Zeile. Jeder steht also ohnehin in seiner eigenen
     Zeile, und dort gehört er an denselben rechten Rand wie der erste. Auf dem Desktop wäre
     dieselbe Regel falsch: dort teilen sich zwei Auto-Kanten den Restplatz und zögen die
     Knöpfe an die entgegengesetzten Enden derselben Zeile. */
  .draft-bar-act ~ .draft-bar-act{margin-left:auto}
  /* Am Handy neben das Kurzwort, nicht in die Textzeile: Die Restzeit ist die kürzeste und
     wichtigste Angabe im Band – sie soll auf einen Blick zu finden sein.
     ⚠️ Die Reihenfolge gehört an die HÜLLE, nicht mehr an die Restzeit selbst: Seit die Zahl
     zusammen mit dem Knopf in .draft-bar-zeit sitzt, wirkt ein `order` an ihr nur noch INNERHALB
     dieser Gruppe – und drehte dort prompt die beiden um, sodass am Handy „Weiterarbeiten" vor
     der Uhrzeit stand (gemessen). Für die Leiste ist die Gruppe das eine Element. */
  .draft-bar-zeit{order:2}
}

/* ---------------------------------- Wartungsseite (Issue #84) ----------------------------
   Die Website ist vom Netz: Startseite offline genommen, jede Adresse antwortet mit dieser
   einen Seite. Sie folgt derselben Grundregel wie alles andere – Sandton als Raum, eine weiße
   Fläche darin –, nur ist die Fläche hier die einzige und steht deshalb wirklich in der Mitte.

   Warum MITTIG und nicht oben wie eine Seite: Es gibt nichts darunter. Ein Block, der oben
   klebt, sähe aus wie eine Seite, deren Inhalt nicht geladen hat – und genau diesen Verdacht
   soll die Seite ja ausräumen. In der Mitte liest sie sich als das, was sie ist: eine Ansage.

   svh statt vh: Auf Handys wandert die Adressleiste beim Scrollen ein und aus; mit vh springt
   die Höhe dabei. Die „kleine" Fassung (svh) ist die verlässliche, und weil hier nichts zu
   scrollen ist, verschenkt sie auch nichts. vh bleibt als Rückfall für ältere Browser stehen. */
.wartung{display:flex;align-items:center;justify-content:center;
  min-height:100vh;min-height:100svh;
  padding:var(--band) var(--pad-page)}
/* Steht das Vorschau-Band darüber (LIVE-Ansicht), gehört seine Höhe abgezogen – sonst schöbe
   der mittige Block die Seite um genau diese Höhe ins Scrollen. */
body.has-draft-bar .wartung{min-height:calc(100vh - var(--draft-bar-h));
  min-height:calc(100svh - var(--draft-bar-h))}
.wartung-block{max-width:34rem;width:100%;text-align:center;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);
  box-shadow:var(--shadow-1);padding:clamp(2rem,5vw,3.2rem) clamp(1.4rem,4vw,3rem)}
/* Das Logo etwas kleiner als in der Kopfleiste (dort 4rem): Es ist hier kein Wegweiser mehr,
   sondern nur noch die Auskunft „du bist richtig". Die Datei ist 150 px hoch – bei 3.4rem und
   doppelter Bildschirmauflösung ist die Schärfe-Grenze eingehalten. */
.wartung-logo{height:3.4rem;width:auto;margin:0 0 1.4rem}
.wartung h1{font-size:clamp(1.7rem,1.2rem + 2vw,2.4rem);margin:0 0 1.1rem}
/* Der goldene Zierstrich unter der Überschrift ist ein BLOCK mit fester Breite – von
   text-align:center wird so einer nicht erfasst (das zentriert nur Inline-Inhalt). Er blieb
   deshalb links kleben und sah aus wie ein Versehen. Auto-Ränder zentrieren ihn wirklich. */
.wartung h1::after{margin-left:auto;margin-right:auto}
/* Der Kernsatz ein wenig größer als Fließtext – er ist das Einzige, was gelesen werden MUSS. */
.wartung-lead{font-size:1.12rem;margin:0 0 1.1rem}
.wartung-dank{color:var(--muted);margin:0}
