/* ── DNG / KHT — Webfonts ──────────────────────────────────────
   Brand fonts: IBM Plex Sans (body/UI), IBM Plex Mono (labels, nav),
   Playfair Display (headlines). Impact is used for thumbnails, but only
   as a static image asset made in external tools — it is never rendered
   as web text, so it needs no web-font entry here.

   Selbst ausgeliefert (seit 15.8.2026). Vorher lud diese Datei die
   Schriften per @import von Google Fonts; dabei ging bei jedem
   Seitenaufruf die IP-Adresse des Besuchers ohne Einwilligung an
   Google in die USA (LG München I, 3 O 17493/20). Jetzt liegen die
   Dateien in assets/fonts/ — es geht keine Fremdanfrage mehr raus.
   Beide Familien stehen unter der SIL Open Font License; die
   Lizenztexte liegen daneben.

   Nur die tatsächlich verwendeten Schnitte sind hier eingebunden —
   gemessen am Code, nicht geschätzt: Sans 300/400/500/600/700,
   Mono 400, Playfair 400 aufrecht und kursiv. Kein Kursiv in Sans,
   keine Condensed-Breiten, keine weiteren Playfair-Gewichte.
   Kommt ein Schnitt dazu, muss er hier ergänzt werden — sonst
   rechnet der Browser ihn sich aus dem nächstgelegenen zurecht.

   font-display: block, und alle acht Schnitte werden im <head> jeder
   Seite vorgeladen. Zusammen heisst das: der Inhalt erscheint erst,
   wenn die Schriften da sind — dafuer erscheint er genau einmal und
   fertig. Kein Zeichnen in der Ersatzschrift, kein Tausch, kein Sprung.
   Vorher wanderte der Sprung von Element zu Element (mal Hero, mal
   Kicker, mal Kopfzeile), weil die acht Schnitte einzeln und in
   wechselnder Reihenfolge eintrafen und jeder fuer sich ein Neuzeichnen
   ausloeste.

   Die Preloads stehen NACH support.js im <head>. Das Skript baut die
   Seite auf und muss die erste Anfrage bleiben; der Preload-Scanner des
   Browsers findet die Zeilen trotzdem sofort, weil er dem Parser
   vorauslaeuft. Standen sie davor, startete das Skript als fuenfte
   Anfrage — sichtbar langsamer.

   AUSNAHME KOPFZEILE. Sie darf nie leer sein. Deshalb liegen die vier
   Schnitte, die sie benutzt, ein zweites Mal unter eigenem Namen vor
   ('Mono Kopf', 'Sans Kopf') — dieselben Dateien, aber font-display:
   swap. Dieselbe Datei zweimal zu nennen kostet nichts, der Browser
   laedt sie einmal.

   BEIDE VERSUCHE, DAS ZU "VERBESSERN", HABEN GEBLINKT:
   - Kopf-Faces entfernt, alles auf block: die Kopfzeile war beim
     Seitenwechsel kurz leer.
   - Leinwandfarbe und Logo-Schablone als <style> in den <head>: hat das
     Blinken erst ausgeloest. Nicht wieder einbauen.

   Format WOFF2, auf Latein zugeschnitten: 1560 KB (ttf) → 775 (woff)
   → 534 (woff2) → 227 KB. 85 Prozent kleiner als am Anfang.
   Unterstuetzt von jedem Browser seit 2016, deshalb kein Rueckfall auf
   .woff und keine zweite src-Zeile.

   Der Zuschnitt ist Latein plus die Sonderzeichen, die im sichtbaren
   Text der neun Seiten wirklich vorkommen — am Quelltext ausgezaehlt:
   § © · Ä Ö Ü ss à ä ö ü – — „ … € →. Das Pfeilzeichen liegt
   ausserhalb von Latin Extended und musste einzeln aufgenommen werden;
   fehlt es, holt der Browser den Pfeil aus einer Fremdschrift und er
   sieht anders aus als der Text um ihn herum. WER NEUE SONDERZEICHEN
   IN DEN TEXT SETZT, muss pruefen, ob sie im Zuschnitt enthalten sind. */

