/* ═══════════════════════════════════════════════════════════════════════════
   Root-Zoom — „115 % ist das neue 100 %" (CEO 2026-09-05, Weg A)

   EINE Zeile skaliert JEDE Seite (Terminal, Login, Landing, Legal, Fehler,
   Abmelde-/Bestaetigungsseite) wie Browser-Zoom 115 % — ohne die 1.792 px-Werte
   in dashboard.css anzufassen. Der Faktor lebt als Token, damit er messbar ist
   und ein spaeterer Regler nur den Wert aendert.

   Drei Dinge, die Browser-Zoom von sich aus richtig macht und CSS-Zoom NICHT
   (gemessen: audit/skalierung update/03_Messung_Weg_A_Koordinaten.md):
     1. Media Queries lesen weiter den UNGEZOOMTEN Viewport. Jede Breiten-Stufe
        traegt deshalb den Faktor und daneben ihren Layout-Wert als Kommentar
        (`1680 x --ui-zoom`); Tailwind `screens` in tailwind.config.js ebenso.
     2. vh/vw werden MIT-gezoomt (100vh zeichnet 115 % der Fensterhoehe). Jede
        vh/vw-Laenge wird durch das Token geteilt: calc(100vh / var(--ui-zoom, 1)).
     3. getBoundingClientRect()/clientX liefern Viewport-px, style.left/top und
        offsetWidth rechnen in Layout-px (÷ Zoom). An jeder Naht rechnet
        window.stUiZoom() / window.stLayoutPx() (shared.js) um.
   Waechter fuer alle drei: tests/test_ui_zoom_weg_a.py.

   Druck kennt keinen Zoom — Faktor 1 (tax_report.html bindet diese Datei gar
   nicht ein). Rueckbau: Token auf 1 UND die Breakpoints wieder durch 1,15.
   Hintergrund und Entscheidungen: audit/skalierung update/00_Befund.md §4, §9.
   ═══════════════════════════════════════════════════════════════════════════ */
:root { --ui-zoom: 1.15; }
html { zoom: var(--ui-zoom); }