@font-face {
  font-family: 'IBM Plex Sans';
  src: url('../../../assets/fonts/IBMPlexSans-Light.woff2') format('woff2');
  font-weight: 300;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'IBM Plex Sans';
  src: url('../../../assets/fonts/IBMPlexSans-Regular.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'IBM Plex Sans';
  src: url('../../../assets/fonts/IBMPlexSans-Medium.woff2') format('woff2');
  font-weight: 500;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'IBM Plex Sans';
  src: url('../../../assets/fonts/IBMPlexSans-SemiBold.woff2') format('woff2');
  font-weight: 600;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'IBM Plex Sans';
  src: url('../../../assets/fonts/IBMPlexSans-Bold.woff2') format('woff2');
  font-weight: 700;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'IBM Plex Mono';
  src: url('../../../assets/fonts/IBMPlexMono-Regular.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'Playfair Display';
  src: url('../../../assets/fonts/PlayfairDisplay-Regular.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'Playfair Display';
  src: url('../../../assets/fonts/PlayfairDisplay-Italic.woff2') format('woff2');
  font-weight: 400;
  font-style: italic;
  font-display: block;
}

/* ── Massgleiche Ersatzschriften ───────────────────────────────
   Diese drei Faces sind die Voraussetzung dafuer, dass oben swap stehen
   darf. swap zeichnet den Text sofort in der Ersatzschrift und tauscht
   ihn spaeter gegen die echte. Sind beide unterschiedlich breit, aendert
   sich beim Tausch die Zeilenbreite und die Zeile rutscht — genau das
   war das Zucken im Kicker und der springende Titel. size-adjust macht
   die Ersatzschrift so breit wie die echte; dann ist der Tausch
   unsichtbar.

   WER SIE ENTFERNT, MUSS GLEICHZEITIG swap ERSETZEN. Sie haengen
   zusammen: ohne Massangleichung ist swap die falsche Wahl.

   Gemessen am selben Text, gleiche Groesse, gegen die Standard-Ersatz-
   schriften von macOS und Windows (Times, Courier, Arial):
     IBM Plex Mono ist massgleich mit Courier  → 100 %
     Playfair      ist 10,9 % breiter als Times → 110,9 %
     IBM Plex Sans ist  0,3 % schmaler als Arial →  99,7 %
       (an fuenf repraesentativen Texten gemittelt, nicht an einem —
        Proportionalschriften lassen sich nie exakt angleichen; 98,6 %
        stammte aus einer Einzelmessung und lag rund 1 % zu schmal)

   ACHTUNG, hier lag schon einmal ein Fehler: Plex Mono ist 9,1 % breiter
   als das generische Schluesselwort "monospace" — aber NICHT breiter als
   Courier, das selbst schon 9,1 % breiter ist als die generische Vorgabe.
   Der Faktor gehoert gegen die Schrift gerechnet, die local() tatsaechlich
   laedt, nicht gegen das Schluesselwort. Mit 109,1 % war der Kicker
   9 % zu breit und sprang beim Laden zusammen statt auseinander.

   size-adjust skaliert die Ersatzschrift genau um diesen Faktor. Damit
   ist die vorlaeufige Zeile so breit wie die endgueltige und es rutscht
   nichts mehr. Die Ersatzschriften werden nicht geladen — sie kommen
   aus dem Betriebssystem (local) und kosten keine Uebertragung.

   In jeder Liste stehen nur MASSGLEICHE Klone: Liberation Serif, Tinos
   und Nimbus Roman haben exakt die Masse von Times, Liberation Mono und
   Cousine die von Courier, Liberation Sans und Arimo die von Arial.
   Deshalb stimmt derselbe Faktor auf allen Systemen. Ist KEINER der
   Namen vorhanden (sehr karge Linux-Installationen), greift die
   Korrektur nicht — dann ist es wie vorher, nicht schlechter.

   WICHTIG: Diese Namen muessen in den Schriftlisten der Seiten stehen,
   VOR dem generischen Namen:
     font-family: 'IBM Plex Mono', 'Mono Ersatz', monospace
   Ohne den Eintrag greift die Korrektur nicht. */

@font-face {
  font-family: 'Mono Ersatz';
  src: local('Courier New'), local('Liberation Mono'), local('Cousine'),
       local('Nimbus Mono PS'), local('FreeMono');
  size-adjust: 100%;
}
@font-face {
  font-family: 'Serif Ersatz';
  src: local('Times New Roman'), local('Times'), local('Liberation Serif'),
       local('Tinos'), local('Nimbus Roman'), local('FreeSerif');
  size-adjust: 110.9%;
}
@font-face {
  font-family: 'Sans Ersatz';
  src: local('Arial'), local('Helvetica'), local('Liberation Sans'),
       local('Arimo'), local('Nimbus Sans'), local('FreeSans');
  size-adjust: 99.7%;
}

/* ── Kopfzeile: dieselben Dateien, aber swap ───────────────────
   Die Kopfzeile soll nie leer stehen, auch nicht fuer 50 ms. Sie nutzt
   Mono 400 und Sans 400/600/700 — nur diese vier liegen hier doppelt.
   Wird die Kopfzeile umgebaut und braucht einen anderen Schnitt, muss
   er hier ergaenzt werden, sonst faellt er auf block zurueck und die
   Zeile bleibt kurz leer. */

@font-face {
  font-family: 'Mono Kopf';
  src: url('../../../assets/fonts/IBMPlexMono-Regular.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Sans Kopf';
  src: url('../../../assets/fonts/IBMPlexSans-Regular.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Sans Kopf';
  src: url('../../../assets/fonts/IBMPlexSans-SemiBold.woff2') format('woff2');
  font-weight: 600;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Sans Kopf';
  src: url('../../../assets/fonts/IBMPlexSans-Bold.woff2') format('woff2');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}