/* ───────────────────────────────────────────────────────────────────────────
   HANDY-REGIME — der Faktor 1,15 ist ab hier eine reine Desktop-Sache
   (CEO-Entscheidung A vom 2026-09-07, audit/MOBILE/01_Doktrin_Mobil.md §1).

   WARUM 882/883 UND KEIN ANDERER WERT
   883 = round(768 x 1,15) ist exakt die Tailwind-Stufe `md` und damit die
   Kante, an der dashboard.css heute schon viermal zwischen schmal und breit
   umschaltet (`min-width: 883px` in den Zeilen 577, 2960, 4524, 6005). Der
   Sprung der Layout-Breite an dieser Kante (882 -> 768) faellt deshalb mit
   einem ohnehin vorhandenen Layout-Wechsel zusammen und ist unsichtbar. Eine
   frei gegriffene Grenze haette einen zweiten, sichtbaren Sprung erzeugt.

   ── R-1 (CEO 2026-09-18): DIE GRENZE HAT SEIT HEUTE ZWEI SEITEN ────────────
   Die Breite allein hat eine Lage nicht erwischt, die es wirklich gibt: ein
   Grosshandy im QUERFORMAT. Gemessen am 2026-09-18 bei 932 x 430 im
   LISTS-&-ALERTS-Tab: 190 px Dokumentueberlauf, 102 Texte unter 12 px, die
   kleinste 6,96 px — die Tabelle blieb eine 18-spaltige Tabelle, weil 932 > 882
   ist. Deshalb gilt das Handy-Regime ab jetzt auch bei geringer HOEHE:

       Handy-Regime  :=  (max-width: 882px)  ODER  (max-height: 500px)
       Desktop-Regime:=  (min-width: 883px)  UND   (min-height: 501px)

   WARUM AUSGERECHNET 500/501 — gemessen, nicht gegriffen:
     * UNTERE Klemme (muss Handy werden): die hoechste Querformat-Hoehe aller
       74 Geraete der Playwright-Registry ist 480 px (Galaxy A55 1040 x 480,
       Nokia N9 854 x 480). Die vier Pflichtlagen liegen bei 430 / 414 / 390 /
       375. 500 laesst 20 px Luft ueber dem hoechsten echten Telefon.
     * OBERE Klemme (muss Desktop bleiben): das flachste Tablet der Registry
       misst quer 600 px (Nexus 7 960 x 600); die aktuellen liegen bei 640
       (Galaxy Tab S9), 656 (iPad gen 11), 768 (iPad Mini). Und ein kleiner
       LAPTOP: auf diesem Rechner frisst Chromium gemessen 87 px Fensterchrom
       plus 48 px Taskleiste — von einem 768-px-Bildschirm bleiben ~633 px
       Viewport, mit Lesezeichenleiste ~599. 500 laesst also ~99 px Luft.
     * 500 ist ausserdem die Zahl, die §1.2b seit Etappe 2c ohnehin fuehrt
       (`@media (max-height: 500px)`, das Chrom-Kuerzen). R-1 fuehrt damit
       KEINE zweite Hoehenzahl ein — sonst entstuende ein drittes Band, in dem
       das Chrom schon gekuerzt, das Regime aber noch Desktop waere.
   501 ist der Nachbar von 500 wie 883 der von 882: kein px dazwischen.

   ⚠️ WAS R-1 NICHT ERLEDIGT: Tailwind `screens` (md/lg/xl/2xl) und die
   Desktop-internen Stufen von dashboard.css (1035, 1265, 1357, 1380, 1472,
   1725, 1932) bleiben reine BREITEN-Stufen. Im flachen, breiten Fenster ist
   `--ui-zoom` 1, ihr Kommentarwert `D x --ui-zoom` beschreibt dort also nicht
   mehr die Layout-Breite (Abweichung ~15 %). Das ist bewusst so: sie fragen
   „ist waagerecht Platz?", und der ist dort tatsaechlich da. Belegt und als
   offene Frage vermerkt in audit/MOBILE/35_Regimeschnitt_R1_R2.md.

   WAS DAS REGIME BEDEUTET
   Unterhalb der Kante gilt Layout-px == Viewport-px. Eine Stufe schreibt dort
   ihre Layout-Breite direkt hin und traegt hinter der Klammer den Marker
   „N mobil-1:1" statt „D x --ui-zoom" (als CSS-Kommentar; hier nicht
   ausgeschrieben, weil ein zweites Kommentar-Ende diesen Block schliessen
   wuerde — genau das ist beim Schreiben passiert und der vh-Waechter hat es
   gefunden). Der Breitenstufen-Waechter kennt beide Marker und prueft
   zusaetzlich, dass keine Stufe im falschen Bereich steht (mobil-1:1 nur
   bis 882, der Faktor erst ab 883). Es gibt keine Rueckkopplung: Media
   Queries lesen den UNGEZOOMTEN Viewport (R-13), das Setzen des Zooms aendert
   also nicht, welche Stufe greift.

   WAS DAS VON SELBST MITERLEDIGT
   `window.stUiZoom()` (shared.js) liest `currentCSSZoom` und liefert hier
   deshalb ohne eine Zeile JS von selbst 1 — Flyout, Tooltip, Lupe,
   Kontextmenue, Accounting-Popover und Diagramm-Tooltip hoeren auf zu
   rechnen. Ebenso wird jedes `calc(90vh / var(--ui-zoom, 1))` zu `90vh`.
   Die Schreibweise mit der Teilung bleibt trotzdem Pflicht (der Waechter
   prueft die Schreibweise, nicht das Ergebnis) — und `dvh` ist davon
   ausdruecklich NICHT erledigt (Doktrin §5, Etappe 2c).

   REIHENFOLGE (R-12)
   Dieser Block MUSS hinter `html { zoom: var(--ui-zoom) }` stehen: `@media`
   erhoeht die Spezifitaet nicht, bei gleichem Selektor entscheidet die
   Quellreihenfolge. Oberhalb der Basiszeile waere er ein stiller No-op.
   Der Druckblock darunter bleibt unberuehrt — er setzt den Faktor ohnehin
   auf 1 und steht spaeter, gewinnt also auch auf schmalem Papier.
   ─────────────────────────────────────────────────────────────────────────── */
@media (max-width: 882px), (max-height: 500px) { /* 882 mobil-1:1 */
  :root { --ui-zoom: 1; }
}

@media print {
  :root { --ui-zoom: 1; }
  html { zoom: 1; }
}
