
/* ---- theme.css ---- */
/* Token-Fundament nach design-tokens.md (Design-Paket, Freigabe 28.08.2026).

   EINE Wahrheitsquelle: alle Tokens stehen HIER, nicht in app.css. Wer dort
   ein :root aufmacht, baut eine zweite Quelle — genau das war der Grund fuer
   das doppelte --spring (app.css) und das im Grau-Theme fehlende --zebra.

   Bestandsnamen (--green/--amber/--red/--surface/--border/--chart-*) bleiben
   die kanonischen Namen: app/views/charts.js liest sie zur Laufzeit per
   getComputedStyle, app/lib/svg.js schreibt sie als var(--x) in serverseitige
   SVG, app/views/bericht.js fuehrt eine EIGENE Kopie derselben Namen (PDF,
   ohne Zugriff auf diese Datei). NICHT umbenennen — ein neuer Name faende
   dort keine Definition und die Farbe fiele auf initial zurueck.

   Die Spec-Vokabeln (--card/--ok/--warn/--bad/--d1…, --font, --mono, --r-sm
   bis --r-pill, --focus, --t1…) sind Aliase fuer NEUE Komponenten und loesen
   ueber die Bestandsnamen auf. TOTER CODE, NOTIERT (03.09.2026): bis auf
   --mono und --card-2 hat KEINER dieser Aliasnamen einen Leser — dasselbe
   gilt fuer --d1…--d4, --d1-soft…--d4-soft und --chart-bg. Sie bleiben
   vorerst stehen, weil das Baustein-Stylesheet (sr-bausteine.css) noch
   waechst; das Aufraeumen ist eine eigene Aufgabe, keine Nebenwirkung.

   ABSTANDSRASTER --s1…--s7 IST SEIT DEM 03.09.2026 IN GEBRAUCH. Es stand
   fuenf Tage lang hier und wurde von keiner einzigen Regel gelesen, waehrend
   die drei Stylesheets 226 verschiedene Pixelwerte fuehrten. Es ist jetzt
   das verbindliche Raster (plus --s0 4px und --s-2 2px fuer Chips und
   Haarlinien) und bleibt bewusst bei 6/10/16/26/38/58/88 statt beim
   4px-Raster der Spec. Aus demselben Grund gibt es KEIN --s8: 64px waere in
   dieser Skala kleiner als --s7 (88px) und damit eine Falle.
       ACHTUNG, falsche Freunde: die Leit-Screens benutzen DIESELBEN Namen
       mit ANDEREN Werten (--s4 dort 16px, hier 26px). Wer eine Komponente
       aus einem Leit-Screen uebernimmt, rechnet die Abstaende um — er
       uebertraegt NICHT das var(--s4) aus der Vorlage.
   BFSG-KONTRAST (30.08.2026) — drei Toene nachgezogen, alle nachgerechnet
   gegen die --surface des JEWEILIGEN Themes (WCAG-2.x-Formel; scripts/
   css-pruefen.js rechnet es bei jedem Lauf nach und schlaegt Alarm):
     · --text-3 traegt durchgehend Kleintext von 11 bis 14,5 px
       (.projekt-domain, .chart-hinweis, .diff-zeit, .cluster-sub, .sr-kpi-label,
       .nav-group …) und muss deshalb die 4,5:1 fuer Fliesstext halten, nicht
       die 3:1 fuer Grosstext. Grau lag bei 4,16:1, Dunkel bei 4,31:1 —
       beide durchgefallen. Beide jetzt #9ea5b1: Grau 5,25:1, Dunkel 6,31:1.
       Hell lag bei 4,70:1 auf --surface und galt damit als erledigt — die
       Rechnung stand aber nur gegen --surface. Am 30.08.2026 wurde am
       laufenden DOM nachgesehen, worauf --text-3 im hellen Thema
       TATSAECHLICH steht: auf vier Flaechen, nicht auf einer.
         --surface  #ffffff  4,70:1  erfuellt
         --surface-2 #f6f7f9 4,38:1  (.kc, .section-num, .ct, 10 Klassen)
         --bg       #f3f4f6  4,27:1  (.unterkapitel-tab-num/-text, 108 Vorkommen)
         --hover    #eceef2  4,04:1  (.delta-neutral)
         --bg-deep  #e9ebef  3,94:1
       Vier von fuenf durchgefallen. Hell jetzt #5f6673: 5,78 / 5,39 / 5,25 /
       4,97 / 4,84 — und selbst mit Zebra-Zeile darunter nirgends unter
       4,57:1. Die Pruefung in scripts/css-pruefen.js rechnet seither gegen
       --surface, --surface-2, --bg und --bg-deep statt nur gegen --surface.
       Der Wert liegt bewusst etwas ueber dem naheliegenden #99a0ac (Grau
       4,95:1): #99a0ac faellt auf --surface-2 auf 4,33:1 zurueck, und genau
       dort stehen .cluster-sub und .section-num. #9ea5b1 haelt die 4,5:1
       auch dort (Grau 4,60:1, Dunkel 5,67:1).
     · --link im HELLEN Theme war der Hausakzent #00abd7 — 2,69:1 auf
       --surface, 2,44:1 auf --bg. Ein Link, den man nur an der Farbe
       erkennt, muss 4,5:1 halten; jetzt #00738f (5,46:1 auf --surface,
       4,96:1 auf --bg, schlechtester Fall 4,57:1 auf --bg-deep). Grau
       (#2fc0e2) und Dunkel (#cdeffb) lagen bereits deutlich darueber.
     · --focus-ton siehe unten am Token.
   NICHT geaendert (bewusst): --accent selbst bleibt #00abd7. Er traegt
   Flaechen (Knoepfe, Indikatoren, Balken) und Grosstext, nie Fliesstext —
   die beiden Rollen, an denen er zu hell war (Link, Fokusring), haben jetzt
   eigene Toene.

     · 'Inter' steht dem Systemschrift-Stack voran und wird seit dem
       03.09.2026 auch AUSGELIEFERT: @font-face direkt darunter, Datei
       app/assets/fonts/inter-latin.woff2 (48 KB, variable Achse wght
       100-900, Inter 4.001, SIL OFL 1.1 — Lizenztext liegt daneben),
       Route GET /assets/font/:datei in app/server.js, CSP `font-src 'self'`.
       Vorher stand die Schrift nur im Stack, ohne Datei: gerendert wurde auf
       jedem Geraet eine andere Systemschrift, und app/views/bericht.js
       (eigener Stilbaum, gleicher Stack) bekam beim PDF-Druck die
       Ersatzschrift des Servers. */
/* EINE Datei, EINE Achse. Die variable woff2 traegt die Gewichte 100-900
   stufenlos; die vier Gewichte des Designsystems (450 Text, 600 Bedienung,
   700 Titel, 800 Wortmarke/Score) kommen damit ohne zweite Datei aus.
   font-display:swap — die Seite steht sofort in der Systemschrift und tauscht
   nach, statt unsichtbaren Text zu zeigen (FOIT). */
@font-face{font-family:'Inter';font-style:normal;font-weight:100 900;font-display:swap;
  src:url('/assets/font/inter-latin.woff2') format('woff2')}
:root{--font-body:'Inter',system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;--font-mono:ui-monospace,'SF Mono',Menlo,Consolas,monospace;--font-num:'Inter',system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;--theme-background-primary:#00abd7;
/* MARKENFARBE DES MANDANTEN. Hier steht nur der Rueckfall auf die
   Hausfarbe; den echten Wert setzt app/views/layout.js je Seite aus
   design.primary des Mandanten (Inline-Style mit Nonce, direkt hinter
   diesem Blatt und damit staerker). Wer die Farbe des Kunden braucht —
   etwa der Fuellbogen der Donut-Ringe im Cockpit — nimmt diese Variable
   und nicht --sr-acc: --sr-acc ist die Hausfarbe und bleibt es auch bei
   einem Mandanten mit eigenem Design. */
--sr-marke:var(--sr-acc);
--ease:cubic-bezier(.23,1,.32,1);--spring:cubic-bezier(.34,1.56,.64,1);--ease-in:cubic-bezier(.55,0,1,.45);--t-fast:120ms;--t-med:200ms;--t-slow:300ms;
--header-h:100px;
/* ABSTANDSRASTER (Designsystem „SEO-Radar", Fassung 03.09.2026, Kapitel
   Layout). Die Skala stand seit dem 28.08.2026 hier und wurde von KEINER
   Regel benutzt (Inventar 03.09.2026: --s1 bis --s7 mit 0 Verwendungen) —
   die Dateien setzten stattdessen 226 verschiedene Pixelwerte. Sie ist jetzt
   das verbindliche Raster; --s0 und --s-2 kommen fuer Chips und Haarlinien
   dazu, weil 6 px als kleinster Wert fuer ein 1-px-Abzeichen zu grob ist.
   ACHTUNG, falsche Freunde: die Leit-Screens des Design-Pakets benutzen
   DIESELBEN Namen mit ANDEREN Werten (--s4 dort 16px, hier 26px). */
--s-2:2px;--s0:4px;--s1:6px;--s2:10px;--s3:16px;--s4:26px;--s5:38px;--s6:58px;--s7:88px;
/* RADIEN (Designsystem, Kapitel Shapes). Fuenf Stufen, sonst keine:
   4 Badges/Chips · 6 Knoepfe/Felder/Reiter · 8 Karten/Kacheln · 10
   Modal/Drawer · 999 echte Pille. Die Bestandsnamen --rsm/--rmd/--rlg/--rpill
   zeigen auf dieselben Werte, damit app.css nicht Zeile fuer Zeile
   umgeschrieben werden muss; --rmd war 9px, --rlg 12px — beide Sonderwerte
   sind damit weg. */
--sr-r-xs:3px;--sr-r-sm:5px;--sr-r-md:7px;--sr-r-lg:9px;--sr-r-pill:999px;
--rsm:var(--sr-r-sm);--rmd:var(--sr-r-md);--rlg:var(--sr-r-lg);--rpill:var(--sr-r-pill);
/* TYPO-SKALA (Designsystem, Kapitel Typography). Feste Groessen und Werte
   statt clamp(): die alten sieben clamp()-Stufen lieferten je nach Fenster
   eine andere Zahl, und daneben standen 47 einzeln gesetzte Groessen bis
   hinunter zu 12,92 px. Eine Skala, die man nicht nennen kann, ist keine.
   Die frueheren Bestandsnamen --fs-xs/sm/md/lg/xl/num sind ersatzlos weg:
   sie waren ein zweiter Name fuer dieselbe Stufe, und ein zweiter Name ist
   die haeufigste Art, wie eine Skala wieder auseinanderlaeuft. */
--fs-label:11.5px;--fs-small:12.5px;--fs-ui:13px;--fs-body:14px;--fs-h2:17px;
--fs-h1:22px;--fs-kpi-compact:26px;--fs-kpi-standard:32px;--fs-kpi-hero:40px;
--fs-kpi:var(--fs-kpi-standard);--fs-mono:12.5px;
/* KPI-Stufen: kompakte Kacheln 26 px, Standard 32 px, grosse Scores 40 px. */
--fs-score:var(--fs-kpi-hero);
/* AUSNAHME, begruendet: Kleinsttext IN den serverseitig gezeichneten SVGs
   (.chart-axis, .chart-grenzwert-label, .chart-marke-nummer und der
   Legenden-Chip daneben). Diese Grafiken haben eine FESTE viewBox, und
   app/lib/svg.js rechnet Randbreiten und Markerkreise auf diese Schriftgroesse
   — die Marker-Nummer sitzt in einem Kreis mit r=7,5 (svg.js:390). Auf
   --fs-mono (12,5 px) waeren zwei Ziffern so breit wie der Kreis. */
--fs-svg:11px;
/* Gewichte: Hierarchie kommt aus Gewicht und Groesse, nicht aus Farbe. */
--fw-body:450;--fw-ui:600;--fw-bold:700;--fw-black:800;
/* Zeilenhoehen je Rolle (Designsystem, Tabelle Hierarchie). */
--lh-h1:1.2;--lh-h2:1.25;--lh-body:1.5;--lh-ui:1.2;--lh-label:1.3;--lh-small:1.45;--lh-kpi:1.05;--lh-score:1;--lh-mono:1.5;
--content-max:min(1180px,100%);--inhalt-breite:90%;--inhalt-faktor:.9;
/* --inhalt-faktor ist DERSELBE Wert wie --inhalt-breite, nur einheitenlos
   (87 % -> .87). Er wird gebraucht, weil calc() nicht durch einen
   Prozentwert teilen darf: die Stufen unten rechnen den Schieber in die
   feste Buehnenbreite hinein (siehe sr.css, Punkt 2 vom 04.09.2026).
   Gesetzt wird er zusammen mit --inhalt-breite in theme.js und app.js. */
/* GESTAFFELTE INHALTSBREITEN (01.09.2026). Bis hierher hatte JEDE Seite
   dieselbe Breite -- gemessen 1.212 px bei 1440 px Fenster, auf einem
   1920er entsprechend mehr. Eine Zeile Fliesstext lief damit ueber die
   doppelte lesbare Laenge, waehrend die Tabellen genau so viel Platz
   bekamen wie das Konto-Formular. Die drei Werte sind Stufen nach ZWECK,
   nicht nach Seitentyp: lesen = Fliesstext und Formulare, uebersicht =
   Kacheln und schmale Tabellen, arbeit = breite Tabellen mit Diagrammen.
   Wer KEINE Stufe setzt, behaelt die volle Breite -- das ist der Fall fuer
   die Verwaltungslisten und die Anbindungen (8-9 Spalten).
   Gesetzt wird die Stufe in app/server.js je Route (breite:'lesen'|
   'uebersicht'|'arbeit'), gerendert in layout.js, angewandt in sr.css. */
--sr-breite-lesen:672px;--sr-breite-uebersicht:1024px;--sr-breite-arbeit:1136px;
--accent:#00abd7;--accent-deep:#0089ad;--on-accent:#04242e;
/* KI-Bot-Kategorien: Training = Blau, KI-Suche = Gelb,
   Live-Nutzerfrage = Rot. Verlauf, Legende und Bot-Balken lesen diese Rollen. */
--ki-bot-training:#2a78d6;--ki-bot-suche:#9a7b00;--ki-bot-nutzer:#cf3535;
/* BFSG/WCAG 1.4.11 (Kontrast von Bedienelementen, 30.08.2026): der Fokusring
   lief bisher auf --accent. Im HELLEN Theme steht #00abd7 nur bei 2,44-2,69:1
   gegen die Inhaltsflaechen und verfehlt die geforderten 3:1 -- der Ring war
   dort also da, aber nicht zuverlaessig sichtbar. --focus-ton ist deshalb ein
   EIGENER Ton je Theme (siehe die drei Theme-Bloecke unten): hell der tiefere
   Hausakzent --accent-deep #0089ad (3,40-4,05:1), grau und dunkel unveraendert
   #00abd7 (4,24-6,89:1). Kein neuer Farbwert, nur der jeweils tragfaehige der
   beiden Hausakzente. Die Fokus-Umrisse in app.css nutzen denselben Token. */
--focus-ring:0 0 0 2px var(--bg),0 0 0 4px var(--focus-ton);
/* Spec-Schreibweisen als Alias — die Leit-Screens des Design-Pakets sind in
   diesen Namen geschrieben, der App-Bestand in den kurzen. Beide gelten. */
--font:var(--font-body);--mono:var(--font-mono);--r-sm:var(--rsm);--r-md:var(--rmd);--r-lg:var(--rlg);--r-pill:var(--rpill);--focus:var(--focus-ring);--t1:var(--t-fast);--t2:var(--t-med);--t3:var(--t-slow);
--card:var(--surface);--card-2:var(--surface-2);--ok:var(--green);--warn:var(--amber);--bad:var(--red);--ok-soft:var(--green-dim);--warn-soft:var(--amber-dim);--bad-soft:var(--red-dim);--d1:var(--chart-t1);--d2:var(--chart-t2);--d3:var(--chart-t3);--d4:var(--chart-t4);--chart-bg:var(--chart-flaeche);
/* Flaechenvarianten der Datenfarben (Spec: 18 % Alpha). Abgeleitet statt
   abgeschrieben — so folgen sie jedem Theme-Wechsel und jeder kuenftigen
   Palettenkorrektur von selbst. Faellt color-mix aus (Browser vor 2023),
   bleibt der Token undefiniert und die Flaeche schlicht ungefuellt; kein
   Bestandscode haengt daran. */
--d1-soft:color-mix(in srgb,var(--chart-t1) 18%,transparent);--d2-soft:color-mix(in srgb,var(--chart-t2) 18%,transparent);--d3-soft:color-mix(in srgb,var(--chart-t3) 18%,transparent);--d4-soft:color-mix(in srgb,var(--chart-t4) 18%,transparent)}
[data-theme="dark"]{--bg:var(--sr-bg);--bg-deep:var(--sr-bg);--surface:var(--sr-surface);--surface-2:var(--sr-soft);--hover:var(--sr-soft);--border:var(--sr-hair);--border-l:var(--sr-hair);--line:rgba(255,255,255,.08);--scrim:rgba(8,8,10,.58);--accent-soft:rgba(0,171,215,.16);--focus-ton:var(--sr-acc-line);--glow-a:rgba(0,171,215,.22);--accent-glow:radial-gradient(closest-side,var(--glow-a),transparent 70%);--zebra:rgba(255,255,255,.035);--scroll-schatten:rgba(0,0,0,.7);--e1:0 1px 2px rgba(0,0,0,.28),0 2px 12px rgba(0,0,0,.30);--e2:0 4px 10px rgba(0,0,0,.35),0 16px 40px rgba(0,0,0,.42);--e3:0 10px 24px rgba(0,0,0,.45),0 40px 96px rgba(0,0,0,.55);--edge:inset 0 0 0 1px rgba(255,255,255,.055);--text:var(--sr-ink);--text-2:var(--sr-mut);--text-3:var(--sr-mut);--link:var(--sr-acc-ink);--blue:#7aa2ff;--blue-dim:rgba(122,162,255,.14);--green:var(--sr-ok-ink);--green-dim:rgba(74,222,128,.14);--red:var(--sr-err-ink);--red-dim:rgba(248,113,113,.14);--amber:var(--sr-warn-ink);--amber-dim:rgba(251,191,36,.14);--header-bg:#0c0d10;--thead-bg:var(--sr-surface);--thead-fg:var(--sr-mut);--chapter-bar:#8b93a3;--rule:#454b57}
/* SEO-Radar-Anpassung (Bauplan 26.08.2026, E6/O4; Palette 27.08.2026 an den
   Cortex-„dim"-Modus angelehnt, Betreiber-Wunsch): dritter Zustand „Grau"
   (medium). Bis zum 06.09.2026 ein helles Mittelgrau mit dunkler Schrift;
   seitdem — wie der Cortex-„dim"-Modus selbst — ein DUNKLES Grau mit heller
   Schrift, einen Tick heller als Cortex (Flaechen im Block
   [data-theme="medium"] weiter unten). Gehoert zur App, nicht zur
   Haus-Vorlage. */
[data-theme="medium"]{--bg:var(--sr-bg);--bg-deep:var(--sr-bg);--surface:var(--sr-surface);--surface-2:var(--sr-soft);--hover:var(--sr-soft);--border:var(--sr-hair);--border-l:var(--sr-hair);--line:rgba(255,255,255,.09);--scrim:rgba(10,11,13,.52);--accent-soft:rgba(0,171,215,.16);--focus-ton:var(--sr-acc-line);--glow-a:rgba(0,171,215,.22);--accent-glow:radial-gradient(closest-side,var(--glow-a),transparent 70%);--zebra:rgba(255,255,255,.035);--scroll-schatten:rgba(0,0,0,.7);--e1:0 1px 2px rgba(0,0,0,.28),0 2px 12px rgba(0,0,0,.30);--e2:0 4px 10px rgba(0,0,0,.35),0 16px 40px rgba(0,0,0,.42);--e3:0 10px 24px rgba(0,0,0,.45),0 40px 96px rgba(0,0,0,.55);--edge:inset 0 0 0 1px rgba(255,255,255,.055);--text:var(--sr-ink);--text-2:var(--sr-mut);--text-3:var(--sr-mut);--link:var(--sr-acc-ink);--blue:#82a5f5;--blue-dim:rgba(130,165,245,.14);--green:var(--sr-ok-ink);--green-dim:rgba(87,214,141,.13);--red:var(--sr-err-ink);--red-dim:rgba(244,124,124,.13);--amber:var(--sr-warn-ink);--amber-dim:rgba(245,184,61,.14);--header-bg:#1b1d21;--thead-bg:var(--sr-surface);--thead-fg:#c9ced6;--chapter-bar:#8b93a3;--rule:#5c626c}
[data-theme="light"]{--bg:var(--sr-bg);--bg-deep:var(--sr-bg);--surface:var(--sr-surface);--surface-2:var(--sr-soft);--hover:var(--sr-soft);--border:var(--sr-hair);--border-l:var(--sr-hair);--line:rgba(23,26,32,.08);--scrim:rgba(16,18,22,.38);--accent-soft:rgba(0,171,215,.10);--focus-ton:var(--sr-acc-line);--glow-a:rgba(0,171,215,.18);--accent-glow:radial-gradient(closest-side,var(--glow-a),transparent 70%);--zebra:rgba(16,20,27,.03);--scroll-schatten:rgba(0,0,0,.28);--e1:0 1px 2px rgba(18,22,29,.05),0 2px 10px rgba(18,22,29,.06);--e2:0 2px 6px rgba(18,22,29,.07),0 12px 32px rgba(18,22,29,.12);--e3:0 8px 20px rgba(18,22,29,.12),0 32px 80px rgba(18,22,29,.20);--edge:inset 0 0 0 1px var(--line);--text:var(--sr-ink);--text-2:var(--sr-mut);--text-3:var(--sr-mut);--link:var(--sr-acc-ink);--blue:#2563eb;--blue-dim:rgba(37,99,235,.09);--green:var(--sr-ok-ink);--green-dim:rgba(40,111,62,.11);--red:var(--sr-err-ink);--red-dim:rgba(220,38,38,.09);--amber:var(--sr-warn-ink);--amber-dim:rgba(180,83,9,.11);--header-bg:#0a0a0a;--thead-bg:var(--sr-surface);--thead-fg:var(--sr-mut);--chapter-bar:#0a0a0a;--rule:#c2c7d0}
/* ===================================================================== R3
   Design-Paket „SEO-Radar R3" (30.08.2026) — eigene Farbwelt, ein Akzent.
   Alle Tokens tragen das Praefix --sr-, damit sie sich nicht mit den
   Bestandsnamen beissen (--line heisst im Bestand eine rgba-Haarlinie, im
   Paket eine deckende Rahmenfarbe).

   ABWEICHUNGEN VOM PAKET, alle aus derselben Ursache: die gelieferten Toene
   verfehlen an 14 Stellen die Kontrastvorgaben, gegen die dieses Projekt
   seit dem 30.08. automatisch prueft. Betreiber-Entscheid 30.08.2026:
   „Toene nachziehen, Gate bleibt scharf". Geaendert wurde ausschliesslich
   die HELLIGKEIT von Textfarben — Farbton und Saettigung bleiben, die
   Flaechen (--sr-bg/--sr-nav/--sr-surface/--sr-soft/--sr-line/--sr-hair)
   und der Akzent #00abd7 sind unveraendert aus dem Paket uebernommen.

     Paket        korrigiert   warum
     --mut        --sr-mut     4,21:1 auf --bg (hell), 3,35:1 (medium)
     --acc-ink    --sr-acc-ink 4,34:1 auf --bg (hell), 2,01:1 (medium)
     --ok/warn/   --sr-*-ink   Badge-Text auf 12-15 % Eigenfarbe: 1,64-3,40:1
       err/info                (deshalb je ein eigener Textton zur Flaeche)
     --tabmut     --sr-tabmut  medium: weiss auf --bg nur 2,23:1 — im
                               mittleren Thema tragen die Seiten-Tabs
                               deshalb den dunklen Textton statt weiss.
     (neu)        --sr-acc-line Zustandsanzeiger brauchen 3:1 (WCAG 1.4.11).
                               #00abd7 haelt das nur im dunklen Thema.
     (neu)        --sr-feld-line Rahmen von Eingabefeldern, ebenfalls 3:1.
                               --sr-line (1,23:1) ist eine Trennlinie, kein
                               Bedienelement-Rahmen — zwei Rollen, zwei Toene.

   Die weisse Schrift auf den vollflaechigen Statuskacheln (Severity !/i)
   haelt auf keiner der drei Statusfarben 4,5:1 (2,17-3,96). Sie traegt
   deshalb --sr-auf-status (dunkel); nur --sr-info ist hell genug fuer weiss. */
:root{
/* Die R3-Rollennamen zeigen auf die Radius-Skala oben statt eigene Zahlen zu
   fuehren. --sr-r-pill hiess 9 px und war damit keine Pille — der Name ist
   jetzt --sr-r-tag (Zaehler-Chip, Glocken-Zahl, Punkt), und --sr-r-pill oben
   ist die echte Pille (999 px). */
--sr-r-card:var(--sr-r-md);--sr-r-modal:var(--sr-r-lg);--sr-r-ctl:var(--sr-r-sm);--sr-r-badge:1px;--sr-r-tag:8px;
/* KNOPFTEXT IST DUNKEL, DIE FLAECHE IST DER AKZENT (Designsystem 03.09.2026,
   Kapitel Akzent — „Weiss auf Cyan liegt bei 2,7:1 und ist verboten").
   Bis dahin lief es andersherum: der Knopf bekam eine eigene, tiefere Flaeche
   (#0081a2), damit WEISS darauf 4,50:1 haelt — exakt auf der Grenze, und eine
   zweite Knopffarbe im Haus. Jetzt traegt der Knopf das Haus-Cyan #00abd7 mit
   --sr-on-acc #04242e (6,0:1) wie Cortex und Ackermann Online, Hover
   --sr-acc-deep #0089ad (4,0:1 — nur der Hover-Moment, nie Ruhezustand).
   Der Rand in --sr-acc-line bleibt: die Flaeche allein haelt gegen den
   Seitengrund nicht ueberall 3:1, und ein gefuellter Knopf ohne erkennbare
   Kante ist ein Bedienelement ohne Umriss. */
--sr-auf-status:#10141a;--sr-auf-info:#ffffff;--sr-on-acc:#04242e;--sr-acc-knopf:#00abd7;
/* Hover des Primaerknopfs — eine Stufe tiefer, Text bleibt --sr-on-acc. */
--sr-acc-deep:#0089ad;
/* KNOEPFE: WEISS AUF BLAU, OHNE RAND, MIT SCHATTEN (Betreiber-Vorgabe
   06.09.2026, „IMMER weisse Schrift auf Blau (hell/grau/dunkel), niemals
   Rand, immer Schlagschatten, animiert bei Benutzung mit leichtem
   Schwebeeffekt"). Das Haus-Cyan #00abd7 traegt Weiss nur mit 2,7:1 und
   scheidet als Knopfflaeche aus. Das Knopfblau ist der TIEFERE Ton
   derselben Hausfarbe (SuperStyler-Stellungnahme 06.09.2026, gemessen):
   #007fa0 haelt Weiss mit 4,62:1 (AA), Hover #006d89 5,9:1, gedrueckt
   #005f77 7,2:1 — in allen drei Themen dieselben Werte, weil die Flaeche
   selbst die Kontrastbasis ist. Der Schatten traegt den Blauton (kein Grau),
   damit der Knopf „leuchtet" statt zu kleben; der Fokusring bleibt
   (--focus-ton), er sitzt AUSSEN. Dunkle Themen: gleiche Geometrie,
   Schattenfarbe Schwarz (unten je Thema). */
--knopf-blau:#007fa0;--knopf-blau-hover:#006d89;--knopf-blau-aktiv:#005f77;--auf-knopf:#ffffff;
--knopf-schatten:0 1px 2px rgba(0,63,80,.20),0 4px 10px rgba(0,63,80,.16);
--knopf-schatten-hover:0 2px 4px rgba(0,63,80,.22),0 8px 18px rgba(0,63,80,.20);
--knopf-schatten-aktiv:0 1px 2px rgba(0,63,80,.24);
--knopf-rot:#c53030;--knopf-rot-hover:#a82727;
--knopf-rot-schatten:0 1px 2px rgba(197,48,48,.28),0 4px 12px rgba(197,48,48,.28);
--sr-nav-w:240px;--sr-gap:var(--s4);--sr-gap-kpi:16px;
/* Hoehe des klebenden Seitenkopfs. Der Wert hier ist nur der Startwert fuer
   den Fall, dass kein JavaScript laeuft — app.js MISST den Kopf und schreibt
   die tatsaechliche Hoehe ans <html> fort (Baustein 18b). sr.css rechnet
   daraus den Versatz jedes Ankersprungs. */
--sr-kopf-h:96px;
/* Vorschaufarben der drei Theme-Kreise. Sie zeigen ein ANDERES Thema als das
   gerade aktive und koennen deshalb nicht aus den Theme-Tokens kommen —
   sonst waeren alle drei Kreise gleich. Werte = --bg des jeweiligen Themas. */
--sr-vorschau-light:#f2f3f5;--sr-vorschau-medium:#2b2e34;--sr-vorschau-dark:#191c20;
/* ------------------------------------------------- Toene auf DUNKLEM Grund
 * Es gibt drei Stellen, die in JEDEM Theme dunkel bleiben: der alte
 * Kopfbalken samt Burger und Themenschalter (Altbestand, siehe unten), die
 * Log-Konsole der Anbindungen und der QR-Kasten der Zwei-Faktor-Einrichtung.
 * Sie standen bis zum 03.09.2026 mit 55 festen Farbwerten in app.css und im
 * Basisteil dieser Datei — also ausserhalb jeder Token-Pruefung. Sie sind
 * KEINE Theme-Tokens (sie wechseln nicht mit dem Theme), aber sie sind
 * benannt und stehen an einer Stelle. */
--auf-dunkel:#ffffff;
--auf-dunkel-stark:rgba(255,255,255,.84);
--auf-dunkel-schwach:rgba(255,255,255,.52);
--auf-dunkel-flaeche:rgba(255,255,255,.08);
--auf-dunkel-fein:rgba(255,255,255,.16);
--auf-dunkel-kante:rgba(255,255,255,.07);
--auf-dunkel-hauch:rgba(255,255,255,.06);
--nav-aktiv-schatten:rgba(0,0,0,.22);
--regler-schatten:0 1px 3px rgba(0,0,0,.4);
/* Der QR-Code ist ein Schwarz/Weiss-Bild und bleibt bewusst weiss — im
   Dunkelmodus waere er sonst schlechter scanbar (siehe .zwei-faktor-qr). */
--qr-grund:#ffffff;
/* Log-Konsole der Anbindungen: eine bewusst dunkle Flaeche in jedem Theme,
   weil dort ein Terminalstrom laeuft. */
--konsole-grund:#10151b;--konsole-kopf:#171e26;
--konsole-text:#cfe0d8;--konsole-mut:#7f93a5;--konsole-titel:#8fa3b3;
--konsole-chip:rgba(255,255,255,.09);--konsole-chip-hover:rgba(255,255,255,.17);
--konsole-chip-text:#b9c7d3;--konsole-chip-text-hover:#e6eef5;
--konsole-ok:#4cc667;--konsole-ok-flaeche:rgba(63,185,80,.2);
--konsole-warn:#ffb020;--konsole-warn-flaeche:rgba(255,176,32,.18);
--konsole-err:#ff7b72;--konsole-err-text:#ff9b93;--konsole-err-flaeche:rgba(248,81,73,.2);
/* Ladering im Knopf (.anb-btn.laedt) — Akzent mit 30 % Deckung. */
--akzent-ring:rgba(0,171,215,.3);
/* Druckausgabe: Papier kennt kein Theme. */
--druck-grund:#ffffff;--druck-tinte:#000000;--druck-tinte-2:#333333;
--druck-linie:#cccccc;--druck-flaeche:#eeeeee}

[data-theme="light"]{
--ki-bot-training:#2a78d6;--ki-bot-suche:#9a7b00;--ki-bot-nutzer:#cf3535;
--sr-acc:#00abd7;--sr-acc-ink:#006b86;--sr-acc-line:#0092b8;
--sr-bg:#f2f3f5;--sr-nav:#fafbfc;--sr-surface:#ffffff;--sr-soft:#f5f6f8;
/* Trenner und Rahmen sind ZWEI Rollen (Designsystem, Kapitel Colors) — und
   seit dem 04.09.2026 auch zwei WERTE: --sr-line ist „Line" (#7d8897, 3,5:1
   auf Surface, WCAG 1.4.11) fuer Rahmen, die etwas bedeuten (Feldrahmen,
   Status-Ringe), --sr-hair ist „Hairline" (#dfe3e9) fuer Trenner. Bis dahin
   lagen beide auf dem Hairline-Wert (SuperStyler-Befund 03.09.: „heute
   harmlos, der naechste bedeutungstragende Rahmen fiele auf 1,3:1").
   --sr-feld-line bleibt als Alias fuer bestehende Aufrufer. */
--sr-line:#7d8897;--sr-hair:#dfe3e9;--sr-feld-line:var(--sr-line);
--sr-ink:#24282e;--sr-mut:#636b76;--sr-tabmut:#636b76;
--sr-ok:#3ba55d;--sr-warn:#e0a100;--sr-err:#d9534f;--sr-info:#5b7a8c;
--sr-ok-ink:#286f3e;--sr-warn-ink:#825e00;--sr-err-ink:#b72c28;--sr-info-ink:#4a6371;
--sr-hell:#e4e7ec;--sr-auf-hell:#24282e;
--knopf-schatten:0 1px 2px rgba(0,63,80,.20),0 4px 10px rgba(0,63,80,.16);
--knopf-schatten-hover:0 2px 4px rgba(0,63,80,.22),0 8px 18px rgba(0,63,80,.20);
--knopf-schatten-aktiv:0 1px 2px rgba(0,63,80,.24);
/* BETA-Chip (Betreiber-Wunsch 06.09.2026): transparent, oranger Rahmen,
   grell oranger Text, pulsierend.

   „SO GRELL WIE MÖGLICH" HEISST JE THEMA ETWAS ANDERES, und das ist keine
   Geschmacksfrage: der Chip ist transparent, sein Grund also die Kartenfläche.
   Auf Weiß hält ein #ff7a18 nur 2,6:1 — als Text unlesbar. Gemessen wurde
   deshalb der GRELLSTE Ton, der 4,5:1 noch schafft: hell #d44000 (4,63:1),
   grau #bd3400 (4,55:1), dunkel #ff7a18 (5,54:1). Im dunklen Thema, wo
   Daniel arbeitet, ist das ein echtes Signalorange. */
--beta-ink:#d44000;--beta-rand:rgba(212,64,0,.5);--beta-rand-ruhe:rgba(212,64,0,.26);
--beta-glow:rgba(212,64,0,.5);--beta-glow-weit:rgba(212,64,0,.24);
--beta-flaeche-peak:rgba(212,64,0,.12);
--sr-int-i:#7a6fd0;--sr-int-t:#c05c8a;
/* Serienfarben der Diagramme (Designsystem, Kapitel Diagramme; identisch mit
   Cortex). FESTE Reihenfolge, nie zyklisch. Sie kommen ausschliesslich in
   Diagrammen vor — eine Serie ist kein Status und ein Status keine Serie. */
--series-1:#2a78d6;--series-2:#eb6834;--series-3:#1baf7a;--series-4:#eda100;
--series-5:#e87ba4;--series-6:#008300;--series-7:#4a3aa7;--series-8:#e34948;
/* Ordinale Blau-Rampe fuer die Positionsbaender (1-3 / 4-10 / 11-20 / 21-50 /
   51-100). Vorher trugen die fuenf Baender Gruen/Blau/Amber/Rot/Grau — eine
   Rangfolge in Statusfarben, bei Rot-Gruen-Schwaeche nicht lesbar (Veto 2). */
--ord-1:#86b6ef;--ord-2:#5598e7;--ord-3:#2a78d6;--ord-4:#1c5cab;--ord-5:#104281;
--sr-e1:0 1px 2px rgba(20,24,28,.06);--sr-e-modal:0 16px 48px rgba(10,12,15,.35);
--sr-scrim:rgba(15,18,22,.45)}

/* GRAU = DUNKELGRAU WIE DER CORTEX-GRAUMODUS (Betreiber-Auftrag 06.09.2026:
   „Graues Thema wie Cortex-Graumodus, einen Tick heller bzw. manche
   Optionen in Hellgrau — nicht grossflaechig"). Bis heute war „Grau" ein
   HELLES Thema mit dunkler Schrift (Grund #a2a8b0, Karten #e2e5e9). Cortex
   fuehrt seinen Graumodus (`dim`) als dunkles Grau: Grund #24262b, Karten
   #2e3138/#454a54, helle Schrift. Hier dasselbe Bild, jede Flaeche einen
   Tick heller (Grund #2a2d33 statt #24262b, Karten #383c44), und die
   „hellgrauen Optionen" sind gezielt gesetzt: Tabellenkoepfe und Gruppen-
   labels (--thead-fg, unten) in Hellgrau #c9ced6, nicht die Flaechen.
   ALLE Tinten sind gegen die neuen Flaechen gemessen (Karte #383c44):
   Ink 8,8:1, Mut 4,8:1, Ok 5,4:1, Warn 5,6:1, Err 4,9:1, Info 4,9:1,
   Akzent-Tinte 5,4:1, BETA #ff8c38 4,8:1, Feldrahmen 3,7:1. Die Serien-
   und Rampenfarben sind die des dunklen Themas — gegen die Diagrammflaeche
   #2f333a nachgemessen; nur --series-6 (#008300 lag bei 2,6:1) ist auf
   #12a012 (3,7:1) angehoben. */
[data-theme="medium"]{
--ki-bot-training:#82a5f5;--ki-bot-suche:#eac54f;--ki-bot-nutzer:#ff7373;
/* Akzent-Tinte heller als im dunklen Thema (#3cc4e4): auf dem helleren
   Grau plus 14 % Akzentflaeche plus Zebra haelt erst #8be1f3 die 4,5:1
   (gemessen 4,72:1; #45c8e6 lag bei 3,55:1). */
--sr-acc:#00abd7;--sr-acc-ink:#8be1f3;--sr-acc-line:#00abd7;
--sr-bg:#2b2e34;--sr-nav:#32363d;--sr-surface:#3a3f47;--sr-soft:#444a53;
/* Hellgrau-Inseln (Betreiber: „manche Optionen in Hellgrau — nicht
   grossflaechig"): aktives Zeitraum-Segment, Tabellenkopf beim Sortieren,
   Chips. Schrift darauf #24282e (10,9:1). Nie als Karten- oder Seitengrund. */
--sr-hell:#d9dde2;--sr-auf-hell:#24282e;
/* Tinten GEGEN DIE HELLSTE FLAECHE gemessen (scripts/css-pruefen.js prueft
   jede Tinte auch auf --sr-soft + Zebra, #4b5059): Mut 4,6:1, Feldrahmen
   3,1:1 — die Werte der SuperStyler-Tabelle (#a9b0b9 / #8d95a1) hielten
   dort nur 4,35 bzw. 2,96:1. */
--sr-line:#98a3ae;--sr-hair:#4a4f59;--sr-feld-line:var(--sr-line);
--sr-ink:#e9ebee;--sr-mut:#bcc6d0;--sr-tabmut:#bcc6d0;
/* Knopfschatten in den dunklen Themen: Schwarz statt Blau. */
--knopf-schatten:0 1px 2px rgba(0,0,0,.45),0 4px 10px rgba(0,0,0,.40);
--knopf-schatten-hover:0 2px 4px rgba(0,0,0,.50),0 8px 18px rgba(0,0,0,.45);
--knopf-schatten-aktiv:0 1px 2px rgba(0,0,0,.55);
--sr-ok:#3ba55d;--sr-warn:#e0a100;--sr-err:#d9534f;--sr-info:#5b7a8c;
/* Badge-Tinten heller als im dunklen Thema: der Badge-Grund (15 % Status auf
   der hellsten Flaeche) ist hier heller, 4,5:1 brauchen mehr Licht. */
--sr-ok-ink:#96e5a6;--sr-warn-ink:#fbd37a;--sr-err-ink:#ffbcb5;--sr-info-ink:#83d8ff;
--beta-ink:#ff8c38;--beta-rand:rgba(255,140,56,.55);--beta-rand-ruhe:rgba(255,140,56,.3);
--beta-glow:rgba(255,140,56,.7);--beta-glow-weit:rgba(255,140,56,.4);
--beta-flaeche-peak:rgba(255,140,56,.15);
--sr-int-i:#a79ce8;--sr-int-t:#e090b4;
--series-1:#3987e5;--series-2:#d95926;--series-3:#199e70;--series-4:#c98500;
--series-5:#d55181;--series-6:#12a012;--series-7:#9085e9;--series-8:#e66767;
--ord-1:#b7d3f6;--ord-2:#86b6ef;--ord-3:#5598e7;--ord-4:#2a78d6;--ord-5:#1c5cab;
--sr-e1:0 1px 2px rgba(0,0,0,.30);--sr-e-modal:0 16px 48px rgba(0,0,0,.55);
--sr-scrim:rgba(6,8,11,.58)}

[data-theme="dark"]{
--ki-bot-training:#7aa2ff;--ki-bot-suche:#eac54f;--ki-bot-nutzer:#ff7373;
--sr-acc:#00abd7;--sr-acc-ink:#3cc4e4;--sr-acc-line:#00abd7;
--sr-bg:#191c20;--sr-nav:#1f2328;--sr-surface:#252a30;--sr-soft:#2b3138;
--sr-hell:#d9dde2;--sr-auf-hell:#24282e;
--knopf-schatten:0 1px 2px rgba(0,0,0,.45),0 4px 10px rgba(0,0,0,.40);
--knopf-schatten-hover:0 2px 4px rgba(0,0,0,.50),0 8px 18px rgba(0,0,0,.45);
--knopf-schatten-aktiv:0 1px 2px rgba(0,0,0,.55);
--sr-line:#768392;--sr-hair:#2d3339;--sr-feld-line:var(--sr-line);
--sr-ink:#e6e9ec;--sr-mut:#99a2ac;--sr-tabmut:#99a2ac;
/* Statusflaechen sind in allen drei Themen DIESELBEN (Designsystem, Tabelle
   Status): nur die Tinte wechselt. Dunkel fuehrte bis zum 03.09.2026 eigene,
   hellere Flaechen (#4cb56d/#d9a940/#e06661) — damit hiess „Gruen" je nach
   Thema etwas anderes. */
--sr-ok:#3ba55d;--sr-warn:#e0a100;--sr-err:#d9534f;--sr-info:#5b7a8c;
--sr-ok-ink:#75c68f;--sr-warn-ink:#ddb255;--sr-err-ink:#ea9692;--sr-info-ink:#9ab0bd;
/* Dunkel trägt das Leuchten am weitesten — deshalb hier die kräftigsten
   Alpha-Werte: auf #252a30 ist ein Halo sichtbar, auf Weiß verschluckt ihn
   der Grund. */
--beta-ink:#ff7a18;--beta-rand:rgba(255,122,24,.55);--beta-rand-ruhe:rgba(255,122,24,.3);
--beta-glow:rgba(255,122,24,.8);--beta-glow-weit:rgba(255,122,24,.45);
--beta-flaeche-peak:rgba(255,122,24,.15);
--sr-int-i:#a79ce8;--sr-int-t:#e090b4;
/* Eigene Serien-Abstimmung auf die dunkle Diagrammflaeche (#202229): alle
   acht halten dort >= 3:1. */
--series-1:#3987e5;--series-2:#d95926;--series-3:#199e70;--series-4:#c98500;
--series-5:#d55181;--series-6:#008300;--series-7:#9085e9;--series-8:#e66767;
--ord-1:#b7d3f6;--ord-2:#86b6ef;--ord-3:#5598e7;--ord-4:#2a78d6;--ord-5:#1c5cab;
--sr-e1:0 1px 2px rgba(0,0,0,.35);--sr-e-modal:0 16px 48px rgba(0,0,0,.60);
--sr-scrim:rgba(4,6,9,.62)}


/* ============================ MONOCHROME BLAU-PALETTE (05.09.2026) =========
   Betreiber-Wunsch: „nur sehr monoton vom Ackermann-Blau über gewöhnlich und
   royalblau bis hin zu einem helleren Blauton bis weiß-blau gestaffelt" — und
   zwar auf ALLEN Seiten und in ALLEN Charts.

   SIE HÄNGT AN EINEM ATTRIBUT, NICHT AN EINER ENGINE: `data-palette="blau"`
   am <html> (aus mandanten.darstellung_json). Damit greift sie in einem Zug
   für die drei Chart-Engines und für die serverseitigen SVGs — alle drei
   lesen dieselben Tokens --series-1…8 und --ord-1…5 (app/lib/svg.js,
   app/views/charts.js themeFarben()). Es gibt keinen zweiten Ort, an dem
   Chartfarben entstehen.

   DIE STUFEN SIND GEMESSEN, NICHT GEWÄHLT. Jede Stufe hält mindestens 3,2:1
   gegen die Diagrammfläche ihres Themas (--chart-flaeche: hell #f9fafd,
   grau #e2e5e9, dunkel #202229) — die 3:1-Schwelle für Grafikobjekte aus
   WCAG 1.4.11 plus Puffer. Deshalb reicht die Rampe im HELLEN Thema NICHT
   bis weiß-blau: ein Ton, der dort noch 3:1 hält, ist kein Weiß-Blau mehr.
   Im dunklen Thema geht sie bis #d3e1f8, weil Weiß-Blau dort der kontrast-
   stärkste Ton ist.

   ZWEI ANORDNUNGEN, WEIL ZWEI AUFGABEN: Die Positionsbänder (--ord-*)
   laufen MONOTON (Band 1 hell, Band 5 dunkel, Richtung wie bisher) — eine
   Rangfolge muss man ablesen können. Die freien Serien (--series-*) sind
   dagegen GESPREIZT: Serie 1 ist der kräftigste Ton, Serie 2 springt in die
   obere Hälfte der Rampe, Serie 3 wieder nach unten. Läge auch dort eine
   glatte Rampe, sähen zwei Linien nebeneinander fast gleich aus — gemessen
   am 05.09.2026 an „Besucher gegen Seitenaufrufe": zwei benachbarte
   Rampenstufen trennt nur 1,2:1. Die Spreizung bringt die ersten beiden
   Serien auf 2,1:1 und hält im schlechtesten Nachbarpaar noch 1,4:1.

   WAS SIE NICHT ANFASST: Statusfarben (--green/--amber/--red) und die
   Akzentfarbe. Ein Status ist keine Serie; eine rote Warnkante bleibt rot,
   auch wenn die Kurven daneben einfarbig laufen. */
[data-palette="blau"]{
--series-1:#091935;--series-2:#1b5885;--series-3:#0d2649;--series-4:#2681ab;
--series-5:#11355e;--series-6:#2d97be;--series-7:#164672;--series-8:#216c99;
--ord-1:#2d97be;--ord-2:#22719d;--ord-3:#184f7b;--ord-4:#103159;--ord-5:#091935}

/* Grau ist seit dem 06.09.2026 dunkel (siehe [data-theme="medium"] oben):
   dieselbe Rampe wie im dunklen Thema, gegen #2f333a nachgemessen — nur
   die kraeftigste Stufe (#247a99, 2,6:1) ist auf #2d94b8 (3,7:1) gehoben. */
[data-palette="blau"][data-theme="medium"]{
--series-1:#2d94b8;--series-2:#73aee4;--series-3:#2a8cba;--series-4:#b3cdf2;
--series-5:#3699d4;--series-6:#d3e1f8;--series-7:#54a3dc;--series-8:#93bceb;
--ord-1:#d3e1f8;--ord-2:#9bc0ed;--ord-3:#64a8e0;--ord-4:#2e97d2;--ord-5:#2d94b8}

[data-palette="blau"][data-theme="dark"]{
--series-1:#247a99;--series-2:#73aee4;--series-3:#2a8cba;--series-4:#b3cdf2;
--series-5:#3699d4;--series-6:#d3e1f8;--series-7:#54a3dc;--series-8:#93bceb;
--ord-1:#d3e1f8;--ord-2:#9bc0ed;--ord-3:#64a8e0;--ord-4:#2e97d2;--ord-5:#247a99}

/* ========================== WEITERE PALETTEN (06.09.2026) ==================
   Betreiber-Auftrag: „Standardfarben · Pastellfarben · Einfarbig" je Chart,
   „Einfarbig" in drei Lautstaerken „grell · normal · light". Dieselbe
   Mechanik wie die Blau-Palette oben: EIN Attribut (data-palette am <html>
   fuer die Mandanten-Vorgabe, ODER an einem Messknoten, ueber den
   app/views/charts.js die Tokens einer ANDEREN Palette fuer ein einzelnes
   Chart abliest), dieselben Tokens --series-1…8 und --ord-1…5.

   ALLE WERTE SIND GEMESSEN (Werkzeug: OKLCH-Rampe + WCAG-Kontrast, siehe
   Sitzung 06.09.2026): jede Stufe haelt >= 3,05:1 gegen die Diagrammflaeche
   ihres Themas (--chart-flaeche: hell #f9fafd, grau #e2e5e9, dunkel #202229).
   Daraus folgt, was „pastell" und „light" im HELLEN Thema bedeuten koennen:
   ein echtes Pastell auf Weiss liegt bei 1,5–2:1 und ist als Kurve nicht zu
   sehen. Pastell ist dort deshalb ein GEDAEMPFTER Mittelton (Chroma 0,085
   statt 0,19), Light ein weiches Blau um L 0,46–0,61. Im dunklen Thema sind
   beide, was ihr Name sagt: helle, weiche Toene, weil Hell auf Dunkel der
   kontraststarke Fall ist.

   NACHBARN LIEGEN DICHT (1,1–1,7:1). Das ist bei acht Stufen EINER Farbe
   unvermeidlich — und deshalb waehlt app/views/charts.js bei einfarbigen
   Paletten die Stufen NACH ANZAHL DER SERIEN aus der nach Helligkeit
   sortierten Rampe (zwei Serien: die Enden; drei: Enden + Mitte …). Die
   Reihenfolge der Tokens hier folgt derselben Spreizung wie bei „blau"
   (Serie 1 kraeftig, Serie 2 in die andere Haelfte …), damit das Fallback-
   SVG des Servers, das nur den Index kennt, brauchbar bleibt.

   Statusfarben und Akzent bleiben unberuehrt — dieselbe Regel wie bei „blau". */
/* „standard" AUSDRUECKLICH (06.09.2026): ein Chart, das gegen die
   Mandanten-Vorgabe „blau" die bunte Palette waehlt, liest seine Tokens an
   einem Messknoten mit data-palette="standard" — ohne diesen Block erbte
   der Knoten die Blau-Werte des <html> und die Wahl bliebe wirkungslos. */
[data-palette="standard"]{
--series-1:#2a78d6;--series-2:#eb6834;--series-3:#1baf7a;--series-4:#eda100;
--series-5:#e87ba4;--series-6:#008300;--series-7:#4a3aa7;--series-8:#e34948;
--ord-1:#86b6ef;--ord-2:#5598e7;--ord-3:#2a78d6;--ord-4:#1c5cab;--ord-5:#104281}
[data-palette="standard"][data-theme="medium"]{
--series-1:#3987e5;--series-2:#d95926;--series-3:#199e70;--series-4:#c98500;
--series-5:#d55181;--series-6:#12a012;--series-7:#9085e9;--series-8:#e66767;
--ord-1:#b7d3f6;--ord-2:#86b6ef;--ord-3:#5598e7;--ord-4:#2a78d6;--ord-5:#1c5cab}
[data-palette="standard"][data-theme="dark"]{
--series-1:#3987e5;--series-2:#d95926;--series-3:#199e70;--series-4:#c98500;
--series-5:#d55181;--series-6:#008300;--series-7:#9085e9;--series-8:#e66767;
--ord-1:#b7d3f6;--ord-2:#86b6ef;--ord-3:#5598e7;--ord-4:#2a78d6;--ord-5:#1c5cab}
[data-palette="pastell"]{
--series-1:#698fbf;--series-2:#b87b60;--series-3:#5b9c7a;--series-4:#a4884d;--series-5:#b5768f;--series-6:#6b9a6c;--series-7:#8b83bd;--series-8:#ba7872;
--ord-1:#5d82b2;--ord-2:#496e9c;--ord-3:#335784;--ord-4:#1d406b;--ord-5:#072b54;}
[data-palette="pastell"][data-theme="medium"]{
--series-1:#92c1fd;--series-2:#f4a988;--series-3:#82d2a8;--series-4:#dbb970;--series-5:#f2a3c1;--series-6:#95cf96;--series-7:#bcb3fa;--series-8:#f8a49d;
--ord-1:#d5e6fc;--ord-2:#9fc7fb;--ord-3:#80a7d9;--ord-4:#6388b9;--ord-5:#5a7faf;}
[data-palette="pastell"][data-theme="dark"]{
--series-1:#92c1fd;--series-2:#f4a988;--series-3:#82d2a8;--series-4:#dbb970;--series-5:#f2a3c1;--series-6:#95cf96;--series-7:#bcb3fa;--series-8:#f8a49d;
--ord-1:#d5e6fc;--ord-2:#9fc7fb;--ord-3:#80a7d9;--ord-4:#6388b9;--ord-5:#4c719f;}
[data-palette="blau-grell"]{
--series-1:#02458e;--series-2:#016abe;--series-3:#03528e;--series-4:#0d7cb6;--series-5:#085d90;--series-6:#0a73f3;--series-7:#0b6895;--series-8:#0c74b7;
--ord-1:#0a7bda;--ord-2:#096dc1;--ord-3:#075ea9;--ord-4:#035397;--ord-5:#004885;}
[data-palette="blau-grell"][data-theme="medium"]{
--series-1:#bedaff;--series-2:#3a9bfd;--series-3:#9dccfd;--series-4:#0186c5;--series-5:#70bffe;--series-6:#217bf4;--series-7:#0db4ff;--series-8:#088fe3;
--ord-1:#bcdbff;--ord-2:#86bfff;--ord-3:#49a2fe;--ord-4:#0287f0;--ord-5:#057ee1;}
[data-palette="blau-grell"][data-theme="dark"]{
--series-1:#bedaff;--series-2:#3a9bfd;--series-3:#9dccfd;--series-4:#0186c5;--series-5:#70bffe;--series-6:#076be3;--series-7:#0db4ff;--series-8:#088fe3;
--ord-1:#bcdbff;--ord-2:#86bfff;--ord-3:#49a2fe;--ord-4:#0287f0;--ord-5:#0c72cb;}
[data-palette="blau-light"]{
--series-1:#2d5b88;--series-2:#4871a2;--series-3:#375f8f;--series-4:#4f7eae;--series-5:#336893;--series-6:#5c86b8;--series-7:#3e6c9b;--series-8:#4579a6;
--ord-1:#5887b7;--ord-2:#4c7bab;--ord-3:#416f9e;--ord-4:#356391;--ord-5:#2d5b88;}
[data-palette="blau-light"][data-theme="medium"]{
--series-1:#e2f0ff;--series-2:#92bef4;--series-3:#cde4ff;--series-4:#76a6d8;--series-5:#b2d9fd;--series-6:#719bcf;--series-7:#9dccfd;--series-8:#7eb4e4;
--ord-1:#e2f0ff;--ord-2:#badbfe;--ord-3:#94c6f9;--ord-4:#7fafe2;--ord-5:#6d9dce;}
[data-palette="blau-light"][data-theme="dark"]{
--series-1:#e2f0ff;--series-2:#92bef4;--series-3:#cde4ff;--series-4:#76a6d8;--series-5:#b2d9fd;--series-6:#719bcf;--series-7:#9dccfd;--series-8:#7eb4e4;
--ord-1:#e2f0ff;--ord-2:#badbfe;--ord-3:#94c6f9;--ord-4:#7fafe2;--ord-5:#6d9dce;}


*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth;scroll-padding-top:calc(var(--header-h) + 18px);overflow-x:clip}
body{font-family:var(--font-body);color:var(--text);background:var(--bg);line-height:var(--lh-body);font-size:var(--fs-body);font-weight:450;-webkit-font-smoothing:antialiased;padding-top:var(--header-h);overflow-x:clip}
/* ALT-HUELLE ENTFALLEN (08.09.2026). Hier standen .header samt .header-left/
   .brand-logo/.header-sep/.header-titles/.header-title/.header-sub, dazu
   .theme-toggle und .nav-burger — der fixierte dunkle Kopfbalken der
   Haus-Vorlage und seine beiden Knoepfe. Der R3-Umbau (30.08.2026) hat ihn
   ersetzt: die App rendert heute <nav class="sr-nav" id="sidebar"> und
   <button class="sr-burger" id="navBurger">, gestaltet in sr.css. Kein
   einziger Erzeuger war mehr im Haus; die Regeln standen neun Tage lang
   ohne Wirkung.
   ACHTUNG, ZWEI FALSCHE FREUNDE: das Token --header-h BLEIBT — body,
   html{scroll-padding} und drei Regeln in app.css lesen es weiter. Und der
   Selektor .sidebar traf schon vorher nichts: die Navigation traegt sidebar
   als ID, nicht als Klasse. */
/* SEO-Radar-Anpassung (BFSG, 30.08.2026): Fokusringe auf --focus-ton statt
   --accent — im hellen Theme verfehlte #00abd7 die 3:1 nach WCAG 1.4.11.
   Begruendung und Werte am Token oben. */
.nav-item:focus-visible{outline:2px solid var(--focus-ton);outline-offset:-2px}
.nav-backdrop{display:none;position:fixed;inset:0;z-index:80;background:var(--scrim);opacity:0;transition:opacity .25s var(--ease)}
.nav-backdrop.show{display:block;opacity:1}
.layout{display:grid;grid-template-columns:266px 1fr;min-height:calc(100vh - var(--header-h))}
.nav-group{padding:var(--s3) var(--s4) var(--s1);font-size:var(--fs-label);text-transform:uppercase;letter-spacing:2px;color:var(--text-3);font-weight:700}
.nav-item{display:flex;align-items:baseline;gap:var(--s2);padding:var(--s2) var(--s4);color:var(--text-2);text-decoration:none;font-size:var(--fs-small);font-weight:550;border-left:3px solid transparent;transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease),border-left-color var(--t-fast) var(--ease);background:transparent;border-top:0;border-right:0;border-bottom:0;width:100%;text-align:left;cursor:pointer;font-family:inherit}
.nav-item .n{font-size:var(--fs-label);color:var(--text);font-weight:700;font-family:var(--font-num);min-width:21px}
.nav-item:hover{color:var(--text);background:var(--hover)}
.nav-item.active{color:var(--accent);background:var(--bg);box-shadow:inset 0 7px 5px -5px var(--nav-aktiv-schatten);font-weight:700;border-left-color:var(--accent)}
.nav-toggle{justify-content:flex-start}
.nav-chev{margin-left:auto;width:7px;height:7px;border-right:2px solid var(--text-3);border-bottom:2px solid var(--text-3);transform:rotate(45deg) translateY(-2px);transition:transform 160ms var(--ease)}
.nav-toggle.open .nav-chev{transform:rotate(-135deg) translateY(0)}
.nav-sub{display:none;flex-direction:column;background:var(--bg)}
.nav-sub.open{display:flex}
.nav-sub .nav-item{padding:var(--s1) var(--s4) var(--s1) var(--s5);font-size:var(--fs-small);font-weight:500}
.nav-sub .nav-item .n{font-size:var(--fs-label);min-width:28px}
.nav-sub .nav-item.active{color:var(--accent);background:transparent;box-shadow:none;border-left-color:transparent;font-weight:600}
.nav-foot{margin-top:auto;padding:var(--s3) var(--s4);border-top:1px solid var(--border);font-size:var(--fs-body);color:var(--text-3)}
.nav-date{font-family:var(--font-mono);font-size:var(--fs-mono);color:var(--text-3)}
.content{padding:var(--s5) var(--s6) var(--s7);max-width:var(--content-max)}
/* Stufe 1: Flaeche und Schatten. Der Inset-Ring (--edge) war die
   „Rahmen"-Variante von Tiefe und faellt mit dem Overhaul weg. */
.section{margin-bottom:var(--s4);background:var(--surface);border-radius:var(--rlg);box-shadow:var(--sr-e1);padding:0 var(--s4) var(--s4)}
.section-head{display:flex;align-items:baseline;gap:var(--s2);margin:0 0 var(--s3);padding:var(--s3) 0 var(--s3);border-bottom:1px solid var(--line);background:transparent}
.section:first-of-type .section-head{margin-top:0}
.section>:not(.section-head){margin-left:0}
/* Eine Regel fuer .section-head .section-num steht hier nicht mehr
   (08.09.2026): ui.sektion() rendert den Kapitelbalken ohne Nummernchip. Die
   Klasse lebt weiter, aber nur im Kundenbericht (app/views/bericht.js), und
   der bringt seine eigene Definition mit und laedt dieses Stylesheet nicht. */
.section-head h2{font-size:var(--fs-h2);line-height:var(--lh-h2);font-weight:var(--fw-bold);letter-spacing:0;color:var(--text);margin:0}
h1{font-size:var(--fs-h1);line-height:var(--lh-h1);font-weight:var(--fw-bold);letter-spacing:-.01em;margin-bottom:var(--s2)}
h3{font-size:var(--fs-h1);font-weight:700;margin:var(--s5) 0 var(--s2);letter-spacing:-.2px}
h4{font-size:var(--fs-body);text-transform:uppercase;letter-spacing:1.2px;color:var(--text-3);font-weight:700;margin:var(--s4) 0 var(--s2)}
p{margin-bottom:var(--s2);color:var(--text-2)}
strong{color:var(--text);font-weight:700}
ul,ol{padding-left:var(--s4);margin:var(--s2) 0 var(--s3);color:var(--text-2)}
ul{list-style:square}
ol{list-style:decimal}
li{margin-bottom:var(--s1);padding-left:var(--s0);line-height:1.45}
li::marker{color:var(--text-3)}
ol li::marker{font-family:var(--font-num);font-weight:700;color:var(--text)}
a{color:var(--link);text-decoration:none;font-weight:600}
a:hover{text-decoration:underline}
em{color:var(--text-2)}
.lead{font-size:var(--fs-h2);color:var(--text-2);margin-bottom:var(--s3);line-height:1.7}
.takeaway{margin:var(--s2) 0 var(--s4);padding:var(--s3) var(--s3);background:var(--surface-2);box-shadow:var(--sr-e1);border-left:3px solid var(--blue);border-radius:var(--rmd);font-size:var(--fs-h2);line-height:var(--lh-body);color:var(--text)}
.takeaway strong{color:var(--text)}
.tbl-wrap{overflow-x:auto;margin:var(--s3) 0}
table{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--fs-body)}
thead{background:var(--thead-bg)}
th{padding:var(--s2) var(--s3);text-align:left;font-size:var(--fs-label);text-transform:uppercase;letter-spacing:.06em;color:var(--thead-fg);font-weight:var(--fw-ui);white-space:nowrap;line-height:var(--lh-label)}
thead th:first-child{border-top-left-radius:var(--rsm)}
thead th:last-child{border-top-right-radius:var(--rsm)}
td{padding:var(--s2) var(--s3);height:44px;border-bottom:1px solid var(--line);color:var(--text-2);vertical-align:middle;line-height:1.4}
tr:last-child td{border-bottom:none}
td.num{text-align:right;font-family:var(--font-mono);font-variant-numeric:tabular-nums;white-space:nowrap}th.num{text-align:right;white-space:nowrap}
td.who{white-space:nowrap;font-weight:700;color:var(--text)}
/* ZUSTAND AN DER KANTE, NICHT IN DER GANZEN ZEILE (03.09.2026). tr.good und
   tr.bad faerbten bis dahin JEDE Zelle der Zeile gruen bzw. rot ein — in
   „Schritte des letzten Laufs", in der Kategorie-Tabelle des Dashboards und
   in acht weiteren Tabellen. Drei Dinge sprachen dagegen: die Flaeche
   ueberstimmte die Zebrastreifung und damit die Lesespur, Gruen und Rot
   trugen die Aussage ALLEIN (Rot-Gruen-Schwaeche), und eine eingefaerbte
   Zeile liest sich als Auswahl, nicht als Zustand. Es bleibt die 3-px-Kante
   links; das Wort oder der Chip in der Zeile traegt die Aussage. */
tr.good td:first-child{box-shadow:inset 3px 0 0 var(--green)}
tr.bad td:first-child{box-shadow:inset 3px 0 0 var(--red)}
.tot td{border-top:2px solid var(--rule);font-weight:700;color:var(--text)}
.info{padding:var(--s3) var(--s3);border-radius:var(--rmd);margin:var(--s3) 0;font-size:var(--fs-h2);line-height:var(--lh-body);background:var(--surface);box-shadow:var(--sr-e1);border-left:3px solid var(--text-3)}
.info strong{color:var(--text)}
.info--note{border-left-color:var(--blue);background:var(--blue-dim)}
.info--ok{border-left-color:var(--green);background:var(--green-dim)}
.info--warn{border-left-color:var(--amber);background:var(--amber-dim)}
.info--stop{border-left-color:var(--red);background:var(--red-dim)}
.info--key{border-left-color:var(--text);background:var(--surface-2)}
.tag{display:inline-flex;align-items:center;gap:var(--s0);padding:var(--s0) var(--s2);border-radius:var(--rpill);font-size:var(--fs-label);font-weight:650;background:var(--surface-2);color:var(--text-2);white-space:nowrap}
.tag-g{background:var(--green-dim);color:var(--green)}.tag-r{background:var(--red-dim);color:var(--red)}.tag-b{background:var(--blue-dim);color:var(--blue)}.tag-a{background:var(--amber-dim);color:var(--amber)}
.mono{font-family:var(--font-mono);font-size:var(--fs-mono);line-height:var(--lh-mono);background:var(--surface-2);padding:var(--s-2) var(--s1);border-radius:var(--sr-r-xs);color:var(--text);word-break:break-all}
.cards{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s3);margin:var(--s3) 0}
.card{background:var(--surface);box-shadow:var(--sr-e1);border-radius:var(--rlg);padding:var(--s3)}
.card .ct{font-size:var(--fs-label);text-transform:uppercase;letter-spacing:1.2px;color:var(--text-3);font-weight:700;margin-bottom:var(--s1)}
.card .cv{font-size:var(--fs-kpi);line-height:var(--lh-kpi);font-weight:var(--fw-bold);margin:var(--s0) 0;letter-spacing:-.02em;color:var(--text)}
.card .cs{font-size:var(--fs-body);color:var(--text-2)}
details.explain{margin:var(--s3) 0;background:var(--surface);box-shadow:var(--sr-e1);border-left:3px solid var(--amber);border-radius:var(--rmd);overflow:hidden}
details.explain summary{cursor:pointer;padding:var(--s2) var(--s3);font-weight:700;color:var(--text);list-style:none;display:flex;align-items:center;gap:var(--s2);user-select:none;font-size:var(--fs-h2);line-height:1.4}
details.explain summary::-webkit-details-marker{display:none}
details.explain summary::before{content:"";display:inline-block;width:7px;height:7px;border-right:2px solid var(--text-3);border-bottom:2px solid var(--text-3);transform:rotate(-45deg);transition:transform 160ms var(--ease);flex-shrink:0}
details.explain[open] summary::before{transform:rotate(45deg)}
details.explain .ex-body{padding:var(--s0) var(--s3) var(--s3) var(--s5);color:var(--text-2);line-height:1.55;font-size:var(--fs-h2)}
details.explain .ex-body p{margin:0 0 var(--s2);color:var(--text-2)}
details.explain .ex-body ul{padding-left:var(--s4);margin:var(--s1) 0 var(--s2)}
details.explain .ex-body li{margin-bottom:var(--s1)}
details.explain .ex-body em{color:var(--text-2);font-style:italic}
.steps{counter-reset:step;list-style:none;padding-left:0;margin:var(--s3) 0}
.steps>li{position:relative;padding:var(--s-2) 0 var(--s3) var(--s6);margin:0;border-left:2px solid var(--border);margin-left:var(--s3)}
.steps>li:last-child{border-left-color:transparent;padding-bottom:0}
.steps>li::before{counter-increment:step;content:counter(step);position:absolute;left:-17px;top:-2px;width:34px;height:34px;border-radius:50%;background:var(--blue);color:var(--auf-dunkel);font:700 var(--fs-h2) var(--font-num);display:flex;align-items:center;justify-content:center}
.steps>li .st{display:block;font-weight:700;color:var(--text);margin-bottom:var(--s0);font-size:var(--fs-h2)}
.checklist{list-style:none;padding-left:0;margin:var(--s3) 0}
.checklist li{position:relative;padding:var(--s1) 0 var(--s1) var(--s4);border-bottom:1px solid var(--border-l);line-height:1.5}
.checklist li:last-child{border-bottom:none}
.checklist li::before{content:"";position:absolute;left:0;top:9px;width:16px;height:16px;border:2px solid var(--text-3);border-radius:var(--sr-r-xs);background:var(--surface)}
.checklist .ph{display:block;margin:var(--s3) 0 var(--s0);font-size:var(--fs-small);text-transform:uppercase;letter-spacing:1.2px;color:var(--text-3);font-weight:700;padding-left:0}
.checklist .ph::before{display:none}
@media (max-width:900px){
/* --header-h BLEIBT: app.css setzt es fuer die App auf 0px und liest es an
   drei Stellen, body und html rechnen damit. Die mobilen Anpassungen der
   Alt-Huelle (.header*, .nav-burger, .sidebar) sind am 08.09.2026 mit ihr
   entfallen; die Navigations-Schublade macht heute sr.css. */
:root{--header-h:60px}
.layout{display:block;min-width:0}
.nav-item{padding:var(--s2) var(--s4)}
.nav-sub .nav-item{padding:var(--s2) var(--s4) var(--s2) var(--s5)}
/* Kein pauschales font-size:90% mehr (03.09.2026). Es schrumpfte auf
   Telefonbreite JEDEN Text unter 900 px um ein Zehntel — auch die, die
   ihre Groesse aus der Typo-Skala bereits explizit bekommen. Damit hiess
   „13 px" auf dem Telefon 11,7 px, und keine Skala der Welt haette das
   noch beschrieben. Die Skala gilt auf jeder Breite; wo mobil etwas
   kleiner werden soll, sagt es die Regel selbst. */
.content{padding:var(--s3) var(--s3) var(--s6);max-width:100%;min-width:0}
.section{margin-bottom:var(--s3);padding:0 var(--s3) var(--s3)}
.section-head{padding:var(--s3) 0 var(--s2);gap:var(--s2);margin:0 0 var(--s3)}
.section:first-of-type .section-head{margin-top:var(--s0)}
.section-head h2{font-size:var(--fs-h2);letter-spacing:-.2px;color:var(--text)}
.section>:not(.section-head){margin-left:0}
h1{font-size:var(--fs-h2);letter-spacing:-.24px}
h3{font-size:var(--fs-h2);margin:var(--s5) 0 var(--s2)}
.lead{font-size:var(--fs-h2)}
.cards{grid-template-columns:1fr}
.steps>li{padding-left:var(--s5)}
.steps>li .st{font-size:var(--fs-h2)}
table{font-size:var(--fs-body)}
.takeaway,.info{font-size:var(--fs-h2)}
/* td.who ist oben global nowrap (Projekt-/Domainspalte) — auf Telefonbreite
   hebt das die overflow-wrap-Reparatur der Betreiber-Tabelle (.anb-tabelle,
   app.css) wieder auf und laesst lange Domainnamen in die Nachbarspalte
   laufen statt umzubrechen. */
td.who{white-space:normal}
}
@media (prefers-reduced-motion:reduce){*{transition-duration:.01ms!important;animation-duration:.01ms!important;scroll-behavior:auto!important}}
/* Ausgeblendet wird hier nur noch, was es auch gibt: die drei Selektoren der
   Alt-Huelle (.sidebar/.header/.theme-toggle) und der Nummernchip sind am
   08.09.2026 entfallen. Was die App im Druck wegnimmt, steht in app.css. */
@media print{.layout{grid-template-columns:1fr}body{background:var(--druck-grund);color:var(--druck-tinte);padding-top:0}.section{box-shadow:none;border:1px solid var(--druck-linie)}.section-head{background:transparent!important}.section-head h2{color:var(--druck-tinte)}.nav-sub{display:flex!important}details.explain{border:1px solid var(--druck-linie)}details.explain[open] .ex-body,details.explain>summary{display:block}}

/* Chart-Gestaltung: Kartenhintergrund je Theme + vier zusaetzliche Serientoene.
   DIE PASTELLREIHE (--chart-p1…p8) IST AM 31.08.2026 ENTFALLEN
   (Betreiber-Ansage „von pastell auf normal"). Gestapelte Flaechen und
   Balkenfuellungen laufen jetzt ueber dieselbe palette wie alles andere;
   damit spricht eine Farbrolle nur noch in EINER Lautstaerke, und der
   PDF-Pfad (app/lib/svg.js), der immer schon Volltoene zeichnete, zeigt
   dasselbe Bild wie die App.
   --chart-t1…t4 bleiben: sie tragen ab der sechsten gleichzeitig sichtbaren
   Serie die zusaetzlichen unterscheidbaren Toene (charts.js palette). */
/* DIE DIAGRAMMFLAECHE DES GRAUEN THEMAS IST HELL (Veto 1, 03.09.2026). Sie
   war #2b2e35 — eine dunkle Flaeche mitten in einem mittelhellen Theme, und
   die Serien darauf lagen zu viert unter 1,3:1. Jetzt steht sie auf der
   Surface des Themas (#e2e5e9); dort halten alle acht Serien >= 3:1. */
[data-theme="light"]{--chart-flaeche:#f9fafd;--chart-t1:#6f94c2;--chart-t2:#6da287;--chart-t3:#bf9468;--chart-t4:#bd7880}
[data-theme="dark"]{--chart-flaeche:#202229;--chart-t1:#7fa3d1;--chart-t2:#7cb096;--chart-t3:#cfa47a;--chart-t4:#c98890}
[data-theme="medium"]{--chart-flaeche:#31353c;--chart-t1:#7fa3d1;--chart-t2:#7cb096;--chart-t3:#cfa47a;--chart-t4:#c98890}


/* ---- app.css ---- */
/* ------------------------------------------------------------------------
   SEO-Radar — App-Ergaenzungen zum Haus-Template „Classic Ackermann Online“.
   theme.css bleibt unveraendert (1:1 aus der Vorlage); alles App-Spezifische
   steht hier und benutzt ausschliesslich die Theme-Variablen, damit
   Hell/Dunkel, Mobil und Druck weiterhin automatisch funktionieren.
   ------------------------------------------------------------------------ */

/* --- Marken-Signet (Radar-Schirm, layout.js markenIcon()) ----------------
   Der Suchkegel laeuft in 4,2 s einmal um (linear — ein Radar beschleunigt
   nicht), die drei Kontakte leuchten genau dann auf, wenn der Kegel sie
   ueberstreicht (Verzoegerungen aus den Punktwinkeln gerechnet, Herleitung
   an markenIcon()). Unter prefers-reduced-motion steht alles still auf den
   statischen Attribut-Deckkraeften. transform-box: view-box laesst die
   Rotation um die viewBox-Mitte (32,32) laufen — fill-box wuerde um die
   Kegel-Boundingbox drehen und das Bild zerlegen.

   DIE BEIDEN KEYFRAMES SIND NUR HIER DEFINIERT UND HABEN ZWEI LESER: die
   Anmeldeseite (.zentriert-marke, weiter unten) und .sr-marke-logo in sr.css
   fuer die Marke der Navigationsspalte. Wer sie streicht, nimmt beiden die
   Bewegung — sr.css bringt keine eigene Definition mit.
   Der Block .header-logo/.header-left/.header-title gehoerte dagegen zum
   dunklen Kopfbalken; den gibt es seit C1 (30.08.2026) nicht mehr, die Regeln
   standen seither ohne Erzeuger da und sind am 08.09.2026 entfallen. */
@keyframes radar-dreh { to { transform: rotate(360deg); } }
@keyframes radar-blip { 0%, 100% { opacity: .1; } 12% { opacity: 1; } 60% { opacity: .18; } }

/* --- Ampel ------------------------------------------------------------- */
.ampel { display: inline-flex; align-items: center; gap: 8px; font-weight: 700; font-size: var(--fs-ui); }
.ampel::before { content: ""; width: 12px; height: 12px; border-radius: 50%; flex-shrink: 0; box-shadow: 0 0 0 3px var(--surface-2); }
.ampel--gruen::before { background: var(--green); }
.ampel--gelb::before  { background: var(--amber); }
.ampel--rot::before   { background: var(--red); }
.ampel--gruen { color: var(--green); }
.ampel--gelb  { color: var(--amber); }
.ampel--rot   { color: var(--red); }

/* --- Projektkarte auf der Uebersicht ------------------------------------ */
/* (K&R-Rollout Batch 1, 07.09.2026, Inventar-Fund D: hier standen "margin:
   18px 0" an .projekt-karte und darunter ".projekt-karte + .projekt-karte
   { margin-top: 22px; }". Beide waren tot — uebersicht.js rendert die Karte
   IMMER mit der Zusatzklasse .sr-karte ("sr-karte projekt-karte"), und
   .projekt-karte.sr-karte{margin:0 0 var(--s3)} (sr-bausteine.css, gleiche
   Spezifitaet 0,2,0, laedt aber SPAETER) gewinnt bei jedem Aufruf. Geprueft
   per grep: "projekt-karte" wird app-weit nur an dieser einen Stelle
   ausgegeben. Entfernt statt nur notiert, weil hier zweifelsfrei belegt.) */
.projekt-karte { background: var(--surface); box-shadow: var(--edge), var(--e1); border-radius: var(--rlg); padding: 22px 24px; }
/* Kartenkopf nach dem Leit-Screen: Score-Ring links traegt das Urteil, Name
   und Domain daneben, Ampel rechts. align-items:center statt baseline — mit
   dem Ring als erstem Kind waere eine Grundlinien-Ausrichtung sinnlos. */
.projekt-kopf { display: flex; align-items: center; justify-content: flex-start; gap: 18px; flex-wrap: wrap; margin-bottom: 10px; }
.projekt-kopf h3 { margin: 0; font-size: var(--fs-h1); }
.projekt-kopf h3 a { color: var(--text); }
.projekt-titel { min-width: 0; flex: 1 1 auto; }
.projekt-kopf .ampel-badge, .projekt-kopf > .tag { margin-left: auto; }
.projekt-score { position: relative; display: flex; flex-direction: column; align-items: center; gap: 5px; flex-shrink: 0; }
.projekt-score::before { content: ""; position: absolute; left: 50%; top: 32px; width: 104px; height: 104px; transform: translate(-50%, -50%); background: var(--accent-glow); pointer-events: none; }
.projekt-score > * { position: relative; }
.projekt-score-sub { font-size: var(--fs-label); color: var(--text-3); white-space: nowrap; }
.projekt-domain { font-family: var(--font-mono); font-size: var(--fs-mono); color: var(--text-3); word-break: break-all; }
/* (Hier standen ".projekt-karte .cards"/".projekt-karte .card" — ebenfalls
   tot, aus derselben Pruefung wie oben: uebersicht.js baut den Kartenkoerper
   seit dem Cockpit-Umbau ueber ui.srKpiGitter(), nie mehr ueber ui.cards();
   ".cards"/".card" stehen nirgends mehr innerhalb von ".projekt-karte".) */
/* (Hier stand eine zweite, aeltere .karten-fuss-Regel. Sie war seit Welle K1
   wirkungslos: die spaetere Definition im Design-v2-Block gewinnt bei
   gleicher Spezifitaet und ueberschrieb JEDE ihrer Eigenschaften. Entfernt
   am 30.08.2026, damit nicht zwei Orte dieselbe Klasse zu bestimmen
   scheinen — die gueltige Regel steht bei .sr-kpi-gitter/.urteil.) */

/* --- Score-Ring / grosse Kennzahl -------------------------------------- */
.score { font-family: var(--font-num); font-weight: 800; letter-spacing: -.5px; }
.score--gut { color: var(--green); }
.score--mittel { color: var(--amber); }
.score--schlecht { color: var(--red); }

/* --- Score-Ringe im Kapitel Ueberblick (AP1 Slice 1, 28.08.2026) ---------
   Ersetzt die fruehere Text-Kachel "Audit-Score": ein grosser Ring
   (Gesamtscore) + drei kleinere Teilscore-Ringe, alle aus svg.js ring() —
   reines Inline-SVG, Farben ausschliesslich ueber Theme-Variablen (siehe
   dort), funktioniert deshalb automatisch in allen drei Themes. */
.score-ringe { display: flex; flex-wrap: wrap; align-items: center; gap: 34px; background: var(--surface); box-shadow: var(--edge), var(--e1); border-radius: var(--rlg); padding: 24px 26px; margin: 18px 0; }
/* Radial-Glow hinter den Ringen (design-tokens.md, Abschnitt 1: "Glow-
   Signatur hinter Score-Ringen"). Er sitzt am RING, nicht an der Karte —
   sonst leuchtet die Kartenecke statt der Kennzahl.
   Das ::before haengt bewusst am umgebenden div und NICHT am .score-ring:
   diese Klasse traegt svg.js:609 direkt auf dem <svg>, und Pseudo-Elemente
   auf einem SVG-Wurzelelement rendert kein Browser. */
.score-ring-haupt, .score-ring-gruppe { position: relative; }
.score-ring-haupt::before, .score-ring-gruppe::before {
  content: ""; position: absolute; z-index: 0;
  background: var(--accent-glow); pointer-events: none;
}
.score-ring-haupt::before { left: -34px; top: 50%; width: 220px; height: 220px; transform: translateY(-50%); }
.score-ring-gruppe::before { left: 50%; top: 26px; width: 118px; height: 118px; transform: translate(-50%, -50%); }
.score-ring-haupt > *, .score-ring-gruppe > * { position: relative; z-index: 1; }
.score-ring-haupt { display: flex; align-items: center; gap: 18px; }
.score-ring-haupt .score-ring { flex-shrink: 0; }
.score-ring-haupt-label { font-size: var(--fs-h2); font-weight: 700; color: var(--text); line-height: 1.4; }
.score-ring-haupt-sub { display: block; margin-top: 3px; font-size: var(--fs-small); font-weight: 500; color: var(--text-3); }
.score-ring-gruppen { display: flex; flex-wrap: wrap; gap: 26px; padding-left: 30px; border-left: 1px solid var(--line); }
.score-ring-gruppe { display: flex; flex-direction: column; align-items: center; text-align: center; width: 118px; }
.score-ring-gruppe .score-ring { flex-shrink: 0; }
.score-ring-gruppe-label { margin-top: 8px; font-size: var(--fs-small); font-weight: 700; color: var(--text-2); line-height: 1.35; }
.score-ring-gruppe-delta { margin-top: 4px; font-size: var(--fs-small); }
@media (max-width: 900px) {
  .score-ringe { padding: 18px; gap: 22px; }
  .score-ring-gruppen { padding-left: 0; border-left: none; border-top: 1px solid var(--line); padding-top: 18px; width: 100%; justify-content: space-between; }
  .score-ring-gruppe { width: 30%; }
}

/* --- Tabellenzellen ---------------------------------------------------- */
/* In Tabellen nur umbrechen, wenn es sein muss — break-all zerhackt sonst
   jeden Selektor in Vier-Zeichen-Stuecke und macht die Zeilen riesig. */
td .mono { word-break: normal; overflow-wrap: anywhere; }

/* --- Barrierefreiheits-Utility (Spezifikation B.2) ---------------------
   Nur fuer Screenreader: die Pfeile in Delta-Zellen sind aria-hidden, der
   eigentliche Bedeutungstext ("um 7 Plätze verbessert") steckt in einem
   .sr-only-Span daneben. Identisch im Bericht-STYLE definiert (dieselbe
   Klasse, siehe app/views/bericht.js) — eine Klasse, die nur an einem Ort
   existiert, ist laut Spezifikation ein Baufehler. */
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

/* --- Tabellen-Zebra (Spezifikation A.3) ---------------------------------
   Als background-image-Toenung, NICHT background-color: nur so vertraegt
   sich die Zebra gleichzeitig mit dem Zeilen-Hover (background-color:
   var(--hover), siehe XL-Tabellen-Block weiter unten), der Summenzeile
   (tr.tot) und der sticky
   ersten Spalte (braucht eine DECKENDE background-color, um beim
   waagerechten Scrollen den Inhalt dahinter zu verdecken — background-image
   liegt darueber und wird automatisch mitgezogen, kein Sonderfall noetig).
   Bewusst ~3 % Deckkraft: Zebra ist Lesehilfe fuer die Querbewegung des
   Auges, kein Gestaltungselement.
   --zebra selbst steht in theme.css bei den uebrigen Tokens. Es stand bis
   29.08.2026 hier — und nur fuer light und dark, das Grau-Theme ging beim
   Nachruesten leer aus: dort war var(--zebra) undefiniert, der ganze
   background-image-Wert damit ungueltig und die Zebra fiel still aus. */
/* tr.good/tr.bad sind seit dem 03.09.2026 KEINE eingefaerbten Zeilen mehr,
   sondern eine 3-px-Kante links (theme.css). Sie standen deshalb bis dahin
   in dieser Ausnahme und blieben ohne Zebra — mitten in der Tabelle riss die
   Lesespur ab. Jetzt tragen sie die Zebra wie jede andere Zeile. */
.tbl-wrap tbody tr:nth-child(even):not(.tot) td {
  background-image: linear-gradient(var(--zebra), var(--zebra));
}

/* --- Sicherheitsnetz gegen Ausreisser-Zellen (Spezifikation A.4/A.5) ----
   Kuerzung passiert serverseitig zuerst (f.clip); diese Klasse ist nur das
   CSS-Netz darunter, falls trotzdem mal ein langer Wert durchrutscht. */
td.zelle-kurz { max-width: 340px; }
td.zelle-kurz > * { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: bottom; }

/* --- Sparkline-Spalte in Tabellen (Spezifikation D.2) -------------------
   Analog .spark-wrap oben, aber fuer eine Tabellenzelle: feste, kleine Box,
   das SVG (svg.js sparkline()) fuellt sie ohne eigene Achsen. NUR Web (die
   Keyword-Tabelle des Berichts hat keine Grafikspalte, siehe Spezifikation
   D). */
.spark-zelle { display: inline-block; width: 96px; height: 20px; vertical-align: middle; }

/* --- Diagramme --------------------------------------------------------- */
.chart-wrap { margin: 16px 0 8px; padding: 12px 4px 4px; background: var(--surface); box-shadow: var(--edge), var(--e1); border-radius: var(--rlg); overflow-x: auto; }
.chart { display: block; width: 100%; height: auto; min-width: 460px; }
.chart-grid { stroke: var(--border); stroke-width: 1; }
.chart-axisline { stroke: var(--rule); stroke-width: 1; }
/* Achsenschrift des Server-SVG in der Hausschrift (SuperStyler-Rang 14,
   06.09.2026): Monospace liess das Fallback-Bild wie ein Terminal aussehen
   und brach mit den Live-Charts. Zahlen bleiben ueber tabular-nums buendig. */
.chart-axis { font-family: var(--font-body); font-variant-numeric: tabular-nums; font-size: var(--fs-svg); fill: var(--text-3); }
.chart-axis-titel { font-weight: 600; fill: var(--text-2); }
.chart-axis-y { text-anchor: end; }
.chart-axis-x { text-anchor: middle; }
.chart-axis-val { text-anchor: start; fill: var(--text-2); }
/* Balken-Wertlabel links vom Nullpunkt (barChart nullpunktMitte) — sonst
   erbt es text-anchor:start von .chart-axis-val und der Text waechst nach
   rechts INS Band statt vom Balken weg nach links. */
.chart-axis-val--links { text-anchor: end; }
.chart-track { fill: var(--surface-2); }
/* Achsentitel je Seite (lineChart zweite Y-Achse, barChart-Kopfzeile
   „verschlechtert"/„verbessert", Streudiagramm-Fusszeile „Position 1"). Etwas
   kraeftiger als die Zahlen-Beschriftung, damit die Seitenzuordnung auf den
   ersten Blick klar ist, ohne selbst wie eine Datenreihe zu wirken. */
.chart-axis-titel { font-weight: 600; fill: var(--text-3); text-anchor: start; }
.chart-axis-titel--rechts { text-anchor: end; }
/* Beschriftung der Grenzwertlinie (lineChart o.grenzwerte) — bewusst OHNE
   fill hier: die Farbe kommt je Linie als SVG-Praesentationsattribut vom
   Server (Theme-Token wie var(--amber)), diese Klasse setzt nur Schrift und
   Ausrichtung (rechtsbuendig an der Plot-Kante, wie die Achsentitel). */
.chart-grenzwert-label { font-family: var(--font-mono); font-size: var(--fs-svg); font-weight: 600; text-anchor: end; }
/* Ereignis-Marker (lineChart o.marken) — wie oben ohne fill: die Farbe kommt
   je Marker vom Server. Die Nummer sitzt in einem Kreis am oberen Plot-Rand,
   den Klartext traegt die Legende unter dem Bild (.chart-marken-legende). */
.chart-marke-nummer { font-family: var(--font-mono); font-size: var(--fs-svg); font-weight: 700; }
/* EINE ZEILE JE EREIGNIS, nicht nebeneinander: als Flex-Zeile gesetzt liefen
   die Titel einer Gruppe hinter der Nummer weiter und lasen sich wie
   getrennte Eintraege ohne Nummer (gemessen bei lackcenter, sechs Ereignisse
   an einer Marke). Zweispaltiges Raster je Zeile haelt die Nummern
   untereinander buendig. */
.chart-marken-legende { margin: 2px 0 14px; padding: 0; font-size: var(--fs-body); color: var(--text-2); }
.chart-marken-legende li { display: grid; grid-template-columns: 22px 1fr; gap: 2px 8px; align-items: baseline; padding: 1px 0; list-style: none; }
.chart-marken-nr { font-family: var(--font-mono); font-size: var(--fs-svg); font-weight: 700; color: var(--text-3);
  border: 1px solid var(--border); border-radius: var(--sr-r-pill); min-width: 18px; padding: 0 5px; text-align: center; flex-shrink: 0; }
.chart-marken-nr--leer { border-color: transparent; }
.chart-marken-datum { color: var(--text-3); }
/* Server-Legende (Fallback-SVG/Druck) in denselben Massen wie die Live-
   Legende .chart-leg-item unten (SuperStyler Rang 15, 06.09.2026): Punkt
   8 px, Schrift --fs-small, Reihenfolge = Serienfolge, umbrechend. */
.chart-legend { display: flex; flex-wrap: wrap; gap: 4px 14px; padding: 6px 4px 4px; font: 500 var(--fs-small) var(--font-body); color: var(--text-2); }
.chart-legend-item { display: inline-flex; align-items: center; gap: 6px; }
.chart-dot { width: 8px; height: 8px; flex-shrink: 0; }
.chart-leer { font-size: var(--fs-body); color: var(--text-3); margin: 12px 0; }
.chart-hinweis { font-size: var(--fs-body); color: var(--text-3); margin: 2px 0 16px; }
/* Zeitraumwahl 3/6/12 Monate (Sichtbarkeitsindex) — dieselbe Komponente wie
   .zeitraum-schalter (Kosten, weiter unten definiert), hier nur der Name
   fuer die zweite Verwendungsstelle dokumentiert: keine eigene Regel noetig,
   die bestehende Klasse wird 1:1 wiederverwendet. */

/* --- Aenderungs-Log ---------------------------------------------------- */
.diff-lauf { border-left: 3px solid var(--border); padding: 2px 0 14px 18px; margin-left: 6px; }
.diff-lauf:last-child { padding-bottom: 0; }
.diff-zeit { font-family: var(--font-mono); font-size: var(--fs-mono); color: var(--text-3); }
.diff-titel { font-weight: 700; color: var(--text); display: block; margin: 2px 0 6px; }
.diff-lauf--still .diff-titel { font-weight: 550; color: var(--text-2); }
.alt-wert { color: var(--red); text-decoration: line-through; }
.neu-wert { color: var(--green); }

/* --- Domain-Cluster ---------------------------------------------------- */
/* Cluster-HUELLE halbtransparent (AP5 Stufe 3, 30.08.2026): frueher ein
   deckendes var(--surface-2). Die Huelle umschliesst Projektkarten, die
   selbst auf var(--surface) stehen — deckend war sie deshalb eine zweite
   volle Flaeche und lag optisch VOR ihrem Inhalt statt hinter ihm, im hellen
   Theme als sichtbar grauer Kasten um weisse Karten. color-mix macht daraus
   eine Lage: sie faerbt den Seitenhintergrund ein, statt ihn zu ersetzen.
   Die erste, deckende Deklaration bleibt als Rueckfall stehen — Browser ohne
   color-mix (vor 2023) behalten damit exakt das alte Bild statt einer
   durchsichtigen Huelle ohne Abgrenzung. */
.cluster-gruppe { box-shadow: var(--edge), var(--e1); border-radius: var(--rlg); padding: 18px 20px 6px; margin: 24px 0; background: var(--surface-2); }
.cluster-gruppe { background: color-mix(in srgb, var(--surface-2) 55%, transparent); }
.cluster-kopf { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.cluster-kopf h3 { margin: 0; font-size: var(--fs-h2); }
.cluster-kopf h3 a { color: var(--text); }
.cluster-sub { font-size: var(--fs-body); color: var(--text-3); margin: 4px 0 2px; }
.cluster-gruppe .projekt-karte { background: var(--surface); }
.cluster-gruppe .projekt-karte .card { background: var(--surface-2); }

/* Cross-Link-Matrix: die leere Zelle ist der eigentliche Befund und wird
   deshalb bewusst hervorgehoben, nicht weggeblendet. */
.matrix-tabelle td.matrix-zelle { text-align: center; vertical-align: middle; }
.matrix-tabelle td.matrix-zelle .mono { font-size: var(--fs-small); color: var(--text-3); }
.matrix-zahl { font-family: var(--font-num); font-weight: 800; font-size: var(--fs-h2); color: var(--green); }
.matrix-keine { font-weight: 700; color: var(--red); font-size: var(--fs-body); }
.matrix-zelle--keine { background: var(--red-dim); }
.matrix-zelle--selbst { background: var(--surface-2); }
.matrix-selbst { color: var(--text-3); }

/* --- Keywords: Positions-Delta ----------------------------------------- */
/* Positionen sind „kleiner ist besser". Damit niemand die Pfeile falsch liest,
   ist die Farbe an der Bedeutung ausgerichtet (nach vorn = gruen), nicht am
   Vorzeichen der Rohzahl. */
.delta-gut { color: var(--green); font-weight: 700; white-space: nowrap; }
.delta-schlecht { color: var(--red); font-weight: 700; white-space: nowrap; }
.delta-neutral { color: var(--text-3); }

/* --- Keywords: Kannibalisierung ---------------------------------------- */

/* --- SERP-Messung (DataForSEO) ----------------------------------------- */
/* Anders als beim Positions-Delta ist hier die ABSOLUTE Position eingefaerbt:
   1–3 ist die Zone, in der geklickt wird, 4–10 die Restseite eins. „> 10"
   ist bewusst kein Strich — es ist ein Messergebnis („nicht gefunden"), kein
   fehlender Wert, und muss sich von einer leeren Zelle unterscheiden. */
.serp-top { color: var(--green); font-weight: 800; }
.serp-ok { color: var(--text); font-weight: 700; }
.serp-weg { color: var(--red); font-weight: 700; white-space: nowrap; }


/* --- Sparkline auf den Projektkarten ----------------------------------- */
.spark-wrap { display: inline-block; width: 132px; height: 30px; vertical-align: middle; margin-left: 10px; }
.spark { display: block; width: 100%; height: 100%; overflow: visible; }

/* --- Indexierungs-Statusstreifen (Kapitel 07, Feature 4) ----------------
   Gleiches Prinzip wie die Sparkline oben: fixe Box, das SVG fuellt sie
   ohne eigene Achsen. Steht als Tabellenspalte in der Indexierungs-
   Statustabelle, genau wie die Sparkline in der Ereignis-Tabelle
   (Kapitel 05.3) — gleiches Haus-Muster fuer „kleiner Verlauf in einer
   Tabellenzelle". */
.streifen-wrap { display: inline-block; width: 190px; height: 20px; vertical-align: middle; }
.streifen { display: block; width: 100%; height: 100%; overflow: visible; }
.canon-abweichend { cursor: help; }

/* --- Safe-Browsing-Alarm-Banner ------------------------------------------
   Hoechste Alarmstufe im Haus: baut auf .info--stop auf (gleiche Variablen,
   gleiches Hell/Dunkel-Verhalten), aber deutlich prominenter — steht IMMER
   ganz oben im Inhalt, vor allen Karten, mit Icon und Schatten, damit ein
   Vorfall wie der vom 15.07.2026 (geflaggt, zwei Wochen unbemerkt) nicht
   zwischen den Karten untergeht. ------------------------------------------ */
.sb-banner { border-left-width: 6px; padding: 20px 24px; font-size: var(--fs-h2); box-shadow: var(--edge), var(--e2); margin: 0 0 22px; }
.sb-banner-kopf { display: flex; align-items: center; gap: 10px; font-size: var(--fs-h2); margin-bottom: 6px; }
.sb-banner-icon { font-size: var(--fs-h1); line-height: 1; flex-shrink: 0; }
.sb-banner-liste { margin: 8px 0 10px; padding-left: 20px; }
.sb-banner-liste li { margin: 4px 0; }
.sb-banner-projekt { border-top: 1px solid var(--border); padding-top: 10px; margin-top: 10px; }
.sb-banner-projekt:first-of-type { border-top: 0; padding-top: 0; margin-top: 0; }
.sb-banner-hinweis { margin: 10px 0 0; font-size: var(--fs-body); color: var(--text-2); }
/* .sb-status-zeile ist am 04.09.2026 entfallen (Punkt 10a): der Satz
   „sauber Safe Browsing: geprüft …" ist jetzt eine Kachel in der Karte
   „Zustand" (projekt.js, safeBrowsingKachel). */

/* --- Vorbehalte gegen einzelne Messtage (Aufgabe 4.3) --------------------
   Steht im jeweiligen Kapitel ueber den Zahlen, auf die es sich bezieht —
   nicht gesammelt am Seitenkopf. Kein eigenes Farbschema: die Stufe waehlt
   .info--stop (unbelastbar) bzw. .info--warn (hinweis), wie ueberall im Haus.
   Hier nur die Liste enger setzen als der globale ul-Abstand. ------------- */
.vorbehalt-liste { margin: 8px 0 0; padding-left: 20px; }
.vorbehalt-liste li { margin: 4px 0; }

/* --- Fusszeile --------------------------------------------------------- */
.app-fuss { margin-top: 56px; padding-top: 18px; border-top: 1px solid var(--border); font-size: var(--fs-body); color: var(--text-3); }
.app-fuss .mono { font-size: var(--fs-small); }

/* --- Mobil ------------------------------------------------------------- */
@media (max-width: 900px) {
  .projekt-karte { padding: 16px; }
  .projekt-kopf h3 { font-size: var(--fs-h2); }
  .chart { min-width: 420px; }
  .chart-wrap { padding: 8px 2px 2px; }
  .spark-wrap { width: 96px; }
}

/* ========================================================================
   APP-HUELLE (seit 29.07.2026: Anmeldung und App-Navigation)

   Alles hier benutzt ausschliesslich die Variablen der Haus-Vorlage
   (--surface, --border, --text …), damit Hell/Dunkel, Mobil und Druck ohne
   eigene Sonderregeln weiterlaufen. Der Kopfbereich ist in der Vorlage immer
   dunkel — deshalb stehen dort feste weisse Toene und keine Variablen.
   ======================================================================== */

/* --- Kopf rechts -------------------------------------------------------- */

/* Die Regeln .kopf-suche* fuer das sichtbare Suchfeld standen hier bis zum
   08.09.2026. Ihr Erzeuger layout.js kopfSuchfeld() wurde vom R3-Kopf nicht
   mehr aufgerufen; ohne Knopf im Markup war das gesamte Regelpaar samt seiner
   drei Breiten-Stufen (1680/1300/900 px) wirkungslos. */

.usermenu { position: relative; }
.usermenu-drop {
  position: absolute; right: 0; top: calc(100% + 8px); z-index: 120; min-width: 244px;
  background: var(--surface); border-radius: var(--rmd);
  box-shadow: var(--edge), var(--e3); overflow: hidden;
}
.usermenu-drop[hidden] { display: none; }
.usermenu-kopf {
  display: flex; flex-direction: column; gap: 3px;
  padding: 14px 16px 12px; border-bottom: 1px solid var(--border); background: var(--surface-2);
}
.usermenu-kopf-name { font-size: var(--fs-body); font-weight: 700; color: var(--text); }
.usermenu-item {
  display: block; width: 100%; text-align: left; padding: 12px 16px;
  background: none; border: 0; font: inherit; font-size: var(--fs-body); font-weight: 550;
  color: var(--text-2); text-decoration: none; cursor: pointer; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.usermenu-item:hover { background: var(--hover); color: var(--text); }
.usermenu-item:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: -2px; }
.usermenu-form { margin: 0; }

/* --- Seitenleiste: App-Menue ueber dem Inhaltsverzeichnis --------------- */
/* Gruppentitel in der Schreibweise des VERWALTUNG-Kopfes (Runde 7):
   volle Sperrung, volle Deckkraft, +20 % Schrift (Basis 11 px) — PROJEKTE,
   CLUSTER und VERWALTUNG lesen sich als eine Familie. */
.nav-group--sub { padding-top: 10px; padding-bottom: 4px; letter-spacing: 1px; font-size: var(--fs-body); }
.nav-item--app { font-size: var(--fs-ui); font-weight: 600; }
/* Praesenz-Punkte ohne Glyphe (Runde 5): linksbuendig auf der Flucht der
   Kapitelnummern darunter (Ebene 2: padding-left 44px, mobil 40px). */
.nav-item--frei { padding-left: 44px; }
@media (max-width: 900px) { .nav-item--frei { padding-left: 40px; } }
/* Projekt-/Praesenz-Punkte (Runde 7): +10 % gegenueber .nav-item--app,
   Ampel-Punkt entsprechend mit — und die Ampel steht LINKS vor dem Namen
   (nav-ampel--vor: kein Basis-Abstand links, die Flex-Luecke traegt). */
.nav-item--projekt { font-size: var(--fs-body); }
.nav-item--projekt .nav-ampel { width: 9px; height: 9px; }
/* Verbund-Selektor noetig: die .nav-ampel-Basisregel steht weiter unten
   in der Datei und gewaenne sonst (gleiche Spezifitaet, spaetere Quelle).
   flex-start + margin-top pinnt den Punkt an die ERSTE Zeile, auch wenn
   ein langer Domainname umbricht. */
.nav-item .nav-ampel--vor { margin-left: 0; align-self: flex-start; margin-top: 6px; }

/* Praesenz-Seite (Runde 5): Snippet als kopierbarer Codeblock. */
.praesenz-snippet { margin: 10px 0 0; padding: 12px 14px; box-shadow: var(--edge), var(--e1); border-radius: var(--sr-r-sm); background: var(--surface-2); overflow-x: auto; }
.praesenz-snippet code { font-family: var(--font-num, ui-monospace), ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: var(--fs-small); white-space: pre-wrap; word-break: break-all; color: var(--text-2); }
.nav-item--app .n { color: var(--text-3); }
.nav-item--app.active .n { color: var(--accent); }

/* Verwaltung unten angedockt (Runde 4, 27.08.2026): margin-top:auto schiebt
   den Block ans Ende der Flex-Spalte (frueher Job der entfallenen .nav-foot),
   sticky haelt ihn auch bei scrollender Projektliste am unteren Rand sichtbar.
   Die Liste steht im DOM VOR dem Knopf — der Block waechst beim Aufklappen
   am fixierten Unterrand nach oben. */
/* Die Bedienleiste folgt im DOM direkt nach dem Verwaltungsblock. Dessen
   Flex-Spalte darf mit min-height:0 schrumpfen, damit beide am unteren Rand
   der Seitenleiste erreichbar bleiben. */
.nav-verwaltung {
  margin-top: auto; background: var(--surface); border-top: 1px solid var(--border);
  display: flex; flex-direction: column; min-height: 0;
}
.nav-verwaltung-kopf {
  display: flex; align-items: center; gap: 8px; width: 100%; padding: 15px 24px;
  background: transparent; border: 0; cursor: pointer; text-align: left; font-family: inherit;
  font-size: var(--fs-body); text-transform: uppercase; letter-spacing: 1px; color: var(--text-3); font-weight: 700;
  transition: color 140ms var(--ease), background 140ms var(--ease);
}
.nav-verwaltung-kopf:hover { color: var(--text); background: var(--hover); }
.nav-verwaltung-kopf:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: -2px; }
.nav-verwaltung-chev { width: 13px; height: 13px; margin-left: auto; flex: none; transition: transform 180ms var(--ease); }
.nav-verwaltung.open .nav-verwaltung-chev { transform: rotate(180deg); }
/* Nie hoeher als der Sichtbereich der Sidebar — lange Listen scrollen intern.
   Die Hoehe wird nicht mehr gerechnet, sondern GEMESSEN: die Liste ist das
   dehnbare Glied der Flex-Spalte und nimmt genau den Platz, der nach Marke,
   Projektwaehler, Verwaltungs-Knopf und Fuss uebrig ist.
   Die fruehere Formel `calc(100vh - var(--header-h) - 96px)` liess 96 px fuer
   Bestandteile, die zusammen 244 px hoch sind (Marke 82 + Waehler 54 + Knopf
   45 + Fuss 63) — sie band ueberhaupt nur bei kleinen Fenstern, und dann
   immer noch zu spaet. Ausserdem hing sie an --header-h, das seit C1 auf dem
   Schreibtisch 0 ist: eine Zahl, die einmal stimmte und stillschweigend
   falsch wurde. */
.nav-verwaltung-liste { padding: 6px 0 2px; flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; }
.nav-verwaltung-kopf { flex: none; }
.nav-verwaltung.open .nav-verwaltung-liste { animation: seo-verwaltung-auf 220ms var(--ease) both; }
@keyframes seo-verwaltung-auf { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

/* --- Anmeldeseite -------------------------------------------------------
   OHNE App-Kopfbalken seit AP5 Stufe 3 (30.08.2026, siehe layout.js
   zentriertePage()): der dunkle Header rahmt ein App-Fenster, das es auf
   einer Anmeldeseite nicht gibt. An seine Stelle tritt ein Verlauf ueber
   --bg-deep (dunkelster Flaechenton JEDES Themes, also auch im hellen
   funktionierend) mit einem weichen Akzent-Schein oben — die Karte liegt
   darin, statt unter einem Balken zu haengen.

   padding-top:0 hebt das globale body{padding-top:var(--header-h)} aus
   theme.css auf. Ohne diese Zeile klaffte oben genau die Hoehe des
   entfernten Balkens als leerer Streifen. */
.body--zentriert {
  padding-top: 0;
  background: var(--bg-deep);
  background:
    radial-gradient(120% 74% at 50% -8%, var(--accent-soft), transparent 62%),
    linear-gradient(180deg, var(--bg) 0%, var(--bg-deep) 100%);
  background-attachment: fixed;
}
.zentriert {
  min-height: 100vh;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  padding: 40px 20px 64px; gap: 18px;
}
/* Marke ueber der Karte — uebernimmt die Rolle des entfallenen Kopfbalkens. */
.zentriert-marke { display: flex; flex-direction: column; align-items: center; gap: 2px; margin-bottom: 6px; }
.zentriert-marke-icon { display: block; }
.zentriert-marke .logo-svg { width: 54px; height: 54px; display: block; }
/* Suchkegel und Blips laufen auch auf der Anmeldeseite — sie hat keinen
   Kopfbalken mehr, und ohne diese Regeln stuende die Marke dort still. Das
   Gegenstueck an .header-logo ist mit dem Kopfbalken entfallen (08.09.2026),
   das an .sr-marke-logo steht in sr.css. Die Blip-Verzoegerungen sind auf die
   Winkel der drei Punkte gerechnet, siehe layout.js markenIcon(). Ein
   Durchlauf statt endlos — Begruendung am selben Regelpaar in sr.css
   (Veto 6, WCAG 2.2.2). */
.zentriert-marke .radar-kegel { animation: radar-dreh 4.2s linear 1 forwards; transform-origin: 50% 50%; transform-box: view-box; }
.zentriert-marke .radar-blip { animation: radar-blip 4.2s var(--ease) 1; }
html.sr-signet-still .zentriert-marke .radar-kegel,
html.sr-signet-still .zentriert-marke .radar-blip { animation: none; }
.zentriert-marke .rb1 { animation-delay: .43s; }
.zentriert-marke .rb3 { animation-delay: 1.51s; }
.zentriert-marke .rb2 { animation-delay: 2.55s; }
/* Die beiden Nachfaerber .zentriert-marke .radar-kern/.radar-kreuz sind am
   08.09.2026 entfallen: markenIcon() setzt seit dem 30.08.2026 die Klassen
   rk-kern und rk-kreuz, nicht mehr radar-kern/radar-kreuz. Die Regeln trafen
   also nichts; Fadenkreuz und Kern holen ihre Farbe heute aus sr.css. */
.zentriert-marke-titel { font-size: var(--fs-h2); font-weight: 700; letter-spacing: 1.4px; color: var(--text); }
.zentriert-marke-sub { font-size: var(--fs-small); color: var(--text-3); letter-spacing: .2px; }
/* Farbschema-Kreise der Anmeldeseite (06.09.2026): dieselben drei Kreise
   wie in der Seitenleiste (Regeln .sr-nav-theme in sr.css), frei unten
   links auf einer kleinen Flaeche statt des alten Hell/Dunkel-Knopfs oben
   rechts. */
/* sr.css laedt NACH app.css (Buendel-Reihenfolge in app/lib/assets.js) und
   setzt .sr-nav-theme position:relative + border-top — deshalb hier mit
   dem Body-Praefix, sonst verliert die feste Ecke. */
.body--sr-zentriert .sr-nav-theme--frei {
  position: fixed; left: 16px; bottom: 16px; z-index: 10;
  background: var(--surface); border-top: 0; box-shadow: var(--edge), var(--e1);
  border-radius: var(--rmd); padding: 8px 12px;
}
.body--sr-zentriert .sr-nav-theme--frei .sr-nav-theme-text { flex: none; margin-right: 4px; }
.anmeldekarte {
  width: 100%; max-width: 424px; background: var(--surface);
  border-radius: var(--rlg);
  padding: 34px 34px 32px; box-shadow: var(--edge), var(--e3);
}
.anmelde-titel { margin: 0 0 6px; font-size: var(--fs-kpi); letter-spacing: -.4px; }
.anmelde-sub { margin: 0 0 22px; font-size: var(--fs-body); color: var(--text-3); }
.anmelde-fehler, .anmelde-hinweis { margin: 0 0 20px; }
.anmelde-form { display: flex; flex-direction: column; gap: 16px; }
.anmelde-fuss { margin: 18px 0 0; font-size: var(--fs-body); text-align: center; }
.zentriert-fuss { margin: 0; font-size: var(--fs-small); color: var(--text-3); text-align: center; }

/* --- Formularfelder (Anmeldung + Konto) --------------------------------- */
.feld { display: flex; flex-direction: column; gap: var(--s1); }
.feld-label { font-size: var(--fs-small); font-weight: 700; letter-spacing: .6px; text-transform: uppercase; color: var(--text-3); }
.feld-eingabe {
  width: 100%; padding: var(--s2) var(--s2); font: inherit; font-size: var(--fs-h2);
  color: var(--text); background: var(--surface-2);
  border: 0; box-shadow: var(--edge); border-radius: var(--rmd);
  transition: background var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.feld-eingabe::placeholder { color: var(--text-3); opacity: .7; }
/* :focus-visible statt :focus, und der Ring liegt AUSSEN mit 2 px Versatz —
   dieselbe Sprache wie .sr-app :focus-visible in sr.css. */
/* background-COLOR, nicht die Kurzform (Befund Daniel 06.09.2026, „komisch
   schraffiertes Feld"): die Kurzform setzte repeat/size zurueck, die
   dunkle Theme-Regel legte den Pfeil danach wieder drauf — gekachelt ueber
   das ganze Dropdown, sobald es den Fokus hatte. */
.feld-eingabe:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; background-color: var(--surface); }
.feld-eingabe--code {
  font-family: var(--font-mono); font-size: var(--fs-h1); letter-spacing: 10px;
  text-align: center; padding: var(--s2) var(--s2);
}
/* Mehrzeilige Eingabe (Projekt-Kontext, 01.09.2026): dieselbe Huelle wie
   .feld-eingabe, nur mit Hoehe und Zeilenabstand fuer Fliesstext. resize
   bleibt senkrecht erlaubt — waagerecht wuerde es das Raster sprengen. */
.feld-eingabe--mehrzeilig { min-height: 104px; resize: vertical; font-size: var(--fs-body); line-height: 1.55; }

/* Weiss auf Blau, ohne Rand, mit Schatten und Schwebeeffekt (Betreiber-
   Vorgabe 06.09.2026) — dieselben Tokens wie .sr-knopf (theme.css --knopf-*). */
.knopf {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  min-height: 44px; padding: 0 20px; font: inherit; font-size: var(--fs-h2); font-weight: 650;
  border: 0; border-radius: var(--rmd);
  background: var(--knopf-blau); color: var(--auf-knopf); cursor: pointer;
  box-shadow: var(--knopf-schatten);
  text-decoration: none; /* .knopf auch als <a> nutzbar (z.B. DashboardMaster-Deep-Link) */
  transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease), transform var(--t-fast) var(--ease);
}
.knopf:hover { background: var(--knopf-blau-hover); color: var(--auf-knopf); box-shadow: var(--knopf-schatten-hover); transform: translateY(-1px); }
.knopf:active { background: var(--knopf-blau-aktiv); transform: translateY(0); box-shadow: var(--knopf-schatten-aktiv); }
.knopf:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
.knopf--haupt { margin-top: var(--s0); font-weight: 750; }
.knopf--haupt:hover { background: var(--knopf-blau-hover); }
.knopf--gefahr { margin-top: var(--s0); background: var(--knopf-rot); color: var(--auf-knopf); font-weight: 700; box-shadow: var(--knopf-rot-schatten); }
.knopf--gefahr:hover { background: var(--knopf-rot-hover); color: var(--auf-knopf); }

/* --- Konto-Seite -------------------------------------------------------- */
.konto-form { display: flex; flex-direction: column; gap: 16px; max-width: 420px; margin: 20px 0 4px; }
.konto-form .knopf { align-self: flex-start; }
td .kurz { font-size: var(--fs-label); color: var(--text-3); }

/* --- Zwei-Faktor-Einrichtung (Konto) ------------------------------------
 * Der QR-Code ist ein reines Schwarz/Weiss-Bild (siehe qrcode.toString()-SVG
 * in server.js) — der weisse Kasten bleibt bewusst fest weiss statt an das
 * Farbschema gebunden, sonst waere er im Dunkelmodus schlechter scanbar.
 */
.zwei-faktor-qr {
  display: inline-block; background: var(--qr-grund); padding: var(--s3); margin: var(--s1) 0 var(--s0);
  box-shadow: var(--edge), var(--e1); border-radius: var(--rmd); line-height: 0;
}
.zwei-faktor-qr svg { display: block; width: 220px; height: 220px; }
.zwei-faktor-secret { display: inline-block; margin-top: 4px; font-size: var(--fs-body); letter-spacing: .5px; }

/* ========================================================================
   POWER-WORKBENCH (Design-Ueberarbeitung, 30.07.2026)

   Dichte und Praezision fuer breite Displays, im bestehenden Farbsystem.
   Sechs Bausteine: stufenlose Inhaltsbreite, Mega-Menue, XL-Tabellen,
   zweckgebundene Bewegung, Uebersicht-Grid (Nachbesserung 30.07.2026 aus
   dem Design-Gate), Kapitel-Leiste (Navigations-Umbau 30.07.2026, eigener
   Abschnitt weiter unten). Alles ausschliesslich mit den Theme-Variablen der
   Vorlage — beide Themes bleiben vollwertig.
   ======================================================================== */


/* --- 1) Stufenlose Content-Breite ---------------------------------------
   DIE BREITE WIRD NICHT MEHR HIER GESTEUERT (gemessen 08.09.2026). Hier stand
   `.content { width; max-width; transition }`, und der Kommentar daneben
   behauptete, diese Regel schlage den Prosa-Deckel der Vorlage. Beides traegt
   nicht mehr: layout.js rendert <main> ausnahmslos als `class="content
   sr-body"`, und `.content.sr-body` in sr.css (Spezifitaet 0,2,0 gegen 0,1,0,
   und im Buendel spaeter geladen) setzt width, max-width UND transition neu.
   Damit war jede der drei Deklarationen wirkungslos.

   Wer die Inhaltsbreite aendern will, geht nach sr.css an .content.sr-body
   und die drei Zweck-Stufen darunter (--sr-breite-lesen/-uebersicht/-arbeit).
   --inhalt-breite selbst steht bei den uebrigen Tokens in theme.css;
   app.js/theme.js schreiben den Nutzerwert als Inline-Property ans <html>. */

/* Zahnrad (Stufe 2, E6/E4): ersetzt die frei im Kopf stehenden Werkzeuge
   (Dichte-Knopf, Breite-Regler) durch EIN Dropdown ganz rechts — Theme,
   Inhaltsbreite, Tabellendichte. Der Slider sitzt jetzt auf einer Flaeche
   (var(--surface)), nicht mehr auf dem dunklen Kopfband; die Farben kommen
   deshalb aus den Theme-Variablen statt aus rgba(255,255,255,…). */
.zahnrad { position: relative; }
.zahnrad-btn {
  height: 42px; width: 42px; display: inline-flex; align-items: center; justify-content: center;
  background: transparent; border: 0; border-radius: 0;
  color: var(--text-2); cursor: pointer; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); flex-shrink: 0;
}
.zahnrad-btn:hover { background: var(--hover); color: var(--text); }
.zahnrad-btn:active { transform: scale(.96); }
.zahnrad-btn:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
.zahnrad-btn svg { width: 19px; height: 19px; display: block; }
.zahnrad.open .zahnrad-btn { background: var(--hover); color: var(--accent); }
.zahnrad-drop {
  position: absolute; right: 0; top: calc(100% + 10px); min-width: 300px; z-index: 120;
  background: var(--surface); border-radius: var(--rmd);
  box-shadow: var(--edge), var(--e3); padding: 6px 0 12px;
}
.zahnrad-drop[hidden] { display: none; }
.zahnrad-gruppe { padding: 10px 16px 4px; }
.zahnrad-gruppe + .zahnrad-gruppe { border-top: 1px solid var(--border-l); margin-top: 8px; }
.zahnrad-titel { font-size: var(--fs-label); text-transform: uppercase; letter-spacing: 1.4px; color: var(--text-3); font-weight: 700; margin-bottom: 8px; }
.zahnrad-titel label { color: inherit; }
.zahnrad-schalter { display: flex; gap: 6px; }
.zahnrad-opt {
  flex: 1; padding: 7px 10px; font: 600 var(--fs-small) var(--font-body); color: var(--text-2);
  background: var(--surface-2); border: 0; border-radius: var(--rmd);
  cursor: pointer; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); white-space: nowrap;
}
.zahnrad-opt:hover { color: var(--text); background: var(--hover); }
.zahnrad-opt[aria-pressed="true"] { background: var(--knopf-blau); color: var(--auf-knopf); font-weight: 700; }
.zahnrad-opt:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
.zahnrad-breite { display: flex; align-items: center; gap: 10px; }

.breite-slider {
  flex: 1; height: 20px; margin: 0; background: transparent; cursor: pointer;
  -webkit-appearance: none; appearance: none;
}
.breite-slider:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 3px; }
.breite-slider::-webkit-slider-runnable-track { height: 4px; border-radius: var(--sr-r-xs); background: var(--border); }
.breite-slider::-moz-range-track { height: 4px; border-radius: var(--sr-r-xs); background: var(--border); }
.breite-slider::-moz-range-progress { height: 4px; border-radius: var(--sr-r-xs); background: var(--accent); }
.breite-slider::-webkit-slider-thumb {
  -webkit-appearance: none; margin-top: -6px; width: 16px; height: 16px; border-radius: 50%;
  background: var(--accent); border: 2px solid var(--surface); box-shadow: var(--regler-schatten);
  transition: transform 120ms var(--spring, var(--ease)); cursor: pointer;
}
.breite-slider::-moz-range-thumb {
  width: 14px; height: 14px; border-radius: 50%; background: var(--accent); border: 2px solid var(--surface);
  box-shadow: var(--regler-schatten); transition: transform 120ms var(--ease); cursor: pointer;
}
.breite-slider:active::-webkit-slider-thumb { transform: scale(1.22); }
.breite-slider:active::-moz-range-thumb { transform: scale(1.22); }
/* Der Wert ist seit dem 05.09.2026 eine gemessene Pixelbreite, nicht mehr
   „90 %" — „1.898 px · voll" braucht Platz, und er darf beim Schieben nicht
   springen. Deshalb feste Mindestbreite statt Umbruch. */
.breite-wert { font-family: var(--font-num); font-variant-numeric: tabular-nums; font-size: var(--fs-small); font-weight: 700; color: var(--text); min-width: 96px; text-align: right; white-space: nowrap; }

/* Ampel-Punkt am Projektnamen in der Seitenleiste (Bauplan Kap. 3). */
.nav-ampel { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-left: 6px; align-self: center; flex-shrink: 0; }
.nav-ampel--gruen { background: var(--green); }
.nav-ampel--gelb { background: var(--amber); }
.nav-ampel--rot { background: var(--red); }

/* Gruppen, die nur in der Mobil-Schublade erscheinen (Projekt-Wechsel des
   SuperAdmin — der Kopf-Selektor faellt auf schmalen Schirmen weg). */
.nur-mobil { display: none; }

/* --- 2) Mega-Menue ------------------------------------------------------ */
.mega-wrap { position: relative; }
.mega-btn {
  display: inline-flex; align-items: center; gap: 9px; height: 42px; padding: 0 16px;
  background: var(--card-2); border: 0; box-shadow: var(--edge); border-radius: 0;
  color: var(--text); font: inherit; font-size: var(--fs-body); font-weight: 600;
  cursor: pointer; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.mega-btn:hover { background: var(--hover); color: var(--text); }
.mega-btn:active { transform: scale(.97); }
.mega-btn:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
.mega-btn-icon { width: 17px; height: 17px; flex-shrink: 0; }
.mega-btn-chev { width: 7px; height: 7px; flex-shrink: 0; border-right: 2px solid var(--text-3); border-bottom: 2px solid var(--text-3); transform: rotate(45deg) translateY(-2px); transition: transform 160ms var(--ease); }
.mega-wrap.open .mega-btn-chev { transform: rotate(-135deg) translateY(1px); }

.mega-panel {
  /* RECHTS am Knopf verankert (Runde-5-Nachschlag, 27.08.2026): der Knopf
     sitzt am rechten Header-Rand — links verankert ragte das Panel aus dem
     Fenster (Betreiber-Screenshot). 76vw statt 82vw haelt auch auf schmalen
     Desktops die linke Kante im Bild; mobil uebernimmt ohnehin die Schublade. */
  position: absolute; right: 0; top: calc(100% + 10px); z-index: 130;
  width: min(880px, 76vw); max-height: min(72vh, 720px); overflow-y: auto;
  background: var(--surface); border-radius: var(--rmd);
  box-shadow: var(--edge), var(--e3); padding: 18px; transform-origin: top right;
}
.mega-panel[hidden] { display: none; }
@keyframes seo-mega-ein { from { opacity: 0; transform: scale(.96) translateY(-6px); } to { opacity: 1; transform: scale(1) translateY(0); } }
.mega-panel:not([hidden]) { animation: seo-mega-ein 190ms var(--ease) both; }

.mega-gruppe { margin-bottom: 18px; }
.mega-gruppe:last-child { margin-bottom: 0; }
.mega-gruppe-titel { font-size: var(--fs-label); text-transform: uppercase; letter-spacing: 1.4px; color: var(--text-3); font-weight: 700; margin-bottom: 10px; }
.mega-gruppe--system { display: flex; flex-wrap: wrap; gap: 8px; padding-bottom: 16px; margin-bottom: 16px; border-bottom: 1px solid var(--border); }
.mega-sys {
  display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px;
  background: var(--surface-2); border: 0; border-radius: var(--rmd);
  color: var(--text); text-decoration: none; font-size: var(--fs-body); font-weight: 600;
  transition: background var(--t-fast) var(--ease);
}
.mega-sys:hover { background: var(--hover); text-decoration: none; }
.mega-sys:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }

.mega-karten { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 10px; }
.mega-karte {
  display: flex; flex-direction: column; gap: 4px; padding: 12px 14px;
  background: var(--surface-2); box-shadow: var(--edge), var(--e1); border-radius: var(--rsm);
  color: var(--text); text-decoration: none; transition: transform 160ms var(--ease), box-shadow 160ms var(--ease);
}
.mega-karte:hover, .mega-karte:focus-visible { transform: translateY(-2px); box-shadow: inset 0 0 0 1px var(--accent), var(--e2); text-decoration: none; }
.mega-karte:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
.mega-karte.aktiv { box-shadow: inset 0 0 0 1px var(--accent), var(--e1); background: var(--accent-soft); }
.mega-karte.aktiv:hover, .mega-karte.aktiv:focus-visible { box-shadow: inset 0 0 0 1px var(--accent), var(--e2); }
.mega-karte-kopf { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.mega-karte-name { font-size: var(--fs-body); font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mega-ampel { font-size: var(--fs-label); flex-shrink: 0; gap: 5px; }
.mega-ampel::before { width: 8px; height: 8px; box-shadow: 0 0 0 2px var(--surface-2); }
.mega-karte-domain { font-family: var(--font-mono); font-size: var(--fs-mono); color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mega-karte-lauf { font-size: var(--fs-small); color: var(--text-2); }

/* --- 3) XL-Tabellen ------------------------------------------------------
   Seit 07.09.2026 gilt „volle Listen" fuer JEDE Tabelle app-weit (Ansage
   Daniel 04.09.2026, praezisiert 06.09.2026: „ohne Scrollbalken und etwas
   grosszuegiger") — der Hoehendeckel aus dem R3-Paket (max-height, seit
   06.09.2026 punktuell per `ohneDeckel` abschaltbar) ist damit Geschichte
   und komplett entfernt, nicht mehr nur optional. overflow:auto bleibt
   bewusst stehen: eine breite Tabelle muss auf schmalen Schirmen weiterhin
   waagerecht scrollen koennen (K3 der Pruefliste), nur die Hoehe wird nicht
   mehr gedeckelt. */
.tbl-wrap {
  position: relative;
  overflow: auto;
  border: 1px solid var(--line);
  border-radius: var(--rmd);
  overscroll-behavior-x: contain;
  overscroll-behavior-y: auto;
}

.tbl-wrap table { border-collapse: separate; }
.tbl-wrap thead th {
  position: sticky; top: 0; z-index: 5;
  background: var(--thead-bg);
  box-shadow: inset 0 -1px 0 var(--auf-dunkel-hauch);
}

/* Scroll-Schatten: zeigen an, dass links/rechts noch etwas verborgen liegt.
   Als inset-box-shadow auf dem Wrapper selbst statt als Pseudo-Element-Overlay
   — box-shadow ist Teil der eigenen Box des Wrappers und bleibt damit an
   dessen Kante fixiert, unabhaengig vom Scroll-Stand des Inhalts darin.
   Klassen kommen aus app.js (JS statt scroll-driven-animations — verlaesslich
   in allen Browsern, nicht nur den neuesten). */
.tbl-wrap { transition: box-shadow 160ms var(--ease); }
.tbl-wrap.scroll-left { box-shadow: inset 14px 0 14px -14px var(--scroll-schatten); }
.tbl-wrap.scroll-right { box-shadow: inset -14px 0 14px -14px var(--scroll-schatten); }
.tbl-wrap.scroll-left.scroll-right { box-shadow: inset 14px 0 14px -14px var(--scroll-schatten), inset -14px 0 14px -14px var(--scroll-schatten); }

/* Erste Spalte sticky — nur wenn die Tabelle tatsaechlich waagerecht
   scrollt (Klasse .tbl-scrollable, per JS gesetzt). */
.tbl-wrap.tbl-scrollable thead th:first-child { position: sticky; left: 0; top: 0; z-index: 7; background: var(--thead-bg); }
.tbl-wrap.tbl-scrollable tbody td:first-child { position: sticky; left: 0; z-index: 4; background: var(--surface); border-right: 1px solid var(--border); }
/* Die frueher noetige Sonderregel fuer die erste Zelle einer eingefaerbten
   tr.good/tr.bad-Zeile ist entfallen: die Zeilen haben seit dem 03.09.2026
   keine Flaeche mehr, die generische sticky-Regel darueber deckt sie ab. */

/* Zeilen-Hover — deutlich, aber ruhig; farbige Zeilen (good/bad/tot) bleiben
   unangetastet, die sind schon eingefaerbt. */
.tbl-wrap tbody tr:not(.good):not(.bad):not(.tot) { transition: background-color 120ms var(--ease); }
.tbl-wrap tbody tr:not(.good):not(.bad):not(.tot):hover td { background: var(--hover); }

/* Klick-sortierbare Spaltenkoepfe (progressive enhancement, app.js). Der
   Button sieht wie normaler Kopftext aus — nur Cursor/Hover/Pfeil verraten
   die Funktion, kein Buntglas-Button in der ansonsten strengen Kopfzeile. */
/* Sortierknopf im Tabellenkopf.
   Das Paar padding/margin (02.09.2026) ist kein Abstand, sondern TREFFFLAECHE:
   ohne es war der Knopf genau so hoch wie seine Zeile — gemessen 14 px auf
   390 px und damit unter den 24 px, die WCAG 2.2 AA (2.5.8) fuer ein
   Bedienelement verlangt. 5 px Polsterung oben und unten machen 24 px daraus;
   der gleich grosse negative Aussenabstand nimmt dem Layout die Aenderung
   wieder ab, die Kopfzeile bleibt also exakt so hoch wie vorher. 5 und nicht
   10, damit die Flaeche auch bei der dichten Darstellung
   ([data-density="kompakt"], 6 px Zellpolsterung) innerhalb der Zelle bleibt
   und der ersten Datenzeile keine Klicks wegnimmt.
   Nachzumessen mit scripts/touchziel-sonde.js. */
.th-sort-btn {
  display: inline-flex; align-items: center; gap: 0; width: 100%; background: none; border: 0;
  padding: 5px 0; margin: -5px 0; font: inherit; color: inherit; text-align: inherit; cursor: pointer;
}
th.num .th-sort-btn { justify-content: flex-end; }
.th-sort-btn:hover { color: var(--link); }
.th-sort-btn:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
.th-sort-arrow {
  display: inline-block; width: 0; height: 0; margin-left: 6px; flex-shrink: 0;
  border-left: 4px solid transparent; border-right: 4px solid transparent; border-bottom: 5px solid currentColor;
  opacity: .3; transition: opacity 140ms var(--ease), transform 140ms var(--ease);
}
.th-sort-btn:hover .th-sort-arrow { opacity: .6; }
th[aria-sort="ascending"] .th-sort-arrow { opacity: .95; }
th[aria-sort="descending"] .th-sort-arrow { opacity: .95; transform: rotate(180deg); }

/* Dichte-Umschalter: komfortabel (Standard) / kompakt — global, persistiert.
   DIE REGELN STEHEN IN sr-bausteine.css, nicht mehr hier. Die drei Regeln,
   die an dieser Stelle standen, hatten dieselbe Spezifitaet wie ihre
   Gegenstuecke dort, und sr-bausteine.css laedt spaeter im Buendel
   (app/lib/assets.js: theme, app, sr, sr-bausteine) — sie haben also nie
   gewirkt. Entfernt am 04.09.2026, als Punkt 3 der Betreiber-Liste die
   Dichtestufen deutlicher machen sollte: zwei Orte fuer dieselbe Sache,
   von denen einer stumm verliert, waeren die naechste Fehlersuche. */

/* --- 4) Bewegung/Feedback (zweckgebunden) -------------------------------- */
@keyframes seo-eintritt { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
.content .section { animation: seo-eintritt 460ms var(--ease) both; }
.content .section:nth-of-type(1) { animation-delay: 0ms; }
.content .section:nth-of-type(2) { animation-delay: 65ms; }
.content .section:nth-of-type(3) { animation-delay: 130ms; }
.content .section:nth-of-type(4) { animation-delay: 195ms; }
.content .section:nth-of-type(n+5) { animation-delay: 195ms; }

@keyframes seo-banner-ein { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } }
.sb-banner { animation: seo-banner-ein 340ms var(--ease) both; }

.card { transition: box-shadow 180ms var(--ease); }
.card:hover { box-shadow: var(--edge), var(--e2); }
.projekt-karte, .cluster-gruppe { transition: box-shadow 180ms var(--ease); }
.projekt-karte:hover, .cluster-gruppe:hover { box-shadow: var(--edge), var(--e2); }

/* Generischer Fokus-Ring als Sicherheitsnetz — greift nur dort, wo kein
   spezifischerer :focus-visible der Vorlage schon zustaendig ist (Kaskade
   nach Spezifitaet, keine Ueberschneidung mit bestehenden Regeln). */
a:focus-visible, button:focus-visible, input:focus-visible, summary:focus-visible {
  outline: 2px solid var(--focus-ton); outline-offset: 2px;
}
/* details.explain hat overflow:hidden — ein nach AUSSEN versetzter Fokusring
   wird an der Oberkante und an beiden Seiten weggeschnitten. Der Ausklapper
   ist erstes Kind, also genau der Fall. Nach innen legen. */
details.explain > summary:focus-visible { outline-offset: -2px; }

/* --- 5) Uebersicht: Projektkarten zweispaltig auf breitem Content ---------
   Nachbesserung aus dem Design-Gate (30.07.2026): Auf breiten Displays
   stapelten sich die Projektkarten der Uebersicht (Sektion 02) weiterhin
   einspaltig und liessen rechts Platz liegen. Ab effektiv ~1750px
   Content-Breite laufen sie jetzt zweispaltig.

   CONTAINER QUERY statt Media-Query, bewusst: der Breiten-Regler
   (--inhalt-breite, 70–100 %) aendert die Breite von .content unabhaengig
   vom Viewport. Eine Media-Query auf den Viewport waere bei z.B. 2560px
   IMMER zweispaltig, selbst wenn der Regler auf 70 % steht und .content
   dadurch schmaler ist als der Bildschirm — die Container-Query fragt
   stattdessen die tatsaechliche Breite von .content ab und reagiert live
   auf den Regler (inkl. dessen 260ms-Breiten-Transition).

   Kollisionscheck: .sidebar ist sticky, haengt aber an sich selbst, nicht an
   .content — unberuehrt. Der Scroll-Spy (app.js, IntersectionObserver auf
   .section) beobachtet Sichtbarkeit im Viewport, nicht die Breite von
   .content — unberuehrt. container-type:inline-size macht .content zur
   Containing-Block fuer absolut positionierte Nachfahren, aber es gibt
   keine: Mega-Panel und Benutzer-Menue haengen am <header>, ausserhalb von
   .content. */
.content { container-type: inline-size; container-name: inhalt; }

@container inhalt (min-width: 1750px) {
  /* #projekte als gemeinsames Grid fuer Cluster-Gruppen UND freie
     Projektkarten: Section-Head und jede Cluster-Gruppe spannen beide
     Spalten (grid-column:1/-1) und erzwingen so einen Zeilenumbruch — freie
     Projektkarten dazwischen fallen automatisch ins Zwei-Spalten-Raster.
     Kein Eingriff in uebersicht.js noetig: Cluster-Gruppen und freie Karten
     sind dort bereits direkte Geschwister im selben Abschnitt. Gleiche
     Zeilenhoehe je Reihe ist der CSS-Grid-Standard (align-items:stretch),
     hier bewusst nicht ueberschrieben. */
  #projekte {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 22px; /* deckt sich mit dem bisherigen Kartenabstand (.projekt-karte + .projekt-karte) */
  }
  /* Der Kapitelkopf MUSS beide Spalten spannen. Ohne das setzt ihn die
     Grid-Autoplatzierung in die erste Zelle und die erste Projektkarte
     rutscht daneben — der Text darueber behauptete das Verhalten, die Regel
     fehlte. Der frueher hier kompensierte 32px-Einzug ist ebenfalls weg:
     theme.css setzt .section > :not(.section-head) auf margin-left:0, es
     gibt also nichts mehr auszugleichen. */
  #projekte > .section-head { grid-column: 1 / -1; margin-bottom: 0; }
  #projekte > .cluster-gruppe { grid-column: 1 / -1; margin: 0; min-width: 0; }
  #projekte > .projekt-karte { margin: 0; min-width: 0; }

  /* Innerhalb einer Cluster-Gruppe genauso: Kopf und Unterzeile bleiben
     volle Breite, die Mitglieder-Karten fuellen die zwei Spalten.
     minmax(0,1fr) statt nacktem 1fr in BEIDEN Grids ist hier kein
     Stil-Detail, sondern noetig: ein nacktes 1fr traegt weiterhin eine
     automatische Mindestbreite in Hoehe des Inhalts (auto), unabhaengig vom
     min-width:0 auf den Kindern — zwei ungleich "schwere" Karten in einer
     Reihe haben dann trotzdem ungleich breite Spalten (beobachtet: 2214px
     zu 50px statt 1132px/1132px). minmax(0,1fr) nullt die Spalten-Mindestbreite
     selbst und macht die zwei Spalten wieder verlaesslich gleich breit. */
  .cluster-gruppe {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 22px;
    padding-bottom: 22px; /* Reihenabstand auch am unteren Rand der Gruppe, statt der schmalen Standard-Kartenpolsterung */
  }
  .cluster-gruppe > .cluster-kopf,
  .cluster-gruppe > .cluster-sub { grid-column: 1 / -1; }
  .cluster-gruppe > .projekt-karte { margin: 0; min-width: 0; }

  /* Schritt-Tabelle darf die volle (jetzt schmalere) Kartenbreite nutzen:
     Grid-Items sind per Default min-width:auto = Mindestbreite ihres
     Inhalts — ohne diese Zeile wuerde die Tabelle die Karte auf ihre
     Inhalts-Mindestbreite aufblaehen, statt sich der halben Spaltenbreite
     anzupassen (bekannte CSS-Grid-Falle). */
  .projekt-karte .tbl-wrap { min-width: 0; }
}

/* ========================================================================
   6) EBENE 2 — KAPITEL IM SEITENMENUE (Drei-Ebenen-Umbau, 01.08.2026)

   Die Kapitel der aktuellen Seite stehen jetzt eingerueckt UNTER dem aktiven
   Eintrag der Seitenleiste (seit R3 layout.js srKapitelListe(), vorher
   kapitelSubnavHtml() — gleiche Klassen) statt in einer
   eigenen oberen Leiste — die ist seither Ebene 3, siehe naechster
   Abschnitt. Baut auf .nav-sub/.nav-item der Haus-Vorlage auf (theme.css,
   dort unveraendert vorhanden, seit dem Navigations-Umbau 30.07.2026 aber
   ungenutzt — die Akkordeon-Mechanik dafuer wurde in theme.js entfernt,
   siehe layout.js Kopfkommentar). Hier wieder aktiviert, diesmal immer
   "open": das aktive Kapitel steht serverseitig fest, es gibt keinen
   Auf-/Zuklapp-Schalter mehr — nur noch eine sanfte Eintritts-Animation beim
   Seitenaufbau (hinter prefers-reduced-motion, siehe dort).
   ======================================================================== */

.nav-sub--kapitel { display: flex; }
/* .nav-item traegt aus der Vorlage bereits einen 3px border-left:transparent
   (Reserve fuer genau diesen Fall) — hier nur eingefaerbt, kein zusaetzliches
   Element, kein Layout-Sprung. */
.nav-item--kapitel[aria-current] { color: var(--accent); background: var(--hover); font-weight: 700; border-left-color: var(--accent); }
.nav-item--kapitel[aria-current] .n { color: var(--accent); }

@keyframes seo-navsub-auf { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }
.nav-sub--kapitel.open { animation: seo-navsub-auf 320ms var(--ease) both; }

/* ========================================================================
   7) EBENE 3 — UNTERKAPITEL-LEISTE (Drei-Ebenen-Umbau, 01.08.2026)

   Die durch Ebene 2 frei gewordene sticky Leiste unter dem Header zeigt
   jetzt die UNTERABSCHNITTE des jeweils aktiven Kapitels statt der Kapitel
   selbst — ein .unterkapitel-band je Kapitel mit mindestens zwei
   Unterkapiteln (layout.js unterkapitelZoneHtml()), app.js blendet je nach
   aktivem Kapitel genau eines davon ein und faehrt Scroll-Spy darueber
   (der zuletzt passierte Unterabschnitt gilt als aktiv). Kein Panel-Wechsel
   hier — anders als bei Ebene 2 bleiben alle Unterabschnitte eines Kapitels
   die ganze Zeit sichtbar, nur die Leiste selbst folgt der Scroll-Position.
   Bewusst schmaler/leiser als Ebene 1/2 (kleinere Schrift, duennerer
   Indikator, keine Nummern-Pille) — sie ist die dritte, unterste Ebene.
   ======================================================================== */


.content-col { min-width: 0; }

/* ========================================================================
   C1 — KEIN DURCHGEHENDER KOPFBALKEN AUF DEM SCHREIBTISCH (30.08.2026)

   Die Leit-Screens haben keinen Kopfbalken: die Seitenleiste laeuft von ganz
   oben bis ganz unten, rechts daneben steht die Inhaltsspalte mit ihrer
   eigenen Topbar. Die Marke und die Werkzeuge (Projektwaehler, Benutzer,
   Zahnrad) sind mit C3 in die Seitenleiste gezogen, die Suche in die Topbar —
   der Balken war danach leer.

   Der Umbau laeuft ueber EINEN Wert: --header-h auf 0. Die Hoehe ist in der
   Haus-Vorlage an sechs Stellen Rechengrundlage (body-padding, sidebar-top,
   sidebar-height, scroll-padding, sticky Unterkapitel-Leiste, Hoehe des
   Verwaltungsblocks). Alle sechs Formeln stimmen mit 0 von selbst weiter —
   sie einzeln zu ueberschreiben waere sechs Gelegenheiten, eine zu vergessen.

   NUR auf dem Schreibtisch: unter 900 px ist die Seitenleiste eine Schublade,
   und die braucht den Balken als Griff (Burger) und als Ort der Marke. Dort
   setzt die Haus-Vorlage --header-h selbst auf 60px, und diese Regel greift
   nicht hinein.
   ======================================================================== */
@media (min-width: 901px) {
  :root { --header-h: 0px; }
  .header { display: none; }
}

/* Marke am Kopf der Seitenleiste (C3) — auf dem Schreibtisch der Ersatz fuer
   den Kopfbalken. Mobil bleibt sie weg: dort traegt der Balken die Marke, und
   zweimal dasselbe in einer 330-px-Schublade waere Platzverschwendung. */
.sidebar-marke { display: none; }
@media (min-width: 901px) {
  .sidebar-marke {
    display: flex; align-items: center; gap: 11px;
    padding: 18px 20px 14px; min-width: 0;
  }
  .sidebar-marke-logo { display: inline-flex; flex-shrink: 0; width: 30px; height: 30px; }
  .sidebar-marke-logo svg { width: 100%; height: 100%; }
  .sidebar-marke-text { min-width: 0; display: flex; flex-direction: column; }
  .sidebar-marke-titel { font-size: var(--fs-h2); font-weight: 800; letter-spacing: .5px; line-height: 1.2; }
  .sidebar-marke-titel a { color: var(--text); text-decoration: none; }
  .sidebar-marke-titel a:hover { color: var(--accent); }
  /* Umbruch statt Auslassungspunkte: die Produktzeile passt in 266 px nicht
     in eine Zeile, und ein abgeschnittenes "Visibilit…" sagt weniger als
     zwei volle Zeilen. */
  .sidebar-marke-sub {
    font-size: var(--fs-label); color: var(--text-3); line-height: 1.3; margin-top: 2px;
  }
}

/* ========================================================================
   MARKE UND PROJEKTWAHL IN DER NAVIGATIONSSPALTE (Betreiber-Auftrag
   12.09.2026). Die Regeln stehen hier und nicht bei .sr-nav-marke in
   sr.css, weil sie eine LAGE gegen die Kopfzeile beschreiben, nicht das
   Aussehen der Marke.

   WARUM :root DAVOR. app.css laeuft im Buendel VOR sr.css und
   sidebar-rail.css (app/lib/assets.js, Reihenfolge ist Teil des Vertrags).
   Beide setzen .sr-nav-marke mit einer Klasse (0,1,0) und gewaennen bei
   gleicher Spezifitaet, weil sie spaeter kommen. Der :root-Vorsatz hebt
   diese Regeln hier eine Stufe an; die eingeklappte Spalte braucht eine
   weitere Stufe, weil sidebar-rail.css sie mit [data-sidebar] anspricht.

   WOHER DIE HOEHE KOMMT. Die Marke steht auf derselben Hoehe wie die
   Ueberschrift im Seitenkopf. Der Kopf hat oben var(--s4) Polster, darunter
   eine Bedienzeile von 32 px (Knopfhoehe 30 px plus Rahmen) — die Mitte der
   Ueberschrift liegt also var(--s4) + 16 px unter der Oberkante. Eine Marke,
   die von 0 an genau doppelt so hoch ist und ihren Inhalt mittig traegt, hat
   ihre Mitte an derselben Stelle.
   Beleg: scripts/proben/kopfzeile-darstellung.js, Mitte gegen Mitte,
   Toleranz 2 px, in normaler und randloser Breite. */
:root { --sr-marke-h: calc(2 * (var(--s4) + 16px)); }
:root .sr-nav-marke { height: var(--sr-marke-h); min-height: var(--sr-marke-h); padding-top: 0; padding-bottom: 0; }
:root[data-sidebar="collapsed"] .sr-nav-marke { height: var(--sr-marke-h); min-height: var(--sr-marke-h); padding-top: 0; padding-bottom: 0; align-items: center; }
/* 30 px Luft zwischen Marke und Projektwahl (Betreiber-Mass). Vorher standen
   beide auf Stoss: die Unterkante der Marke war die Oberkante der Karte. */
:root .sr-nav-kopf { padding-top: 30px; }

/* Projektwaehler unter der Marke (C3) — im Kopfbalken war er ein Knopf neben
   anderen, in der Seitenleiste ist er die erste Entscheidung der Seite. */
.sidebar > .mega-wrap { padding: 0 20px 12px; }
.sidebar > .mega-wrap .mega-btn { width: 100%; justify-content: space-between; }
/* Die Beschriftung faellt ab 1680 px weg — das war eine Platzregel des
   Kopfbalkens, wo der Knopf mit Suchfeld und Benutzer-Menue um eine Zeile
   konkurrierte. In der Seitenleiste hat er die volle Breite fuer sich; ohne
   Wort blieb ein Kachelsymbol ohne Bedeutung stehen. */
.sidebar > .mega-wrap .mega-btn-label { display: inline; }
/* Das Panel ist breiter als der 266-px-Streifen — es tritt aus der
   Seitenleiste heraus statt sich hineinzuquetschen (die Karten darin brauchen
   mindestens 640 px, sonst wird aus dem Waehler eine Liste von Umbruechen). */
.sidebar > .mega-wrap .mega-panel { left: 0; min-width: min(640px, calc(100vw - 40px)); }

/* Die .topbar*-Regeln (C2, 30.08.2026) sind am 08.09.2026 mit ihrem einzigen
   Erzeuger layout.js topbarHtml() entfallen. Die Seiten-Identitaet traegt
   heute srKopfHtml() als .sr-kopf; das Datenfeld `o.topbar` gibt es weiter.

   HIER GERETTET, weil sie an dieser Regel gebraucht wird: die alte Topbar war
   BEWUSST NICHT STICKY. Unter dem fixierten Kopfbalken klebt bereits die
   Unterkapitel-Leiste (top:var(--header-h)). Eine zweite klebende Leiste
   muesste deren Versatz kennen, und der haengt an der Hoehe der ersten, die
   je nach Subline umbricht — eine Rechnung mit einer Unbekannten. Wer hier je
   eine weitere sticky Ebene daruebersetzt, steht vor genau dieser Rechnung. */
.unterkapitel-leiste {
  position: sticky; top: var(--header-h); z-index: 40;
  background: var(--bg); border-bottom: 1px solid var(--border);
  overflow-x: auto; scrollbar-width: none;
}
.unterkapitel-leiste::-webkit-scrollbar { display: none; }
.unterkapitel-leiste[hidden] { display: none; }
.unterkapitel-band {
  position: relative; display: flex; align-items: stretch;
  min-width: max-content; padding: 0 var(--s6);
}
.unterkapitel-band[hidden] { display: none; }
.unterkapitel-tab {
  display: inline-flex; align-items: center; gap: var(--s1); padding: var(--s2) var(--s3) var(--s2);
  color: var(--text-3); text-decoration: none; font-size: var(--fs-small); font-weight: 600;
  white-space: nowrap; transition: color 160ms var(--ease);
}
.unterkapitel-tab:hover { color: var(--text-2); text-decoration: none; }
.unterkapitel-tab-num { font-family: var(--font-num); font-size: var(--fs-label); font-weight: 800; letter-spacing: .2px; }
.unterkapitel-tab[aria-current] { color: var(--text); }
.unterkapitel-tab[aria-current] .unterkapitel-tab-num { color: var(--accent); }
.unterkapitel-tab:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: -3px; border-radius: var(--sr-r-xs); }
/* Zaehler am Reiter (AP5 Stufe 3, layout.js tabZahlHtml()): sagt VOR dem
   Klick, wie viel dahinter liegt. Bewusst als stille Pille hinter dem Titel —
   der Reitername bleibt die Ueberschrift, die Zahl ist Beiwerk und darf ihn
   nicht ueberstimmen. Nur gesetzt, wo die Ansicht die Zahl wirklich hat. */
.unterkapitel-tab-zahl {
  font-family: var(--font-num); font-size: var(--fs-label); font-weight: 700;
  font-variant-numeric: tabular-nums; line-height: 1;
  padding: var(--s0) var(--s1); border-radius: var(--rpill);
  background: var(--surface-2); color: var(--text-3);
  transition: background 160ms var(--ease), color 160ms var(--ease);
}
.unterkapitel-tab[aria-current] .unterkapitel-tab-zahl { background: var(--accent-soft); color: var(--text-2); }

.unterkapitel-indikator {
  position: absolute; left: 0; bottom: 0; height: 2px; width: 0;
  background: var(--accent); border-radius: var(--sr-r-xs) var(--sr-r-xs) 0 0; pointer-events: none;
  transition: transform 220ms var(--spring), width 220ms var(--ease);
}
.unterkapitel-indikator--springt { transition: none; }

/* Panel-Wechsel: .kapitel-modus (von app.js auf .content gesetzt, sobald die
   Tabs aktiv sind) schaltet die alte, fuers Kapitel-Scrollen gedachte
   Eintritts-Animation (Baustein 4 oben) ab — sie wuerde sonst bei jedem
   Sichtbarwerden eines Panels erneut ueber den gerichteten Wechsel hier
   laufen (Animationen starten neu, sobald ein Element von display:none
   wieder angezeigt wird). */
.content.kapitel-modus .section { animation: none; }

/* [hidden] MUSS auf dem Bildschirm gewinnen — sonst kann eine spezifischere
   Regel ein eigentlich verstecktes Panel trotzdem sichtbar rendern. Real
   beobachtet (Playwright-Testlauf): die Uebersicht-Grid-Regel weiter unten
   (#projekte{display:grid}, Baustein 5) hat als ID-Selektor hoehere
   Spezifitaet als die native [hidden]-UA-Regel und gewann dagegen — die
   "Projekte"-Sektion blieb trotz hidden=true sichtbar. !important ist hier
   bewusst und zielgerichtet: ein verstecktes Kapitel-Panel ist ein
   funktionaler Zustand, kein Stil-Detail, der von einer spezifischeren Regel
   unterlaufen werden darf.
   Bewusst NUR fuer Bildschirm: die Regel ganz unten unter @media print hebt
   [hidden] fuers Drucken wieder auf (alle Kapitel sichtbar) — mit derselben
   !important-Prioritaet wuerden sich beide Regeln nach Spezifitaet und nicht
   nach Bildschirm/Druck entscheiden, und diese hier haette dort das
   staerkere Gewicht. Ausserhalb von @media print gibt es diese Konkurrenz
   nicht, das Drucken soll das Tab-Konzept schlicht nicht kennen. */
@media screen {
  .content.kapitel-modus .section[hidden] { display: none !important; }

  /* Der Kapitelkopf BLEIBT im Tab-Betrieb stehen (Aenderung 30.08.2026).
     Er war ausgeblendet, solange er ein schwarzer, ueber die volle Breite
     laufender Balken war und damit neben der Kapitel-Leiste doppelt wirkte.
     Seit dem Design-Umbau ist er eine schlanke Zeile aus Nummern-Chip und
     Titel — und er ist die EINZIGE Stelle, an der im Inhaltsbereich steht,
     welches Kapitel man gerade liest: die Leiste darueber fuehrt die
     UNTERkapitel (3.1, 3.2 …), nicht den Kapiteltitel, und sie existiert
     ueberhaupt nur bei Kapiteln mit mindestens zwei Unterkapiteln.
     Die frueher noetigen Ausgleichsregeln (padding-top am Panel,
     margin-top:0 an der ersten Zwischenueberschrift) entfallen damit — den
     Abstand bringt wieder der Kopf selbst. */
  .content.kapitel-modus .section-head { margin-top: 0; }
}

@keyframes seo-kapitel-enter-r { from { opacity: 0; transform: translateX(22px); } to { opacity: 1; transform: translateX(0); } }
@keyframes seo-kapitel-enter-l { from { opacity: 0; transform: translateX(-22px); } to { opacity: 1; transform: translateX(0); } }
@keyframes seo-kapitel-exit-r  { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(18px); } }
@keyframes seo-kapitel-exit-l  { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(-18px); } }
/* Hoehere Spezifitaet als die Abschalt-Regel oben (4 Klassen statt 3) —
   sonst gewinnt "animation:none" und der Wechsel haengt fest, weil das
   erwartete animationend-Ereignis nie feuert (real beobachtet, per
   Playwright-Testlauf gefunden und hier gezielt korrigiert). */
.content.kapitel-modus .section.kapitel-enter-rechts { animation: seo-kapitel-enter-r 240ms var(--ease) both; }
.content.kapitel-modus .section.kapitel-enter-links  { animation: seo-kapitel-enter-l 240ms var(--ease) both; }
.content.kapitel-modus .section.kapitel-exit-rechts  { animation: seo-kapitel-exit-r 150ms var(--ease-in) both; }
.content.kapitel-modus .section.kapitel-exit-links   { animation: seo-kapitel-exit-l 150ms var(--ease-in) both; }

/* Tabellenzeilen kurz gestaffelt einblenden — nur beim Kapitel-Wechsel (die
   enter-Klassen sitzen ausschliesslich waehrend dessen auf der Sektion),
   nicht bei jedem Scrollen. Ab Zeile 16 ohne weitere Verzoegerung, sonst
   waere eine grosse Tabelle nach vielen hundert Millisekunden immer noch am
   Einblenden. */
@keyframes seo-zeile-ein { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } }
.section.kapitel-enter-rechts .tbl-wrap tbody tr,
.section.kapitel-enter-links  .tbl-wrap tbody tr { animation: seo-zeile-ein 260ms var(--ease) both; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(1),  .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(1)  { animation-delay: 0ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(2),  .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(2)  { animation-delay: 16ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(3),  .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(3)  { animation-delay: 32ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(4),  .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(4)  { animation-delay: 48ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(5),  .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(5)  { animation-delay: 64ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(6),  .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(6)  { animation-delay: 80ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(7),  .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(7)  { animation-delay: 96ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(8),  .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(8)  { animation-delay: 112ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(9),  .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(9)  { animation-delay: 128ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(10), .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(10) { animation-delay: 144ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(11), .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(11) { animation-delay: 160ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(12), .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(12) { animation-delay: 176ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(13), .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(13) { animation-delay: 192ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(14), .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(14) { animation-delay: 208ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(15), .section.kapitel-enter-links .tbl-wrap tbody tr:nth-child(15) { animation-delay: 224ms; }
.section.kapitel-enter-rechts .tbl-wrap tbody tr:nth-child(n+16),
.section.kapitel-enter-links  .tbl-wrap tbody tr:nth-child(n+16) { animation-delay: 0ms; }

/* Kennzahl-Zahlen: feste Ziffernbreite, damit das Hochzaehlen (app.js) nicht
   ruckelt (number-tabular). */
.card .cv, .score { font-variant-numeric: tabular-nums; }

/* Ampel Rot: dezenter Puls als Alarmsignal — Gruen/Gelb bleiben ruhig, Rot
   ist der einzige Zustand, der aktiv Aufmerksamkeit verlangt. */
@keyframes seo-ampel-puls {
  0%, 100% { box-shadow: 0 0 0 3px var(--surface-2); }
  50% { box-shadow: 0 0 0 3px var(--surface-2), 0 0 9px 2px var(--red); }
}
.ampel--rot::before { animation: seo-ampel-puls 1.8s ease-in-out infinite; }

/* Hover-Glow auf anklickbaren Chips (z.B. der CSV-Export-Tag). */
a.tag:hover { box-shadow: 0 0 0 3px var(--blue-dim); text-decoration: none; }

/* Mega-Menue-Karten: gestaffelter Einflug beim Oeffnen (dasselbe Restart-bei-
   [hidden]-Prinzip wie beim Panel oben, hier fuer .mega-panel bereits
   etabliert — siehe Baustein 2 weiter oben).
   BEWEGUNG SEIT 12.09.2026 AUS DEM AUFTRITT (Block am Dateiende): die eigenen
   Keyframes `seo-karte-ein` sind entfallen, weil sie dieselbe Aussage in einer
   zweiten Kurve erzaehlten. Die Staffelung darunter bleibt — sie steht NACH
   dieser Kurzschreibweise und setzt nur die Verzoegerung. */
.mega-panel:not([hidden]) .mega-karte { animation: sr-auftritt-ein 260ms var(--sr-auf-ease) both; }
.mega-panel:not([hidden]) .mega-karte:nth-child(1) { animation-delay: 20ms; }
.mega-panel:not([hidden]) .mega-karte:nth-child(2) { animation-delay: 40ms; }
.mega-panel:not([hidden]) .mega-karte:nth-child(3) { animation-delay: 60ms; }
.mega-panel:not([hidden]) .mega-karte:nth-child(4) { animation-delay: 80ms; }
.mega-panel:not([hidden]) .mega-karte:nth-child(5) { animation-delay: 100ms; }
.mega-panel:not([hidden]) .mega-karte:nth-child(n+6) { animation-delay: 120ms; }

@media (max-width: 900px) {
  .unterkapitel-band { padding: 0 var(--s3); }
  .unterkapitel-tab { padding: var(--s2) var(--s2) var(--s2); font-size: var(--fs-small); }
}

/* --- Bewegungsarme Darstellung ----------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  .zentriert-marke .radar-kegel, .zentriert-marke .radar-blip { animation: none; }
  .usermenu-item, .feld-eingabe, .knopf { transition: none; }
  .content, .breite-slider::-webkit-slider-thumb, .breite-slider::-moz-range-thumb,
  .mega-btn-chev, .mega-karte, .th-sort-arrow, .card, .projekt-karte, .cluster-gruppe,
  .tbl-wrap tbody tr { transition: none; }
  .content .section, .sb-banner, .mega-panel:not([hidden]) { animation: none; }
  .unterkapitel-tab, .unterkapitel-tab-num, .unterkapitel-tab-zahl, .unterkapitel-indikator { transition: none; }
  .nav-item--kapitel { transition: none; }
  .nav-sub--kapitel.open { animation: none; }
  .nav-verwaltung.open .nav-verwaltung-liste { animation: none; }
  .nav-verwaltung-kopf, .nav-verwaltung-chev { transition: none; }
  .anb-puls::after, .anb-konsole--laeuft .anb-konsole-strom::after,
  .anb-konsole-status--laeuft { animation: none; }
  .anb-konsole, .anb-zeile { animation: none; }
  .anb-btn { transition: none; }
  .anb-konsole-aus { transition: none; }
  .section.kapitel-enter-rechts, .section.kapitel-enter-links,
  .section.kapitel-exit-rechts, .section.kapitel-exit-links,
  .ampel--rot::before { animation: none !important; }
}

/* --- Mittelbreite Desktops -----------------------------------------------
   Kopfzeile mit Marke + Mega-Menue + Ansicht-Werkzeugen + Benutzer-Menue ist
   auf voller Breite (2560 px) bequem Platz — auf 1440–1680 px wird es eng,
   weil Flex-Kinder standardmaessig nicht unter ihre Inhalts-Mindestbreite
   schrumpfen (min-width:auto) und die Kopfzeile sonst waagerecht ueberlaeuft.
   Deshalb hier zuerst Sekundaertext weglassen, bevor irgendetwas umbricht. */
@media (max-width: 1680px) {
  .mega-btn-label { display: none; }
  .mega-btn { padding: 0 12px; }
}
/* Der Sekundaertext des alten Kopfbalkens (.header-sub) wich hier ab 1200 px;
   die Regel ist am 08.09.2026 mit dem Kopfbalken entfallen. */
/* --- Kosten-Seite (/kosten, nur Rolle admin) ----------------------------
 * "Steuerzentrale" je Projekt: derselbe schlichte Kartenrahmen (Schatten,
 * Radius, Innenpolster) wie an anderen Karten dieses Musters, nur die
 * Formularzeile und die kompakten Inline-Formulare (Schalter, Budget,
 * Kontingent, je-Keyword-Umschalter in der Tabellenzelle) sind eigen. */
.kosten-projekt-block { box-shadow: var(--edge), var(--e1); border-radius: var(--rlg); padding: 16px 18px; background: var(--surface); margin: 0 0 16px; }
.kosten-projekt-kopf { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; margin-bottom: 6px; }
.kosten-projekt-kopf h4 { margin: 0; font-size: var(--fs-h2); }
.kosten-steuerzeile { font-size: var(--fs-body); color: var(--text-2); margin: 0 0 14px; }
.kosten-formulare { display: flex; flex-wrap: wrap; gap: 20px 28px; margin-bottom: 4px; }
.kosten-inline-form { display: flex; flex-direction: column; gap: 8px; min-width: 200px; }
.kosten-inline-form .feld-label { white-space: nowrap; }
.kosten-inline-form .feld-eingabe { padding: var(--s1) var(--s2); font-size: var(--fs-body); width: 160px; }
.kosten-inline-form .knopf { padding: var(--s1) var(--s3); font-size: var(--fs-body); align-self: flex-start; }
.kosten-inline-form--knapp { gap: 0; min-width: 0; }
.knopf--klein { padding: var(--s0) var(--s2) !important; font-size: var(--fs-small) !important; margin-top: 0 !important; }
.zeitraum-schalter { display: inline-flex; gap: 2px; margin: 10px 0; padding: 3px; background: var(--surface-2); border-radius: var(--rpill); }
.zeitraum-schalter .tag { cursor: pointer; text-decoration: none; background: transparent; min-height: 28px; padding: 0 var(--s3); }
.zeitraum-schalter .tag:hover { background: var(--hover); }
.zeitraum-schalter .tag-b { background: var(--surface); color: var(--accent); box-shadow: var(--edge), var(--e1); }
/* §5.3: tarifgesperrtes Element (Zeitraum-Option, CSV-/Export-Knopf) —
   sichtbar, aber tot: Schloss + title-Tooltip mit Tarifnennung */
.tag--schloss, .chart-export-btn--schloss { cursor: not-allowed; opacity: .55; }

/* Preismodell-Pakete (Feature 1, 31.07.2026) --------------------------- */
/* Paket-Auswahl braucht mehr Breite als die uebrigen Inline-Felder — die
   Optionstexte fuehren die Paketvorgaben mit (Keywords/Inklusiv/Notbremse),
   damit die Wirkung vor dem Klick sichtbar ist. */
.kosten-paket-form .feld-eingabe { width: 340px; }
/* "Rechnungsbetrag (EUR)" in "Rechnung je Mandant" (Kapitel 02) — die
   hervorgehobene Spalte, tabellarische Ziffern wie bei .card .cv/.score. */
.kosten-betrag { font-weight: 800; font-family: var(--font-num); }

/* --- DashboardMaster-Selektor (Feature 3, Stufe D, 31.07.2026) ---------
 * Kapitel 01 der Projektseite (app/views/projekt.js). Nur Layout-Glue —
 * .card/.info/.tag/.feld/.knopf bleiben die eigentlichen Bausteine, siehe
 * app/views/ui.js. KEIN iframe hier, nur eine Deep-Link-Karte. */
.dbm-karte { margin: 16px 0; }
.dbm-kopf { display: flex; align-items: baseline; gap: 12px; margin-bottom: 8px; }
.dbm-kopf h4 { margin: 0; font-size: var(--fs-h2); }
.dbm-name { margin: 0 0 10px; }
.dbm-erklaerung { font-size: var(--fs-body); color: var(--text-2); margin: 14px 0 10px; }
.dbm-form.kosten-inline-form { flex-direction: row; align-items: flex-end; flex-wrap: wrap; }
.dbm-form .feld-eingabe { width: 320px; }

/* --- DashboardMaster-Fassade (Feature 3, Stufe A, 01.08.2026) -----------
 * Click-to-Load ueber ein ECHTES Formular (kein fetch()/XHR — die CSP hat
 * kein connect-src, siehe Kopfkommentar von app.post('/…/dbm-embed-laden')
 * in app/server.js): VOR dem Klick steht nur .dbm-fassade-platzhalter (Text
 * + Knopf) im Markup, KEIN iframe. Erst die POST-Antwort auf diesen Klick
 * rendert .dbm-fassade-rahmen mit dem echten iframe (app/views/projekt.js,
 * dbmFassadeGeladenHtml(), Auflage 4: Slug nie im GET-HTML). Feste
 * Mindesthoehe statt aspect-ratio, damit auch sehr schmale/breite
 * DashboardMaster-Dashboards nutzbar bleiben. */
.dbm-fassade { margin-top: 4px; }
.dbm-fassade-platzhalter {
  border: 1px dashed var(--border); border-radius: var(--rmd);
  padding: 22px 20px; text-align: center; background: var(--surface-2);
}
.dbm-fassade-kennzeichnung { margin: 0 0 8px; }
.dbm-fassade-text { margin: 0 0 14px; font-size: var(--fs-body); color: var(--text-2); }
.dbm-fassade-rahmen { box-shadow: var(--edge), var(--e1); border-radius: var(--rmd); overflow: hidden; background: var(--surface-2); }
.dbm-fassade-iframe { display: block; width: 100%; height: 70vh; min-height: 480px; max-height: 900px; border: 0; }
.dbm-fassade-btn[disabled] { opacity: .6; cursor: wait; }

/* --- Anbindungen (/anbindungen, nur Rolle admin) ------------------------
 * Die Seite braucht nur eine Sache, die es noch nicht gibt: einen leiseren
 * Ton fuer Text, der Beiwerk zum Status ist (Fehlertext, "noch nie", der
 * Hinweis aus details_json). Tabellenzellen stehen ohnehin auf --text-2;
 * dieses hier geht eine Stufe weiter zurueck, damit die Statusspalte die
 * Aufmerksamkeit behaelt. */
.anb-leise { color: var(--text-3); }
td.anb-dienst { white-space: nowrap; }
/* Die Begruendung steht als Block IN der Statuszelle, nicht in einer eigenen
   Spalte: eine Spalte mit mehrere hundert Zeichen langen Fremd-Fehlertexten
   bekommt bei `table-layout: auto` die halbe Tabelle, der Rest kippt in den
   horizontalen Ueberlauf, und sichtbar bleibt nur die aufgeblaehte
   Zeilenhoehe. Ein Block mit Hoechstbreite umbricht dort, wo er hingehoert. */
.anb-status { max-width: 300px; }
.anb-grund { margin-top: 5px; font-size: var(--fs-small); line-height: 1.35; }

/* --- Verwaltung (Stufe 3): Benutzer / Mandanten / Rechte / Audit --------
 * Formular-Idiom der Kosten-Seite, nur als wiederverwendbare vw-*-Klassen:
 * .vw-form = Anlege-/Filterformulare, .vw-aktion = Inline-Formular in der
 * Tabellenzelle, .vw-aktionen = deren Buendel je Zeile. */
.vw-form { display: flex; flex-wrap: wrap; gap: 14px 22px; align-items: flex-end; margin: 14px 0 6px; max-width: 780px; }
.vw-form .feld { min-width: 210px; flex: 1; }
.vw-form .knopf { align-self: flex-end; margin-bottom: var(--s-2); }
.vw-aktionen { display: flex; flex-wrap: wrap; gap: 6px; }
.vw-aktion { display: inline-flex; align-items: center; gap: 6px; margin: 0; }
.vw-still { color: var(--text-3); }
.feld-eingabe--klein { padding: var(--s0) var(--s1); font-size: var(--fs-small); width: auto; min-width: 120px; }
/* Zustandsknoepfe der Rechtematrix — seit dem 06.09.2026 ohne Ring
   (Vorgabe „niemals Rand"): der Zustand liegt in der Flaeche, Text weiss;
   „aus" ist ein neutraler Knopf in Flaechenfarbe mit gedaempftem Text. */
.knopf--achtung { color: var(--auf-knopf); background: var(--knopf-rot); box-shadow: var(--knopf-rot-schatten); }
.knopf--recht-an { color: var(--auf-knopf); background: var(--sr-ok); box-shadow: 0 1px 2px rgba(59,165,93,.28), 0 4px 12px rgba(59,165,93,.28); min-width: 104px; }
.knopf--recht-an:hover { background: #33944f; }
.knopf--recht-aus { color: var(--text-2); background: var(--surface-2); box-shadow: var(--e1); min-width: 104px; }
.knopf--recht-aus:hover { background: var(--hover); color: var(--text); }

/* --- Projekt-Kontext (Musterkatalog Massnahme 2, 01.09.2026) -------------
 * Vier Freitextfelder untereinander statt nebeneinander: sie tragen Saetze,
 * keine Stichworte, und nebeneinander waeren die Zeilen zu kurz zum Lesen.
 * Deshalb ein eigenes .pk-form und nicht das flex-wrap-Raster von .vw-form. */
.pk-form { display: flex; flex-direction: column; gap: 22px; max-width: 780px; margin: 16px 0 6px; }
.pk-feld { display: flex; flex-direction: column; gap: 7px; }
.pk-feld-kopf { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.pk-feld-titel { font-size: var(--fs-h2); font-weight: 700; color: var(--text); cursor: pointer; }
.pk-feld-erklaerung { margin: 0; font-size: var(--fs-body); line-height: 1.5; color: var(--text-2); max-width: 68ch; }
/* Vollstaendigkeitsmarke: sie soll auffallen, wenn sie "Leer" sagt, und
   zuruecktreten, wenn nicht — sonst wird aus der Marke eine Belohnung. */
.pk-marke { flex: none; font-size: var(--fs-label); font-weight: 700; letter-spacing: .6px; text-transform: uppercase; padding: 2px 8px; border-radius: var(--sr-r-pill); }
.pk-marke--leer { background: var(--amber-dim); color: var(--amber); }
.pk-marke--voll { background: var(--surface-2); color: var(--text-3); }
.pk-abschnitt { padding: 14px 16px; margin: 12px 0; border-radius: var(--rmd); background: var(--surface); box-shadow: var(--edge), var(--e1); }
.pk-abschnitt-werkzeuge { display: inline-flex; align-items: center; gap: 8px; }
.pk-abschnitt-text { margin: 8px 0 0; font-size: var(--fs-body); line-height: 1.6; color: var(--text-2); }
.pk-form-abschnitt { max-width: 780px; }
.pk-feld-breit { flex-basis: 100%; }
/* Zahlenfeld: .vw-form gibt jedem .feld 210 px Mindestbreite und flex:1 —
   fuer eine zweistellige Rangzahl ist das eine ganze Formularzeile. */
.pk-feld-eng { flex: 0 0 auto; min-width: 0; }
.pk-feld-eng .feld-eingabe { width: 96px; min-width: 0; }

/* --- Mobil (App-Huelle) ------------------------------------------------- */
@media (max-width: 900px) {
  .usermenu-drop { min-width: 232px; right: -4px; }
  .anmeldekarte { padding: 26px 20px 24px; }
  .anmelde-titel { font-size: var(--fs-h1); }
  /* Ohne Kopfbalken (AP5 Stufe 3) zaehlt die volle Fensterhoehe. */
  .zentriert { padding: 24px 14px 44px; min-height: 100vh; }
  .body--sr-zentriert .sr-nav-theme--frei { left: 10px; bottom: 10px; }
  .content { width: 100%; max-width: 100%; }
  /* E6 mobil: der Selektor rutscht in die Schublade (.nur-mobil-Gruppen in
     der Sidebar), das Zahnrad bleibt im Kopf sichtbar. */
  .mega-wrap { display: none; }
  .nur-mobil { display: block; }
  .zahnrad-drop { position: fixed; left: 10px; right: 10px; top: calc(var(--header-h) + 8px); min-width: 0; }
  .kosten-paket-form .feld-eingabe { width: 100%; max-width: 100%; }
  .dbm-form.kosten-inline-form { flex-direction: column; align-items: stretch; }
  .dbm-form .feld-eingabe { width: 100%; max-width: 100%; }
  .vw-form .feld { min-width: 100%; }
  .pk-feld-kopf { flex-wrap: wrap; gap: 4px 10px; }
  .vw-aktionen { flex-direction: column; align-items: flex-start; }
  .dbm-fassade-iframe { height: 60vh; min-height: 360px; }
}

@media print {
  .zahnrad, .mega-wrap, .th-sort-arrow { display: none; }
  .tbl-wrap { max-height: none; overflow: visible; border: none; box-shadow: none; }
  .tbl-wrap thead th, .tbl-wrap.tbl-scrollable td:first-child, .tbl-wrap.tbl-scrollable th:first-child { position: static; }
  .content { width: 100%; max-width: 100%; }
  .content .section, .sb-banner { animation: none; }
  /* Die Unterkapitel-Leiste (Ebene 3) ist ein Bildschirm-Konzept — gedruckt
     werden ALLE Kapitel samt ihrer Unterabschnitte im Fliesstext,
     unabhaengig davon, welches Band gerade aktiv war. */
  .unterkapitel-leiste { display: none; }
  .content .section[hidden] { display: block !important; }
  /* .section-head braucht hier KEINE eigene Regel: die Ausblend-Regel oben
     steckt in @media screen und greift beim Drucken ueberhaupt nicht — der
     Balken bleibt also automatisch sichtbar und traegt gedruckt weiterhin
     Nummer + Titel jedes Kapitels. */
}
/* 05.3: Rest-Summe jenseits der je Tag behaltenen Top-Werte (Sammelzeile des Syncs) -- gedaempft, kein Rangwert */
.tag-rest{opacity:.7;font-weight:500}

/* --- Luft zwischen Unterkapiteln und Bloecken (Betreiber-Wunsch 27.08.2026)
   Unterkapitel (h3, z.B. „5.2 Woher die Besucher kommen"): +50px vor jedem
   (theme.css-Basis 46px). Bloecke innerhalb eines Unterkapitels (h4, z.B.
   „Transfer nach Ressourcentyp" in 3.1): +30px zueinander (Basis 26px).
   :where() haelt die Spezifitaet bei 0,0,1 — eine gezielte Ausnahme
   (z.B. `.karte h4 { margin-top: 0 }`) gewinnt weiterhin; im Bestand gibt es
   derzeit keine, seit .platzhalter raus ist. Ein h4 DIREKT nach
   seinem h3 behaelt den alten Abstand: der Zuschlag gilt dem Abstand
   zwischen den Punkten, nicht der ersten Zeile unter der Ueberschrift. */
:where(.content .section) h3 { margin-top: var(--s7); }
/* h4-Zwischenueberschriften (Nachschlag 27.08.2026): nochmal +15px Abstand
   (56 -> 71), Schrift +15% (13 -> 15px), engerer Laufweite, eine Stufe mehr
   Kontrast (--text-2 statt --text-3 — dunkler in Hell, heller in Grau/Dunkel). */
:where(.content .section) h4 { margin-top: var(--s6); font-size: var(--fs-h2); letter-spacing: .7px; color: var(--text-2); }
:where(.content .section) h3 + h4 { margin-top: var(--s4); }

/* --- Dropdowns im SEO-Radar-Design (Betreiber-Wunsch 27.08.2026) ---------
   appearance:none nimmt dem <select> die Browser-Optik; der Pfeil kommt als
   eingebettetes SVG (data:-URI — img-src erlaubt data:). Zwei Pfeilfarben,
   weil CSS-Variablen in background-image-URIs nicht aufgeloest werden:
   grau fuer Hell, aufgehellt fuer Grau/Dunkel. Das color-scheme darunter
   laesst auch die AUFGEKLAPPTE Optionsliste des Browsers (die nicht per
   CSS stylbar ist) im Theme-Schema rendern. */
select.feld-eingabe {
  appearance: none; -webkit-appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5 11 1.5' fill='none' stroke='%236a7180' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 12px center; background-size: 12px 8px;
  padding-right: 36px; cursor: pointer;
}
[data-theme="dark"] select.feld-eingabe, [data-theme="medium"] select.feld-eingabe {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5 11 1.5' fill='none' stroke='%23aab2c0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}
/* background-COLOR: die Kurzform loeschte hier beim Ueberfahren denselben
   Pfeil, den die Regel darueber setzt (Fund 01.09.2026). */
select.feld-eingabe:hover { background-color: var(--hover); }
select.feld-eingabe--klein { padding-right: 30px; background-position: right 9px center; }
select.feld-eingabe option { background: var(--surface); color: var(--text); }

/* Native Bedienelemente (Optionslisten, Scrollbalken, Formular-Chrome) im
   jeweiligen Theme-Schema — Grau ist seit 27.08.2026 ein dunkles Theme. */
[data-theme="light"] { color-scheme: light; }
[data-theme="dark"], [data-theme="medium"] { color-scheme: dark; }

/* --- Chart-Weiche (app/lib/charts.js + app/views/charts.js, 27.08.2026) --
   Das Server-SVG (.chart-fallback) bleibt IM DOM: es ist der Zustand ohne
   JavaScript, der Rettungsanker bei Engine-Fehlern UND die Druckansicht —
   Canvas (ECharts) druckt unzuverlaessig und themenfremd. .chart-live wird
   erst sichtbar, wenn die Engine tatsaechlich gezeichnet hat. */
.chart-dynamisch { margin: 2px 0 16px; }
.chart-dynamisch .chart-live { display: none; width: 100%; }
.chart-dynamisch--live .chart-live { display: block; }
.chart-dynamisch--live .chart-fallback { display: none; }
/* Karten-Look (Runde 8, 28.08.2026): Live-Charts bekommen in allen Themes
   einen eigenen, leicht abgesetzten Grund (--chart-flaeche aus theme.css)
   samt Rahmen und Rundung — die Achsentitel-Zeile sitzt mit im Rahmen. */
.chart-dynamisch--live { background: var(--chart-flaeche, var(--surface-2)); box-shadow: var(--edge), var(--e1); border-radius: var(--sr-r-lg); padding: 12px 14px 8px; }
.chart-achsen { display: flex; justify-content: space-between; gap: 12px; font-size: var(--fs-label); font-weight: 600; letter-spacing: .2px; color: var(--text-3); margin: 0 2px 2px; }
/* Griff zum Ziehen der Hoehe (charts.js griffAnlegen): schmale Leiste unter
   dem Bild mit einer kurzen Linie in der Mitte; Zeiger ns-resize. Waehrend
   des Ziehens keine Textauswahl auf der Seite. */
.chart-griff { height: 14px; margin: 2px 0 -4px; display: flex; align-items: center; justify-content: center; cursor: ns-resize; touch-action: none; border-radius: var(--rsm); }
.chart-griff-linie { width: 44px; height: 4px; border-radius: 2px; background: var(--border); transition: background var(--t-fast) var(--ease), width var(--t-fast) var(--ease); }
.chart-griff:hover .chart-griff-linie, .chart-griff.aktiv .chart-griff-linie, .chart-griff:focus-visible .chart-griff-linie { background: var(--accent); width: 64px; }
.chart-griff:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 0; }
html.chart-griff-zieht, html.chart-griff-zieht * { user-select: none !important; cursor: ns-resize !important; }
@media print { .chart-griff { display: none; } }
.chart-achsen .rechts { margin-left: auto; }
@media print {
  .chart-dynamisch--live .chart-fallback { display: block !important; }
  .chart-dynamisch--live .chart-live { display: none !important; }
  .chart-dynamisch--live { background: none; border: none; box-shadow: none; padding: 0; }
  .chart-achsen { display: none; }
  /* Nur im Druck und nur, wenn Bildschirm und Papier auseinanderlaufen:
     app/views/charts.js druckhinweisSetzen() haengt diese Zeile ueberhaupt
     erst dann ins DOM. Auf dem Bildschirm bleibt sie unsichtbar (Regel
     unter diesem Block) — sie erklaert ein Papier-Problem. */
  .chart-druckhinweis { display: block; margin: 2px 0 0; font-size: var(--fs-label); color: var(--text-3); }
}
.chart-druckhinweis { display: none; }
/* KEINE generische Kind-Regel fuer .chart-live: ECharts haengt seinen
   Tooltip-DIV DIREKT in den init-Container — ein `.chart-live > div
   {width/height:100%}` blaeht genau diesen Tooltip zum seitenfuellenden
   Overlay auf (Betreiber-Screenshot 27.08.2026: riesiges Mouseover-Feld,
   ragte links aus dem Fenster und ueberdeckte selektierbaren Text). Der
   nivo-Wrapper bekommt seine 100%-Masse deshalb per CSSOM in
   app/views/charts.js gesetzt, nicht hier. */

/* --- Darstellungs-Verwaltung (/verwaltung/darstellung) ------------------ */
.vw-mandant-wahl { display: flex; align-items: center; gap: 10px; margin: 0 0 18px; }
.vw-mandant-wahl .feld-label { margin: 0; }
.darstellung-standard { max-width: 420px; margin: 4px 0 10px; }
.darstellung-form .knopf--haupt { margin-top: var(--s3); }

/* --- Chart-Werkzeugleiste (Zeitraum + Export, 27.08.2026 Runde 2) --------
   EINE ZEILE, HOECHSTENS 32 px (Betreiber-Auftrag 12.09.2026). Bis dahin
   stand die Legende als umbrechende Flex-Zeile neben den Schaltern: sechs
   Eintraege — der zusammengelegte Cockpit-Chart hat so viele — legten sich
   auf zwei bis drei Zeilen, und die Werkzeugzeile war hoeher als der Abstand
   zum Chart darunter. Jetzt teilen sich Legende, Tageswahl, Export und
   Zahnrad EINE Zeile; die Legende nimmt den Rest und schiebt ihre Eintraege
   waagerecht, statt umzubrechen. */
.chart-kopf { display: flex; align-items: center; justify-content: flex-end; gap: 12px; margin: 0 0 4px; min-height: 24px; min-width: 0; }
/* DOM-Legende (Runde 8): lebt links von der Zeitraumwahl in der Werkzeug-
   zeile; Eintraege sind Schalter (Serie aus-/einblenden). Farbe der
   Swatches setzt charts.js per CSSOM passend zum Theme. */
.chart-legende { display: flex; align-items: center; gap: 10px; flex: 1 1 auto; min-width: 0; flex-wrap: nowrap;
  justify-content: flex-start; overflow-x: auto; scrollbar-width: none; order: -1; }
.chart-kopf:has(.chart-legende--geteilt) { flex-wrap: wrap; }
.chart-kopf .chart-legende--geteilt { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr);
  flex: 1 0 100%; order: 2; overflow: visible; gap: 12px; }
.chart-leg-gruppe { display: flex; flex-wrap: wrap; align-items: center; gap: 0 10px; min-width: 0; }
.chart-leg-gruppe--rechts { justify-content: flex-end; }
.chart-leg-gruppe .chart-leg-item { min-width: 0; text-align: left; }
.chart-leg-gruppe .chart-leg-farbe { flex: none; }
.chart-legende::-webkit-scrollbar { height: 0; }
/* Die Eintraege behalten ihre Breite (kein Zusammenquetschen auf zwei
   Zeichen) — reicht der Platz nicht, schiebt die Zeile waagerecht. */
.chart-legende > .chart-leg-item { flex: 0 0 auto; }
/* Polsterung 5px statt 2px (02.09.2026): der Legendeneintrag ist ein Knopf —
   er schaltet seine Serie ab — und war mit 19 px Hoehe unter den 24 px aus
   WCAG 2.2 AA (2.5.8). Hier OHNE den negativen Aussenabstand der anderen
   beiden Stellen: .chart-legende ist eine umbrechende Flex-Zeile, und ein
   negativer Aussenabstand liesse umgebrochene Zeilen uebereinanderrutschen.
   Die Legende wird dadurch 6 px hoeher — der Preis ist bewusst gezahlt. */
.chart-leg-item { display: inline-flex; align-items: center; gap: 6px; font: 500 var(--fs-small) var(--font-body); color: var(--text-2); background: transparent; border: 0; padding: 5px 4px; cursor: pointer; border-radius: var(--rsm); }
.chart-leg-item:hover { color: var(--text); }
.chart-leg-item.aus { opacity: .42; }
.chart-leg-item.aus .leg-text { text-decoration: line-through; }
.chart-leg-farbe { width: 14px; height: 4px; border-radius: var(--sr-r-xs); display: inline-block; background: var(--text-3); }
/* Werkzeuge in der Titelzeile (Runde 5, 27.08.2026): die Ueberschrift wird
   zur Flex-Zeile, die Werkzeuge stehen rechtsbuendig auf ihrer Hoehe — der
   Abstand Titel->Chart schrumpft auf Tabellen-Niveau. Schmale Schirme
   duerfen umbrechen. Schrift-Erbschaften der h3/h4 (Uppercase, Sperrung)
   werden fuer die Knoepfe neutralisiert. */
.chart-titelzeile { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 14px; }
.chart-titelzeile .chart-kopf { margin: 0 0 0 auto; min-height: 0; text-transform: none; letter-spacing: normal; font-weight: 400; }
.chart-zeitraum { display: flex; gap: 3px; flex-wrap: nowrap; flex: none; }
.chart-zr-btn {
  font: 600 var(--fs-label) var(--font-body); color: var(--text-2);
  background: var(--surface-2); border: 0; border-radius: var(--rmd);
  padding: 0 12px; height: 30px; min-width: 30px; display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.chart-zr-btn:hover { background: var(--hover); color: var(--text); }
.chart-zr-btn.aktiv { background: var(--accent-soft); color: var(--accent); font-weight: 700; }
/* Hellgrau-Insel im grauen und dunklen Thema (Betreiber: „manche Optionen
   in Hellgrau"): das aktive Zeitraum-Segment traegt die helle Flaeche. */
[data-theme="medium"] .chart-zr-btn.aktiv, [data-theme="dark"] .chart-zr-btn.aktiv,
[data-theme="medium"] .geo-schalter.aktiv, [data-theme="dark"] .geo-schalter.aktiv { background: var(--sr-hell); color: var(--sr-auf-hell); }
.chart-export { position: relative; flex: none; }
.chart-export-btn {
  font: 600 var(--fs-label) var(--font-body); color: var(--text-2);
  background: var(--surface-2); border: 0; border-radius: var(--rmd);
  padding: 0 12px; height: 30px; min-width: 30px; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  cursor: pointer; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.sr-export-icon { display: block; flex: none; }
.chart-export-btn:hover { background: var(--hover); color: var(--text); }
.chart-export-menue {
  position: absolute; right: 0; top: calc(100% + 4px); z-index: 40; min-width: 170px;
  background: var(--surface); border-radius: var(--rmd);
  box-shadow: var(--edge), var(--e2); padding: 5px; display: flex; flex-direction: column;
}
.chart-export-menue[hidden] { display: none; }
.chart-export-eintrag {
  font: 500 var(--fs-body) var(--font-body); color: var(--text); text-align: left;
  background: transparent; border: 0; border-radius: var(--rsm);
  padding: 7px 10px; cursor: pointer;
}
.chart-export-eintrag:hover { background: var(--hover); }
/* Zahnrad im Chart (06.09.2026): Farben (fuenf Paletten) und Darstellung
   (sechs Engines) je Chart, persoenlich am Konto. Gleiche Knopf-Optik wie
   Export; ein Punkt am Icon zeigt, dass eine eigene Wahl aktiv ist. */
.chart-konfig { position: relative; }
.chart-konfig-btn {
  color: var(--text-2); background: var(--surface-2); border: 0; border-radius: var(--rmd);
  width: 30px; height: 30px; display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease), transform var(--t-fast) var(--ease);
}
.chart-konfig-btn:hover { background: var(--hover); color: var(--text); }
.chart-konfig-btn[aria-expanded="true"] { background: var(--accent-soft); color: var(--accent); }
.chart-konfig--eigen .chart-konfig-btn::after {
  content: ''; position: absolute; top: 4px; right: 4px; width: 6px; height: 6px; border-radius: 50%;
  background: var(--accent); box-shadow: 0 0 0 2px var(--surface-2);
}
.chart-konfig-menue {
  position: absolute; right: 0; top: calc(100% + 4px); z-index: 41; min-width: 280px;
  background: var(--surface); border-radius: var(--rmd);
  box-shadow: var(--edge), var(--e2); padding: 6px; display: flex; flex-direction: column; gap: 4px;
  max-height:min(560px,calc(100dvh - 24px));overflow-y:auto;
  animation: chart-menue-auf 140ms var(--ease);
}
.chart-konfig-menue--oben{top:auto;bottom:calc(100% + 4px)}
.chart-konfig-menue[hidden] { display: none; }
@keyframes chart-menue-auf { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
.chart-konfig-gruppe { display: flex; flex-direction: column; }
.chart-konfig-gruppe + .chart-konfig-gruppe { border-top: 1px solid var(--border-l); padding-top: 6px; margin-top: 2px; }
.chart-konfig-titel { font: 700 var(--fs-label) var(--font-body); text-transform: uppercase; letter-spacing: 1.2px; color: var(--text-3); padding: 6px 10px 4px; }
.chart-konfig-eintrag {
  font: 500 var(--fs-body) var(--font-body); color: var(--text); text-align: left;
  background: transparent; border: 0; border-radius: var(--rsm);
  padding: 7px 10px 7px 30px; cursor: pointer; position: relative; display: flex; align-items: center; gap: 10px;
}
.chart-konfig-eintrag{font-size:var(--fs-small);font-weight:400;white-space:nowrap}
.chart-konfig-eintrag:hover { background: var(--hover); }
.chart-konfig-eintrag::before {
  content: ''; position: absolute; left: 10px; top: 50%; width: 12px; height: 12px; margin-top: -6px;
  border-radius: 50%; border: 2px solid var(--rule); box-sizing: border-box; transition: border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
}
.chart-konfig-eintrag[aria-checked="true"] { font-weight: 700; }
.chart-konfig-eintrag[aria-checked="true"]::before { border: 4px solid var(--accent); background: var(--surface); }
.chart-konfig-muster { display: inline-flex; gap: 2px; flex: none; }
.chart-konfig-muster i { display: block; width: 10px; height: 10px; border-radius: 3px; }
/* --- Standorte: Karte + Globus (06.09.2026, app/views/geo.js) ------------ */
.geo-karte { position: relative; height: 480px; background: var(--chart-flaeche, var(--surface-2)); border-radius: 0 0 var(--sr-r-card) var(--sr-r-card); overflow: hidden; }
.geo-karte .geo-hinweis, .geo-globus .geo-hinweis { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; margin: 0; color: var(--text-3); font-size: var(--fs-small); }
.geo-karte--live .geo-hinweis, .geo-globus--live .geo-hinweis { display: none; }
.geo-karte .maplibregl-ctrl-group { background: var(--surface); box-shadow: var(--edge), var(--e1); border-radius: var(--rsm); }
.geo-karte .maplibregl-ctrl-group button { color: var(--text); }
.geo-karte .maplibregl-ctrl-group button + button { border-top-color: var(--border-l); }
.geo-karte .maplibregl-popup-content { background: var(--surface); color: var(--text); box-shadow: var(--e2); border-radius: var(--rsm); font: 500 12px/1.4 var(--font-body); padding: 6px 10px; }
.geo-karte .maplibregl-popup-tip { border-top-color: var(--surface); }
.geo-karte .maplibregl-ctrl-attrib { background: rgba(0,0,0,.35); color: #ddd; font-size: 10px; }
.geo-karte .maplibregl-ctrl-attrib a { color: #eee; }
.geo-karte canvas:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: -2px; }
.geo-globus { position: relative; height: 520px; overflow: hidden; border-radius: 0 0 var(--sr-r-card) var(--sr-r-card);
  background: radial-gradient(ellipse at 50% 60%, rgba(20,60,120,.35), transparent 65%), var(--chart-flaeche, var(--surface-2)); }
.geo-globus canvas { outline: none; }
.geo-globus-tip { font: 500 12px/1.4 var(--font-body); color: #fff; background: rgba(8,12,20,.85); padding: 6px 10px; border-radius: 6px; box-shadow: 0 6px 24px rgba(0,0,0,.4); white-space: nowrap; }
/* Schalter im Kartenkopf: dieselbe Chip-Optik wie die Zeitraumwahl der Charts. */
.geo-werkzeuge { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
.geo-gruppe { display: inline-flex; gap: 3px; padding: 2px; background: var(--surface-2); border-radius: var(--rmd); }
.geo-schalter { font: 600 var(--fs-label) var(--font-body); color: var(--text-2); background: transparent; border: 0; border-radius: var(--rsm);
  padding: 0 10px; height: 26px; cursor: pointer; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.geo-schalter:hover { color: var(--text); background: var(--hover); }
.geo-schalter.aktiv { background: var(--surface); color: var(--accent); font-weight: 700; box-shadow: var(--e1); }
.geo-schalter:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
.geo-tabellen { display: grid; grid-template-columns: 3fr 2fr; gap: var(--s3); margin-top: var(--s3); }
@media (max-width: 900px) { .geo-tabellen { grid-template-columns: 1fr; } .geo-karte { height: 380px; } .geo-globus { height: 380px; } }
@media print { .geo-karte, .geo-globus { display: none; } }

/* Tooltip der Apex-Engine (scripts/apex-bundle/entry.js basisTooltip):
   eigener Aufbau ohne style-Attribute, gestaltet wie der ECharts-Tooltip. */
.sr-apex-tt { padding: 8px 12px; font: 400 12px/1.5 var(--font-body); color: var(--text); min-width: 150px; }
.sr-apex-tt-kopf { color: var(--text-3); margin-bottom: 4px; white-space: nowrap; }
.sr-apex-tt-zeile { display: flex; align-items: center; gap: 8px; white-space: nowrap; margin: 2px 0; }
.sr-apex-tt-marker { flex: none; }
.sr-apex-tt-name { color: var(--text-2); }
.sr-apex-tt-wert { margin-left: auto; padding-left: 18px; font-weight: 700; font-variant-numeric: tabular-nums; }
.apexcharts-tooltip.apexcharts-theme-light, .apexcharts-tooltip.apexcharts-theme-dark { background: var(--surface) !important; border: 1px solid var(--border) !important; box-shadow: var(--e2) !important; color: var(--text) !important; }
.apexcharts-xaxistooltip { display: none !important; }
@media print { .chart-zeitraum, .chart-export, .chart-konfig { display: none; } }
/* UNTER 900 px DARF SIE UMBRECHEN (12.09.2026): die Ein-Zeilen-Regel oben
   gilt fuer breite Schirme. Auf einem Telefon bliebe von der Legende sonst
   ein waagerecht schiebbarer Streifen von wenigen Zeichen — dort ist eine
   zweite Zeile das kleinere Uebel. */
@media (max-width: 899px) {
  .chart-kopf { flex-wrap: wrap; }
  .chart-legende { flex: 1 0 100%; flex-wrap: wrap; overflow-x: visible; justify-content: flex-start; }
}
/* Schmale Schirme (SuperStyler Rang 15, gemessen 06.09.2026 bei 390 px): die
   Werkzeugzeile stand als EINE Flex-Reihe — die Legende wurde auf eine
   schmale Spalte gequetscht (je Chip eine Zeile, 4 Chips = 151 px hoch) und
   die Zeitraum-Knoepfe brachen in „1 / M". Jetzt: Legende als eigene volle
   Zeile darueber, darunter Zeitraum · Export · Zahnrad; Knoepfe brechen
   nicht. */
@media (max-width: 700px) {
  .chart-kopf { flex-wrap: wrap; justify-content: flex-end; gap: 4px 8px; }
  .chart-kopf .chart-legende { flex: 1 0 100%; gap: 0 6px; }
  .chart-kopf .chart-zeitraum { margin-right: 0; gap: 2px; }
  .chart-zr-btn { padding: 0 7px; min-width: 28px; white-space: nowrap; }
  .chart-titelzeile .chart-kopf { margin-left: 0; flex: 1 0 100%; }
}
/* Einheit der Inhaltsbreite (%/px) neben dem Zahnrad-Titel. */
.zahnrad-titel--zeile { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.zahnrad-schalter--klein { gap: 2px; }
.zahnrad-schalter--klein .zahnrad-opt { flex: none; padding: 2px 8px; font-size: 11px; text-transform: none; letter-spacing: 0; min-width: 34px; }

/* --- Serien-Wahl zum 3.1-Chart (An-/Abwahl-Liste, 29.08.2026) ------------
   Vom Server mit `hidden` gerendert, charts.js deckt sie auf und verdrahtet
   Checkboxen, Filter, Zaehler und Zuruecksetzen (Baustein „Serien-Wahl").
   Swatch-Farben setzt charts.js per CSSOM passend zum Theme — hier steht
   nur der leere Grundzustand (Rahmen, keine Fuellung). */
.kw-wahl { margin: 2px 0 8px; box-shadow: var(--edge), var(--e1); border-radius: var(--rlg); background: var(--surface); }
/* „Gruppen verwalten"-Link am Kapitelanfang (Slice 3, 29.08.2026) — bewusst
   NICHT .app-fuss: dessen 56px-Abstand + Trennlinie sind Karten-Fuss-Optik
   und stehen oben als abgeschnittene Linie im Leeren. */
.kwg-verwalten { margin: 0 0 14px; font-size: var(--fs-body); color: var(--text-3); }
/* Gleiche Trefflaechen-Regel fuer die Verweise in der Fusszeile einer Kachel
   („Verwaltung unten", „Details & Leistungen ansehen"): sie stehen fuer sich,
   sind also keine ausgenommenen Fliesstext-Ziele, und waren 14 px hoch. */
.card .cs a { display: inline-block; padding: var(--s0) 0; margin: calc(var(--s0) * -1) 0; }
/* Ein .tag ist im Normalfall ein Schildchen, kein Bedienelement. Ist es ein
   Link oder Knopf (z.B. „CSV" ueber einer Tabelle), gilt die 24-px-Regel —
   3 px Polsterung ergaben 18 px. Nur die anfassbaren Varianten wachsen. */
a.tag, button.tag { padding-block: 6px; }
/* Der Zurueck-Verweis steht allein in seinem Absatz (.lead) und ist damit
   kein ausgenommenes Fliesstext-Ziel; 15 px waeren unter 24 px. */
p.lead > a:only-child { display: inline-block; padding: 5px 0; margin: -5px 0; }
/* Trefflaeche wie bei .th-sort-btn: der Link steht allein in seinem Absatz und
   ist damit kein ausgenommenes Fliesstext-Ziel — 15 px hoch waeren unter den
   24 px aus WCAG 2.2 AA (2.5.8). Polsterung hoch, gleich grosser negativer
   Aussenabstand zurueck: Trefflaeche 25 px, Layout unveraendert. */
.kwg-verwalten a { display: inline-block; padding: 5px 0; margin: -5px 0; }
/* Gruppen-Filter-Chips (Slice 3, 29.08.2026): .zeitraum-schalter liefert
   Flex-Reihe + Abstand, hier nur Innenabstand/Umbruch fuer den Platz INNERHALB
   von .kw-wahl (das selbst kein Padding hat) und der Reset des nativen
   <button>-Rahmens, den .tag nicht mitbringt (kw-wahl-reset daneben setzt
   ihn aus demselben Grund explizit). */
.kw-wahl-chips { padding: 8px 12px 0; margin: 0; flex-wrap: wrap; }
.kw-wahl-chip { border: 0; font: inherit; cursor: pointer; }
.kw-wahl-kopf { display: flex; align-items: center; gap: 12px; padding: 8px 12px; border-bottom: 1px solid var(--border-l); flex-wrap: wrap; }
.kw-wahl-filter {
  flex: 1 1 180px; max-width: 300px; font: 500 var(--fs-small) var(--font-body); color: var(--text);
  background: var(--surface-2); box-shadow: var(--edge); border: 0; border-radius: var(--rmd);
  height: 30px; padding: 0 10px;
}
.kw-wahl-filter:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; background: var(--surface); }
.kw-wahl-zaehler { font: 500 var(--fs-small) var(--font-body); color: var(--text-3); margin-left: auto; white-space: nowrap; }
.kw-wahl-reset {
  font: 600 var(--fs-label) var(--font-body); color: var(--text-2);
  background: var(--surface-2); border: 0; border-radius: var(--rmd);
  padding: 0 12px; height: 30px; min-width: 30px; display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.kw-wahl-reset:hover { background: var(--hover); color: var(--text); }
.kw-wahl-liste {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  gap: 1px 14px; padding: 8px 12px; max-height: 300px; overflow-y: auto;
}
/* Polsterung 5px statt 4px (02.09.2026): das Label IST die Trefflaeche des
   Kaestchens (ein Klick auf die Zeile schaltet es). Mit 4 px war die Zeile
   23 px hoch — ein Pixel unter den 24 px aus WCAG 2.2 AA (2.5.8). */
.kw-wahl-item { display: flex; align-items: center; gap: 8px; padding: 5px 6px; border-radius: var(--rsm); cursor: pointer; min-width: 0; }
.kw-wahl-item:hover { background: var(--hover); }
.kw-wahl-item input { flex-shrink: 0; margin: 0; accent-color: var(--blue); }
.kw-wahl-farbe { width: 14px; height: 4px; border-radius: var(--sr-r-xs); flex-shrink: 0; background: transparent; box-shadow: inset 0 0 0 1px var(--border); }
.kw-wahl-name { font: 500 var(--fs-body) var(--font-body); color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.kw-wahl-meta { font: 400 var(--fs-label) var(--font-body); color: var(--text-3); margin-left: auto; white-space: nowrap; flex-shrink: 0; }
@media print { .kw-wahl { display: none; } }

/* --- Tabellen-Werkzeuge (Suche + Export, Runde 9, 28.08.2026) ------------ */
.tbl-werkzeuge { display: flex; align-items: center; justify-content: flex-end; gap: var(--s3); margin: var(--s1) 0 var(--s1); }
.tbl-suche {
  font: 500 var(--fs-small) var(--font-body); color: var(--text);
  background: var(--surface-2); box-shadow: var(--edge); border: 0; border-radius: var(--rmd);
  height: 30px; padding: 0 var(--s2); width: 210px; max-width: 60vw;
}
.tbl-suche:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; background: var(--surface); }
.tbl-wrap tr.tbl-gefiltert { display: none; }
/* Eine Fussnote DIREKT unter der Kennzahlreihe gehoert zu ihr — die 56 px
   Vorlauf der app-fuss-Regel rissen dort ein Loch (gemessen 31.08.2026).
   Galt bis 01.09.2026 der .kpi-leiste, die es nicht mehr gibt. */
.sr-kpi-gitter + .app-fuss { margin-top: 8px; }
/* Zwei Fussnoten hintereinander sind EIN Block, kein neuer Abschnitt. */
.app-fuss + .app-fuss { margin-top: 8px; }
/* Eine Fussnote DIREKT unter ihrer Ueberschrift gehoert zu ihr. Die 56 px
   der app-fuss-Regel sind fuer das Blockende gedacht, nicht fuer den Anfang. */
:where(.content .section) h3 + .app-fuss,
:where(.content .section) h4 + .app-fuss { margin-top: var(--s1); }
.tbl-leer { padding: var(--s2) var(--s0); font-size: var(--fs-body); color: var(--text-3); }
@media print { .tbl-werkzeuge { display: none; } }

/* --- Content-Änderungs-Heatmap (3.3, Redesign 27.08.2026) ---------------- */
.heatmap { margin: 14px 0 22px; }
.hm-raster { display: flex; gap: 3px; align-items: flex-end; overflow-x: auto; padding-bottom: 4px; }
.hm-woche { display: flex; flex-direction: column; gap: 3px; }
.hm-monat { height: 15px; font-size: var(--fs-label); color: var(--text-3); font-weight: 600; white-space: nowrap; overflow: visible; }
.hm-wtage { margin-right: 5px; }
.hm-wtage span { height: 13px; font-size: var(--fs-label); color: var(--text-3); line-height: 13px; }
.hm-zelle { display: block; width: 13px; height: 13px; border-radius: var(--sr-r-xs); background: var(--surface-2); border: 1px solid var(--border-l); box-sizing: border-box; }
.hm-zelle.hm-frei { background: transparent; border-color: transparent; }
a.hm-zelle { cursor: pointer; }
a.hm-zelle:hover { outline: 2px solid var(--accent); outline-offset: 1px; }
.hm-s0 { background: var(--surface-2); border-color: var(--border); }
.hm-s1 { background: var(--blue-dim); border-color: transparent; }
.hm-s2 { background: color-mix(in srgb, var(--blue) 45%, var(--surface)); border-color: transparent; }
.hm-s3 { background: color-mix(in srgb, var(--blue) 72%, var(--surface)); border-color: transparent; }
.hm-s4 { background: var(--blue); border-color: transparent; }
.hm-legende { display: flex; align-items: center; gap: 4px; margin-top: 8px; font-size: var(--fs-label); color: var(--text-3); }
.hm-legende .hm-zelle { width: 11px; height: 11px; }
.hm-legende span:first-child { margin-right: 3px; }
.hm-legende span:last-child { margin-left: 3px; }

/* --- Drilldown-Tabellen (3.3 + 3.4, Redesign 27.08.2026) ----------------- */
table.tbl-drill { margin: var(--s3) 0; }
/* Auf schmalen Schirmen scrollt eine Drilldown-Tabelle IN SICH SELBST.
   Sie steht bewusst nicht in .tbl-wrap (dessen max-height wuerde aufgeklappte
   Zeilen beschneiden) und hatte damit gar keinen Scroll-Container: die
   Kernseiten-Tabelle in Kapitel 07 war auf 390 px 870 px breit, und die
   fehlenden 496 px waren nicht wegscrollbar, sondern schlicht weg (gemessen
   01.09.2026, scripts/breiten-sonde.js). display:block macht die Tabelle zum
   Scroll-Container; die Spalten richten sich im inneren Tabellenkasten
   weiterhin aneinander aus. min-width haelt schmale Tabellen auf voller
   Breite — ohne das schrumpfen sie auf ihren Inhalt. */
/* Seit 07.09.2026 (Abnahme K&R-Rollout) auf JEDER Breite: die Tabelle
   „Alle Seiten" in Kapitel 07 lief mit ihrer 30-Tage-Spalte bei 1440 px
   62 px ueber den Kartenrand hinaus (Bild 1502 px breit) — ein Scroll-
   Container nur unter 700 px hilft dort nicht. Breiter Inhalt rollt in
   seinem eigenen Kasten (K3 der Rollout-Pruefliste), nie die Seite. */
table.tbl-drill { display: block; overflow-x: auto; max-width: 100%; transition: box-shadow 160ms var(--ease); }
table.tbl-drill > * { min-width: 100%; }
/* Derselbe Scroll-Schatten wie bei .tbl-wrap — ohne ihn sieht eine
   abgeschnittene Tabelle aus wie eine zu Ende erzaehlte. Klassen setzt
   app.js (Baustein „XL-Tabellen"), und nur, wenn wirklich etwas verborgen ist. */
table.tbl-drill.scroll-left { box-shadow: inset 14px 0 14px -14px var(--scroll-schatten); }
table.tbl-drill.scroll-right { box-shadow: inset -14px 0 14px -14px var(--scroll-schatten); }
table.tbl-drill.scroll-left.scroll-right { box-shadow: inset 14px 0 14px -14px var(--scroll-schatten), inset -14px 0 14px -14px var(--scroll-schatten); }
tr.drill { cursor: pointer; }
tr.drill:hover td { background: var(--hover); }
tr.drill > td:first-child { position: relative; padding-left: var(--s4); }
tr.drill > td:first-child::before {
  content: ""; position: absolute; left: 12px; top: 18px;
  width: 7px; height: 7px; border-right: 2px solid var(--text-3); border-bottom: 2px solid var(--text-3);
  transform: rotate(-45deg); transition: transform 140ms var(--ease);
}
tr.drill.drill--offen > td:first-child::before { transform: rotate(45deg); }
tr.drill:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: -2px; }
tr.drill-detail > td {
  background: var(--surface-2); padding: var(--s3) var(--s3) var(--s3) var(--s4);
  border-left: 3px solid var(--border); font-size: var(--fs-body);
}
tr.drill-detail p { margin: 0 0 var(--s1); }
tr.drill-detail p:last-child { margin-bottom: 0; }
tr.drill-detail ul { margin: var(--s0) 0 var(--s2); }
.befund-meldung-titel { margin-top: 10px !important; color: var(--text-3); font-size: var(--fs-small); text-transform: uppercase; letter-spacing: .8px; font-weight: 700; }
.befund-meldungen { list-style: none; padding-left: 0; }
.befund-meldungen li { margin-bottom: 4px; }
/* Fundstellen (31.08.2026): die Antwort auf „wo genau?". Eine Liste ohne
   Aufzaehlungszeichen — die Eintraege sind Pfade und maskierte Kennungen,
   ein Punkt davor macht sie nur unruhiger. */
.befund-fund-titel { margin-top: 10px !important; color: var(--text-3); font-size: var(--fs-small); text-transform: uppercase; letter-spacing: .8px; font-weight: 700; }
.befund-fundstellen { list-style: none; padding-left: 0; margin: 0 0 4px; }
.befund-fundstellen li { margin-bottom: 4px; font-size: var(--fs-small); line-height: 1.5; }
.befund-fundort { color: var(--text-3); }
/* Herkunft: wann und womit gefunden. Steht als letzte Zeile im Drilldown und
   traegt bewusst weniger Gewicht als der Befund selbst. */
.befund-herkunft { margin-top: 10px; font-size: var(--fs-label); color: var(--text-3); }
.log-zeit { color: var(--text-3); font-size: var(--fs-mono); font-family: var(--font-mono); }
.log-neu { color: var(--green); font-weight: 700; }
.log-weg { color: var(--red); font-weight: 700; }
.log-diff { color: var(--text); font-weight: 700; }
.log-null { color: var(--text-3); }

/* --- "Bestanden"-Liste (3.4, AP1 Slice 1, 28.08.2026): Nulltreffer-Regeln
   unter der Problemliste — gruener Haken per CSS-content, kein Emoji im
   Markup, zweispaltig auf breitem Screen fuer lange Listen. */
/* Gruene Abschlusszeile unter der Problemliste (AP5 Stufe 3, projekt.js
   blockBestanden()) — der sichtbare Gegenwert zur Mangelliste darueber,
   frueher hinter einem zugeklappten <details> versteckt. Linke Kante in
   --green wie .info--ok, aber als schmaler Streifen statt als Kasten: er
   schliesst den Abschnitt ab, er eroeffnet keinen neuen. */
.bestanden-streifen {
  display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
  margin: 18px 0 10px; padding: 12px 16px; border-radius: var(--rmd);
  background: var(--green-dim); box-shadow: inset 3px 0 0 var(--green);
  color: var(--text);
}
.bestanden-haken { color: var(--green); font-weight: 800; font-size: var(--fs-h2); line-height: 1; align-self: center; }
.bestanden-zahl { font-family: var(--font-num); font-weight: 800; font-size: var(--fs-h1); letter-spacing: -.4px; color: var(--text); }
.bestanden-text { font-size: var(--fs-body); color: var(--text-2); }
/* Nulltreffer-Fall: derselbe Streifen, nur ohne Erfolgsfarbe — es gibt
   nichts zu feiern, aber auch nichts zu warnen. */
.bestanden-streifen--leer { background: var(--surface-2); box-shadow: inset 3px 0 0 var(--text-3); }
.bestanden-streifen--leer .bestanden-haken { color: var(--text-3); }
.bestanden-liste { list-style: none; padding-left: 0; margin: 6px 0 0; columns: 2; column-gap: 28px; }
.bestanden-liste li { position: relative; padding: 6px 0 6px 26px; break-inside: avoid; color: var(--text-2); font-size: var(--fs-body); line-height: 1.4; }
.bestanden-liste li::before { content: "✓"; position: absolute; left: 0; top: 5px; color: var(--green); font-weight: 800; }
@media (max-width: 900px) { .bestanden-liste { columns: 1; } }

/* --- Anbindungen: eine Seite, Hero je Dienst, Live-Protokoll (Runde 5) ---
   Interaktions-Takt nach Haus-Standard: Mikro-Feedback 120-160ms, kleine
   Uebergaenge 200-300ms, ease-out beim Erscheinen; alles nur transform/
   opacity. Die Konsole ist BEWUSST in jedem Theme dunkel (wie der Header):
   ein Protokoll liest sich wie ein Terminal. */
.anb-dienst { margin: 0 0 46px; }
.anb-hero { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px 18px; margin: 2px 0 10px; }
.anb-hero-stand { display: flex; align-items: center; gap: 10px; font-size: var(--fs-h2); }
.anb-hero-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.anb-chip { display: inline-flex; align-items: baseline; gap: 8px; padding: 5px 12px; border-radius: var(--rpill); background: var(--surface-2); font-size: var(--fs-small); color: var(--text-2); }
.anb-chip-k { font-size: var(--fs-label); text-transform: uppercase; letter-spacing: 1.1px; color: var(--text-3); font-weight: 700; }
.anb-was { margin: 0 0 12px; color: var(--text-2); max-width: 860px; }
.anb-kein-sofort { margin: 10px 0 0; }
.anb-tabelle { margin-top: 2px; }

/* Puls-Punkt: lebendiger Verbindungsstand — weicher, auslaufender Ring. */
.anb-puls { width: 10px; height: 10px; border-radius: 50%; flex: none; position: relative; }
.anb-puls--g { background: var(--green); }
.anb-puls--a { background: var(--amber); }
.anb-puls--r { background: var(--red); }
.anb-puls::after { content: ''; position: absolute; inset: 0; border-radius: 50%; background: inherit; animation: anb-puls-ring 2.4s var(--ease) infinite; }
@keyframes anb-puls-ring { 0% { transform: scale(1); opacity: .55; } 70% { transform: scale(2.6); opacity: 0; } 100% { transform: scale(2.6); opacity: 0; } }

/* Detail-Drilldown: alle vorliegenden Felder als Schluessel/Wert-Zeilen. */
.anb-detail { display: grid; gap: 4px; padding: 4px 0 6px; }
.anb-detail-zeile { display: grid; grid-template-columns: 240px 1fr; gap: 14px; font-size: var(--fs-small); }
.anb-detail-k { color: var(--text-3); font-weight: 600; }
.anb-detail-v { color: var(--text-2); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: var(--fs-small); word-break: break-word; white-space: pre-wrap; }
@media (max-width: 900px) { .anb-detail-zeile { grid-template-columns: 1fr; gap: 2px; } }

/* Aktionen: Knopf mit Druck-Feedback und Lade-Spinner. */
.anb-aktionen { margin: 14px 0 0; }
.anb-aktionen-zeile { display: flex; align-items: center; flex-wrap: wrap; gap: 10px 14px; }
.anb-aktionen-hinweis { font-size: var(--fs-small); }
.anb-btn { position: relative; display: inline-flex; align-items: center; gap: 8px; min-height: 36px; padding: 0 16px; border: 0; border-radius: var(--rmd); background: var(--knopf-blau); box-shadow: var(--knopf-schatten); color: var(--auf-knopf); font-family: inherit; font-size: var(--fs-body); font-weight: 650; cursor: pointer; transition: transform var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease), background var(--t-fast) var(--ease); }
.anb-btn:hover:not(:disabled) { background: var(--knopf-blau-hover); box-shadow: var(--knopf-schatten-hover); transform: translateY(-1px); }
.anb-btn:active:not(:disabled) { transform: translateY(0) scale(.985); }
.anb-btn:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
.anb-btn:disabled { opacity: .55; cursor: default; }
.anb-btn.laedt { color: transparent; }

/* R10 "Kosten am Knopf": Preis-Chip IM Knopf, sichtbar vor dem Klick.
   Drei Toene, damit der Blick den Unterschied macht und nicht der Text:
   gruen = kostenlos, gelb = kostet, rot = Preis fehlt in AKTIONEN. */
.anb-btn-preis { flex: none; font-size: var(--fs-label); font-weight: 700; letter-spacing: .2px; padding: 2px 7px; border-radius: var(--sr-r-pill); background: rgba(255,255,255,.2); color: var(--auf-knopf); }
/* Auf der blauen Knopfflaeche tragen die Preis-Chips helle Toene (weiss
   auf 20 % Weiss; frei/zahlt/unklar als Punkt davor statt als Textfarbe —
   die drei Statusfarben halten auf Blau keine 4,5:1). */
.anb-btn-preis--frei::before, .anb-btn-preis--zahlt::before, .anb-btn-preis--unklar::before { content: ''; display: inline-block; width: 7px; height: 7px; border-radius: 50%; margin-right: 5px; vertical-align: 1px; }
.anb-btn-preis--frei::before { background: #7ee2a0; }
.anb-btn-preis--zahlt::before { background: #ffd166; }
.anb-btn-preis--unklar::before { background: #ff9b93; }
.anb-btn.laedt .anb-btn-preis { color: transparent; background: transparent; }

/* R9 "Ausgang aus dem Ladezustand": beendet nur die Anzeige, nie den Lauf. */
.anb-konsole-aus { flex: none; border: 0; border-radius: var(--sr-r-pill); padding: 3px 10px; font-family: inherit; font-size: var(--fs-label); font-weight: 700; background: var(--konsole-chip); color: var(--konsole-chip-text); cursor: pointer; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.anb-konsole-aus:hover { background: var(--konsole-chip-hover); color: var(--konsole-chip-text-hover); }
.anb-konsole-aus:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
.anb-btn.laedt::after { content: ''; position: absolute; left: 50%; top: 50%; width: 14px; height: 14px; margin: -7px 0 0 -7px; border-radius: 50%; border: 2px solid var(--akzent-ring); border-top-color: var(--accent); animation: anb-dreh 700ms linear infinite; }
@keyframes anb-dreh { to { transform: rotate(360deg); } }

/* Live-Konsole: dunkles Terminal, Zeilen treten weich ein, Cursor blinkt. */
.anb-konsole { margin-top: 12px; box-shadow: var(--edge), var(--e1); border-radius: var(--sr-r-md); overflow: hidden; background: var(--konsole-grund); animation: anb-auf 240ms var(--ease) both; }
@keyframes anb-auf { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
.anb-konsole-kopf { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 8px 14px; background: var(--konsole-kopf); border-bottom: 1px solid var(--auf-dunkel-flaeche); }
.anb-konsole-titel { font-size: var(--fs-label); text-transform: uppercase; letter-spacing: 1.6px; color: var(--konsole-titel); font-weight: 700; }
.anb-konsole-status { font-size: var(--fs-label); font-weight: 700; padding: 3px 10px; border-radius: var(--sr-r-pill); background: var(--konsole-chip); color: var(--konsole-chip-text); transition: background 200ms var(--ease), color 200ms var(--ease); }
.anb-konsole-status--laeuft { background: var(--konsole-warn-flaeche); color: var(--konsole-warn); animation: anb-atmen 1.6s var(--ease) infinite; }
.anb-konsole-status--fertig { background: var(--konsole-ok-flaeche); color: var(--konsole-ok); }
.anb-konsole-status--fehler { background: var(--konsole-err-flaeche); color: var(--konsole-err); }
@keyframes anb-atmen { 0%, 100% { opacity: 1; } 50% { opacity: .55; } }
.anb-konsole-strom { max-height: 340px; overflow-y: auto; padding: 10px 14px 12px; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: var(--fs-small); line-height: 1.55; color: var(--konsole-text); overscroll-behavior: contain; }
.anb-zeile { animation: anb-zeile-auf 160ms var(--ease) both; white-space: pre-wrap; word-break: break-word; }
@keyframes anb-zeile-auf { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; transform: none; } }
.anb-zeile--err { color: var(--konsole-err-text); }
.anb-zeile--meta { color: var(--konsole-mut); }

/* Schmale Schirme: Nebenspalten weichen in den Drilldown, Grund-Texte
   brechen um — kein horizontaler Ueberlauf (390-px-Abnahme). */
@media (max-width: 900px) {
  /* table-layout fixed zwingt die Tabelle in die Viewport-Breite — lange
     Projektnamen brechen um (overflow-wrap), statt die Seite zu dehnen. */
  .anb-tabelle { font-size: var(--fs-small); width: 100%; table-layout: fixed; }
  .anb-tabelle .anb-sp-neben { display: none; }
  .anb-tabelle td, .anb-tabelle th { overflow-wrap: anywhere; }
  .anb-grund { max-width: none; }
}
.anb-konsole--laeuft .anb-konsole-strom::after { content: '▍'; color: var(--konsole-ok); animation: anb-blink 1s steps(2, start) infinite; }
@keyframes anb-blink { 50% { opacity: 0; } }

/* --- Tarif-Schranken (AP3 Slice 2, 28.08.2026) --------------------------
 * Bausteine app/views/schranken.js: kapitelSchranke() (ganzes Kapitel
 * gesperrt — Erklaerung + schlossHinweis() + verschwommene Demo-Vorschau MIT
 * Schloss-Overlay darunter), schlossHinweis() (welcher Tarif deckt das
 * Merkmal ab), limitKachel()/limitKacheln() (Kontingent-Kacheln mit Balken;
 * bis AP5 Stufe 3 die Zeilenform limitZeile()). CSP erlaubt keine
 * Inline-Styles: die Balkenbreite laeuft ueber eine Klassen-Skala
 * (--0 … --100 in Zehnerschritten), kein style-Attribut — dasselbe Prinzip
 * wie die SVG-Balken in app/lib/svg.js (barChart()/statusStreifen()), hier
 * als reine CSS-Variante, weil der Balken selbst keine krummen Geometrien
 * braucht. Dieselbe Skala in Fuenferschritten tragen die Balkenzeilen
 * (.balkenzeile-fuellung--N, weiter unten). */
.schranke { margin: 16px 0; padding: 16px 18px; background: var(--surface-2); box-shadow: var(--edge), var(--e1); border-left: 3px solid var(--amber); border-radius: var(--rlg); }
.schranke-kopf { margin: 0 0 6px; font-weight: 700; color: var(--text); }
.schranke-text { margin: 0; color: var(--text-2); font-size: var(--fs-body); }
/* Demo-Vorschau: echter (aber gesperrter) Kapitel-Inhalt, weichgezeichnet
   und unbedienbar dahinter — aria-hidden im Markup deckt Screenreader ab,
   pointer-events hier Maus/Touch (verhindert Klicks auf blind gerenderte
   Links/Knoepfe der Vorschau). */
.schranke-demo { margin-top: 14px; padding-top: 14px; border-top: 1px dashed var(--border); filter: blur(3px) saturate(.6); opacity: .55; pointer-events: none; user-select: none; }
@media print { .schranke-demo { display: none; } }

/* SCHLOSS-OVERLAY ueber der unscharfen Demo (AP5 Stufe 3, 30.08.2026,
   schranken.js demoMitOverlay()). Der Weichzeichner allein war zweideutig —
   er sah aus wie ein Fehler. Das Overlay sagt, dass die Unschaerfe Absicht
   ist, und bietet in derselben Bewegung den Weg zur naechsten Stufe an.
   Die Huelle ist der Positionsanker; das Overlay bleibt bedienbar
   (pointer-events des Overlays sind NICHT abgeschaltet, nur die der Demo
   darunter), sonst waere die CTA nicht klickbar. */
.schranke-huelle { position: relative; overflow: hidden; border-radius: var(--rmd); }
.schranke-overlay {
  position: absolute; inset: 0; z-index: 1;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 10px; padding: 20px; text-align: center;
  background: linear-gradient(180deg, transparent 0%, var(--scrim) 42%, var(--scrim) 100%);
}
/* Ring statt Kreisflaeche: das Schloss soll wie ein Siegel wirken, nicht wie
   ein Knopf — es ist der Zustand, geklickt wird die CTA darunter. */
.schranke-ring {
  display: inline-flex; align-items: center; justify-content: center;
  width: 52px; height: 52px; border-radius: 50%; font-size: var(--fs-h1); line-height: 1;
  background: var(--surface); box-shadow: 0 0 0 2px var(--amber), var(--e2);
}
.schranke-overlay-text { margin: 0; max-width: 42ch; font-size: var(--fs-body); font-weight: 600; color: var(--text); }
.schranke-cta {
  display: inline-flex; align-items: center; padding: 9px 18px; border-radius: var(--rmd);
  background: var(--knopf-blau); color: var(--auf-knopf); font-weight: 650; text-decoration: none;
  transition: background var(--t-fast) var(--ease), transform var(--t-fast) var(--ease);
}
.schranke-cta:hover { background: var(--accent-deep); text-decoration: none; }
.schranke-cta:active { transform: scale(.97); }
.schranke-cta:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
@media print { .schranke-huelle { display: none; } }
@media (prefers-reduced-motion: reduce) { .schranke-cta { transition: none; } }

/* KONTINGENT-KACHELN (AP5 Stufe 3, schranken.js limitKachel()) — loesen die
   fruehere Zeilenform ab: dort war die Zahl, um die es geht, so klein wie
   ihre Einheit. Jetzt traegt sie die Kachel, der Balken sitzt als Fusszeile
   darunter. Raster statt Liste, damit mehrere Kontingente nebeneinander
   vergleichbar sind. */
.limit-kacheln { display: grid; grid-template-columns: repeat(auto-fit, minmax(168px, 1fr)); gap: 12px; margin: 16px 0; }
.limit-kachel { display: flex; flex-direction: column; gap: 4px; padding: 14px 16px; border-radius: var(--rmd); background: var(--surface-2); box-shadow: var(--edge); }
.limit-wert { font-family: var(--font-num); font-size: var(--fs-kpi); font-weight: 800; letter-spacing: -.5px; font-variant-numeric: tabular-nums; color: var(--text); line-height: 1.1; }
.limit-max { font-size: var(--fs-h2); font-weight: 650; color: var(--text-3); letter-spacing: 0; }
.limit-label { font-size: var(--fs-label); text-transform: uppercase; letter-spacing: 1.1px; font-weight: 700; color: var(--text-3); }
.limit-fuss { font-size: var(--fs-body); color: var(--text-2); }
.limit-balken { display: block; width: 100%; height: 8px; margin-top: 6px; background: var(--surface); box-shadow: var(--edge); border-radius: var(--rpill); overflow: hidden; }
.limit-balken-fuellung { display: block; height: 100%; background: var(--blue); border-radius: var(--sr-r-pill) 0 0 var(--sr-r-pill); }
.limit-balken-fuellung--0 { width: 0%; }
.limit-balken-fuellung--10 { width: 10%; }
.limit-balken-fuellung--20 { width: 20%; }
.limit-balken-fuellung--30 { width: 30%; }
.limit-balken-fuellung--40 { width: 40%; }
.limit-balken-fuellung--50 { width: 50%; }
.limit-balken-fuellung--60 { width: 60%; }
.limit-balken-fuellung--70 { width: 70%; }
.limit-balken-fuellung--80 { width: 80%; background: var(--amber); }
.limit-balken-fuellung--90 { width: 90%; background: var(--amber); }
.limit-balken-fuellung--100 { width: 100%; background: var(--red); }
.limit-balken-fuellung--voll { background: var(--red); } /* Kontingent ueberschritten (>100%), zusaetzlich zu --100 gesetzt */
@media (max-width: 900px) { .limit-kacheln { grid-template-columns: repeat(2, 1fr); } }


/* ---- Design v2, Welle K1 (28.08.2026): KPI-Leiste, Urteilszeile, Karten-Fuss
   (Komponenten-Katalog v1; Erzeuger in app/views/ui.js). Delta-Chips nutzen
   die bestehenden ui.js-Klassen delta-gut/-schlecht/-neutral — Pfeil folgt
   der Richtung, Farbe der Bewertung (deltaMenge()). ---- */
/* Die Delta-Chips der Kennzahl-Kacheln. Sie standen bis 01.09.2026 unter
   .kpi — dem Markup der entfallenen kpiLeiste(); seither traegt sie
   .sr-kpi-zeile, weil alle Kennzahlen ueber srKpiGitter() laufen. Das
   Aussehen ist unveraendert: Pfeil = Richtung, Farbe = Bewertung. */
.sr-kpi-zeile .delta-gut, .sr-kpi-zeile .delta-schlecht, .sr-kpi-zeile .delta-neutral { font-size: var(--fs-label); padding: 1px 7px; border-radius: var(--rpill); }
.sr-kpi-zeile .delta-gut { background: var(--green-dim); }
.sr-kpi-zeile .delta-schlecht { background: var(--red-dim); }
.sr-kpi-zeile .delta-neutral { background: var(--hover); }
.urteil { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; font-size: var(--fs-h2); font-weight: 650; color: var(--text); margin: 2px 0 12px; }
.urteil .delta-gut, .urteil .delta-schlecht, .urteil .delta-neutral { font-size: var(--fs-body); }
.karten-fuss { margin-top: 16px; padding-top: 10px; border-top: 1px solid var(--line); font-size: var(--fs-label); color: var(--text-3); display: flex; gap: 10px; flex-wrap: wrap; align-items: baseline; }

/* ---- Tarifkarten (AP3 Slice 3): app/views/tarife.js, .konto tarif-Sektion.
   Werte kommen ausschliesslich aus app/lib/tarif.js — hier nur Optik, nur
   Bestands-Tokens (theme.css). ---- */
/* Seit 29.08.2026 (Betreiber-Feedback) eine Vergleichstabelle statt drei
   Karten: Bezeichnung EINMAL links, je Tarifspalte nur der Wert. Eigener
   Wrapper (kein .tbl-wrap), damit die Klick-Sortierung aus app.js hier
   nicht andockt; auf schmalen Viewports scrollt die Tabelle im Wrapper. */
.tarif-vergleich-wrap { overflow-x: auto; margin: 18px 0; }
.tarif-vergleich { width: 100%; border-collapse: collapse; }
.tarif-vergleich th, .tarif-vergleich td { padding: var(--s2) var(--s3); font-size: var(--fs-body); }
.tarif-vergleich thead th { text-align: left; vertical-align: top; border-bottom: 2px solid var(--line); }
.tarif-vergleich thead th.tarif-leistung { vertical-align: bottom; color: var(--text-3); font-weight: 600; font-size: var(--fs-small); }
.tarif-vergleich thead th.tarif-spalte { min-width: 168px; }
.tarif-vergleich tbody th { text-align: left; font-weight: 500; color: var(--text-2); border-top: 1px solid var(--line); white-space: nowrap; }
.tarif-vergleich tbody td { border-top: 1px solid var(--line); color: var(--text); font-variant-numeric: tabular-nums; white-space: nowrap; }
.tarif-vergleich tbody tr:first-child th, .tarif-vergleich tbody tr:first-child td { border-top: none; }
.tarif-td--empfohlen { background: var(--surface-2); }
/* Im dunklen Tabellenkopf KEIN heller Spalten-Hintergrund (waere unleserlich) —
   die Empfehlung markiert dort nur die Akzentkante oben. */
.tarif-spalte--empfohlen { border-top: 3px solid var(--accent); }
.tarif-kopf { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.tarif-kopf h3 { font-size: var(--fs-h2); font-weight: 700; margin: 0; }
.tarif-preis { font-size: var(--fs-h2); font-weight: 800; letter-spacing: -.02em; font-variant-numeric: tabular-nums; margin: 6px 0 2px; color: var(--text); }
.tarif-ja { color: var(--green); }
.tarif-nein { color: var(--text-3); }
.tarif-hinweis { padding-top: 6px; font-size: var(--fs-small); color: var(--text-2); }

/* ---- Teilfreigabe (AP3): app/views/schranken.js teilfreigabeZeile() — Hinweis
   unter einer per Tarif-Limit beschnittenen Tabelle. ---- */
.teilfreigabe { margin: 6px 0 14px; padding: 10px 14px; border: 1px dashed var(--border); border-radius: var(--rmd); font-size: var(--fs-body); color: var(--text-2); background: var(--surface-2); }

/* ---- App-404 (Design v2, AP2 „App-Gefühl"): server.js nichtGefundenSeite() —
   Wege-Karte mit Knopfzeile aus dem Sackgassen-Kopf heraus. ---- */
.wege-zeile { display:flex; gap:12px; flex-wrap:wrap; margin:16px 0; }
.wege-knopf { display:inline-flex; align-items:center; padding:10px 18px; border-radius:var(--rmd); background:var(--knopf-blau); color:var(--auf-knopf); font-weight:650; text-decoration:none; transition: background var(--t-fast) var(--ease), transform var(--t-fast) var(--ease); }
.wege-knopf:hover { background:var(--accent-deep); text-decoration:none; }
.wege-knopf:active { transform:scale(.97); }
.wege-knopf--zweit { background:var(--surface-2); color:var(--text); }
.wege-knopf--zweit:hover { background:var(--hover); }
kbd { font-family:var(--font-mono); font-size:var(--fs-mono); padding:2px 6px; border-radius:var(--rsm); background:var(--surface-2); box-shadow:var(--edge); }
.fuss-hinweis { font-size:var(--fs-body); color:var(--text-3); }

/* ---- Kommandopalette (AP2): Strg/Cmd+K, app.js letzter Baustein — zentriertes
   Modal ueber Scrim, Motion nach motion-spec „Modal öffnen": Karte
   scale(.97)→1 + Scrim-Fade, 200 ms/spring, unter reduced-motion nur Fade.
   [hidden] traegt die eigentliche Sichtbarkeit (aus dem Tab-/A11y-Baum,
   selbes Muster wie .mega-panel/.usermenu-drop) — .offen setzt nur die
   Ziel-Werte fuer die Transition, von app.js einen Frame nach dem
   Entfernen von [hidden] gesetzt. */
.palette-scrim { position: fixed; inset: 0; z-index: 200; background: var(--scrim); opacity: 0; transition: opacity var(--t-med) var(--ease); }
.palette-scrim.offen { opacity: 1; }
.palette { position: fixed; top: 18vh; left: 50%; z-index: 201; width: min(560px, calc(100vw - 32px)); background: var(--surface); border-radius: var(--rlg); box-shadow: var(--edge), var(--e3); opacity: 0; transform: translateX(-50%) scale(.97); transition: opacity var(--t-med) var(--spring), transform var(--t-med) var(--spring); overflow: hidden; }
.palette.offen { opacity: 1; transform: translateX(-50%) scale(1); }
.palette-eingabe { display: block; width: 100%; box-sizing: border-box; background: var(--surface-2); border: none; padding: 14px 16px; font-size: var(--fs-h2); color: var(--text); font-family: inherit; }
.palette-eingabe:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: -2px; }
.palette-liste { max-height: 320px; overflow-y: auto; }
.palette-gruppe { font-size: var(--fs-label); text-transform: uppercase; letter-spacing: 1px; color: var(--text-3); padding: 10px 16px 4px; }
.palette-zeile { padding: 10px 16px; cursor: pointer; display: flex; justify-content: space-between; gap: 10px; color: var(--text-2); }
.palette-zeile.aktiv { background: var(--accent-soft); color: var(--text); }
.palette-leer { padding: 14px 16px; color: var(--text-3); font-size: var(--fs-body); }
@media (prefers-reduced-motion: reduce) {
  .palette-scrim { transition: opacity var(--t-fast) linear; }
  .palette { transition: opacity var(--t-fast) linear; }
  .palette.offen { transform: translateX(-50%); }
}

/* ========================================================================
   NEU-BADGE + QUICKTOUR-FRAMEWORK (app/views/ui.js neuBadge()/tourKnopf(),
   app/views/tour.js) — wiederverwendbarer Baustein, um frische Funktionen zu
   markieren und optional per Mini-Tour zu erklaeren. Gleiches Overlay-Muster
   wie Kommandopalette/Keyword-Drawer oben: [hidden] traegt die Sichtbarkeit,
   .offen setzt nur die Zielwerte der Transition. accent/on-accent sind an
   KEINEN data-theme-Block gebunden (theme.css, :root) — .tag--neu braucht
   deshalb keine eigenen Hell-/Dunkel-Varianten. ------------------------- */

/* --- NEU-Badge ----------------------------------------------------------- */
.tag--neu { background: var(--accent); color: var(--on-accent); }

/* --- Quicktour: Start-Knopf ----------------------------------------------
   Ghost-Button (Umrandung statt Flaeche) im Akzentton — wie .knopf nutzbar,
   aber zurueckhaltender, weil er meist NEBEN einer Kapitelueberschrift steht,
   nicht als primaere Handlung einer Seite. */
.tour-start {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 14px; font: inherit; font-size: var(--fs-ui); font-weight: 650;
  color: var(--accent); background: transparent; border: 1px solid var(--accent);
  border-radius: var(--rsm); cursor: pointer;
  transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
}
.tour-start:hover { background: var(--accent-soft); }
.tour-start:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
/* Schon gesehen (localStorage wtour:<gruppe>): dezenter, aber weiterhin klar
   als Knopf erkennbar — kein Verschwinden, die Tour bleibt jederzeit abrufbar. */
.tour-start--gesehen { color: var(--text-3); border-color: var(--border); }
.tour-start--gesehen:hover { background: var(--hover); color: var(--text-2); }

/* --- Quicktour: Backdrop + Karte ------------------------------------------
   Karte steht per Grundstellung UNTEN, ueber margin:auto zwischen zwei feste
   Kanten zentriert (bewusst kein transform:translateX(-50%) wie bei .palette
   — so bleibt transform ausschliesslich fuer die Einblend-Animation frei,
   .tour-karte--frei kann die feste Positionierung dann konfliktfrei durch
   inline top/left ersetzen, siehe tour.js positionieren()). */
.tour-backdrop {
  position: fixed; inset: 0; z-index: 300; background: var(--scrim);
  opacity: 0; transition: opacity var(--t-med) var(--ease);
}
.tour-backdrop.offen { opacity: 1; }

.tour-karte {
  position: fixed; z-index: 301;
  left: 16px; right: 16px; bottom: var(--s4); margin: 0 auto;
  width: min(420px, calc(100vw - 32px));
  background: var(--surface); border-radius: var(--rlg);
  box-shadow: var(--edge), var(--e3);
  padding: 20px 22px 18px;
  opacity: 0; transform: translateY(10px);
  transition: opacity var(--t-med) var(--spring), transform var(--t-med) var(--spring);
}
.tour-karte[hidden] { display: none; }
.tour-karte.offen { opacity: 1; transform: translateY(0); }
/* Desktop, nah am Zielelement (tour.js positionieren()): feste Kanten raus,
   top/left kommen als Inline-Style — die Einblend-Animation (opacity/
   translateY) bleibt unveraendert gueltig. */
.tour-karte--frei { left: 0; right: auto; bottom: auto; margin: 0; }

.tour-karte-schliessen {
  position: absolute; top: 10px; right: 10px; width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  background: transparent; border: none; border-radius: var(--rsm);
  color: var(--text-3); font-size: var(--fs-h2); line-height: 1; cursor: pointer;
}
.tour-karte-schliessen:hover { background: var(--hover); color: var(--text); }
.tour-karte-schliessen:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
.tour-karte-schritt { margin: 0 26px 6px 0; font-size: var(--fs-label); font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: var(--text-3); }
.tour-karte-titel { margin: 0 26px 8px 0; font-size: var(--fs-h2); color: var(--text); }
.tour-karte-text { margin: 0 0 16px; font-size: var(--fs-body); line-height: 1.5; color: var(--text-2); }
.tour-karte-knoepfe { display: flex; justify-content: flex-end; gap: 10px; }
.tour-btn { padding: 8px 16px; font: inherit; font-size: var(--fs-ui); font-weight: 650; border-radius: var(--rsm); cursor: pointer; transition: background var(--t-fast) var(--ease); }
.tour-btn--zurueck { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-2); }
.tour-btn--zurueck:hover { background: var(--hover); }
.tour-btn--zurueck:disabled { opacity: .4; cursor: not-allowed; }
.tour-btn--weiter { background: var(--knopf-blau); border: 1px solid var(--knopf-blau); color: var(--auf-knopf); }
.tour-btn--weiter:hover { background: var(--accent-deep); }
.tour-btn:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }

/* --- Quicktour: hervorgehobenes Zielelement -------------------------------
   Doppelring wie beim Ampel-Puls oben (0 0 0 Ns var(--surface) als Abstand,
   dann die eigentliche Farbe) — funktioniert unabhaengig von der eigenen
   Hintergrundfarbe des Zielelements. z-index UEBER dem Backdrop + position
   (sonst greift z-index bei einem urspruenglich statisch positionierten
   Element nicht) hebt es aus der Abdunkelung heraus. */
.tour-fokus {
  position: relative; z-index: 301;
  border-radius: var(--rsm);
  box-shadow: 0 0 0 4px var(--surface), 0 0 0 7px var(--accent);
}

@media (max-width: 480px) {
  .tour-karte, .tour-karte--frei { left: 12px; right: 12px; bottom: 12px; top: auto; width: auto; margin: 0; }
}

@media (prefers-reduced-motion: reduce) {
  .tour-backdrop, .tour-karte { transition: opacity var(--t-fast) linear; }
  .tour-karte.offen { transform: none; }
  .tour-fokus { transition: none; }
}

@media print {
  .tag--neu, .tour-start, .tour-backdrop, .tour-karte { display: none !important; }
}

/* --- KI-Sonde 5.2-Ausbau: Sentiment-Belege (AI-Tracker E1-E3+E6) ---------
   Zitat-Optik ohne neue Farbvariablen -- linker Rahmen wie .info/.schranke,
   aber ohne Hintergrund: der O-Ton soll sich absetzen, nicht wie ein
   Status-Hinweis wirken. Keine eigene Theme-Anpassung noetig, --border/
   --text-2/--text-3 sind bereits hell/dunkel-faehig (theme.css). */
.ki-beleg { margin: 10px 0; padding: 2px 0 2px 14px; border-left: 3px solid var(--border); font-style: italic; color: var(--text-2); }
.ki-beleg cite { display: block; margin-top: 4px; font-style: normal; font-size: var(--fs-body); color: var(--text-3); }

/* ---- Problemliste (Design-Paket „Problemliste", 30.08.2026) -------------
   Die fuenfzehn dringendsten Befunde als Zeilenliste statt Tabelle: der
   Befund ist ein ganzer Satz, und ein Satz in einer Tabellenzelle liest
   sich schlechter als in einer Zeile. Schweregrad steckt im Punkt links
   UND im Kategorie-Tag rechts — nie in der Farbe allein. Die restlichen
   Befunde bleiben hinter dem Ausklapper eine Tabelle: dort geht es ums
   Nachschlagen, nicht ums Lesen. */
.problem-liste { display: flex; flex-direction: column; margin: 12px 0 18px; }
.problem-zeile {
  display: flex; align-items: baseline; gap: 12px;
  min-height: 44px; padding: 10px 12px;
  border-radius: var(--rmd); color: var(--text); text-decoration: none;
  transition: background var(--t-fast) var(--ease);
}
.problem-zeile + .problem-zeile { box-shadow: inset 0 1px 0 var(--line); }
.problem-zeile:hover { background: var(--hover); text-decoration: none; }
.problem-zeile:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: -2px; }
.problem-punkt { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; align-self: center; }
.problem-zeile--bad .problem-punkt { background: var(--red); }
.problem-zeile--warn .problem-punkt { background: var(--amber); }
.problem-satz { flex: 1 1 auto; min-width: 0; line-height: 1.45; }
.problem-meta { display: flex; align-items: center; gap: 10px; flex-shrink: 0; margin-left: auto; }
.problem-zahl { font-size: var(--fs-label); color: var(--text-3); font-variant-numeric: tabular-nums; white-space: nowrap; }
@media (max-width: 900px) {
  .problem-zeile { flex-wrap: wrap; }
  .problem-meta { margin-left: 20px; }
}

/* ---- Balkenzeilen (AP5 Stufe 3, 30.08.2026): Rangliste Name/Balken/Zahl
   ohne Diagramm-Bibliothek. Erste Verwendung: „Bots im Zeitraum"
   (app/views/projekt.js kiBotsBotsZeilen(), vorher ein ECharts-Balken ueber
   die Engine-Weiche). Bewusst dieselbe Bauweise wie die Limit-Balken oben —
   Spur + Fuellung, Breite ueber eine Klassen-Skala, weil die CSP
   (style-src 'nonce') kein style-Attribut zulaesst. Hier in FUENFER-
   Schritten statt Zehnern: eine Rangliste soll den Abstand zwischen Platz 2
   und 3 zeigen, dafuer sind 10-Prozent-Stufen zu grob.

   Der Balken ist ZUGABE zur Zahl rechts, nicht ihr Ersatz — deshalb kein
   role/aria am Wrapper (siehe Begruendung an der Erzeugerstelle). ---- */
.balkenzeilen { display: flex; flex-direction: column; margin: 12px 0 18px; }
.balkenzeile {
  display: grid; grid-template-columns: minmax(120px, 200px) 1fr auto;
  align-items: center; gap: 14px; min-height: 40px; padding: 7px 4px;
}
.balkenzeile + .balkenzeile { box-shadow: inset 0 1px 0 var(--line); }
.balkenzeile-name { display: flex; flex-direction: column; gap: 1px; min-width: 0; font-size: var(--fs-body); font-weight: 650; color: var(--text); }
.balkenzeile-kat { font-size: var(--fs-label); font-weight: 500; color: var(--text-3); }
.balkenzeile-spur { display: block; height: 10px; background: var(--surface-2); box-shadow: var(--edge); border-radius: var(--rpill); overflow: hidden; }
.balkenzeile-fuellung { display: block; height: 100%; background: var(--blue); border-radius: var(--rpill); }
/* Farbrollen der drei Bot-Kategorien — dieselbe Zuordnung wie im
   Verlaufs-Chart daneben (KIBOTS_KATEGORIE_FARBE in projekt.js), damit ein
   Bot in beiden Darstellungen dieselbe Farbe traegt. */
.balkenzeile-fuellung--training { background: var(--ki-bot-training); }
.balkenzeile-fuellung--suche { background: var(--ki-bot-suche); }
.balkenzeile-fuellung--nutzer { background: var(--ki-bot-nutzer); }
.balkenzeile-wert { font-family: var(--font-num); font-size: var(--fs-body); font-weight: 750; font-variant-numeric: tabular-nums; color: var(--text); white-space: nowrap; }
.balkenzeile-fuellung--0 { width: 0%; }
.balkenzeile-fuellung--5 { width: 5%; }
.balkenzeile-fuellung--10 { width: 10%; }
.balkenzeile-fuellung--15 { width: 15%; }
.balkenzeile-fuellung--20 { width: 20%; }
.balkenzeile-fuellung--25 { width: 25%; }
.balkenzeile-fuellung--30 { width: 30%; }
.balkenzeile-fuellung--35 { width: 35%; }
.balkenzeile-fuellung--40 { width: 40%; }
.balkenzeile-fuellung--45 { width: 45%; }
.balkenzeile-fuellung--50 { width: 50%; }
.balkenzeile-fuellung--55 { width: 55%; }
.balkenzeile-fuellung--60 { width: 60%; }
.balkenzeile-fuellung--65 { width: 65%; }
.balkenzeile-fuellung--70 { width: 70%; }
.balkenzeile-fuellung--75 { width: 75%; }
.balkenzeile-fuellung--80 { width: 80%; }
.balkenzeile-fuellung--85 { width: 85%; }
.balkenzeile-fuellung--90 { width: 90%; }
.balkenzeile-fuellung--95 { width: 95%; }
.balkenzeile-fuellung--100 { width: 100%; }
@media (max-width: 900px) {
  /* Schmal: Name ueber die volle Breite, Balken und Zahl darunter — eine
     120-px-Namensspalte neben einem Balken laesst fuer beides zu wenig. */
  .balkenzeile { grid-template-columns: 1fr auto; gap: 6px 12px; }
  .balkenzeile-name { grid-column: 1 / -1; }
}

/* ---- KI-Sonde: Ergebnis je Frage (AP5 Stufe 3, 30.08.2026) --------------
   Zeilenliste statt der fruehen Tabelle „Frage x Anbieter" (Erzeuger und
   Begruendung: app/views/projekt.js kiSondeMatrixListe()). Je Zeile die
   ganze Frage, darunter je KI-Dienst der Modellname mit Status-Pille.
   Die Chips umbrechen — anders als Tabellenspalten wachsen sie nicht aus
   dem Bild heraus, wenn ein weiterer Dienst dazukommt. ---- */
.ki-frage-liste { display: flex; flex-direction: column; margin: 12px 0 6px; }
/* Zeilenabstand + Innenluft erhoeht (Auftrag „Fragen entzerren", 06.09.2026,
   Aufgabe cmtpwzgp6): bei fuenf KI-Diensten stiessen Frage-Text und Chip-Reihe
   der naechsten Zeile fast aneinander. */
.ki-frage-zeile { display: flex; align-items: baseline; gap: 12px; padding: 16px 6px; }
.ki-frage-zeile + .ki-frage-zeile { box-shadow: inset 0 1px 0 var(--line); }
.ki-frage-nr { font-family: var(--font-num); font-size: var(--fs-small); font-weight: 800; color: var(--text-3); min-width: 22px; flex-shrink: 0; font-variant-numeric: tabular-nums; }
.ki-frage-inhalt { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 10px; }
.ki-frage-kopf { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.ki-frage-text { font-size: var(--fs-body); line-height: 1.45; color: var(--text); }
.ki-frage-ergebnisse { display: flex; flex-wrap: wrap; gap: 8px 10px; }
.ki-ergebnis { display: inline-flex; align-items: center; gap: 5px; }
/* Status-Pille: derselbe Zustand dreifach kodiert (Form ueber das Symbol,
   Farbe, Wort) — funktioniert farbfehlsichtig und in Graustufen. */
.ki-pill {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 9px; border-radius: var(--rpill); white-space: nowrap;
  font-size: var(--fs-label); font-weight: 650; cursor: help;
  background: var(--surface-2); color: var(--text-2);
}
.ki-pill-symbol { font-size: var(--fs-label); line-height: 1; }
.ki-pill--gut { background: var(--green-dim); color: var(--green); }
.ki-pill--schlecht { background: var(--red-dim); color: var(--red); }
.ki-pill--neutral { background: var(--surface-2); color: var(--text-2); }
.ki-pill--offen { background: transparent; box-shadow: var(--edge); color: var(--text-3); }
@media (max-width: 900px) {
  .ki-frage-zeile { gap: 8px; }
  .ki-frage-nr { min-width: 18px; }
  .ki-frage-text { font-size: var(--fs-body); }
}

/* Passkey-Rueckmeldung unter dem Anlegen-Formular (app/views/passkey.js).
   Eine eigene Klasse und keine .info-Box: die Meldung wechselt waehrend eines
   laufenden Vorgangs mehrfach und soll die Seite dabei nicht springen lassen. */
.app-fuss--fehler { color: var(--red); }


/* KI-Auswertungen: kompakte Bedienelemente, lesbare Modelle statt Initialen. */
#ki-sichtbarkeit .tbl-werkzeuge { gap:8px; margin-block:8px; }
#ki-sichtbarkeit .tbl-werkzeuge input { min-height:32px; height:32px; padding:5px 9px; font-size:var(--fs-label); }
#ki-sichtbarkeit .ki-modell-label { color:var(--sr-mut); font-size:var(--fs-label); overflow-wrap:anywhere; }
#ki-sichtbarkeit .ki-ergebnis { min-width:0; gap:6px; padding:4px 7px; background:var(--sr-soft); border-radius:var(--sr-r-ctl); }
#ki-sichtbarkeit .ki-pill { padding:2px 5px; font-weight:500; border-radius:2px; }
#ki-sichtbarkeit .ki-frage-zeile { padding:12px 2px; }
#ki-sichtbarkeit .ki-frage-inhalt { gap:7px; }
#ki-sichtbarkeit .ki-frage-ergebnisse { gap:6px; }

/* Fragen-Tracking: viele Kennzahlen bleiben scanbar, waehrend die Frage den
   verbleibenden Platz erhaelt. Auf schmalen Ansichten scrollt nur die Tabelle. */
#ki-sichtbarkeit .ki-fragen-tracking-tabelle{max-width:100%;overflow-x:auto}
#ki-sichtbarkeit .ki-fragen-tracking-tabelle table{min-width:1180px;table-layout:auto}
#ki-sichtbarkeit .ki-fragen-tracking-tabelle :is(th,td).ki-ft-klein{width:1%;white-space:nowrap}
#ki-sichtbarkeit .ki-fragen-tracking-tabelle :is(th,td).ki-ft-datum{width:1%;min-width:76px;white-space:nowrap}
#ki-sichtbarkeit .ki-fragen-tracking-tabelle :is(th,td).ki-ft-dienst{width:1%;min-width:72px;white-space:nowrap}
#ki-sichtbarkeit .ki-fragen-tracking-tabelle :is(th,td).ki-ft-herkunft{max-width:112px}
#ki-sichtbarkeit .ki-fragen-tracking-tabelle :is(th,td).ki-ft-mittel{max-width:170px;overflow-wrap:anywhere}
#ki-sichtbarkeit .ki-fragen-tracking-tabelle :is(th,td).ki-ft-frage{min-width:260px;white-space:normal}
#ki-sichtbarkeit .ki-ft-frage-meta{display:flex;align-items:center;gap:4px;flex-wrap:wrap;margin-bottom:4px}
#ki-sichtbarkeit .ki-ft-frage-text{display:block;max-width:52ch;line-height:1.35;overflow-wrap:anywhere}
#ki-sichtbarkeit .ki-ft-nennung{display:inline-flex;align-items:baseline;justify-content:flex-end;gap:4px;font-variant-numeric:tabular-nums}
#ki-sichtbarkeit .ki-ft-nennung>b{color:var(--sr-ink)}
#ki-sichtbarkeit .ki-ft-nennung>span{color:var(--sr-mut)}
#ki-sichtbarkeit .ki-ft-zitat{padding-left:4px;border-left:1px solid var(--sr-hair)}
#ki-sichtbarkeit .ki-ft-kopf-hilfe{cursor:help;text-decoration:underline dotted;text-underline-offset:3px}
#ki-sichtbarkeit .ki-ft-kopf-hilfe:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px;border-radius:3px}
#ki-sichtbarkeit .ki-ft-signalfilter{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:8px 0}
#ki-sichtbarkeit .ki-ft-signalfilter button{min-height:32px;padding:5px 10px;border:1px solid var(--sr-hair);border-radius:2px;background:var(--sr-surface);color:var(--sr-ink);font:inherit}
#ki-sichtbarkeit .ki-ft-signalfilter button[aria-pressed="true"]{border-color:var(--sr-acc-line);background:var(--sr-soft);font-weight:650}
#ki-sichtbarkeit tr[data-ki-signal-versteckt]{display:none}
#ki-sichtbarkeit .ki-ft-antworten-knopf{margin-top:7px;padding:3px 0;border:0;background:transparent;color:var(--sr-acc-ink);font:650 var(--fs-label) var(--font-body);cursor:pointer}
#ki-sichtbarkeit .ki-ft-antworten-knopf:hover{text-decoration:underline}
.ki-fragen-drawer .ki-fragen-drawer-meta{padding:0 24px 16px;color:var(--sr-mut);font-size:var(--fs-small)}
.ki-fragen-drawer .kw-detail-drawer-inhalt>[data-ki-drawer-body]{display:grid;gap:12px}
.ki-fragen-drawer .ki-ft-beleg{padding:16px 18px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-surface)}
.ki-fragen-drawer .ki-ft-beleg-kopf{font-size:var(--fs-small);font-weight:700}
.ki-fragen-drawer .ki-ft-beleg-merkmale{margin:4px 0;color:var(--sr-mut);font-size:var(--fs-label)}
.ki-fragen-drawer .ki-ft-beleg-fehler{margin:10px 0 0;color:var(--sr-warn,var(--sr-mut));font-weight:650}
.ki-fragen-drawer .ki-ft-beleg-gekuerzt{margin:8px 0;color:var(--sr-mut);font-size:var(--fs-label);font-weight:650}
.ki-fragen-drawer .ki-ft-beleg-text{margin:12px 0;white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.55}
.ki-fragen-drawer .ki-ft-beleg-quellen{margin:10px 0 0;padding:10px 0 0 20px;border-top:1px solid var(--sr-hair);font-size:var(--fs-label);overflow-wrap:anywhere}
@media(max-width:599px){.ki-fragen-drawer .ki-fragen-drawer-meta{padding:0 14px 12px}.ki-fragen-drawer .ki-ft-beleg{padding:13px}}
#ki-sichtbarkeit .chart-legende { order:-1; margin-right:auto; flex:1 1 300px; }
#ki-sichtbarkeit .chart-leg-item { padding:4px 6px; min-height:30px; font-size:var(--fs-label); }
#ki-sichtbarkeit .chart-leg-item .leg-text { max-width:none; white-space:normal; overflow:visible; text-overflow:clip; }
#ki-sichtbarkeit .sr-anlegen-form { gap:10px; align-items:end; }
#ki-sichtbarkeit .sr-anlegen-form .feld-eingabe { min-height:34px; padding:6px 9px; font-size:var(--fs-small); }
#ki-sichtbarkeit .sr-anlegen-form > fieldset { grid-column:1 / -1; padding:0; border:0; }
#ki-sichtbarkeit .sr-anlegen-form > fieldset .kw-kosten { display:flex; flex-direction:row; flex-wrap:wrap; gap:8px 18px; }
#ki-sichtbarkeit .sr-anlegen-form > fieldset .kw-kosten-wert { margin:0; }
#ki-sichtbarkeit .sr-anlegen-form > button { justify-self:start; min-height:34px; padding:6px 12px; }
@media (max-width:599px) {
  #ki-sichtbarkeit .ki-ergebnis { flex-wrap:wrap; }
  #ki-sichtbarkeit .chart-zeitraum--kalender { width:100%; justify-content:flex-end; flex-wrap:wrap; }
  #ki-sichtbarkeit .chart-zeitraum-felder { right:0; }
}

.crawler-verbrauch { display:flex; flex-wrap:wrap; gap:10px 26px; margin:14px 0; }
.crawler-verbrauch > div { min-width:95px; }
.crawler-verbrauch dt { font-size:var(--fs-label); color:var(--sr-mut); }
.crawler-verbrauch dd { margin:3px 0 0; font-size:var(--fs-small); font-weight:600; font-variant-numeric:tabular-nums; }

/* Einheitliche Chipform in allen Ansichten; Regler, Avatare und Diagrammpunkte bleiben rund. */
:root body :is(.tag, .sr-chip, .sr-badge, .anb-chip, .anb-zchip, .kw-wahl-chip, .anb-konsole-status, .anb-konsole-aus, .anb-btn-preis, .pk-marke, .ki-pill, .unterkapitel-tab-zahl, .ck-schalter) { border-radius:2px; }
/* Ruhige Auswahlkästchen in allen Farbschemata, klare Auswahl und Tastaturfokus. */
.sr-wahl { appearance:none; border:1px solid color-mix(in srgb,var(--sr-mut) 38%,var(--sr-surface)); border-radius:2px; background:var(--sr-surface); display:inline-grid; place-content:center; }
.sr-wahl:checked, .sr-wahl:indeterminate { background:var(--sr-acc-ink); border-color:var(--sr-acc-ink); }
.sr-wahl:checked::after { content:''; width:8px; height:4px; border-left:2px solid var(--sr-surface); border-bottom:2px solid var(--sr-surface); transform:translateY(-1px) rotate(-45deg); }
.sr-wahl:indeterminate::after { content:''; width:8px; height:2px; background:var(--sr-surface); }
.sr-wahl:focus-visible { outline:2px solid var(--focus-ton); outline-offset:2px; }
@media (forced-colors:active) { .sr-wahl { appearance:auto; } .sr-wahl::after { display:none; } }

/* ═══════════════════════════════════════════ Auftritt der Oberfläche ═══════
 * Betreiber-Auftrag 12.09.2026. Jede Seite baut sich von links oben nach
 * rechts unten auf: die Kacheln steigen mit einem kurzen Überschwingen ein,
 * ein Lichtstreifen läuft einmal diagonal über sie, der Rand glüht kurz in
 * der Akzentfarbe. Δ-Pillen und Badges ploppen nach, die BETA-Chips blinken
 * zweimal, Kennzahlen zählen hoch (das Zählen steht in app.js).
 *
 * ARBEITSTEILUNG. Dieses Stylesheet hält die Bewegung und 24 Stufen; app.js
 * verteilt die Stufen nach der Position der Kachel. Ohne JavaScript bleibt
 * der Grundzustand: jede Kachel tritt mit der Vorgabestufe auf — nichts
 * bleibt unsichtbar, und es gibt kein Aufblitzen vor dem Skript, weil der
 * Anfangszustand schon beim Parsen steht und nicht erst gesetzt wird.
 *
 * KEINE style-ATTRIBUTE. Die Inhaltssicherheitsregel (style-src 'nonce')
 * verwürfe sie stumm. Verzögerung und Dauer kommen deshalb aus
 * Eigenschaften, die die Stufenklassen setzen — app.js fasst kein
 * element.style an.
 *
 * KEIN LAYOUT-SPRUNG. Bewegt werden ausschliesslich opacity, transform,
 * filter und box-shadow. `position:relative` für den Lichtstreifen setzt
 * app.js nur an Kacheln, die vorher `static` standen; nach dem Auftritt
 * fallen alle Klassen wieder weg.
 *
 * ABGELÖST (nichts läuft doppelt):
 *   seo-karte-ein  → die Mega-Menü-Kacheln nutzen jetzt sr-auftritt-ein,
 *                    die alten Keyframes sind entfallen.
 *   seo-eintritt / sr-kapitel-auf (sr.css) → beide blenden den SEKTIONS-
 *                    RAHMEN ein, in dem die Kacheln liegen. Während des
 *                    Auftritts sind sie abgeschaltet, sonst federt jede
 *                    Kachel zweimal (Rahmen + sich selbst). Beim
 *                    Kapitelwechsel wirken sie unverändert weiter.
 *   Kennzahl-Karten (app.js Baustein 8) → der Einzel-Aufbau der Zahl in der
 *                    Karte entfällt, solange der Auftritt läuft.
 */
:root{
  --sr-auf-ease:cubic-bezier(.2,.8,.2,1);
  --sr-auf-glow:color-mix(in srgb,var(--accent) 16%,transparent);
  --sr-auf-sheen:color-mix(in srgb,var(--accent) 20%,transparent);
  /* RUECKFALL, KEINE EINSTELLUNG. Diese Werte treffen genau den Zustand vor
     dem 12.09.2026; die echten kommen aus dem Nonce-Stil der Seite
     (app/views/layout.js, gerechnet in app/lib/darstellung.js auftrittMasse).
     Sie stehen hier, damit ein Stylesheet ohne Seite — Bericht, Druckansicht,
     eine Sonde auf einer Attrappe — nicht ohne Zahlen dasteht. */
  --sr-auf-vor:40ms;    /* Vorlauf vor der ersten Kachel */
  --sr-auf-takt:38ms;   /* Abstand von Stufe zu Stufe */
  --sr-auf-basis:420ms; /* kuerzeste Kacheldauer */
  --sr-auf-schritt:20ms;/* Staffelung der Dauer ueber die Stufen */
  --sr-auf-weg:18px;    /* Weg, den eine Kachel zuruecklegt */
  --sr-auf-skala:.965;  /* Groesse beim Eintreffen */
  --sr-auf-ueber:1.008; /* Ueberschwingen bei der Landung */
  --sr-auf-schein:1;    /* Staerke des Lichtstreifens, 0–1 */
  --sr-auf-glut:1;      /* Staerke des Gluehens, 0–2 */
  --sr-auf-zeile-takt:18ms;
  --sr-auf-zeile-dauer:220ms;
}
/* Glühen je Modus abgestuft: auf hellem Grund reicht wenig, im Dunkeln
   verschluckt der Untergrund den Schein. Der Streifen kehrt sich um — auf
   Weiss zeichnet ein Akzentton, auf dunklen Flächen Licht. */
[data-theme="light"]{
  --sr-auf-glow:color-mix(in srgb,var(--accent) 16%,transparent);
  --sr-auf-sheen:color-mix(in srgb,var(--accent) 20%,transparent);
}
[data-theme="medium"]{
  --sr-auf-glow:color-mix(in srgb,var(--accent) 26%,transparent);
  --sr-auf-sheen:color-mix(in srgb,#ffffff 16%,transparent);
}
[data-theme="dark"]{
  --sr-auf-glow:color-mix(in srgb,var(--accent) 36%,transparent);
  --sr-auf-sheen:color-mix(in srgb,#ffffff 12%,transparent);
}

/* ZWEI KURVEN, EINE DAVON NUR FUER DEN FALL OHNE JAVASCRIPT.
 *
 * `sr-auftritt-halt` ist der Grundzustand: eine schlichte Blende nach 900 ms.
 * Sie haelt die Kacheln bis dahin unsichtbar — dafuer ist sie da — und bringt
 * sie auch dann ans Licht, wenn nie ein Skript laeuft. Die 900 ms sind die
 * Frist, die das Buendel bekommt; mit Skript sieht sie niemand, weil die
 * Choreografie in dem Moment uebernimmt, in dem es eintrifft (typisch nach
 * 200-500 ms).
 *
 * `sr-auftritt-ein` ist die eigentliche Choreografie. Sie traegt einen EIGENEN
 * NAMEN, und genau das ist der Punkt: ein Wechsel des Animationsnamens laesst
 * die Kurve in dem Moment neu beginnen, in dem app.js die Stufe setzt. Die
 * Staffelung zaehlt damit ab dem Skript und nicht ab dem Parsen.
 *
 * WARUM NICHT EINFACH DIE VERZOEGERUNG AENDERN (Betreiber-Befund 12.09.2026,
 * „das Zucken"). Genau das stand hier bis zum 12.09.: eine Kurve, deren
 * Verzoegerung das Skript nachtraeglich verstellte. Das Buendel haengt als
 * `defer` im Kopf und laeuft je nach Geraet 200-400 ms nach dem ersten Bild —
 * die fruehen Kacheln waren da schon gelandet, und eine groessere Verzoegerung
 * drehte ihre Kurve zurueck. Im Video: die Seite steht fertig da, springt
 * zurueck auf unsichtbar und baut sich ein zweites Mal auf.
 *
 * DAS UEBERSCHWINGEN IST FLACH (1,008 statt 1,012, selber Befund): die Landung
 * soll sitzen, nicht federn.
 */
@keyframes sr-auftritt-halt{from{opacity:0}to{opacity:1}}
@keyframes sr-auftritt-ein{
  0%{opacity:0;transform:translateY(var(--sr-auf-weg)) scale(var(--sr-auf-skala))}
  70%{opacity:1;transform:translateY(0) scale(var(--sr-auf-ueber))}
  100%{opacity:1;transform:none}
}
/* VIER WEITERE ARTEN (Betreiber-Auftrag 12.09.2026, Verwaltung → Darstellung →
   Auftritt). Jede traegt einen eigenen Namen; ausgewaehlt wird ueber
   data-auf-art am <html> (Regel weiter unten), nicht ueber eine Umschaltung
   der Keyframe-Werte. Ein Name je Art heisst: der Wechsel der Einstellung
   startet die Kurve neu, statt sie mitten im Lauf umzudeuten. */
@keyframes sr-auftritt-blenden{
  0%{opacity:0}
  100%{opacity:1}
}
@keyframes sr-auftritt-skalieren{
  0%{opacity:0;transform:scale(var(--sr-auf-skala))}
  70%{opacity:1;transform:scale(var(--sr-auf-ueber))}
  100%{opacity:1;transform:none}
}
/* „Von unten schieben": derselbe Weg wie beim Einschweben, nur laenger und
   ohne Groessenwechsel — die Kachel faehrt herein, statt zu wachsen. */
@keyframes sr-auftritt-schieben{
  0%{opacity:0;transform:translateY(calc(var(--sr-auf-weg) * 2.4))}
  100%{opacity:1;transform:none}
}
/* „Nur erscheinen": die Staffelung bleibt, die Bewegung faellt weg. Der
   Sprung von 0 auf 1 gehoert zur Kurve (steps(1,end) an der Regel unten) —
   eine Blende waere wieder eine Bewegung. */
@keyframes sr-auftritt-poppen{
  0%{opacity:0}
  100%{opacity:1}
}
/* Lichtstreifen: das Bild ist breiter als die Kachel und wandert einmal
   hindurch. Es liegt auf dem ::after der Kachel und ist damit auf deren
   Radius beschnitten — ohne Eingriff in overflow, das an .sr-kpi
   ausdrücklich nicht gesetzt werden darf (siehe sr-bausteine.css). */
@keyframes sr-auftritt-sheen{
  0%{background-position:130% 0;opacity:0}
  10%{opacity:var(--sr-auf-schein,1)}
  70%{opacity:var(--sr-auf-schein,1)}
  80%,100%{background-position:-30% 0;opacity:0}
}
/* Das Glühen sitzt auf DEMSELBEN ::after, nicht auf der Kachel: ein
   box-shadow an der Kachel selbst würde deren eigenen Schatten für die
   Dauer der Runde ersetzen und am Ende sichtbar zurückspringen. */
@keyframes sr-auftritt-glow{
  0%{box-shadow:0 0 0 0 transparent}
  40%{box-shadow:0 0 0 1px var(--sr-auf-glow),
      0 0 calc(18px * var(--sr-auf-glut,1)) calc(2px * var(--sr-auf-glut,1)) var(--sr-auf-glow)}
  100%{box-shadow:0 0 0 0 transparent}
}
@keyframes sr-auftritt-pop{
  0%{transform:scale(1)}
  45%{transform:scale(1.15)}
  100%{transform:scale(1)}
}
/* Zwei kurze Blitze zu je 160 ms. Der Chip wird hell, nicht gross — eine
   Skalierung würde die Zeile umbrechen lassen. */
@keyframes sr-beta-blitz{
  0%{filter:brightness(1);box-shadow:0 0 0 0 transparent;background:transparent;border-color:var(--beta-rand-ruhe)}
  25%{filter:brightness(1.6);box-shadow:0 0 9px 1px var(--beta-glow),0 0 18px 5px var(--beta-glow-weit);background:var(--beta-flaeche-peak);border-color:var(--beta-rand)}
  50%{filter:brightness(1);box-shadow:0 0 0 0 transparent;background:transparent;border-color:var(--beta-rand-ruhe)}
  75%{filter:brightness(1.6);box-shadow:0 0 9px 1px var(--beta-glow),0 0 18px 5px var(--beta-glow-weit);background:var(--beta-flaeche-peak);border-color:var(--beta-rand)}
  100%{filter:brightness(1);box-shadow:0 0 0 0 transparent;background:transparent;border-color:var(--beta-rand-ruhe)}
}
@keyframes sr-abgang-aus{
  from{opacity:1;transform:none}
  to{opacity:0;transform:translateY(-8px) scale(.985)}
}
@keyframes sr-auftritt-blende{from{opacity:0}to{opacity:1}}

/* DIE BAUSTEINE, die auftreten. Eine Kachel in einer Kachel tritt NICHT
   eigenständig auf (zweite Regel) — sonst federte der Inhalt gegen seinen
   eigenen Rahmen. Tabellenzeilen, Zahlen und Texte bleiben ohnehin aussen
   vor; bewegt wird nur, was einen eigenen Rahmen hat. */
:is(.sr-karte,.sr-kpi,.sr-thema,.card,.anb-karte,.limit-kachel,.projekt-karte,
    .ck-w,.ck-karte,.ck-mosaik-kpi,.ck-seite){
  animation:sr-auftritt-halt var(--sr-auf-dauer,260ms) var(--sr-auf-ease) var(--sr-auf-verz,900ms) both;
}
:is(.sr-karte,.sr-kpi,.sr-thema,.card,.anb-karte,.limit-kachel,.projekt-karte,
    .ck-w,.ck-karte,.ck-mosaik-kpi,.ck-seite)
:is(.sr-karte,.sr-kpi,.sr-thema,.card,.anb-karte,.limit-kachel,.projekt-karte,
    .ck-w,.ck-karte,.ck-mosaik-kpi,.ck-seite){
  animation:none;
}
/* Der Lichtstreifen hängt an der Stufenklasse, nicht am Grundzustand: ohne
   JavaScript gibt es die Bewegung, aber keinen Streifen. Doppelte Klasse für
   die Spezifität — app.css ist der ZWEITE Teil des Bündels, spätere Teile
   (sr.css, sr-bausteine.css, cockpit.css) gewännen sonst bei Gleichstand. */
/* Mit Stufe: die richtige Kurve, und sie faengt hier an zu laufen. */
.sr-auftritt{animation-name:sr-auftritt-ein}
.sr-auftritt.sr-auftritt--rel{position:relative}
.sr-auftritt.sr-auftritt::after{
  content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;z-index:4;
  opacity:0;
  background:linear-gradient(115deg,transparent 42%,var(--sr-auf-sheen) 50%,transparent 58%);
  background-size:220% 100%;background-repeat:no-repeat;
  /* DIE ZWEI DAUERN FOLGEN DEM TEMPO (12.09.2026). Sie standen als 700 ms und
     560 ms fest da — bei doppelter Geschwindigkeit wäre der Lichtstreifen
     dann über der schon gelandeten Kachel weitergelaufen. Die Faktoren 1,67
     und 1,33 auf die Grunddauer treffen bei 420 ms die alten Werte. */
  animation:sr-auftritt-sheen calc(var(--sr-auf-basis) * 1.67) var(--sr-auf-ease) var(--sr-auf-verz,40ms) both,
            sr-auftritt-glow calc(var(--sr-auf-basis) * 1.33) var(--sr-auf-ease) var(--sr-auf-verz,40ms) both;
}
/* Δ-Pillen und Badges ploppen 120 ms nach ihrer Kachel — der Blick ist dann
   schon dort. */
.sr-auftritt .ck-delta,.sr-auftritt .ck-mosaik-delta,.sr-auftritt .sr-badge{
  animation:sr-auftritt-pop 240ms var(--sr-auf-ease) calc(var(--sr-auf-verz,40ms) + 120ms) both;
}
/* BETA-Chips blinken, sobald ihre Kachel steht. Die Verzögerung erbt der
   Chip über --sr-auf-verz von der Kachel; Chips ausserhalb einer Kachel
   (Navigation) fallen auf den Vorgabewert zurück. */
html.sr-auftritt-lauf .sr-beta{
  animation:sr-beta-blitz 320ms steps(1,end) calc(var(--sr-auf-verz,120ms) + 240ms) both;
}
/* SEKTIONSRAHMEN STILL, SOLANGE DER AUFTRITT LÄUFT (siehe Kopf, „abgelöst").
 *
 * VORGEZOGEN STATT ABGESCHALTET (Betreiber-Befund 12.09.2026, „das Zucken am
 * Ende"). Hier stand `animation:none`. Das hat die laufende Sektionskurve
 * ABGEBROCHEN — und als app.js die Klasse am Ende wieder abnahm, fing sie von
 * vorn an: die ganze Seite sprang 8 px nach unten und federte über 160 ms
 * zurück, rund eine halbe Sekunde nachdem alles gelandet war (gemessen
 * 12.09.2026: y 76 → 84 → 81 → 78 → 77 → 76 bei 2523–2621 ms).
 *
 * Eine negative Verzögerung bricht nichts ab: dieselbe Animation läuft
 * weiter, nur eine Sekunde weiter vorn — also längst über ihr Ende hinaus.
 * Sie zeigt damit sofort ihren Endzustand und hat keinen Rest mehr, der
 * später noch laufen könnte. Fällt die Klasse, steht die Verzögerung wieder
 * auf 0 und die Animation ist nach der verstrichenen Zeit ohnehin durch —
 * es gibt nichts, was neu beginnen könnte.
 *
 * Der Zweck bleibt derselbe: kein zweites Federn des Rahmens, während die
 * Kacheln darin selbst auftreten. Beim Kapitelwechsel wirken beide Kurven
 * unverändert weiter. */
html.sr-auftritt-lauf .content .section{animation-delay:-1s}
html.sr-auftritt-lauf .sr-body>.section:not([hidden]){animation-delay:-1s}

/* NACH DEM AUFTRITT IST SCHLUSS. Ohne diese Regel bliebe die Kurzschreibweise
   mit `both` fuer immer in Kraft: der Endwert `transform:none` wird waehrend
   einer Transform-Interpolation als Einheitsmatrix gefuehrt, und die Kachel
   meldete danach dauerhaft `matrix(1, 0, 0, 1, 0, 0)` statt `none`. Das ist
   kein Schoenheitsfehler — eine Kachel mit Transform ist Bezugsrahmen fuer
   alles, was fest oder klebend in ihr haengt, und verschoebe Popover.
   app.js setzt die Marke, wenn die letzte Runde durch ist. */
html.sr-auftritt-fertig
:is(.sr-karte,.sr-kpi,.sr-thema,.card,.anb-karte,.limit-kachel,.projekt-karte,
    .ck-w,.ck-karte,.ck-mosaik-kpi,.ck-seite){animation:none}

/* Abgang beim Zeitraumwechsel: rechts unten zuerst. Beide Schreibweisen, weil
   der Abgang auch NACH dem Auftritt greifen muss und die Abschaltregel oben
   sonst gewaenne. */
.sr-abgang,
html.sr-auftritt-fertig .sr-abgang{animation:sr-abgang-aus 140ms var(--sr-auf-ease) var(--sr-ab-verz,0ms) both}
.sr-abgang.sr-abgang::after{animation:none;opacity:0}

/* STUFEN 0…23 — NUR NOCH DIE NUMMER, NICHT MEHR DIE ZEIT (12.09.2026).
   Bis hierher trug jede der 24 Klassen drei fertige Millisekundenwerte. Damit
   war die Choreografie nicht einstellbar: eine andere Geschwindigkeit hätte
   72 Zahlen neu schreiben müssen, und zwar hier, wo kein Formular hinreicht.
   Jetzt trägt die Klasse ihre Stufe und ihren Platz in der Dauerfolge; die
   Rechnung steht in der Regel darunter und greift auf --sr-auf-takt,
   --sr-auf-basis und --sr-auf-schritt zu — die drei kommen aus dem Nonce-Stil
   der Seite und damit aus der Einstellung des Mandanten.

   DIE DAUERFOLGE IST DIESELBE GEBLIEBEN: (Stufe·7) mod 12, mal Schrittweite,
   auf die Grunddauer. Bei 40/38/420/20 ms ergibt das Zeichen für Zeichen die
   alten Werte (420…640 ms in fester Folge, nicht gewürfelt — zwei Läufe
   derselben Seite sehen gleich aus).

   --sr-ab-verz kehrt die Reihenfolge für den Abgang um und fällt mit dem Takt:
   bei Stufe 0 sind es 23·Takt·0,23 (bei 38 ms die alten 201 ms), bei Stufe 23
   null. */
[class*="sr-auftritt-r"]{
  --sr-auf-verz:calc(var(--sr-auf-vor) + var(--sr-auf-stufe,0) * var(--sr-auf-takt));
  --sr-auf-dauer:calc(var(--sr-auf-basis) + var(--sr-auf-dauer-n,0) * var(--sr-auf-schritt));
  --sr-ab-verz:calc((23 - var(--sr-auf-stufe,0)) * var(--sr-auf-takt) * .23);
}
.sr-auftritt-r0{--sr-auf-stufe:0;--sr-auf-dauer-n:0}
.sr-auftritt-r1{--sr-auf-stufe:1;--sr-auf-dauer-n:7}
.sr-auftritt-r2{--sr-auf-stufe:2;--sr-auf-dauer-n:2}
.sr-auftritt-r3{--sr-auf-stufe:3;--sr-auf-dauer-n:9}
.sr-auftritt-r4{--sr-auf-stufe:4;--sr-auf-dauer-n:4}
.sr-auftritt-r5{--sr-auf-stufe:5;--sr-auf-dauer-n:11}
.sr-auftritt-r6{--sr-auf-stufe:6;--sr-auf-dauer-n:6}
.sr-auftritt-r7{--sr-auf-stufe:7;--sr-auf-dauer-n:1}
.sr-auftritt-r8{--sr-auf-stufe:8;--sr-auf-dauer-n:8}
.sr-auftritt-r9{--sr-auf-stufe:9;--sr-auf-dauer-n:3}
.sr-auftritt-r10{--sr-auf-stufe:10;--sr-auf-dauer-n:10}
.sr-auftritt-r11{--sr-auf-stufe:11;--sr-auf-dauer-n:5}
.sr-auftritt-r12{--sr-auf-stufe:12;--sr-auf-dauer-n:0}
.sr-auftritt-r13{--sr-auf-stufe:13;--sr-auf-dauer-n:7}
.sr-auftritt-r14{--sr-auf-stufe:14;--sr-auf-dauer-n:2}
.sr-auftritt-r15{--sr-auf-stufe:15;--sr-auf-dauer-n:9}
.sr-auftritt-r16{--sr-auf-stufe:16;--sr-auf-dauer-n:4}
.sr-auftritt-r17{--sr-auf-stufe:17;--sr-auf-dauer-n:11}
.sr-auftritt-r18{--sr-auf-stufe:18;--sr-auf-dauer-n:6}
.sr-auftritt-r19{--sr-auf-stufe:19;--sr-auf-dauer-n:1}
.sr-auftritt-r20{--sr-auf-stufe:20;--sr-auf-dauer-n:8}
.sr-auftritt-r21{--sr-auf-stufe:21;--sr-auf-dauer-n:3}
.sr-auftritt-r22{--sr-auf-stufe:22;--sr-auf-dauer-n:10}
.sr-auftritt-r23{--sr-auf-stufe:23;--sr-auf-dauer-n:5}

/* ART DES EINTRITTS — die Auswahl steht am <html> (app/views/layout.js,
   data-auf-art). Verzögerung, Dauer und Stufe bleiben in jeder Art dieselben;
   es wechselt nur, WAS während dieser Zeit passiert. Zwei Klassen für die
   Spezifität, aus demselben Grund wie oben: app.css ist der zweite Teil des
   Bündels. */
html[data-auf-art="aufblenden"] .sr-auftritt.sr-auftritt{animation-name:sr-auftritt-blenden}
html[data-auf-art="skalieren"] .sr-auftritt.sr-auftritt{animation-name:sr-auftritt-skalieren}
html[data-auf-art="schieben-unten"] .sr-auftritt.sr-auftritt{animation-name:sr-auftritt-schieben}
html[data-auf-art="erscheinen"] .sr-auftritt.sr-auftritt{
  animation-name:sr-auftritt-poppen;animation-timing-function:steps(1,end);
}
/* Ohne Bewegung auch ohne Lichtstreifen: „Nur erscheinen" heißt, dass nichts
   über die Kachel läuft. Das Glühen fällt mit — beide sitzen auf demselben
   ::after. */
html[data-auf-art="erscheinen"] .sr-auftritt.sr-auftritt::after{content:none}

/* ═══ TABELLEN BAUEN SICH ZEILENWEISE AUF ═══════════════════════════════════
 * Betreiber-Auftrag 12.09.2026: „wie eine schnelle Maschine". Der Versatz ist
 * klein (12–25 ms je Zeile, aus der Geschwindigkeit), und die ganze Tabelle
 * steht nach spätestens rund 600 ms — ab der letzten Stufe erscheint alles
 * gemeinsam. Die Stufen verteilt app/views/app.js, den Deckel rechnet
 * app/lib/darstellung.js.
 *
 * NUR DIE SICHTBARKEIT LÄUFT NACH. Bewegt wird ausschließlich `opacity`; die
 * Zeile steht vom ersten Bild an im Dokument, trägt ihre Höhe und ist
 * anklickbar. Ein Aufbau, der Zeilen erst einhängt oder auf
 * `visibility:hidden` legt, hält den Zeiger auf — das wäre eine Wartezeit,
 * keine Choreografie.
 *
 * KEIN transform. Eine Zeile mit Transform ist Bezugsrahmen für alles, was
 * fest oder klebend in ihr hängt, und der klebende Tabellenkopf rutschte
 * darunter. */
@keyframes sr-zeile-ein{from{opacity:0}to{opacity:1}}
.sr-zeile-auf.sr-zeile-auf{
  /* DER VERSATZ ZÄHLT AB DEM MOMENT, IN DEM DIE KLASSE GESETZT WIRD, und
     enthält den Vorlauf der Kachel NICHT. Er stand hier kurzzeitig als
     Summand `var(--sr-auf-verz)` — das ging schief: die Zeile erbt diesen
     Wert von der Stufenklasse ihres Rahmens, und sobald die fällt, springt
     die Verzögerung zurück und die restlichen Zeilen blitzen auf einen
     Schlag auf. Auf ihre Kachel wartet die Tabelle jetzt über einen
     Zeitgeber in app/views/app.js. */
  --sr-zeile-verz:calc(var(--sr-zeile-stufe,0) * var(--sr-auf-zeile-takt));
  animation:sr-zeile-ein var(--sr-auf-zeile-dauer) var(--sr-auf-ease) var(--sr-zeile-verz) both;
}
.sr-zeile-s0{--sr-zeile-stufe:0}
.sr-zeile-s1{--sr-zeile-stufe:1}
.sr-zeile-s2{--sr-zeile-stufe:2}
.sr-zeile-s3{--sr-zeile-stufe:3}
.sr-zeile-s4{--sr-zeile-stufe:4}
.sr-zeile-s5{--sr-zeile-stufe:5}
.sr-zeile-s6{--sr-zeile-stufe:6}
.sr-zeile-s7{--sr-zeile-stufe:7}
.sr-zeile-s8{--sr-zeile-stufe:8}
.sr-zeile-s9{--sr-zeile-stufe:9}
.sr-zeile-s10{--sr-zeile-stufe:10}
.sr-zeile-s11{--sr-zeile-stufe:11}
.sr-zeile-s12{--sr-zeile-stufe:12}
.sr-zeile-s13{--sr-zeile-stufe:13}
.sr-zeile-s14{--sr-zeile-stufe:14}
.sr-zeile-s15{--sr-zeile-stufe:15}
.sr-zeile-s16{--sr-zeile-stufe:16}
.sr-zeile-s17{--sr-zeile-stufe:17}
.sr-zeile-s18{--sr-zeile-stufe:18}
.sr-zeile-s19{--sr-zeile-stufe:19}
.sr-zeile-s20{--sr-zeile-stufe:20}
.sr-zeile-s21{--sr-zeile-stufe:21}
.sr-zeile-s22{--sr-zeile-stufe:22}
.sr-zeile-s23{--sr-zeile-stufe:23}
.sr-zeile-s24{--sr-zeile-stufe:24}
.sr-zeile-s25{--sr-zeile-stufe:25}
.sr-zeile-s26{--sr-zeile-stufe:26}
.sr-zeile-s27{--sr-zeile-stufe:27}
.sr-zeile-s28{--sr-zeile-stufe:28}
.sr-zeile-s29{--sr-zeile-stufe:29}
.sr-zeile-s30{--sr-zeile-stufe:30}
.sr-zeile-s31{--sr-zeile-stufe:31}

/* ═══ KLASSISCHE DIAGRAMME ZEICHNEN SICH VON LINKS ══════════════════════════
 * Das Server-SVG ist fertig, wenn es ankommt — es gibt keine Reihe, die man
 * einzeln wachsen lassen könnte. „Linien zeichnen sichtbar von links nach
 * rechts" wird deshalb als Blende über die ganze Zeichenfläche gelöst:
 * clip-path fährt von der rechten Kante nach links auf.
 *
 * `backwards`, NICHT `both`. Mit `both` bliebe clip-path danach stehen, und
 * ein geclipptes Element schneidet alles ab, was über seinen Rand ragt —
 * Tooltips und Beschriftungen. So gilt der Anfangszustand während der
 * Verzögerung und danach gar nichts mehr.
 *
 * Die Zeit kommt aus der Kachel: --sr-auf-verz und --sr-auf-dauer erbt die
 * Figur von der Stufenklasse ihres Rahmens. */
@keyframes sr-svg-wisch{from{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0 0 0 0)}}
.sr-auftritt figure.chart-wrap{
  animation:sr-svg-wisch calc(var(--sr-auf-dauer) * 1.1) var(--sr-auf-ease)
            calc(var(--sr-auf-verz) + 60ms) backwards;
}
html[data-auf-art="erscheinen"] .sr-auftritt figure.chart-wrap{animation:none}

/* Messhilfe: schaltet den Auftritt vollständig ab, damit eine Sonde die
   Ruhelage der Kacheln aufnehmen kann (Nachweis „kein Layout-Sprung"). */
html.sr-auftritt-stumm :is(.sr-karte,.sr-kpi,.sr-thema,.card,.anb-karte,.limit-kachel,.projekt-karte,
    .ck-w,.ck-karte,.ck-mosaik-kpi,.ck-seite){animation:none}
html.sr-auftritt-stumm .sr-auftritt.sr-auftritt::after{content:none}
html.sr-auftritt-stumm .sr-zeile-auf.sr-zeile-auf{animation:none}
html.sr-auftritt-stumm .sr-auftritt figure.chart-wrap{animation:none}

/* Bewegungsarme Darstellung: eine Blende von 120 ms, sonst nichts. Keine
   Verzögerung, kein Lichtstreifen, kein Blinken, kein Hochzählen (app.js
   steigt dafür vorher aus). */
@media (prefers-reduced-motion:reduce){
  :is(.sr-karte,.sr-kpi,.sr-thema,.card,.anb-karte,.limit-kachel,.projekt-karte,
      .ck-w,.ck-karte,.ck-mosaik-kpi,.ck-seite){animation:sr-auftritt-blende 120ms linear both}
  .sr-auftritt.sr-auftritt::after{content:none}
  .sr-auftritt .ck-delta,.sr-auftritt .ck-mosaik-delta,.sr-auftritt .sr-badge{animation:none}
  html.sr-auftritt-lauf .sr-beta{animation:none}
  .sr-abgang{animation:none}
  /* Der Zeilenaufbau und die Blende ueber den klassischen Diagrammen sind
     Bewegung wie jede andere: bewegungsarm steht beides sofort da. */
  .sr-zeile-auf.sr-zeile-auf{animation:none}
  .sr-auftritt figure.chart-wrap{animation:none}
  /* Die Mega-Menue-Kacheln teilen sich die Kurve mit dem Auftritt und damit
     auch das Ueberschwingen. Bewegungsarm heisst hier: sie sind einfach da.
     Die Regel weiter oben stellt nur das Panel still, nicht seine Kacheln. */
  .mega-panel:not([hidden]) .mega-karte{animation:none}
}

/* --- Serien-Mehrfachfilter (generisch, app.js) ---------------------------
   Optisch am Eigen/GSC-Schalter der Keyword-Tabelle orientiert (keyword-
   quellen.css .kw-quellen-filter), aber eigene Klassen fuer eine BELIEBIGE
   Zahl benannter Serien statt zweier fest benannter Knoepfe. */
.sr-serienfilter{display:flex;align-items:center;flex-wrap:wrap;gap:4px;margin:0 0 var(--s2);color:var(--sr-mut);font-size:var(--fs-label)}
.sr-serienfilter button{box-sizing:border-box;display:inline-flex;align-items:center;gap:5px;min-height:30px;padding:4px 9px;border:0;border-radius:var(--sr-r-ctl);background:transparent;color:var(--sr-mut);font:inherit;font-weight:var(--fw-ui);cursor:pointer;opacity:.68;white-space:nowrap}
.sr-serienfilter button:hover{background:var(--sr-soft);color:var(--sr-ink)}
.sr-serienfilter button[aria-pressed="true"]{background:var(--sr-soft);color:var(--sr-ink);opacity:1}
.sr-serienfilter button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.sr-serie-punkt{width:7px;height:7px;flex:0 0 7px;border-radius:50%;background:var(--sr-mut)}
.sr-serienfilter button[aria-pressed="true"] .sr-serie-punkt{background:var(--sr-acc)}
.sr-serie-zahl{color:var(--sr-mut);font-variant-numeric:tabular-nums}
.sr-serie-leer{margin:var(--s2) 0}
@media (max-width:600px){ .sr-serienfilter{flex-wrap:wrap} }


/* ---- sr.css ---- */
/* ===========================================================================
 * sr.css — Oberflaeche nach dem Design-Paket „SEO-Radar R3" (30.08.2026).
 *
 * WARUM EINE EIGENE DATEI: app.css ist in acht Wochen auf 145 KB gewachsen und
 * beschreibt die Huelle, die R3 ersetzt (dunkler Kopfbalken, drei Titelebenen,
 * Kapitel in der Seitenleiste). Beides in einer Datei zu mischen haette bei
 * jeder Regel die Frage aufgeworfen, welche der beiden Welten gemeint ist.
 * Hier steht ausschliesslich R3; app.css traegt weiter die Inhalte, die noch
 * nicht umgestellt sind, und folgt ueber die Token-Bruecke in theme.css
 * derselben Palette.
 *
 * KEINE FARBWERTE IN DIESER DATEI. Alles kommt aus --sr-* (theme.css) — sonst
 * prueft scripts/css-pruefen.js an einer Farbe vorbei, die es nicht kennt.
 *
 * KEINE style-ATTRIBUTE im Markup: die CSP erlaubt nur Stylesheets mit Nonce.
 * Werte, die aus Daten kommen (Balkenlaengen, Ringfuellungen), laufen deshalb
 * ueber Klassenskalen (.sr-bar-f--0 … --100) statt ueber style="width:…".
 *
 * NIE `*` direkt vor `/` in einem Kommentar — das beendet ihn vorzeitig und
 * verschluckt den folgenden Block (Vorfall 29.08.2026, theme.css :root).
 * ========================================================================= */

/* ------------------------------------------------------------------ Huelle */
.sr-app{display:flex;min-height:100vh;background:var(--sr-bg);color:var(--sr-ink);
  font-size:var(--fs-ui);line-height:var(--lh-body)}
/* HAUSSCHRIFT, NICHT SYSTEMSCHRIFT (03.09.2026). Hier stand bis dahin ein
   reiner System-Stack — er ueberschrieb das 'Inter' aus theme.css, und weil
   theme.css die Datei ohnehin nicht auslieferte, fiel niemandem auf, dass die
   Anwendung auf jedem Geraet anders aussah. Beides ist jetzt behoben:
   theme.css bringt @font-face, hier steht wieder derselbe Stack. */
.sr-app,.sr-app input,.sr-app select,.sr-app button,.sr-app textarea{
  font-family:var(--font-body)}
.sr-app :where(a){color:var(--sr-acc-ink);text-decoration:none}
.sr-app :where(a):hover{text-decoration:underline}
.sr-zahl{font-variant-numeric:tabular-nums}

/* ------------------------------------------------------------- Marken-Signet
 * DIE 52-PX-ICON-LEISTE IST WEG (Betreiber-Ansage 30.08.2026, Runde 5). Was
 * sie trug, steht jetzt woanders: der Einstieg in die Uebersicht liegt auf
 * dem Signet, die persoenlichen Werkzeuge im Seitenleistenfuss. Damit
 * entfallen --sr-rail, --sr-rail-ink und
 * --sr-rail-w aus theme.css und die zweite Schublade in theme.js.
 *
 * Das Signet steht seither auf HELLEM Grund. Seine Farben kommen deshalb
 * ausnahmslos aus Tokens (layout.js markenIcon() traegt nur noch Klassen) —
 * die frueheren festen Werte Weiss und #00abd7 waren auf den dunklen
 * Kopfbalken gerechnet, den es seit C1 nicht mehr gibt. */
.sr-marke-logo{width:26px;height:26px;display:block;flex-shrink:0}
.sr-marke-logo .rk-aussen{stroke:var(--sr-mut)}
.sr-marke-logo .rk-ring{stroke:var(--sr-acc);opacity:.5}
.sr-marke-logo .rk-ring--innen{opacity:.3}
.sr-marke-logo .rk-kreuz{stroke:var(--sr-ink);opacity:.22}
.sr-marke-logo .rk-kegel{fill:var(--sr-acc);opacity:.22}
.sr-marke-logo .rk-strahl{stroke:var(--sr-acc)}
.sr-marke-logo .rk-blip{fill:var(--sr-acc)}
.sr-marke-logo .rk-kern{fill:var(--sr-ink)}
/* Kegel-Drehung und Blip-Aufleuchten: die Keyframes radar-dreh/radar-blip
   stehen in app.css, die Verzoegerungen sind auf die Winkel der drei Punkte
   gerechnet (siehe layout.js markenIcon()).
   EIN DURCHLAUF, DANN STILLSTAND (Veto 6, WCAG 2.2.2). Das Signet lief
   endlos — eine Bewegung ueber fuenf Sekunden, die niemand anhalten kann.
   Der Kegel dreht seine 4,2-s-Runde einmal und bleibt bei 360 Grad stehen
   (`forwards`), also genau in seiner Ausgangslage. Die drei Punkte laufen
   OHNE fill-mode: nach ihrem Durchlauf faellt jeder auf seine normale
   Darstellung zurueck und bleibt sichtbar — mit `forwards` stuenden sie auf
   dem Endbild des Keyframes (Deckung 0,1) und das Signet saehe leer aus.
   Zusaetzlich haengt theme.js nach 5 s die Klasse `sr-signet-still` ans <html>
   und schaltet jede Restbewegung ab; ohne JavaScript endet die laengste
   Kette (Punkt 3, 2,55 s Verzoegerung) nach 6,75 s von selbst. */
.sr-marke-logo .radar-kegel{animation:radar-dreh 4.2s linear 1 forwards;
  transform-origin:50% 50%;transform-box:view-box}
.sr-marke-logo .radar-blip{animation:radar-blip 4.2s var(--ease) 1}
html.sr-signet-still .sr-marke-logo .radar-kegel,
html.sr-signet-still .sr-marke-logo .radar-blip{animation:none}
.sr-marke-logo .rb1{animation-delay:.43s}
.sr-marke-logo .rb3{animation-delay:1.51s}
.sr-marke-logo .rb2{animation-delay:2.55s}

/* --------------------------------------------------------- Navigationsspalte */
.sr-nav{width:var(--sr-nav-w);background:var(--sr-nav);border-right:1px solid var(--sr-hair);
  display:flex;flex-direction:column;flex-shrink:0;position:sticky;top:0;height:100vh;
  /* KEIN overflow auf der Spalte. Sie hatte zuerst overflow:hidden, dann
     overflow-y:auto — beides schneidet auch WAAGERECHT ab (ein nicht-sichtbarer
     Wert auf einer Achse zwingt die andere mit), und damit endete der
     Projekt-Umschalter an der Spaltenkante. Genau das sah nach „gequetscht"
     aus. Gerollt wird im Rumpf darunter; dass die Spalte selbst nie rollen
     muss, ist bei 900/720/600/480 px Fensterhoehe gemessen. */
  z-index:55}
/* Marke am Kopf der Spalte: Signet + Wortmarke, zugleich der Weg zurueck zur
   Uebersicht. Bis zum 30.08.2026 stand hier der blosse Text
   „seo.ackermann-online.com" — eine Domain als Produktname. */
.sr-nav-marke{padding:var(--s3) var(--s3) var(--s2);display:flex;align-items:center;gap:var(--s2);
  color:var(--sr-ink);text-decoration:none;min-height:44px;box-sizing:border-box}
.sr-nav-marke:hover{text-decoration:none}
.sr-nav-marke-text{font-size:var(--fs-body);font-weight:var(--fw-black);letter-spacing:1.3px;
  color:var(--sr-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sr-nav-kopf{padding:0 var(--s2) var(--s2);display:flex;flex-direction:column;gap:var(--s1)}
.sr-projektkarte{background:var(--sr-surface);border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-ctl);padding:var(--s1) var(--s2);display:flex;align-items:center;
  justify-content:space-between;gap:var(--s1);width:100%;text-align:left;cursor:pointer;
  color:var(--sr-ink);font:inherit}
.sr-projektkarte:hover{background:var(--sr-soft);text-decoration:none}
.sr-projektkarte-text{min-width:0}
.sr-projektkarte-name{font-weight:700;font-size:var(--fs-small);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.sr-projektkarte-url{font-size:var(--fs-label);color:var(--sr-acc-ink);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.sr-projektkarte-chev{width:10px;height:10px;flex-shrink:0;color:var(--sr-mut)}
.sr-nav-suche{width:100%;box-sizing:border-box;background:var(--sr-surface);
  border:1px solid var(--sr-feld-line);border-radius:var(--sr-r-ctl);padding:var(--s1) var(--s2);
  font:inherit;font-size:var(--fs-small);color:var(--sr-mut);text-align:left;cursor:pointer;
  display:flex;align-items:center;gap:var(--s1);min-height:32px}
.sr-nav-suche:hover{background:var(--sr-soft)}
.sr-nav-suche kbd{margin-left:auto;font:inherit;font-size:var(--fs-label);font-weight:700;
  color:var(--sr-mut);border:1px solid var(--sr-hair);border-radius:var(--sr-r-xs);padding:0 var(--s0)}
.sr-nav-label{padding:var(--s3) var(--s2) var(--s0);font-size:var(--fs-label);font-weight:700;letter-spacing:.9px;
  text-transform:uppercase;color:var(--sr-mut)}
.sr-nav-gruppen{display:flex;flex-direction:column}
.sr-nav-gruppen>.sr-nav-label:first-child{padding-top:var(--s1)}
.sr-nav-rumpf{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column}
/* Lichtkegel am Icon: Aktivzustand durch Licht, Schriftgewicht und Einzug.
   Hover verwendet dieselbe Lichtquelle mit einem Drittel der Deckkraft. */
.sr-nav-liste{padding:var(--s-2) var(--s1) var(--s1);display:flex;flex-direction:column;gap:var(--s-2)}
.sr-nav-item{position:relative;display:flex;align-items:center;gap:10px;padding:var(--s1) var(--s2);
  border-radius:var(--sr-r-sm);cursor:pointer;color:var(--sr-ink);font:inherit;
  font-size:var(--fs-ui);line-height:20px;background:none;border:0;width:100%;
  text-align:left;min-height:32px}
.sr-nav-item:hover{background:none;text-decoration:none}
.sr-nav-item::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(ellipse 110px 38px at 22px 50%,var(--glow-a),transparent 78%);
  opacity:0;transition:opacity 180ms ease;border:0;border-radius:0}
.sr-nav-item:hover::before{opacity:.33}
.sr-nav-item[aria-current]{font-weight:700;color:var(--sr-ink);background:none}
.sr-nav-item[aria-current]::before{opacity:1}
.sr-nav-item-icon{display:flex;width:16px;flex-shrink:0;color:var(--sr-mut)}
.sr-nav-item:hover .sr-nav-item-icon{color:var(--sr-ink)}
.sr-nav-item[aria-current] .sr-nav-item-icon{color:var(--sr-acc-ink);filter:drop-shadow(0 0 5px var(--glow-a))}
.sr-nav-item-icon svg{width:16px;height:16px;display:block}
.sr-nav-item-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sr-nav-item-zahl{font-size:var(--fs-label);font-weight:700;background:var(--sr-soft);
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-tag);padding:var(--s-2) var(--s1);
  color:var(--sr-mut);flex-shrink:0}
/* Der Knopf „Tarife & Pakete" ist mit Runde 5 entfallen (Betreiber-Ansage
   30.08.2026). Die Seite /tarife bleibt ueber die Verwaltungsliste am Fuss der
   Spalte erreichbar — sie war nie nur ueber diesen Knopf zu erreichen. */
/* Der Fuss weicht ERST, wenn der Rumpf darueber nichts mehr hergibt — und
   dann rollt die Verwaltungsliste, statt die Theme-Zeile unter den Rand zu
   schieben. Bei 900, 720 und 600 px Fensterhoehe passt alles und es gibt
   keinen Balken; bei 480 px erscheint einer, weil dann wirklich nichts mehr
   hineingeht. Ohne min-height:0 schrumpft ein Flex-Kind nie unter seinen
   Inhalt, und genau das schob die Theme-Zeile hinaus (gemessen: endete bei
   529 von 480). */
.sr-nav-fuss{flex-shrink:1;min-height:0;display:flex;flex-direction:column}
.sr-nav-gruppe{padding:var(--s1) var(--s2);display:flex;align-items:center;cursor:pointer;
  border-top:1px solid var(--sr-hair);background:none;border-left:0;border-right:0;
  border-bottom:0;width:100%;font:inherit;min-height:34px}
.sr-nav-gruppe-text{flex:1;font-size:var(--fs-label);font-weight:700;letter-spacing:.8px;
  color:var(--sr-mut);text-align:left}
.sr-nav-gruppe-chev{width:10px;height:10px;color:var(--sr-mut);transform:rotate(180deg);
  transition:transform var(--t-fast) var(--ease)}
.sr-nav-gruppe[aria-expanded="true"] .sr-nav-gruppe-chev{transform:rotate(0deg)}
/* Der Verwaltungsblock klappt nach OBEN auf und darf dabei nie die
   Theme-Zeile unter den Fuss schieben.
   KEIN EIGENER ROLLBALKEN (Betreiber-Ansage 30.08.2026): die erste Fassung
   deckelte ihn auf min(46vh,340px) — bei elf Eintraegen zu wenig, also stand
   dort dauerhaft ein Balken fuer die letzten paar Pixel. Den Druck nimmt
   jetzt der Rumpf darueber auf (er hat flex:1 und rollt selbst); die
   Navigationsspalte insgesamt rollt nur als allerletzter Ausweg auf sehr
   niedrigen Fenstern. Wieder KEINE gerechnete Hoehe — eine Zahl, die einmal
   stimmte, wird stillschweigend falsch, sobald ein Nachbar sich aendert. */
.sr-nav-verwaltung{padding:var(--s1) var(--s1) var(--s-2);display:flex;flex-direction:column;gap:var(--s-2);
  border-top:1px solid var(--sr-hair);min-height:0;overflow-y:auto}
.sr-nav-verwaltung[hidden]{display:none}
.sr-nav-verwaltung .sr-nav-item{color:var(--sr-mut)}
.sr-nav-verwaltung .sr-nav-item[aria-current]{color:var(--sr-ink)}
.sr-nav-theme{padding:var(--s2);display:flex;align-items:center;gap:var(--s1);
  border-top:1px solid var(--sr-hair)}
.sr-nav-theme-text{font-size:var(--fs-label);color:var(--sr-mut);flex:1}
.sr-theme-knopf{width:24px;height:24px;border-radius:50%;border:2px solid var(--sr-hair);
  cursor:pointer;padding:0;flex-shrink:0}
.sr-theme-knopf[aria-pressed="true"]{border-color:var(--sr-acc-line)}
.sr-theme-knopf--light{background:var(--sr-vorschau-light)}
.sr-theme-knopf--medium{background:var(--sr-vorschau-medium)}
.sr-theme-knopf--dark{background:var(--sr-vorschau-dark)}
/* Die Kreise tragen .zahnrad-opt (dieselbe Klick-Logik wie die Knoepfe im
   Zahnrad). Deren Regel faerbt den gedrueckten Zustand mit dem Akzent —
   hier soll der Kreis aber seine Vorschaufarbe behalten und nur den Ring
   bekommen, sonst zeigen alle drei dasselbe. */
/* NUR DIE KREISE, NICHT DAS MENUE (Befund Daniel 06.09.2026, Screenshot S5:
   „im Zahnrad-Menue ist manches unsichtbar"). Die Regel stand bis heute auf
   `.sr-nav-theme .zahnrad-opt` — und das Zahnrad-Menue haengt in DERSELBEN
   Zeile. Damit verlor auch jede gedrueckte Option im Menue (Theme, Dichte,
   Kacheln) ihre Akzentflaeche und stand als dunkle Schrift auf dunklem
   Grund. Jetzt greift die Ausnahme nur noch an den Theme-Kreisen. */
.sr-nav-theme .sr-theme-knopf.zahnrad-opt[aria-pressed="true"]{background:none;font-weight:400}
.sr-nav-theme .zahnrad-opt.sr-theme-knopf--light[aria-pressed="true"]{background:var(--sr-vorschau-light)}
.sr-nav-theme .zahnrad-opt.sr-theme-knopf--medium[aria-pressed="true"]{background:var(--sr-vorschau-medium)}
.sr-nav-theme .zahnrad-opt.sr-theme-knopf--dark[aria-pressed="true"]{background:var(--sr-vorschau-dark)}
/* Hover: Vorschaufarbe BEHALTEN, nur der Ring meldet sich (Befund Daniel
   06.09.2026: „medium und schwarz haben Mouseover-Farbe weiss"). Die alte
   Zeile `.sr-theme-knopf.zahnrad-opt:hover{background:none}` schlug mit
   0,4,0 die drei Farbregeln darunter (0,3,0) — der Kreis wurde transparent
   und stand weiss auf der hellen Leiste. Hier stehen die Farbregeln jetzt
   mit derselben Klassenkette wie die gedrueckten und ohne Gegenregel. */
.sr-nav-theme .sr-theme-knopf.zahnrad-opt:hover{border-color:var(--sr-mut)}
.sr-nav-theme .zahnrad-opt.sr-theme-knopf--light:hover{background:var(--sr-vorschau-light)}
.sr-nav-theme .zahnrad-opt.sr-theme-knopf--medium:hover{background:var(--sr-vorschau-medium)}
.sr-nav-theme .zahnrad-opt.sr-theme-knopf--dark:hover{background:var(--sr-vorschau-dark)}
.sr-nav-theme .sr-theme-knopf.zahnrad-opt[aria-pressed="true"]:hover{border-color:var(--sr-acc-line)}
.sr-nav :where(button,a):focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:-2px}

/* ---------------------------------------------------------------- Inhalt */
.sr-inhalt{flex:1;min-width:0;display:flex;flex-direction:column}
/* Seitenkopf bleibt stehen (Betreiber-Ansage 30.08.2026): Ueberschrift und
   Reiterzeile scrollen NICHT mit dem Inhalt weg — wer in einer langen Tabelle
   steht, soll weiter sehen, in welchem Kapitel er ist und zwischen den
   Abschnitten wechseln koennen.
   Er braucht einen DECKENDEN Hintergrund: sonst scrollt der Inhalt sichtbar
   dahinter durch. Und einen z-index unter den Popups (200) und ueber dem
   Inhalt. */
/* APP-BAR (SuperStyler-Rang 3, 06.09.2026): der klebende Kopf ist leicht
   durchscheinend und weichzeichnet, was unter ihm durchlaeuft — er schwebt
   ueber dem Inhalt wie in einer nativen App. Ohne backdrop-filter (alte
   Browser) bleibt die Vollflaeche, nichts wird unlesbar. */
/* DER VERLAUF BEGINNT AN DER OBERKANTE DER SEITE (Betreiber-Auftrag
   12.09.2026). Der Seitenverlauf lag schon immer unter der ganzen Flaeche
   (.theme-background, position:fixed, inset:0) — sichtbar war er aber erst
   unter dem Kopf, weil der Kopf ihn mit einer eigenen, zu 86 % deckenden
   Flaeche zugedeckt hat. Genau das faellt weg: im Ruhezustand ist der Kopf
   durchsichtig, der Verlauf laeuft ohne Kante durch ihn hindurch.

   BEIM KLEBEN BRAUCHT ER TROTZDEM GRUND, sonst zieht der Inhalt lesbar
   hinter der Ueberschrift durch. Der Schleier ist deshalb NICHT mehr --sr-bg,
   sondern --sr-kopf-ton: derselbe Grundton, aber bereits mit dem Verlaufston
   verrechnet (theme-background.css). Mit --sr-bg saehe man beim Scrollen eine
   graue Platte in einem farbigen Verlauf stehen. */
.sr-kopf{padding:var(--s4) var(--s4) 0;position:sticky;top:0;z-index:40;background:transparent}
.sr-kopf.klebt{background:var(--sr-kopf-ton,var(--sr-bg))}
@supports (backdrop-filter:blur(10px)) or (-webkit-backdrop-filter:blur(10px)){
  .sr-kopf.klebt{background:color-mix(in srgb,var(--sr-kopf-ton,var(--sr-bg)) 84%,transparent);
    -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}
}
/* Kapitelwechsel (SuperStyler-Rang 4): das eingeblendete Kapitel kommt mit
   Blende und 8 px Hub — nur beim Wechsel (die Animation laeuft, wenn
   `hidden` faellt), bei reduzierter Bewegung 0 ms (globale Regel). */
.sr-body>.section:not([hidden]){animation:sr-kapitel-auf 160ms var(--ease)}
@keyframes sr-kapitel-auf{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
/* Untere Kante nur, WENN er klebt — sonst zoege sich quer ueber die Seite
   eine Linie, die es im Entwurf nicht gibt. */
.sr-kopf::after{content:"";display:block;height:1px;background:var(--sr-hair);
  opacity:0;transition:opacity 160ms var(--ease)}
.sr-kopf.klebt::after{opacity:1}
.sr-kopf.klebt{box-shadow:var(--sr-e1)}
.sr-kopf-zeile{--sr-kopf-seitenrand:var(--s4);--sr-kopf-breite-standard:calc(var(--inhalt-breite,100%) - 2 * var(--sr-kopf-seitenrand) * max(0,1 - var(--inhalt-faktor,.9)));display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap;width:var(--sr-kopf-breite,var(--sr-kopf-breite-standard));max-width:var(--sr-kopf-breite,var(--sr-kopf-breite-standard))}
.sr-kopf-zeile--lesen{max-width:min(var(--sr-kopf-breite,var(--sr-kopf-breite-standard)),calc(var(--sr-breite-lesen) * var(--inhalt-faktor,.9) / .9 - 2 * var(--sr-kopf-seitenrand)))}
.sr-kopf-zeile--uebersicht{max-width:min(var(--sr-kopf-breite,var(--sr-kopf-breite-standard)),calc(var(--sr-breite-uebersicht) * var(--inhalt-faktor,.9) / .9 - 2 * var(--sr-kopf-seitenrand)))}
.sr-kopf-zeile--arbeit{max-width:min(var(--sr-kopf-breite,var(--sr-kopf-breite-standard)),calc(var(--sr-breite-arbeit) * var(--inhalt-faktor,.9) / .9 - 2 * var(--sr-kopf-seitenrand)))}
.sr-kopf-aktionen{margin-left:auto;display:flex;align-items:center;justify-content:flex-end;gap:var(--s1);flex-wrap:wrap}
/* 24/32 px, Halbfett — das gemessene Mass der Vorlage. Vorher 21 px/700. */
.sr-h1{margin:0;font-size:var(--fs-h1);line-height:var(--lh-h1);font-weight:var(--fw-bold);letter-spacing:-.01em;
  flex:0 1 auto;min-width:0;color:var(--sr-ink)}
.sr-h1--detail{font-size:var(--fs-h1)}
/* Titel und Beizeile teilen sich eine Zeile und eine Grundlinie
   (Betreiber-Auftrag 12.09.2026). `align-items:baseline` gilt fuer die
   Kinder dieses Kastens — die umgebende .sr-kopf-zeile richtet weiter
   mittig aus, damit die Aktionen rechts auf der Mitte des Titels sitzen.
   Der Kasten selbst darf schrumpfen (min-width:0), sonst draengt eine lange
   Beizeile die Aktionen aus der Zeile. */
.sr-kopf-titel{display:flex;align-items:baseline;gap:var(--s3);flex:0 1 auto;min-width:0}
.sr-kopf-sub{font-size:var(--fs-small);color:var(--sr-tabmut);min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Unter 700 px steht die Beizeile wieder unter dem Titel: nebeneinander
   bliebe von ihr nur noch ein Wort und drei Punkte. */
@media (max-width:699px){
  .sr-kopf-titel{flex-direction:column;align-items:flex-start;gap:var(--s0)}
  .sr-kopf-sub{white-space:normal;overflow:visible;text-overflow:clip}
}
/* Mandantenauswahl im Kopf (Betreiber-Auftrag 08.09.2026, Verwaltung ->
   KI-Anbieter): sie gilt fuer ALLE Reiter der Seite und steht deshalb im
   klebenden Kopf statt in einem Abschnitt. `.vw-mandant-wahl` aus app.css
   passt hier NICHT — dessen `margin:0 0 18px` risse die Kopfzeile auf.
   Sie steht in der umbrechenden `.sr-kopf-zeile`; auf schmalen Bildschirmen
   rutscht sie also in eine eigene Zeile, statt den Titel zu quetschen. */
/* Angesprungene Tabellenzeile (08.09.2026): der Link „In der Verwaltung
   oeffnen" der Keyword-Detailansicht zeigt auf EINE Zeile unter hundert.
   Ohne Markierung landet der Blick nach dem Sprung irgendwo — der Browser
   scrollt hin, sagt aber nicht, wohin. Reines CSS (:target), kein Skript. */
tbody tr:target{background:var(--sr-hell);box-shadow:inset 3px 0 0 var(--sr-acc)}
.sr-kopf-mandant{display:flex;align-items:center;gap:var(--s1);margin:0;flex-wrap:wrap}
.sr-kopf-mandant-label{font-size:var(--fs-small);color:var(--sr-mut);white-space:nowrap}
.sr-kopf-mandant select{max-width:22ch}
.sr-kopf-glocke{position:relative;width:32px;height:32px;border-radius:var(--sr-r-ctl);display:flex;
  align-items:center;justify-content:center;color:var(--sr-mut);background:none;border:0;
  cursor:pointer;padding:0;flex-shrink:0}
.sr-kopf-glocke svg{width:17px;height:17px;display:block}
.sr-kopf-glocke:hover{background:var(--sr-soft);color:var(--sr-ink)}
/* Die Glocke traegt seit dem 02.09.2026 Inhalt (Vorgang cmtcxwbmk) und ist
   nie mehr abgeschaltet — auch ohne Befund bleibt sie bedienbar und sagt das
   im Flyout. Die frueheren [disabled]-Regeln sind damit entfallen.
   `position:relative` traegt die Zahl an der Ecke. */
.sr-glocke-zahl{position:absolute;top:-3px;right:-3px;min-width:16px;height:16px;padding:0 var(--s0);
  border-radius:var(--sr-r-tag);background:var(--sr-warn-ink);color:var(--sr-surface);
  font-size:var(--fs-label);line-height:16px;font-weight:700;text-align:center;box-sizing:border-box}
.sr-glocke-drop{width:min(380px,calc(100vw - 32px));max-height:min(70vh,520px);overflow-y:auto}
.sr-glocke-eintrag{display:block;white-space:normal}
.sr-glocke-eintrag-titel{display:block;font-weight:600;color:var(--sr-ink)}
.sr-glocke-eintrag-text{display:block;color:var(--sr-mut);font-size:var(--fs-label);font-weight:400;
  margin-top:var(--s0);line-height:1.45}
/* Unterzeile fuer den Stand der Betriebshinweise in der Glocke. */
.sr-glocke-kopf-sub{display:block;color:var(--sr-mut);font-size:var(--fs-label);margin-top:var(--s-2)}
.sr-glocke-punkt{display:inline-block;width:7px;height:7px;border-radius:var(--sr-r-tag);
  margin-right:var(--s1);vertical-align:middle}
.sr-glocke-punkt--stop{background:var(--sr-err-ink)}
.sr-glocke-punkt--warn{background:var(--sr-warn-ink)}
.sr-glocke-leer{padding:var(--s2) var(--s3);color:var(--sr-mut);font-size:var(--fs-label);line-height:1.5}
.sr-krume{font-size:var(--fs-small);font-weight:600;display:inline-block;margin-bottom:var(--s1)}
.sr-tabs{display:flex;gap:var(--s4);margin-top:var(--s3);border-bottom:1px solid var(--sr-hair);
  overflow-x:auto;scrollbar-width:none}
.sr-tabs::-webkit-scrollbar{display:none}
.sr-tab{padding:0 var(--s-2) var(--s3);font-size:var(--fs-ui);color:var(--sr-tabmut);cursor:pointer;
  white-space:nowrap;border-bottom:2px solid transparent;background:none;border-left:0;
  border-right:0;border-top:0;font-family:inherit;text-decoration:none;display:block}
.sr-tab:hover{opacity:.75;text-decoration:none}
.sr-tab[aria-current]{font-weight:700;color:var(--sr-acc-ink)}
.sr-tab-zahl{color:var(--sr-mut);font-weight:400}
.sr-tabs :where(a,button):focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px}
/* ABSTAND, DRITTER UND LETZTER DURCHGANG (Betreiber-Klarstellung 30.08.2026).
   Gemeint war nie die Luft UNTER dem Strich, sondern die ZWISCHEN DEN
   MENUEPUNKTEN UND DEM STRICH — also der Innenabstand der Reiter nach unten,
   von 9 auf 18 px verdoppelt (.sr-tab / .nav-item--kapitel /
   .unterkapitel-tab weiter unten). Die 38 px, die Runde 4 unter den Strich in
   den Kopf gelegt hatte, sind damit wieder weg; der Kopf endet buendig an der
   Trennlinie, und die 37 px hier sind wie zuvor der sichtbare Abstand vom
   Strich zum ersten Inhalt. */
/* 24 px oben statt 37: der Kapitel-Container ist weg, seine 18 px Innenpolster
   damit auch — ohne Anpassung klaffte oben eine leere Zone. */
/* padding-top --s3 statt --s4 und gap --s3, NICHT --sr-gap (06.09.2026):
   der Kopf (.sr-kopf, Reiterlinie) steht VOR .sr-body — der Abstand
   Reiterlinie→erste Box ist also das obere Polster dieses Behaelters
   (+ 8 px Kopf), gemessen 53 → jetzt 24 px. --sr-gap bleibt der Abstand
   ZWISCHEN den Boxen einer Sektion (26 px). */
.sr-body{padding:var(--s3) var(--s4) var(--s5);display:flex;flex-direction:column;gap:var(--s3)}

/* ----------------------------------------------------------------- Karten */
/* SCHATTEN STATT RAHMEN (Designsystem 03.09.2026, Kapitel Elevation:
   „Tiefe ist Schatten, nicht Rahmen"). Die Karte stand bis dahin mit einer
   1-px-Linie auf dem Grund — bei einer Seite voller Karten ergibt das ein
   Gitter aus Kaesten. Stufe 1 ist --sr-e1; Haarlinien bleiben, aber nur
   INNERHALB einer Karte (Kartenkopf, Tabellenzeilen). */
.sr-karte{background:var(--sr-surface);border-radius:var(--sr-r-card);
  border:0;box-shadow:var(--sr-e1)}
.sr-karte-kopf{padding:var(--s3) var(--s3);display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap;
  border-bottom:1px solid var(--sr-hair)}
.sr-karte-titel{font-size:var(--fs-h2);line-height:var(--lh-h2);font-weight:var(--fw-bold);flex:1;min-width:0;color:var(--sr-ink)}
.sr-karte-titel-zusatz{font-weight:400;color:var(--sr-mut);font-size:var(--fs-label)}
.sr-karte-koerper{padding:var(--s3) var(--s3)}
.sr-karte-fuss{padding:var(--s2) var(--s3);display:flex;justify-content:space-between;
  align-items:center;gap:var(--s2);flex-wrap:wrap;font-size:var(--fs-label);color:var(--sr-mut)}

/* -------------------------------------------------------------------- KPI */
.sr-kpi-gitter{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sr-gap-kpi)}
.sr-kpi-gitter--3{grid-template-columns:repeat(3,1fr)}
.sr-kpi-gitter--2{grid-template-columns:repeat(2,1fr)}
/* Fuenf und eins kamen mit den Kapitelkoepfen dazu (01.09.2026): sie liefen
   bis dahin ueber das auto-fit-Raster der entfallenen .kpi-leiste. Sechs
   braucht keine eigene Variante — sie stehen als 3+3 besser als 4+2. */
.sr-kpi-gitter--5{grid-template-columns:repeat(5,1fr)}
.sr-kpi-gitter--1{grid-template-columns:1fr}

/* KOMPAKTE KACHELN (Betreiber-Auftrag 05.09.2026): „etwa die halbe Breite,
   so dass man bei der jetzigen Maximalbreite 6 Cards in der Breite
   hinbekommt anstatt 3."
   Bewusst KEINE feste Spaltenzahl 6. Eine harte `repeat(6,1fr)` haette bei
   1.262 px Buehne 195 px je Kachel ergeben — und auf einem 1.100-px-Fenster
   157 px, in denen „1.321" mit Delta und Meta-Zeile nicht mehr lesbar ist.
   auto-fit mit Mindestbreite liefert bei 1.262 px genau sechs Spalten
   (6*178 + 5*16 = 1.148 <= 1.262), auf einem breiten Schirm mehr, auf einem
   schmalen von selbst vier oder drei. Die Zahl der Kacheln bleibt gleich —
   nur ihre Breite gibt nach. Die Einer- und Zweier-Gitter bleiben aussen
   vor: eine einzelne Kachel in 178 px waere kein Kompaktmodus, sondern ein
   Fehler.
   Der Grund fuer die Trennung von der Tabellendichte steht in
   app/lib/ui-prefs.js bei KPI_DICHTEN. */
html[data-kpi="kompakt"] .sr-kpi-gitter,
html[data-kpi="kompakt"] .sr-kpi-gitter--3,
html[data-kpi="kompakt"] .sr-kpi-gitter--5{
  grid-template-columns:repeat(auto-fit,minmax(178px,1fr))}
html[data-kpi="kompakt"] .sr-kpi{padding:14px 14px var(--s2);min-height:88px;gap:2px}
html[data-kpi="kompakt"] .sr-kpi-wert{font-size:var(--fs-kpi-compact)}
html[data-kpi="kompakt"] .sr-kpi-wert--klein{font-size:var(--fs-kpi-compact)}
/* Die Meta-Zeile ist nowrap und traegt schon im Normalmodus ein `title` mit
   dem vollen Text — in der halben Breite wird das Abschneiden die Regel
   statt die Ausnahme. Zwei Zeilen sind hier besser als ein Auslassungszeichen
   nach dem dritten Wort. */
html[data-kpi="kompakt"] .sr-kpi-meta{white-space:normal;overflow:visible;text-overflow:clip;
  font-size:11.5px;line-height:1.35}
html[data-kpi="kompakt"] .sr-kpi-label{font-size:10.5px;letter-spacing:.05em}
/* Die Verlaufslinie braucht Flaeche, um mehr als ein Zittern zu sein. */
html[data-kpi="kompakt"] .sr-kpi-spark{height:24px}
/* Die Nebenwert-Liste (zwei bis drei Paare) sprengt eine 178-px-Kachel —
   sie steht im ⓘ-Panel derselben Kachel vollstaendig. */
html[data-kpi="kompakt"] .sr-kpi-herkunft{display:none}

/* BENANNTE KENNZAHL-SAETZE (05.09.2026). Die Ueberschrift steht bewusst
   klein und stumpf ueber dem Gitter: sie ordnet, sie konkurriert nicht mit
   den Zahlen darunter. Rechts daneben das Fenster des Satzes — die Kacheln
   eines Satzes teilen es sich, und wo es je Kachel abweicht, sagt es die
   Kachel selbst. */
.sr-kpi-satz{margin:0 0 var(--sr-gap)}
.sr-kpi-satz-kopf{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--s2);flex-wrap:wrap;margin:0 0 var(--s2)}
.sr-kpi-satz-titel{margin:0;font-size:var(--fs-ui);font-weight:var(--fw-ui);
  line-height:1.3;color:var(--sr-ink)}
.sr-kpi-satz-hinweis{font-size:var(--fs-label);color:var(--sr-mut)}

/* DAS ⓘ-PANEL DARF NICHT UNTER DER NACHBARKACHEL VERSCHWINDEN
   (Betreiber-Bild 05.09.2026: das offene Panel der Kachel „Klicks" lag unter
   der Kachel „KI-Zugriffe" der naechsten Reihe).
   Ursache ist NICHT der z-index des Panels — der ist 220. Es ist
   `.sr-kpi:hover{transform:translateY(-1px)}`: ein transform macht die
   Kachel zum Stapelkontext, und darin gilt die 220 nur noch INNERHALB der
   Kachel. Nach aussen ist sie eine Kachel mit z-index auto und wird von
   jeder spaeteren Schwester ueberdeckt. Die Kachel selbst muss also steigen,
   nicht das Panel. Im Kompaktmodus mit sechs Spalten waere das sonst der
   Normalfall statt der Ausnahme.
   `.sr-erkl-aktiv` setzt app.js beim Oeffnen; :hover/:focus-within halten
   die angehobene Kachel schon beim Zeigen ueber ihren Schwestern. */
.sr-kpi:hover,.sr-kpi:focus-within{z-index:3}
.sr-kpi.sr-erkl-aktiv{z-index:240}
/* Dieselbe Kachel wie .kpi und .card (01.09.2026): Label in Versalien, darunter
   die Zahl in 24/32 px Halbfett, Haarlinie statt Schatten, Radius 8,
   Polster 16. Drei Bausteine fuer eine Sache hatten drei Groessen. */
.sr-kpi{background:var(--sr-surface);border:0;border-radius:var(--sr-r-md);box-shadow:var(--sr-e1);
  padding:var(--s3)}
.sr-kpi-label{font-size:var(--fs-label);line-height:var(--lh-label);letter-spacing:.06em;text-transform:uppercase;font-weight:var(--fw-ui);
  color:var(--sr-mut)}
.sr-kpi-zeile{display:flex;align-items:baseline;gap:var(--s1);margin-top:var(--s0);flex-wrap:wrap}
.sr-kpi-wert{font-size:var(--fs-kpi);line-height:var(--lh-kpi);font-weight:var(--fw-bold);letter-spacing:-.02em;
  font-variant-numeric:tabular-nums;color:var(--sr-ink)}
.sr-kpi-wert--klein{font-size:var(--fs-kpi-compact)}
.sr-kpi-wert-zusatz{font-size:var(--fs-small);font-weight:400;color:var(--sr-mut)}
/* Nebenwerte unter dem Hauptwert (weitere Zeitfenster, Bezugsgroessen): kleine
   Schrift, Etikett und Zahl in EINEM span, damit der Umbruch die Zahl nie von
   ihrem Etikett trennt und eine Quote allein stehen laesst. */
.sr-kpi-neben{margin-top:var(--s0);display:flex;flex-wrap:wrap;gap:var(--s1);align-items:baseline;
  font-size:var(--fs-small);line-height:16px;color:var(--sr-mut);font-variant-numeric:tabular-nums}
.sr-kpi-neben-label{color:var(--sr-mut)}
/* Sparkline (SuperStyler Rang 8): 24 px, Linie 1,5 px in gedaempftem Akzent,
   ohne Achsen — Zierde unter der Meta-Zeile; die Kachel bleibt klickbar,
   der Link liegt darueber (z-index in sr-bausteine.css). */
.sr-kpi-spark{display:block;margin-top:var(--s1);width:100%;height:24px;opacity:.85}
.sr-kpi-spark polyline{fill:none;stroke:var(--sr-acc-ink);stroke-width:1.5;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}
/* KPI-Leiste: dieselben Kennzahlen als schmale Reihe im Seitenkopf. */

/* ----------------------------------------------------------------- Badges */
.sr-badge{display:inline-block;font-size:var(--fs-label);font-weight:700;border-radius:var(--sr-r-badge);
  padding:var(--s-2) var(--s1);white-space:nowrap}
.sr-badge--ok{color:var(--sr-ok-ink);background:color-mix(in oklab,var(--sr-ok) 15%,transparent)}
.sr-badge--warn{color:var(--sr-warn-ink);background:color-mix(in oklab,var(--sr-warn) 15%,transparent)}
.sr-badge--err{color:var(--sr-err-ink);background:color-mix(in oklab,var(--sr-err) 12%,transparent)}
.sr-badge--info{color:var(--sr-info-ink);background:color-mix(in oklab,var(--sr-info) 15%,transparent)}
.sr-badge--acc{color:var(--sr-acc-ink);background:color-mix(in oklab,var(--sr-acc) 14%,transparent)}
.sr-badge--neutral{color:var(--sr-mut);background:var(--sr-soft)}
.sr-chip{display:inline-block;font-size:var(--fs-label);background:var(--sr-soft);
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-badge);padding:var(--s-2) var(--s1);
  color:var(--sr-mut);white-space:nowrap}
.sr-chip--code{font-family:var(--font-mono)}
/* Kachel fuer Schweregrade. Weisse Schrift haelt auf keiner der drei
   Statusfarben 4,5:1 (2,17-3,96) — deshalb dunkle Glyphe, nur --sr-info ist
   hell genug fuer weiss. */
.sr-sev{width:18px;height:18px;border-radius:var(--sr-r-badge);display:inline-flex;
  align-items:center;justify-content:center;font-size:var(--fs-label);font-weight:800;
  color:var(--sr-auf-status);flex-shrink:0}
.sr-sev--ok{background:var(--sr-ok)}
.sr-sev--warn{background:var(--sr-warn)}
.sr-sev--err{background:var(--sr-err)}
.sr-sev--info{background:var(--sr-info);color:var(--sr-auf-info)}
/* Intentions-Buchstaben. Gleiche Ueberlegung wie oben: dunkle Glyphe. */
.sr-int{width:18px;height:18px;border-radius:var(--sr-r-badge);display:inline-flex;
  align-items:center;justify-content:center;font-size:var(--fs-label);font-weight:800;
  color:var(--sr-auf-status)}
.sr-int--n{background:var(--sr-warn)}
.sr-int--c{background:var(--sr-ok)}
.sr-int--i{background:var(--sr-int-i);color:var(--sr-auf-info)}
.sr-int--t{background:var(--sr-int-t);color:var(--sr-auf-info)}
/* „BETA" — das EINE Etikett fuer alles Unfertige (Betreiber-Ansage
   04.09.2026): fehlende Funktion wie noch nicht endgueltige Zahl. Sichtbar
   machen statt weglassen; der Grund steht im title des Chips. */
/* Eigener Stil statt „das Gleiche, nur blasser": --sr-mut auf --sr-soft
   haelt in allen drei Themen ueber 4,5:1, auch innerhalb eines .sr-aus.
   Kein Rahmen — ein Chip ist eine Flaeche, kein Kasten. */
/* BETA-CHIP (Betreiber-Ansage 06.09.2026): transparent, oranger Rahmen,
   grell oranger Text — und ein Puls, der LANGSAM anschwillt, kurz sehr stark
   leuchtet und dann schnell auf null fällt.

   DIE KURVE STECKT IN DEN KEYFRAME-ANTEILEN, nicht in einer Dauer: 0–78 %
   der Runde ist Anschwellen (mit ease-in, also erst kaum sichtbar), 78–85 %
   der Höhepunkt, 85–94 % der schnelle Abfall, der Rest Ruhe vor dem nächsten
   Durchlauf. Bei 5 s Rundendauer sind das rund 3,9 s Wachsen gegen 0,45 s
   Abfall — genau das gewünschte Verhältnis.

   ES PULSIERT DER SCHEIN, NICHT DIE SCHRIFT. Farbe und Deckkraft des Textes
   bleiben über die ganze Runde gleich; bewegt werden nur box-shadow und eine
   sehr schwache Füllung. Ein Chip, dessen Text mitatmet, wäre in der Hälfte
   der Runde schlechter lesbar als die 4,5:1, die der Ton gerade hält.

   RADIUS 3 px, nicht --sr-r-badge: ausdrücklich verlangt („border radius
   max 3"). */
.sr-beta{display:inline-block;font-size:var(--fs-label);font-weight:var(--fw-body);letter-spacing:.4px;
  text-transform:uppercase;border-radius:3px;padding:var(--s-2) var(--s1);
  color:var(--beta-ink);background:transparent;border:1px solid var(--beta-rand-ruhe);
  white-space:nowrap;vertical-align:middle}
/* DER PULS IST DER AUFTRITTS-CHOREOGRAFIE GEWICHEN (Betreiber-Auftrag
   12.09.2026). Bis dahin lief hier `sr-beta-puls`, eine eigene Runde von 5 s,
   die beim Laden LANGSAM anschwoll und schnell abfiel. Sie hatte denselben
   Anlass wie das neue Aufblinken — „der Chip meldet sich einmal beim Aufbau" —
   und lief nur auf einer anderen Zeitachse als alles andere auf der Seite:
   die Kacheln waren nach gut anderthalb Sekunden fertig, der Chip glomm noch
   drei Sekunden weiter.
   JETZT BLINKT ER ZWEIMAL KURZ, sobald SEINE Kachel steht (`sr-beta-blitz` in
   app.css, Verzoegerung ueber --sr-auf-verz von der Kachel geerbt). Die
   Ruhegestalt des Chips — duenner Rahmen, leichter Schnitt — steht deshalb
   oben in der Regel selbst und nicht mehr im Endbild einer Kurve.
   Bei reduzierter Bewegung bleibt er still; die Regel dafuer steht weiter
   unten in diesem Stylesheet und zusaetzlich im Auftritts-Block. */
/* Veto 3 (Designsystem, Barrierefreiheit): DEAKTIVIERT HEISST NICHT
   UNLESBAR. .sr-aus lag auf Opazitaet 0,55 — der Text darunter (und der
   BETA-Chip darin) fiel damit unter 4,5:1; axe meldete auf der
   Anmeldeseite vier Knoten. Der Zustand kommt jetzt aus der Textfarbe und
   dem abgeschalteten Zeiger, nicht aus einem Schleier. */
.sr-aus{color:var(--sr-mut);pointer-events:none}
.sr-aus-hinweis{font-size:var(--fs-label);color:var(--sr-mut)}

/* --------------------------------------------------------------- Schalter */
/* KNOEPFE (Betreiber-Vorgabe 06.09.2026): weisse Schrift auf Blau, kein
   Rand, Schlagschatten, beim Benutzen ein leichtes Schweben (1 px hoch,
   groesserer Schatten), beim Druecken wieder herunter. Werte in theme.css
   (--knopf-*). Gilt fuer Haupt- UND Nebenknoepfe — der Unterschied liegt in
   der Schriftstaerke, nicht mehr in Flaeche gegen Rahmen. Ausnahmen mit
   Bedeutung: --gefahr (Rot, weisse Schrift, gleicher Bau) und --geist
   (Textknopf ohne Flaeche fuer „Abbrechen"). Bewegung entfaellt bei
   reduzierter Bewegung (globale Regel in theme.css). */
.sr-knopf{font:inherit;font-size:var(--fs-ui);line-height:var(--lh-ui);font-weight:600;color:var(--auf-knopf);
  background:var(--knopf-blau);border:0;box-shadow:var(--knopf-schatten);
  border-radius:var(--sr-r-ctl);padding:var(--s1) var(--s3);cursor:pointer;min-height:32px;
  display:inline-flex;align-items:center;gap:var(--s1);text-decoration:none;
  transition:transform .16s var(--ease),box-shadow .16s var(--ease),background .16s var(--ease)}
.sr-knopf:hover{background:var(--knopf-blau-hover);color:var(--auf-knopf);text-decoration:none;
  transform:translateY(-1px);box-shadow:var(--knopf-schatten-hover)}
.sr-knopf:active{background:var(--knopf-blau-aktiv);transform:translateY(0);box-shadow:var(--knopf-schatten-aktiv)}
.sr-knopf--haupt{font-weight:700}
.sr-knopf--haupt:hover{background:var(--knopf-blau-hover);color:var(--auf-knopf)}
.sr-knopf--geist{background:none;box-shadow:none;color:var(--sr-acc-ink);font-weight:600}
.sr-knopf--geist:hover{background:var(--sr-soft);color:var(--sr-acc-ink);transform:none;box-shadow:none}
.sr-knopf--gefahr,.sr-knopf--gefahr-voll{color:var(--auf-knopf);background:var(--knopf-rot);box-shadow:var(--knopf-rot-schatten);font-weight:700}
.sr-knopf--gefahr:hover,.sr-knopf--gefahr-voll:hover{background:var(--knopf-rot-hover);color:var(--auf-knopf)}
.sr-knopf--klein{padding:var(--s0) var(--s2);min-height:28px}
.sr-knopf:disabled{opacity:.5;cursor:not-allowed;transform:none;box-shadow:none}
.sr-app :where(button,a,input,select,textarea):focus-visible{
  outline:2px solid var(--sr-acc-line);outline-offset:2px}
.sr-segment{display:inline-flex;border:1px solid var(--sr-feld-line);
  border-radius:var(--sr-r-ctl);overflow:hidden}
.sr-segment-teil{padding:var(--s1) var(--s2);font:inherit;font-size:var(--fs-ui);background:var(--sr-surface);
  color:var(--sr-mut);cursor:pointer;border:0;min-height:30px;text-decoration:none}
.sr-segment-teil:hover{background:var(--sr-soft);text-decoration:none}
.sr-segment-teil[aria-current]{background:var(--sr-soft);font-weight:700;color:var(--sr-ink)}

/* --------------------------------------------------------------- Formular */
.sr-feld{display:flex;flex-direction:column;gap:var(--s0)}
.sr-feld-label{font-size:var(--fs-label);line-height:var(--lh-label);font-weight:var(--fw-ui);color:var(--sr-ink)}
.sr-eingabe,.sr-auswahl{width:100%;box-sizing:border-box;background:var(--sr-soft);
  border:1px solid var(--sr-feld-line);border-radius:var(--sr-r-ctl);padding:var(--s2) var(--s2);
  font:inherit;font-size:var(--fs-ui);color:var(--sr-ink);outline:none;min-height:36px}
/* :focus-visible statt :focus (Designsystem, Do's: „Fokus 2 px accent-line
   mit 2 px Versatz auf jedem Bedienelement, :focus-visible statt :focus").
   Bei Textfeldern faellt beides zusammen — der Browser wertet sie immer als
   „sichtbar fokussiert" —, aber die Schreibweise soll ueberall dieselbe
   sein, damit niemand sie an einer Stelle wieder zurueckdreht. */
.sr-eingabe:focus-visible,.sr-auswahl:focus-visible{border-color:var(--sr-acc-line)}
.sr-eingabe--klein{padding:var(--s1) var(--s2);font-size:var(--fs-small);min-height:30px}
.sr-feld-hinweis{font-size:var(--fs-label);color:var(--sr-mut)}
.sr-check{display:flex;align-items:center;gap:var(--s1);font-size:var(--fs-small);color:var(--sr-mut);
  cursor:pointer;min-height:24px}
.sr-check input{accent-color:var(--sr-acc);margin:0;width:16px;height:16px}

/* --------------------------------------------------------------- Tabellen */
.sr-tabelle-wrap{overflow-x:auto}
.sr-tabelle{width:100%;border-collapse:collapse}
.sr-tabelle th{text-align:left;font-size:var(--fs-label);font-weight:700;color:var(--sr-mut);
  padding:var(--s1) var(--s3);border-bottom:1px solid var(--sr-hair);white-space:nowrap}
.sr-tabelle td{padding:var(--s1) var(--s3);border-bottom:1px solid var(--sr-hair);font-size:var(--fs-small);
  color:var(--sr-ink)}
.sr-tabelle tbody tr:hover{background:var(--sr-soft)}
.sr-tabelle .re{text-align:right}
.sr-tabelle .num{text-align:right;font-variant-numeric:tabular-nums;font-size:var(--fs-small)}
.sr-tabelle-sort{color:var(--sr-mut);font-weight:400}
.sr-tabelle-url{max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sr-tabelle-warnung{color:var(--sr-err-ink);font-weight:700}
.sr-blaettern{padding:var(--s2) var(--s3);display:flex;align-items:center;gap:var(--s1);flex-wrap:wrap}
.sr-blaettern-seite{font-size:var(--fs-small);font-weight:700;border:1px solid var(--sr-acc-line);
  color:var(--sr-acc-ink);border-radius:var(--sr-r-ctl);padding:var(--s0) var(--s2)}
.sr-blaettern-text{font-size:var(--fs-small);color:var(--sr-mut)}
.sr-blaettern-fuell{flex:1}
.sr-blaettern-zu{width:48px}

/* ------------------------------------------------------------------ Balken */
.sr-bar{display:flex;align-items:center;gap:var(--s1)}
.sr-bar-spur{height:6px;border-radius:var(--sr-r-xs);background:var(--sr-hair);overflow:hidden;
  flex-shrink:0}
.sr-bar-spur--56{width:56px}
.sr-bar-spur--90{width:90px}
.sr-bar-spur--voll{width:100%;flex:1}
.sr-bar-f{display:block;height:100%;background:var(--sr-acc);border-radius:var(--sr-r-xs)}
.sr-bar-f--ok{background:var(--sr-ok)}
.sr-bar-f--warn{background:var(--sr-warn)}
.sr-bar-f--err{background:var(--sr-err)}
.sr-bar-wert{font-size:var(--fs-small);font-variant-numeric:tabular-nums;color:var(--sr-ink)}

/* --------------------------------------------------------------- Leerzustand */
.sr-leer{border:0;border-radius:var(--sr-r-card);
  padding:var(--s5) var(--s4);display:flex;flex-direction:column;align-items:center;
  text-align:center;gap:var(--s1);background:var(--sr-soft)}
.sr-leer-icon{color:var(--sr-mut)}
.sr-leer-titel{font-size:var(--fs-body);font-weight:700;color:var(--sr-ink)}
.sr-leer-text{font-size:var(--fs-small);color:var(--sr-mut);max-width:380px}

/* -------------------------------------------------------------------- Modal */
.sr-modal-grund{position:fixed;inset:0;background:var(--sr-scrim);z-index:200;
  display:flex;align-items:center;justify-content:center;padding:var(--s3)}
.sr-modal-grund[hidden]{display:none}
.sr-modal{background:var(--sr-surface);border-radius:var(--sr-r-modal);
  box-shadow:var(--sr-e-modal);width:min(440px,100%);max-height:calc(100vh - 40px);
  display:flex;flex-direction:column}
.sr-modal-kopf{padding:var(--s3) var(--s3);display:flex;align-items:center;gap:var(--s2);
  border-bottom:1px solid var(--sr-hair)}
.sr-modal-titel{font-size:var(--fs-body);font-weight:700;flex:1;color:var(--sr-ink)}
.sr-modal-zu{width:28px;height:28px;border-radius:var(--sr-r-ctl);border:0;background:none;
  color:var(--sr-mut);cursor:pointer;font-size:var(--fs-h2);line-height:1;display:flex;
  align-items:center;justify-content:center}
.sr-modal-zu:hover{background:var(--sr-soft);color:var(--sr-ink)}
.sr-modal-koerper{padding:var(--s3);display:flex;flex-direction:column;gap:var(--s3);overflow-y:auto}
.sr-modal-paar{display:grid;grid-template-columns:1fr 1fr;gap:var(--s2)}
.sr-modal-fuss{padding:var(--s3) var(--s3);display:flex;justify-content:flex-end;gap:var(--s1);
  border-top:1px solid var(--sr-hair)}
.sr-modal-warnkopf{padding:var(--s3) var(--s3) 0;display:flex;gap:var(--s3)}
.sr-modal-warnkachel{width:34px;height:34px;border-radius:var(--sr-r-ctl);flex-shrink:0;
  background:color-mix(in oklab,var(--sr-err) 12%,transparent);color:var(--sr-err-ink);
  display:flex;align-items:center;justify-content:center;font-size:var(--fs-h2);font-weight:800}
.sr-modal-warntext{font-size:var(--fs-small);color:var(--sr-mut)}

/* --------------------------------------------------------------- Score-Ring */
.sr-ring{position:relative;flex-shrink:0}
.sr-ring svg{display:block}
.sr-ring-spur{fill:none;stroke:var(--sr-hair)}
.sr-ring-wert{fill:none;stroke-linecap:round}
.sr-ring-wert--ok{stroke:var(--sr-ok)}
.sr-ring-wert--warn{stroke:var(--sr-warn)}
.sr-ring-wert--err{stroke:var(--sr-err)}
.sr-ring-wert--acc{stroke:var(--sr-acc)}
.sr-ring-mitte{position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;text-align:center}
.sr-ring-zahl{font-size:var(--fs-kpi);line-height:var(--lh-kpi);font-weight:var(--fw-black);letter-spacing:-.02em;color:var(--sr-ink)}
.sr-ring-label{font-size:var(--fs-label);color:var(--sr-mut)}
.sr-ring-delta{font-size:var(--fs-label);font-weight:700;color:var(--sr-ok-ink)}

/* -------------------------------------------------------------- Raster */
.sr-zwei{display:grid;grid-template-columns:1fr 1fr;gap:var(--sr-gap)}
.sr-drei{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sr-gap)}
.sr-reihe{display:flex;align-items:center;gap:var(--s1);flex-wrap:wrap}
.sr-fuell{flex:1}

/* ------------------------------------------------------------ Schublade
 * .sr-burger ist der einzige mobile Navigations-Oeffner (kein Ersatz-Weg
 * dahinter) und traegt deshalb die Projekt-Zielgroesse fuer Touch-Bedien-
 * elemente von 44x44px (siehe Design-Briefing „Harte Technik-Leitplanken"),
 * nicht nur das WCAG-2.5.8-Minimum von 24px — analog .nav-burger (theme.css,
 * 44x44px). */
.sr-burger{display:none;align-items:center;justify-content:center;width:44px;height:44px;
  border-radius:var(--sr-r-ctl);background:var(--sr-surface);border:1px solid var(--sr-feld-line);
  color:var(--sr-ink);cursor:pointer;flex-shrink:0}
.sr-burger svg{width:23px;height:23px}
.sr-grund{display:none;position:fixed;inset:0;z-index:50;background:var(--sr-scrim);
  opacity:0;transition:opacity .25s var(--ease)}
.sr-grund.show{display:block;opacity:1}

/* ------------------------------------------------------------ Responsiv
 * Das Paket nennt zwei Schwellen fuer Tabellenspalten (1180 / 1020 px). Die
 * dritte (900 px) ist die Schublade — ohne sie fressen Leiste und Spalte auf
 * einem Telefon 280 der 390 px. */
@media (max-width:1180px){
  .sr-spalte-3{display:none}
  .sr-kpi-gitter,.sr-kpi-gitter--5{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:1020px){
  .sr-spalte-2{display:none}
  .sr-zwei,.sr-drei{grid-template-columns:1fr}
}
@media (max-width:900px){
  .sr-burger{display:inline-flex}
  /* NUR NOCH EIN STREIFEN (Runde 5): die Icon-Leiste ist weg, die Spalte
     beginnt bei left:0. Damit stimmt die Rechnung wieder, an der sich der
     Burger-Befund vom 30.08.2026 entzuendet hatte — die geschlossene Spalte
     stand bei left:52px, ihre rechte Kante blieb nach translateX(-100%) genau
     auf dem Burger liegen und fing dessen Klick ab. Ohne Leiste faehrt sie mit
     der eigenen Breite vollstaendig hinaus. Das Stummschalten bleibt: es ist
     die zweite, von der Geometrie unabhaengige Sicherung. */
  .sr-nav{position:fixed;top:0;bottom:0;left:0;height:100dvh;z-index:69;
    box-shadow:var(--sr-e-modal);transform:translateX(-100%);
    transition:transform .25s var(--ease),visibility .25s var(--ease);
    visibility:hidden;pointer-events:none}
  .sr-nav.open{transform:translateX(0);visibility:visible;pointer-events:auto}
  .sr-kopf{padding:var(--s3) var(--s3) 0}
  .sr-kopf-zeile{--sr-kopf-seitenrand:var(--s3)}
  .sr-body{padding:var(--s4) var(--s3) var(--s4);gap:var(--s3)}
  .sr-kpi-gitter{gap:var(--s2)}
}
/* Das Paket sagt ausdruecklich „KPI-Grids auf 2 Spalten" — auch auf dem
   Telefon. Eine Spalte gibt es erst unterhalb von 380 px, wo zwei Kacheln
   nebeneinander die Zahl umbrechen wuerden. */
@media (max-width:560px){
  .sr-kpi-gitter,.sr-kpi-gitter--3,.sr-kpi-gitter--5{grid-template-columns:repeat(2,1fr)}
  .sr-modal-paar{grid-template-columns:1fr}
}
@media (max-width:379px){
  .sr-kpi-gitter,.sr-kpi-gitter--3,.sr-kpi-gitter--2,.sr-kpi-gitter--5{grid-template-columns:1fr}
}
@media (prefers-reduced-motion:reduce){
  .sr-nav,.sr-grund,.sr-nav-gruppe-chev{transition:none}
  .sr-marke-logo .radar-kegel,.sr-marke-logo .radar-blip{animation:none}
  /* Der BETA-Chip steht dann still — in seiner Grundgestalt, nicht im
     Höhepunkt: das Leuchten ist die Zugabe, die Aussage tragen Text und
     Rahmen. */
  .sr-beta{animation:none}
}

/* Wertskala fuer Balken und Ringe. Ein style="width:88%" waere unter der CSP
   (style-src 'nonce') blockiert — die Breite kommt deshalb aus einer Klasse.
   Ein-Prozent-Schritte, weil eine Zehnerskala aus 88 % eine 90 % macht und
   damit eine Zahl behauptet, die nicht gemessen wurde. */
.sr-bar-f--0{width:0%}
.sr-bar-f--1{width:1%}
.sr-bar-f--2{width:2%}
.sr-bar-f--3{width:3%}
.sr-bar-f--4{width:4%}
.sr-bar-f--5{width:5%}
.sr-bar-f--6{width:6%}
.sr-bar-f--7{width:7%}
.sr-bar-f--8{width:8%}
.sr-bar-f--9{width:9%}
.sr-bar-f--10{width:10%}
.sr-bar-f--11{width:11%}
.sr-bar-f--12{width:12%}
.sr-bar-f--13{width:13%}
.sr-bar-f--14{width:14%}
.sr-bar-f--15{width:15%}
.sr-bar-f--16{width:16%}
.sr-bar-f--17{width:17%}
.sr-bar-f--18{width:18%}
.sr-bar-f--19{width:19%}
.sr-bar-f--20{width:20%}
.sr-bar-f--21{width:21%}
.sr-bar-f--22{width:22%}
.sr-bar-f--23{width:23%}
.sr-bar-f--24{width:24%}
.sr-bar-f--25{width:25%}
.sr-bar-f--26{width:26%}
.sr-bar-f--27{width:27%}
.sr-bar-f--28{width:28%}
.sr-bar-f--29{width:29%}
.sr-bar-f--30{width:30%}
.sr-bar-f--31{width:31%}
.sr-bar-f--32{width:32%}
.sr-bar-f--33{width:33%}
.sr-bar-f--34{width:34%}
.sr-bar-f--35{width:35%}
.sr-bar-f--36{width:36%}
.sr-bar-f--37{width:37%}
.sr-bar-f--38{width:38%}
.sr-bar-f--39{width:39%}
.sr-bar-f--40{width:40%}
.sr-bar-f--41{width:41%}
.sr-bar-f--42{width:42%}
.sr-bar-f--43{width:43%}
.sr-bar-f--44{width:44%}
.sr-bar-f--45{width:45%}
.sr-bar-f--46{width:46%}
.sr-bar-f--47{width:47%}
.sr-bar-f--48{width:48%}
.sr-bar-f--49{width:49%}
.sr-bar-f--50{width:50%}
.sr-bar-f--51{width:51%}
.sr-bar-f--52{width:52%}
.sr-bar-f--53{width:53%}
.sr-bar-f--54{width:54%}
.sr-bar-f--55{width:55%}
.sr-bar-f--56{width:56%}
.sr-bar-f--57{width:57%}
.sr-bar-f--58{width:58%}
.sr-bar-f--59{width:59%}
.sr-bar-f--60{width:60%}
.sr-bar-f--61{width:61%}
.sr-bar-f--62{width:62%}
.sr-bar-f--63{width:63%}
.sr-bar-f--64{width:64%}
.sr-bar-f--65{width:65%}
.sr-bar-f--66{width:66%}
.sr-bar-f--67{width:67%}
.sr-bar-f--68{width:68%}
.sr-bar-f--69{width:69%}
.sr-bar-f--70{width:70%}
.sr-bar-f--71{width:71%}
.sr-bar-f--72{width:72%}
.sr-bar-f--73{width:73%}
.sr-bar-f--74{width:74%}
.sr-bar-f--75{width:75%}
.sr-bar-f--76{width:76%}
.sr-bar-f--77{width:77%}
.sr-bar-f--78{width:78%}
.sr-bar-f--79{width:79%}
.sr-bar-f--80{width:80%}
.sr-bar-f--81{width:81%}
.sr-bar-f--82{width:82%}
.sr-bar-f--83{width:83%}
.sr-bar-f--84{width:84%}
.sr-bar-f--85{width:85%}
.sr-bar-f--86{width:86%}
.sr-bar-f--87{width:87%}
.sr-bar-f--88{width:88%}
.sr-bar-f--89{width:89%}
.sr-bar-f--90{width:90%}
.sr-bar-f--91{width:91%}
.sr-bar-f--92{width:92%}
.sr-bar-f--93{width:93%}
.sr-bar-f--94{width:94%}
.sr-bar-f--95{width:95%}
.sr-bar-f--96{width:96%}
.sr-bar-f--97{width:97%}
.sr-bar-f--98{width:98%}
.sr-bar-f--99{width:99%}
.sr-bar-f--100{width:100%}

/* ===================================================== Bruecke zum Bestand
 * app.css und theme.css beschreiben die Huelle, die R3 abloest. Was davon
 * uebrig bleibt, wird hier auf die neue Anordnung gestellt — an EINER Stelle,
 * damit sichtbar bleibt, was noch aus der alten Welt stammt. Jede Regel hier
 * ist eine Aufgabe: sie verschwindet, sobald die zugehoerige Ansicht auf die
 * R3-Bausteine umgestellt ist. */

/* Der fixierte Kopfbalken ist weg — sein Platzhalter am body auch. */
body.body--sr{padding-top:0;background:var(--sr-bg);overflow-x:clip}
body.body--sr .header,body.body--sr .topbar,body.body--sr .nav-backdrop{display:none}
/* SCROLL-VERSATZ IST KEINE FESTE ZAHL. Die 96 px, die hier standen, waren
   auf einen einzeiligen Titel mit Reiterzeile gerechnet; bricht der Titel um
   oder faellt die Reiterzeile weg, springt jeder Anker daneben. app.js misst
   den klebenden Kopf (.sr-kopf) und schreibt seine Hoehe nach --sr-kopf-h
   fort — hier kommen die vom Betreiber verlangten 30 px Luft dazu. Der
   Startwert des Tokens in theme.css (96 px) traegt nur den Fall ohne
   JavaScript; dann bleibt es beim bisherigen Verhalten.

   NUR HIER, NICHT ZUSAETZLICH AM ZIEL. Ein scroll-margin-top an den Ankern
   ADDIERT sich zum scroll-padding-top des Scrollbereichs — gemessen auf
   /konto: 191 px Luft statt der verlangten 30, weil beide Werte (163 px)
   uebereinander lagen. */
html:has(body.body--sr){scroll-padding-top:calc(var(--sr-kopf-h) + 30px)}

/* Inhaltsspalte: volle Breite mit 28 px Rand (Paketmass). Die Inhaltsbreite
   aus dem Konto bleibt als Deckel erhalten — das Paket kennt sie nicht, aber
   sie ist eine vorhandene Einstellung und faellt nicht ersatzlos weg. */
/* LINKSBUENDIG ZUM MENUE. Die Inhaltsbreite aus dem Konto (bei Daniel 90 %)
   zentrierte den Inhalt und schob ihn damit um die halbe Restbreite nach
   rechts — gemessen bei 1440 px: Ueberschrift bei 308, Inhalt bei 338, also
   58 px Versatz. Der Kopf steht nicht in .content und macht die Zentrierung
   nicht mit; die beiden liefen deshalb auseinander.
   Die Breite bleibt eine Einstellung, der freie Platz liegt jetzt rechts. */
.content.sr-body{width:var(--inhalt-breite,100%);max-width:var(--inhalt-breite,100%);
  margin-inline:0;font-size:var(--fs-ui);transition:none}

/* DREI STUFEN NACH ZWECK (01.09.2026). Die Konto-Einstellung --inhalt-breite
   bleibt der aeussere Deckel -- min() nimmt immer den kleineren der beiden
   Werte, eine schmal gestellte Oberflaeche wird von der Stufe also nicht
   wieder aufgezogen. Ohne Stufenklasse bleibt es bei der vollen Breite:
   die Verwaltungslisten (8-9 Spalten) und die Anbindungen brauchen sie.
   Der Seitenkopf .sr-kopf laeuft bewusst WEITER durch -- seine Trennlinie
   und der klebende Schatten spannen ueber die ganze Flaeche, waehrend Titel
   und Inhalt dank derselben 28 px Innenabstand linksbuendig bleiben. */
/* DER SCHIEBER MUSS DURCH DIE STUFE HINDURCH WIRKEN (Betreiber-Befund
   04.09.2026, Punkt 2: „Inhaltsbreite wirkt nicht"). Ursache war genau
   dieses min(): auf jedem Schirm, der breit genug ist, gewann der feste
   Stufenwert — 87 % von 1.400 px sind 1.218 px, min() nahm die 1.136 px
   der Stufe, und zwar bei JEDER Schieberstellung von 82 bis 100. Die
   Einstellung war da, sie kam nur nie zum Tragen.
   Jetzt geht der Schieber IN die Stufe ein: /.9 haelt die Vorgabestellung
   (90 %) exakt auf dem bisherigen Wert, 70 % ergeben 78 % davon, 100 %
   ergeben 111 %. Das min() bleibt als aeusserer Deckel stehen, damit auf
   schmalen Fenstern weiter der Prozentwert greift. */
.content.sr-body.sr-body--lesen{max-width:min(var(--inhalt-breite,100%),calc(var(--sr-breite-lesen) * var(--inhalt-faktor,.9) / .9))}
.content.sr-body.sr-body--uebersicht{max-width:min(var(--inhalt-breite,100%),calc(var(--sr-breite-uebersicht) * var(--inhalt-faktor,.9) / .9))}
.content.sr-body.sr-body--arbeit{max-width:min(var(--inhalt-breite,100%),calc(var(--sr-breite-arbeit) * var(--inhalt-faktor,.9) / .9))}

/* Kapitel-Panels: die Karten des Bestands verlieren ihren Rahmen und bekommen
   das R3-Mass (8 px Radius, weicher Schatten statt Randlinie). */
/* Kein Kapitel-Container mehr (01.09.2026): die Vorlage setzt KARTEN auf den
   Seitengrund, nicht eine grosse Karte um alles. Tabellen, Diagramme und
   Kennzahl-Kacheln bringen ihren Rahmen selbst mit; Ueberschriften und
   Fliesstext stehen auf dem Grund. */
.sr-body>.section{margin-bottom:0;background:none;border-radius:0;
  box-shadow:none;padding:0}
.sr-body>.section:not([hidden]){display:block}

/* Reiterzeile aus den Unterkapiteln — dieselbe Mechanik wie bisher, das
   Aussehen der R3-Tabs. Nicht mehr klebend: unter ihr haengt kein fixierter
   Balken mehr, an dessen Hoehe sich ein Versatz haette ausrichten muessen. */
.sr-kopf .unterkapitel-leiste{position:static;background:none;border-bottom:1px solid var(--sr-hair);
  margin-top:var(--s3);z-index:auto;
  --sr-kopf-seitenrand:var(--s4);width:var(--sr-kopf-breite,calc(var(--inhalt-breite,100%) - 2 * var(--sr-kopf-seitenrand) * max(0,1 - var(--inhalt-faktor,.9))));max-width:100%}
.sr-kopf .unterkapitel-band{padding:0;gap:var(--s4);min-width:max-content}
.sr-kopf .unterkapitel-tab{padding:0 var(--s-2) var(--s3);font-size:var(--fs-ui);font-weight:400;
  color:var(--sr-tabmut);gap:var(--s1);border-bottom:2px solid transparent}
.sr-kopf .unterkapitel-tab:hover{opacity:.75;color:var(--sr-tabmut)}
.sr-kopf .unterkapitel-tab[aria-current]{font-weight:700;color:var(--sr-acc-ink);
  border-bottom-color:transparent}
.sr-kopf .unterkapitel-tab-num{display:none}
.sr-kopf .unterkapitel-tab-zahl{font-size:var(--fs-label);font-weight:400;padding:0;background:none;
  color:var(--sr-mut);border-radius:0}
.sr-kopf .unterkapitel-tab[aria-current] .unterkapitel-tab-zahl{background:none;color:var(--sr-mut)}
/* KEIN BLAUER STRICH unter dem aktiven Reiter (Betreiber-Ansage 30.08.2026).
   Der aktive Reiter bleibt an Fettschrift UND Akzentfarbe erkennbar — zwei
   Merkmale, also nicht nur Farbe (WCAG 1.4.1 bleibt gewahrt). Der Indikator
   wird versteckt, nicht entfernt: app.js schiebt ihn weiter mit, und ein
   fehlendes Element haette dort einen Fehler ausgeloest. */
.sr-kopf .unterkapitel-indikator{display:none}

/* Kapitel als Navigationseintraege: .nav-item aus der Haus-Vorlage bringt
   Einzug und eine 3-px-Kante mit, die hier beide stoeren. */
.sr-nav .nav-item.sr-nav-item{border:0;padding:var(--s1) var(--s2);font-weight:400}
.sr-nav .nav-item.sr-nav-item[aria-current]{font-weight:700}
.sr-tabs .nav-item--kapitel{border:0;padding:0 var(--s-2) var(--s3)}

/* Verwaltungsblock: die alte Fassung klebte am Sidebar-Fuss. Hier sitzt er
   ohnehin im Fussbereich der Spalte — die Positionierung entfaellt. */
.sr-nav .nav-verwaltung{position:static;background:none;border:0;padding:0;margin:0;box-shadow:none}
.sr-nav .nav-verwaltung-liste{max-height:none}

/* Beide Listen klappen im Seitenleistenfluss nach oben auf. */
.sr-projektkarte--kontext{border:0;background:none;padding:var(--s1) var(--s2)}
.sr-projektwechsel{display:flex;flex-direction:column;min-height:0;flex-shrink:1}
.sr-projektwechsel.open{flex-shrink:0;max-height:min(44dvh,360px)}
.sr-projektwechsel-kopf{flex:none;gap:var(--s1)}
.sr-projektwechsel-kopf:hover{background:var(--sr-soft)}
.sr-projektwechsel-kopf:focus-visible{outline:2px solid var(--focus-ton);outline-offset:-2px}
.sr-projektwechsel-zahl{font-size:var(--fs-label);font-weight:700;color:var(--sr-mut)}
.sr-projektwechsel-liste{min-height:0;overflow-y:auto;padding:var(--s1);border:0}
.sr-projektwechsel-liste[hidden]{display:none}
.sr-projekt-link{gap:var(--s1)}
.sr-projekt-link .sr-nav-item-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;font-weight:400}
.sr-projekt-link[aria-current] .sr-nav-item-text{font-weight:500}
.sr-projekt-link .nav-ampel{margin-left:auto;flex:none}
.sr-projektwechsel.open .sr-projektwechsel-liste,.nav-verwaltung.open .nav-verwaltung-liste{animation:none}
.nav-verwaltung .nav-verwaltung-chev{transition:transform 120ms cubic-bezier(.2,.8,.2,1)}
.nav-verwaltung.open .nav-verwaltung-chev{transition-duration:240ms}
@media(min-width:901px){html[data-sidebar="collapsed"] .sr-projektwechsel-zahl,html[data-sidebar="collapsed"] .sr-projekt-link .nav-ampel{display:none}}
@media(prefers-reduced-motion:reduce){
  .sr-nav-item::before,.nav-verwaltung .nav-verwaltung-chev{transition:none}
}

/* Benutzer-Menue: klappt rechts oben aus dem Seitenkopf nach UNTEN auf.
   z-index 200, weil der klebende Seitenkopf selbst schon auf 40 liegt und das
   Menue aus ihm heraus ueber den Inhalt faellt. */
.usermenu--kopf{position:relative}
.usermenu--kopf .usermenu-drop{position:absolute;top:calc(100% + 8px);right:0;bottom:auto;left:auto;
  min-width:240px;z-index:200;background:var(--sr-surface);border-radius:var(--sr-r-modal);
  box-shadow:var(--sr-e-modal);padding:var(--s1) 0}
.usermenu--kopf .usermenu-drop[hidden]{display:none}
/* Zahnrad in der Theme-Zeile: kleiner Knopf, Menue klappt nach oben auf. */
.sr-nav-theme .zahnrad-btn{height:24px;width:24px;border-radius:var(--sr-r-ctl)}
.sr-nav-theme .zahnrad-btn svg{width:15px;height:15px}
/* Das Popup hing am 24-px-Zahnrad am rechten Rand der Spalte und lief mit
   right:0 um gut 40 px nach LINKS aus ihr heraus. Solange die Icon-Leiste
   stand, hat deren z-index (60 gegen die 55 der Spalte) genau diesen Streifen
   ueberdeckt — gemessen am 30.08.2026: Popup von x=11 bis x=267, die linken
   41 px unter der Leiste. Mit dem Wegfall der Leiste waere daraus ein echter
   Schnitt am Fensterrand geworden (x=-41). Es haengt deshalb jetzt an der
   ZEILE statt am Knopf und beginnt an ihrem linken Innenrand. */
.sr-nav-theme{position:relative}
/* .zahnrad traegt aus app.css ein position:relative und war damit weiter der
   Bezugsrahmen — gemessen: das Popup begann bei x=203 statt bei x=12 und
   ragte 231 px ueber die Spalte hinaus. Erst mit static hier bezieht es sich
   auf die ZEILE. */
.sr-nav-theme .zahnrad{position:static}
.sr-nav-theme .zahnrad-drop{bottom:calc(100% + 8px);top:auto;right:auto;left:12px;z-index:130;
  background:var(--sr-surface);border-radius:var(--sr-r-modal);box-shadow:var(--sr-e-modal)}

/* Ampelpunkt am Projekt-/Clusterpunkt bleibt, nur kleiner. */
.sr-nav .nav-ampel{flex-shrink:0}

/* Projektkarte: Name und Domain untereinander, nicht in einer Zeile. */
.sr-projektkarte-text{display:flex;flex-direction:column;min-width:0;flex:1}
.sr-projektkarte-name,.sr-projektkarte-url{display:block}

/* Die Kapitelueberschrift steht jetzt im Seitenkopf (h1). Der Kopf der
   .section wiederholte sie darunter samt Nummer — zwei Ueberschriften fuer
   dasselbe Kapitel. Er bleibt fuer Screenreader stehen, nicht fuer das Auge. */
.sr-body>.section>.section-head{position:absolute;width:1px;height:1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap}
/* Kein eigenes Polster mehr (06.09.2026: „Abstand Linie→Hinweis
   halbieren"): gemessen lagen 53 px zwischen Reiterlinie und erster Box
   (26 Body-Polster + 8 Kopf + 16 Sektion + 10 Hinweis-Rand — minus Rundung).
   Jetzt traegt nur das Body-Polster (--s3) plus die 8 px des Kopfes. */
.sr-body>.section{padding-top:0}

/* ABSTAND ZWISCHEN DEN BLOECKEN EINER SEKTION. Die R3-Bloecke (Startkarte,
   Kennzahlengitter, sr-Karte) tragen selbst keinen Aussenabstand — in
   .sr-body kommt er aus dem gap des Flex-Containers. INNERHALB einer
   .section greift der nicht: eine Sektion ist ein schlichter Block ohne gap.
   Gemessen auf Kapitel 01 (31.08.2026): Startkarte -> Kennzahlengitter ->
   „Probleme & Tipps" -> Schrittprotokoll standen auf 0 px und lasen sich als
   ein einziger Klotz. Die uebrigen acht Kapitel waren nicht betroffen — dort
   stehen Bloecke der Bestandsformen, die eigene Aussenabstaende mitbringen.
   Nachbarmargins fallen im Blockfluss zusammen, der 16-px-Abstand der
   DBM-Karte wird dadurch nicht addiert, sondern von den 20 ueberboten. */
.sr-body>.section>.sr-karte,
/* VERTIKALER RHYTHMUS (Betreiber-Anweisung 06.09.2026, Bild „Eigene Keywords"
   gegen „Quick Wins": „Abstand Linie→Hinweis halbieren, Hinweis→Cards
   verdoppeln, Cards→Chart wie der Abstand zwischen den Boxen — ÜBERALL"):
   --sr-gap ist seither --s4 (26 px, theme.css) — der Abstand, den die
   Verwaltungs-Spalte (.sr-verwaltung) schon hatte. Er gilt zwischen allen
   Boxen eines Kapitels: Karte, Kennzahl-Gitter, Tabellenkarte, Hinweis.
   Das Gitter bekommt ihn auch als Kind eines Ansichts-Behaelters (>div>),
   nicht nur direkt in der Sektion — die Reiter-Ansichten wickeln ihren
   Inhalt in <div id="…">.

   `.qw-gitter` STAND HIER NICHT UND WAR DAMIT DER EINE AUSREISSER (Betreiber-
   Befund 08.09.2026, Bild aus Keywords & Rankings → Übersicht). Gemessen am
   laufenden Dienst: dort sass die Karte „Das Wichtigste" mit 0 px direkt an
   der Quick-Wins-Reihe, waehrend jede andere Box derselben Ansicht 26 px
   Abstand hatte — und dieselbe Karte in Backlinks, Besucher, Sichtbarkeit,
   Wettbewerber, Google-Index und Technik & Ladezeiten sauber ihre 26 px vor
   und nach sich hatte. Der Fehler lag also nie an der Karte, sondern am
   Behaelter DAVOR: die Abstaende entstehen in diesem Haus immer als
   `margin-bottom` des VORHERGEHENDEN Blocks, nie als `margin-top` des
   folgenden — und genau diesen Aussenabstand hatte das Quick-Wins-Gitter als
   einziger Baustein nie bekommen. Der Kommentar oben behauptete den Takt
   „zwischen allen Boxen eines Kapitels" schon vorher; diese Zeile macht die
   Aussage wahr. */
.sr-body>.section>.sr-kpi-gitter,.sr-body>.section>div>.sr-kpi-gitter,
.sr-body>.section>.qw-gitter,.sr-body>.section>div>.qw-gitter{margin-bottom:var(--sr-gap)}
/* Hinweiskasten im Kapitelfluss: kein Abstand nach oben (die Sektion bringt
   --s3 zur Reiterlinie mit — das ist der halbierte Abstand), voller Box-
   Abstand nach unten. In Karten, Zellen und der Verwaltungs-Spalte bleibt
   er kompakt bzw. ohne eigenen Rand (dort setzt der Flex-Abstand). */
.sr-body .section .sr-hinweis{margin:0 0 var(--sr-gap)}
.sr-body .section .sr-karte-koerper .sr-hinweis,.sr-body .section td .sr-hinweis{margin:var(--s2) 0}
.sr-body .section .sr-verwaltung>.sr-hinweis,.sr-body .section .sr-karte-koerper>.sr-hinweis:first-child{margin-top:0}
.sr-body .section .sr-verwaltung>.sr-hinweis{margin-bottom:0}
@media (max-width:559px){
  /* Auf dem Telefon frisst 26 px je Box zu viel Bildschirm — dort der alte Takt. */
  .sr-body{--sr-gap:var(--s3)}
}
/* Die Kennzahlreihe steht direkt unter der Reiterzeile — ihr eigener
   Vorlauf kaeme zum Seitenpolster hinzu und liesse oben eine leere Zone.
   Galt bis 01.09.2026 der .kpi-leiste; seit die Kapitelkoepfe auf denselben
   Baustein wie alle anderen Kennzahlen laufen, gilt es dem Gitter. */
.sr-body>.section>.sr-kpi-gitter:first-of-type{margin-top:0}
.sr-body>.section>:last-child{margin-bottom:0}
/* Der Hinweissatz unter einer Liste stand 2 px unter deren letzter Zeile —
   unter einem Diagramm ist dieser knappe Sitz richtig, unter einer Liste
   klebt er (Kapitel 06, „Ältere Messpunkte …"). */
.sr-body>.section>ul+.chart-hinweis{margin-top:var(--s2)}

/* Kapitel als Reiterzeile: .nav-item aus der Haus-Vorlage ist ein
   Blockelement ueber die volle Breite — als Reiter braucht es die
   Eigenbreite zurueck. */
.sr-tabs .nav-item--kapitel{display:inline-block;width:auto;flex:0 0 auto;
  background:none;font-size:var(--fs-ui);font-weight:400;color:var(--sr-tabmut);
  text-align:left;line-height:1.45}
.sr-tabs .nav-item--kapitel:hover{background:none;opacity:.75;color:var(--sr-tabmut)}
.sr-tabs .nav-item--kapitel[aria-current]{font-weight:700;color:var(--sr-acc-ink);background:none}
.sr-tabs .nav-item--kapitel .n{display:none}

/* ============================================ Bestandsinhalte in R3-Form
 * Die Ansichten (projekt.js, verwaltung.js, kosten.js …) rendern weiter ihre
 * gewohnten Klassen. Statt 250 KB Ansichtscode umzuschreiben, bekommen die
 * Klassen hier die Masse des Pakets: Karten ohne Rahmen mit weichem Schatten,
 * Tabellen mit heller Kopfzeile und 34-px-Zeilen, Badges mit 4 px Radius.
 *
 * Alles ist auf .sr-body eingegrenzt. app/views/bericht.js baut sein HTML
 * selbst (Launch-Gate, eigener Stilbaum) und ist davon nicht betroffen. */

.sr-body{font-size:var(--fs-ui);line-height:var(--lh-body);color:var(--sr-ink)}
.sr-body p{margin-bottom:var(--s2);color:var(--sr-mut);font-size:var(--fs-small);line-height:var(--lh-small)}
/* Zwischenueberschriften (Betreiber-Ansage 30.08.2026, Runde 5): 30 Prozent
   groesser als die 13,5 px zuvor und 40 px mehr Luft nach oben (22 -> 62).
   Sie trennen die Abschnitte einer langen Kapitelseite — auf 13,5 px waren
   sie vom Fliesstext (12,5 px) kaum zu unterscheiden. */
.sr-body h3{font-size:var(--fs-h2);font-weight:700;margin:var(--s6) 0 var(--s2);letter-spacing:-.1px;
  color:var(--sr-ink)}
/* Die erste Ueberschrift eines Panels braucht die 62 px nicht — darueber
   steht kein Abschnitt, von dem sie sich abzusetzen haette. :first-child
   allein greift dort NICHT: vor ihr steht immer noch die .section-head, die
   nur optisch versteckt ist (fuer Screenreader bleibt sie stehen). Ohne die
   zweite Regel klaffte am Kopf von /konto eine leere Zone von 62 px. */
.sr-body>.section>h3:first-child,
.sr-body>.section>.section-head+h3{margin-top:0}
/* Seit dem Ansichts-Umbau (31.08.2026) steht in einem Panel nur noch EINE
   Ansicht. Deren Ueberschrift folgt zwar auf den Kapitelkopf (Kennzahlen,
   Erklaerung), aber nicht auf einen gleichrangigen Abschnitt — die 62 px
   sind der Abstand ZWISCHEN Unterkapiteln und hier zu viel. Die erste
   Ueberschrift eines Panels bekommt deshalb 32 px, jede weitere behaelt die
   62 px (Betreiber-Wunsch 27.08.2026, „+50 px vor jedem Unterkapitel" — der
   gilt unveraendert dort, wo tatsaechlich zwei Abschnitte aufeinanderfolgen).
   Gleiche Spezifitaet wie die Regel oben, gewinnt ueber die Reihenfolge. */
.sr-body>.section>h3:first-of-type{margin-top:var(--s5)}

/* Reiter „Verwaltung" (Kapitel 03) — Abstaende, Korrekturen Daniel 02.09.2026.
   STEHT HIER UND NICHT IN app.css, weil die Regeln, die sie ueberstimmen
   muessen, hier stehen: die Zeile darueber (h3:first-of-type) und
   `.sr-body .tbl-wrap{margin:12px 0}` weiter unten. Bei gleicher Spezifitaet
   gewinnt sr.css (Reihenfolge theme -> app -> sr, siehe app/lib/assets.js) —
   in app.css waeren diese beiden Zeilen wirkungslos gewesen, und zwar
   lautlos.

   GEMESSEN, NICHT GERECHNET (scripts/proben/abstand-verwaltung.js am
   laufenden Stand): Margins kollabieren hier paarweise, die Zahl im Regelwerk
   ist nicht die Zahl auf dem Schirm.

     Stelle                      vorher   Ziel
     ueber „Keywords verwalten"   32 px   verdreifachen -> 96
     Intro .. „25 von 30"         74 px   minus 70 %    -> 22 (14 + 8 Polster)
     Hinweis .. Tabelle           20 px   halbieren     -> 10
     Knopf .. Hinweis              2 px   plus 10       -> 12

   96 px ist dabei kein neuer Wert, sondern der Hausabstand fuer h3 in einer
   Sektion (app.css, :where(.content .section) h3) — nur der ERSTE h3 einer
   Sektion wird oben auf 32 gekuerzt, und dieser Reiter hat genau einen.

   Die Cluster-Bloecke darunter liegen ausserhalb von .kw-verwaltung und
   behalten ihre normalen Abstaende.

   .wb-verwaltung (Reiter 09.5 „Verwalten", 03.09.2026) haengt an denselben
   Regeln statt an eigenen: der Block hat dieselbe Gestalt — Ueberschrift,
   Intro, Kopfzeile, Anlege-Formular, eine lange Tabelle. Zwei Regelsaetze
   fuer dasselbe Muster waeren zwei Orte, an denen ein Abstand auseinander
   laeuft. */
.sr-body>.section>h3.kw-verwaltung-kopf{margin-top:var(--s7)}
.sr-body .kw-verwaltung-intro{margin-bottom:var(--s3)}
/* .ki-fragen-verwaltung (06.09.2026, Reiter „Fragen verwalten") haengt seit
   Migration 077 an denselben vier Regeln wie .kw-verwaltung/.wb-verwaltung —
   sie ist der dritte Verwaltungsreiter nach demselben Muster (Karte je
   Abschnitt, Sammelleiste + Tabelle in der letzten) und braucht deshalb
   dieselben Abstaende, keine eigenen. */
.sr-body .kw-verwaltung .app-fuss,.sr-body .wb-verwaltung .app-fuss,.sr-body .ki-fragen-verwaltung .app-fuss{margin-top:var(--s3);padding-top:var(--s1)}
.sr-body .kw-verwaltung .kw-anlegen-hinweis,.sr-body .wb-verwaltung .kw-anlegen-hinweis,.sr-body .ki-fragen-verwaltung .kw-anlegen-hinweis{margin-top:var(--s2);margin-bottom:var(--s0)}
.sr-body .kw-verwaltung .tbl-werkzeuge,.sr-body .wb-verwaltung .tbl-werkzeuge,.sr-body .ki-fragen-verwaltung .tbl-werkzeuge{margin-top:var(--s0);margin-bottom:var(--s-2)}
.sr-body .kw-verwaltung .tbl-wrap,.sr-body .wb-verwaltung .tbl-wrap,.sr-body .ki-fragen-verwaltung .tbl-wrap{margin-top:var(--s-2)}
.sr-body h4{font-size:var(--fs-small);font-weight:700;margin:var(--s3) 0 var(--s1);color:var(--sr-ink)}
.sr-body ul,.sr-body ol{font-size:var(--fs-small);color:var(--sr-mut)}

/* Karten */
.sr-body .cards{gap:var(--sr-gap-kpi);margin:0 0 var(--sr-gap)}
/* Karte und Kennzahl-Kachel sind DASSELBE Ding: Label in Versalien, darunter
   die Zahl, Haarlinie statt Schatten, Radius 8, Polster 16 (gemessene Werte
   der Vorlage, 31.08.2026). Vorher trug die eine 26 px/800 mit Schatten, die
   andere 24 px/600 mit Rahmen — zwei Sprachen fuer eine Sache. */
.sr-body .card{background:var(--sr-surface);box-shadow:var(--sr-e1);border:0;
  border-radius:var(--sr-r-md);padding:var(--s3)}
.sr-body .card .ct{font-size:var(--fs-label);line-height:var(--lh-label);text-transform:uppercase;
  letter-spacing:.5px;color:var(--sr-mut);font-weight:400;margin-bottom:var(--s0)}
.sr-body .card .cv{font-size:var(--fs-kpi);line-height:var(--lh-kpi);font-weight:var(--fw-bold);letter-spacing:-.02em;
  margin:0;color:var(--sr-ink);font-variant-numeric:tabular-nums}
.sr-body .card .cs{font-size:var(--fs-small);line-height:16px;color:var(--sr-mut);margin-top:var(--s0)}

/* Tabellen: helle Kopfzeile statt dunklem Band, schmalere Zeilen. */
.sr-body .tbl-wrap{margin:var(--s2) 0;border-radius:var(--sr-r-card)}
.sr-body table{font-size:var(--fs-small);border-collapse:collapse}
.sr-body thead{background:none}
.sr-body th{padding:var(--s1) var(--s3);font-size:var(--fs-label);text-transform:none;letter-spacing:0;
  color:var(--sr-mut);font-weight:700;background:none;
  border-bottom:1px solid var(--sr-hair);border-radius:0}
.sr-body td{padding:var(--s1) var(--s3);height:auto;min-height:34px;font-size:var(--fs-small);
  color:var(--sr-ink);border-bottom:1px solid var(--sr-hair)}
.sr-body tbody tr:hover>td{background:var(--sr-soft)}

/* Hinweisboxen: schmale Karte mit farbiger Kante statt Schattenblock. */
.sr-body .info{padding:var(--s2) var(--s3);border-radius:var(--sr-r-ctl);margin:var(--s2) 0;
  font-size:var(--fs-small);line-height:1.5;background:var(--sr-soft);box-shadow:none;
  border-left:3px solid var(--sr-hair);color:var(--sr-ink)}
.sr-body .info--ok{border-left-color:var(--sr-ok)}
.sr-body .info--warn{border-left-color:var(--sr-warn)}
.sr-body .info--stop{border-left-color:var(--sr-err)}
.sr-body .info--note,.sr-body .info--key{border-left-color:var(--sr-acc)}

/* Badges */
/* Ein .tag ist im Normalfall ein Schildchen. Ist es ein Link oder Knopf —
   „CSV" ueber einer Tabelle, ein Zeitraum-Schalter —, ist es ein
   Bedienelement und faellt unter WCAG 2.2 AA (2.5.8, 24 px): gemessen
   50x18 px. Die Regel steht HIER und nicht in app.css, weil .sr-body .tag
   (0,2,0) ein dortiges a.tag (0,1,1) ueberstimmt haette. */
.sr-body a.tag, .sr-body button.tag{padding-block:var(--s1)}
.sr-body .tag{padding:var(--s-2) var(--s1);border-radius:var(--sr-r-badge);font-size:var(--fs-label);
  font-weight:700;background:var(--sr-soft);color:var(--sr-mut)}
.sr-body .tag-g{color:var(--sr-ok-ink);background:color-mix(in oklab,var(--sr-ok) 15%,transparent)}
.sr-body .tag-a{color:var(--sr-warn-ink);background:color-mix(in oklab,var(--sr-warn) 15%,transparent)}
.sr-body .tag-r{color:var(--sr-err-ink);background:color-mix(in oklab,var(--sr-err) 12%,transparent)}
.sr-body .tag-b{color:var(--sr-acc-ink);background:color-mix(in oklab,var(--sr-acc) 14%,transparent)}

/* Schaltflaechen des Bestands auf das Paketmass. */
.sr-body .knopf{font-size:var(--fs-ui);font-weight:600;border-radius:var(--sr-r-ctl);
  padding:var(--s1) var(--s2);min-height:32px;border:1px solid var(--sr-feld-line);
  background:var(--sr-surface);color:var(--sr-ink)}
/* BLAUE KNOEPFE BEKOMMEN WEISSE SCHRIFT (Betreiber-Regel, zuletzt 06.09.2026
   abends „zum 100. Mal"): Haus-Blau --knopf-blau mit --auf-knopf (Weiss,
   4,6:1), nicht das Cyan des Designsystems mit dunkler Schrift. */
.sr-body .knopf--haupt{font-weight:700;background:var(--knopf-blau);color:var(--auf-knopf);
  border-color:transparent}
.sr-body .knopf--haupt:hover{background:var(--knopf-blau-hover);color:var(--auf-knopf)}
/* background-COLOR, nicht die Kurzform `background` (Fund 01.09.2026): die
   Kurzform setzt auch background-image zurueck — und damit den Aufklapp-Pfeil,
   den app.css jedem <select class="feld-eingabe"> als eingebettetes SVG gibt.
   sr.css laedt NACH app.css und gewann, also stand JEDES Dropdown der
   Anwendung ohne Pfeil da und sah aus wie ein Textfeld (Tarifwahl in
   /verwaltung/mandanten, Chart-Engine in /verwaltung/darstellung, die
   Auswahl auf /anbindungen). */
.sr-body input:not([type=checkbox]):not([type=radio]):not([type=range]),
.sr-body select,.sr-body textarea{font-size:var(--fs-small);border-radius:var(--sr-r-ctl);
  border:1px solid var(--sr-feld-line);background-color:var(--sr-soft);color:var(--sr-ink);
  min-height:32px;padding:var(--s1) var(--s2)}

/* Tabellenkopf: .tbl-wrap thead th ist spezifischer als .sr-body th und
   behielt deshalb das dunkle Band samt weisser Innenlinie. */
.sr-body .tbl-wrap thead th{background:var(--sr-surface);
  box-shadow:inset 0 -1px 0 var(--sr-hair);color:var(--sr-mut)}
.sr-body .tbl-wrap.tbl-scrollable thead th:first-child{background:var(--sr-surface)}
.sr-body .tbl-wrap table{border-collapse:collapse}
/* Kennungen (Slug, Aktionscode) brechen sonst Buchstabe fuer Buchstabe um,
   sobald die Spalte schmal wird — eine Kennung ist ein Stueck, kein Fliesstext. */
.sr-body td code,.sr-body th code,.sr-body .slug,.sr-body .kennung{white-space:nowrap}

/* Nur fuer Screenreader — Statuskacheln tragen ihr Zeichen fuers Auge und
   das Wort fuers Vorlesen. */
.sr-sr-only{position:absolute;width:1px;height:1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap}

/* Mindestbreiten der Tabellen als Stufen (siehe ui.srTabellenKarte). */
.sr-tabelle--min700{min-width:700px}
.sr-tabelle--min860{min-width:860px}
.sr-tabelle--min940{min-width:940px}
.sr-tabelle--min1080{min-width:1080px}

/* Delta unter dem Score-Ring */
.sr-ring-delta--ok{color:var(--sr-ok-ink)}
.sr-ring-delta--warn{color:var(--sr-warn-ink)}
.sr-ring-delta--err{color:var(--sr-err-ink)}
.sr-ring-delta--neutral{color:var(--sr-mut)}

/* Trendzeichen in der Wettbewerbertabelle */
.sr-wb-auf{color:var(--sr-ok-ink);font-weight:700}
.sr-wb-ab{color:var(--sr-err-ink);font-weight:700}
.sr-wb-gleich{color:var(--sr-mut)}

/* Ansicht 9.3 „Keyword-Luecken": die Plaetze 1-3 einer Luecke in EINER Zelle.
   Untereinander statt nebeneinander — drei Domains nebeneinander sprengen die
   Spalte auf schmalen Schirmen, und die Rangfolge liest sich von oben nach
   unten ohnehin besser als von links nach rechts. */
.sr-luecke-oben{display:flex;flex-direction:column;gap:var(--s0);min-width:0}
/* Auf dem Telefon nebeneinander statt untereinander: die Tabelle scrollt dort
   waagerecht, die Spalte steht also ausserhalb des Bildes — ihre drei Zeilen
   Hoehe blieben aber und machten aus jeder Zeile einen fast leeren Block. */
@media (max-width:700px){
  .sr-luecke-oben{flex-direction:row;flex-wrap:wrap;gap:var(--s0) var(--s2)}
}
.sr-luecke-platz{display:flex;align-items:baseline;gap:var(--s1);min-width:0;font-size:var(--fs-small)}
.sr-luecke-platz a{overflow-wrap:anywhere}
.sr-luecke-pos{flex:0 0 auto;min-width:16px;text-align:right;font-variant-numeric:tabular-nums;
  font-weight:700;color:var(--sr-mut);font-size:var(--fs-label)}

/* R3-native Kapitel bringen ihre Karten selbst mit — die Kapitelhuelle ist
   dort keine Karte, sondern nur ein Behaelter mit dem Kartenabstand. */
.sr-body>.section--blank{background:none;box-shadow:none;padding:0;
  display:flex;flex-direction:column;gap:var(--sr-gap)}
/* GEMESSEN, NICHT GESCHAETZT (scripts/proben/abstand-wb.js, 1440x900,
   04.09.2026). Die Ueberschrift einer Ansicht stand hier auf `margin:0` und
   klebte damit 28 px unter der Reiterleiste und unmittelbar auf der ersten
   Karte — Betreiber-Befund: „nicht so gequetscht … halte dich an die
   Abstände die üblich sind in der App". Die uebrigen Kapitel messen
   38 px darueber und 10 px darunter (Besucher → Herkunft, Technik → CWV);
   genau die stehen jetzt auch hier. Der Flex-Gap der Huelle traegt weiterhin
   den Abstand ZWISCHEN den Karten, deshalb nur die Ueberschrift. */
.sr-body>.section--blank>h3{margin:var(--s5) 0 var(--s2)}
/* Die Zeile darunter muss `.sr-body>.section>.section-head+h3:first-of-type`
   aus sr-bausteine.css ueberstimmen (gleiche Spezifitaet, spaeter geladen) —
   deshalb `.section.section--blank` statt nur `.section--blank`. Gemessen:
   ohne diesen Zusatz blieb margin-top auf 0. */
.sr-body>.section.section--blank>.section-head+h3:first-of-type{margin-top:var(--s5)}

/* ------------------------------------------------------ Startseite (R3) */
.sr-startkarte{display:grid;grid-template-columns:1fr 1fr}
/* Gitterkinder duerfen SCHRUMPFEN. Ohne das gilt min-width:auto, und die linke
   Haelfte zwingt die Karte auf die Breite ihres Inhalts: auf 390 px waren das
   449 px, die das Layout stumm abschnitt — Crawling-Status und Startzeit standen
   halb ausserhalb des Bildes (gemessen 01.09.2026, body.scrollWidth 465). */
.sr-startkarte>*{min-width:0}
.sr-startkarte-l{padding:var(--s3) var(--s4);display:flex;gap:var(--s3);border-right:1px solid var(--sr-hair)}
/* Textspalte der Startkarte: Meta-Zeilen und Berichtsknopf stehen UNTEREINANDER
   neben der Vorschau. Ohne diesen Behaelter waere der Knopf eine dritte Spalte
   der Zeilen-Flexbox und laege auf dem Crawling-Status (Befund 01.09.2026). */
.sr-startkarte-txt{display:flex;flex-direction:column;min-width:0;flex:1 1 auto}
/* Der Ausklapper „Wie diese Bewertung zustande kommt" laeuft ueber BEIDE
   Spalten der Startkarte — er erklaert den grossen Ring und die drei kleinen
   zusammen, und eingeklappt kostet er eine Zeile. */
.sr-startkarte-fuss{grid-column:1 / -1;border-top:1px solid var(--sr-hair);padding:var(--s2) var(--s4)}
.sr-startkarte-fuss .explain{margin:0}
/* Betrieb-Sammelplatz am Seitenende (ui.betriebSektion, Kundenrollen-Riegel
   03.09.2026). Eine Trennlinie darueber, damit sichtbar bleibt: hier endet
   das Kundenprodukt und beginnt die Betriebssicht. */
.sr-betrieb{margin-top:var(--sr-gap);padding-top:var(--sr-gap);border-top:1px solid var(--sr-hair)}
.sr-mut{color:var(--sr-mut)}
.sr-startkarte-r{padding:var(--s3) var(--s4);display:flex;align-items:center;gap:var(--s4);flex-wrap:wrap}
.sr-vorschau{width:132px;height:88px;border-radius:var(--sr-r-ctl);background:var(--sr-soft);
  border:1px solid var(--sr-hair);display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:var(--s0);color:var(--sr-mut);font-size:var(--fs-label);flex-shrink:0;text-align:center}
.sr-startmeta{display:grid;grid-template-columns:auto 1fr;gap:var(--s0) var(--s3);font-size:var(--fs-small);
  align-content:start;min-width:0}
.sr-startmeta-l{color:var(--sr-mut)}
.sr-startmeta-w{font-weight:600}
.sr-unterringe{display:flex;flex-direction:column;gap:var(--s2)}
.sr-unterring{display:flex;align-items:center;gap:var(--s2)}
.sr-unterring-wert{font-size:var(--fs-ui);font-weight:800;color:var(--sr-ink)}
.sr-unterring-label{font-size:var(--fs-label);color:var(--sr-mut)}

/* Probleme & Tipps */
.sr-problem-kopf{padding-bottom:0}
.sr-filterreiter{display:flex;gap:var(--s3);border-bottom:1px solid var(--sr-hair);
  overflow-x:auto;scrollbar-width:none}
.sr-filterreiter::-webkit-scrollbar{display:none}
.sr-filterreiter-tab{padding:0 var(--s-2) var(--s1);font:inherit;font-size:var(--fs-ui);color:var(--sr-tabmut);
  background:none;border:0;border-bottom:2px solid transparent;cursor:pointer;white-space:nowrap;
  min-height:28px}
.sr-filterreiter-tab:hover{opacity:.75}
.sr-filterreiter-tab[aria-current]{font-weight:700;color:var(--sr-acc-ink);
  border-bottom-color:var(--sr-acc-line)}
.sr-problem{display:grid;grid-template-columns:26px 1fr auto;align-items:center;gap:var(--s2);
  padding:var(--s2) var(--s3);border-bottom:1px solid var(--sr-hair)}
.sr-problem:hover{background:var(--sr-soft)}
.sr-problem[hidden]{display:none}
.sr-problem-text{font-size:var(--fs-small);color:var(--sr-ink);min-width:0}
.sr-problem-text strong{font-weight:700}
/* Jede Befundzeile ist ein Verweis in den Drilldown (Kapitel 06, 6.4).
   Sie soll wie eine Zeile aussehen und sich wie ein Verweis verhalten: die
   Akzentfarbe der App wuerde aus jeder Zeile einen blauen Block machen. */
.sr-problem--link{grid-template-columns:26px 1fr auto 10px;color:inherit;
  text-decoration:none;cursor:pointer}
.sr-problem--link:hover{text-decoration:none;background:var(--sr-soft)}
.sr-problem--link:hover .sr-problem-text{color:var(--sr-acc-ink)}
.sr-problem-chev{width:10px;height:10px;color:var(--sr-mut);flex-shrink:0}
.sr-problem--link:hover .sr-problem-chev{color:var(--sr-acc-ink)}
.sr-problem-lead{font-size:var(--fs-small);color:var(--sr-mut);margin:0 0 var(--s2);line-height:1.5}
/* Suchfeld im Kartenkopf — es filtert dieselben Zeilen wie die Reiter. */
.sr-problem-suche{display:flex;min-width:0}
.sr-problem-suche .feld-eingabe{width:220px;max-width:100%;font-size:var(--fs-small);padding:var(--s0) var(--s2)}
.sr-problem-leer{padding:var(--s3);font-size:var(--fs-small);color:var(--sr-mut);margin:0}
.sr-problem-leer[hidden]{display:none}
.sr-nur-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
@media (max-width:700px){
  .sr-problem-suche .feld-eingabe{width:100%}
  .sr-problem-suche{flex:1 1 100%}
}
@media (max-width:700px){
  .sr-startkarte{grid-template-columns:1fr}
  /* Auf dem Telefon steht die Vorschau UEBER den Zeilen statt daneben: als
     Spalte nahm der 132-px-Platzhalter 43 % der Breite und presste
     „Grün · Alle Schritte fehlerfrei" auf vier Zeilen. */
  .sr-startkarte-l{border-right:0;border-bottom:1px solid var(--sr-hair);flex-direction:column}
  .sr-vorschau{width:100%;height:72px}
  .sr-problem,.sr-problem--link{grid-template-columns:26px 1fr;gap:var(--s1)}
  .sr-problem>.sr-chip{grid-column:2}
  .sr-problem-chev{display:none}
}

/* Meta-Gitter im Seiten-Detail: Werte duerfen umbrechen, Beschriftung nicht. */
.sr-metagitter{gap:var(--s1) var(--s3)}
.sr-metagitter>span:nth-child(even){word-break:break-word;min-width:0}
.sr-metagitter .mono{font-family:var(--font-mono);font-size:var(--fs-mono)}

/* Keyword-Detail: Marken unter dem Positionsverlauf, eigene SERP-Zeile.
   Die eigene Zeile traegt Toenung UND Fettschrift — Farbe allein darf nie
   der einzige Traeger einer Information sein (WCAG 1.4.1). */
.sr-verlauf-marken{display:flex;justify-content:space-between;gap:var(--s2);flex-wrap:wrap;
  margin-top:var(--s1);font-size:var(--fs-label);color:var(--sr-mut)}
.sr-eigen{font-weight:700}
.sr-tabelle tr:has(.sr-eigen)>td{background:color-mix(in oklab,var(--sr-acc) 8%,transparent)}

/* .mono traegt word-break:break-all — sinnvoll fuer lange URLs im Fliesstext,
   in einer Tabellenzelle zerlegt es aber jede Kennung in Einzelbuchstaben
   („acke rmann - onlin e"). In Tabellen bleibt sie am Stueck; zu eng wird die
   Spalte nicht, weil die Tabelle waagerecht scrollt. */
.sr-body td .mono,.sr-body th .mono{word-break:normal;white-space:nowrap;
  background:var(--sr-soft);font-size:var(--fs-label);padding:var(--s-2) var(--s1)}
/* AUSNAHME (01.09.2026): der Satz oben — „zu eng wird die Spalte nicht, weil
   die Tabelle waagerecht scrollt" — stimmte, solange jede Seite 1.212 px breit
   war. In der 672-px-Lesespalte schob der Browser-String der Sitzungstabelle
   die Tabelle um gemessene 451 px hinaus. Er ist der einzige mono-Wert der
   App, der Fliesstext ist statt Kennung, und darf deshalb umbrechen. */
.sr-body td .mono.mono-umbruch,.sr-body th .mono.mono-umbruch{
  white-space:normal;overflow-wrap:anywhere}
/* Aktionszellen: Auswahlfeld und Knopf nebeneinander statt uebereinander,
   und sie duerfen die Spalte nicht sprengen. */
.sr-body td .vw-aktion{display:inline-flex;align-items:center;gap:var(--s1);flex-wrap:wrap;margin:0}
.sr-body td .vw-aktion .feld-eingabe{min-width:0;max-width:170px}

/* ---------------------------------------------------- Anmeldung (Screen 10)
 * Zentrierte Karte auf der Seitenflaeche, Marke darueber. */
body.body--sr-zentriert{background:var(--sr-bg);color:var(--sr-ink);
  font-family:var(--font-body);font-size:var(--fs-ui)}
body.body--sr-zentriert .zentriert-marke{display:flex;align-items:center;justify-content:center;
  gap:var(--s2);flex-wrap:wrap;margin-bottom:var(--s4)}
body.body--sr-zentriert .zentriert-marke-titel{font-size:var(--fs-h2);font-weight:var(--fw-black);letter-spacing:1.6px;line-height:var(--lh-score);
  color:var(--sr-ink)}
body.body--sr-zentriert .zentriert-marke-sub{flex-basis:100%;text-align:center;font-size:var(--fs-label);
  color:var(--sr-mut)}
body.body--sr-zentriert .zentriert-marke-icon{display:flex}
body.body--sr-zentriert .zentriert-marke-icon .sr-marke-logo{width:44px;height:44px}
body.body--sr-zentriert .anmeldekarte{background:var(--sr-surface);border-radius:var(--sr-r-modal);
  box-shadow:var(--sr-e-modal);padding:var(--s4);width:min(360px,100%);border:0}
body.body--sr-zentriert .anmelde-titel{font-size:var(--fs-h2);font-weight:700;margin:0 0 var(--s1);
  color:var(--sr-ink);letter-spacing:0}
body.body--sr-zentriert .anmelde-sub{font-size:var(--fs-small);color:var(--sr-mut);margin:0 0 var(--s3)}
body.body--sr-zentriert .anmelde-form{display:flex;flex-direction:column;gap:var(--s3)}
.anmelde-zeile{display:flex;align-items:center;justify-content:space-between;gap:var(--s2);
  flex-wrap:wrap;font-size:var(--fs-small)}
/* Veto 5 (Designsystem, Barrierefreiheit): „Passwort vergessen?" mass 19 px
   hoch — unter dem 24-px-Ziel aus WCAG 2.5.8. Vier Pixel senkrechtes Polster
   heben die Trefflaeche auf 27 px, ohne die Zeile hoeher zu machen: der
   negative Aussenabstand gibt dem Layout die vier Pixel wieder zurueck. */
.anmelde-zeile a{display:inline-block;padding-block:var(--s0);margin-block:calc(var(--s0) * -1)}
/* Der Satz unter dem Haken (Auftrag 04.09.2026). Er steht als eigener Absatz
   und NICHT im title des Kaestchens: eine Sitzungsfrist von 30 Tagen ist
   nichts, was man mit der Maus suchen soll. Negativer Vorlauf, weil das
   Formular selbst schon --s3 zwischen die Zeilen legt. */
body.body--sr-zentriert .anmelde-bleiben-hinweis{margin:calc(var(--s2) * -1) 0 0;
  font-size:var(--fs-label);line-height:1.45;color:var(--sr-mut)}
.anmelde-knopf{width:100%;justify-content:center;padding:var(--s2)}
body.body--sr-zentriert .anmelde-fuss{text-align:center;font-size:var(--fs-small);color:var(--sr-mut);
  margin:var(--s3) 0 0}

/* Passkey-Weg auf der Anmeldeseite. Steht `hidden` im HTML und wird von
   app/views/passkey.js eingeblendet — nur wenn der Browser WebAuthn kann.
   Der Trenner ist eine Linie mit ausgespartem Wort, keine zweite Ueberschrift:
   es sind zwei Wege in dieselbe Anwendung, nicht zwei Abschnitte. */
body.body--sr-zentriert .anmelde-passkey{margin-top:var(--s3)}
body.body--sr-zentriert .anmelde-trenner{display:flex;align-items:center;gap:var(--s2);
  margin:0 0 var(--s3);font-size:var(--fs-label);color:var(--sr-mut)}
body.body--sr-zentriert .anmelde-trenner::before,
body.body--sr-zentriert .anmelde-trenner::after{content:"";flex:1;height:1px;background:var(--sr-hair)}
body.body--sr-zentriert .anmelde-passkey-meldung{text-align:center;font-size:var(--fs-small);
  color:var(--sr-err-ink);margin:var(--s2) 0 0}
body.body--sr-zentriert .zentriert-fuss{text-align:center;font-size:var(--fs-label);color:var(--sr-mut)}

/* Beruehrungsziele in Tabellenzellen. Die Zeile ist 34 px hoch, die
   Verweis-Box darin aber nur 15 — auf dem Telefon gemessen (WCAG 2.5.8
   verlangt 24 px). Senkrechte Innenabstaende vergroessern die Trefferflaeche
   eines Inline-Elements, ohne die Zeilenhoehe oder die Ellipse zu
   veraendern; ein display:inline-block haette Letztere zerstoert. */
.sr-body .sr-tabelle td a,.sr-body .tbl-wrap td a{padding-block:var(--s1)}

/* HAUSVORGABE 44 PX — AM BEDIENELEMENT, NICHT AN DER ZEILE (08.09.2026).
   Das Design-Briefing verlangt Touchziele ab 44 px. Im Browser gemessen
   (getBoundingClientRect, Chromium): 27,0 px komfortabel und 26,0 px kompakt
   — ueber dem WCAG-Minimum von 24, unter der Hausvorgabe. Wer nachrechnet,
   kommt auf 30,2 px und liegt daneben: die Trefferflaeche eines INLINE-
   Elements ist der Inhaltsbereich der Schrift plus Polster, nicht die
   Zeilenhoehe (13 px Inter geben rund 15 px, nicht die 18,2 px aus
   line-height 1.4).
   DIE ZEILE WIRD DAFUER NICHT GESTRECKT. Die Vorgabe zielt auf das
   Bedienelement, nicht auf jede Datenzeile: die Arbeitsflaeche ist bewusst
   dicht (46 px komfortabel, 30 px kompakt), und eine 44-px-Zeile im
   Kompaktmodus waere ein Rueckschritt um ein Drittel Bildschirmhoehe.
   Stattdessen waechst der Klickbereich als unsichtbares ::after ueber den
   sichtbaren Text hinaus — bis an den Rand der Zeile, nie darueber:
     komfortabel  Zeile 46 px -> Band 44 px  (Hausvorgabe erfuellt)
     kompakt      Zeile 30 px -> Band 30 px  (WCAG 2.5.8 erfuellt)
   Ein Band ueber die Zeilengrenze hinaus wuerde die Trefferflaechen
   benachbarter Zeilen ueberlappen, und dort gewinnt der zuletzt gezeichnete
   Verweis — ein Fehlgriff ist schlimmer als ein knappes Ziel. WCAG 2.5.8
   loest zu kleine Ziele deshalb ueber ABSTAND, nie ueber Ueberlappung.
   WAAGERECHT bleibt es beim Elementkasten: zwei Icon-Knoepfe trennen nur
   6 px Abstand, ein 44 px breites Band griffe in den Nachbarn. Erst am
   Finger (pointer:coarse) waechst beides — dort zaehlt die Hausvorgabe, und
   die 6 px mehr Spaltenbreite traegt die Tabelle, die ohnehin waagerecht
   scrollt. */
.sr-body{--sr-treffer:44px}
[data-density="kompakt"] .sr-body{--sr-treffer:30px}
.sr-body .sr-tabelle td a,.sr-body .tbl-wrap td a,
.sr-body td .sr-ikon-knopf{position:relative}
.sr-body .sr-tabelle td a::after,.sr-body .tbl-wrap td a::after,
.sr-body td .sr-ikon-knopf::after{content:"";position:absolute;left:0;right:0;top:50%;
  height:var(--sr-treffer);transform:translateY(-50%)}

/* Aktionszellen der Verwaltung: Auswahlfeld und Knoepfe stehen als je eigenes
   Formular in derselben Zelle und stapelten sich untereinander — eine Zeile
   wurde damit dreimal so hoch wie die 34 px des Entwurfs, und der Text
   „Testphase starten (14 Tage)" brach auf drei Zeilen um. Die Zelle ist jetzt
   eine Reihe; sie darf umbrechen, aber erst wenn es wirklich eng wird. */
.sr-body td:has(.vw-aktion),.sr-body td:has(.vw-aktionen){white-space:nowrap}
.sr-body td .vw-aktionen{display:inline-flex;flex-wrap:wrap;gap:var(--s1);align-items:center;
  vertical-align:middle}
.sr-body td .vw-aktion{display:inline-flex;align-items:center;gap:var(--s1);margin:0;
  vertical-align:middle}
.sr-body td .vw-aktion .knopf,.sr-body td .vw-aktionen .knopf{white-space:nowrap}
/* Am Finger gilt die Hausvorgabe auch waagerecht: 32 px Knopf + 12 px
   Abstand = 44 px von Mitte zu Mitte — die Trefferbaender stossen aneinander,
   ohne sich zu ueberlappen. Steht NACH der Abstandsregel darueber, sonst
   gewinnt bei gleicher Staerke die spaetere Stelle mit den alten 6 px.
   Nur in der Aktionsgruppe: ein einzelner Stift steht neben Text, nicht
   neben einem zweiten Ziel. */
@media (pointer:coarse){
  .sr-body td .vw-aktionen{gap:12px}
  .sr-body td .vw-aktionen .sr-ikon-knopf::after{left:-6px;right:-6px}
}

/* Icon-Knoepfe in Tabellen (06.09.2026, ui.ikonKnopf): 32 px Trefflaeche,
   Strich-Icon, Ton ueber die Farbe des Icons — haupt = Akzent, achtung = Rot,
   leise = ohne Rand (Stift am Namen). Das Wort steht in title/aria-label. */
/* Ohne Kaestchen, gefuellt, gross (Anweisung Daniel 06.09.2026): 32 px
   Trefflaeche, 24-px-Glyphe; Ton = Farbe der Glyphe (haupt Akzent, achtung
   Rot, sonst Grau), Hover hebt nur die Farbe. */
.sr-ikon-knopf{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;
  padding:0;border:0;border-radius:var(--sr-r-ctl);background:transparent;
  color:var(--sr-mut);cursor:pointer;flex:none;transition:color var(--t-fast) var(--ease),background var(--t-fast) var(--ease)}
.sr-ikon-knopf svg{width:24px;height:24px;display:block}
.sr-ikon-knopf:hover{color:var(--sr-ink);background:var(--sr-soft)}
.sr-ikon-knopf:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px}
.sr-ikon-knopf--haupt{color:var(--sr-acc-ink)}
.sr-ikon-knopf--haupt:hover{color:var(--sr-acc-ink);background:var(--accent-soft)}
.sr-ikon-knopf--achtung{color:var(--sr-err-ink)}
.sr-ikon-knopf--achtung:hover{color:var(--sr-err-ink);background:var(--red-dim)}
.sr-ikon-knopf--leise{width:28px;height:28px;opacity:.55}
.sr-ikon-knopf--leise svg{width:20px;height:20px}
.sr-ikon-knopf--leise:hover,.sr-ikon-knopf--leise:focus-visible{opacity:1}
.sr-ikon-knopf[disabled]{opacity:.35;cursor:not-allowed}
.sr-ikon-knopf[disabled]:hover{background:transparent;color:var(--sr-mut)}
/* Name mit Stift: Text und Stift in einer Zeile, das Umbenennen-Formular
   nimmt beim Aufklappen dieselbe Zelle ein. `.sr-name`/`.sr-name-zelle`/
   `.sr-inline-form` sind der generische Baustein ui.inlineName() (Nachtrag
   07.09.2026, Aufgabe cmtpxsziv) — dieselben Regeln wie `.kw-name`/
   `.kw-umbenennen`, an die Benutzer-/Mandanten-/Zeitplan-Tabellen ohne
   Dopplung angeschlossen. */
.kw-name,.sr-name{display:inline-flex;align-items:center;gap:var(--s0)}
.kw-name[hidden],.sr-name[hidden]{display:none}
.kw-name-zelle,.sr-name-zelle{white-space:nowrap}
.kw-umbenennen,.sr-inline-form{display:inline-flex;align-items:center;gap:var(--s0)}
/* hidden muss gegen `.sr-body td .vw-aktion{display:inline-flex}` (0,2,1)
   gewinnen — sonst steht das Formular trotz Attribut offen (gemessen 06.09.). */
.sr-body td .vw-aktion[hidden],.kw-umbenennen[hidden],.sr-inline-form[hidden]{display:none}
.kw-umbenennen .feld-eingabe--klein,.sr-inline-form .feld-eingabe--klein{width:min(28ch,100%)}
/* Auswahlspalte + Leiste (ui.auswahlKopf/auswahlZelle/auswahlLeiste) */
.sr-body th.sr-wahl-spalte,.sr-body td.sr-wahl-spalte{width:36px;padding-right:0;text-align:center}
.sr-wahl{width:16px;height:16px;margin:0;accent-color:var(--sr-acc-ink);cursor:pointer;vertical-align:middle}
/* EINE Zeile, Knoepfe ohne Rand, 5 px Luft, Aufheben ganz links, Loeschen
   rot (Befund Daniel 06.09.2026). Bei Platznot rollt die Leiste waagerecht
   statt umzubrechen. */
.sr-auswahl-leiste{display:flex;align-items:center;gap:5px;flex-wrap:nowrap;overflow-x:auto;
  padding:var(--s1) var(--s2);margin:0 0 var(--s2);border-radius:var(--sr-r-md);
  background:var(--accent-soft);border:1px solid var(--sr-acc-line)}
.sr-auswahl-leiste[hidden]{display:none}
.sr-auswahl-zahl{font-weight:700;color:var(--sr-ink);margin:0 var(--s2) 0 var(--s0);white-space:nowrap}
.sr-auswahl-aktionen{display:inline-flex;gap:5px;flex-wrap:nowrap}
.sr-auswahl-leiste .knopf{border:0;box-shadow:none;white-space:nowrap;background:transparent;color:var(--sr-ink);
  padding:6px 10px;min-height:34px}
.sr-auswahl-leiste .knopf:hover{background:var(--sr-surface);transform:none}
.sr-auswahl-leiste .knopf--haupt{background:var(--knopf-blau);color:var(--auf-knopf)}
.sr-auswahl-leiste .knopf--haupt:hover{background:var(--knopf-blau-hover)}
.sr-auswahl-leiste .knopf--achtung{background:var(--sr-err);color:#fff}
.sr-auswahl-leiste .knopf--achtung:hover{background:var(--sr-err-ink)}
.sr-auswahl-leiste .knopf svg{width:18px;height:18px;margin-right:4px;flex:none}
.sr-auswahl-aufheben{width:34px;padding:0 !important;justify-content:center}
.sr-auswahl-aufheben svg{margin:0 !important}
.sr-auswahl-einordnen{display:inline-flex;gap:5px;align-items:center;flex-wrap:nowrap;
  margin-left:var(--s1);padding-left:var(--s2);border-left:1px solid var(--sr-acc-line)}
.sr-auswahl-einordnen .feld-eingabe--klein{min-height:30px;padding:2px 8px;font-size:var(--fs-small)}
.kw-umbenennen .feld-eingabe--klein,.sr-inline-form .feld-eingabe--klein{min-height:30px}
.kw-umbenennen select.feld-eingabe--klein,.sr-inline-form select.feld-eingabe--klein{width:auto;max-width:14ch}

/* =========================================================================
 * ANBINDUNGEN — KARTEN JE DIENST (/anbindungen, Reiter „Je Projekt")
 *
 * Vorbild ist der Integrations-Reiter von OpenSEO: eine verbundene Karte ist
 * DREI ZEILEN hoch — Titel mit Zustand, die eingetragene Angabe, eine leise
 * Herkunftszeile. Alles Weitere liegt hinter „Ändern oder trennen".
 *
 * ZWEI SPALTEN AB 900 PX, sonst eine. Drei waeren auf der 1024er
 * Uebersichtsbreite dieser Seite unter 300 px je Karte — schmaler als das
 * Eingabefeld, das sich darin aufklappt.
 * ===================================================================== */
.anb-karten{display:grid;grid-template-columns:1fr;gap:var(--sr-gap-kpi);margin:0 0 var(--sr-gap)}
@media (min-width:900px){.anb-karten{grid-template-columns:repeat(2,minmax(0,1fr))}}

.anb-karte{border:0;box-shadow:var(--sr-e1);border-radius:var(--sr-r-card);background:var(--sr-surface)}
.anb-karte-kopf{display:flex;align-items:center;justify-content:space-between;gap:var(--s2);
  padding:var(--s2) var(--s3);border-bottom:1px solid var(--sr-hair)}
.anb-karte-titel{font-size:var(--fs-ui);font-weight:700;color:var(--sr-ink)}
.anb-karte-zustand{display:flex;align-items:center;gap:var(--s1);font-size:var(--fs-small);font-weight:600;
  color:var(--sr-mut);white-space:nowrap}
.anb-karte-koerper{padding:var(--s2) var(--s3)}
.anb-karte-koerper>:first-child{margin-top:0}
.anb-karte-koerper>:last-child{margin-bottom:0}

/* Zustandspunkt — dieselben vier Zustaende wie in der Flottensicht
   (app/lib/anbindungen.js STATUS_TEXTE), hier als Klassen-Suffix g/a/r/aus. */
.anb-punkt{width:8px;height:8px;border-radius:50%;flex:0 0 auto;background:var(--sr-mut)}
.anb-punkt--g{background:var(--sr-ok)}
.anb-punkt--a{background:var(--sr-warn)}
.anb-punkt--r{background:var(--sr-err)}
/* Status-Ring „aus": ein Rahmen, der etwas BEDEUTET — Line (3:1), nicht Hairline. */
.anb-punkt--aus{background:none;box-shadow:inset 0 0 0 1.5px var(--sr-line)}

.anb-karte-wert{margin-bottom:var(--s0);word-break:break-all}
.anb-karte-herkunft{font-size:var(--fs-label);color:var(--sr-mut);margin-bottom:var(--s2)}
.sr-body .anb-karte-nutzen,.sr-body .anb-karte-ohne{margin-bottom:var(--s1)}
.sr-body .anb-karte-ohne{color:var(--sr-mut)}
.sr-body .anb-leise{font-size:var(--fs-label);color:var(--sr-mut)}

/* „Ändern oder trennen": ein schlichter Aufklapper, kein Kasten — die Karte
   ist schon einer. Deshalb bewusst NICHT ui.details() mit seinem Rahmen. */
.anb-verwalten{margin-top:var(--s1)}
/* Polsterung 6px statt 2px (02.09.2026): der Ausklapper ist das Bedienelement,
   mit dem eine Anbindung geaendert oder getrennt wird — 21 px hoch waren unter
   den 24 px aus WCAG 2.2 AA (2.5.8). Der negative Aussenabstand nimmt dem
   Layout die Aenderung wieder ab. Nachzumessen: scripts/touchziel-sonde.js. */
.anb-verwalten>summary{cursor:pointer;font-size:var(--fs-small);font-weight:600;color:var(--sr-acc-ink);
  list-style:none;display:inline-flex;align-items:center;gap:var(--s1);padding:var(--s1) 0;margin:calc(var(--s0) * -1) 0}
.anb-verwalten>summary::-webkit-details-marker{display:none}
.anb-verwalten>summary::before{content:"▸";font-size:var(--fs-label);transition:transform var(--t-fast) var(--ease)}
.anb-verwalten[open]>summary::before{transform:rotate(90deg)}
.anb-verwalten>summary:hover{text-decoration:underline}
.anb-verwalten-koerper{margin-top:var(--s2);padding-top:var(--s2);border-top:1px solid var(--sr-hair)}
.anb-schritte{margin:var(--s-2) 0 0;padding-left:var(--s3)}
.anb-schritte li{margin-bottom:var(--s0)}

/* Speichern/Verbinden + Abbrechen nebeneinander (K&R-Rollout Batch 5,
   07.09.2026): ein Gitterkind von .sr-anlegen-form, darin flex — der
   Abbrechen-Icon-Knopf steht nur beim Bearbeiten einer bestehenden
   Verbindung (Formular per Stift geoeffnet), siehe anbindungen.js. */
.anb-form-aktionen{display:flex;align-items:center;gap:var(--s1)}

.anb-form{margin-top:var(--s2);display:flex;flex-direction:column;gap:var(--s2);align-items:flex-start}
.anb-form .feld{width:100%;margin:0}
.anb-form .feld-eingabe{width:100%}
.anb-form--trennen{margin-top:var(--s2);padding-top:var(--s2);border-top:1px solid var(--sr-hair);
  flex-direction:row;align-items:center;gap:var(--s2);flex-wrap:wrap}

/* ---- „Dienste und Einrichtung" entwirrt (Betreiber-Befund 07.09.2026,
   cmtqzn3ac): „das ist alles ein Wurstsalat … die Box von Merchant Center ist
   voll mit Schrift, Abstände fehlen, man kann sie gar nicht zuordnen".
   Vorher lag das Einrichtungsformular als randloser Vollbreiten-Block
   zwischen den Tabellenzeilen — ohne Rand, ohne Einzug, ohne Kopf. Jetzt:
   Dienstname als eigenes Element in 600, das Formular als eingerueckte
   Soft-Karte mit Akzentkante und einer Kopfzeile, die den Dienst NENNT
   (anbindungen.js dienstZeile()).

   HIER STEHT NUR, WAS NEU IST. Wert-Zeile, Klartext-Metas und die
   Spalten-Ausweichstufen (900/559) gehoerten schon vorher der
   .anb-verwaltung-Sicht in sr-bausteine.css — dort bleiben sie auch. Eine
   zweite, gleichlautende Regelmenge hier waere genau die Zwillingsstelle,
   an der die beiden Stufen spaeter auseinanderlaufen. Gemessen am
   07.09.2026 (Sonde ueber 1440/1000/900/700/560/390, mit und ohne diese
   Datei): das Ausweichen greift unveraendert. */
.anb-dienst-name{font-weight:var(--fw-bold);color:var(--sr-ink)}
.anb-zeile .who .sr-ikon-knopf{margin-left:var(--s0);vertical-align:middle}
/* Das Panel traegt die KARTEN-Flaeche (--sr-surface), nicht --sr-soft: die
   Zebra-Regel (sr-bausteine.css, .sr-app .sr-tabelle tbody
   tr:nth-child(even) td) faerbt jede zweite Zeile mit genau --sr-soft, das
   Panel verschmolz damit auf geraden Zeilen mit dem Zellgrund (gemessen
   07.09.2026: td und Panel beide rgb(68,74,83)). Den Zellgrund der
   Formularzeile neutralisiert sr-bausteine.css — dort, wo auch das
   Zeilenpaar-Polster steht, und spaet genug, um die Zebra-Regel zu schlagen. */
.anb-form-zeile>td{padding:0 var(--s3) var(--s2)}
/* Die Zeile VOR einem offenen Formular gibt ihre Trennlinie ab — Dienstzeile
   und ihr Panel lesen sich als EIN Block, erst danach trennt die Linie. */
.sr-tabelle tbody tr:has(+ .anb-form-zeile:not([hidden]))>td{border-bottom:0}
.anb-panel{margin:var(--s1) 0 var(--s0) var(--s3);max-width:640px;
  background:var(--sr-surface);border:1px solid var(--sr-hair);
  border-left:3px solid var(--sr-acc-line);
  border-radius:var(--sr-r-md);padding:var(--s3);box-shadow:var(--e1);
  display:flex;flex-direction:column;align-items:stretch;gap:var(--s2)}
.anb-panel-kopf{margin:0;font-size:var(--fs-ui);font-weight:700;color:var(--sr-ink)}
.anb-panel p{margin:0}
/* Der Panel-gap uebernimmt die Vertikalabstaende — Eigen-Margins der
   Bausteine wuerden doppeln. Die Zaesur vor dem Trennen-Block (padding +
   border-top) bleibt bewusst. */
.anb-panel .explain,.anb-panel .anb-form,.anb-panel .anb-form--trennen{margin-top:0}
/* Ein Feld je Zeile statt des 220-px-Gitters: im 640-px-Panel ergaeben zwei
   Spuren ein 294-px-Feld, in dem eine Search-Console-Property mitten im Wort
   abschneidet (gemessen 07.09.2026 am Bild). */
.anb-panel .sr-anlegen-form{margin:0;grid-template-columns:1fr}
/* 559 statt 560: dieselbe Schwelle wie die Spaltenstufe in sr-bausteine.css —
   zwei Schwellen ein Pixel auseinander waeren ein Fenster, in dem die Tabelle
   schon umgebaut ist und das Panel noch nicht (oder umgekehrt). */
@media (max-width:559px){
  .anb-panel{margin-left:var(--s1);max-width:none}
}

/* Ein Projekt je Aufklapper — nur bei MEHREREN Projekten (bei einem rendert
   die Ansicht die Gruppen direkt, ohne diese Huelle). */
.anb-projekt{border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);
  margin-bottom:var(--sr-gap-kpi);background:var(--sr-bg)}
.anb-projekt-kopf{cursor:pointer;display:flex;align-items:center;justify-content:space-between;
  gap:var(--s2);padding:var(--s2) var(--s3);list-style:none}
.anb-projekt-kopf::-webkit-details-marker{display:none}
.anb-projekt-kopf::before{content:"▸";font-size:var(--fs-label);color:var(--sr-mut);
  transition:transform var(--t-fast) var(--ease);flex:0 0 auto}
.anb-projekt[open]>.anb-projekt-kopf::before{transform:rotate(90deg)}
.anb-projekt-name{font-size:var(--fs-ui);font-weight:700;color:var(--sr-ink);flex:1;min-width:0}
.anb-projekt-bilanz{font-size:var(--fs-label);color:var(--sr-mut);white-space:nowrap}
.anb-projekt-koerper{padding:0 var(--s3) var(--s1)}

/* Ueberschrift einer Anbindungsart mit ihrer Erklaerung daneben. */
.sr-body h4.anb-art{margin:var(--s3) 0 var(--s0);font-size:var(--fs-small);text-transform:uppercase;
  letter-spacing:.04em;color:var(--sr-mut)}
.anb-art-hinweis{display:block;text-transform:none;letter-spacing:0;font-weight:400;
  font-size:var(--fs-small);color:var(--sr-mut);margin-top:var(--s0)}

/* Fusszeile der Anmeldeseite: „powered by Ackermann Online" mit Link zur
   Website (Anweisung Daniel 06.09.2026; die Rechtslinks Datenschutz/Impressum
   stehen dort nicht mehr). Trefflaeche: der Link steht allein in seiner
   Zeile und ist damit kein ausgenommenes Fliesstext-Ziel — 14 px waeren
   unter 24 px (AA). */
body.body--sr-zentriert .zentriert-fuss a{color:inherit;text-decoration:underline;text-underline-offset:2px;
  display:inline-block;padding:var(--s1) var(--s-2);margin:calc(var(--s1) * -1) 0}
body.body--sr-zentriert .zentriert-fuss a:hover,
body.body--sr-zentriert .zentriert-fuss a:focus-visible{color:var(--sr-ink)}

/* ------------------------------------- Wettbewerber-Verwaltung: Zeilenpflege
   Betreiber-Bild 04.09.2026 („tabelle sieht schrottig aus bzw. ist die
   befüllung und spaltenbreite und scrolling nicht gut gelöst"). Vorher lagen
   Firmenname, Begruendung, Art und der Knopf in EINER Zelle in einem
   .vw-aktion-Flexcontainer, dessen Felder auf 170 px gedeckelt waren — sie
   brachen untereinander um, die Texte waren abgeschnitten, jede Zeile war rund
   150 px hoch. Jetzt hat jedes Feld seine eigene Spalte und fuellt sie.
   Die Breiten sind Anteile, keine festen Pixel: die Tabelle soll sich der
   Fensterbreite anpassen, statt eine waagerechte Leiste zu erzwingen. */
.sr-body .wb-verwaltung td .vw-feld{width:100%;max-width:none;min-width:0}
.sr-body .wb-verwaltung td:has(.vw-feld){white-space:normal}
.sr-body .wb-verwaltung .vw-sp-domain{white-space:normal;min-width:9rem}
/* Loeschen und Zuruecksetzen sind ✕-Knoepfe (siehe wbKnopfForm nurIcon) —
   quadratisch, damit sie nicht wie ein leerer Wortknopf aussehen. */
.sr-body .wb-verwaltung .knopf--icon{min-width:2rem;padding-left:0;padding-right:0;text-align:center;font-weight:700}
/* Die drei Eingabespalten teilen sich, was Domain, Status und die Knopfzeile
   uebrig lassen. Zu grosszuegig gesetzt schob die Tabelle die Aktionsspalte
   aus dem Bild (zweites Abnahmebild 04.09.2026: „Löschen" war nicht mehr zu
   sehen) — deshalb Anteile statt Wunschbreiten. Der volle Text steht im
   title-Attribut, ein einzeiliges Feld kann ihn ohnehin nie ganz zeigen. */
.sr-body .wb-verwaltung .vw-sp-name{min-width:7rem;width:12%}
.sr-body .wb-verwaltung .vw-sp-grund{min-width:10rem;width:18%}
/* 10,5rem, damit „Direkter Wettbewerber" samt Aufklapp-Pfeil hineinpasst —
   darunter schnitt die laengste Option ab (Abnahmebild 04.09.2026). */
.sr-body .wb-verwaltung .vw-sp-art{min-width:10.5rem;width:12%}
/* Status ist ein Chip mit fuenf Buchstaben — er braucht keine Anteilsbreite.
   GEMESSEN, nicht geschaetzt (scripts/proben/breiten-wb.js, 1440x900): der
   Tabellenrahmen ist 930 px breit, die Tabelle war 974 — 44 px Ueberhang, und
   genau darin verschwand der Loesch-Knopf. Die Spalten stehen deshalb auf
   gemessenen Anteilen statt auf Wunschbreiten. */
.sr-body .wb-verwaltung .vw-sp-status{white-space:nowrap;width:1%}
/* Herkunft steht als zweite Zeile unter der Domain statt in einer eigenen
   Spalte — eine Spalte weniger, die quer schiebt. */
.sr-body .wb-verwaltung .vw-zeile-herkunft{display:block;font-size:var(--fs-label);color:var(--sr-mut);margin-top:1px}
/* Die Aktionszelle traegt jetzt AUCH den Speichern-Knopf des Zeilenformulars.
   EINE Zeile, nicht drei: mit `max-width:15rem` brachen die drei Knoepfe
   untereinander um und machten jede Tabellenzeile rund 180 px hoch
   (Abnahmebild 04.09.2026). Die Knoepfe stehen jetzt nebeneinander; umbrechen
   duerfen sie erst, wenn der Platz wirklich nicht reicht. */
.sr-body .wb-verwaltung td:has(.vw-aktionen){white-space:nowrap;width:1%}
.sr-body .wb-verwaltung .vw-aktionen{flex-wrap:nowrap;gap:var(--s0)}
.sr-body .wb-verwaltung .vw-aktionen .knopf{padding-left:var(--s1);padding-right:var(--s1)}
@media (max-width:1200px){
  .sr-body .wb-verwaltung td:has(.vw-aktionen){white-space:normal}
  .sr-body .wb-verwaltung .vw-aktionen{flex-wrap:wrap}
}

/* Pflichtseiten ohne Anmeldung (04.09.2026, Punkt 4): dieselbe zentrierte
   Karte wie die Anmeldemaske, aber nicht deren 360 px. Datenschutz und
   Impressum tragen Tabellen mit vier Spalten — die brauchen Platz. Gesetzt
   wird die Klasse in app/server.js (rechtSeite, breiteKarte), damit die
   Anmeldemaske selbst unberuehrt bleibt. */
body.body--sr-zentriert .anmeldekarte--breit{width:min(1000px,100%);
  padding:var(--s5) var(--s5) var(--s4);text-align:left}
@media (max-width:559px){
  body.body--sr-zentriert .anmeldekarte--breit{padding:var(--s3)}
}

/* ---- Cluster & Kampagnen: EINE Tabelle mit Drilldown (06.09.2026) ----------
   table.tbl-drill (app.js Baustein 11) mit Auswahlspalte: der Aufklapp-Pfeil
   des Bausteins sitzt sonst in der ERSTEN Zelle — dort steht hier das
   Auswahlkaestchen. Der Pfeil wandert deshalb an die Namenszelle. Die
   Tabelle steht bewusst ohne .tbl-wrap (kein Hoehendeckel, keine Sortierung,
   die Zeilenpaare zerreissen wuerde) und nimmt die volle Kartenbreite. */
.sr-body table.cl-tabelle{width:100%;border-collapse:collapse}
.sr-body table.cl-tabelle th{text-align:left}
.sr-body table.cl-tabelle th.num,.sr-body table.cl-tabelle td.num{text-align:right;font-variant-numeric:tabular-nums}
.sr-body table.cl-tabelle td{padding:var(--s2) var(--s3);border-bottom:1px solid var(--sr-hair);vertical-align:middle}
.sr-body table.cl-tabelle tr.drill>td:first-child{padding-left:var(--s2)}
.sr-body table.cl-tabelle tr.drill>td:first-child::before{content:none}
.sr-body table.cl-tabelle tr.drill>td.cl-name{position:relative;padding-left:var(--s4)}
.sr-body table.cl-tabelle tr.drill>td.cl-name::before{content:"";position:absolute;left:var(--s1);top:calc(50% - 6px);
  width:7px;height:7px;border-right:2px solid var(--sr-mut);border-bottom:2px solid var(--sr-mut);
  transform:rotate(-45deg);transition:transform 140ms var(--ease)}
.sr-body table.cl-tabelle tr.drill.drill--offen>td.cl-name::before{transform:rotate(45deg)}
.sr-body table.cl-tabelle tr.drill-detail>td{padding:var(--s3) var(--s3) var(--s4) var(--s4);border-left:3px solid var(--sr-acc-ink)}

/* Zuordnungsformular im Drilldown: zwei bis drei Spalten, KEIN Hoehendeckel
   (Daniel: „nicht so ein kleiner Kasten, der da aufgeht") */
.cl-zuordnung{display:flex;flex-direction:column;gap:var(--s2)}
.cl-zuordnung-kopf{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap}
.cl-zuordnung-titel{font-weight:600}
.cl-zuordnung-zaehler{color:var(--sr-mut);font-size:var(--fs-small)}
.cl-zuordnung-knoepfe{margin-left:auto;display:inline-flex;gap:var(--s0)}
.cl-zuordnung-liste{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:2px var(--s4);
  padding:var(--s1) 0}
.cl-zuordnung-liste .kw-wahl-item{padding:6px 8px}
.cl-zuordnung-fuss{display:flex;align-items:center;gap:var(--s3);flex-wrap:wrap;padding-top:var(--s1)}
.cl-zuordnung-hinweis{color:var(--sr-mut);font-size:var(--fs-small)}
@media (max-width:559px){
  .cl-zuordnung-liste{grid-template-columns:1fr}
  .sr-body table.cl-tabelle tr.drill-detail>td{padding:var(--s2)}
}


/* ---- sr-bausteine.css ---- */
/* =========================================================== sr-bausteine.css
 * Die zehn Bausteine des Overhauls vom 03.09.2026 (Stilstufe 2, sanft).
 *
 * WARUM EINE VIERTE DATEI UND KEIN ANHANG AN sr.css. Der Overhaul lief an
 * zwei Haenden gleichzeitig: die eine legte die Tokens in theme.css/sr.css,
 * die andere die Bausteine. Zwei Haende in derselben Datei heisst
 * Zusammenfuehren von Hand am Abend vor dem Live-Gang. Als eigene Datei ist
 * die Grenze scharf: hier steht ausschliesslich Baustein-Stil, kein Token.
 *
 * SIE LAEDT ZULETZT (app/lib/assets.js, vierter Teil nach sr.css) und gewinnt
 * damit bei gleicher Spezifitaet. Wo der Bestand mit zwei Klassen anschreibt
 * (.sr-body .info, .sr-kopf .unterkapitel-tab), schreibt sie ebenfalls mit
 * zweien an — gleiche Staerke, spaetere Stelle.
 *
 * KEIN FARBWERT UND KEINE SCHRIFTGROESSE STEHT HIER ALS ZAHL. Beides kommt
 * aus den Tokens. Als Zahlen bleiben nur Bauteil-MASSE, die das Entwurfsblatt
 * selbst in Pixeln nennt: Zielflaechen (24, 40, 44), Panelbreiten (400, 280,
 * 420) und Mindestbreiten (640). Sie sind Geometrie, keine Gestaltung.
 */

/* ------------------------------------------------------- A1 KPI-Kachel --
 * Label mit Herkunfts-Knopf, Wert mit Delta-Chip, EINE Meta-Zeile. Alles
 * Weitere steht im Popover (A2) — die Kachel traegt nie mehr als drei Zeilen.
 */
/* ATTRAKTIVER, ABER NICHT LAUTER (Betreiber-Liste 04.09.2026, Punkt 11:
   „Karten optisch attraktiver — eigener Vorschlag gefragt").
   Vier Aenderungen, jede mit einem Grund:
     1. EINE 3-PX-KANTE OBEN, die den Zustand traegt. Eine Kachelreihe war
        bisher eine Reihe gleich aussehender Rechtecke; man musste jede Zahl
        einzeln lesen, um zu sehen, wo etwas passiert ist. Die Kante gibt der
        Reihe einen Rhythmus. Sie ist DEKORATION, nicht Information: Richtung
        und Bedeutung stehen weiterhin im Delta-Chip (Pfeil + Wort + Satz fuer
        Screenreader), WCAG 1.4.1 bleibt gewahrt.
     2. MEHR LUFT UNTER DER ZAHL (min-height 96 -> 108, Polster 18 -> 20).
        Die Zahl ist das, wofuer die Kachel da ist — sie stand gedraengt
        zwischen Etikett und Meta-Zeile.
     3. ANHEBEN BEIM UEBERFAHREN. Ein Millimeter Bewegung und ein zweiter
        Schatten; unter prefers-reduced-motion nur der Schatten.
     4. DER HERKUNFTS-KNOPF tritt erst beim Ueberfahren der Kachel hervor.
        Er ist eine Nachschlage-Hilfe, kein Bedienelement erster Ordnung —
        sichtbar bleibt er trotzdem (Deckkraft .55, nie 0), sonst waere er
        fuer Tastatur und Touch verschwunden. */
.sr-kpi{position:relative;
  /* KEIN overflow:hidden. Es stand hier vom 04.09.2026 bis zum Befund
     desselben Abends und sollte die Zustandskante an den runden Ecken
     beschneiden — es hat stattdessen das ⓘ-POPOVER abgeschnitten, das in
     der Kachel haengt (Bild Daniel: „Sichtbarkeitsindex — Herkunft und
     Rechnung" links und unten weggeschnitten). Die Kante rundet sich
     selbst (border-radius an ihrem ::before), ein Beschnitt war nie
     noetig. Wer hier wieder overflow setzt, versteckt A2. */
  background:var(--sr-surface);border:0;border-radius:var(--sr-r-md);
  box-shadow:var(--edge),var(--sr-e1);padding:20px 20px var(--s3);min-height:108px;
  display:flex;flex-direction:column;gap:var(--s1);
  transition:box-shadow var(--t-fast) var(--ease),transform var(--t-fast) var(--ease);
  /* min-width:0 ist Pflicht: die Meta-Zeile ist nowrap, und ein Gitterkind
     mit `1fr` (= minmax(auto,1fr)) waechst sonst auf ihre Textbreite — das
     Fuenfer-Gitter der Sichtbarkeit lief am 03.09.2026 abends auf 1.655 px
     Seitenbreite, die fuenfte Kachel stand ausserhalb des Fensters. */
  min-width:0}
.sr-kpi-kopf{display:flex;align-items:flex-start;gap:var(--s1);min-width:0}
.sr-kpi-label{font-size:var(--fs-label);font-weight:var(--fw-ui);line-height:1.3;
  letter-spacing:.06em;text-transform:uppercase;color:var(--sr-mut);flex:1;min-width:0}
.sr-kpi-zeile{display:flex;align-items:baseline;gap:var(--s2);margin-top:0;flex-wrap:wrap}
.sr-kpi-wert{font-size:var(--fs-kpi);font-weight:var(--fw-bold);line-height:1.05;
  letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--sr-ink)}
.sr-kpi-wert--klein{font-size:var(--fs-kpi-compact)}
.sr-kpi-wert-zusatz{font-size:var(--fs-small);font-weight:var(--fw-body);color:var(--sr-mut)}
/* Meta-Zeile: genau eine, Fenster und Einheit. Bricht nicht — was nicht
   passt, steht ohnehin im Popover. Unter 560 px darf sie zwei Zeilen haben
   (eine Ellipse mitten im Datum waere schlechter als ein Umbruch). */
.sr-kpi-meta{font-size:var(--fs-small);font-weight:var(--fw-body);line-height:1.45;
  color:var(--sr-mut);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:auto}
.sr-kpi-neben{margin-top:var(--s0);display:flex;flex-wrap:wrap;gap:var(--s1);align-items:baseline;
  font-size:var(--fs-small);line-height:1.45;color:var(--sr-mut);font-variant-numeric:tabular-nums}
.sr-kpi-neben-label{color:var(--sr-mut)}
.sr-kpi-spark{display:block;margin-top:var(--s1);width:100%;height:34px}
/* Zustandskante (Punkt 11). Ohne Delta bleibt sie in der Haarlinienfarbe —
   eine Kachel ohne Vergleichswert behauptet damit keine Bewegung. */
/* ZUSTANDSKANTE IST ZURUECK (Entscheid Daniel 06.09.2026 abends: „die
   sahen besser aus mit dem gruenen/roten Streifen"). SuperStyler-Rang 1
   hatte sie am Morgen auf 0 gesetzt; der Betreiber entscheidet. Ohne
   Delta/Ton bleibt sie in der Haarlinienfarbe — eine Kachel ohne
   Vergleichswert behauptet keine Bewegung. */
.sr-kpi::before{content:"";position:absolute;top:0;left:var(--s2);right:var(--s2);height:3px;
  background:var(--sr-hair);border-radius:var(--sr-r-pill)}
.sr-kpi:has(.sr-delta--gut)::before,.sr-kpi:has(.delta-gut)::before{background:var(--sr-ok)}
.sr-kpi:has(.sr-delta--schlecht)::before,.sr-kpi:has(.delta-schlecht)::before{background:var(--sr-err)}
.sr-kpi--leer::before,.sr-kpi--fehler::before,.sr-kpi--laedt::before{background:var(--sr-hair)}
/* Ausdruecklich gesetzter Ton (ui.srKpiGitter, `ton`) — fuer Kacheln, die
   einen ZUSTAND zeigen statt einer Veraenderung. Steht nach den
   Delta-Regeln und gewinnt damit bei gleicher Spezifitaet. */
.sr-kpi--ton-ok::before{background:var(--sr-ok)}
.sr-kpi--ton-warn::before{background:var(--sr-warn)}
.sr-kpi--ton-err::before{background:var(--sr-err)}
.sr-kpi:hover{box-shadow:var(--edge),var(--sr-e1),0 6px 18px rgba(18,22,29,.10);
  transform:translateY(-1px)}
/* Klickbare Kachel (06.09.2026): der Link ist eine gestreckte Flaeche ueber
   der ganzen Kachel; Kopfzeile (ⓘ-Knopf) und Popover liegen DARUEBER, damit
   sie bedienbar bleiben. Kein eigener Hover — die Kachel hebt sich schon. */
.sr-kpi--link{cursor:pointer}
.sr-kpi-link{position:absolute;inset:0;border-radius:inherit;z-index:1}
.sr-kpi-link:focus-visible{outline:2px solid var(--focus-ton);outline-offset:2px}
.sr-kpi--link .sr-kpi-kopf{position:relative;z-index:2}
/* Das Erscheinen des ⓘ steht EINMAL am Ende dieser Datei (Block
   „Widget-Werkzeuge"), am Merkmal [data-sr-werkzeuge] der Kachel. Hier
   stand bis zum 12.09.2026 dieselbe Regel ein viertes Mal — neben drei
   Fassungen in cockpit.css. */

/* Herkunfts-Knopf: 24 px Zielflaeche, 14 px Strich-Icon darin. */
.sr-kpi-info{width:24px;height:24px;flex:none;display:inline-flex;align-items:center;
  justify-content:center;padding:0;border:0;background:none;border-radius:var(--sr-r-xs);
  color:var(--sr-mut);cursor:pointer;transition:background var(--t-fast) var(--ease)}
.sr-kpi-info:hover{background:var(--sr-soft);color:var(--sr-ink)}
.sr-kpi-info svg{width:14px;height:14px;display:block}

/* Delta-Chip. Richtung ist SEMANTISCH: --gut/--schlecht setzt der Aufrufer,
   nicht das Vorzeichen. Die Bestandsklassen aus deltaMenge()/deltaPosition()
   tragen dieselbe Form, damit nicht zwei Chips nebeneinander existieren. */
.sr-delta,
.sr-kpi .delta-gut,.sr-kpi .delta-schlecht,.sr-kpi .delta-neutral{
  display:inline-flex;align-items:center;gap:var(--s-2);border-radius:var(--sr-r-xs);
  padding:var(--s-2) var(--s1);font-size:var(--fs-small);font-weight:var(--fw-ui);
  line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}
.sr-delta--gut,.sr-kpi .delta-gut{color:var(--sr-ok-ink);
  background:color-mix(in oklab,var(--sr-ok) 12%,transparent)}
.sr-delta--schlecht,.sr-kpi .delta-schlecht{color:var(--sr-err-ink);
  background:color-mix(in oklab,var(--sr-err) 12%,transparent)}
.sr-delta--neutral,.sr-kpi .delta-neutral{color:var(--sr-mut);background:var(--sr-soft)}

/* Zustaende. „Fehler" zeigt einen Gedankenstrich und ein Wort — nie den
   Rohfehler; der gehoert in die Betrieb-Sektion (A10). */
.sr-kpi--leer .sr-kpi-wert,.sr-kpi--fehler .sr-kpi-wert{color:var(--sr-mut)}
.sr-kpi-fehlerbadge{font-size:var(--fs-label);font-weight:var(--fw-ui);letter-spacing:.06em;
  text-transform:uppercase;border-radius:var(--sr-r-xs);padding:var(--s-2) var(--s1);
  color:var(--sr-warn-ink);background:color-mix(in oklab,var(--sr-warn) 12%,transparent)}

/* ------------------------------------------------------- A2 Erklaerung --
 * Ein Textlink, ein Panel. Ueber 900 px als Popover unter dem Ausloeser,
 * darunter als Seitenblatt von unten. KEIN gerahmtes Akkordeon im Lesefluss.
 */
.sr-erklaerung{position:relative;display:inline-flex}
.sr-erklaerung-knopf{display:inline-flex;align-items:center;gap:var(--s0);min-height:24px;
  padding:0;border:0;background:none;font:inherit;font-size:var(--fs-ui);
  font-weight:var(--fw-ui);color:var(--sr-acc-ink);cursor:pointer;text-align:left}
.sr-erklaerung-knopf:hover{text-decoration:underline}
.sr-erklaerung-knopf svg{width:14px;height:14px;flex:none}
.sr-erklaerung-scrim{position:fixed;inset:0;z-index:210;background:var(--sr-scrim);border:0}
/* Der Scrim gehoert NUR zum Seitenblatt (< 900 px). Im Popover-Bild
   verdunkelte er bis zum 04.09.2026 die ganze Seite hinter einem 400-px-
   Panel (SuperStyler-Befund 03.09.) — app.js setzt das Attribut in beiden
   Faellen, das Stylesheet entscheidet. Aussenklick schliesst weiterhin
   (Dokument-Zuhoerer in app.js, Baustein 19). */
@media (min-width:900px){.sr-erklaerung-scrim{display:none}}
.sr-erklaerung-panel{position:fixed;inset:auto;margin:0;z-index:220;
  width:min(400px,90vw);max-height:60vh;overflow-y:auto;overscroll-behavior:contain;
  background:var(--sr-surface);border:0;border-radius:var(--sr-r-lg);
  box-shadow:var(--edge),var(--sr-e-modal);padding:var(--s3) 18px;
  text-align:left;font-size:var(--fs-body);font-weight:var(--fw-body);color:var(--sr-ink)}
.sr-erklaerung-panel[hidden]{display:none}
.sr-erklaerung-panel::backdrop{background:transparent;pointer-events:none}
/* Ohne native Top-Layer-Ebene liegt das Portal über der festen Kommunikator-Ebene. */
.sr-erklaerung-panel[data-sr-erklaerung-portal]{z-index:2147483100}
.sr-erklaerung-scrim[data-sr-erklaerung-portal]{z-index:2147483099}
.sr-erklaerung-kopf{display:flex;align-items:flex-start;gap:var(--s2);margin-bottom:var(--s2)}
.sr-erklaerung-titel{flex:1;min-width:0;font-size:var(--fs-ui);font-weight:var(--fw-ui);
  color:var(--sr-ink)}
.sr-erklaerung-zu{width:24px;height:24px;flex:none;display:inline-flex;align-items:center;
  justify-content:center;padding:0;border:0;background:none;border-radius:var(--sr-r-xs);
  color:var(--sr-mut);cursor:pointer;font:inherit;font-size:var(--fs-ui)}
.sr-erklaerung-zu:hover{background:var(--sr-soft);color:var(--sr-ink)}
.sr-erklaerung-griff{display:none}
.sr-erklaerung-inhalt>:first-child{margin-top:0}
.sr-erklaerung-inhalt>:last-child{margin-bottom:0}
.sr-erklaerung-inhalt p{margin:0 0 var(--s2);font-size:var(--fs-body);line-height:1.5}
.sr-erklaerung-inhalt a{color:var(--sr-acc-ink)}
/* Sanfter Auftritt UND Abgang (06.09.2026, Mouseover-Betrieb): das Panel
   startet unsichtbar (0, 6 px hoch) und blendet ueber die Klasse
   --sichtbar in 180 ms ein; app.js nimmt die Klasse vor dem Verstecken
   weg und wartet die 180 ms ab — so gibt es auch ein Ausblenden. Ohne
   JavaScript-Klasse (Altzustand) bleibt das Panel sichtbar: die
   Uebergangsregel greift nur, wenn die Klasse je gesetzt werden kann. */
@media (prefers-reduced-motion:no-preference) and (min-width:900px){
  .sr-erklaerung-panel:not([hidden]){opacity:0;transform:translateY(-6px);
    transition:opacity .18s var(--ease),transform .18s var(--ease)}
  .sr-erklaerung-panel.sr-erklaerung-panel--sichtbar{opacity:1;transform:none}
}
@media (prefers-reduced-motion:no-preference) and (max-width:899.98px){
  .sr-erklaerung-panel{animation:sr-erkl-auf var(--t-fast) var(--ease)}
}
@keyframes sr-erkl-auf{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}
@keyframes sr-erkl-hoch{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}

/* ------------------------------------------------------------ A3 Karte --
 * Flaeche und Radius kommen aus den Tokens; hier steht nur die Struktur der
 * Kopfzeile und das Innenpolster.
 */
.sr-karte{background:var(--sr-surface);border:0;border-radius:var(--sr-r-md);
  box-shadow:var(--edge),var(--sr-e1)}
.sr-karte-kopf{padding:var(--s3) 18px calc(var(--s3) - var(--s2));border-bottom:0;
  display:flex;align-items:baseline;gap:var(--s2);flex-wrap:wrap}
.sr-karte-titel{font-size:var(--fs-h2);font-weight:var(--fw-bold);line-height:1.25;
  letter-spacing:0;color:var(--sr-ink);flex:1;min-width:0}
.sr-karte-titel-zusatz{font-size:var(--fs-small);font-weight:var(--fw-body);color:var(--sr-mut)}
.sr-karte-meta{font-size:var(--fs-small);font-weight:var(--fw-body);color:var(--sr-mut);
  margin-left:auto}
.sr-karte-kopf .sr-erklaerung{margin-left:auto}
/* Untertitel-Zeile im Kopf (ui.srKarte untertitelHtml): volle Breite, direkt
   unter Titel und Meta, gleicher Grauton wie die Meta. */
.sr-karte-untertitel{flex:1 0 100%;font-size:var(--fs-small);font-weight:var(--fw-body);color:var(--sr-mut);
  line-height:1.45;margin-top:calc(var(--s0) * -1)}
.sr-karte-untertitel>p{margin:0}
/* ------------------------------------------------- Einklappbare Karte --
 * <details>/<summary> statt eigener Zustandsverwaltung (Punkt 13 der
 * Betreiber-Liste 04.09.2026, ui.srKarte einklappbar:true). Der Browser
 * bringt Tastaturbedienung, ARIA und den Zustand mit; wir setzen nur das
 * Aussehen. Der Marker des Browsers ist abgeschaltet — an seiner Stelle
 * steht ein Winkel rechts, der beim Aufklappen kippt.
 */
.sr-karte--klapp>summary{cursor:pointer;list-style:none;user-select:none}
.sr-karte--klapp>summary::-webkit-details-marker{display:none}
.sr-karte-kopf--klapp{align-items:center}
.sr-karte-kopf--klapp:hover .sr-karte-titel{color:var(--sr-acc-ink)}
.sr-karte--klapp>summary:focus-visible{outline:2px solid var(--sr-acc-line);
  outline-offset:-2px;border-radius:var(--sr-r-md)}
.sr-karte-klapp-pfeil{margin-left:auto;flex:none;width:10px;height:10px;
  border-right:2px solid var(--sr-mut);border-bottom:2px solid var(--sr-mut);
  transform:rotate(45deg);margin-top:-4px;
  transition:transform var(--t-fast) var(--ease)}
.sr-karte--klapp[open] .sr-karte-klapp-pfeil{transform:rotate(-135deg);margin-top:2px}
.sr-karte--klapp .sr-karte-meta{margin-left:auto}
.sr-karte--klapp .sr-karte-meta+.sr-karte-klapp-pfeil{margin-left:var(--s2)}
@media (prefers-reduced-motion:reduce){
  .sr-karte-klapp-pfeil{transition:none}
}
.sr-karte-koerper{padding:0 18px var(--s3)}
.sr-karte-kopf+.sr-karte-koerper{padding-top:var(--s2)}
.sr-karte-fuss{padding:var(--s2) 18px;font-size:var(--fs-small);color:var(--sr-mut);
  border-top:1px solid var(--sr-hair)}

/* ---------------------------------------------------------- A4 Tabelle --
 * EINE Werkzeugzeile ueber der Tabelle: Filter links, Zaehler und Export
 * rechts. Kopf in Versalien, Zeilen 44 px, Zebra statt Zeilenlinien.
 */
.sr-werkzeugzeile{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap;
  padding:0 0 var(--s2)}
.sr-karte-koerper>.sr-werkzeugzeile:first-child,
.sr-karte>.sr-werkzeugzeile{padding:var(--s2) 18px}
.sr-werkzeug-filter{flex:1 1 auto;max-width:280px;min-width:0;height:40px;
  background:var(--sr-soft);color:var(--sr-ink);border:1px solid var(--sr-feld-line);
  border-radius:var(--sr-r-sm);padding:0 var(--s2);font:inherit;font-size:var(--fs-ui);
  font-weight:var(--fw-body)}
.sr-werkzeug-rechts{margin-left:auto;display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap}
.sr-werkzeug-zaehler{font-size:var(--fs-small);color:var(--sr-mut);font-variant-numeric:tabular-nums}
.sr-werkzeug-export{display:inline-flex;align-items:center;gap:var(--s0);min-height:32px;
  padding:var(--s1) var(--s2);border-radius:var(--sr-r-sm);border:1px solid var(--sr-feld-line);
  background:var(--sr-soft);color:var(--sr-ink);font-size:var(--fs-ui);font-weight:var(--fw-ui);
  text-decoration:none;cursor:pointer}
.sr-werkzeug-export:hover{background:var(--sr-surface);color:var(--sr-ink);text-decoration:none}

/* ZWEI DICHTESTUFEN, DIE MAN AUSEINANDERHALTEN KANN (Betreiber-Befund
   04.09.2026, Punkt 3). Vorher unterschieden sich „Komfortabel" und
   „Kompakt" nur in der Zeilenhoehe (44 zu 36 px) — acht Pixel, die im
   Umschalten kaum auffielen; Zellpolster und Schriftgroesse blieben in
   beiden Stufen gleich. Jetzt aendern sich alle drei Groessen zusammen:
     komfortabel  46 px hoch · 12/16 px Polster · 13 px Schrift
     kompakt      30 px hoch ·  4/10 px Polster · 11,5 px Schrift
   Das sind 16 px je Zeile — bei 20 Zeilen ein Drittel Bildschirmhoehe. */
.sr-app .sr-tabelle th,.sr-app .tbl-wrap table th{
  text-align:left;font-size:var(--fs-label);font-weight:var(--fw-ui);letter-spacing:.06em;
  text-transform:uppercase;color:var(--sr-mut);background:var(--sr-surface);
  padding:12px 16px;border-bottom:1px solid var(--sr-hair);white-space:nowrap}
.sr-app .sr-tabelle td,.sr-app .tbl-wrap table td{
  padding:12px 16px;height:46px;border-bottom:0;font-size:var(--fs-ui);
  font-weight:var(--fw-body);color:var(--sr-ink)}
/* Erste Spalte normalgewichtig — fett bleibt dem Kopf und echten
   Hervorhebungen. Die Summenzeile (.tot) ist eine solche und behaelt es. */
.sr-app .sr-tabelle td:first-child,.sr-app .tbl-wrap table td:first-child{font-weight:var(--fw-body)}
.sr-app .tbl-wrap table tr.tot td{font-weight:var(--fw-bold)}
/* Zebra jede zweite Zeile, keine Zeilenlinien. */
.sr-app .sr-tabelle tbody tr:nth-child(even) td,
.sr-app .tbl-wrap table tbody tr:nth-child(even) td{background:var(--sr-soft)}
.sr-app .sr-tabelle tbody tr:hover td,
.sr-app .tbl-wrap table tbody tr:hover td{background:color-mix(in oklab,var(--sr-acc) 6%,transparent)}
.sr-app .sr-tabelle .re,.sr-app .sr-tabelle .num,
.sr-app .tbl-wrap table .num{text-align:right;font-variant-numeric:tabular-nums}
/* Vollzeilen-Rot/Gruen entfaellt ersatzlos: Zustand traegt der Chip in der
   Statusspalte, nicht die Zeilenflaeche (Farbe allein traegt nie Bedeutung).
   Die Bestandsklassen bleiben im Markup — hier verlieren sie nur ihre Farbe. */
.sr-app tr.good td,.sr-app tr.bad td,.sr-app tr.ok td,.sr-app tr.fehler td{
  background:none;box-shadow:none}
.sr-app tr.good td:first-child,.sr-app tr.bad td:first-child{box-shadow:none}
/* Kompaktstufe: Hoehe, Polster UND Schrift ziehen mit (Punkt 3). Die
   Kopfzeile gehoert dazu — sie stand vorher unveraendert ueber einer
   geschrumpften Tabelle. Die gleichlautende Regel in app.css (879) hat
   nie gewirkt: gleiche Spezifitaet, aber sr-bausteine.css laedt spaeter. */
[data-density="kompakt"] .sr-app .sr-tabelle td,
[data-density="kompakt"] .sr-app .tbl-wrap table td{height:30px;padding:4px 10px;
  font-size:var(--fs-label)}
[data-density="kompakt"] .sr-app .sr-tabelle th,
[data-density="kompakt"] .sr-app .tbl-wrap table th{padding:5px 10px}
/* AUSSENKANTE = KARTENKANTE (Befund Daniel 06.09.2026, Screenshot S4:
   „Spaltenkopf UND Zeilen links wie rechts einruecken wie jeder andere
   Inhalt, auch im kompakten Modus"). Die Tabelle liegt buendig in der
   Karte, ihr Innenabstand kommt allein aus dem Zellpolster — und das
   schrumpfte im Kompaktmodus auf 10 px, waehrend Kartenkopf und Kartenfuss
   bei --s3 blieben. Erste und letzte Spalte tragen deshalb IMMER den
   Kartenabstand; die Spalten dazwischen behalten ihr dichtes Polster. */
.sr-app .sr-tabelle th:first-child,.sr-app .sr-tabelle td:first-child,
.sr-app .tbl-wrap table th:first-child,.sr-app .tbl-wrap table td:first-child{padding-left:var(--s3)}
.sr-app .sr-tabelle th:last-child,.sr-app .sr-tabelle td:last-child,
.sr-app .tbl-wrap table th:last-child,.sr-app .tbl-wrap table td:last-child{padding-right:var(--s3)}
[data-density="kompakt"] .sr-app .sr-tabelle th:first-child,[data-density="kompakt"] .sr-app .sr-tabelle td:first-child,
[data-density="kompakt"] .sr-app .tbl-wrap table th:first-child,[data-density="kompakt"] .sr-app .tbl-wrap table td:first-child{padding-left:var(--s3)}
[data-density="kompakt"] .sr-app .sr-tabelle th:last-child,[data-density="kompakt"] .sr-app .sr-tabelle td:last-child,
[data-density="kompakt"] .sr-app .tbl-wrap table th:last-child,[data-density="kompakt"] .sr-app .tbl-wrap table td:last-child{padding-right:var(--s3)}
/* Lange Zellen: Monospace, gedeckelt, mit Ellipse und Volltext im title. */
.sr-zelle-lang{display:inline-block;max-width:320px;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;vertical-align:bottom;font-family:var(--mono);font-size:var(--fs-mono)}
.sr-tabelle--breit{min-width:640px}
/* Der Sortierknopf, den app.js in jeden Spaltenkopf haengt, ist ein echtes
   Klickziel und braucht die 24 px — der Pfeil selbst bleibt klein. */
.sr-app .th-sort-btn{min-height:24px;display:inline-flex;align-items:center;gap:var(--s0);
  font:inherit;font-size:var(--fs-label);font-weight:var(--fw-ui);letter-spacing:.06em;
  text-transform:uppercase;color:var(--sr-mut);background:none;border:0;cursor:pointer}
.sr-tabelle-fuss{padding:var(--s2) 18px;font-size:var(--fs-small);color:var(--sr-mut)}
/* Der Filter der Werkzeugzeile setzt dieselbe Klasse wie der Client-Filter.
   Sie wirkte bisher nur in .tbl-wrap — in einer sr-Tabellenkarte blieben die
   Zeilen stehen, und der Zaehler zeigte einen Treffer, den man nicht sah. */
.sr-app tr.tbl-gefiltert{display:none}

/* ------------------------------------------------------ A5 Hinweiskasten --
 * Drei Varianten, Icon UND Wortlaut. Die Flaeche ist eine 11-%-Toenung der
 * Statusfarbe, der Text ihre Tinte — beides aus den Tokens, kein neuer Ton.
 */
.sr-app .sr-hinweis{display:flex;align-items:flex-start;gap:var(--s2);
  padding:var(--s2) var(--s2);border-radius:var(--sr-r-sm);border:0;border-left:0;
  box-shadow:none;margin:var(--s2) 0;font-size:var(--fs-small);font-weight:var(--fw-body);
  line-height:1.45}
.sr-app .sr-hinweis-icon{width:16px;height:16px;flex:none;margin-top:1px}
.sr-app .sr-hinweis-text{flex:1;min-width:0}
.sr-app .sr-hinweis-text>:first-child{margin-top:0}
.sr-app .sr-hinweis-text>:last-child{margin-bottom:0}
.sr-app .sr-hinweis a{color:var(--sr-acc-ink);text-decoration:underline}
.sr-app .sr-hinweis--hinweis{background:color-mix(in oklab,var(--sr-info) 11%,transparent);
  color:var(--sr-info-ink)}
.sr-app .sr-hinweis--warnung{background:color-mix(in oklab,var(--sr-warn) 11%,transparent);
  color:var(--sr-warn-ink)}
.sr-app .sr-hinweis--sperre{background:color-mix(in oklab,var(--sr-err) 11%,transparent);
  color:var(--sr-err-ink)}
/* Der Safe-Browsing-Banner bleibt die hoechste Alarmstufe und darf lauter
   sein als ein Hinweiskasten — er behaelt seine Flaeche. */
.sr-app .sr-hinweis.sb-banner{font-size:var(--fs-body);font-weight:var(--fw-ui)}

/* ---------------------------------------------------------- A6 Zeitraum --
 * Ein Segmentschalter je Ansicht. Gesperrte Segmente bleiben LESBAR (kein
 * Opazitaets-Schleier) und sagen im title, woran es liegt.
 */
.sr-zeitraum{display:inline-flex;gap:var(--s-2);padding:var(--s-2);background:var(--sr-soft);
  border-radius:var(--sr-r-sm)}
.sr-zeitraum-seg{display:inline-flex;align-items:center;justify-content:center;
  min-height:32px;min-width:44px;padding:var(--s1) var(--s2);border:0;border-radius:var(--sr-r-xs);
  background:none;font:inherit;font-size:var(--fs-ui);font-weight:var(--fw-ui);
  color:var(--sr-mut);text-decoration:none;cursor:pointer;
  transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease)}
.sr-zeitraum-seg:hover{color:var(--sr-ink);text-decoration:none}
.sr-zeitraum-seg[aria-checked="true"]{background:var(--sr-surface);color:var(--sr-acc-ink);
  box-shadow:var(--sr-e1)}
[data-theme="medium"] .sr-zeitraum-seg[aria-checked="true"],[data-theme="dark"] .sr-zeitraum-seg[aria-checked="true"]{
  background:var(--sr-hell);color:var(--sr-auf-hell)}
.sr-zeitraum-seg[aria-disabled="true"]{color:var(--sr-mut);cursor:not-allowed;opacity:1}
.sr-zeitraum-seg[aria-disabled="true"] .sr-zeitraum-schloss{color:var(--sr-mut)}
.sr-zeitraum-seg:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px}

/* ------------------------------------------------------- A7 Leerzustand --
 * Eine soft-Flaeche, ein Satz, EIN naechster Schritt. Kein Befehl, kein Pfad.
 */
.sr-leer{border:0;border-radius:var(--sr-r-md);background:var(--sr-soft);
  padding:var(--s4);max-width:420px;margin:0 auto;display:flex;flex-direction:column;
  align-items:center;text-align:center;gap:var(--s2)}
.sr-leer-icon{color:var(--sr-mut);display:inline-flex}
.sr-leer-icon svg{width:24px;height:24px;display:block}
.sr-leer-titel{font-size:var(--fs-body);font-weight:var(--fw-ui);color:var(--sr-ink)}
.sr-leer-text{font-size:var(--fs-body);font-weight:var(--fw-body);line-height:1.5;
  color:var(--sr-mut);max-width:none}
.sr-leer-schritt{display:inline-flex;align-items:center;min-height:32px;
  padding:var(--s1) var(--s2);border-radius:var(--sr-r-sm);border:1px solid var(--sr-feld-line);
  background:var(--sr-surface);color:var(--sr-ink);font-size:var(--fs-ui);
  font-weight:var(--fw-ui);text-decoration:none;cursor:pointer}
.sr-leer-schritt:hover{background:var(--sr-soft);text-decoration:none;color:var(--sr-ink)}
.sr-leer-schritt--text{border:0;background:none;color:var(--sr-mut);font-weight:var(--fw-body);
  padding:0;cursor:default}

/* ------------------------------------------------------- A8 Reiterleiste --
 * Nie zweizeilig, nie Seiten-Querlauf: die Leiste scrollt in sich, rechts
 * verraet eine 16-px-Blende, dass noch etwas kommt.
 */
/* DIE LEISTE SELBST IST DER SCROLL-BEHAELTER (app.css), nicht das Band.
   Deshalb sitzen Scroll-Rasterung und die Blende hier und nicht am Band —
   ein absolut gesetztes Pseudo-Element IM Behaelter waere mitgescrollt und
   haette die Blende beim Wischen quer ueber die Reiter geschoben. Die Maske
   gehoert zur Box des Behaelters und bleibt an seiner rechten Kante stehen;
   passt alles hinein, liegt sie ueber leerer Flaeche und faellt nicht auf. */
.sr-app .sr-reiter{border-bottom:1px solid var(--sr-hair);scroll-snap-type:x proximity;
  -webkit-mask-image:linear-gradient(to right,#000 calc(100% - 16px),transparent);
  mask-image:linear-gradient(to right,#000 calc(100% - 16px),transparent)}
.sr-reiter .unterkapitel-band{display:flex;gap:0;padding:0;min-width:max-content}
/* [hidden] MUSS gewinnen: die Zeile darueber ist spezifischer als
   app.css `.unterkapitel-band[hidden]{display:none}` und zeigte am
   03.09.2026 abends alle sieben Kapitelbaender uebereinander (gemessen
   im Abnahmebild wettbewerber/wb-serp). Gleiches Muster wie
   `.content.kapitel-modus .section[hidden]` in app.css. */
.sr-reiter .unterkapitel-band[hidden]{display:none!important}
/* PRAESENTER (Betreiber-Ansage 04.09.2026, Punkt 1): je 5 px mehr Luft
   links und rechts (10 -> 15) und rund 10 % groessere Schrift (13 ->
   14,5 px). Die Reiterzeile ist die Hauptnavigation innerhalb eines
   Kapitels und stand optisch unter den Tabellenkoepfen. Die Hoehe zieht
   mit (40 -> 46 px), sonst klebt die groessere Schrift am Unterstrich. */
.sr-reiter .unterkapitel-tab{display:inline-flex;align-items:center;gap:var(--s0);
  min-height:46px;padding:var(--s2) 15px;font-size:14.5px;font-weight:var(--fw-ui);
  color:var(--sr-mut);text-decoration:none;white-space:nowrap;scroll-snap-align:start;
  border-bottom:2px solid transparent;border-radius:0;opacity:1;
  transition:color var(--t-fast) var(--ease)}
.sr-reiter .unterkapitel-tab:hover{color:var(--sr-ink);text-decoration:none;opacity:1}
.sr-reiter .unterkapitel-tab[aria-current]{color:var(--sr-acc-ink);font-weight:var(--fw-ui);
  border-bottom-color:var(--sr-acc);background:none;opacity:1}
.sr-reiter .unterkapitel-tab:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:-2px}
.sr-reiter .unterkapitel-tab-zahl{font-size:var(--fs-small);font-weight:var(--fw-body);
  font-variant-numeric:tabular-nums;color:var(--sr-mut);background:none;padding:0}
.sr-reiter .unterkapitel-tab[aria-current] .unterkapitel-tab-zahl{color:var(--sr-mut)}
/* LEITFARBE STATT AKZENT (Betreiber-Anweisung 06.09.2026, Bild „Übersicht"):
   Schrift und Unterstrich des aktiven Reiters tragen dieselbe Farbe wie der
   gefuellte Knopf (--knopf-blau, „die Lead-Farbe von SEO Radar"), nicht das
   hellere Akzent-Cyan. Dazu der Unterstrich naeher an die Schrift: die
   Reiterzeile war 46 px hoch mit dem Strich am Boden — 13 px Luft unter der
   Schrift; jetzt 36 px, also rund 8 px. Gilt fuer die Kapitel-Reiterzeile
   im Kopf (.sr-kopf .sr-reiter); die uebrigen Reiterzeilen (Verwaltung,
   Kosten) behalten ihr Mass. */
.sr-kopf .sr-reiter .unterkapitel-tab{min-height:36px;padding:var(--s1) 15px}
.sr-kopf .sr-reiter .unterkapitel-tab[aria-current]{color:var(--knopf-blau);border-bottom-color:var(--knopf-blau)}

/* ------------------------------------------------------------ A10 Betrieb --
 * Sichtbare Kante zwischen Kundenbild und Betriebsteil. HIER duerfen Befehle,
 * Pfade und Rohfehler stehen — und nur hier.
 */
.sr-betrieb{margin-top:var(--s5);padding-top:var(--s4);border-top:1px solid var(--sr-hair)}
.sr-betrieb-d{margin:0;background:none;border:0;box-shadow:none;border-radius:0}
.sr-betrieb-d>summary{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap;
  min-height:40px;padding:var(--s2) var(--s2);background:var(--sr-soft);
  border-radius:var(--sr-r-sm);cursor:pointer;list-style:none;color:var(--sr-ink)}
.sr-betrieb-d>summary::-webkit-details-marker{display:none}
.sr-betrieb-d>summary::before{content:none}
.sr-betrieb-d>summary:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px}
.sr-betrieb-chev{width:12px;height:12px;flex:none;color:var(--sr-mut);
  transition:transform var(--t-fast) var(--ease)}
.sr-betrieb-d[open] .sr-betrieb-chev{transform:rotate(90deg)}
.sr-betrieb-label{font-size:var(--fs-label);font-weight:var(--fw-ui);letter-spacing:.06em;
  text-transform:uppercase;color:var(--sr-ink)}
.sr-betrieb-was{font-size:var(--fs-small);font-weight:var(--fw-body);color:var(--sr-mut);
  flex:1;min-width:0}
.sr-betrieb-badge{font-size:var(--fs-label);font-weight:var(--fw-ui);letter-spacing:.06em;
  text-transform:uppercase;color:var(--sr-mut);background:var(--sr-soft);
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-xs);padding:var(--s-2) var(--s1);
  white-space:nowrap}
.sr-betrieb-koerper{padding-top:var(--s2);display:flex;flex-direction:column;gap:var(--s2)}
.sr-betrieb-koerper .mono,.sr-betrieb-roh{display:block;background:var(--sr-soft);
  border-radius:var(--sr-r-xs);padding:var(--s2) var(--s2);font-family:var(--mono);
  font-size:var(--fs-mono);line-height:1.5;color:var(--sr-ink);overflow-x:auto}

/* ------------------------------------------- Ausklapper auf der Karte A3 --
 * ui.details() bleibt bestehen (Tabellen-Ausklapper duerfen kein Popover
 * werden) — es bekommt nur den Kartenstil: 40-px-Summary auf soft, Chevron.
 */
.sr-app details.explain{margin:var(--s3) 0;background:var(--sr-surface);border:0;border-left:0;
  border-radius:var(--sr-r-md);box-shadow:var(--edge),var(--sr-e1);overflow:hidden}
.sr-app details.explain>summary{min-height:40px;display:flex;align-items:center;gap:var(--s2);
  padding:var(--s2) var(--s2);background:var(--sr-soft);font-size:var(--fs-ui);
  font-weight:var(--fw-ui);color:var(--sr-ink);cursor:pointer}
.sr-app details.explain>summary::before{width:8px;height:8px;border-color:var(--sr-mut);
  transition:transform var(--t-fast) var(--ease)}
.sr-app details.explain .ex-body{padding:var(--s3) 18px;font-size:var(--fs-body);
  font-weight:var(--fw-body)}

/* ----------------------------------------------------------- Skelett --
 * „laedt" ist ein eigener Zustand, kein leeres Feld. OHNE PULS (SuperStyler
 * Rang 12, 06.09.2026, nach Emil: Bewegung nur mit Zweck — ein Balken, der
 * atmet, verspricht Fortschritt, den er nicht kennt). Die Charts brauchen
 * kein eigenes Skelett: bis die Engine gezeichnet hat, steht das Server-SVG
 * (.chart-fallback) im Bild, siehe Chart-Weiche in app.css.
 */
.sr-skelett{display:block;height:28px;width:60%;border-radius:var(--sr-r-xs);
  background:var(--sr-soft)}
.sr-skelett--schmal{height:14px;width:40%}

/* -------------------------------------------------------- Schmale Bilder --
 * 380 px ist das Messkriterium: die Seite laeuft nie quer, gescrollt wird
 * INNERHALB der Karte.
 */
@media (max-width:899px){
  .sr-erklaerung-panel{position:fixed;top:auto;right:0;left:0;bottom:0;z-index:220;
    width:auto;max-width:none;max-height:min(80vh,80dvh);box-sizing:border-box;
    border-radius:var(--sr-r-lg) var(--sr-r-lg) 0 0;
    padding:var(--s3) var(--s3) calc(var(--s3) + env(safe-area-inset-bottom))}
  .sr-erklaerung-panel::backdrop{background:var(--sr-scrim);pointer-events:auto}
  .sr-erklaerung-griff{display:block;width:32px;height:4px;margin:0 auto var(--s2);
    border-radius:var(--sr-r-pill);background:var(--sr-hair)}
  @media (prefers-reduced-motion:no-preference){
    .sr-erklaerung-panel{animation:sr-erkl-hoch var(--t-med) var(--ease)}
  }
}
@media (max-width:559px){
  /* EINSPALTIG ab hier (Entwurfsblatt A1). sr.css haelt bis 379 px zwei
     Spalten — das stammt aus dem Paket vom 30.08. und ist mit dem Blatt vom
     03.09. ueberholt: bei 380 px stehen zwei 30-px-Zahlen nebeneinander nur
     noch, indem Label oder Meta-Zeile umbrechen. Eine Spalte, volle Breite,
     Zahl in voller Groesse. */
  .sr-kpi-gitter,.sr-kpi-gitter--2,.sr-kpi-gitter--3,.sr-kpi-gitter--5{grid-template-columns:1fr}
  .sr-kpi{padding:14px var(--s3)}
  .sr-kpi-meta{white-space:normal;overflow:visible;text-overflow:clip}
  .sr-karte-kopf{padding:14px var(--s3) 0}
  .sr-karte-koerper{padding:0 var(--s3) 14px}
  .sr-karte-kopf+.sr-karte-koerper{padding-top:var(--s2)}
  .sr-karte>.sr-werkzeugzeile{padding:var(--s2) var(--s3)}
  .sr-werkzeugzeile{gap:var(--s1)}
  .sr-werkzeug-filter{flex:1 1 100%;max-width:none}
  .sr-werkzeug-rechts{margin-left:0;width:100%}
  .sr-zeitraum{display:flex;width:100%}
  .sr-zeitraum-seg{flex:1 1 25%;min-height:40px;min-width:0;padding:var(--s1) var(--s0)}
  .sr-leer{padding:var(--s3)}
  .sr-betrieb-d>summary{flex-wrap:wrap}
  .sr-betrieb-badge{order:3}
  .sr-app .sr-tabelle td,.sr-app .tbl-wrap table td,
  .sr-app .sr-tabelle th,.sr-app .tbl-wrap table th{padding:var(--s2) var(--s2)}
}
/* Waagerecht gescrollt wird IN der Karte, nie auf der Seite (Veto Querlauf).
   .tbl-wrap und .sr-tabelle-wrap bringen das schon mit — hier steht es fuer
   die Tabellen, die als Bestandsmarkup in einer sr-Karte liegen. */
/* position:relative haelt absolut gesetzte Screenreader-Spannen (.sr-sr-only
   der Delta-Chips) IM Scroll-Rahmen — sonst strecken sie das Dokument bei
   390 px ueber die Seitenbreite (Kundenbericht 04.09.: 460 px ohne
   sichtbares Element). */
.sr-karte .tbl-wrap,.sr-karte .sr-tabelle-wrap,.sr-tabelle-wrap{overflow-x:auto;max-width:100%;position:relative}

@media (prefers-reduced-motion:reduce){
  .sr-betrieb-chev,.sr-app details.explain>summary::before,
  .sr-zeitraum-seg,.sr-kpi-info,.sr-reiter .unterkapitel-tab{transition:none}
  .sr-kpi{transition:box-shadow var(--t-fast) var(--ease)}
  .sr-kpi:hover{transform:none}
  .sr-erklaerung-panel,.sr-skelett{animation:none}
}

/* ------------------------------------- Herkunft im Popover (A1 -> A2) --
 * Die Grauzeilen, die bis heute unter jeder Kennzahl standen, stehen jetzt
 * hier: Etikett und Wert als Paar, damit ein Umbruch sie nie trennt.
 */
.sr-kpi-herkunft{margin:0;display:grid;grid-template-columns:auto 1fr;gap:var(--s0) var(--s2);
  font-size:var(--fs-small);line-height:1.45}
.sr-kpi-herkunft dt{color:var(--sr-mut)}
.sr-kpi-herkunft dd{margin:0;color:var(--sr-ink);font-variant-numeric:tabular-nums}

/* ------------------------------------------- Zeitraum-Zeile (A6) --
 * EIN Schalter je Ansicht, rechtsbuendig zwischen Reiterleiste und
 * KPI-Reihe. Die AUSRICHTUNG traegt diese Zeile, nicht .sr-zeitraum
 * selbst: derselbe Segmentschalter steht auch auf der Clusterseite und
 * ueber der KI-Sichtbarkeit, dort im normalen Textfluss. Eine Zeile
 * darum herum haelt die eine Ansicht von der anderen frei.
 */
.sr-zeitraum-zeile{display:flex;justify-content:flex-end;align-items:center;
  gap:var(--s2);flex-wrap:wrap;margin:0 0 var(--s3)}
.sr-zeitraum-zeile>.app-fuss{margin:0}
@media (max-width:559px){
  .sr-zeitraum-zeile{display:block}
}

/* ------------------------------------------------- Kapitel 01 „Dashboard" --
 * Drei Formen, die es nur hier gibt. Alles Uebrige des Kapitels baut auf
 * A1-A10 auf; diese drei haben in keinem anderen Kapitel eine Entsprechung
 * und stehen deshalb hier statt als weiterer Baustein.
 *
 *   .sr-crawlzeile    Der Crawling-Stand als EINE Zeile. Bis zum 03.09.2026
 *                     war er ein vierzeiliges Meta-Gitter neben einem
 *                     132x88-Platzhalter und damit die erste halbe
 *                     Bildschirmseite des Kapitels.
 *   .sr-thema-*       „Das Wichtigste" als Kacheln. Der Satz „was die Zahlen
 *                     sagen" stand in einer Tabellenzelle und zerfiel bei
 *                     390 px in eine Buchstabensaeule.
 *   .sr-technik-chips Die drei schwaechsten Kategorien als Chips neben dem
 *                     Ring — vorher drei Mini-Ringe mit eigener Legende.
 */
/* .sr-crawlzeile ist am 04.09.2026 entfallen (Punkt 10b): der Crawling-Stand
   steht jetzt als Kachelreihe in der Karte „Zustand" (projekt.js,
   startseiteKarte). Eine Zeile mit vier Trennpunkten war eine Liste, die
   nicht als Liste gesetzt war. Die Klassen sind aus dem Markup verschwunden;
   die Regeln hier waren danach ohne Wirkung. */

.sr-thema-liste{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:var(--s2)}
.sr-thema{display:flex;flex-direction:column;gap:var(--s1);padding:var(--s3);
  background:var(--sr-soft);border-radius:var(--sr-r-sm)}
.sr-thema-kopf{display:flex;align-items:baseline;gap:var(--s2);flex-wrap:wrap}
.sr-thema-titel{flex:1;min-width:0;font-size:var(--fs-ui);font-weight:var(--fw-bold);color:var(--sr-ink)}
.sr-thema-satz{margin:0;font-size:var(--fs-small);line-height:1.45;color:var(--sr-ink)}
.sr-thema-link{margin-top:auto;display:inline-flex;align-items:center;min-height:24px;
  font-size:var(--fs-ui);font-weight:var(--fw-ui);color:var(--sr-acc-ink);text-decoration:none}
.sr-thema-link:hover{text-decoration:underline}

.sr-technik-chips{display:flex;flex-wrap:wrap;gap:var(--s1);min-width:0}

/* Karte „Kundenbericht" (Kapitel 01, Betreiber-Auftrag 03.09.2026 22:00).
 * Der Knopf „Bericht oeffnen" hing bis dahin an der Crawling-Karte; jetzt
 * steht er in einer eigenen Karte, zusammen mit den erzeugten Dateien, ihren
 * Zeitraeumen und dem Formular „neu erzeugen".
 *
 * BAUFORM WIE .kw-kosten (Karte „Kostenpflichtige Abfragen"): je Zeile links
 * der Stand, rechts die Aktion, auf schmalen Fenstern untereinander. Zwei
 * Muster fuer dieselbe Zeilenform waeren die naechste Stelle, an der eine
 * Aenderung nur zur Haelfte ankommt — deshalb dieselben Abstaende, dieselbe
 * 40-px-Zielhoehe (Mass des Entwurfsblatts fuer selten getroffene Knoepfe).
 *
 * ZAHLEN HIER SIND GEOMETRIE (Kopf dieser Datei): 40 px Zielhoehe, 150 px
 * Mindestbreite des Datumsfeldes (unter der Breite bricht die deutsche
 * Datumseingabe in Chrome um).
 */
.sr-bericht{display:flex;flex-direction:column;gap:var(--s3)}
.sr-bericht-liste{display:flex;flex-direction:column;gap:var(--s3)}
.sr-bericht-zeile{display:flex;align-items:flex-end;justify-content:space-between;
  gap:var(--s2) var(--s5);flex-wrap:wrap;padding-bottom:var(--s3);
  border-bottom:1px solid var(--sr-hair)}
.sr-bericht-liste>.sr-bericht-zeile:last-child{padding-bottom:0;border-bottom:0}
.sr-bericht-stand{display:flex;flex-direction:column;gap:var(--s1);min-width:0;flex:1 1 260px}
.sr-bericht-name{font-size:var(--fs-ui);font-weight:var(--fw-bold);color:var(--sr-ink)}
.sr-bericht-meta{font-size:var(--fs-small);line-height:1.5;color:var(--sr-mut)}
.sr-bericht-aktionen{display:flex;align-items:center;gap:var(--s1);flex-wrap:wrap;min-width:0}
.sr-bericht-aktionen .sr-knopf{min-height:40px}
.sr-bericht-frei{font-size:var(--fs-small);line-height:1.5;color:var(--sr-mut)}

.sr-bericht-form{display:flex;align-items:flex-end;flex-wrap:wrap;gap:var(--s2) var(--s3)}
.sr-bericht-form .knopf{min-height:40px;margin-top:0}
.sr-bericht-typ{display:flex;align-items:center;flex-wrap:wrap;gap:var(--s1) var(--s2);
  margin:0;padding:0;border:0;min-width:0}
.sr-bericht-typ .feld-label{display:block;width:100%;margin:0}
.sr-bericht-wahl{display:inline-flex;align-items:center;gap:var(--s1);min-height:40px;
  padding:0 var(--s2);border-radius:var(--sr-r-sm);background:var(--sr-soft);
  font-size:var(--fs-ui);color:var(--sr-ink);cursor:pointer}
.sr-bericht-wahl:hover{box-shadow:inset 0 0 0 1px var(--sr-hair)}
/* Die getroffene Wahl traegt die Aktivform des Segmentschalters (A6): Surface
   statt soft, Akzent-Tinte, 1 px Akzentlinie — Farbe UND Flaeche, nie Farbe
   allein (Veto 2). Ohne :has()-Unterstuetzung bleibt der native Radiopunkt
   die Auskunft, die Wahl ist also nie unlesbar. */
.sr-bericht-wahl:has(input:checked){background:var(--sr-surface);color:var(--sr-acc-ink);
  box-shadow:inset 0 0 0 1px var(--sr-acc-line)}
.sr-bericht-wahl input{margin:0;accent-color:var(--sr-acc-knopf)}
.sr-bericht-datum{min-width:150px}
.sr-bericht-datum .feld-eingabe{min-height:40px;box-sizing:border-box;width:100%;max-width:100%}
.sr-bericht .app-fuss{margin-top:0}

@media (max-width:559px){
  .sr-bericht-zeile{align-items:stretch}
  .sr-bericht-aktionen{width:100%}
  .sr-bericht-aktionen .sr-knopf{flex:1 1 100%;justify-content:center}
  .sr-bericht-form{display:block}
  .sr-bericht-form>*{margin-bottom:var(--s2)}
  .sr-bericht-typ{width:100%}
  .sr-bericht-wahl{width:100%;box-sizing:border-box}
  .sr-bericht-form .knopf{width:100%;margin-bottom:0}
}

/* Formularfelder IN der Betrieb-Sektion (A10). Die beiden Admin-Formulare
   dort erben aus dem Bestand feste Feldbreiten (bis 420 px); als Flex-Kinder
   mit `min-width:auto` konnten sie unter ihre Inhaltsbreite nicht schrumpfen
   und schoben bei 390 px die ganze Seite um 63 px nach rechts (Lagepeilung
   03.09.2026, Querlauf-Veto). Der Deckel steht hier statt in app.css, weil
   dort 343 andere Aufrufstellen an denselben Klassen haengen. */
.sr-betrieb .feld{min-width:0;max-width:100%}
.sr-betrieb .feld-eingabe{max-width:100%;box-sizing:border-box}

/* ------------------------------------------ Kapitel 03 Keywords & Rankings
 * Das Kapitel bringt seine Karten seit dem Overhaul selbst mit, seine Huelle
 * ist aber KEINE `.section--blank` (dort traegt ein Flex-Gap den Abstand).
 * Deshalb steht der Kartenabstand hier — und nur fuer Karten, die direkte
 * Kinder einer nicht-blanken Sektion sind.
 */
/* Die zweite Regel gilt den Behaeltern, die eine Karte samt Sprungmarke
   umschliessen (#keyword-tabelle, #keyword-verlauf, #serp,
   #keyword-gruppen-vergleich): die Karte liegt dort eine Ebene tiefer und
   braucht den Abstand trotzdem. Nur die LETZTE Karte direkt an der Sektion
   verliert ihn — innerhalb eines Behaelters traegt er den Abstand zu dem,
   was hinter dem Behaelter folgt. */
.sr-body>.section:not(.section--blank)>.sr-karte,
.sr-body>.section:not(.section--blank)>div>.sr-karte{margin-bottom:var(--sr-gap)}
/* In der Verwaltungs-Spalte setzt der Flex-Abstand (.sr-verwaltung gap) —
   der Karten-Rand darueber wuerde ihn verdoppeln (gemessen 06.09.2026:
   52 px zwischen den Quick-Win-Karten statt 26). Spezifischer als die Regel
   darueber, deshalb direkt dahinter. */
.sr-body>.section:not(.section--blank)>div.sr-verwaltung>.sr-karte{margin-bottom:0}
.sr-body>.section:not(.section--blank)>.sr-karte:last-child{margin-bottom:0}

/* Prosa in der Tabellenzelle wird zur zweiten Zeile im Hauptfeld (A4):
   die Cluster-Notiz stand als eigene Spalte mit bis zu 255 Zeichen. */
.sr-body td .vw-name{display:block;color:var(--sr-ink)}
.sr-body td .vw-zeile-notiz{display:block;margin-top:var(--s-2);max-width:320px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:var(--fs-label);line-height:1.45;color:var(--sr-mut)}

@media (max-width:559px){
  .sr-thema-liste{grid-template-columns:1fr}
}

/* Fuenfer-Gitter (Sichtbarkeit): bei 1440 px bleiben je Kachel ~185 px fuer
   die Meta-Zeile — „31.08.–06.09. · Punkte" passt gerade, mit Einheit
   nicht mehr. Hier darf die Meta-Zeile zweizeilig werden, statt mitten im
   Wort zu enden (Abnahme SuperStyler 03.09.: „· Pu…", „· vor…"). */
.sr-kpi-gitter--5 .sr-kpi-meta{white-space:normal;overflow:visible;text-overflow:clip}

/* Zahnrad im Verwaltungsreiter (03.09.2026): 14 px, muted wie der Reitertext,
   im aktiven Reiter in der Akzent-Tinte. */
.sr-reiter .unterkapitel-tab-icon{width:14px;height:14px;flex:none;margin-right:var(--s0);color:currentColor}

/* Karte „Kostenpflichtige Abfragen" im Verwaltungsreiter (03.09.2026, Wunsch
 * Daniel): Schalter, Monatsbudget und Keyword-Kontingent stehen jetzt dort,
 * wo kuratiert wird, nicht nur unter /kosten.
 *
 * Drei Zeilen, je Zeile links der STAND und rechts das FORMULAR — auf
 * schmalen Fenstern untereinander. Die Formulare selbst sind unveraendert
 * .kosten-inline-form (app.css); hier steht nur, wie die Zeilen liegen.
 *
 * Die Zielflaeche der Knoepfe geht auf 40 px hoch: .sr-body .knopf (sr.css)
 * setzt 32 px fuer die dichte Arbeitsflaeche, aber das hier sind
 * Geld-Schalter, die man selten und dann sicher trifft — 40 px ist das Mass
 * aus dem Entwurfsblatt (wie .sr-reiter, .sr-modal-schliessen).
 */
/* Fetter Schalter (06.09.2026): gruen = an, rot = aus, Knauf wandert. Feste
   Farben in allen Themen (das Element ist seine eigene Flaeche): Weiss auf
   #1f7a3a 5,6:1, auf #b3261e 6,0:1. */
.sr-schalter{display:inline-flex;align-items:center;gap:10px;min-height:40px;padding:4px 16px 4px 5px;
  border:0;border-radius:999px;cursor:pointer;font:700 var(--fs-ui) var(--font-body);letter-spacing:.06em;
  color:#fff;box-shadow:var(--knopf-schatten);transition:background var(--t-fast) var(--ease),transform var(--t-fast) var(--ease)}
.sr-schalter--an{background:#1f7a3a}
.sr-schalter--aus{background:#b3261e;padding:4px 5px 4px 16px}
.sr-schalter-knauf{width:30px;height:30px;border-radius:50%;background:#fff;flex:none;
  box-shadow:0 1px 3px rgba(0,0,0,.35)}
.sr-schalter--aus .sr-schalter-knauf{order:2}
.sr-schalter:hover{transform:translateY(-1px);box-shadow:var(--knopf-schatten-hover)}
.sr-schalter:focus-visible{outline:2px solid var(--focus-ton);outline-offset:3px}
.kw-kosten{display:flex;flex-direction:column;gap:var(--s3)}
.kw-kosten-zeile{display:flex;align-items:flex-end;justify-content:space-between;
  gap:var(--s3) var(--s5);flex-wrap:wrap;padding-bottom:var(--s3);
  border-bottom:1px solid var(--sr-hair)}
.kw-kosten-zeile:last-child{padding-bottom:0;border-bottom:0}
.kw-kosten-stand{display:flex;align-items:baseline;gap:var(--s1) var(--s2);
  flex-wrap:wrap;min-width:0;flex:1 1 260px}
.kw-kosten-name{display:block;width:100%;font-size:var(--fs-label);
  font-weight:var(--fw-ui);letter-spacing:.06em;text-transform:uppercase;
  color:var(--sr-mut)}
.kw-kosten-wert{font-size:var(--fs-small);line-height:1.5;color:var(--sr-ink);min-width:0}
.kw-kosten .kosten-inline-form{flex:0 0 auto;min-width:0}
.kw-kosten .knopf{min-height:40px}

@media (max-width:559px){
  .kw-kosten-zeile{align-items:stretch}
  .kw-kosten .kosten-inline-form{width:100%}
  .kw-kosten .kosten-inline-form .feld-eingabe{width:100%}
  .kw-kosten .knopf{align-self:stretch}
}

/* ================================================== Gauge-Wand „Onpage-Score"
 * Betreiber-Auftrag 03.09.2026, 22:00: alle Rubriken als Anzeige oben, die
 * Tabelle als zweite, gleichberechtigte Darstellung derselben Zahlen, ein
 * Zahnrad fuer die Auswahl — Optimum aus sehr viel Information und trotzdem
 * Ueberblick.
 *
 * ZAHLEN, DIE HIER STEHEN DUERFEN, SIND GEOMETRIE (Kopf dieser Datei): 96 px
 * Kachelbild, 24 px Zielflaeche des Zahnrads, 36 px Zielhoehe einer Hakenzeile,
 * 150 px Rastermass der Wand, 300 als Bogenlaenge fuer die Aufbau-Bewegung.
 * Die 300 ist der Umfang des Kreises, auf dem der Bogen liegt, aufgerundet:
 * bei diesem Versatz liegt der gesamte Pfad in der Luecke des Strichmusters,
 * die Kachel startet also leer und laeuft auf ihren Wert zu. Sie gilt fuer
 * ALLE Kacheln, weil alle dieselbe Geometrie haben — deshalb braucht die
 * Bewegung keinen Wert je Kachel und damit kein style-Attribut.
 */
/* Die Kopfzeile der Karte richtet an der Schriftgrundlinie aus (.sr-karte-kopf);
   ein 32 px hoher Schalter haengt darin schief — deshalb hier ausdruecklich
   mittig. */
.sr-technik-werkzeuge{display:flex;align-items:center;align-self:center;gap:var(--s2);
  margin-left:auto;flex-wrap:wrap}
.sr-technik-zaehler{font-size:var(--fs-small);line-height:1.45;color:var(--sr-mut);
  font-variant-numeric:tabular-nums;white-space:nowrap}
.sr-technik-zahnrad{width:24px;height:24px;flex:none;display:inline-flex;align-items:center;
  justify-content:center;padding:0;border:0;background:none;border-radius:var(--sr-r-xs);
  color:var(--sr-mut);cursor:pointer;transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease)}
.sr-technik-zahnrad:hover,.sr-technik-zahnrad[aria-expanded="true"]{background:var(--sr-soft);color:var(--sr-ink)}
.sr-technik-zahnrad svg{width:16px;height:16px;display:block}
.sr-technik-zahnrad:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px}

/* Buehne: links die Gesamtnote als grosser Ring, daneben die Wand. Faellt die
   Wand weg (Darstellung „Tabelle"), steht der Ring allein — das ist gewollt:
   er ist die Note, nicht die Ueberschrift der Wand. */
.sr-technik-buehne{display:flex;align-items:flex-start;gap:var(--s4);flex-wrap:wrap}
/* Der Satz unter dem Ring sagt, in welchem Verhaeltnis Ring und Wand stehen:
   die eine Note, die vielen Rubriken. Ohne ihn stehen zwei Zahlenwelten
   nebeneinander, und niemand sagt, dass die eine aus der anderen kommt. */
.sr-technik-note{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;
  gap:var(--s1);max-width:150px}
.sr-technik-note-satz{font-size:var(--fs-small);line-height:1.45;color:var(--sr-mut);text-align:center}
.sr-gaugewand{flex:1 1 420px;min-width:0;display:grid;
  grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:var(--s2)}
.sr-gauge-leer{grid-column:1/-1;margin:0;font-size:var(--fs-small);line-height:1.45;color:var(--sr-mut)}

/* Eine Kachel: Bogen mit Zahl und Wort, darunter der Name. Ruhezustand soft
   ohne Rand, beim Zeigen hebt sie sich auf Surface und Stufe 2 — Tiefe ist
   Schatten, nicht Rahmen. */
.sr-gauge{display:flex;flex-direction:column;align-items:center;gap:var(--s0);
  min-width:0;padding:var(--s2) var(--s1);border-radius:var(--sr-r-md);
  background:var(--sr-soft);box-shadow:var(--sr-e1);
  transition:background var(--t-fast) var(--ease),box-shadow var(--t-fast) var(--ease)}
.sr-gauge:hover{background:var(--sr-surface);box-shadow:var(--e2)}
.sr-gauge-bild{position:relative;width:96px;max-width:100%}
.sr-gauge-svg{display:block;width:100%;height:auto}
.sr-gauge-spur{fill:none;stroke:var(--sr-hair)}
.sr-gauge-bogen{fill:none}
.sr-gauge-bogen--ok{stroke:var(--sr-ok)}
.sr-gauge-bogen--warn{stroke:var(--sr-warn)}
.sr-gauge-bogen--err{stroke:var(--sr-err)}
.sr-gauge-bogen--acc{stroke:var(--sr-acc)}
.sr-gauge-mitte{position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:var(--s-2);pointer-events:none;text-align:center}
.sr-gauge-wert{font-size:var(--fs-h1);line-height:1.05;font-weight:var(--fw-bold);
  letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--sr-ink)}
/* Das Wort ist das ZWEITE Signal neben der Farbe (Veto 2 des Designsystems):
   Gruen und Rot sind bei Rot-Gruen-Schwaeche im dunklen Theme nicht
   unterscheidbar — die Bewertung darf deshalb nie allein an der Tinte haengen. */
.sr-gauge-wort{font-size:var(--fs-label);line-height:1.2;font-weight:var(--fw-ui)}
.sr-gauge-wort--ok{color:var(--sr-ok-ink)}
.sr-gauge-wort--warn{color:var(--sr-warn-ink)}
.sr-gauge-wort--err{color:var(--sr-err-ink)}
.sr-gauge-wort--acc{color:var(--sr-mut)}
.sr-gauge-name{font-size:var(--fs-small);line-height:1.3;color:var(--sr-ink);
  text-align:center;max-width:100%;overflow-wrap:anywhere}
.sr-gauge-mark{font-size:var(--fs-label);line-height:1.3;letter-spacing:.06em;
  text-transform:uppercase;color:var(--sr-mut)}

/* [hidden] MUSS gewinnen. Abgewaehlte Rubriken und die nicht gewaehlte
   Darstellung bleiben im Markup und tragen nur `hidden` — damit der Browser
   sie ohne Neuladen zurueckholen kann. Eine Klasse mit eigenem `display`
   schlaegt aber das `display:none` des Browsers: ohne diese Zeile waere das
   Abwaehlen wirkungslos, und zwar lautlos. */
.sr-gauge[hidden],.sr-gaugewand[hidden],.sr-technik-tabelle[hidden],
.sr-gauge-leer[hidden],.sr-technik-werkzeuge[hidden]{display:none}

/* Aufbau-Bewegung: der Bogen laeuft EINMAL beim Laden auf seinen Wert zu.
   Keine Dauerbewegung, keine Wiederholung beim Umschalten der Darstellung. */
@keyframes sr-gauge-fuellen{from{stroke-dashoffset:300}to{stroke-dashoffset:0}}
@media (prefers-reduced-motion:no-preference){
  .sr-gauge-bogen{animation:sr-gauge-fuellen var(--t-med) var(--ease)}
}

/* Tabelle als eigene Darstellung — sie steht unter der Buehne, nicht in einem
   Ausklapper: „Beide" heisst Wand oben, Tabelle darunter. */
.sr-technik-tabelle{margin-top:var(--s3)}

/* Auswahl der Rubriken im Panel des Zahnrads (A2-Bauform). */
.sr-rubrik-schnell{display:flex;gap:var(--s1);flex-wrap:wrap;margin-bottom:var(--s2)}
.sr-rubrik-liste{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--s-2)}
.sr-rubrik{display:flex;align-items:center;gap:var(--s2);min-height:36px;
  padding:var(--s-2) var(--s1);border-radius:var(--sr-r-xs);cursor:pointer}
.sr-rubrik:hover{background:var(--sr-soft)}
.sr-rubrik input{flex:none;margin:0}
.sr-rubrik-name{flex:1 1 auto;min-width:0;font-size:var(--fs-ui);line-height:1.3;color:var(--sr-ink)}
.sr-rubrik-wert{flex:none;font-size:var(--fs-small);line-height:1.45;color:var(--sr-mut);
  font-variant-numeric:tabular-nums}
/* Die vier Felder im Zahnrad (Auftrag 04.09.2026). Abstand kommt vom Kontext:
   zwischen zwei Gruppen --s3, innerhalb der Gruppe bleibt --s-2 der Liste.
   Kein Rahmen um die Gruppe — der Name traegt sie, ein Kasten je Feld waere
   in einem Panel von 320 px vier Kaesten zu viel. */
.sr-rubrik-felder{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--s3)}
.sr-rubrik-gruppe-kopf{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--s2);margin:0 var(--s1) var(--s1)}
.sr-rubrik-gruppe-name{font-size:var(--fs-label);font-weight:var(--fw-ui);letter-spacing:.4px;
  text-transform:uppercase;color:var(--sr-mut)}
/* „nur diese" ist ein Textknopf, kein Chip: er steht in einer Kopfzeile und
   soll sie nicht aufblaehen. Die 24-px-Trefflaeche kommt aus dem Polster,
   der negative Aussenabstand gibt sie dem Layout zurueck (WCAG 2.5.8). */
.sr-rubrik-gruppe-nur{flex:none;background:none;border:0;padding:var(--s0) var(--s1);
  margin:calc(var(--s0) * -1) calc(var(--s1) * -1);font:inherit;font-size:var(--fs-label);
  color:var(--sr-acc);cursor:pointer;border-radius:var(--sr-r-xs)}
.sr-rubrik-gruppe-nur:hover{background:var(--sr-soft)}

@media (max-width:899px){
  .sr-technik-buehne{gap:var(--s3)}
  .sr-gaugewand{flex:1 1 100%}
}
@media (max-width:559px){
  .sr-gaugewand{grid-template-columns:repeat(2,1fr)}
  .sr-technik-werkzeuge{margin-left:0;width:100%}
  .sr-technik-werkzeuge .sr-zeitraum{flex:1 1 auto;width:auto}
}
@media (prefers-reduced-motion:reduce){
  .sr-gauge{transition:none}
}

/* Formulare im Verwaltungsreiter NEBENEINANDER (Betreiber-Bild 03.09., 22:45):
   Eingabe und Knopf standen untereinander und liessen die Zeile hoch und leer.
   Das Label bleibt ueber dem Feld, der Knopf schliesst an die Unterkante des
   Feldes an; unter 560 px wieder untereinander mit voller Breite. */
.kw-verwaltung .kosten-inline-form,.wb-verwaltung .kosten-inline-form{
  flex-direction:row;align-items:flex-end;flex-wrap:wrap;gap:var(--s2);min-width:0}
.kw-verwaltung .kosten-inline-form .feld,.wb-verwaltung .kosten-inline-form .feld{margin:0;min-width:0}
.kw-verwaltung .kosten-inline-form .feld-eingabe{width:220px;max-width:100%;min-height:40px;box-sizing:border-box}
.kw-verwaltung .kosten-inline-form .knopf,.wb-verwaltung .kosten-inline-form .knopf{align-self:flex-end;min-height:40px}
.kw-kosten-zeile{padding:var(--s2) 0;gap:var(--s3)}
.kw-kosten-stand{flex:1 1 320px}
@media (max-width:559px){
  .kw-verwaltung .kosten-inline-form,.wb-verwaltung .kosten-inline-form{flex-direction:column;align-items:stretch}
  .kw-verwaltung .kosten-inline-form .feld-eingabe{width:100%}
}
/* Der Schalter hat kein Eingabefeld — sein Label „Umschalten" neben dem Knopf
   sagte nichts, was der Knopf nicht selbst sagt; bleibt nur fuer Screenreader. */
.kw-kosten form[action="/kosten/schalter"] .feld-label{position:absolute;width:1px;height:1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ---------------------------------------------- Verwaltungsreiter: Abschnitte
 * Betreiber-Bild 03.09., 22:55 („gequetscht, sieht aus wie 1990 — vertikaler
 * Abstand!"): jeder Abschnitt ist eine Karte, dazwischen --s4 Luft; das
 * Anlege-Formular legt seine Felder als Raster nebeneinander, Label ueber dem
 * Feld, Knopf am Zeilenende auf der Feldunterkante.
 */
.sr-verwaltung{display:flex;flex-direction:column;gap:var(--s4)}
.sr-verwaltung>.sr-karte{margin:0}
.sr-verwaltung .kw-verwaltung-kopf{margin-bottom:0}
/* Zwei Spalten hintereinander (Keyword-Verwaltung, dann Cluster-Verwaltung):
   dieselbe Luft wie zwischen den Karten. Und LUFT NACH DER EINLEITUNG
   (Befund Daniel 06.09.2026: der Satz sass gequetscht auf der ersten Box). */
.sr-verwaltung+.sr-verwaltung{margin-top:var(--s4)}
.sr-body .kw-verwaltung-intro{margin-bottom:var(--s3)}
.sr-body .kw-verwaltung-intro+.sr-verwaltung,.sr-body .kw-verwaltung-intro+.wb-verwaltung{margin-top:var(--s4)}
.kw-cluster-verwaltung .vw-form{margin:0}
.kw-cluster-verwaltung .sr-karte-koerper>p:first-child{margin-top:0}
/* KEIN `auto`-Track hinter repeat(auto-fit, …): das ist ungueltig und liess
   die ganze Regel fallen — die Felder standen wieder untereinander. */
.sr-anlegen-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
  gap:var(--s3);align-items:end}
.sr-anlegen-form .feld{margin:0;min-width:0;display:flex;flex-direction:column;gap:var(--s1)}
.sr-anlegen-form .feld-label{font-size:var(--fs-label);font-weight:var(--fw-ui);letter-spacing:.06em;
  text-transform:uppercase;color:var(--sr-mut)}
.sr-anlegen-form .feld-eingabe{width:100%;min-height:40px;box-sizing:border-box;
  padding:var(--s2) var(--s3);font-size:var(--fs-body)}
.sr-anlegen-form .knopf{min-height:40px;white-space:nowrap;justify-self:start}
.sr-anlegen-form .kw-anlegen-hinweis{grid-column:1 / -1;margin:0}
.sr-verwaltung .kw-kosten{gap:var(--s2)}
.sr-verwaltung .kontingent-zeile,.sr-verwaltung .kw-kontingent{margin:0 0 var(--s3)}
@media (max-width:559px){
  .sr-anlegen-form{grid-template-columns:1fr}
  .sr-anlegen-form .knopf{width:100%;justify-self:stretch}
}

/* Kartenkopf unter 560 px: Titel und Meta untereinander — nebeneinander
   quetschte der Titel auf zwei Zeilen neben die Meta (Mobil-Bild 03.09., 23:05). */
@media (max-width:559px){
  .sr-karte-kopf{flex-direction:column;align-items:flex-start;gap:var(--s0)}
  .sr-karte-kopf .sr-karte-meta,.sr-karte-kopf .sr-erklaerung{margin-left:0}
}

/* SuperStyler-Nachpruefung 04.09. frueh:
   (1) Wettbewerber → Verwalten trug 88 px Leerraum unter der Reiterleiste —
       die h3.kw-verwaltung-kopf bekommt --s7 als Abstand zum Kopfblock des
       Kapitels, hier folgt sie aber direkt auf den (nur fuer Screenreader
       sichtbaren) Sektionskopf; dann kein Abstand.
   (2) Kartenkopf zwischen 400 und 560 px: der Titel schrumpfte neben die
       Meta statt sie in die naechste Zeile zu schieben — ein Mindestmass
       fuer den Titel laesst die Meta umbrechen, nie ueber den Titel. */
.sr-body>.section>.section-head+h3.kw-verwaltung-kopf{margin-top:0}
.sr-karte-kopf .sr-karte-titel{flex:1 1 auto;min-width:min(100%,220px)}

/* ---------------------------------------- Uebersicht als Kundeneinstieg --
 * Startseite „/" (04.09.2026): Urteilszeile mit Erklaerungs-Link daneben,
 * Projektkarten als A3-Karte mit Vierer-KPI-Gitter. Der Kartentitel ist ein
 * Link (h3 > a) — Groesse der Kartenebene (h2-Stufe), nicht die des
 * Seitentitels, den app.css der alten Karte gab.
 */
.uebersicht-urteil{display:flex;align-items:baseline;gap:var(--s3);flex-wrap:wrap;margin:0 0 var(--s3)}
.uebersicht-urteil .urteil{margin:0;flex:1 1 auto;min-width:0}
.uebersicht-urteil .uebersicht-stand{font-size:var(--fs-small);font-weight:var(--fw-body);color:var(--sr-mut)}
.projekt-karte.sr-karte{margin:0 0 var(--s3)}
.projekt-karte .projekt-kopf h3{font-size:var(--fs-h2);font-weight:var(--fw-bold);margin:0}
.projekt-karte .projekt-kopf .ampel{margin-left:0}
.projekt-karte .sr-karte-koerper .sr-kpi-gitter{margin:0}
.cluster-gruppe .projekt-karte.sr-karte{margin-bottom:var(--s3)}
/* Der Cluster-Kopf ist ein Kartenkopf, kein Unterkapitel: die 62 px Vorlauf
   der .sr-body h3-Regel klafften als Leerzone ueber dem Titel (1440-px-Bild
   04.09., 85 px). */
.sr-body .cluster-gruppe .cluster-kopf h3{margin:0}
.sr-body .cluster-gruppe{padding:var(--s3) var(--s4) var(--s1)}
.sr-body .cluster-gruppe .cluster-sub{margin:var(--s0) 0 var(--s3)}
@media (max-width:559px){
  .projekt-karte .projekt-kopf{gap:var(--s1)}
}

/* ======================================== Sektionsueberarbeitung 04.09. ==
 * Kapitelbezogener Baustein-Stil der uebrigen sechs Kapitel (Rang 1 nach
 * dem Live-Gang). Je Kapitel EIN Block hinter seinem Anker — die Kapitel
 * wurden parallel ueberarbeitet, und ein gemeinsames Dateiende waere die
 * Stelle gewesen, an der sich die Haende treffen. Selektoren sind auf das
 * Kapitel gescopt (#ki-sichtbarkeit, #wettbewerber, #besucher, #backlinks, #technik,
 * #google-index) oder tragen einen Kapitel-Praefix.
 */
/* Steht die erste Ueberschrift einer Ansicht DIREKT hinter dem (nur fuer
   Screenreader sichtbaren) Sektionskopf, gibt es nichts, wovon sie sich
   absetzen muesste — sr.css gibt ihr trotzdem 38 px (h3:first-of-type
   gewinnt dort ueber .section-head+h3, gleiche Spezifitaet, spaetere
   Stelle). Kapitel 05 traegt seine h3 als erste Zeile jeder Ansicht; bis zum
   04.09.2026 klafften dort rund 90 px zwischen Reiterleiste und Titel. */
.sr-body>.section>.section-head+h3:first-of-type{margin-top:0}

/* --- Kapitel 05 KI-Sichtbarkeit --- */
/* Die Legende der Fragenliste („Ergebnis je Frage") und die Datenschutz-
   Zeile der Zugriffe sind Fusszeilen IN einer Karte, keine Seitenfussnoten.
   `.app-fuss` bringt 56 px Vorlauf mit (gemessen 04.09.2026) — gedacht als
   Abstand zum naechsten ABSCHNITT. Im Kartenkoerper klafft damit ein leeres
   Feld zwischen der letzten Frage und ihrer Legende. Abstand am KONTEXT,
   nicht am Element: nur die .app-fuss IN einem Kartenkoerper verliert ihn. */
#ki-sichtbarkeit .sr-karte-koerper>.app-fuss{margin-top:var(--s2)}

/* Zwei ausformulierte Saetze in EINER Kartenfusszeile (Karte „KI-Impressions"):
   `.sr-karte-fuss` ist ein Flexrahmen mit space-between — zwei kurze Angaben
   stehen damit an den Raendern, zwei SAETZE werden auseinandergezogen und
   umbrechen an verschiedenen Stellen. Jeder Satz bekommt deshalb seine eigene
   Zeile; die kurzen Angaben der uebrigen Karten bleiben unberuehrt. */
#ki-sichtbarkeit .ki-fuss-zeile{flex:1 1 100%}

/* --- Kapitel 09 Wettbewerber --- */
/* Plaetze 1–3 nebeneinander statt untereinander: die dreizeilige Zelle
   machte jede Lueckenzeile 90 px hoch (lieht-shop: 4,5 Bildschirmseiten
   trotz Fenster 20). Umbruch bleibt erlaubt, wenn drei lange Domains nicht
   in die Spalte passen. */
#wettbewerber .sr-luecke-oben{flex-direction:row;flex-wrap:wrap;gap:var(--s0) var(--s3)}
/* Ein Kachelwert dieses Kapitels ist eine DOMAIN und damit ein einziges langes
   Wort. Die Kachel bringt min-width:0 mit, das WORT bricht davon aber nicht:
   „langenundleuchten.de" lief in 9.3 „Keyword-Lücken" auf 390 px 111 px ueber
   den Rand hinaus (Lagepeilung 2.1, 03.09.2026). Umbruch statt Ueberlauf —
   Zahlen beruehrt das nicht, sie sind nie laenger als ihre Zeile. */
#wettbewerber .sr-kpi-wert{overflow-wrap:anywhere}
/* Und eine Stufe kleiner, wo der Wert ein NAME ist (`klein:true` — in diesem
   Kapitel genau die Kachel „Stärkster Nutznießer"). Gemessen bei 1440 px:
   die Kachel ist 299 px breit, innen 263 px; „langenundleuchten.de" misst in
   der 22-px-Stufe 270 px und brach mitten im Wort um („…leuchten.d" / „e").
   In der 17-px-Stufe passt auch die laengste vorkommende Domain in eine
   Zeile. Der Umbruch oben bleibt als Netz fuer noch laengere Namen. */
#wettbewerber .sr-kpi-wert--klein{font-size:var(--fs-h2)}

/* --- Kapitel 04 Besucher --- */
/* Die KI-Sparkline stand als inline-block hinter dem Satz und legte sich bei
   schmalem Kasten ueber dessen letzte Zeile (Abnahmebild 03.09., „Herkunft").
   Jetzt eine eigene Zeile — kein display-Wechsel am Element selbst, damit
   [hidden] weiterhin gewinnt. */
#besucher .besucher-spark{margin-top:var(--s2)}
/* Die Wert-Ausklapper je Ereignis liegen IN der Tabellenkarte (kompakt, also
   ohne Koerper-Polster) — sie bekommen dasselbe Polster wie ein Kartenkoerper,
   damit sie nicht an der Kartenkante kleben. min-width:0 haelt die inneren
   Tabellen im eigenen Scroll, statt die Karte auf 390 px quer zu ziehen. */
#besucher .besucher-werte{padding:0 18px var(--s3);min-width:0}
#besucher .besucher-werte>.explain{margin-top:0}
@media (max-width:640px){
  #besucher .besucher-werte{padding:0 var(--s3) 14px}
}

/* --- Ereignis-Widgets & Trichter (16.09.2026) ---
   Balkenbreiten sind SVG-rect-Attribute (width="…%"), nie style= — die CSP
   verwirft style-Attribute stumm. Das CSS setzt nur Rahmenmasse und Farben. */
:is(#besucher,#inhalte) .ew-kennzahlen{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s2) var(--s4);
  padding:14px 18px 4px}
:is(#besucher,#inhalte) .ew-kennzahl strong{font-size:var(--fs-h2);font-weight:var(--fw-bold);
  font-variant-numeric:tabular-nums;color:var(--sr-ink)}
:is(#besucher,#inhalte) .ew-kennzahl span{font-size:var(--fs-small);color:var(--sr-mut)}
:is(#besucher,#inhalte) .ew-kennzahlen .spark-wrap{margin-left:auto}
:is(#besucher,#inhalte) .ew-liste{list-style:none;margin:var(--s2) 0 0;padding:6px 18px var(--s3)}
:is(#besucher,#inhalte) .ew-zeile{display:grid;grid-template-columns:20px minmax(160px,1.4fr) 1fr auto auto;
  align-items:center;gap:var(--s2);padding:5px 0}
:is(#besucher,#inhalte) .ew-zeile+.ew-zeile{border-top:1px solid var(--sr-hair)}
:is(#besucher,#inhalte) .ew-rang{font-size:var(--fs-label);color:var(--sr-mut);font-variant-numeric:tabular-nums;
  text-align:right}
:is(#besucher,#inhalte) .ew-titel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
:is(#besucher,#inhalte) .ew-balken{width:100%;height:8px;display:block}
:is(#besucher,#inhalte) .ew-balken-spur{fill:var(--sr-hair)}
:is(#besucher,#inhalte) .ew-balken-wert{fill:var(--sr-acc)}
:is(#besucher,#inhalte) .ew-wert{font-variant-numeric:tabular-nums;text-align:right;min-width:52px}
:is(#besucher,#inhalte) .ew-anteil{font-size:var(--fs-small);color:var(--sr-mut);
  font-variant-numeric:tabular-nums;text-align:right;min-width:46px}
:is(#besucher,#inhalte) .ew-arten{padding:0 18px var(--s3);display:flex;flex-wrap:wrap;gap:var(--s1)}
/* Widgets nebeneinander; unter ~1000 px stapelt das Raster. Mit drei
   Widgets (Überblick: Akkordeons, Downloads, Videos) drei Spalten ab 1250 px. */
:is(#besucher,#inhalte) .ew-duo{display:grid;gap:var(--s3);grid-template-columns:1fr;align-items:start;margin-bottom:var(--s3)}
@media (min-width:1000px){:is(#besucher,#inhalte) .ew-duo{grid-template-columns:1fr 1fr}}
/* Assets-Raster (17.09.2026): drei Widgets nebeneinander, sobald Platz ist. */
@media (min-width:1360px){#inhalte .ew-duo--drei{grid-template-columns:1fr 1fr 1fr}}
/* Mitgliederverzeichnis: Filter-Chart links, Weiterleitungs-Tabelle rechts. */
#inhalte .gvp-verzeichnis-duo{display:grid;gap:var(--s3);grid-template-columns:1fr;align-items:start}
@media (min-width:1000px){#inhalte .gvp-verzeichnis-duo{grid-template-columns:1fr 1fr}}
/* eCommerce-Produktkatalog (17.09.2026): Kacheln mit Bild, Preis, Nachfrage. */
#shop .ec-produkte{display:grid;gap:var(--s3);grid-template-columns:repeat(auto-fill,minmax(210px,1fr))}
#shop .ec-produkt{display:flex;flex-direction:column;gap:var(--s2);border:1px solid var(--sr-hair);border-radius:12px;padding:var(--s2);background:var(--sr-surface)}
#shop .ec-produkt--aus{opacity:.65}
#shop .ec-produkt-bild{width:100%;aspect-ratio:4/3;object-fit:contain;border-radius:8px;background:var(--sr-soft)}
#shop .ec-produkt-bild--leer{display:block}
#shop .ec-produkt-text{display:flex;flex-direction:column;gap:4px;font-size:.92em}
#shop .ec-produkt-meta{color:var(--sr-mut);font-size:.85em}
#shop .ec-produkt-fuss{display:flex;flex-wrap:wrap;gap:8px;align-items:baseline;color:var(--sr-mut);font-size:.88em}
#shop .ec-produkt-preis{color:var(--sr-ink);font-weight:600}
#shop a.ec-produkt{color:inherit;text-decoration:none}
#shop a.ec-produkt:hover{border-color:var(--sr-mut)}
/* Produkt-Detail im Drawer: Bild begrenzt, Kurztext daneben. */
.seite-detail-body .ec-detail-produkt{display:flex;gap:var(--s3);align-items:flex-start;flex-wrap:wrap}
.seite-detail-body .ec-detail-produkt .ec-produkt-bild{width:220px;aspect-ratio:4/3;object-fit:contain;border-radius:8px;background:var(--sr-soft)}
.seite-detail-body .ec-detail-produkt p{flex:1;min-width:200px;margin:0}
#shop .ew-duo{display:grid;gap:var(--s3);grid-template-columns:1fr;align-items:start;margin-bottom:var(--s3)}
@media (min-width:1000px){#shop .ew-duo{grid-template-columns:1fr 1fr}}
@media (min-width:1250px){:is(#besucher,#inhalte) .ew-duo:has(>.sr-karte:nth-child(3)){grid-template-columns:repeat(3,minmax(0,1fr))}}
:is(#besucher,#inhalte) .ew-duo>.sr-karte{margin:0;min-width:0}
/* Suchfeld + Zaehler ueber der Rangliste; „Mehr anzeigen" darunter. */
:is(#besucher,#inhalte) .ew-werkzeug{display:flex;align-items:center;gap:var(--s2);padding:10px 18px 0}
:is(#besucher,#inhalte) .ew-suche{flex:1;min-width:0;min-height:30px;border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-ctl);background:var(--sr-soft);color:var(--sr-ink);
  padding:4px 10px;font:inherit;font-size:var(--fs-label)}
:is(#besucher,#inhalte) .ew-suche:focus-visible{outline:2px solid var(--sr-acc);outline-offset:1px}
:is(#besucher,#inhalte) .ew-zaehler{flex:none;font-size:var(--fs-small);color:var(--sr-mut);
  font-variant-numeric:tabular-nums}
:is(#besucher,#inhalte) .ew-mehr-zeile{display:flex;justify-content:center;padding:0 18px var(--s3)}
/* Trichter-Raster: Mindestbreite regelt die Spaltenzahl — bei 1150 px Inhalt
   drei Karten, auf sehr breiten Schirmen vier, mobil eine. */
#inhalte .tr-raster{display:grid;gap:var(--s3);
  grid-template-columns:repeat(auto-fill,minmax(340px,1fr));align-items:start}
#inhalte .tr-raster>.sr-karte{margin:0;min-width:0}
/* Kennzahl-Kacheln in Dashboard-Größe (Betreiber-Auftrag 17.09.2026):
   Wertgröße wie die Cockpit-Leiste (--fs-kpi-compact), flaches Polster,
   niedrige Mindesthöhe — gilt für die ru-kpis-Reihen des Besucher-Bereichs
   (Überblick, Quellen, Standorte). */
#besucher .ru-kpis .sr-kpi{padding:10px 14px 8px;min-height:68px;gap:2px}
#besucher .ru-kpis .sr-kpi-wert{font-size:var(--fs-kpi-compact)}
#besucher .ru-kpis .sr-kpi-gitter{grid-template-columns:repeat(auto-fit,minmax(158px,1fr));gap:10px}
#besucher .ru-kpis .sr-kpi-meta{font-size:var(--fs-label)}
/* Besuchs-Zeitreihe: Linechart links, ergänzendes Widget rechts (16.09. abends).
   align-items:stretch (17.09.): beide Karten gleich hoch — die Kartenkante
   der Zeitreihe endet auf Höhe des Wochen-Rhythmus. */
#besucher .bz-reihe{display:grid;gap:var(--s3);grid-template-columns:minmax(0,2fr) minmax(0,1fr);
  align-items:stretch;margin-bottom:var(--s3)}
#besucher .bz-reihe>.sr-karte{margin:0;min-width:0;display:flex;flex-direction:column}
#besucher .bz-reihe>.sr-karte>.sr-karte-koerper{flex:1;display:flex;flex-direction:column;justify-content:center}
@media (max-width:1100px){#besucher .bz-reihe{grid-template-columns:1fr}}
/* Quellen: Ring (ein Viertel) neben dem Verlauf (drei Viertel) … */
#besucher .qu-kopfreihe{display:grid;gap:var(--s3);grid-template-columns:minmax(0,1fr) minmax(0,3fr);
  align-items:stretch;margin-bottom:var(--s3)}
#besucher .qu-kopfreihe>.sr-karte{margin:0;min-width:0}
@media (max-width:1100px){#besucher .qu-kopfreihe{grid-template-columns:1fr}}
/* … darunter je Herkunftsart ein Widget im Dreier-Raster. */
#besucher .qu-raster{display:grid;gap:var(--s3);grid-template-columns:repeat(3,minmax(0,1fr));
  align-items:start;margin-bottom:var(--s3)}
#besucher .qu-raster>.sr-karte{margin:0;min-width:0}
@media (max-width:1250px){#besucher .qu-raster{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:820px){#besucher .qu-raster{grid-template-columns:1fr}}
#besucher .qu-widget-liste{padding-top:0}
#besucher .qu-widget-leer{padding:0 18px var(--s3)}
#besucher .qu-widget-drill{padding:0 18px var(--s3)}
#besucher .qu-widget-drill>.explain{margin-top:0}
#besucher .qu-ki-text{padding:14px 18px 0}
#besucher .qu-ki-text p{margin:0 0 var(--s2)}
#besucher .qu-ki-fuss{padding:0 18px var(--s3);margin:0}
/* Gast/Mitglied: drei Ringe nebeneinander vor den Tabellen. */
#inhalte .seg-raster{display:grid;gap:var(--s3);grid-template-columns:repeat(3,minmax(0,1fr));
  align-items:start;margin-bottom:var(--s3)}
#inhalte .seg-raster>.sr-karte{margin:0;min-width:0}
@media (max-width:1100px){#inhalte .seg-raster{grid-template-columns:1fr}}
/* Standorte: Städte-Tabelle links, rechts Karte und darunter die Länder (17.09.). */
#besucher .geo-duo{display:grid;gap:var(--s3);grid-template-columns:1fr 1fr;
  align-items:start;margin-bottom:var(--s3)}
#besucher .geo-duo>.sr-karte{margin:0;min-width:0}
#besucher .geo-rechts{display:grid;gap:var(--s3);min-width:0}
#besucher .geo-rechts>.sr-karte{margin:0;min-width:0}
@media (max-width:1100px){#besucher .geo-duo{grid-template-columns:1fr}}
/* Funnel-Karte: Gauge links, Kennzahlen daneben. */
#inhalte .tr-kopfblock{display:flex;align-items:center;gap:var(--s2);min-width:0}
#inhalte .tr-gauge{flex:none;width:150px}
#inhalte .tr-gauge .chart-wrap{margin:0;padding:6px 0 0;background:transparent;box-shadow:none}
/* .chart traegt global min-width:460px (Zeitreihen) — fuer die kleine
   Funnel-Gauge gilt die Kartenspalte, nicht die Zeitreihen-Mindestbreite. */
#inhalte .tr-gauge svg.chart{min-width:0;width:100%;height:auto;display:block}
#inhalte .tr-kopfblock .ew-kennzahlen{flex:1;padding-top:10px}
/* Klickbare Ranglisten-Zeilen (Detail-Drawer). */
:is(#besucher,#inhalte) .ew-zeile[data-ew-detail]{cursor:pointer}
:is(#besucher,#inhalte) .ew-zeile[data-ew-detail]:hover,:is(#besucher,#inhalte) .ew-zeile[data-ew-detail]:focus-visible{
  background:var(--sr-soft)}
:is(#besucher,#inhalte) .ew-zeile[data-ew-detail]:focus-visible{outline:2px solid var(--sr-acc);outline-offset:-2px}
/* Ereignis-Tabelle: Klartext-Name oben, roher Ereignisname als stille zweite
   Zeile darunter — beide gehoeren zusammen, der Klartext fuehrt. */
:is(#besucher,#inhalte) .ew-name{display:flex;align-items:center;gap:4px}
/* width:fit-content: .mono bringt eine Hintergrund-Pille mit — als reines
   display:block liefe sie ueber die ganze Spaltenbreite (Abnahmebild 16.09.). */
:is(#besucher,#inhalte) .ew-roh{display:block;width:fit-content;font-size:var(--fs-small);color:var(--sr-mut)}
@media (max-width:640px){
  /* Schmal: Rang+Titel oben, Balken+Zahlen als zweite Zeile darunter —
     fuenf Spalten nebeneinander wuerden den Titel auf Buchstaben stauchen. */
  :is(#besucher,#inhalte) .ew-zeile{grid-template-columns:20px 1fr auto auto;grid-template-areas:
    "rang titel wert anteil" "rang balken balken balken"}
  :is(#besucher,#inhalte) .ew-rang{grid-area:rang}
  :is(#besucher,#inhalte) .ew-titel{grid-area:titel}
  :is(#besucher,#inhalte) .ew-balken{grid-area:balken}
  :is(#besucher,#inhalte) .ew-wert{grid-area:wert}
  :is(#besucher,#inhalte) .ew-anteil{grid-area:anteil}
  :is(#besucher,#inhalte) .ew-kennzahlen{padding:12px var(--s3) 2px}
  :is(#besucher,#inhalte) .ew-liste{padding:4px var(--s3) 14px}
  :is(#besucher,#inhalte) .ew-arten{padding:0 var(--s3) 14px}
}
/* Trichter: eine Schrittzeile = Kopf (Nr, Name, ⓘ, Zahl) + Balken darunter.
   Die Abgang-Zeile steht ZWISCHEN den Schritten und ist bewusst leiser. */
#inhalte .tr-schritte{padding:4px 18px var(--s3)}
#inhalte .tr-kopf{display:flex;align-items:center;gap:var(--s2);min-width:0}
#inhalte .tr-nr{flex:none;width:22px;height:22px;border-radius:50%;
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--sr-hair);color:var(--sr-ink);font-size:var(--fs-label);
  font-weight:var(--fw-bold);font-variant-numeric:tabular-nums}
#inhalte .tr-name{font-weight:var(--fw-bold);min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
#inhalte .tr-zahl{margin-left:auto;font-variant-numeric:tabular-nums;white-space:nowrap}
#inhalte .tr-anteil{font-size:var(--fs-small);color:var(--sr-mut)}
#inhalte .tr-schritt{padding:6px 0}
#inhalte .tr-schritt .ew-balken{height:12px;margin-top:6px}
#inhalte .tr-schritt--ziel .ew-balken-wert{fill:var(--sr-ok)}
#inhalte .tr-abgang{font-size:var(--fs-small);color:var(--sr-mut);
  padding:2px 0 2px 34px}
/* Die ⓘ an Trichter-Schritten und Ereignis-Namen sind IMMER sichtbar —
   Betreiber-Auftrag 16.09.2026: „jeder Trichter-Schritt wird mit einem
   Info-Icon erklärt". Die Hover-Regel der Karten ([data-sr-werkzeuge],
   Block „Widget-Werkzeuge") gilt weiter für Kachel- und Kartenkopf-ⓘ;
   hier erklärt das ⓘ nicht das Widget, sondern die einzelne Zeile. */
#inhalte .tr-kopf .sr-kpi-info,
:is(#besucher,#inhalte) .ew-name .sr-kpi-info{opacity:1}
@media (max-width:640px){
  #inhalte .tr-schritte{padding:2px var(--s3) 14px}
  #inhalte .tr-kopf{flex-wrap:wrap}
  #inhalte .tr-zahl{margin-left:34px;width:100%}
}

/* --- Kapitel 08 Backlinks --- */
/* Der Messpunkt-Ausklapper steht seit dem 04.09.2026 IN der Verlaufskarte
   (A4), nicht mehr frei im Fluss. details.explain bringt --s3 Aussenabstand
   nach unten mit, darunter zieht der Kartenkoerper sein eigenes Polster —
   zusammen ein doppelter Boden. Der Abstand gehoert an den KONTEXT (letztes
   Kind im Kartenkoerper), nicht an das Element. */
#backlinks .sr-karte-koerper>details.explain:last-child{margin-bottom:0}
/* A4: erste Spalte normalgewichtig. td.who ist global fett (dort traegt es
   die Projekt-/Domainspalte); in der Messpunkt-Tabelle steht ein Datum, und
   ein fettes Datum gewichtet die Zeile falsch. Das nowrap bleibt. */
#backlinks details.explain td.who{font-weight:var(--fw-body)}
/* Die Betrieb-Sektion sammelt zwei .app-fuss-Zeilen. Deren Vorlauf und
   Trennlinie sind fuer das SEITENENDE gedacht; im Akkordeon trennt bereits
   das gap des Koerpers, und die Linie doppelt die des Ausklappers. */
#backlinks .sr-betrieb-koerper .app-fuss{margin-top:0;padding-top:0;border-top:0}

/* --- Kapitel 06 Technik & Ladezeiten --- */

/* Teilscore-Karte (A3). Die Buehne mit einem 148-px- und drei 84-px-Ringen
   ist entfallen: der Gesamtscore ist eine KPI-Kachel, hier stehen nur noch
   die drei Teilscores auf der MITTLEREN Ringstufe (64) in einer Reihe.
   min-width:0 an den Flex-Kindern, weil die Gruppentitel zweizeilig
   umbrechen sollen statt die Reihe zu verbreitern. */
#technik .technik-teilscores{display:flex;flex-wrap:wrap;gap:var(--s4) var(--s5);
  align-items:flex-start}
#technik .technik-teilscore{display:flex;flex-direction:column;align-items:center;
  text-align:center;gap:var(--s0);min-width:0;flex:0 1 150px}
#technik .technik-teilscore .score-ring{flex-shrink:0}
/* Zwei Ebenen, nicht vier: Label und Delta teilen sich die Meta-Groesse. */
#technik .technik-teilscore-label{font-size:var(--fs-small);font-weight:var(--fw-ui);
  color:var(--sr-mut);line-height:1.35}
#technik .technik-teilscore-delta{font-size:var(--fs-small);line-height:1.35}
/* Telefonbreite: drei Ringe nebeneinander statt drei untereinander. Die
   150-px-Basis passt dort nicht zweimal in die Kartenbreite und liess jeden
   Ring eine eigene Zeile beanspruchen — 600 px fuer drei Zahlen. */
@media (max-width:559px){
  #technik .technik-teilscores{gap:var(--s3);flex-wrap:nowrap}
  /* flex-basis 0 statt 150 px: drei gleich breite Spalten. Der Gruppentitel
     bricht dann innerhalb seiner Spalte um (break-word als Fangnetz gegen
     ein langes Wort), statt in die Nachbarspalte zu laufen. */
  #technik .technik-teilscore{flex:1 1 0}
  #technik .technik-teilscore-label{overflow-wrap:break-word;hyphens:auto}
}

/* EINE SCHRIFTGROESSE JE EBENE in der Befund-Ansicht (Abnahme 03.09.: 20
   Groessen auf einer Seite). Erlaubt bleiben Kartentitel (h2), Fliesstext
   (body), Meta (small) und Chip (label) — die Bestandsklassen der Befund-
   Drilldowns hatten dafuer eigene Stufen und werden hier eingeordnet:
   Fundstellen auf Fliesstext, Herkunft auf Meta, der gruene Haken auf
   dieselbe Stufe wie die Zahl daneben. */
#technik .befund-fundstellen li{font-size:var(--fs-body)}
#technik .befund-herkunft{font-size:var(--fs-small)}
#technik .bestanden-haken{font-size:var(--fs-h1)}

/* Listen und Ausklapper liegen jetzt IN Karten: ihre Aussenabstaende kommen
   aus der Kartenpolsterung, nicht mehr von ihnen selbst. Abstand am KONTEXT
   (Nachbar-Kombinator), nicht am Element. */
#technik .sr-karte-koerper>.problem-liste{margin:0}
#technik .sr-karte-koerper>.problem-liste+details.explain{margin-bottom:0}
#technik .sr-karte-koerper>p:first-child{margin-top:0}
#technik .sr-karte-koerper>p:last-child{margin-bottom:0}
#technik .sr-karte-koerper>.heatmap:last-child{margin-bottom:0}
/* Karte in Karte vermeiden: der Ausklapper auf einer Karte traegt die weiche
   Flaeche statt einer zweiten Oberflaeche mit eigenem Schatten. */
#technik .sr-karte details.explain{background:var(--sr-soft);box-shadow:none}
#technik .sr-karte details.explain>summary{background:transparent}
/* Der Änderungs-Log und die Einzelbefunde sind handgebaute Tabellen ohne
   .tbl-wrap — im Kartenkoerper duerfen sie den Innenabstand nicht doppeln. */
#technik .sr-karte-koerper>table.tbl-drill{margin-bottom:0}

/* --- Kapitel 07 Google-Index --- */
/* Die Pruefliste der Kernseiten ist eine handgebaute table.tbl-drill (app.js
   Baustein 11 liest genau dieses Markup) und liegt seit dem 04.09.2026 IM
   Kartenkoerper statt frei in der Sektion. Ihr eigener Aussenabstand von
   --s3 kaeme dort zur Polsterung der Karte hinzu — der Abstand gehoert an
   den Kontext, nicht ans Element. */
#google-index .sr-karte-koerper>table.tbl-drill{margin:0}
/* Der Weiterleitungs-Hinweis steht ueber der Liste in derselben Karte: sein
   Vorlauf ist die Kartenpolsterung, seine Schriftgroesse die der Karte.
   17 px neben einer 14-px-Tabelle waeren zwei Ebenen in einem Kasten. */
#google-index .sr-karte-koerper>.takeaway:first-child{margin-top:0}
#google-index .sr-karte-koerper>.takeaway{font-size:var(--fs-body);line-height:var(--lh-body)}
/* Die Kartenfusszeile ist EIN Satz aus Angaben mit Trennpunkten, keine
   Leiste mit linkem und rechtem Ende — space-between risse sie ueber die
   ganze Kartenbreite auseinander. */
#google-index .sr-karte-fuss{justify-content:flex-start}

/* --- Verwaltung: Berichte (/berichte) --- */
/* Die Seite stand mit 6,5 Bildschirmseiten (Desktop) und 10,9 (390 px) in der
   Lagepeilung 2.1: zehn Projekte mal zwei Berichtstypen ergaben zwanzig
   gleichfoermige Bloecke mit je fuenf Formularen. Sie ist jetzt EINE
   Tabellenkarte je Kapitel; hier steht nur, wie die Formulare IN der Zeile
   liegen. Alles ist auf .berichte-verwaltung gescopt — die Klassen .knopf,
   .feld-eingabe und .mono haengen im Haus an hunderten Stellen. */
.berichte-verwaltung>.urteil{margin:0}
.berichte-verwaltung>.sr-kpi-gitter{margin:0}
/* A4: erste Spalte normalgewichtig — td.who ist global fett (theme.css) und
   gewichtet in einer Matrix aus Projekt mal Typ die falsche Achse. */
.berichte-verwaltung td.who{font-weight:var(--fw-body)}
/* Ein Formular in der Zelle ist ein Knopf, kein Block: kein Aussenabstand,
   keine eigene Zeile. inline-flex verliert gegen [hidden]{display:none
   !important} — die Zeilenkappung darf weiter greifen. */
.berichte-verwaltung .berichte-aktion{display:inline-flex;margin:0}
.berichte-verwaltung .berichte-aktion .knopf{white-space:nowrap}
/* Beide Erzeugen-Knoepfe untereinander: nebeneinander misst die Spalte allein
   350 px und schoebe die Tabelle ueber ihre Mindestbreite hinaus. */
.berichte-verwaltung .berichte-aktionen{display:flex;flex-direction:column;
  align-items:flex-start;gap:var(--s1)}
/* Badge und sein Schalter in EINER Spalte: das Wort sagt den Zustand, der
   Knopf darunter nennt den Wechsel (A4 — Status immer mit Wort). */
.berichte-verwaltung .berichte-schalter{display:flex;flex-direction:column;
  align-items:flex-start;gap:var(--s1)}
/* Empfaenger: Eingabe und Speichern in einer Zeile. min-width:0 an beiden
   Gitter-/Flexkindern, sonst zieht die Eingabe die Spalte auf ihre
   Inhaltsbreite (Querlauf-Veto). */
.berichte-verwaltung .berichte-empfaenger{display:flex;align-items:center;
  gap:var(--s1);margin:0;min-width:0}
.berichte-verwaltung .berichte-empfaenger .feld-eingabe{min-width:0;max-width:220px}
.berichte-verwaltung .berichte-empfaenger .knopf{flex:0 0 auto;white-space:nowrap}
/* „Zuletzt geaendert von …" ist die zweite, leisere Zeile derselben Zelle. */
.berichte-verwaltung .berichte-zeilenmeta{display:block;font-size:var(--fs-small);
  color:var(--sr-mut);white-space:normal}
/* Der einmalig gezeigte Freigabe-Link steht als Codefeld UNTER dem Satz —
   .mono ist im Fliesstext ein Inline-Chip und riss die zwei Zeilen des
   Hinweises (A5) auf vier auf. */
.berichte-verwaltung .berichte-code{display:block;margin-top:var(--s1);
  padding:var(--s1) var(--s2);border-radius:var(--sr-r-xs);white-space:normal}
/* Feste Angabe im Anlege-Raster (das Projekt eines Freigabe-Formulars): sieht
   aus wie ein Feld, ist aber Text. 40px ist die Feldhoehe desselben Rasters
   (.sr-anlegen-form .feld-eingabe) — Geometrie, damit die Grundlinie sitzt. */
.berichte-verwaltung .berichte-feld-wert{display:flex;align-items:center;
  min-height:40px;font-weight:var(--fw-ui);color:var(--sr-ink);min-width:0;
  overflow-wrap:anywhere}
/* Mehrere Erzeugen-Formulare in EINER Karte (eines je Projekt mit Dateien):
   Haarlinie statt zweiter Karte — Karte in Karte vermeiden. */
.berichte-verwaltung .sr-anlegen-form+.sr-anlegen-form{margin-top:var(--s3);
  padding-top:var(--s3);border-top:1px solid var(--sr-hair)}
@media (max-width:559px){
  /* Ausserhalb der Tabelle (Anlege-Raster, Hinweise) stapelt alles; die
     Tabelle selbst behaelt ihre Mindestbreite und scrollt IN der Karte. */
  .berichte-verwaltung .berichte-feld-wert{min-height:0}
}

/* --- Verwaltung: Anbindungen (/anbindungen) --- */
/* Beide Ansichten liegen seit dem 04.09.2026 auf den Bausteinen: „Je Projekt"
   EINE srKarte je Projekt (vorher eine je Projekt x Dienst — vierzig <h4>,
   37.694 px hoch), „Je Dienst" EINE srKarte je Datendienst. Alles hier ist auf
   .anb-verwaltung gescopt; die uebrigen .anb-*-Regeln in app.css/sr.css
   gehoeren zur Flottentabelle und zur Lauf-Konsole und bleiben unberuehrt.
   Nur Tokens, keine Zahlen. */

/* Die Karten stehen in der Spalte der .sr-verwaltung — deren Luecke setzt den
   Abstand, eigene Aussenabstaende kaemen dazu. */
.anb-verwaltung>p{margin:0}
.anb-verwaltung .anb-dienst{margin:0;min-width:0}
.anb-verwaltung .anb-projekt-huelle{min-width:0}
.anb-verwaltung .anb-projekt-huelle>.sr-karte,
.anb-verwaltung .anb-dienst>.sr-karte{margin:0}
.anb-verwaltung .sr-karte-koerper>:first-child{margin-top:0}
.anb-verwaltung .sr-karte-koerper>:last-child{margin-bottom:0}

/* Zustandschips im Kartenkopf: EIN Chip je Dienst mit Punkt, Kurzname und
   Zustandswort (A4 — Farbe traegt nie allein die Bedeutung). Sie stapeln,
   statt die Karte zu dehnen. */
.anb-verwaltung .anb-zchips{display:flex;flex-wrap:wrap;gap:var(--s1)}
.anb-verwaltung .anb-zchip{display:inline-flex;align-items:center;gap:var(--s1);
  min-width:0;padding:var(--s0) var(--s2);border-radius:var(--sr-r-pill);
  background:var(--sr-soft);font-size:var(--fs-label);line-height:1.5}
.anb-verwaltung .anb-zchip-name{font-weight:var(--fw-ui);color:var(--sr-ink)}
.anb-verwaltung .anb-zchip-wort{color:var(--sr-mut)}

/* Der Ausklapper der Projektkarte. Eigene Klasse, damit die alte Huelle
   .anb-projekt (Rahmen, Radius, Polster) hier nicht als Karte in der Karte
   wirkt. */
.anb-verwaltung .anb-projekt-auf{margin-top:var(--s3)}
.anb-verwaltung .anb-projekt-mehr{cursor:pointer;display:flex;align-items:center;
  gap:var(--s1);list-style:none;font-size:var(--fs-small);
  font-weight:var(--fw-ui);color:var(--sr-acc-ink)}
.anb-verwaltung .anb-projekt-mehr::-webkit-details-marker{display:none}
.anb-verwaltung .anb-projekt-mehr::before{content:"▸";font-size:var(--fs-label);
  transition:transform var(--t-fast) var(--ease)}
.anb-verwaltung .anb-projekt-auf[open]>.anb-projekt-mehr::before{transform:rotate(90deg)}
.anb-verwaltung .anb-projekt-mehr:hover{text-decoration:underline}
.anb-verwaltung .anb-projekt-auf>.sr-tabelle-wrap{margin-top:var(--s2)}

/* Bestandszeile und Formularzeile sind EIN Paar: die zweite traegt kein
   eigenes Polster nach oben, sonst reissen sie optisch auseinander. */
.anb-verwaltung .anb-projekt-tabelle td{vertical-align:top}
.anb-verwaltung .anb-zeile>td.who{font-weight:var(--fw-body)}
/* Der eingetragene Wert steht unter dem Dienstnamen. td.who ist global
   nowrap (theme.css, Projekt-/Domainspalte) — eine Property wie
   „sc-domain:beispiel.de" zoege die Spalte damit auf ihre volle Laenge auf. */
.anb-verwaltung .anb-wert{display:block;font-size:var(--fs-label);
  color:var(--sr-mut);white-space:normal;word-break:break-all}
/* Kein Zebra unter dem Panel: die Formularzeile gehoert optisch zu ihrer
   Dienstzeile, ein eigener Grauton machte daraus zwei Zeilen. Muss HIER
   stehen (nicht in sr.css bei den uebrigen .anb-panel-Regeln) — die
   Zebra-Regel oben in dieser Datei hat dieselbe Spezifitaet und gewaenne
   sonst ueber die Ladereihenfolge. */
.anb-verwaltung .anb-form-zeile>td{padding-top:0}

/* ---- Dienstzeile klappt ihr Einrichtungsformular auf (07.09.2026) ---------
   Betreiber-Auftrag: das Formular eines nicht eingerichteten Dienstes (z.B.
   Merchant Center) stand dauerhaft offen und machte aus einer Tabellenzeile
   einen halben Bildschirm. Jetzt traegt die ZEILE den Schalter — dasselbe
   Muster wie die Befundzeilen in Kapitel 06 und die Cluster-Tabelle
   (table.tbl-drill, app.js Baustein 11), damit dieselbe Handbewegung ueberall
   dasselbe tut.

   Der Chevron sitzt an der Dienstzelle statt in der ersten Zelle des
   Bausteins — hier IST die Dienstzelle die erste, aber ihr Inhalt ist
   mehrzeilig (Name, Wert, Meta) und die Tabelle steht auf vertical-align:top.
   Deshalb haengt der Pfeil an der ersten Textzeile (top:1em) statt in der
   optischen Mitte, wo er bei drei Zeilen neben dem Wert stuende. */
.anb-verwaltung .anb-projekt-tabelle tr.drill{cursor:pointer}
.anb-verwaltung .anb-projekt-tabelle tr.drill>td.who{position:relative;padding-left:var(--s4)}
.anb-verwaltung .anb-projekt-tabelle tr.drill>td.who::before{content:"";position:absolute;
  left:var(--s1);top:1em;width:7px;height:7px;
  border-right:2px solid var(--sr-mut);border-bottom:2px solid var(--sr-mut);
  transform:rotate(-45deg);transition:transform 140ms var(--ease)}
.anb-verwaltung .anb-projekt-tabelle tr.drill.drill--offen>td.who::before{transform:rotate(45deg)}
/* Die Zeile ist per role=button bedienbar (Baustein 11 setzt tabindex): der
   Fokusrahmen muss sichtbar sein, sonst ist die Tastaturbedienung blind. */
.anb-verwaltung .anb-projekt-tabelle tr.drill:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:-2px}
.anb-verwaltung .anb-projekt-tabelle tr.drill:hover>td.who::before{border-color:var(--sr-ink)}

/* Die MESSWERTE der Zeile — „Verbunden seit/von", „Letzter Lauf",
   „Naechster Lauf" — 20 % kleiner als die Tabellenschrift (Betreiber-Vorgabe
   07.09.2026). Betroffen sind die Angaben, NICHT die Spaltentitel: eine
   Datumsangabe mit Konto dahinter ist Beiwerk zur Frage „laeuft es?", die die
   Zustandsspalte in voller Groesse beantwortet. .8em ist genau der Faktor,
   relativ zur Zelle statt in Pixeln, damit es in jeder Schriftstufe stimmt. */
.anb-verwaltung .anb-projekt-tabelle td.anb-daten{font-size:.8em}
/* Die Zebra-Regel oben (.sr-app .sr-tabelle tbody tr:nth-child(even) td)
   traegt (0,3,3) — eine kuerzere Auswahl verliert gegen sie, auch spaeter in
   der Datei. Deshalb hier bewusst dieselbe Kette plus .anb-verwaltung.
   Gemessen 07.09.2026: ohne das faerbt Zebra jede zweite Formularzeile und
   das Panel steht auf einem Grauband, das seine Dienstzeile nicht hat. */
.sr-app .anb-verwaltung .sr-tabelle tbody tr.anb-form-zeile>td{background:transparent}
/* Der Ausklapper ist hier eine TABELLENZEILE, nicht ein Moebel im Fluss:
   details.explain traegt von Haus aus Kartenflaeche, Schatten und eine
   17-px-Zusammenfassung in Fett (theme.css) — in einer Zeile mit 13-px-Text
   ueberstimmt das die Zeile, zu der es gehoert. Dieselbe Einordnung wie in
   Kapitel 06 (#technik .sr-karte details.explain): weiche Flaeche statt
   zweiter Oberflaeche, und je eine Stufe kleiner. */
.anb-verwaltung .anb-form-zeile details.explain{margin:0 0 var(--s2);
  background:var(--sr-soft);box-shadow:none}
.anb-verwaltung .anb-form-zeile details.explain>summary{font-size:var(--fs-small);
  padding:var(--s1) var(--s2);gap:var(--s1)}
.anb-verwaltung .anb-form-zeile details.explain>.ex-body{font-size:var(--fs-body);
  padding:0 var(--s2) var(--s2) var(--s3)}
/* Art und Herkunft als Klartext — sichtbar nur dort, wo ihre Spalten aus der
   Tabelle weichen (Medienabfrage unten). */
.anb-verwaltung .anb-zeile-meta{display:none;margin:var(--s0) 0 0;
  font-size:var(--fs-label)}

/* Das Feldraster im Ausklapper (.sr-anlegen-form): Hinweiskaesten und das
   versteckte CSRF-Feld laufen ueber alle Spuren, die Felder teilen sie sich. */
.anb-verwaltung .sr-anlegen-form{margin-top:var(--s2)}
.anb-verwaltung .sr-anlegen-form>.info,
.anb-verwaltung .sr-anlegen-form>input[type="hidden"]{grid-column:1 / -1}
.anb-verwaltung .sr-anlegen-form>.info{margin:0}
.anb-verwaltung .anb-rohgrund{margin:0;word-break:break-word}

/* Knopfzeile und Live-Protokoll stehen unter der Tabelle IM Kartenkoerper;
   die Haarlinie trennt Bestand von Aktion. Markup unveraendert (app.js
   Baustein 13), nur die Umgebung ist neu. */
.anb-verwaltung .anb-aktionen{margin-top:var(--s3);padding-top:var(--s3);
  border-top:1px solid var(--sr-hair)}
.anb-verwaltung .sr-karte-koerper>table.tbl-drill{margin:0}
.anb-verwaltung .sr-karte-koerper>.tbl-wrap{margin:0}

/* Der Dienstkatalog: EINE Karte unter den Projektkarten mit dem, was fuer
   jedes Projekt gleich gilt. Gleiches Ausklapp-Muster wie die Projektkarte. */
.anb-verwaltung .anb-katalog-huelle{min-width:0}
.anb-verwaltung .anb-katalog-huelle>.sr-karte{margin:0}
.anb-verwaltung .anb-katalog{list-style:none;margin:var(--s2) 0 0;padding:0;
  display:flex;flex-direction:column;gap:var(--s3)}
.anb-verwaltung .anb-katalog-kopf{display:flex;align-items:center;gap:var(--s2);
  flex-wrap:wrap;min-width:0}
.anb-verwaltung .anb-katalog-name{font-weight:var(--fw-ui);color:var(--sr-ink)}
.anb-verwaltung .anb-katalog-eintrag>p{margin:var(--s0) 0 0}
/* Der Art-Chip in der Spalte „Aktion" traegt bis zu 33 Zeichen
   („Kostenpflichtig — auf Beauftragung"). .sr-chip ist inline-block ohne
   Umbruch; in einer Tabellenspalte zieht das die Tabelle ueber die
   Kartenbreite hinaus, statt zwei Zeilen zu nehmen. */
.anb-verwaltung .anb-projekt-tabelle .sr-chip{white-space:normal;
  overflow-wrap:normal;word-break:keep-all;hyphens:none}

/* „Vorbereitet": EINE Karte mit einer Zeile je Dienst — die Aufzaehlungen
   stehen wortgleich im A2-Popover statt in drei Hinweiskaesten (A5). */
.anb-verwaltung .anb-vorb-liste{list-style:none;margin:0;padding:0;
  display:flex;flex-direction:column;gap:var(--s3)}
.anb-verwaltung .anb-vorb-kopf{display:flex;align-items:center;gap:var(--s2);
  flex-wrap:wrap;min-width:0}
.anb-verwaltung .anb-vorb-name{font-weight:var(--fw-ui);color:var(--sr-ink)}
.anb-verwaltung .anb-vorb p{margin:var(--s1) 0}
.anb-verwaltung .anb-vorb-titel{font-weight:var(--fw-ui);margin:var(--s2) 0 var(--s0)}

/* ZWEI STUFEN, NICHT EINE. Sechs Spalten passen bis rund 900 px; darunter
   weichen „Verbunden seit/von" und „Aktion" (dieselbe .anb-sp-neben-Regel wie
   in der Flottentabelle), ihr Inhalt steht als Klartext in der Dienstzelle.
   Unter 560 px weicht zusaetzlich „Naechster Lauf": drei Spalten auf 390 px
   sind rund 115 px breit und tragen „Google Search Console" in zwei Zeilen —
   bei vier Spalten (65 px) bricht dasselbe Wort auf EINEN BUCHSTABEN je Zeile.
   Gemessen am 04.09.2026 mit der Breiten-Sonde. */
@media (max-width:900px){
  .anb-verwaltung .anb-projekt-tabelle .anb-sp-neben{display:none}
  /* NUR die Metas der gewichenen Spalten. Ohne das :not(--schmal) stand
     „Naechster Lauf …" zwischen 560 und 900 px ZWEIMAL da — einmal als
     Klartext, einmal in der Spalte, die erst bei 559 weicht (gemessen
     07.09.2026, Sonde ueber 1440/1000/900/700/560/390). */
  .anb-verwaltung .anb-zeile-meta:not([hidden]):not(.anb-zeile-meta--schmal){display:block}
  /* Auf 390 px zaehlt jeder Pixel Feldbreite: die Formularzeile spannt ohnehin
     ueber die ganze Tabelle, ihr seitliches Zellpolster kostet dort nur. */
  .anb-verwaltung .anb-form-zeile>td{padding-left:0;padding-right:0}
}
@media (max-width:559px){
  /* table-layout:fixed zwingt die Tabelle in die Kartenbreite; break-word
     bricht nur, was sonst ueberliefe — „anywhere" wuerde in die
     Spaltenberechnung eingehen und jede Spalte auf Buchstabenbreite
     schrumpfen lassen. */
  .anb-verwaltung .anb-projekt-tabelle{table-layout:fixed;width:100%}
  .anb-verwaltung .anb-projekt-tabelle .anb-sp-schmal{display:none}
  .anb-verwaltung .anb-projekt-tabelle td,
  .anb-verwaltung .anb-projekt-tabelle th{overflow-wrap:break-word}
  /* .sr-tabelle th ist global nowrap — in einer festen 28-%-Spalte schneidet
     das „Letzter Lauf" zu „Letzter La" ab, statt umzubrechen. */
  .anb-verwaltung .anb-projekt-tabelle th{white-space:normal}
  /* Das Zellpolster von 2 x 16 px frisst auf 390 px ein Drittel jeder Spalte —
     die Zustandsspalte behielte davon 48 px und bricht „verbunden" mitten im
     Wort. Mit 2 x 6 px bleiben 80 px, und das Badge passt in eine Zeile. */
  .anb-verwaltung .anb-projekt-tabelle td,
  .anb-verwaltung .anb-projekt-tabelle th{padding-left:var(--s1);padding-right:var(--s1)}
  .anb-verwaltung .anb-projekt-tabelle th:nth-child(1){width:36%}
  .anb-verwaltung .anb-projekt-tabelle th:nth-child(2){width:36%}
  .anb-verwaltung .anb-projekt-tabelle th:nth-child(4){width:28%}
  /* .sr-badge ist global nowrap — „nicht eingerichtet" laeuft in einer festen
     Spalte sonst ueber die Nachbarspalte. */
  .anb-verwaltung .anb-projekt-tabelle .sr-badge{white-space:normal;
    overflow-wrap:normal;word-break:keep-all}
  .anb-verwaltung .anb-zeile-meta--schmal:not([hidden]){display:block}
  /* Neun Chips sind auf Telefonbreite neun Zeilen. Die verbundenen
     wiederholen dort nur die Bilanz im Kartenkopf („4 von 9 verbunden") —
     stehen bleibt, was Aufmerksamkeit braucht. */
  .anb-verwaltung .anb-zchip--g{display:none}
}

/* --- Verwaltung: Kosten (alle Projekte) (/kosten) --- */
/* Gescopet auf die Wurzelklasse .kosten-seite (app/views/kosten.js render()):
   die Sektions-IDs dieser Seite (#ueberblick, #projekt, #cluster) tragen auch
   Projekt- und Clusterseiten — eine ID-Scopung faerbte dort mit. */
.kosten-seite .sr-karte{margin:0 0 var(--s4)}
.kosten-seite .section>.sr-karte:last-child,
.kosten-seite .kosten-projekt:last-child .sr-karte{margin-bottom:0}
/* EIN Zeitraum-Schalter je Ansicht (A6), oberhalb dessen, was er steuert. */
.kosten-seite .kosten-filterzeile{display:flex;flex-wrap:wrap;align-items:center;
  gap:var(--s2);margin:0 0 var(--s4)}
/* Kapitelkopf: Urteil links, A2-Link rechts — beide auf einer Grundlinie. */
.kosten-seite .kosten-kapitelkopf{display:flex;flex-wrap:wrap;align-items:baseline;
  justify-content:space-between;gap:var(--s2);margin:0 0 var(--s3)}
.kosten-seite .kosten-kapitelkopf>.urteil{margin:0;min-width:0}
/* Steuerung: Kartenkopf einzeilig (Titel, Domain, Schalter-Badge, Paket-Chip). */
.kosten-seite .kosten-kopf-marken{display:inline-flex;flex-wrap:wrap;align-items:center;
  gap:var(--s1);min-width:0}
.kosten-seite .kosten-steuerzeile{margin:0 0 var(--s2);font-size:var(--fs-small);
  line-height:1.6;color:var(--sr-mut)}
.kosten-seite .kosten-projekt>.sr-karte{margin:0 0 var(--s2)}
.kosten-seite .kosten-projekt details.explain{margin:0 0 var(--s2)}
/* Die vier Geld-Formulare liegen als Gitterkinder im .sr-anlegen-form-Raster:
   jedes Formular EINE Spalte, Label ueber dem Feld, Knopf auf der Feldkante.
   min-width:0 haelt das Label im Track, statt ihn aufzuweiten. */
.kosten-seite .kosten-formulare{gap:var(--s2) var(--s3)}
.kosten-seite .kosten-formulare>.kosten-inline-form{min-width:0;margin:0;gap:var(--s1)}
/* `white-space:nowrap` am Label (app.css, fuer die schmale Zeile im
   Verwaltungsreiter) legte hier drei Beschriftungen uebereinander: „Budget/
   Monat USD (leer = kein Limit)" ist in Versalien breiter als der 220-px-Track
   und schob sich ueber die Nachbarspalte. Im Raster darf es umbrechen. */
.kosten-seite .kosten-formulare .feld-label{white-space:normal}
.kosten-seite .kosten-formulare .feld-eingabe{width:100%}
.kosten-seite .kosten-formulare .knopf{align-self:flex-start}
@media (max-width:559px){
  .kosten-seite .kosten-formulare .knopf{width:100%;align-self:stretch}
}

/* ------------------------------------------------ Pflichtseiten (Recht) --
 * /datenschutz und /impressum (Betreiber-Liste 04.09.2026, Punkte 4-8).
 *
 * Die beiden Seiten laufen durch DIESELBE Klasse, egal ob jemand angemeldet
 * ist (App-Huelle mit Seitenleiste) oder nicht (zentrierte Karte wie bei
 * /login) — app/views/recht.js wickelt den Text in .rechtstext, damit die
 * Typografie nicht am Rahmen haengt.
 *
 * WAS HIER ANDERS IST ALS IM REST DER APP. Eine Kapitelseite ist ein
 * Arbeitsplatz: viele Zahlen, wenig Text, 13 px. Eine Pflichtseite ist zum
 * LESEN da. Fliesstext steht deshalb auf 15 px (.sr-body p setzt sonst
 * 12,5 px — der Betreiber-Befund lautete woertlich „wir sind nicht im
 * Maeusekino"), Zeilenhoehe 1,65, und die Textspalte deckelt bei 74
 * Zeichen. Die Tabellen deckeln NICHT: sie nutzen die volle Buehne.
 */
.rechtstext{font-size:15px;color:var(--sr-ink)}
.rechtstext h1{font-size:28px;line-height:1.2;margin:0 0 var(--s3)}
/* Mindestens 30 px ueber jedem Kapitel (Punkt 6). 34 px, weil die
   Grossbuchstaben-Oberlaenge der Ueberschrift optisch 3-4 px davon
   auffrisst — gemessen wird der Abstand zur Grundlinie darueber. */
.rechtstext h2{font-size:20px;line-height:1.3;font-weight:var(--fw-bold);
  color:var(--sr-ink);margin:34px 0 var(--s2);padding:0}
.rechtstext h2:first-of-type{margin-top:var(--s4)}
.rechtstext p{font-size:15px;line-height:1.65;color:var(--sr-ink);
  max-width:74ch;margin:0 0 var(--s2)}
.rechtstext p.lead{font-size:17px;line-height:1.6;color:var(--sr-mut);
  margin-bottom:var(--s4)}
.rechtstext ul{margin:0 0 var(--s3);padding-left:var(--s4);max-width:74ch}
.rechtstext li{font-size:15px;line-height:1.65;color:var(--sr-ink);margin:0 0 var(--s1)}
.rechtstext a{color:var(--sr-acc-ink);text-decoration:underline}
.rechtstext .mono{font-family:var(--mono);font-size:14px}
.rechtstext p.mono{line-height:1.7}
.rechtstext p.fuss-hinweis{margin-top:var(--s5);padding-top:var(--s3);
  border-top:1px solid var(--sr-hair);font-size:13.5px;color:var(--sr-mut)}
/* KEIN senkrechtes Scrollen in diesen Tabellen (Punkt 5). Sie stehen
   deshalb als .sr-tabelle-wrap im Markup und nicht als .tbl-wrap: die
   Werkzeugzeile (Filter/Export) und die Spaltensortierung in app.js binden
   ausschliesslich `.tbl-wrap table`, und der 64vh-Deckel haengt an
   `.tbl-wrap`. Eine Pflichtangabe filtert man nicht, man liest sie. */
.rechtstext .sr-tabelle-wrap{margin:0 0 var(--s3);border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-md);max-height:none;overflow-x:auto;overflow-y:visible}
/* Vollstaendig eigenstaendig gesetzt, nicht auf `.sr-app .sr-tabelle`
   aufgebaut: die ABGEMELDETE Fassung laeuft durch layout.zentriertePage(),
   und dort gibt es kein .sr-app. Ohne diese Regeln stuende die Tabelle der
   Pflichtseite fuer jeden, der nicht angemeldet ist, voellig ungestylt. */
.rechtstext .sr-tabelle{width:100%;border-collapse:collapse}
.rechtstext .sr-tabelle th{font-size:12px;font-weight:var(--fw-ui);text-align:left;
  letter-spacing:.06em;text-transform:uppercase;color:var(--sr-mut);
  background:var(--sr-soft);padding:12px 16px;
  border-bottom:1px solid var(--sr-hair);white-space:nowrap}
.rechtstext .sr-tabelle td{font-size:14.5px;line-height:1.55;white-space:normal;
  vertical-align:top;height:auto;padding:12px 16px;color:var(--sr-ink);
  border-bottom:1px solid var(--sr-hair)}
.rechtstext .sr-tabelle tbody tr:last-child td{border-bottom:0}
.rechtstext .sr-tabelle .mono{font-size:13.5px;white-space:nowrap}
@media (max-width:559px){
  .rechtstext h1{font-size:24px}
  .rechtstext h2{font-size:18px;margin-top:30px}
}

/* ==== Kommunikator (BETA, 06.09.2026) — Figur, Sprechblase, Gespraech =====
   Markup app/views/assistent.js figurHtml(), Verhalten app.js Baustein 14.
   Fixiert unten rechts, ueber dem Inhalt (z-index unter Modal/Scrim 50→130:
   die Figur darf ein offenes Modal nie ueberdecken). Farben nur aus Tokens. */
.km{position:fixed;right:var(--s4);bottom:var(--s4);z-index:45;display:flex;flex-direction:column;align-items:flex-end;gap:var(--s2);
  pointer-events:none}
/* ---- KOPF-ANKER (11.09.2026) ------------------------------------------
   Die Sprechblase setzt am KOPF der Figur an, nicht am Kasten. Der Kopf ist
   ein Ausschnitt INNERHALB des Bildes; wo er auf dem Schirm liegt, haengt an
   `object-fit`/`object-position` und an der Kastengroesse. Die vier Werte
   unten sind genau diese Umrechnung, je Modus einmal ausgerechnet:

     --km-figur-b   Breite des Figurkastens
     --km-kopf-y    Kopfmitte, vom oberen Rand des Kastens
     --km-spitze    Mitte der Blasenspitze ueber der Blasenunterkante

   Herkunft der Anteile (Materialsatz v14, 12.09.2026): aus dem Alphakanal
   des jeweiligen Standbilds gemessen, Werte in
   app/assets/kommunikator/material-v14.json (Feld kopf_anteile). Der Kopf
   endet dort, wo die Zeile am schmalsten wird — am Hals, nicht an der
   Schulter. v14 hat denselben Zuschnitt wie v13 und ruehrt den Alphakanal
   nicht an; die Tafel gilt fuer beide Saetze unveraendert.

     Standbild (Groesse)                       Kopf x          Kopf y
     ruhe-links-kopf (176x176)                 12,85…87,13 %   7,51…82,70 %
     ruhe-rechts-kopf (176x176)                 5,85…79,58 %   7,89…89,23 %
     ruhe-links-oberkoerper (384x384)          33,69…76,34 %   4,31…47,48 %
     ruhe-rechts-oberkoerper (384x384)         29,67…72,01 %   4,53…51,23 %
     ruhe-links-ganzkoerper (274x498)          29,86…67,00 %   2,41…23,09 %
     ruhe-rechts-ganzkoerper (274x498)         26,36…63,23 %   2,51…24,89 %

   WAAGERECHT HAENGT DIE BLASE AM KASTEN, NICHT AM KOPF (Betreiber-Befund
   12.09.2026). Bis dahin stand ihre zur Figur zeigende Kante acht Punkte
   neben der KOPFKANTE und lag damit ueber dem Figurkasten — bei der grossen
   festen Fassung 58 Punkte weit. Sie steht jetzt vollstaendig neben dem
   Kasten; senkrecht bleibt der Kopf der Anker (--km-kopf-y, --km-spitze).
   Die frueheren Kopfkanten --km-kopf-x0/--km-kopf-x1 sind damit weg: sie
   hatten keinen Leser mehr. Die Anteile aus der Tafel oben bleiben als
   Herkunftsnachweis stehen.

   Die schwebende Figur ist die Ausnahme: dort setzt kommunikator-position.js
   die Blase und waehlt die Seite nach dem Platz im Fenster, benutzt also
   beide Kanten mit beiden Bildsaetzen. Deren Werte (kommunikator-polish.css)
   sind gemittelt.

   Das Standbild ist Frame 0 der Ruheschleife und liegt deckungsgleich unter
   dem Video — die Anker gelten damit fuer beides. Waehrend der Schleife
   dreht der Kopf; wie weit er dabei vom Standbild abwandert, steht in
   material-v14.json (Feld kopf_spanne). Nachgemessen wird mit
   scripts/proben/kommunikator-anker-browser.js — die Sonde rechnet dieselbe
   Abbildung noch einmal und nennt den Abstand Blase↔Kopf in Punkten.

   --km-rand/--km-nav sind der Aussenabstand der Figur zum Fensterrand bzw.
   die Breite der Navigationsspalte links; beide gehen nur in die Breite der
   Blase ein, damit sie im Fenster bleibt. */
.km{--km-figur-b:72px;--km-kopf-y:34px;--km-spitze:30px;
  --km-rand:var(--s4);--km-nav:0px}
.km--gross{--km-figur-b:196px;--km-kopf-y:53px}
/* ---- Auftritt je Mandant (08.09.2026, Migration 086) -------------------
   Position und Groesse kamen bis dahin ausschliesslich aus diesen Regeln;
   der Mandant konnte nichts daran aendern. Sie kommen jetzt als KLASSE
   herein — nicht als style-Attribut: die Inhaltssicherheitsregel der App
   (style-src 'self' 'nonce-…') verwirft Stil-Attribute stillschweigend, die
   Figur staende dann unveraendert rechts unten und niemand saehe warum.
   `.km--rechts` wiederholt die Vorgabe ausdruecklich, damit die beiden
   Ecken symmetrisch lesbar sind statt „eine Klasse und der Rest". */
/* LINKS UNTEN HEISST NEBEN DER NAVIGATION, NICHT DARUNTER. Die Figur ist
   `position:fixed`; ein blosses `left:var(--s4)` legte sie auf breiten
   Bildschirmen hinter die Navigationsspalte — im Abnahmebild fing deren
   Gruppentitel den Klick ab, die Figur war nicht mehr bedienbar. Der
   Abstand ist deshalb Navigationsbreite plus Rand. Unterhalb von 900 px
   faehrt die Spalte aus dem Bild (sr.css), dort gilt der schmale Rand. */
.km--links{right:auto;left:calc(var(--sr-nav-w) + var(--s4));align-items:flex-start;--km-nav:var(--sr-nav-w)}
.km--rechts{right:var(--s4);left:auto;align-items:flex-end}
/* Links unten zeigt die Sprechblase nach RECHTS — sonst ragte sie aus dem
   Fenster. Spitze und Aussenabstand wandern mit. */
.km--links .km-blase::after{right:auto;left:-9px;border-right:0;border-top:0;
  border-left:1px solid var(--sr-hair);border-bottom:1px solid var(--sr-hair)}

/* Grosse Fassung: Kopf, Hals und Schulteransatz statt rundem Kopf. Kein
   Kreis — der Ausschnitt ist breiter als hoch und wuerde beschnitten. */
/* Maße der großen Figur stehen in kommunikator-polish.css: dort tragen sie
   die Schwebe-/Fest-Unterscheidung (.km--gross:not(.km--schwebend) bzw.
   .km--schwebend.km--gross), die hier fehlte — beide Regeln sind spezifischer
   UND stehen im Bündel später (app/lib/assets.js: sr-bausteine als 4., polish
   als 21. Teil). Übrig bleibt hier die Kantenrundung: die feste Figur ist seit
   dem 12.09.2026 in jeder Größe eine Scheibe, die schwebende trägt gar keine
   Fläche (polish setzt ihr border-radius:0 und nimmt ihr Hintergrund und
   Schatten). Begründung und Meßwerte stehen bei der Kreis-Regel in
   kommunikator-polish.css. */
.km--gross .km-figur{border-radius:50%}
.km--gross .km-figur-bild{border-radius:50%}
.km--gross .km-figur-puls{border-radius:50%}
.km--gross .km-panel-avatar{width:44px;height:36px;border-radius:var(--sr-r-ctl)}
/* Sie steht HINTER dem Gespraechsfenster und ragt darueber hinaus (Auftrag
   08.09.2026). Umgekehrte Stapelreihenfolge: das Fenster kommt im Markup
   nach der Figur und liegt ohne diese Regel darueber — was richtig ist,
   solange die Figur klein neben ihm sitzt, aber falsch, sobald sie hinter
   ihm stehen soll. Der negative Aussenabstand ist die Ueberlappung. */
.km--gross.km--offen{flex-direction:column}
.km--gross.km--offen .km-figur{margin-bottom:-28px;z-index:0;box-shadow:none}
.km--gross.km--offen .km-panel{z-index:1}
.km>*{pointer-events:auto}
.km-figur{position:relative;width:72px;height:72px;padding:0;border:0;border-radius:50%;cursor:pointer;
  background-color:var(--sr-surface);box-shadow:var(--sr-e-modal);transition:transform 160ms var(--ease)}
.km-figur:hover{transform:translateY(-2px) scale(1.03)}
.km-figur:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:3px}
.km-figur-bild{display:block;width:72px;height:72px;border-radius:50%;object-fit:cover}
.km-figur-puls{position:absolute;inset:-3px;border-radius:50%;border:2px solid var(--sr-acc);opacity:0;pointer-events:none}
.km--denkt .km-figur-puls{animation:km-puls 1.4s ease-out infinite}
.km-figur--nickt{animation:km-nick 620ms var(--spring)}
@keyframes km-nick{0%{transform:translateY(0)}30%{transform:translateY(5px) rotate(-3deg)}60%{transform:translateY(-3px) rotate(2deg)}100%{transform:translateY(0)}}
@keyframes km-puls{0%{opacity:.8;transform:scale(1)}100%{opacity:0;transform:scale(1.35)}}

/* Die Blase liegt ABSOLUT im Figurkasten statt im Spaltenfluss: ihre Spitze
   soll auf der Kopfmitte sitzen, und das ist ein Mass am Kopf, keins am
   Zeilenabstand. Im Fluss kam beides aus Aussenabstaenden, die bei jeder
   Groessenaenderung neu geraten werden mussten. */
.km-blase{position:absolute;margin:0;bottom:calc(100% - var(--km-kopf-y) - var(--km-spitze));
  padding:var(--s3) var(--s3) var(--s2);
  background-color:var(--sr-surface);color:var(--sr-ink);border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);
  box-shadow:var(--sr-e-modal);font-size:var(--fs-small);line-height:1.45;
  animation:km-auf 220ms var(--ease)}
/* Acht Punkte Luft zwischen Blase und Figurkante — mehr liest sich als
   losgeloeste Karte, weniger klebt am Blech. `100%` ist die Breite von `.km`;
   solange die Blase sichtbar ist, ist das die Breite der Figur (bei offenem
   Gespraech blendet `.km--offen .km-blase` sie aus). */
.km--rechts .km-blase{right:calc(100% + 8px);left:auto;
  width:min(340px,calc(100vw - 2*var(--km-rand) - var(--km-figur-b) - 8px))}
.km--links .km-blase{left:calc(100% + 8px);right:auto;
  width:min(340px,calc(100vw - 2*var(--km-rand) - var(--km-nav) - var(--km-figur-b) - 8px))}
.km-blase::after{content:"";position:absolute;right:-9px;bottom:calc(var(--km-spitze) - 8px);width:16px;height:16px;transform:rotate(45deg);
  background-color:var(--sr-surface);border-right:1px solid var(--sr-hair);border-top:1px solid var(--sr-hair)}
.km-blase[hidden]{display:none}
.km-blase-text{margin:0 0 var(--s1)}
.km-blase-fuss{display:flex;align-items:center;gap:var(--s2)}
.km-blase-link{font-weight:600;color:var(--sr-acc-ink);text-decoration:none}
.km-blase-link:hover{text-decoration:underline}
.km-blase-weiter{margin-left:auto;border:0;background:none;color:var(--sr-mut);font:inherit;font-size:var(--fs-label);cursor:pointer;padding:2px 4px}
.km-blase-weiter:hover{color:var(--sr-ink)}
.km-blase-zu{border:0;background:none;color:var(--sr-mut);cursor:pointer;width:24px;height:24px;padding:0;display:inline-flex;align-items:center;justify-content:center;border-radius:50%}
.km-blase-zu:hover{background-color:var(--sr-soft);color:var(--sr-ink)}
.km-blase-zu svg{width:14px;height:14px}
@keyframes km-auf{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}

.km-panel{width:min(400px,calc(100vw - 2*var(--s4)));max-height:min(70vh,620px);display:flex;flex-direction:column;
  background-color:var(--sr-surface);color:var(--sr-ink);border:1px solid var(--sr-hair);border-radius:var(--sr-r-modal);
  box-shadow:var(--sr-e-modal);overflow:hidden;animation:km-auf 220ms var(--ease)}
.km-panel[hidden]{display:none}
.km-panel-kopf{display:flex;align-items:center;gap:var(--s2);padding:var(--s2) var(--s3);border-bottom:1px solid var(--sr-hair);
  background-color:var(--sr-soft)}
.km-panel-avatar{width:36px;height:36px;border-radius:50%;object-fit:cover;flex-shrink:0}
.km-panel-titel{flex:1;min-width:0;display:flex;flex-wrap:wrap;align-items:center;gap:var(--s1);font-size:var(--fs-small)}
.km-panel-sub{width:100%;color:var(--sr-mut);font-size:var(--fs-label)}
.km-verlauf{flex:1;min-height:160px;overflow-y:auto;padding:var(--s3);display:flex;flex-direction:column;gap:var(--s2);
  overscroll-behavior:contain}
.km-nachricht{max-width:92%;padding:var(--s2) var(--s3);border-radius:var(--sr-r-card);font-size:var(--fs-small);line-height:1.5}
.km-nachricht p{margin:0 0 var(--s1)}
.km-nachricht p:last-child{margin-bottom:0}
.km-nachricht ul{margin:var(--s0) 0 var(--s1) 1.1em;padding:0}
.km-nachricht li{margin:2px 0}
.km-nachricht--assistent{align-self:flex-start;background-color:var(--sr-soft)}
.km-nachricht--nutzer{align-self:flex-end;background-color:var(--knopf-blau);color:var(--auf-knopf)}
.km-wartet{color:var(--sr-mut);font-style:italic}
.km-form{display:flex;gap:var(--s1);padding:var(--s2) var(--s3);border-top:1px solid var(--sr-hair);align-items:flex-end}
.km-eingabe{flex:1;min-width:0;resize:none;font:inherit;font-size:var(--fs-small);padding:var(--s1) var(--s2);
  border:1px solid var(--sr-feld-line);border-radius:var(--sr-r-ctl);background-color:var(--sr-surface);color:var(--sr-ink)}
.km-eingabe:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:1px}
.km-eingabe[disabled]{background-color:var(--sr-soft);color:var(--sr-mut)}
.km-panel-fuss{margin:0;padding:0 var(--s3) var(--s2);font-size:var(--fs-label);color:var(--sr-mut)}
.km--offen .km-blase{display:none}
@media (max-width:559px){
  .km{right:var(--s2);bottom:var(--s2);--km-rand:var(--s2)}
  .km--links{right:auto;left:var(--s2);--km-nav:0px}
  .km--rechts{right:var(--s2);left:auto}
  .km-figur,.km-figur-bild{width:56px;height:56px}
  /* Schmales Fenster: die Figur ist kleiner (kommunikator-polish.css), also
     sitzt auch der Kopf woanders. Die Werte hier sind nicht aus der
     Bildgroesse gerechnet, sondern aus der Messung der Sonde uebernommen —
     die Kastengroesse kommt auf schmalen Fenstern aus zwei Regelsaetzen, und
     die Rechnung traf um bis zu zehn Punkte daneben. Die Blase selbst bleibt
     hier ohnehin aus (app.js istMobil()); die Werte halten sie trotzdem im
     Bild, falls sie jemand von Hand aufklappt. */
  .km{--km-figur-b:44px;--km-kopf-y:26px}
  .km--gross{--km-figur-b:132px;--km-kopf-y:36px}
  .km-panel{width:calc(100vw - 2*var(--s2));max-height:75vh}
  .km--gross.km--offen .km-figur{margin-bottom:-18px}
}
@media print{.km{display:none}}
@media (prefers-reduced-motion:reduce){.km-figur,.km-blase,.km-panel{animation:none;transition:none}.km--denkt .km-figur-puls{animation:none;opacity:.6}}


/* ==== OPTIONSFENSTER AM ZAHNRAD (Betreiber-Auftrag 12.09.2026) ============
   Markup app/views/assistent.js optionenHtml(), Verhalten
   app/views/kommunikator-optionen.js.

   ES DUNKELT NICHTS AB, und das ist der Punkt: wer den Auftritt der Figur
   einstellt, muss die Figur dabei sehen. Das Fenster steht mittig im
   Sichtbereich und weicht zur Seite, sobald es die Figur oder ihr
   Gespraechsfenster treffen wuerde — das rechnet der Client, weil beide
   Kaesten erst zur Laufzeit feststehen.

   Es haengt IM `.km`-Kasten und ist `position:fixed`: `.km` liegt als Popover
   in der obersten Ebene des Browsers, ein Geschwister-Element davon laege
   darunter. Als Kind steht es in derselben Ebene und trotzdem unabhaengig von
   der Lage der Figur. */
.km-optionen{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);
  z-index:3;width:min(420px,calc(100vw - 2*var(--s3)));max-height:min(84vh,720px);
  display:flex;flex-direction:column;
  background-color:var(--sr-surface);color:var(--sr-ink);
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-modal);
  box-shadow:var(--sr-e-modal);overflow:hidden;animation:km-auf 220ms var(--ease)}
.km-optionen[hidden]{display:none}
.km-optionen-kopf{display:flex;align-items:center;gap:var(--s2);flex-shrink:0;
  padding:var(--s2) var(--s3);border-bottom:1px solid var(--sr-hair);background-color:var(--sr-soft)}
.km-optionen-kopf h2{flex:1;min-width:0;margin:0;font-size:var(--fs-ui);font-weight:var(--fw-ui)}
.km-optionen-koerper{flex:1;min-height:0;overflow-y:auto;padding:var(--s3);
  display:flex;flex-direction:column;gap:var(--s3);overscroll-behavior:contain}
.km-optionen-abschnitt{display:flex;flex-direction:column;gap:var(--s2)}
.km-optionen-abschnitt h3{margin:0;font-size:var(--fs-label);font-weight:var(--fw-ui);
  letter-spacing:.08em;text-transform:uppercase;color:var(--sr-acc-ink)}
.km-optionen-zeile{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap}
.km-optionen-label{flex:1 1 96px;min-width:0;font-size:var(--fs-small)}
.km-optionen-hinweis{margin:0;color:var(--sr-mut);font-size:var(--fs-small)}
.km-optionen-fuss{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap;flex-shrink:0;
  padding:var(--s2) var(--s3);border-top:1px solid var(--sr-hair);background-color:var(--sr-soft)}
.km-optionen-link{margin-left:auto;font-size:var(--fs-label);font-weight:600;color:var(--sr-acc-ink);text-decoration:none}
.km-optionen-link:hover{text-decoration:underline}
/* Knopfband wie der Groessenschalter im Fensterkopf — dieselbe Bedienung,
   dieselbe Optik, damit nicht zwei Sorten Auswahl nebeneinander stehen.
   Gefuellte Knoepfe tragen --knopf-blau mit --auf-knopf. */
.km-wahl{display:inline-flex;align-items:center;gap:2px;padding:2px;
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-pill);background-color:var(--sr-surface)}
.km-wahl button{min-height:28px;padding:3px 10px;border:0;border-radius:var(--sr-r-pill);
  background:transparent;color:var(--sr-mut);font:inherit;font-size:12px;font-weight:var(--fw-ui);cursor:pointer}
.km-wahl button:hover{color:var(--sr-ink);background-color:var(--sr-soft)}
.km-wahl button[aria-pressed="true"]{color:var(--auf-knopf);background-color:var(--knopf-blau)}
.km-wahl button:focus-visible{outline:2px solid var(--focus-ton);outline-offset:1px}
.km-schalter{display:inline-flex;align-items:center;gap:var(--s1);min-height:28px;padding:2px 10px 2px 3px;
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-pill);background-color:var(--sr-surface);
  color:var(--sr-mut);font:inherit;font-size:12px;font-weight:var(--fw-ui);cursor:pointer}
.km-schalter-knauf{width:20px;height:20px;border-radius:50%;flex:none;background-color:var(--sr-hair);
  transition:background-color var(--t-med) var(--ease)}
.km-schalter[aria-checked="true"]{color:var(--auf-knopf);background-color:var(--knopf-blau);border-color:var(--knopf-blau)}
.km-schalter[aria-checked="true"] .km-schalter-knauf{background-color:var(--auf-knopf)}
.km-schalter:focus-visible{outline:2px solid var(--focus-ton);outline-offset:1px}
.km-gesten{display:flex;flex-direction:column;gap:var(--s1)}
.km-gesten-zeile{display:flex;align-items:center;gap:var(--s2);padding:var(--s1) 0;
  border-bottom:1px solid var(--sr-hair)}
.km-gesten-zeile:last-child{border-bottom:0}
.km-gesten-ab{width:30px;height:30px;flex:none;padding:7px;border:1px solid var(--sr-hair);border-radius:50%;
  background-color:var(--sr-surface);color:var(--sr-ink);cursor:pointer;display:inline-flex;align-items:center;justify-content:center}
.km-gesten-ab svg{width:14px;height:14px;display:block}
.km-gesten-ab:hover{border-color:var(--sr-acc-line);color:var(--sr-acc-ink)}
.km-gesten-ab:focus-visible{outline:2px solid var(--focus-ton);outline-offset:2px}
.km-gesten-name{flex:1;min-width:0;display:flex;flex-direction:column;font-size:var(--fs-small)}
.km-gesten-name small{color:var(--sr-mut);font-size:var(--fs-label);line-height:1.35}
@media (max-width:559px){
  .km-optionen{width:calc(100vw - 2*var(--s2));max-height:86dvh}
}

/* Karte „Das Wichtigste" — KI-Einschaetzung unter den Befund-Kacheln */
.km-analyse{margin-top:var(--s4);padding-top:var(--s3);border-top:1px solid var(--sr-hair)}
.km-analyse-kopf{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap;margin-bottom:var(--s2)}
.km-analyse-titel{font-weight:600}
.km-analyse-meta{margin-left:auto;color:var(--sr-mut);font-size:var(--fs-label)}
.km-analyse-text ul{margin:0 0 var(--s2) 1.1em;padding:0}
.km-analyse-text li{margin:var(--s0) 0;line-height:1.45}
.km-analyse-text p{margin:0 0 var(--s1)}
.km-analyse-form{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap;margin-top:var(--s2)}
.km-analyse-kosten{color:var(--sr-mut);font-size:var(--fs-label)}
.km-analyse-hinweis{margin:0 0 var(--s2);color:var(--sr-mut);font-size:var(--fs-small)}
.sr-thema-link--still{color:var(--sr-mut)}
.sr-thema--chance{border-left:3px solid var(--sr-ok)}

/* ---------------------------------------- Diagrammtyp im Chart-Zahnrad --
 * Auftrag Daniel 06.09.2026, Punkt 7: „eine Auswahl in den Charts, mit der
 * man Linechart, Areachart, Balkenchart, gestapelte Balken, vertikale und
 * horizontale Balken einstellen kann". Die Gruppe selbst nutzt die
 * bestehende Baustein-Optik (.chart-konfig-gruppe/-titel/-eintrag,
 * app.css) — hier nur der DEAKTIVIERTE Zustand bei Engine „klassisch"
 * (app/views/charts.js konfigStandSetzen()): das Server-SVG kennt keinen
 * Diagrammtyp und zeichnet immer die Grundform (Kopfkommentar
 * app/lib/charts.js). Die Gruppe bleibt SICHTBAR, damit eine eigene Wahl
 * beim kurzen Wechsel auf „klassisch" nicht aus dem Menue verschwindet —
 * nur bedienbar ist sie in dem Zustand nicht. */
.chart-konfig-gruppe--deaktiviert{opacity:.45}
.chart-konfig-gruppe--deaktiviert .chart-konfig-eintrag{cursor:not-allowed}
.sr-thema--warnung{border-left:3px solid var(--sr-warn)}

/* ══ Flussbild (Verwaltung → Abläufe) ═════════════════════════════════════
   Quelle → Lauf → Speicher → Kapitel als ein server-gerendertes SVG
   (app/lib/flussbild.js). Vorbild: das Architektur-Diagramm in Cortex →
   Wissen → Funktionsweise; die Unterschiede stehen im Kopf jener Datei.

   ZAHLEN HIER SIND GESTALT, keine Messwerte: Strichstärken, Dash-Muster,
   Laufzeiten der Bewegung.

   DIE BEWEGUNG HAT EINEN ZWECK, sie ist keine Zierde: die Strichlinie wandert
   in Flussrichtung und beantwortet damit die Frage, die ein statisches
   Diagramm offenlässt — wohin fließt das eigentlich. Deshalb läuft sie im
   Ruhezustand langsam und leise und wird erst beim Hervorheben schnell. */
.fl-huelle{position:relative}
.fl-svg{width:100%;height:auto;display:block;overflow:visible}
.fl-spalte{fill:var(--sr-mut);font:600 11px var(--font);letter-spacing:.08em;text-transform:uppercase}

/* ---- Knoten */
.fl-knoten rect{fill:var(--sr-surface);stroke:var(--sr-hair);stroke-width:1.5;
  transition:filter 180ms var(--ease),opacity 180ms var(--ease)}
.fl-knoten{cursor:pointer}
.fl-t{fill:var(--sr-ink);font:600 12.5px var(--font)}
.fl-s{fill:var(--sr-mut);font:10.5px var(--font)}
.fl-knoten text{pointer-events:none}
.fl-knoten:focus{outline:none}
.fl-knoten:focus-visible rect{stroke:var(--sr-acc-line);stroke-width:2.5}

/* Quellen: fremder Dienst, selbst erhoben, kein Zufluss — unterscheidbar an
   der Kante, nicht nur am Untertitel. */
.fl-quelle--extern rect{stroke:var(--sr-acc-line)}
.fl-quelle--eigen rect{stroke:var(--sr-hair);fill:var(--sr-soft)}
.fl-quelle--system rect{stroke-dasharray:4 3}
/* Kostenpflichtig: das € steht im Titel (Veto 2 — nie Farbe allein), die
   Kante setzt nur nach. */
.fl-kosten rect{stroke:var(--amber)}

/* Läufe: Ergebnis des letzten Laufs. Das WORT steht im Kasten, die Farbe ist
   die Zugabe — wer nicht farbsehen kann, liest „gescheitert (rc 3)". */
.fl-lauf--gut rect{stroke:var(--green)}
.fl-lauf--lau rect{stroke:var(--amber)}
.fl-lauf--schlecht rect{stroke:var(--red);fill:var(--red-dim)}
.fl-lauf--offen rect{stroke:var(--amber);stroke-dasharray:5 3}
.fl-lauf--leer rect{stroke:var(--sr-hair);stroke-dasharray:3 4}
.fl-speicher rect{fill:var(--sr-soft)}
.fl-kapitel rect{fill:var(--sr-surface);stroke:var(--sr-acc-line)}

/* ---- Kanten: eine ruhige Grundlinie und ein Komet darauf */
/* Die Grundlinie war anfangs --sr-hair bei .55 — im Abnahmebild waren die
   Kanten so blass, dass vier Spalten mit Linien dazwischen wie vier Listen
   nebeneinander aussahen. Sie ist jetzt so kräftig, dass man einen Weg auch
   OHNE ihn anzuklicken mit dem Auge verfolgen kann; das ist der Unterschied
   zwischen einem Fluss und einer Aufzählung. */
.fl-linie{fill:none;stroke:var(--sr-mut);stroke-width:1.6;opacity:.42}
.fl-kante--gut .fl-linie{stroke:var(--green)}
.fl-kante--schlecht .fl-linie{stroke:var(--red)}
.fl-kante--lau .fl-linie,.fl-kante--offen .fl-linie{stroke:var(--amber)}
.fl-komet{fill:none;stroke:var(--sr-acc-knopf);stroke-width:2.5;stroke-linecap:round;
  stroke-dasharray:26 1200;opacity:.5;animation:fl-komet 4.2s linear infinite}
@keyframes fl-komet{to{stroke-dashoffset:-1226}}
.fl-kante,.fl-knoten{transition:opacity 180ms var(--ease)}

/* ---- Hervorheben: ein Weg leuchtet, der Rest tritt zurück.
   .fl-dunkel steht am <svg>, sobald irgendwo etwas aktiv ist — ohne diesen
   Schalter müsste jede Regel den Aktivzustand doppelt prüfen. */
.fl-svg.fl-dunkel .fl-kante,.fl-svg.fl-dunkel .fl-knoten{opacity:.16}
.fl-svg.fl-dunkel .fl-kante.fl-hell,.fl-svg.fl-dunkel .fl-knoten.fl-hell{opacity:1}
.fl-kante.fl-hell .fl-linie{stroke-width:2.5;opacity:1}
.fl-kante.fl-hell .fl-komet{animation-duration:1.6s;opacity:1;stroke-width:3}
.fl-knoten.fl-hell rect{filter:drop-shadow(0 0 6px var(--sr-acc-line))}
.fl-knoten.fl-hell .fl-t{fill:var(--sr-acc-ink)}

/* ---- Bewegung ist ein Angebot, keine Bedingung.
   Das Vorbild in Cortex animiert auch dann weiter, wenn das Betriebssystem
   ausdrücklich um Ruhe bittet. Hier steht sie still — das Bild bleibt
   vollständig lesbar, es bewegt sich nur nichts mehr. */
@media (prefers-reduced-motion:reduce){
  .fl-komet{animation:none;opacity:.35}
  .fl-kante,.fl-knoten,.fl-knoten rect{transition:none}
}

/* ---- Schmale Schirme: das Bild wird waagerecht schiebbar statt gestaucht.
   Bei 1000 px Zeichenbreite und vier Spalten ist Stauchen keine Option —
   die Kastentexte wären unter 6 px. */
@media (max-width:900px){
  .fl-huelle{overflow-x:auto;overscroll-behavior-x:contain}
  .fl-huelle .fl-svg{min-width:900px}
}
.fl-schiebe-hinweis{margin:var(--s1) 0 0;font-size:var(--fs-label);color:var(--sr-mut)}
@media (min-width:901px){.fl-schiebe-hinweis{display:none}}

/* ============================================================== ZEITBAND ====
   app/lib/zeitband.js — die Nacht von 00:00 bis 09:00, sechs Spuren, jeder
   Lauf ein Balken. Formensprache und Farbtoken sind dieselben wie beim
   Flussbild darunter; beide sind ein Bild, nicht zwei.

   ZAHLEN HIER SIND GESTALT: Strichstärken, Deckkraft, Dash-Muster. Die
   Geometrie (Spurhöhen, Balkenbreiten) rechnet der Server, weil sie aus
   gemessenen Dauern kommt.

   WARUM SO VIELE FORMEN FÜR SO WENIG FARBE: ein Balken ist bei neun Stunden
   auf tausend Punkten oft neun Pixel breit — ein Wort passt nicht hinein.
   Damit die Aussage trotzdem nicht allein an der Farbe hängt (Veto 2),
   trennen sich die Zustaende zusaetzlich in der Form: gefuellt, gestrichelt,
   blass, mit Ausrufezeichen. */
.zb-svg{overflow:visible}
.zb-stunde{fill:var(--sr-mut);font:600 10.5px var(--font);text-anchor:middle;letter-spacing:.04em}
.zb-spurname{fill:var(--sr-ink);font:600 11.5px var(--font);text-anchor:end}
.zb-raster{stroke:var(--sr-hair);stroke-width:1;opacity:.55}
.zb-spurlinie{stroke:var(--sr-hair);stroke-width:1;opacity:.32}

/* ---- Balken. Grundform erst, Zustand danach. */
.zb-balken{cursor:pointer}
.zb-balken rect{fill:var(--sr-soft);stroke:var(--sr-hair);stroke-width:1;
  transition:filter 180ms var(--ease),opacity 180ms var(--ease)}
.zb-balken text{pointer-events:none}
.zb-balken:focus{outline:none}
.zb-balken:focus-visible rect{stroke:var(--sr-acc-line);stroke-width:2.5}
.zb-b-text{fill:var(--sr-ink);font:600 11px var(--font)}
.zb-b-marke{fill:var(--red);font:700 12px var(--font);text-anchor:middle}

/* Ein protokollierter Lauf ist gefuellt — er hat stattgefunden, und das soll
   man ohne Nachdenken sehen. Der Ton sagt, wie er ausging. */
.zb-balken--gelaufen rect{stroke-width:1.5}
.zb-ton--gut rect{fill:color-mix(in oklab,var(--green) 26%,var(--sr-surface));stroke:var(--green)}
.zb-ton--lau rect{fill:color-mix(in oklab,var(--amber) 26%,var(--sr-surface));stroke:var(--amber)}
.zb-ton--schlecht rect{fill:color-mix(in oklab,var(--red) 30%,var(--sr-surface));stroke:var(--red);stroke-width:2}
/* BEFUND DER SONDE 07.09.2026: dieser Ton fehlte. Ein Lauf ohne geschriebenes
   Ende trug damit die Grundfarben (--sr-soft auf --sr-hair) und sah aus wie
   ein Balken ohne Zustand — die auffaelligste Aussage des Bildes, unsichtbar.
   Die gestrichelte Kante allein war zu leise. */
.zb-ton--offen rect{fill:color-mix(in oklab,var(--amber) 18%,var(--sr-surface));stroke:var(--amber)}

/* Ohne Ende geschrieben: gestrichelt und atmend. Das ist der einzige Zustand,
   der sich von selbst noch aendern kann — deshalb bewegt er sich. */
.zb-balken--offen rect{stroke-dasharray:5 3;stroke-width:2;
  animation:zb-atmen 2.4s ease-in-out infinite}
@keyframes zb-atmen{0%,100%{opacity:1}50%{opacity:.52}}

/* Faellig gewesen, keine Zeile geschrieben — der einzige Zustand, der eine
   Nachfrage verdient. Er traegt zusaetzlich ein „!". */
.zb-balken--ausgefallen rect{fill:var(--red-dim);stroke:var(--red);stroke-width:2}

/* Faellig, aber ohne Vorwurf: vor dem Beginn des Protokolls, oder noch nicht
   dran. Blass und gestrichelt — sichtbar, aber ohne Alarm.
   Im ersten Abnahmebild waren sie bei .6 Deckkraft und 1,2 px so leise, dass
   das Band an einem Tag ohne Protokoll leer AUSSAH, obwohl es 22 faellige
   Laeufe zeigte — leiser als der Rest, aber nicht unsichtbar ist das Ziel. */
.zb-balken--vorher rect,.zb-balken--kommt rect{
  fill:none;stroke:var(--sr-mut);stroke-width:1.5;stroke-dasharray:3 2.5;opacity:.8}

/* ---- Jetzt und der naechste faellige Lauf */
.zb-jetzt line{stroke:var(--sr-acc-knopf);stroke-width:1.8}
.zb-jetzt text{fill:var(--sr-acc-ink);font:600 10.5px var(--font);text-anchor:middle}
.zb-kommt line{stroke:var(--sr-mut);stroke-width:1.4;stroke-dasharray:4 4;opacity:.7}

/* ---- Hervorheben: dieselben Schalter wie im Flussbild, damit ein Klick auf
   einen Balken den Weg unten mitleuchten laesst. */
.fl-svg.fl-dunkel .zb-balken{opacity:.16}
.fl-svg.fl-dunkel .zb-balken.fl-hell{opacity:1}
.zb-balken.fl-hell rect{filter:drop-shadow(0 0 6px var(--sr-acc-line))}

@media (prefers-reduced-motion:reduce){
  .zb-balken--offen rect{animation:none}
  .zb-balken rect{transition:none}
}
@media (max-width:900px){.fl-huelle .zb-svg{min-width:900px}}

/* ---- Legende und Hinweise unter den beiden Bildern.
   BEFUND 07.09.2026: `.sr-legende` stand seit dem Einbau des Flussbilds im
   Markup, hatte aber in keinem der fuenf Stylesheets eine Regel — die Liste
   lief auf Browser-Standard mit Aufzaehlungspunkten und falschem Einzug. */
.sr-legende{list-style:none;margin:var(--s2) 0 0;padding:0;
  display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:var(--s1) var(--s2)}
.sr-legende li{font-size:var(--fs-label);color:var(--sr-mut);line-height:1.5}
.sr-legende strong{color:var(--sr-ink);font-weight:600}
.sr-hinweise{list-style:none;margin:var(--s2) 0 0;padding:0;display:grid;gap:var(--s1)}
.sr-hinweise li{font-size:var(--fs-label);color:var(--sr-mut);line-height:1.55;
  padding-left:var(--s2);border-left:2px solid var(--sr-hair)}
.sr-hinweise strong{color:var(--sr-ink)}

/* ========================================= QUICK WINS AUF DER ÜBERSICHT ====
   Betreiber-Ansage 07.09.2026: die Quick Wins gehören zurück auf die erste
   Seite — aber nicht als drei Kacheln mit waagerecht rollenden Tabellen und
   acht Zeilen, so wie sie dort bis zum 06.09. standen. Viel Fläche, wenig
   Aussage; genau das war der Vorwurf.

   Jetzt ZWEI Kacheln im Verhältnis 33/66: links die drei Kategorien mit Zahl,
   Satz und einem konkreten Beispiel, rechts zwei Bilder. Die vollständigen
   Tabellen bleiben im Reiter „Quick Wins" — die Übersicht bewegt zum
   Hinsehen, sie ist kein Nachschlagewerk. */
.qw-gitter{display:grid;grid-template-columns:1fr 2fr;gap:var(--sr-gap);align-items:start}
.qw-gitter>*{min-width:0}          /* sonst sprengt ein breites SVG die Spalte */

/* ---- Rechts: zwei Bilder untereinander.
   KEIN SVG. `.chart` aus app.css traegt min-width:460px und rollt darunter
   waagerecht — und ein Bild, das man schieben muss, war der ausdrueckliche
   Kritikpunkt an der alten Fassung. Diese Balken sind HTML (ui.srBalken):
   keine Mindestbreite, keine Rollbalken, bei 390 px so lesbar wie bei 1600. */
.qw-charts{display:grid;gap:var(--s4)}
.qw-chart{min-width:0}
.sr-body .qw-chart h4{margin:0 0 var(--s1);font:600 var(--fs-label)/1.3 var(--font);
  color:var(--sr-mut);letter-spacing:.04em;text-transform:uppercase}
/* Die Regeln fuer `.qw-balken*` sind am 12.09.2026 entfallen: die beiden
   Balkenlisten von „Wo das Potenzial liegt" sind Ring und Bogen gewichen
   (app/views/keyword-figuren.js), und danach erzeugte kein Aufrufer im
   Haus mehr dieses Markup — geprueft ueber app/, scripts/, docs/ und
   collector/. */

/* ---- Schmale Schirme: untereinander statt gestaucht. Bei 33 % von 390 px
   wäre die linke Spalte 130 px breit — dort steht kein Keyword mehr. */
@media (max-width:1100px){
  .qw-gitter{grid-template-columns:1fr}
}

/* ---- „Eigene Keywords": Klicks aus der Search Console (08.09.2026).
   DREI ZUSTÄNDE, DIE MAN SEHEN MUSS: eine Zahl (bringt Besucher), eine Null
   (gesehen, nicht geklickt — ein Befund) und ein Strich (in der Search
   Console gar nicht aufgetaucht). Die Null trägt deshalb den Warnton, der
   Strich bleibt stumm: die eine Aussage verlangt ein besseres Snippet, die
   andere überhaupt erst Inhalte. Sähen beide gleich aus, wäre die Spalte
   irreführend statt informativ. */
.ek-gsc-null{color:var(--sr-warn-ink,var(--amber));font-weight:600}
/* Die Impressionen stehen kleiner daneben — sie ordnen die Klickzahl ein,
   ohne eine eigene Spalte zu verlangen. */
.ek-gsc-impr{color:var(--sr-mut);font-weight:400;font-size:.92em}

/* ---- Filter nach Priorität und Suchabsicht (Betreiber-Ansage 08.09.2026).
   Eine eigene Reihe je Facette MIT Beschriftung: stünde „hoch" ohne Wort
   neben „Fachthemen und Technologie", wüsste niemand, wonach dort gefiltert
   wird. Die Chips selbst sind dieselben `.kw-wahl-chip` wie die Cluster —
   damit gilt für sie das vorhandene Klickverhalten unverändert. */
.kw-wahl-facette{display:flex;align-items:center;flex-wrap:wrap;gap:var(--s1);margin-top:var(--s2)}
.kw-wahl-facette-titel{font-size:var(--fs-label);color:var(--sr-mut);font-weight:600;
  margin-right:var(--s1);white-space:nowrap}

/* ==========================================================================
   Verwaltung → Abläufe: Lauf-Tabelle und Drilldown (Ebene 2 und 3 des
   Konzepts „Prozess- und Datenfluss-Übersicht", 04.09.2026).

   VORHER GAB ES HIER NICHTS. Die Klassen `abl-*` standen seit dem Bau der
   Seite im Markup, hatten aber keine einzige Regel — gemessen 08.09.2026 mit
   `grep -rn "\.abl-"` über alle fünf Stylesheets: null Treffer. Die Zeilen
   sahen damit so aus, wie der Browser eine <dl> eben setzt.
   ========================================================================== */

/* ---- Die Zeile: Name gross, Takt klein darunter. Der Takt gehört unter den
   Namen und nicht in eine eigene Spalte — er ist eine Eigenschaft des Laufs,
   keine Messung, und eine eigene Spalte hätte ihn zu einer gemacht. */
.sr-body .abl-name{font-weight:600}
.sr-body .abl-takt{display:block;font-size:var(--fs-label);color:var(--sr-mut);
  line-height:1.4;margin-top:1px}

/* Das €-Zeichen markiert die drei Läufe, die Geld ausgeben. Es steht am Namen
   und nicht in der Legende: wer die Tabelle überfliegt, soll ohne Nachschlagen
   sehen, welche Zeile beim Anstoßen von Hand teuer wird. */
.sr-body .abl-euro{color:var(--amber);font-weight:700;cursor:help}

/* ---- Drilldown */
.sr-body .abl-detail{padding:var(--s2) 0}
.sr-body .abl-satz{margin:0 0 var(--s2);max-width:68ch;line-height:1.55}

.sr-body .abl-dl{display:grid;grid-template-columns:minmax(9rem,auto) 1fr;
  gap:var(--s1) var(--s3);margin:0;align-items:baseline}
.sr-body .abl-dl dt{font-size:var(--fs-label);color:var(--sr-mut);font-weight:600}
.sr-body .abl-dl dd{margin:0;min-width:0;overflow-wrap:anywhere}

/* Schmale Schirme: die zweispaltige Definitionsliste wird bei 390 px zu einer
   9-rem-Spalte neben 4 rem Text. Untereinander ist dort das Einzige, was
   lesbar bleibt. */
@media (max-width:640px){
  .sr-body .abl-dl{grid-template-columns:1fr;gap:2px var(--s2)}
  .sr-body .abl-dl dd{margin-bottom:var(--s2)}
}

.sr-body .abl-kap{display:inline-block;font-size:var(--fs-label);
  padding:1px 6px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-xs);
  color:var(--sr-mut);white-space:nowrap}

.sr-body .abl-befunde{margin:var(--s1) 0 0;padding-left:1.1rem}
.sr-body .abl-befunde li{margin:2px 0;line-height:1.5}

/* ---- Der Verlässlichkeits-Streifen: die letzten 30 Läufe.
   HÖHE IST DAUER, FARBE IST ERGEBNIS. Die Kästchen sitzen auf einer
   gemeinsamen Grundlinie (align-items:flex-end), weil sonst die Höhe nichts
   aussagt — ein zentriertes Kästchen wächst in zwei Richtungen und lässt sich
   nicht mehr mit dem Nachbarn vergleichen. */
.sr-body .abl-verlauf{margin:0 0 var(--s3)}
.sr-body .abl-verlauf h4{margin:0 0 var(--s1);font-size:var(--fs-label);
  color:var(--sr-mut);font-weight:600;text-transform:none;letter-spacing:0}

.sr-body .abl-streifen{padding:0 0 2px;border-bottom:1px solid var(--sr-hair);
  line-height:0}
.sr-body .abl-streifen-svg{display:block;max-width:100%;height:auto}

/* Die vier Toene von ergebnisTon() — dieselben Farben wie im Flussbild, damit
   ein gruenes Kaestchen hier und ein gruener Kasten dort dasselbe bedeuten.
   `fill` statt `background`: die Kaestchen sind <rect> und keine <span> —
   siehe den Kopf von streifen() in app/views/ablaeufe.js, die Hoehe muss eine
   Geometrie-Angabe sein, weil die CSP Stil-Attribute verwirft. */
.sr-body .abl-kaestchen{fill:var(--sr-hair)}
.sr-body .abl-kaestchen--gut{fill:var(--green)}
.sr-body .abl-kaestchen--lau{fill:var(--amber)}
.sr-body .abl-kaestchen--schlecht{fill:var(--red)}
/* „offen" = kein Ende geschrieben. Umrissen statt gefuellt: der Zustand ist
   kein Ergebnis, sondern das Fehlen eines Ergebnisses, und das muss man auch
   ohne Farbe erkennen (Veto 2 des Designsystems). */
.sr-body .abl-kaestchen--offen{fill:none;stroke:var(--amber);stroke-width:1.5;
  stroke-dasharray:3 2}
.sr-body .abl-kaestchen--leer{fill:var(--sr-hair)}

.sr-body .abl-streifen-fuss{margin:var(--s1) 0 0;font-size:var(--fs-label);
  color:var(--sr-mut)}

/* Der Streifen darf schmale Schirme nicht sprengen: 30 Kaestchen a 9 px plus
   Abstand sind 328 px und passen bei 390 px knapp. `max-width:100%` am SVG
   staucht ihn darunter proportional, statt die Seite waagerecht rollen zu
   lassen — dass die Kaestchen dabei schmaler werden, aendert an der Aussage
   nichts: sie steckt in der Hoehe und in der Farbe. */

/* Der Aufklapp-Winkel sitzt in app.css auf `top:18px` — ein Wert, der für eine
   EINZEILIGE erste Spalte gerechnet ist. Hier steht der Takt unter dem Namen,
   die Zelle ist damit zweizeilig, und der Winkel landete zwischen den Zeilen.
   Er wird deshalb an der Zellenmitte ausgerichtet; die Drehung bleibt bei der
   gemeinsamen Regel, sonst verlöre das Aufklappen seine Animation. */
.sr-body .abl-tabelle tr.drill>td:first-child::before{top:50%;margin-top:-4px}

/* ---- Der Frischestreifen (Element ③ des Nachtbilds).
   Ein Feld je Kapitel, quer über die Breite. Grid statt Flex, damit alle
   Felder gleich breit sind: unterschiedlich breite Felder läsen sich wie
   unterschiedlich wichtige, und das sind sie nicht. */
.sr-body .abl-frische{display:grid;grid-template-columns:repeat(5,1fr);gap:var(--s1);
  margin:var(--s2) 0 0}
.sr-body .abl-frische-feld{display:flex;flex-direction:column;gap:2px;
  padding:var(--s2);border-radius:var(--sr-r-sm);
  border:1px solid var(--sr-hair);border-top:3px solid var(--sr-hair);
  background:var(--surface-2);min-width:0}

/* Die Farbe sitzt auf der OBERKANTE, nicht auf der Fläche: zehn farbig
   gefüllte Kacheln nebeneinander erschlagen die Bilder darüber, und die
   Aussage steht ohnehin im Text darin (Veto 2 — Farbe nie allein). */
.sr-body .abl-frische-feld--gut{border-top-color:var(--green)}
.sr-body .abl-frische-feld--lau{border-top-color:var(--amber)}
.sr-body .abl-frische-feld--schlecht{border-top-color:var(--red)}
.sr-body .abl-frische-feld--leer{border-top-style:dashed}

.sr-body .abl-frische-kap{font-size:var(--fs-label);color:var(--sr-mut);
  line-height:1.35;overflow-wrap:anywhere}
.sr-body .abl-frische-alter{font-weight:600;line-height:1.3}
.sr-body .abl-frische-feld--lau .abl-frische-alter{color:var(--amber)}
.sr-body .abl-frische-feld--schlecht .abl-frische-alter{color:var(--red)}
.sr-body .abl-frische-feld--leer .abl-frische-alter{color:var(--sr-mut);font-weight:400}
.sr-body .abl-frische-quelle{font-size:var(--fs-label);color:var(--sr-mut);
  line-height:1.35;overflow-wrap:anywhere}

.sr-body .abl-frische-fuss{margin:var(--s2) 0 0;font-size:var(--fs-label);
  color:var(--sr-mut)}

/* Fünf Spalten brauchen Platz. Darunter zwei, und auf dem Telefon zwei
   schmale — zehn Felder untereinander wären eine Liste, kein Streifen. */
@media (max-width:1100px){
  .sr-body .abl-frische{grid-template-columns:repeat(3,1fr)}
}
@media (max-width:700px){
  .sr-body .abl-frische{grid-template-columns:repeat(2,1fr)}
}

/* ---- Quittierte Dauerbefunde (Abläufe → Quittierungen).
   Der Warnsatz steht ÜBER der Tabelle und nicht als Zeile darin: ein
   abgelaufener Freibrief ist keine weitere Zeile unter vielen, sondern der
   Grund, warum die Morgenmail seit gestern wieder rot ist. */
.sr-body .abl-quitt-warnung{margin:var(--s2) 0 0;padding:var(--s2) var(--s3);
  border-left:3px solid var(--amber);border-radius:0 var(--sr-r-sm) var(--sr-r-sm) 0;
  background:var(--surface-2);line-height:1.55;max-width:78ch}
.sr-body .abl-quitt-warnung strong{color:var(--sr-ink)}

/* Der Grund ist der Inhalt dieser Tabelle — er bekommt die Breite, die
   Kennungen daneben nur so viel, wie sie brauchen. */
.sr-body .abl-quitt td:nth-child(4){line-height:1.5;min-width:22ch}
.sr-body .abl-quitt td.who{white-space:nowrap}

/* ============================ WASSERFALL (Kapitel 06 → Wasserfall) ========
   Eingeführt am 08.09.2026 nach dem GTmetrix-Vorbild (Betreiber-Anweisung).

   DIE GEOMETRIE STEHT IN SVG-ATTRIBUTEN, NICHT HIER — und das ist keine
   Stilfrage: die CSP dieser App setzt `style-src 'self' 'nonce-…'` OHNE
   `unsafe-inline`, und ein Nonce erlaubt keine Stil-ATTRIBUTE. Ein Balken aus
   `<div style="width:37%">` wäre im Browser lautlos verworfen worden und der
   ganze Wasserfall zu einer Spalte gleich langer Kästen zerfallen — ohne
   Fehlermeldung, ohne Konsolen-Eintrag. Was hier steht, ist deshalb
   ausschließlich Farbe und Größe der KONSTANTEN Teile.

   EINE VARIABLE JE PHASE, ZWEI VERWENDUNGEN. Dieselbe Farbe muss als `fill`
   in ein SVG-Rechteck und als `background` in das Legenden-Quadrat. Zwei
   getrennte Regelblöcke wären zwei Orte, an denen dieselbe Farbe auseinander-
   laufen kann; die Variable ist der eine Ort.

   DIE FARBE TRÄGT NIE DIE AUSSAGE. Jedes Rechteck hat ein <title> mit
   Phasennamen und Dauer, die Legende nennt jede Phase im Wort, und die
   Marken stehen zusätzlich als Satz unter der Tabelle (WCAG 1.4.1). */

.sr-body .sr-wf-p--blockiert  {--wf:var(--text-3)}
.sr-body .sr-wf-p--dns        {--wf:var(--series-3)}
.sr-body .sr-wf-p--verbindung {--wf:var(--series-4)}
.sr-body .sr-wf-p--tls        {--wf:var(--series-7)}
.sr-body .sr-wf-p--senden     {--wf:var(--series-5)}
.sr-body .sr-wf-p--warten     {--wf:var(--series-2)}
.sr-body .sr-wf-p--empfangen  {--wf:var(--series-1)}
/* „ohne" = Antwort aus dem Cache oder abgefangene Zählung: die Anfrage fand
   statt, hatte aber keine Netzphasen. Gedämpft, damit sie nicht wie eine
   gemessene Phase aussieht. */
.sr-body .sr-wf-p--ohne       {--wf:var(--text-3)}
.sr-body .sr-wf-p--offen      {--wf:var(--red)}

.sr-body svg.sr-wf{display:block;width:100%;height:14px}
.sr-body rect.sr-wf-p{fill:var(--wf)}
.sr-body .sr-wf-p--ohne{opacity:.55}

/* Die Marken laufen über die volle Höhe und damit sichtbar ÜBER dem Balken —
   nur so lässt sich einer einzelnen Zeile ansehen, ob sie vor oder nach dem
   Onload lief. */
.sr-body line.sr-wf-marke{stroke-width:1;opacity:.5;stroke-dasharray:2 2}
.sr-body line.sr-wf-marke--paint {stroke:var(--series-6)}
.sr-body line.sr-wf-marke--dcl   {stroke:var(--series-7)}
.sr-body line.sr-wf-marke--onload{stroke:var(--red);opacity:.65;stroke-dasharray:none}

/* Die Zeitachsen-Spalte ist die Aussage der Tabelle und bekommt die Breite;
   unter 220 px wird ein Wasserfall zu einem Strich. Die Tabelle scrollt in
   ihrem eigenen .tbl-wrap, die Seite nicht. */
.sr-body td.sr-wf-zelle{min-width:220px;width:38%;padding-top:0;padding-bottom:0}

.sr-body .sr-wf-legende{display:flex;flex-wrap:wrap;gap:var(--s2) var(--s3);
  margin:var(--s3) 0 var(--s2);font-size:var(--fs-label);color:var(--sr-mut)}
.sr-body .sr-wf-lg{display:inline-flex;align-items:center;gap:var(--s1);white-space:nowrap}
.sr-body .sr-wf-lg-farbe{width:10px;height:10px;border-radius:2px;background:var(--wf);flex:0 0 auto}

.sr-body .sr-wf-marken-satz{margin:0 0 var(--s2);font-size:var(--fs-label);color:var(--sr-mut)}
.sr-body .sr-wf-marke-name{font-weight:650}
.sr-body .sr-wf-marke-name--paint {color:var(--series-6)}
.sr-body .sr-wf-marke-name--dcl   {color:var(--series-7)}
.sr-body .sr-wf-marke-name--onload{color:var(--red)}

/* Auf dem Telefon ist die Achse schmaler als der Text daneben — dort trägt
   die Spalte „Dauer" die Aussage, der Balken nur noch die Lage. */
@media (max-width:700px){
  .sr-body td.sr-wf-zelle{min-width:140px;width:auto}
}

/* --------------------------------- Werte-Tabelle unter einem Live-Chart --
 * Die zugaengliche Entsprechung der interaktiven Diagramme (Veto 7 des
 * Designsystem-Entwurfs, gebaut in app/views/charts.js am 08.09.2026).
 * Sobald eine Engine zeichnet, nimmt app.css das Server-SVG samt seinem
 * role="img" per display:none aus dem Zugaenglichkeitsbaum — ohne diesen
 * Block haette ein Live-Chart fuer eine Vorlesehilfe gar nicht existiert.
 *
 * ZUGEKLAPPT EINE ZEILE. Sie steht unter der Grafik, nicht daneben: wer die
 * Kurve liest, braucht sie nicht, und wer sie braucht, findet sie an der
 * immer gleichen Stelle. Offen ist sie ein Nachschlagewerk, keine zweite
 * Ansicht — deshalb dichte Zeilen unabhaengig von der Dichtestufe, ein
 * eigenes Scrollfenster statt einer meterlangen Seite und ein mitlaufender
 * Spaltenkopf.
 */
.sr-body .chart-werte{margin:20px 0 0;max-width:100%}
.sr-body .chart-werte[hidden]{display:none}
.sr-body .chart-werte-schalter{display:flex;align-items:center;gap:8px;width:fit-content;
  min-height:36px;padding:4px 10px;border-radius:var(--sr-r-sm);box-sizing:border-box;
  font-size:var(--fs-label);line-height:20px;color:var(--sr-mut);cursor:pointer;list-style:none}
.sr-body .chart-werte-schalter::-webkit-details-marker{display:none}
.sr-body .chart-werte-schalter::before{display:none}
.sr-body .chart-werte-pfeil{display:block;flex:none;transform-origin:center;transition:transform var(--t-fast) var(--ease)}
.sr-body .chart-werte[open] .chart-werte-pfeil{transform:rotate(90deg)}
.sr-body .chart-werte-anzahl{margin-left:8px;color:var(--sr-mut);font-size:11px}
.sr-body .chart-werte-schalter:hover{color:var(--sr-ink);background:var(--sr-soft)}
.sr-body .chart-werte[open] .chart-werte-schalter{color:var(--sr-ink)}
.sr-body .chart-werte-schalter:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px}
.sr-body .chart-werte-rahmen{max-height:360px;width:fit-content;max-width:100%;overflow:auto;margin:8px 0 0;
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-sm);background:var(--sr-surface)}
.sr-app .chart-werte-tabelle{width:auto;min-width:min(100%,360px);border-collapse:collapse}
.sr-app .chart-werte-tabelle td,.sr-app .chart-werte-tabelle th{height:auto;
  padding:10px 18px;font-size:var(--fs-label);white-space:nowrap;line-height:1.5}
.sr-app .chart-werte-tabelle tbody th{font-weight:var(--fw-body);color:var(--sr-mut);
  text-align:left;text-transform:none;letter-spacing:0;background:none}
.sr-app .chart-werte-tabelle tbody tr:nth-child(even) th{background:var(--sr-soft)}
.sr-app .chart-werte-tabelle thead th{position:sticky;top:0;z-index:1}
.sr-app .chart-konfig-eintrag[data-werte-tabelle-wahl]{display:flex;align-items:center;gap:10px}
.sr-app .chart-konfig-eintrag[data-werte-tabelle-wahl]::before{content:"";width:14px;height:14px;flex:none;border:1px solid currentColor;border-radius:3px}
.sr-app .chart-konfig-eintrag[data-werte-tabelle-wahl][aria-checked="true"]::before{background:var(--sr-acc);box-shadow:inset 0 0 0 3px var(--sr-surface)}
/* Im Druck zeigt app.css wieder das Server-SVG, und das traegt den VOLLEN
   Datensatz — die Tabelle daneben zeigt den Bildschirm-Ausschnitt. Beides
   auf einem Blatt widerspraeche genau dem, was .chart-druckhinweis sagt. */
@media print{.sr-body .chart-werte{display:none}}

/* Eine Kartenfläche pro Inhalt (Betreiberkorrektur 09.09.2026): die äußere
   Karte bleibt; Tabellen und Diagramme darin haben keine zweite Box. */
.sr-app .sr-karte :is(.tbl-wrap,.sr-tabelle-wrap,.tarif-vergleich-wrap,
  .chart-wrap,.chart-dynamisch--live,.kw-wahl){
  background:transparent;border:0;border-radius:0;box-shadow:none}
.sr-app .sr-karte>.sr-karte-koerper>table,
.sr-app .sr-karte>table{border:0;border-radius:0;box-shadow:none}
/* Auch ineinander gesetzte Inhaltskarten teilen die äußere Fläche. */
.sr-app .sr-karte .sr-karte{background:transparent;border:0;border-radius:0;box-shadow:none}
.sr-app .sr-karte>.sr-hinweis{border-radius:0}

/* ========================================================= Pegel (ui.pegel)
 *
 * Verbrauch gegen Kontingent — Leiste oder Kreis-Gauge. Das SVG traegt nur
 * Geometrie (Fuellbreite als rect-Breite, Bogen als stroke-dasharray); jede
 * Farbe und jede Beschriftung sitzt hier bzw. als HTML daneben. Grund: die
 * CSP verwirft style-Attribute stumm, und ein Wert, der als Inline-Stil
 * gedacht ist, faellt dann ohne Fehlermeldung auf 0 zurueck.
 *
 * FARBE NIE ALLEIN: die vier Toene stehen zusaetzlich als Wort in .pg-ton.
 * Wer hier eine Farbe aendert, aendert das Wort in app/views/ui.js mit.
 */
.sr-app .sr-pegel{display:flex;flex-direction:column;gap:var(--s1);
  padding:var(--s2) var(--s3);border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-md);background:var(--sr-surface);min-width:0}
.sr-app a.sr-pegel--klick{text-decoration:none;color:inherit;
  transition:border-color .14s ease,box-shadow .14s ease}
.sr-app a.sr-pegel--klick:hover{border-color:var(--sr-acc-line);box-shadow:var(--e1)}
.sr-app a.sr-pegel--klick:focus-visible{outline:2px solid var(--focus-ton);outline-offset:2px}

.sr-app .pg-kopf{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--s2);min-width:0}
.sr-app .pg-label{font-size:var(--fs-label);font-weight:600;color:var(--sr-ink);
  text-transform:uppercase;letter-spacing:.04em}
/* Das Zeitfenster gehoert an die Zahl, nicht in eine Fussnote: ein
   Monatsbudget faengt am Ersten wieder bei null an. */
.sr-app .pg-fenster{font-size:var(--fs-label);color:var(--sr-mut);white-space:nowrap}

.sr-app .pg-zahlen{display:flex;align-items:baseline;gap:var(--s1);flex-wrap:wrap}
.sr-app .pg-wert{font-size:var(--fs-h2);font-weight:700;color:var(--sr-ink);
  font-variant-numeric:tabular-nums;line-height:1.1}
.sr-app .pg-von{font-size:var(--fs-small);color:var(--sr-mut);font-variant-numeric:tabular-nums}

.sr-app .pg-leiste{display:block;width:100%;height:auto;overflow:visible}
/* FUELLUNG IST BEI DER LEISTE EINE FLAECHE, BEIM GAUGE EIN STRICH — und
   deshalb stehen die Farben ZWEIMAL, nach Form getrennt. Ungetrennt gewann
   die CSS-Regel `fill` gegen das Praesentationsattribut `fill="none"` am
   Kreis (CSS schlaegt Attribut), und aus dem Ring wurde eine volle Scheibe
   mit der Prozentzahl darauf: im Abnahmebild sofort sichtbar, im Quelltext
   nicht. */
.sr-app .pg-leiste .pg-bahn{fill:var(--sr-soft);stroke:var(--sr-hair);stroke-width:1}
.sr-app .pg-leiste .pg-bahn--offen{fill:none;stroke-dasharray:5 4}
.sr-app .pg-leiste .pg-fuell{fill:var(--sr-ok)}
.sr-app .pg-leiste .pg-fuell--gut{fill:var(--sr-ok)}
.sr-app .pg-leiste .pg-fuell--lau{fill:var(--sr-warn)}
.sr-app .pg-leiste .pg-fuell--knapp{fill:var(--sr-warn)}
.sr-app .pg-leiste .pg-fuell--ueber{fill:var(--sr-err)}
.sr-app .pg-gauge-svg .pg-bahn{fill:none;stroke:var(--sr-soft);stroke-linecap:round}
.sr-app .pg-gauge-svg .pg-fuell{fill:none;stroke:var(--sr-ok);stroke-linecap:round}
.sr-app .pg-gauge-svg .pg-fuell--gut{stroke:var(--sr-ok)}
.sr-app .pg-gauge-svg .pg-fuell--lau{stroke:var(--sr-warn)}
.sr-app .pg-gauge-svg .pg-fuell--knapp{stroke:var(--sr-warn)}
.sr-app .pg-gauge-svg .pg-fuell--ueber{stroke:var(--sr-err)}
/* 70 und 90 Prozent als feine Marken. Sie sagen VOR dem Farbwechsel, wo er
   kommt — ohne sie erschiene die Farbe als Sprung ohne Anlass.
   --sr-line statt --sr-hair: die Marke muss auf der leeren Bahn UND auf der
   Fuellung stehen; in --sr-hair war sie im Abnahmebild auf beiden
   unsichtbar. */
.sr-app .pg-marke{stroke:var(--sr-line);stroke-width:1;opacity:.55}
/* Die Kerbe am Ende ist eine AUSSPARUNG in der Kartenfarbe — siehe
   app/views/ui.js, pegelLeisteSvg. */
.sr-app .pg-ueber{fill:var(--sr-surface)}
.sr-app .pg-gauge-svg .pg-fuell--leer{stroke-linecap:butt}
/* „Fast aufgebraucht" und „wird knapp" tragen dieselbe Fuellfarbe; der
   Unterschied sitzt im Rand, im Wort und im Restwert. Ein dritter Gelbton
   waere im Dunkelmodus von keinem der beiden zu unterscheiden. */
.sr-app .sr-pegel--knapp .pg-leiste .pg-fuell{stroke:var(--sr-err);stroke-width:1}
/* BEIM GAUGE BLEIBT DIE SPUR NEUTRAL. Ein eingefaerbter Spurbogen setzte im
   Abnahmebild eine rosa Kappe an das untere Bogenende — ein Fleck, den
   niemand deuten kann. „Fast aufgebraucht" unterscheidet sich dort durch
   die Bogenlaenge und durch das Wort, und das reicht. */

.sr-app .pg-fuss{display:flex;align-items:baseline;gap:var(--s2);flex-wrap:wrap;
  font-size:var(--fs-small)}
.sr-app .pg-ton{font-weight:600}
.sr-app .pg-ton--gut{color:var(--sr-ok-ink)}
.sr-app .pg-ton--lau,.sr-app .pg-ton--knapp{color:var(--sr-warn-ink)}
.sr-app .pg-ton--ueber{color:var(--sr-err-ink)}
.sr-app .pg-ton--offen{color:var(--sr-mut)}
.sr-app .pg-rest{color:var(--sr-mut);font-variant-numeric:tabular-nums}
.sr-app .pg-prozent{margin-left:auto;color:var(--sr-mut);font-variant-numeric:tabular-nums}
.sr-app .pg-link{font-size:var(--fs-small);color:var(--link)}

/* Gauge — derselbe Baustein, runde Form. Fuer Kacheln, in denen der Pegel
   die Hauptaussage ist und nicht eine Zeile unter anderen. */
.sr-app .sr-pegel--gauge .pg-gauge{position:relative;align-self:center;
  width:116px;max-width:100%}
.sr-app .pg-gauge-svg{display:block;width:100%;height:auto}
.sr-app .pg-gauge-mitte{position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:2px;pointer-events:none;text-align:center}
.sr-app .pg-gauge-zahl{font-size:var(--fs-h2);font-weight:700;color:var(--sr-ink);
  font-variant-numeric:tabular-nums;line-height:1}
.sr-app .pg-gauge-rest{font-size:var(--fs-label);color:var(--sr-mut);
  font-variant-numeric:tabular-nums}
.sr-app .sr-pegel--gauge .pg-zahlen{justify-content:center}
.sr-app .sr-pegel--gauge .pg-fuss{justify-content:center}
.sr-app .sr-pegel--gauge .pg-prozent{margin-left:0}

/* 390 px: die Kachel steht dann allein in der Spalte und darf die volle
   Breite nehmen; die Kopfzeile bricht um, statt das Zeitfenster zu quetschen. */
@media (max-width:520px){
  .sr-app .pg-kopf{flex-wrap:wrap;gap:2px}
  /* Kein nowrap mehr: in einer schmalen Spalte schnitt „September 2026"
     sonst am Kartenrand ab (Abnahmebild 390 px). */
  .sr-app .pg-fenster{width:100%;white-space:normal}
  .sr-app .sr-pegel{padding:var(--s2)}
}

/* ------------------------------------------- Abläufe: Steuerung (Phase 4)
 *
 * Drei Formulare je Lauf-Zeile — anhalten, anstoßen, quittieren. Sie stehen
 * IM aufgeklappten Detail und nicht in der Tabellenzeile: eine achte Spalte
 * mit Knöpfen hätte die Tabelle bei 390 px in den Querlauf geschoben, und
 * die Zeile beantwortet die Frage „läuft es", nicht „was tue ich".
 */
.sr-app .abl-steuerung{margin:var(--s2) 0 var(--s3);padding:var(--s2) var(--s3);
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-md);background:var(--sr-soft)}
.sr-app .abl-steuerung>h4{margin:0 0 var(--s2);font-size:var(--fs-label);
  text-transform:uppercase;letter-spacing:.04em;color:var(--sr-mut)}
.sr-app .abl-steuer-felder{display:flex;flex-wrap:wrap;gap:var(--s3);align-items:flex-end}
.sr-app .abl-form{display:flex;flex-wrap:wrap;gap:var(--s2);align-items:flex-end;min-width:0}
.sr-app .abl-form--inline{gap:var(--s1)}
.sr-app .abl-form .feld{min-width:11rem;flex:1 1 11rem}
.sr-app .abl-form .abl-feld--breit{flex:1 1 100%}
.sr-app .abl-hinweis{margin:0;flex:1 1 100%;font-size:var(--fs-label);color:var(--sr-mut)}
.sr-app .abl-pausen{margin:0;padding-left:1.1em}
.sr-app .abl-pausen li{margin-bottom:2px}
.sr-app .abl-quitt-aktion{display:flex;flex-wrap:wrap;gap:var(--s2);align-items:flex-end}
.sr-app .abl-quitt-aktion .feld{min-width:5rem;flex:0 0 5rem}
.sr-app .abl-form--quitt{margin-top:var(--s3);padding-top:var(--s3);
  border-top:1px solid var(--sr-hair)}
/* Der Bestätigungsschritt: Pegel und Zahlen nebeneinander, ab 700 px
   untereinander — die Gauge bleibt dabei lesbar, sie skaliert mit. */
.sr-app .abl-bestaetigung{display:flex;flex-wrap:wrap;gap:var(--s3);align-items:flex-start}
.sr-app .abl-bestaetigung-pegel{flex:0 0 min(280px,100%)}
.sr-app .abl-bestaetigung .abl-dl{flex:1 1 18rem;min-width:0}
.sr-app .abl-form--bestaetigen{margin-top:var(--s3);gap:var(--s2);align-items:center}
@media (max-width:700px){
  .sr-app .abl-steuer-felder{flex-direction:column;align-items:stretch}
  .sr-app .abl-bestaetigung-pegel{flex:1 1 100%}
  /* DIE STEUERUNG BLEIBT IM BLICK, auch wenn die Tabelle waagerecht
     scrollt. Ohne `sticky` standen die Knoepfe im Abnahmebild bei 390 px
     ausserhalb des sichtbaren Ausschnitts: das Feld „Grund" war da, der
     Knopf „Anhalten" lag hinter dem rechten Rand — ein Formular, das man
     ausfuellen, aber nicht abschicken kann. */
  .sr-app .abl-steuerung{position:sticky;left:0;max-width:calc(100vw - 64px)}
  /* Feld auf volle Zeile, Knopf darunter: nebeneinander ragte „Anhalten"
     bei 390 px ueber den rechten Rand der Karte hinaus. */
  .sr-app .abl-form .feld,.sr-app .abl-quitt-aktion .feld{flex:1 1 100%}
  .sr-app .abl-form>.knopf{align-self:flex-start}
}

/* ---------------------------- Projekt → Einstellungen → Kosten: Pegelreihe */
.sr-app .pe-kosten-pegel{display:grid;gap:var(--s3);
  grid-template-columns:repeat(auto-fit,minmax(15rem,1fr));align-items:start}
/* Der KI-Block traegt bewusst keinen Pegel (Kostenrahmen des Mandanten, nicht
   dieses Projektbudget) — er leiht sich nur Kopf und Zahlenzeile, damit er in
   der Reihe nicht aus dem Raster faellt. */
.sr-app .pe-kosten-ki{display:flex;flex-direction:column;gap:var(--s1);
  padding:var(--s2) var(--s3);border:1px dashed var(--sr-hair);
  border-radius:var(--sr-r-md);background:var(--sr-surface)}
.sr-app .pe-kosten-ki-satz{margin:0;font-size:var(--fs-label);color:var(--sr-mut)}

/* ------------------ Kontingent-Kachel der Recherchewerkzeuge (projekt.js)
 * Oben rechts im Kapitelkopf, damit der Deckel im Blick ist, BEVOR jemand
 * ein Keyword scharf schaltet oder einen Wettbewerber aufnimmt. Auf
 * schmalen Geräten rutscht sie über den Inhalt und nimmt die volle Breite —
 * rechts neben nichts zu stehen ist keine Position. */
.sr-app .pk-kontingent{display:flex;flex-direction:column;align-items:flex-end;gap:2px;margin:0 0 var(--s3)}
.sr-app .pk-kontingent>.sr-pegel{width:min(24rem,100%)}
/* Messtakt und Fälligkeit unter dem Pegel: dieselbe Spaltenbreite, damit die
   Zeile am Pegel klebt und nicht als eigener Absatz gelesen wird. */
.sr-app .pk-kontingent-takt{width:min(24rem,100%);margin:0;font-size:var(--fs-small);color:var(--text-3)}
@media (max-width:760px){
  .sr-app .pk-kontingent{align-items:stretch}
  .sr-app .pk-kontingent>.sr-pegel,.sr-app .pk-kontingent-takt{width:100%}
}

/* ------------- Projekt → Einstellungen → Verantwortliche: die zwei Wege
 * Konto und Kontakt stehen NEBENEINANDER, nicht untereinander: es sind zwei
 * Antworten auf dieselbe Frage („wen nehme ich auf"), und wer sie
 * untereinander setzt, liest die zweite als Nachtrag zur ersten. Unter
 * 900 px fällt die Reihe auf eine Spalte — zwei Formulare mit je vier
 * Feldern nebeneinander sind auf dem Telefon zwei halbe Formulare. */
.sr-app .pe-v-wege{display:grid;gap:var(--s4);grid-template-columns:repeat(auto-fit,minmax(19rem,1fr));align-items:start}
.sr-app .pe-v-weg-titel{margin:0 0 var(--s1);font-size:var(--fs-label);font-weight:600;color:var(--text-2)}

/* ---------- Projekt → Einstellungen → Benachrichtigungen: Empfängerwahl
 * Die Häkchenliste steht in einer eigenen Spalte, damit Name und Rolle auf
 * einer Zeile Platz haben; ab acht Einträgen scrollt sie, statt das Formular
 * unter den Faltbereich zu schieben. */
.sr-app .pe-b-haken{display:flex;flex-direction:column;gap:var(--s1);
  max-height:16rem;overflow-y:auto}
.sr-app .pe-b-drilldown-titel{margin:var(--s3) 0 var(--s1);font-size:var(--fs-label);font-weight:600;color:var(--text-2)}
/* Die Detailzeile trägt kein Zebra: sie gehört zur Zeile darüber und darf
   nicht wie ein eigener Anlass aussehen. */
.sr-app .pe-b-detail>td{background:transparent}

/* ---- Benachrichtigungs-Matrix: der Schalter im Normalzustand ist STILL
 * Die Matrix zeigt fünf Anlässe untereinander, und ausgeschaltet ist bei
 * einem frisch angelegten Projekt der Normalfall. Der Haus-Schalter füllt
 * „aus" vollflächig rot — fünf rote Balken für den Normalzustand lesen sich
 * als fünf Störungen. Rot bleibt der Meldefarbe vorbehalten.
 *
 * AUS = Hairline, Tinte gedämpft, Knauf als leerer Ring. AN = gefüllt grün
 * wie überall sonst: eingeschaltet ist hier die Aussage, und die darf tragen.
 *
 * NUR IN DIESER TABELLE. `.sr-schalter--aus` bleibt anderswo unverändert
 * (Messbetrieb im Reiter „Allgemein", Kostenschalter) — dort steht EIN
 * Schalter, und dort ist „aus" eine Ansage.
 */
.sr-app .pe-b-matrix .sr-schalter{min-height:26px;gap:6px;padding:2px 10px 2px 2px;
  font-size:var(--fs-label);box-shadow:none}
.sr-app .pe-b-matrix .sr-schalter--aus{background:transparent;color:var(--text-2);
  border:1px solid var(--sr-hair);padding:2px 2px 2px 10px}
.sr-app .pe-b-matrix .sr-schalter-knauf{width:18px;height:18px;box-shadow:none}
.sr-app .pe-b-matrix .sr-schalter--aus .sr-schalter-knauf{background:transparent;
  border:2px solid var(--text-3)}
.sr-app .pe-b-matrix .sr-schalter:hover{transform:none}
.sr-app .pe-b-matrix .sr-schalter--aus:hover{background:var(--hover)}
.sr-app .pe-b-matrix .sr-schalter--an:hover{box-shadow:var(--knopf-schatten)}
/* `.kosten-inline-form` bringt `min-width:200px` mit (app.css) — gedacht für
   eine Zeile aus Beschriftung, Eingabefeld und Knopf. Hier steht nur ein
   Schalter darin, und die 200 px dehnten die Spalte „E-Mail" so weit, dass
   die Beta-Spalten aus dem Kartenrand liefen (1440-px-Abnahmebild). */
.sr-app .pe-b-matrix .kosten-inline-form{display:inline-flex;min-width:0;width:auto}
/* Die Kanalspalten tragen nur einen Schalter — sie brauchen keine Breite.
   Ohne diese Zeile teilt der Tabellensatz die Fläche gleichmäßig auf, und
   „E-Mail" stand so breit wie die Anlassbeschreibung daneben. */
.sr-app .pe-b-matrix th:not(:first-child),
.sr-app .pe-b-matrix td:not(:first-child){width:1%;white-space:nowrap}
.sr-app .pe-b-matrix .pe-b-detail>td{width:auto;white-space:normal}
/* Der erklärende Satz unter dem Anlassnamen bekommt eine Höchstbreite. Ohne
   sie setzt ihn der Tabellensatz auf seine natürliche Zeilenlänge — „Audit-
   Score gefallen, LCP verschlechtert, PSI eingebrochen, Funnel weggefallen."
   sind gut 500 px, und die Spalte „Empfänger" rutschte dafür aus dem
   Kartenrand (1440-px-Abnahmebild). */
.sr-app .pe-b-matrix .pe-b-anlass-sub{display:block;max-width:30rem;white-space:normal}
/* `.sr-name-zelle` setzt `white-space:nowrap` (sr.css) — gedacht für einen
   Namen, nicht für einen Satz. Deshalb steht die Rücknahme oben an der
   Zeile selbst und nicht an der Zelle: der fette Anlassname darüber soll
   weiterhin nicht umbrechen. */

/* ══════════════════════════════════════════════════════════════════════════
   KEYWORDS → ÜBERSICHT: Chart-Reihe, Kontingent-Karte, Figuren (12.09.2026)

   Alle Maße hier sind Klassen und Tokens — KEINE style-Attribute im Markup.
   Die Inhaltssicherheitsregel verwirft die stumm, und ein Balken, dessen
   Länge davon abhängt, wäre dann unsichtbar falsch. Variable Größen stehen
   deshalb als SVG-Geometrie im Markup (rect width/height, stroke-dasharray,
   polygon points), Farben und Schrift hier.
   ══════════════════════════════════════════════════════════════════════════ */

/* ---- Reihe: Verlaufs-Chart neben der Kontingent-Karte.
   Unter 1100 px untereinander — dieselbe Schwelle wie `.qw-gitter`, damit
   die Übersicht an EINER Stelle umbricht und nicht an zweien.

   DIE KONTINGENT-SPALTE IST EINE HALBE KENNZAHL-KACHEL BREIT (Betreiber-
   Ansage 12.09.2026: „heute viel zu breit"). Sie war es als `1fr` von vier
   — also eine ganze Kachel, 281 px bei 1440. Die Zahl steht deshalb nicht
   als Pixelwert hier, sondern als dieselbe Rechnung, die das Kachelraster
   darüber macht: vier Kacheln mit drei Zwischenräumen ergeben eine Kachel
   von (100 % − 3 × Abstand) ÷ 4, die Hälfte davon ÷ 8. Ändert sich der
   Abstand, wandert die Spalte mit, statt auseinanderzulaufen.

   `max()` hält eine Untergrenze: unterhalb von 118 px stünde im stehenden
   Pegel der Betrag nicht mehr neben der Säule. Unter 1100 px stapelt die
   Reihe ohnehin, dort nimmt die Karte die volle Breite — eine 134 px
   schmale Karte auf einem 390 px breiten Gerät wäre kein schmales Widget,
   sondern ein unlesbares. */
.sr-app .kwu-reihe{display:grid;
  grid-template-columns:minmax(0,1fr) max(118px,calc((100% - 3 * var(--sr-gap)) / 8));
  gap:var(--sr-gap);align-items:start;margin:0 0 var(--sr-gap)}
.sr-app .kwu-reihe>*{min-width:0}
.sr-app .kwu-reihe--allein,.sr-app .kwu-reihe--nurkontingent{grid-template-columns:1fr}
@media (max-width:1100px){
  .sr-app .kwu-reihe{grid-template-columns:1fr}
}

/* ---- Kontingent-Karte mit drei Darstellungen.
   ALLE DREI STEHEN IM MARKUP, sichtbar ist die, die das Wurzel-Attribut
   `data-kw-kontingent` benennt (gesetzt vor dem ersten Bild in layout.js,
   danach vom Schalter in keyword-quellen.js). Ohne Attribut gilt die
   Vorgabe „hochkant" — ohne JavaScript bleibt die Karte damit bedienbar
   lesbar statt leer. */
.sr-app .kwk{display:flex;flex-direction:column}
/* Kopf in der halb so breiten Karte: Titel oben, Monat darunter, das ⓘ
   rechts neben dem Titel. Als Flexzeile mit Umbruch stünde das ⓘ je nach
   Titellänge mal neben, mal unter dem Namen — ein Raster mit zwei festen
   Plätzen hält es an derselben Stelle, egal wie lang der Titel wird. Der
   Titel läuft in der schmalen Spalte auf Grundschriftgröße: die Größe der
   Kartenüberschrift (var(--fs-h2)) füllte allein zwei Zeilen. */
.sr-app .kwk-kopf{display:grid;grid-template-columns:minmax(0,1fr) auto;
  align-items:start;gap:2px var(--s1);min-height:0}
.sr-app .kwk-kopf .sr-karte-titel{grid-column:1;grid-row:1;flex:0 1 auto;
  font-size:var(--fs-ui);line-height:1.3}
.sr-app .kwk-kopf .sr-karte-meta{grid-column:1;grid-row:2;margin-left:0}
.sr-app .kwk-kopf-rechts{grid-column:2;grid-row:1;margin-left:0;
  display:inline-flex;align-items:center;gap:var(--s2)}
/* `.sr-karte-kopf .sr-erklaerung{margin-left:auto}` schoebe das ⓘ sonst aus
   der Gruppe heraus an den rechten Rand — hier steht es NEBEN dem Schalter. */
.sr-app .kwk-kopf-rechts .sr-erklaerung{margin-left:0}
.sr-app .kwk-koerper{display:flex;flex-direction:column;gap:var(--s2)}
/* ---- Der Inhalt IN der halben Kachelbreite -------------------------------
 *
 * BEI 134 px KARTE UND 12 px POLSTER BLEIBEN 110 px TEXTBREITE. Alles, was
 * für eine 281 px breite Karte gesetzt war, brach darin um: der Titel in
 * zwei Zeilen, der Monat in zwei, der Fußtext in drei, der Link in zwei, und
 * neben der Säule standen fünf Zahlenzeilen gequetscht nebeneinander.
 *
 * ZWEI MITTEL, KEIN DRITTES:
 *   1. Was gekürzt werden KANN, ist in der Ansicht gekürzt (projekt.js:
 *      „Kontingent", „Sept. 2026", „fällig 17.09.", „Kontingent ändern") und
 *      steht vollständig am title-Attribut. Hier steht dazu nur die
 *      Zusicherung, dass es EINE Zeile bleibt — mit Auslassungspunkten als
 *      letzter Sicherung, falls ein Monatsname oder ein Takt länger ausfällt.
 *   2. Was nicht gekürzt werden kann — die Zahlenreihe des Pegels —, wandert
 *      UNTER die Säule statt daneben. Dort hat jede Angabe die volle
 *      Kartenbreite und braucht keinen Umbruch.
 */
/* ZWEI SORTEN REGELN, UND SIE GELTEN VERSCHIEDEN WEIT.
 *   Die ZUSICHERUNG „eine Zeile" gilt immer: sie kostet nichts und hält den
 *   Kopf auch dann in Form, wenn ein Monatsname oder ein Takt länger
 *   ausfällt als erwartet.
 *   Das UMBAUEN der Zahlen (Säule mittig, Werte darunter) gilt nur, solange
 *   die Karte wirklich in der schmalen Spalte steht — also oberhalb von
 *   1100 px, derselben Schwelle, an der `.kwu-reihe` einspaltig wird.
 *   Unter 1100 px nimmt die Karte die volle Breite; dort sind Säule und
 *   Zahlen nebeneinander richtig, und eine 26 px schmale Säule mit
 *   zentrierten Zahlen darunter stünde in einem 358 px breiten Kasten
 *   verloren. */
.sr-app .kwk>.sr-karte-kopf .sr-karte-titel,
.sr-app .kwk>.sr-karte-kopf .sr-karte-meta,
.sr-app .kwk .pg-zahlen>*,
.sr-app .kwk .kwk-kachel .sr-kpi-label,
.sr-app .kwk .kwk-kachel-teil{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* DER MESSTAKT IST DIE EINE AUSNAHME VON „eine Zeile". „wöchentlich ·
   fällig 17.09." braucht bei Etikettgröße rund 138 px, die Karte hat 110 px
   Textbreite — kürzer geht der Satz nicht, ohne seine Aussage zu verlieren.
   Er bricht deshalb am Trennpunkt in ZWEI Zeilen, statt als „fällig 1…"
   abgeschnitten dazustehen: zwei lesbare Zeilen sind besser als eine halbe.
   Mehr als zwei werden es nicht — das prüft scripts/proben/widget-werkzeuge.js. */
.sr-app .kwk .sr-pegel--hochkant .pg-takt,
.sr-app .kwk .kwk-takt{min-width:0;white-space:normal;overflow-wrap:normal}
/* Die Meta der Kennzahl-Kachel trägt zwei eigene Zeilen (projekt.js
   `kwk-kachel-teil`) statt eines Satzes, der an beliebiger Stelle bricht. */
.sr-app .kwk .kwk-kachel .sr-kpi-meta{display:flex;flex-direction:column;gap:0;
  white-space:normal}
/* Der Inhalt liegt ueber der Klickflaeche, damit Text markierbar bleibt und
   die Zahlen nicht unter ihr verschwinden; bedienbar ist darin nichts, also
   faengt die Flaeche den Klick trotzdem. */
.sr-app .kwk>.sr-karte-koerper{position:relative;z-index:1;pointer-events:none}

@media (min-width:1101px){
  .sr-app .kwu-reihe>.kwk{align-self:stretch}
  .sr-app .kwu-reihe>.kwk>.kwk-koerper{flex:1;min-height:0}
  .sr-app .kwu-reihe>.kwk .kwk-modus--hochkant{height:100%;flex:1}
  .sr-app .kwu-reihe>.kwk .sr-pegel--hochkant{height:100%;display:flex;flex-direction:column}
  .sr-app .kwu-reihe>.kwk .pg-hochkant-koerper{flex:1;min-height:0}
  .sr-app .kwu-reihe>.kwk .pg-hochkant-svg{flex:1 1 0;min-height:140px;height:0}
  .sr-app .kwk>.sr-karte-kopf,.sr-app .kwk>.sr-karte-koerper{padding-left:12px;padding-right:12px}
  .sr-app .kwk>.sr-karte-kopf .sr-karte-meta{font-size:var(--fs-label)}

  /* Pegel hochkant: Säule mittig, Zahlen darunter gestapelt und zentriert. */
  .sr-app .kwk .sr-pegel--hochkant .pg-hochkant-koerper{flex-direction:column;
    align-items:center;gap:var(--s2)}
  /* In der schmalen Spalte die volle Innenbreite der Karte minus Rand:
     110 px Textbreite, davon nimmt die Saeule bis zu 104 px. */
  .sr-app .kwk .pg-hochkant-svg{width:100%;max-width:104px;height:auto}
  .sr-app .kwk .pg-hochkant-zahlen{align-items:center;text-align:center;gap:1px;width:100%}
  .sr-app .kwk .pg-hochkant-zahlen>*{max-width:100%;white-space:nowrap;overflow:hidden;
    text-overflow:ellipsis}
  .sr-app .kwk .pg-hochkant-zahlen .pg-von{font-size:var(--fs-label)}
  .sr-app .kwk .sr-pegel--hochkant .pg-takt,
  .sr-app .kwk .kwk-takt{font-size:var(--fs-label);text-align:center;margin-top:var(--s1)}

  /* Kennzahl-Kachel (Modus c): Wert und Bezugswert untereinander — „4,24 $
     von 10,00 $" in einer Zeile bräuchte 150 px. */
  .sr-app .kwk .kwk-kachel{padding:10px 12px}
  .sr-app .kwk .kwk-kachel .sr-kpi-zeile{flex-wrap:wrap;row-gap:0}
  .sr-app .kwk .kwk-kachel .sr-kpi-wert{font-size:19px}
  .sr-app .kwk .kwk-kachel .sr-kpi-wert-zusatz{font-size:var(--fs-label)}
  .sr-app .kwk .kwk-kachel .sr-kpi-meta{font-size:var(--fs-label)}
}
.sr-app .kwk-modus{display:none}
.sr-app .kwk-modus--hochkant{display:block}
:root[data-kw-kontingent="hochkant"] .sr-app .kwk-modus--hochkant{display:block}
:root[data-kw-kontingent="quer"] .sr-app .kwk-modus--hochkant,
:root[data-kw-kontingent="kachel"] .sr-app .kwk-modus--hochkant{display:none}
:root[data-kw-kontingent="quer"] .sr-app .kwk-modus--quer{display:block}
:root[data-kw-kontingent="kachel"] .sr-app .kwk-modus--kachel{display:block}
/* Der Pegel steht IN einer Karte, die seinen Titel schon trägt — sein
   eigener Kopf wäre die zweite Überschrift derselben Sache. Die Beschriftung
   bleibt trotzdem vollständig: sie steht als aria-label am SVG und als
   aria-valuetext am meter. */
.sr-app .kwk .sr-pegel{border:0;padding:0;background:none;box-shadow:none}
.sr-app .kwk .pg-kopf{display:none}
.sr-app .kwk-takt{margin:var(--s1) 0 0;font-size:var(--fs-small);color:var(--sr-mut)}

/* Der Schalter: drei Symbole, aktiv ist das, was das Wurzel-Attribut sagt.
   Die Auszeichnung hängt NICHT an aria-pressed, weil das Attribut erst
   gesetzt wird, wenn das Skript läuft — sonst blitzte nach dem Laden kurz
   die falsche Markierung auf. aria-pressed trägt dieselbe Aussage für
   Screenreader und wird vom Skript nachgezogen. */
.sr-app .sr-wz-gruppe .kwk-schalter{display:flex;justify-content:flex-start}
.sr-app .kwk-schalter{display:inline-flex;gap:2px;padding:2px;border-radius:var(--rmd);
  background:var(--sr-soft);border:1px solid var(--sr-hair)}
.sr-app .kwk-schalter-knopf{display:inline-flex;align-items:center;justify-content:center;
  width:26px;height:24px;padding:0;border:0;border-radius:calc(var(--rmd) - 2px);
  background:transparent;color:var(--sr-mut);cursor:pointer}
.sr-app .kwk-schalter-knopf svg{width:16px;height:16px}
.sr-app .kwk-ikon-bahn{fill:none;stroke:currentColor;stroke-width:1.3;opacity:.6}
.sr-app .kwk-ikon-fuell{fill:currentColor}
.sr-app .kwk-schalter-knopf:hover{color:var(--sr-ink);background:var(--sr-surface)}
.sr-app .kwk-schalter-knopf:focus-visible{outline:2px solid var(--focus-ton);outline-offset:1px}
:root:not([data-kw-kontingent]) .sr-app .kwk-schalter-knopf[data-kw-modus="hochkant"],
:root[data-kw-kontingent="hochkant"] .sr-app .kwk-schalter-knopf[data-kw-modus="hochkant"],
:root[data-kw-kontingent="quer"] .sr-app .kwk-schalter-knopf[data-kw-modus="quer"],
:root[data-kw-kontingent="kachel"] .sr-app .kwk-schalter-knopf[data-kw-modus="kachel"]{
  background:var(--sr-surface);color:var(--sr-ink);box-shadow:var(--e1)}

/* Modus (c): dieselben Klassen wie eine Kennzahl-Kachel, damit sie ohne
   zweite Höhenpflege genauso hoch ist. Die Füllstands-Linie liegt an der
   Unterkante und ist absolut gesetzt — sie darf die Höhe nicht verändern. */
.sr-app .kwk-kachel{position:relative;overflow:hidden}
.sr-app .kwk-kachel-linie{position:absolute;left:0;right:0;bottom:0;width:100%;height:3px;display:block}
.sr-app .kwk-kachel-bahn{fill:var(--sr-soft)}
.sr-app .kwk-kachel-fuell{fill:var(--sr-ok)}
.sr-app .kwk-kachel-fuell--gut{fill:var(--sr-ok)}
.sr-app .kwk-kachel-fuell--lau,.sr-app .kwk-kachel-fuell--knapp{fill:var(--sr-warn)}
.sr-app .kwk-kachel-fuell--ueber{fill:var(--sr-err)}

/* ---- Stehender Pegel (ui.pegelHochkant). Bahn und Füllung sind dieselben
   Farben wie in der liegenden Leiste — dieselbe Aussage, andere Richtung. */
.sr-app .sr-pegel--hochkant .pg-hochkant-koerper{display:flex;align-items:stretch;gap:var(--s3)}
/* BREITE STATT HOEHE ALS MASS (Betreiber-Rueckmeldung 12.09.2026). Der
   Zeichenraum ist seit heute 100 x 140 Einheiten und die Bahn so breit wie
   er; `height:auto` laesst die Hoehe dem Seitenverhaeltnis folgen. Eine
   feste Hoehe daneben wuerde die Zeichnung einpassen statt fuellen — das
   SVG behaelt sein Verhaeltnis bei und liesse links und rechts Luft, die
   Saeule bliebe schmal. */
.sr-app .pg-hochkant-svg{width:96px;height:auto;flex:0 0 auto}
/* Die ungefüllte Bahn bleibt hell, damit die schwarze Beschriftung auch
   im dunklen Theme lesbar ist. Die weiße Kopie liegt nur auf der Füllung. */
.sr-app .pg-hochkant-svg .pg-bahn{fill:#f5f6f8;stroke:var(--sr-hair);stroke-width:1}
.sr-app .pg-hochkant-svg .pg-bahn--offen{stroke-dasharray:5 4}
.sr-app .pg-hochkant-text{fill:#000;text-anchor:middle;font-family:var(--font);
  font-variant-numeric:tabular-nums;pointer-events:none}
.sr-app .pg-hochkant-text--hell{fill:#fff}
.sr-app .pg-hochkant-betrag{font-size:20px;font-weight:700}
.sr-app .pg-hochkant-anteil{font-size:14px;font-weight:650}
.sr-app .pg-hochkant-svg .pg-fuell{fill:var(--sr-ok)}
.sr-app .pg-hochkant-svg .pg-fuell--gut{fill:var(--sr-ok)}
.sr-app .pg-hochkant-svg .pg-fuell--lau,.sr-app .pg-hochkant-svg .pg-fuell--knapp{fill:var(--sr-warn)}
.sr-app .pg-hochkant-svg .pg-fuell--ueber{fill:var(--sr-err)}
.sr-app .pg-hochkant-zahlen{display:flex;flex-direction:column;justify-content:center;gap:2px;min-width:0}
.sr-app .pg-hochkant-zahlen .pg-von{font-size:var(--fs-small);color:var(--sr-mut)}
.sr-app .sr-pegel--hochkant .pg-takt{margin:var(--s2) 0 0;font-size:var(--fs-small);color:var(--sr-mut)}

/* ══════════════════════════ Keyword-Figuren: Donut, Gauge, Radar ═════════ */

.sr-app .kwf-leer{margin:0;color:var(--sr-mut);font-size:var(--fs-small)}

/* Kategorie-Titel in „Wo das Potenzial liegt": dunkel, fett, 17,25 px statt
   11,5 px (Betreiber-Auftrag 12.09.2026 — das Anderthalbfache der bisherigen
   Größe). Versalien fallen dabei weg: in dieser Größe sind sie kein Label
   mehr, sondern Geschrei. */
.sr-body .qw-chart h4{margin:0 0 var(--s2);font:700 17.25px/1.3 var(--font);
  color:var(--sr-ink);letter-spacing:0;text-transform:none}
.sr-app .qw-charts--figuren{gap:var(--s5)}

.sr-app .kwf-donut{display:flex;align-items:center;gap:var(--s4);flex-wrap:wrap}
.sr-app .kwf-donut-bild{position:relative;width:190px;max-width:100%;flex:0 0 auto}
.sr-app .kwf-donut-svg{display:block;width:100%;height:auto}
.sr-app .kwf-donut-bahn{stroke:var(--sr-soft)}
.sr-app .kwf-donut-seg{stroke-linecap:butt}
.sr-app .kwf-donut-mitte{position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;text-align:center;pointer-events:none;padding:0 var(--s4)}
.sr-app .kwf-donut-zahl{font:700 var(--fs-kpi-standard)/1 var(--font);color:var(--sr-ink);font-variant-numeric:tabular-nums;overflow-wrap:anywhere}
.sr-app .kwf-donut-wort{font-size:var(--fs-label);color:var(--sr-mut);line-height:1.25;margin-top:2px}

.sr-app .kwf-legende{list-style:none;margin:0;padding:0;display:grid;gap:var(--s2);min-width:0;flex:1 1 12rem}
.sr-app .kwf-legende-zeile{display:grid;grid-template-columns:auto 1fr auto;gap:var(--s1) var(--s2);
  align-items:baseline;font-size:var(--fs-small)}
.sr-app .kwf-punkt{width:10px;height:10px;border-radius:3px;background:var(--sr-line);align-self:center}
.sr-app .kwf-legende-label{color:var(--sr-ink);font-weight:600;min-width:0}
.sr-app .kwf-legende-wert{color:var(--sr-ink);font-variant-numeric:tabular-nums;white-space:nowrap}
.sr-app .kwf-legende-einheit{color:var(--sr-mut);font-weight:400}
.sr-app .kwf-legende-neben{grid-column:2/4;color:var(--sr-mut);font-size:var(--fs-label);
  font-variant-numeric:tabular-nums}
.sr-app .kwf-legende-zeile--hebel .kwf-legende-label{color:var(--sr-warn-ink)}

/* Vier Farbrollen, aus denselben Tokens wie die Diagramme (--chart-t1…t4).
   Sie sind in allen drei Themes definiert; der Rückfall greift nur, wenn
   gar kein Theme gesetzt ist. */
.sr-app .kwf-ton-1{stroke:var(--chart-t1,var(--blue));background:var(--chart-t1,var(--blue))}
.sr-app .kwf-ton-2{stroke:var(--chart-t2,var(--green));background:var(--chart-t2,var(--green))}
.sr-app .kwf-ton-3{stroke:var(--chart-t3,var(--amber));background:var(--chart-t3,var(--amber))}
.sr-app .kwf-ton-4{stroke:var(--chart-t4,var(--red));background:var(--chart-t4,var(--red))}
/* Die Positionsgruppen sind FUENF (1–3, 4–10, 11–20, 21–50, ab 51), die
   Tokens reichen bis vier. Die fuenfte und eine sechste Rolle stehen
   deshalb als gedaempfte Linienfarbe dahinter — sie tragen die Restmengen,
   nicht die Aussage. */
.sr-app .kwf-ton-5{stroke:var(--sr-line);background:var(--sr-line)}
.sr-app .kwf-ton-6{stroke:var(--sr-mut);background:var(--sr-mut)}
.sr-app span.kwf-ton-1,.sr-app span.kwf-ton-2,.sr-app span.kwf-ton-3,
.sr-app span.kwf-ton-4,.sr-app span.kwf-ton-5,.sr-app span.kwf-ton-6{border:0}

/* RASTER STATT FLEX-UMBRUCH. Als Flex-Zeile sprang der Tonsatz unter das
   168 px hohe Bild und riss ein Loch zwischen Zahlen und Lücken-Liste
   (erstes Abnahmebild 12.09.2026). Im Raster steht das Bild links über zwei
   Zeilen, Zahlen und Tonsatz rechts darüber und darunter, die Lücken-Liste
   über die ganze Breite. */
.sr-app .kwf-gauge{display:grid;grid-template-columns:168px minmax(0,1fr);
  gap:var(--s2) var(--s4);align-items:start}
.sr-app .kwf-gauge-bild{position:relative;width:168px;max-width:100%;
  grid-column:1;grid-row:1/span 2}
.sr-app .kwf-gauge-svg{display:block;width:100%;height:auto}
.sr-app .kwf-gauge-bahn{stroke:var(--sr-soft);stroke-linecap:round}
.sr-app .kwf-gauge-fuell{stroke:var(--sr-ok);stroke-linecap:round}
.sr-app .kwf-gauge-fuell--gut{stroke:var(--sr-ok)}
.sr-app .kwf-gauge-fuell--lau{stroke:var(--sr-warn)}
.sr-app .kwf-gauge-fuell--knapp{stroke:var(--sr-err)}
.sr-app .kwf-gauge-fuell--leer{stroke-linecap:butt}
.sr-app .kwf-gauge-mitte{position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;pointer-events:none}
.sr-app .kwf-gauge-zahl{font:700 26px/1 var(--font);color:var(--sr-ink);font-variant-numeric:tabular-nums}
.sr-app .kwf-gauge-wort{font-size:var(--fs-label);color:var(--sr-mut);margin-top:2px}
.sr-app .kwf-gauge-zahlen{margin:0;display:grid;gap:var(--s1);min-width:0;
  grid-column:2;grid-row:1;align-self:center}
.sr-app .kwf-gauge-paar{display:flex;justify-content:space-between;gap:var(--s2);
  font-size:var(--fs-small);border-bottom:1px solid var(--sr-hair);padding-bottom:2px}
.sr-app .kwf-gauge-paar dt{color:var(--sr-mut)}
.sr-app .kwf-gauge-paar dd{margin:0;color:var(--sr-ink);font-weight:600;font-variant-numeric:tabular-nums}
.sr-body .kwf-gauge-ton{margin:0;font-size:var(--fs-small);font-weight:600;
  grid-column:2;grid-row:2}
.sr-app .kwf-gauge-ton--gut{color:var(--sr-ok-ink)}
.sr-app .kwf-gauge-ton--lau{color:var(--sr-warn-ink)}
.sr-app .kwf-gauge-ton--knapp{color:var(--sr-err-ink)}

.sr-app .kwf-luecke{list-style:none;margin:var(--s3) 0 0;padding:0;display:grid;gap:var(--s2);
  grid-column:1/-1;grid-row:3}
.sr-app .kwf-luecke li{display:grid;grid-template-columns:1fr auto;gap:2px var(--s2);
  padding-bottom:var(--s1);border-bottom:1px solid var(--sr-hair)}
.sr-app .kwf-luecke-label{color:var(--sr-ink);font-weight:600;font-size:var(--fs-small)}
.sr-app .kwf-luecke-wert{color:var(--sr-ink);font-size:var(--fs-small);
  font-variant-numeric:tabular-nums;white-space:nowrap}
.sr-app .kwf-luecke-neben{grid-column:1/3;color:var(--sr-mut);font-size:var(--fs-label)}

.sr-app .kwf-radar{display:flex;align-items:flex-start;gap:var(--s4);flex-wrap:wrap}
.sr-app .kwf-radar-svg{display:block;width:340px;max-width:100%;height:auto;flex:0 0 auto}
.sr-app .kwf-radar-ring{stroke:var(--sr-hair);stroke-width:1}
.sr-app .kwf-radar-speiche{stroke:var(--sr-hair);stroke-width:1}
.sr-app .kwf-radar-name{fill:var(--sr-mut);font-size:11px;font-family:var(--font)}
.sr-app .kwf-radar-flaeche{stroke-width:2}
.sr-app .kwf-radar--aktuell{fill:var(--chart-t1,var(--blue));fill-opacity:.24;
  stroke:var(--chart-t1,var(--blue))}
.sr-app circle.kwf-radar--aktuell{fill-opacity:1}
.sr-app .kwf-radar--vorher{fill:var(--sr-line);fill-opacity:.12;stroke:var(--sr-line);
  stroke-dasharray:6 4;opacity:.75}
.sr-app circle.kwf-radar--vorher{fill:var(--sr-line);fill-opacity:1;stroke-dasharray:none}
.sr-app .kwf-legende--radar{flex:0 0 auto;grid-auto-flow:row}
.sr-app .kwf-legende--radar .kwf-legende-zeile{grid-template-columns:auto 1fr}
.sr-app .kwf-radar-werte{margin:0;display:grid;gap:var(--s1);min-width:0;flex:1 1 14rem}
.sr-app .kwf-radar-paar{display:flex;justify-content:space-between;gap:var(--s2);
  font-size:var(--fs-small);border-bottom:1px solid var(--sr-hair);padding-bottom:2px}
.sr-app .kwf-radar-paar dt{color:var(--sr-mut)}
.sr-app .kwf-radar-paar dd{margin:0;color:var(--sr-ink);font-weight:600;font-variant-numeric:tabular-nums;
  white-space:nowrap}
.sr-app .kwf-radar-vorwert{color:var(--sr-mut);font-weight:400}

/* Vier-Teile-Erklärung im ⓘ-Popover: Zeigt / Misst / Quelle / Weiter. */
.sr-app .kwf-erkl{margin:0;display:grid;gap:var(--s3)}
.sr-app .kwf-erkl dt{font-size:var(--fs-label);text-transform:uppercase;letter-spacing:.06em;
  color:var(--sr-mut);font-weight:700;margin-bottom:2px}
.sr-app .kwf-erkl dd{margin:0;color:var(--sr-ink);font-size:var(--fs-small);line-height:1.55}

@media (max-width:560px){
  .sr-app .kwf-donut,.sr-app .kwf-gauge,.sr-app .kwf-radar{gap:var(--s3)}
  .sr-app .kwf-donut-bild{width:min(190px,60vw)}
  .sr-app .kwf-gauge{grid-template-columns:minmax(0,1fr)}
  .sr-app .kwf-gauge-bild{width:min(168px,58vw);grid-column:1;grid-row:auto;justify-self:center}
  .sr-app .kwf-gauge-zahlen,.sr-body .kwf-gauge-ton{grid-column:1;grid-row:auto}
  .sr-app .kwf-luecke{grid-column:1;grid-row:auto}
  .sr-app .kwf-radar-svg{width:100%}
  .sr-app .sr-pegel--hochkant .pg-hochkant-koerper{gap:var(--s2)}
}

/* ═══════════════════════════════════════════════ Widget-Werkzeuge ═══════
 *
 * EINE REGEL FUER ALLE WIDGETS (Betreiber-Auftrag 12.09.2026). Bis heute
 * stand „das ⓘ ist gedaempft und wird beim Ueberfahren deutlich" vier Mal
 * im Bestand: einmal fuer .sr-kpi und drei Mal in cockpit.css fuer .ck-w,
 * .ck-karte und die Karten des Cockpits. Vier Fassungen derselben Sache
 * heisst, dass eine Aenderung an einer von vier Stellen wirkt.
 *
 * DAS MERKMAL IST `data-sr-werkzeuge` am Kachel-/Kartenbehaelter — gesetzt
 * von ui.srKarte(), von der Kennzahl-Kachel (ui.js) und von den
 * Cockpit-Widgets (cockpit.js). Was DARIN an Werkzeugen liegt (ⓘ und
 * Zahnrad), ist im Ruhezustand unsichtbar und kommt beim Ueberfahren.
 *
 * UNSICHTBAR, NICHT WEG: `opacity:0` statt `display:none` — der Knopf
 * behaelt seinen Platz, sonst springt die Kopfzeile beim Ueberfahren um
 * seine Breite. Aus demselben Grund steht hier kein `visibility`.
 *
 * DREI WEGE FUEHREN ZUR SICHTBARKEIT, und alle drei sind noetig:
 *   Maus       :hover am Behaelter.
 *   Tastatur   :focus-within am Behaelter UND :focus-visible am Knopf
 *              selbst. Wer mit Tab in die Kachel laeuft, muss das Werkzeug
 *              sehen, bevor er es erreicht — der erste Teil leistet das,
 *              der zweite deckt den Fall ab, dass der Fokus ueber einen
 *              Rueckfallweg gar nicht im Behaelter liegt.
 *   Beruehrung (hover:none) — auf einem Geraet ohne Zeiger gibt es kein
 *              Ueberfahren. Dort stehen die Werkzeuge dauerhaft da; sie
 *              erst auf Tippen zu zeigen hiesse, dass ein Tipp etwas
 *              anderes bedeutet als ein Klick.
 * Ein GEOEFFNETES Panel bleibt in jedem Fall sichtbar (aria-expanded), auch
 * wenn der Zeiger die Kachel inzwischen verlassen hat.
 *
 * DIE REGEL GILT NUR INNERHALB EINES MARKIERTEN BEHAELTERS. Ein ⓘ, das
 * irgendwo sonst steht (Tabellenkopf, Formularzeile), bleibt unveraendert
 * sichtbar — sonst haette der Umbau lauter unsichtbare Knoepfe erzeugt, die
 * niemand vermisst, bis er sie sucht.
 */
[data-sr-werkzeuge] .sr-kpi-info,
[data-sr-werkzeuge] .sr-wz-knopf{opacity:0;transition:opacity var(--t-fast) var(--ease)}
[data-sr-werkzeuge]:hover .sr-kpi-info,
[data-sr-werkzeuge]:hover .sr-wz-knopf,
[data-sr-werkzeuge]:focus-within .sr-kpi-info,
[data-sr-werkzeuge]:focus-within .sr-wz-knopf,
[data-sr-werkzeuge] .sr-kpi-info:focus-visible,
[data-sr-werkzeuge] .sr-wz-knopf:focus-visible,
[data-sr-werkzeuge] .sr-kpi-info[aria-expanded="true"],
[data-sr-werkzeuge] .sr-wz-knopf[aria-expanded="true"]{opacity:1}
@media (hover:none){
  [data-sr-werkzeuge] .sr-kpi-info,
  [data-sr-werkzeuge] .sr-wz-knopf{opacity:1}
}
@media (prefers-reduced-motion:reduce){
  [data-sr-werkzeuge] .sr-kpi-info,
  [data-sr-werkzeuge] .sr-wz-knopf{transition:none}
}

/* ------------------------------------------------------ Zahnrad-Knopf --
 * Er sitzt unten rechts IN der Karte und nicht im Kopf: oben stehen Name,
 * Stand und ⓘ — das ist die Lesezeile. Das Zahnrad ist eine Handlung und
 * gehoert ans Ende, dorthin, wo der Blick nach dem Inhalt ankommt.
 * `sr-karte--wz` setzt den Bezugsrahmen nur an Karten, die wirklich eines
 * tragen (ui.srKarte zahnradHtml). */
.sr-karte--wz{position:relative}

/* ---- Die ganze Karte als Klickziel (Betreiber-Rueckmeldung 12.09.2026) --
 *
 * DASSELBE MUSTER WIE AN DER KENNZAHL-KACHEL (`.sr-kpi-link`): ein
 * gestrecktes <a> UNTER dem Inhalt statt eines Links im Text. Ein <a> um die
 * ganze Karte ginge nicht — ⓘ und Zahnrad sind eigene Bedienelemente, und
 * ein Knopf in einem Link ist verschachtelte Interaktion.
 *
 * DIE STAPELUNG IST DER GANZE TRICK: Flaeche auf 1, Kopfzeile auf 2,
 * Zahnrad auf 3 (weiter oben gesetzt). Was oben liegt, faengt den Klick —
 * deshalb braucht es dafuer kein stopPropagation und keinen Zuhoerer.
 *
 * DAS IST DIE VORGABE FUER JEDES WIDGET MIT KLICKZIEL: Flaeche statt
 * Textlink, Werkzeuge darueber, Ziel im aria-label der Flaeche.
 */
.sr-karte--link{cursor:pointer}
.sr-karte-flaeche{position:absolute;inset:0;border-radius:inherit;z-index:1}
.sr-karte-flaeche:focus-visible{outline:2px solid var(--focus-ton);outline-offset:2px}
.sr-karte--link>.sr-karte-kopf{position:relative;z-index:2}
/* Derselbe Hebeeffekt wie an der Kennzahl-Kachel — die Karte reagiert
   sichtbar darauf, dass sie anklickbar ist. */
.sr-karte--link:hover{box-shadow:var(--edge),var(--sr-e1),0 6px 18px rgba(18,22,29,.10);
  transform:translateY(-1px)}
@media (prefers-reduced-motion:reduce){.sr-karte--link:hover{transform:none}}
/* PLATZ FUER DAS ZAHNRAD. Es liegt ueber dem Kartenkoerper; ohne Reserve
   saesse es auf der letzten Zeile — an der Kontingent-Karte genau auf dem
   Link „Budget, Takt und Kontingent aendern". Der Streifen ist die Hoehe
   des Knopfes plus sein Rand und steht nur an Karten mit Zahnrad. */
.sr-karte--wz>.sr-karte-koerper{padding-bottom:calc(var(--s3) + 22px)}
.sr-wz{position:absolute;right:10px;bottom:10px;z-index:3;display:inline-flex}
.sr-wz-knopf{width:26px;height:26px;flex:none;display:inline-flex;align-items:center;
  justify-content:center;padding:0;border:0;border-radius:var(--sr-r-xs);
  background:var(--sr-surface);color:var(--sr-mut);cursor:pointer;
  box-shadow:var(--edge),var(--sr-e1)}
.sr-wz-knopf:hover{background:var(--sr-soft);color:var(--sr-ink)}
.sr-wz-knopf:focus-visible{outline:2px solid var(--focus-ton);outline-offset:1px}
.sr-wz-knopf svg{width:15px;height:15px;display:block}

/* Das Popover oeffnet NACH OBEN (bottom statt top): der Knopf steht am
   unteren Rand der Karte, ein Panel darunter laege ausserhalb des
   Sichtfensters, sobald die Karte am Seitenende steht. */
.sr-wz-panel{position:absolute;bottom:calc(100% + var(--s1));right:0;z-index:220;
  width:min(268px,86vw);background:var(--sr-surface);border-radius:var(--sr-r-lg);
  box-shadow:var(--edge),var(--sr-e-modal);padding:var(--s2) var(--s3) var(--s3);
  text-align:left;font-size:var(--fs-body);color:var(--sr-ink)}
/* Nach unten, wenn oben kein Platz ist (widget-werkzeuge.js misst das). */
.sr-wz-panel--unten{bottom:auto;top:calc(100% + var(--s1))}
.sr-wz-panel[hidden]{display:none}
.sr-wz-kopf{display:flex;align-items:center;gap:var(--s2);margin-bottom:var(--s2)}
.sr-wz-titel{flex:1;min-width:0;font-size:var(--fs-ui);font-weight:var(--fw-ui);color:var(--sr-ink)}
.sr-wz-zu{width:24px;height:24px;flex:none;display:inline-flex;align-items:center;
  justify-content:center;padding:0;border:0;background:none;border-radius:var(--sr-r-xs);
  color:var(--sr-mut);cursor:pointer;font:inherit;font-size:var(--fs-ui)}
.sr-wz-zu:hover{background:var(--sr-soft);color:var(--sr-ink)}
.sr-wz-zeile{display:flex;align-items:flex-start;gap:var(--s2);padding:var(--s1) 0;cursor:pointer}
.sr-wz-kasten{margin:2px 0 0;flex:none;accent-color:var(--knopf-blau)}
.sr-wz-text{min-width:0;display:grid;gap:2px}
.sr-wz-label{font-size:var(--fs-small);color:var(--sr-ink)}
.sr-wz-hilfe{font-size:var(--fs-label);color:var(--sr-mut);line-height:1.4}
.sr-wz-gruppe{display:grid;gap:var(--s1);padding:var(--s1) 0}
.sr-wz-gruppe-name{font-size:var(--fs-label);text-transform:uppercase;letter-spacing:.06em;
  color:var(--sr-mut);font-weight:700}

/* ------------------------------------------------ Option „transparent" --
 * Sie nimmt der Karte Flaeche, Rand und Schatten; stehen bleibt, was Daten
 * traegt — Linien, Balken, Zahlen auf dem Seitenverlauf. Der Knopf selbst
 * behaelt seine Flaeche, sonst waere er auf dem Hintergrund nicht zu sehen.
 */
[data-sr-werkzeuge][data-wz-transparent="1"]{background:transparent;box-shadow:none;
  border-color:transparent}
[data-sr-werkzeuge][data-wz-transparent="1"] .chart-dynamisch,
[data-sr-werkzeuge][data-wz-transparent="1"] .sr-pegel,
[data-sr-werkzeuge][data-wz-transparent="1"] .sr-kpi{background:transparent;box-shadow:none}

/* ════════════════════════════ Recherche-Übersicht ═══════════════════════════
 *
 * Das gemeinsame Gerüst der drei Rubrik-Übersichten (Keywords, Wettbewerber,
 * Backlinks) — Betreiber-Auftrag 12.09.2026: „Keywords → Übersicht wird die
 * Standard-Übersicht der Recherche-Rubriken."
 *
 * VIER TEILE, IN DIESER REIHENFOLGE: Stand-Leiste (eine Zeile), Express
 * Briefing (einklappbar, halb bis zwei Drittel breit), Kennzahl-Reihe (halbe
 * Kachelbreite, gemischte Formen), Chart-Reihe, Kachel-Reihe.
 *
 * KEIN QUERLAUF. Jedes Raster hier arbeitet mit `minmax(0,1fr)` statt `1fr`:
 * ein Gitterfeld mit `1fr` ist mindestens so breit wie sein Inhalt, und ein
 * Chart mit Mindestbreite schiebt dann die ganze Seite auf. Die runden
 * Figuren heben ihre Mindestbreite zusätzlich selbst auf
 * (`.chart-dynamisch--schmal`, siehe unten).
 */

.ru-uebersicht{display:grid;gap:var(--s5);min-width:0}
/* Rasterfelder tragen von Haus aus `min-width:auto` und sind damit
   mindestens so breit wie ihr Inhalt — ein Kachelraster mit langen
   Etiketten schiebt die Seite dann über den rechten Rand hinaus. */
.ru-uebersicht>*{min-width:0}

/* ---- Stand-Leiste. EINE Zeile, waagerecht rollend auf schmalen Schirmen —
   der Seitenkörper bleibt frei von Querlauf (dieselbe Bauform wie die
   Zeitraum-Leiste des Dashboards). */
.ru-stand{display:flex;align-items:center;gap:var(--s2);min-width:0;
  padding:8px var(--s3);margin:0 0 var(--s4);overflow-x:auto;
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);
  background:var(--sr-surface);box-shadow:var(--sr-e1);scrollbar-width:thin}
/* Steht die Leiste IM Übersichts-Raster (Wettbewerber, Backlinks), trägt
   der Rasterabstand den Abstand — der eigene Rand käme obendrauf und
   verdoppelte ihn. Im Kapitelkopf (Keywords) steht sie außerhalb und
   braucht ihn. */
.ru-uebersicht>.ru-stand{margin-bottom:0}
.ru-stand-feld{display:flex;flex-direction:column;gap:1px;white-space:nowrap}
.ru-stand-label{font:var(--fw-ui) var(--fs-small)/1.1 var(--font);color:var(--sr-mut);
  letter-spacing:.06em;text-transform:uppercase}
.ru-stand-wert{font:600 var(--fs-label)/1.2 var(--font);color:var(--sr-ink);
  font-variant-numeric:tabular-nums}
.ru-stand-punkt{color:var(--sr-hair);flex:0 0 auto}
.ru-stand-abw{display:flex;align-items:center;gap:var(--s2);flex-wrap:nowrap}
.ru-stand-abw-eintrag{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;
  font-size:var(--fs-label);color:var(--sr-mut)}
.ru-stand .sr-erklaerung{margin-left:auto;flex:0 0 auto}

/* ---- Stand-Etikett. Es steht an JEDER Kachel, deren Messzeitraum vom
   Fenster der Rubrik abweicht — sichtbar, nicht nur im ⓘ. Die gestrichelte
   Kante ist das Zeichen dafür, dass die Zahl daneben einer anderen Uhr
   folgt; das Wort im Etikett sagt welcher (Farbe trägt nie allein). */
.sr-stand{display:inline-flex;align-items:center;padding:1px 7px;
  border:1px dashed var(--sr-hair);border-radius:999px;
  font:var(--fw-ui) var(--fs-small)/1.5 var(--font);color:var(--sr-mut);
  white-space:nowrap;font-variant-numeric:tabular-nums}

/* ---- Express Briefing. „über die halbe bis zwei Drittel der Inhaltsbreite
   (nicht schmal wie heute im Dashboard)": 62 % mit einer Untergrenze, damit
   die Prioritätenkacheln darin nicht umbrechen. */
.sr-briefing{width:min(100%,62%);min-width:0;margin:0}
.sr-briefing--banner{width:100%;background:transparent}
.sr-briefing--banner[open]{background:var(--sr-surface)}
.sr-briefing--banner>.sr-briefing-kopf{min-height:80px;padding-block:var(--s4);
  background:linear-gradient(100deg,var(--knopf-blau) 0%,var(--knopf-blau) 70%,
    color-mix(in srgb,var(--knopf-blau) 60%,transparent) 86%,transparent 100%);
  border-radius:inherit}
.sr-briefing--banner[open]>.sr-briefing-kopf{border-bottom-left-radius:0;border-bottom-right-radius:0}
.sr-briefing--banner>.sr-briefing-kopf>.sr-karte-titel{flex:0 0 auto;color:var(--auf-knopf)}
.sr-briefing--banner>.sr-briefing-kopf>.sr-karte-meta{margin-left:var(--s3);color:var(--auf-knopf)}
.sr-briefing--banner>.sr-briefing-kopf>.sr-karte-klapp-pfeil{margin-left:auto;border-color:var(--sr-acc-ink)}
.sr-briefing--banner>.sr-briefing-kopf:focus-visible{box-shadow:inset 0 0 0 2px var(--auf-knopf)}
/* Alle äußeren Widget-Abstände der Keyword-Übersicht folgen demselben Raster. */
#keyword-uebersicht,
#keyword-uebersicht .ru-kpis,
#keyword-uebersicht .sr-kpi-gitter,
#keyword-uebersicht .kwu-reihe,
#keyword-uebersicht .ru-reihe{gap:var(--sr-gap-kpi)}
#keyword-uebersicht>*{margin-block:0}
/* Steht ein zweites Widget daneben, gibt das Raster die Breiten vor und die
   Karte nimmt ihre Spalte ganz aus — dieselbe Anordnung wie im Dashboard,
   wo neben dem Briefing die Kanal-Bilanz steht. */
.ru-briefing-reihe{display:grid;grid-template-columns:minmax(0,62fr) minmax(0,38fr);
  gap:var(--s4);align-items:start;min-width:0}
.ru-briefing-reihe>*{min-width:0}
.ru-briefing-reihe>.sr-briefing{width:100%}
.ru-briefing-neben .pk-kontingent{margin:0}
.ru-briefing-neben .pk-kontingent>.sr-pegel,
.ru-briefing-neben .pk-kontingent-takt{width:100%}
.sr-briefing>.sr-briefing-kopf{cursor:pointer;list-style:none}
.sr-briefing>.sr-briefing-kopf::-webkit-details-marker{display:none}
/* Das ⓘ ist ein GESCHWISTER des <summary> (kein Knopf im Knopf) und wird
   deshalb hierher gestellt, nicht hineingeschachtelt. */
.sr-briefing{position:relative}
.sr-briefing-info{position:absolute;top:10px;right:var(--s3);z-index:2}
.sr-briefing--banner > .sr-briefing-info{top:var(--s4)}
.sr-briefing>.sr-briefing-kopf{padding-right:64px}
.sr-briefing-koerper{display:grid;gap:var(--s3)}
/* Karten INNERHALB des Briefings verlieren ihre eigene Hülle: eine Karte in
   einer Karte ist ein doppelter Rahmen um denselben Inhalt. Der Titel bleibt
   stehen — er gliedert das Briefing. */
.sr-briefing-koerper>.sr-karte{border:0;box-shadow:none;background:transparent;border-radius:0}
.sr-briefing-koerper>.sr-karte>.sr-karte-kopf{padding-left:0;padding-right:0}
.sr-briefing-koerper>.sr-karte>.sr-karte-koerper{padding-left:0;padding-right:0;padding-bottom:0}

/* ---- Kennzahl-Reihe in halber Kachelbreite. Statt vier breiter Kacheln je
   Zeile stehen hier bis zu sechs schmale: dieselbe Zeilenhöhe, doppelt so
   viele Kennzahlen. Der Wert bleibt die größte Type der Kachel. */
.ru-kpis{display:grid;gap:var(--s3);min-width:0}
.ru-kpis .sr-kpi-gitter{grid-template-columns:repeat(auto-fit,minmax(196px,1fr));margin:0}
.ru-kpis .sr-kpi{min-width:0;padding:10px 12px;gap:6px}
/* Lange Etiketten („Höchste Überschneidung") dürfen die Spur nicht
   auseinanderdrücken: sie brechen um, statt die Kachel zu verbreitern. */
.ru-kpis .sr-kpi-label{overflow-wrap:anywhere}
.ru-kpis .sr-kpi-wert{min-width:0;font-size:var(--fs-kpi-standard);overflow-wrap:anywhere}
.ru-kpis .sr-kpi-meta{font-size:var(--fs-small)}
@media (min-width:1101px){
  #keyword-uebersicht .kw-kpis--oben .sr-kpi-gitter,
  #keyword-uebersicht .kw-kpis--unten .sr-kpi-gitter{
    grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);grid-template-columns:none
  }
}
.sr-body:has(#keyword-uebersicht) #keywords>.ru-stand,
.sr-body:has(#keyword-uebersicht) #keywords>.sr-hinweis{margin:0 0 var(--sr-gap-kpi)}

/* Figur statt Zahl im Wertfeld (Ring, Balken, Wertepaar). Sie ersetzt NUR
   das Wertfeld — Kopf, ⓘ, Meta-Zeile und Klickfläche bleiben dieselben. */
.ru-kpi-figur{display:inline-flex;align-items:center;gap:var(--s2);min-width:0}
.ru-kpi-ring{flex:0 0 auto;display:block}
.ru-kpi-ring-bahn{stroke:var(--sr-soft)}
.ru-kpi-ring-wert{stroke:var(--sr-acc-line)}
.ru-kpi-figur-zahl{font:var(--fw-black) var(--fs-h2)/1 var(--font-num);color:var(--sr-ink);
  font-variant-numeric:tabular-nums}
.ru-kpi-figur-wort{font-size:var(--fs-small);color:var(--sr-mut)}
.ru-kpi-balken{display:flex;flex-direction:column;gap:5px;min-width:0;width:100%}
.ru-kpi-balken-zahl{font:var(--fw-black) var(--fs-h2)/1 var(--font-num);color:var(--sr-ink);
  font-variant-numeric:tabular-nums}
.ru-kpi-balken .sr-bar{width:100%}
.ru-kpi-paar{display:inline-flex;align-items:baseline;gap:var(--s3);
  font:var(--fw-black) var(--fs-h2)/1 var(--font-num);font-variant-numeric:tabular-nums}
.ru-kpi-paar-gut{color:var(--sr-ok-ink,var(--sr-ink))}
.ru-kpi-paar-schlecht{color:var(--sr-err-ink,var(--sr-mut))}

/* ---- Kachel-Reihe. Halbbreit als Grundform, volle Breite für die Typen,
   die sie brauchen (Wärmekarte, Verteilung, Ring-plus-Bogen). */
.ru-reihe{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s4);min-width:0}
.ru-reihe>*{min-width:0}
.ru-kachel{min-width:0}
.ru-kachel--breit{grid-column:1 / -1}
.ru-kachel>.sr-karte{height:100%}
.sr-body .ru-kachel-ziel{margin:var(--s3) 0 0;font-size:var(--fs-label)}

/* ---- Runde Figuren ohne Mindestbreite. `.chart` aus app.css trägt
   min-width:460px — richtig für eine Zeitreihe mit Datumsachse, falsch für
   Ring, Tacho und Netz in einer halbbreiten Kachel. Die Klasse setzt
   app/lib/charts.js an der FORM, nicht an der Ansicht. */
.chart-dynamisch--schmal .chart,
.chart-dynamisch--schmal .chart-wrap{min-width:0}
.chart-dynamisch--schmal .chart-wrap{overflow-x:visible}
.chart-wrap--fig{display:flex;flex-direction:column;align-items:center}
.chart--fig{max-width:340px}
/* Beschriftungen IM Rückfall-SVG: sie kommen aus app/lib/svg.js und tragen
   dort nur Klassen, keine Farbwerte — damit gehen sie in allen drei Themen
   mit dem Text mit. */
.chart-fig-zahl{font-family:var(--font-num);font-weight:800;font-size:20px;fill:var(--text)}
.chart-fig-mut{font-family:var(--font-body);font-size:var(--fs-svg);fill:var(--text-3)}
.chart-fig-wert{font-family:var(--font-num);font-size:var(--fs-svg);font-weight:700;fill:var(--text-2);
  font-variant-numeric:tabular-nums}
.chart-fig-auf{font-family:var(--font-body);font-size:var(--fs-svg);fill:#fff;font-weight:600}
.chart-fig-auf--wert{font-family:var(--font-num);font-weight:800}

/* ---- Figuren der Keyword-Karten nach dem Umzug in die Chart-Weiche:
   Bild oben, Legende darunter. Vorher lagen Bild und Legende nebeneinander
   in einem eigenen Raster je Figur. */
.sr-app .kwf-donut--weiche,.sr-app .kwf-gauge--weiche,.sr-app .kwf-radar--weiche{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s2);min-width:0}
.sr-app .kwf-gauge--weiche>*{grid-column:1;grid-row:auto}
.kwf-figur-bild{min-width:0;width:100%}
.kwf-figur-bild .chart-wrap{margin:0;padding:0;background:transparent;box-shadow:none}

/* ---- Schmale Schirme. Eine Kachelspalte, das Briefing über die volle
   Breite: 62 % von 390 px wären 240 px, und dort steht keine Priorität mehr. */
@media (max-width:1100px){
  .sr-briefing{width:100%}
  .ru-briefing-reihe{grid-template-columns:minmax(0,1fr)}
  .ru-reihe{grid-template-columns:minmax(0,1fr)}
  .ru-kpis .sr-kpi-gitter{grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}
}
@media (max-width:640px){
  /* Auf schmalen Schirmen umbricht die Kopfzeile, und der Klapp-Pfeil landet
     als drittes Element allein in einer eigenen Zeile. Als Raster bleibt er
     neben dem Titel, die Meta-Zeile rutscht darunter. */
  .sr-briefing>.sr-briefing-kopf{display:grid;grid-template-columns:minmax(0,1fr) auto;
    align-items:center;column-gap:var(--s2);row-gap:2px}
  .sr-briefing>.sr-briefing-kopf>.sr-karte-titel{grid-column:1;grid-row:1}
  .sr-briefing>.sr-briefing-kopf>.sr-karte-meta{grid-column:1;grid-row:2;margin-left:0}
  .sr-briefing>.sr-briefing-kopf>.sr-karte-klapp-pfeil{grid-column:2;grid-row:1;margin-left:0}
}
@media (max-width:640px){
  .sr-briefing--banner>.sr-briefing-kopf{background:linear-gradient(100deg,var(--knopf-blau) 0%,var(--knopf-blau) 88%,transparent 100%)}
  .sr-briefing--banner>.sr-briefing-kopf>.sr-karte-meta{margin-left:0}
  .sr-briefing--banner>.sr-briefing-kopf>.sr-karte-klapp-pfeil{border-color:var(--auf-knopf)}
}
@media (max-width:560px){
  .ru-kpis .sr-kpi-gitter{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ru-stand{padding:8px var(--s2)}
  .sr-briefing-info{right:var(--s2);top:8px}
  .sr-briefing>.sr-briefing-kopf{padding-right:52px}
}

/* ---- Chart-Karten der Recherche-Übersichten: weniger Rand links und rechts.
   Ein Verlaufsbild verliert an beiden Seiten 18 px Karten-Innenabstand und
   noch einmal 4 px Bildrahmen — bei einer Karte, die ohnehin nur sieben
   Achtel der Zeile bekommt, sind das gut 5 % Zeichenfläche für nichts. Der
   Kopf behält seinen Abstand: dort steht Text, und Text braucht die Gasse.
   (Die Kontingent-Karte daneben und die Karten-Funktion selbst bleiben
   unverändert — hier steht nur, wie sie im Raster sitzen.) */
.ru-uebersicht .kwu-reihe>.sr-karte>.sr-karte-koerper,
.ru-kachel>.sr-karte>.sr-karte-koerper:has(>.chart-dynamisch),
.ru-kachel>.sr-karte>.sr-karte-koerper:has(>.chart-wrap){padding-left:6px;padding-right:6px}
.ru-uebersicht .kwu-reihe .chart-wrap{margin:0;padding:4px 0 0;background:transparent;
  box-shadow:none;border-radius:0}
.ru-kachel .chart-wrap{margin:0;padding:4px 0 0;background:transparent;box-shadow:none;
  border-radius:0}

/* ─────────────────────────── Sektions-Zahnrad (Migration 140)
 * Geöffnet wird seit dem 18.09.2026 über den Zahnrad-Eintrag in der
 * Reiterleiste (Betreiber-Auftrag, kein eigener Knopf im Inhalt mehr);
 * hier stehen nur noch die Modal-Formularzeilen unten. Der Reiter-Knopf
 * erbt die Tab-Optik: */
.unterkapitel-tab--knopf{border:0;background:transparent;font:inherit;cursor:pointer}
.sektion-tab-zeile{display:grid;grid-template-columns:auto minmax(0,1fr) minmax(0,1fr) 64px;
  align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border)}
.sektion-tab-zeile:last-of-type{border-bottom:0}
.sektion-tab-ordnen{display:inline-flex;gap:3px}
.sektion-tab-ordnen .chart-studio-knopf{min-width:28px;min-height:26px;padding:2px 6px}
.sektion-tab-sichtbar{display:flex;align-items:center;gap:7px;min-width:0}
.sektion-tab-sichtbar span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sektion-tab-zeile input[type=text]{box-sizing:border-box;width:100%;min-width:0;padding:5px 8px;
  border:1px solid var(--border);border-radius:var(--sr-r-ctl,7px);background:var(--surface);
  color:var(--text);font:inherit;font-size:var(--fs-small,12px)}
.sektion-tab-icon{text-align:center}
.sektion-tab-aktionen{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}
@media (max-width:720px){
  .sektion-tab-zeile{grid-template-columns:auto minmax(0,1fr) 56px;grid-auto-rows:auto}
  .sektion-tab-zeile input[type=text]:not(.sektion-tab-icon){grid-column:2/4}
}
/* Emoji-Icon vor einem Reiternamen (Sektions-Konfiguration). */
.unterkapitel-tab-emoji{font-size:13px;line-height:1}


/* ---- cockpit.css ---- */
/* ================================================================ cockpit.css
 * Sichtbarkeits-Cockpit (Kapitel 01 „Dashboard", Umbau 06.09.2026 nach
 * Daniels Audi-Reporting-Entwurf). Fuenfter Teil des app.css-Buendels
 * (app/lib/assets.js ZUSAMMENSETZUNG), hinter sr-bausteine.css — gewinnt bei
 * gleicher Spezifitaet wie die anderen App-eigenen Bausteine.
 *
 * KEIN FARBWERT UND KEINE SCHRIFTGROESSE STEHT HIER ALS ZAHL (dieselbe Regel
 * wie sr-bausteine.css), ausser den Zahlen, die ein Auftrag selbst in Pixeln
 * nennt: die Donut-Zahl (34 px), der Ring-Strich (14 px), die Widget-Hoehe
 * der Leiste (68 px aus „~64–72 px") mit ihrer Zahl (24 px). Alles andere
 * kommt aus den Tokens von theme.css/sr.css.
 *
 * NEUE BAUSTEINE, WEIL srKpiGitter/srKarte NICHT DAFUER GEBAUT SIND: ein
 * Leisten-Widget ist 68 px hoch und traegt Label, Zahl und Δ in EINER Zeile
 * (oder zwei Anteile ueber einem Balken), eine Donut-Kachel traegt Zahl UND
 * Ring gleichzeitig. Wo die bestehenden Bausteine passen (die drei
 * „einfachen" Suche-Kacheln, die sechs Besucher-Kanal-Kacheln, Raten-Zeile,
 * Shop-Zeile), rendert app/views/cockpit.js sie unveraendert — .sr-kpi/
 * .sr-karte tragen dort ihr eigenes CSS.
 */

.ck-cockpit{--ck-w-hoehe:68px;display:flex;flex-direction:column;gap:var(--sr-gap-kpi)}

/* ------------------------------------------------------ Kennzahl-Leiste --- */
/* EINE Zeile ueber den Charts (Umbau 11.09.2026). Die Widgets sind gleich
   hoch (--ck-w-hoehe) und brechen nie um; auf schmalen Schirmen scrollt der
   Rahmen waagerecht statt zu stapeln. Der Seitenkoerper selbst bleibt dabei
   frei von Querlauf — die Bedingung, die jede Abnahme bei 390 px prueft. */
/* Die Kopfhoehe folgt Titelumbruechen per ResizeObserver in app.js.
   Kein Filter am Sticky-Rahmen: mobile Kalender-/Infopanels bleiben
   dadurch am Viewport verankert. */
.ck-leiste{display:flex;flex-wrap:wrap;align-items:stretch;gap:var(--sr-gap-kpi);
  position:sticky;top:var(--sr-kopf-h,0px);z-index:39;
  padding-block:var(--s2);margin-block:calc(-1 * var(--s2))}
/* MILCHIGER GRUND (Betreiber-Auftrag 18.09.2026): beim Kleben blitzte der
   Seiteninhalt zwischen den Widgets durch. Der Schleier liegt auf ::before
   und NICHT auf der Leiste selbst — ein backdrop-filter am Rahmen machte
   ihn zum Containing Block der mobilen fixed-Panels (Kalender/ⓘ), das
   Pseudo-Element hat keine Nachfahren und kann nichts verankern. Er ragt
   seitlich um die Leisten-Luft hinaus, damit auch die Randspalten gedeckt
   sind. */
/* Betreiber-Korrektur 18.09.: KEIN Kasten/Rahmen — nur Schleier. Deshalb
   ohne Radius und mit der Kartenfläche (weiß) statt des grauen Seitengrunds
   getönt; der Schleier reicht seitlich und oben über die Lücken hinaus und
   läuft unten 22 px weich aus (Maske statt harter Kante — die Maske wirkt
   in Chromium auch auf den backdrop-filter). */
/* Betreiber-Korrektur 20.09.: Der Milchschleier erscheint NUR beim Kleben
   (Klasse ist-klebrig, gesetzt von app.js sobald die Leiste am Seitenkopf
   haengt) — im frisch geladenen Ruhezustand ist die Leiste ein normales
   Element mit Standard-Abstand zum Chart, kein milchiger Kasten und kein
   Extra-Platz nach unten. Seitlich bis zum Rand der Inhaltsspalte (--s4),
   der weiche Auslauf unten bleibt knapp (14 px). */
.ck-leiste.ist-klebrig::before{content:"";position:absolute;z-index:-1;
  inset:calc(-1 * var(--s2, 8px)) calc(-1 * var(--s4, 24px)) -14px;
  background:color-mix(in srgb, var(--sr-surface, #fff) 82%, transparent);
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  -webkit-mask-image:linear-gradient(to bottom, #000 calc(100% - 14px), transparent);
  mask-image:linear-gradient(to bottom, #000 calc(100% - 14px), transparent)}
/* SEKTIONS-AUSGABE derselben Leiste: ausserhalb des Cockpits fehlt die
   Kachelhoehen-Variable — Standard-Abstand nach unten kommt aus dem
   Seiten-Grid (--s3 gap), hier KEINE zusaetzliche Luft. */
.ck-leiste--sektion{--ck-w-hoehe:68px;margin-block:0}
.zeitraum-quellenstand{margin:var(--s1,6px) 0 var(--s3,16px)}
/* KEIN overflow AUF DEM SCHIRM: das ⓘ-Popover eines Widgets liegt als
   absolut positionierter Kasten IN der Kachel (sr-bausteine.css
   .sr-erklaerung-panel) — ein Rahmen mit overflow schnitte es ab, und zwar
   lautlos. Statt zu scrollen teilen sich die Kennzahl-Widgets deshalb den
   Platz und werden schmaler (min-width:0). Erst unter 900 px, wo das Popover
   als festes Blatt am unteren Rand erscheint und nichts mehr abgeschnitten
   werden kann, scrollt die Leiste waagerecht. */
.ck-w{position:relative;display:flex;flex-direction:column;justify-content:center;
  gap:2px;flex:1 1 0;min-width:124px;min-height:var(--ck-w-hoehe);padding:6px 10px;
  background:var(--sr-surface);border:0;border-radius:var(--sr-r-card);
  box-shadow:var(--edge),var(--sr-e1);
  transition:box-shadow var(--t-fast) var(--ease)}
.ck-w:hover{box-shadow:var(--edge),var(--sr-e-modal)}
/* Das Zeitraum-Widget richtet sich nach seinem Inhalt (Datumsanzeige,
   Vergleichsspanne, Tage-Optionen) und waechst nicht mit; die
   Kennzahl-Widgets teilen sich den Rest zu gleichen Teilen.
   EINE ZEILE (Umbau 12.09.2026): Auslöser, Vergleichsspanne und
   Tage-Optionen liegen als Geschwister nebeneinander, mittig zueinander —
   bis dahin waren es zwei gestapelte Zeilen (.ck-zeitzeile/.ck-zeitfuss,
   beide restlos entfallen). Das kostet Breite, deshalb sinkt unten die
   Mindestbreite der Kennzahl-Widgets. */
.ck-w--zeitraum{flex:0 0 auto;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--s1)}
.ck-zf{display:flex;flex-direction:column;gap:0;flex:none}
.ck-zf-label{font-size:var(--fs-label);font-weight:var(--fw-ui);line-height:1.1;
  letter-spacing:.04em;text-transform:uppercase;color:var(--sr-mut)}
.ck-zf-wert{font-family:var(--font-num);font-size:var(--fs-small);font-weight:var(--fw-bold);
  line-height:1.2;font-variant-numeric:tabular-nums;color:var(--sr-ink);white-space:nowrap}
/* Die Vergleichsspanne traegt ihr Label wie Start und Ende UEBER dem Wert:
   nebeneinander braeuchte „VERGLEICH" rund 60 px zusaetzlich in derselben
   Zeile, gestapelt ist das Label schmaler als der Wert und kostet nichts. */
.ck-zf--vergleich{min-width:0}
.ck-zf--vergleich .ck-zf-wert{overflow:hidden;text-overflow:ellipsis}
/* Trenner: der Gedankenstrich zwischen Start und Ende sitzt auf der Hoehe
   der beiden Werte (die Labels stehen darueber), die Mittelpunkte zwischen
   den drei Gruppen mittig im Widget. */
.ck-zeit-bis{flex:none;align-self:flex-end;padding-bottom:1px;
  font-size:var(--fs-small);line-height:1.2;color:var(--sr-mut)}
.ck-zeit-punkt{flex:none;font-size:var(--fs-small);line-height:1;color:var(--sr-mut);opacity:.6}
/* Die vier Kennzahl-Widgets duerfen schmaler werden als die 124 px der
   Grundform: das einzeilige Zeitraum-Widget belegt rund 150 px mehr, und
   die Leiste soll trotzdem bei 1280 px EINE Zeile bleiben. Die Beschriftung
   kuerzt zur Not mit Auslassungspunkten (ck-w-label), die Zahl nie. */
.ck-w--kpi{min-width:96px;padding:6px 8px}
/* Jeder Punkt zaehlt in der Kopfzeile: „SICHTBARKEIT" misst 82 px, und was
   das ⓘ daneben belegt, fehlt der Beschriftung. In der Leiste ist es
   deshalb 18 statt 24 px breit und steht dichter am Text — das Zeichen
   darin bleibt unveraendert gross und die Trefferflaeche reicht weiter als
   der Kasten, weil die ganze Kachel auf den Zeiger reagiert. */
.ck-w--kpi .ck-w-kopf{gap:2px}
.ck-w--kpi .sr-kpi-info,
.ck-w--zeitraum .sr-kpi-info{width:18px;height:18px}

/* Der Auslöser des Zeitraum-Popovers: sieht aus wie die Datumsangabe, ist
   aber ein Knopf — Kalenderblatt, Start und Ende nebeneinander. */
.ck-zeitknopf{display:inline-flex;align-items:center;gap:var(--s0);
  padding:1px var(--s0);margin:0;border:1px solid transparent;border-radius:var(--sr-r-xs);
  background:none;font:inherit;color:inherit;cursor:pointer;text-align:left;
  transition:background var(--t-fast) var(--ease),border-color var(--t-fast) var(--ease)}
.ck-zeitknopf:hover,.ck-zeitknopf[aria-expanded="true"]{background:var(--sr-soft);border-color:var(--sr-hair)}
.ck-zeitknopf:focus-visible{outline:2px solid var(--focus-ton);outline-offset:1px}
.ck-zeit-symbol{width:14px;height:14px;flex:none;color:var(--sr-mut)}
.ck-zeitknopf[aria-expanded="true"] .ck-zeit-symbol{color:var(--knopf-blau)}

/* Im Popover ist Platz: dort stehen die Felder untereinander mit dem
   gefuellten Übernehmen-Knopf und dem Satz, was erlaubt ist. */
.ck-zeit-panel .ck-zeitform{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--s2);margin:0}
.ck-zeitfeld{display:flex;flex-direction:column;gap:2px;flex:1 1 140px}
.ck-zeitfeld-label{font-size:var(--fs-label);font-weight:var(--fw-ui);
  letter-spacing:.04em;text-transform:uppercase;color:var(--sr-mut)}
/* Das Feld fuellt seine Spalte; Hoehe und Rahmen kommen aus der
   allgemeinen Formularregel in sr.css — im Popover ist dafuer Platz. */
.ck-zeitfeld .ck-zf-feld{width:100%;font-family:var(--font-num)}
.ck-zeit-uebernehmen{flex:0 0 auto}
/* Vergleichsspanne im Popover statt in der Leiste (Betreiber-Entscheid
   14.09.2026, siehe app/views/cockpit.js leisteZeitraum()). Gleiche
   Bausteine (.ck-zf-label/.ck-zf-wert) wie zuvor in der Leiste, jetzt in
   einer eigenen Zeile zwischen Formular und Hinweistext. */
.ck-zeit-vergleich{display:flex;align-items:baseline;gap:var(--s1);
  margin:var(--s2) 0 0;font-size:var(--fs-small)}
.ck-zeit-vergleich .ck-zf-label{font-size:var(--fs-label)}
.ck-zeit-hinweis{margin:var(--s2) 0 0;font-size:var(--fs-small);color:var(--sr-mut);line-height:1.45}
/* NACH RECHTS AUFKLAPPEN: die ⓘ-Panels haengen rechtsbuendig unter ihrem
   Knopf, weil ihre Kacheln rechts in der Reihe stehen koennen. Das
   Zeitraum-Widget steht immer GANZ LINKS — rechtsbuendig liefe sein Panel
   ueber den linken Rand der Buehne in die Navigation hinein. Nur im
   Popover-Bild: unter 900 px ist das Panel ein Blatt ueber die volle Breite
   und braucht beide Kanten. */
@media (min-width:900px){
  .ck-zeit-panel{right:auto;left:0}
}

/* Die Tage-Optionen in Leistenmass: die Grundform ist auf 44 px Mindestbreite
   je Segment gebaut (Fingerkuppe), drei davon nehmen 140 px. In der Leiste
   bleiben 34 x 24 px — ueber dem geforderten Mindestziel von 24 x 24 px
   (WCAG 2.2, 2.5.8) und schmal genug, dass das Widget unter 300 px bleibt. */
.ck-w--zeitraum .sr-zeitraum{margin:0;width:auto;flex:none;padding:1px}
.ck-w--zeitraum .sr-zeitraum-seg{min-height:24px;min-width:30px;padding:2px 3px;
  font-size:var(--fs-label);white-space:nowrap}

.ck-w-kopf{display:flex;align-items:center;gap:var(--s0);min-width:0}
/* 10,5 px statt des Label-Tokens: die Kachel ist 128 px breit, und
   „SICHTBARKEIT" passt bei der Token-Groesse um wenige Punkte nicht mehr
   hinein. Dieselbe Groesse tragen die kompakten KPI-Kacheln in sr.css. */
.ck-w-label{font-size:10.5px;font-weight:var(--fw-ui);line-height:1.2;
  letter-spacing:.03em;text-transform:uppercase;color:var(--sr-mut);
  flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ck-w-zeile{display:flex;align-items:baseline;gap:var(--s1);min-width:0}
.ck-w-wert{min-width:0;font-family:var(--font-num);font-size:var(--fs-kpi-compact);line-height:1.1;font-weight:var(--fw-black);
  letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--sr-ink);overflow-wrap:anywhere}
.ck-w-wert--leer{color:var(--sr-mut)}
/* Sichtbarkeit des ⓘ: sr-bausteine.css, Block „Widget-Werkzeuge". */
.ck-w .ck-w-kopf{position:relative;z-index:2}

/* --------------------------------------------------------------- Charts --- */
/* EIN Chart ueber die volle Breite, direkt unter der Leiste (12.09.2026).
   Bis dahin standen hier zwei Karten nebeneinander (Kanal-Stapel breit,
   Vergleichskurve schmal); die Vergleichskurve liegt jetzt als graue Linie
   im Kanal-Chart selbst. Die Spalte bleibt ein Grid: die Reihe traegt
   weiterhin genau eine Karte, und eine zweite koennte dort ohne Umbau
   wieder Platz finden. Die beiden `grid-template-columns`-Wiederholungen in
   den Medienabfragen (899 px und 1100 px) setzten danach denselben Wert
   noch einmal und sind am 12.09.2026 entfernt. */
.ck-charts{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--sr-gap-kpi);align-items:start}
.ck-charts>.sr-karte{margin-bottom:0}
/* Titel und Werkzeuge teilen eine Zeile; der Chart erbt nur den Kartenrand. */
#cockpit-besuche>.sr-karte-kopf{padding:6px 18px 0;align-items:center;gap:8px}
#cockpit-besuche>.sr-karte-kopf>.sr-karte-titel{flex:0 0 auto;min-width:0}
#cockpit-besuche>.sr-karte-kopf>.chart-kopf{flex:1 1 0;min-width:0;margin:0;gap:8px}
#cockpit-besuche>.sr-karte-kopf>.sr-erklaerung{margin-left:0}
#cockpit-besuche>.sr-karte-koerper{padding:0 18px 4px}
#cockpit-besuche .chart-dynamisch,#cockpit-besuche .chart-wrap{margin:0;padding:0}
#cockpit-besuche .chart-griff{margin:0}
#cockpit-besuche .chart-leg-item{gap:4px;padding-left:2px;padding-right:2px}
@media(max-width:899px){
  #cockpit-besuche>.sr-karte-kopf>.sr-karte-titel{flex:1}
  #cockpit-besuche>.sr-karte-kopf>.chart-kopf{order:3;flex-basis:100%}
}
/* Audi-Mosaik: drei Ringkarten flankieren drei kompakte Zahlen-Spalten. */
.ck-mosaik{display:grid;grid-template-columns:minmax(168px,1fr) repeat(3,minmax(0,1fr)) minmax(168px,1fr) minmax(168px,1fr);grid-template-rows:repeat(3,minmax(0,1fr));gap:var(--sr-gap-kpi);align-items:stretch}
.ck-mosaik>.ck-donut{grid-row:1 / span 3;min-height:0}
.ck-mosaik>.ck-donut:nth-of-type(1){grid-column:1}
.ck-mosaik>.ck-donut:nth-of-type(3){grid-column:5}
.ck-mosaik>.ck-donut:nth-of-type(4){grid-column:6}
.ck-mosaik-zahlen{grid-column:2 / span 3;grid-row:1 / span 3;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-template-rows:repeat(3,minmax(0,1fr));gap:var(--sr-gap-kpi);min-width:0}
.ck-mosaik-kpi{position:relative;display:flex;flex-direction:column;gap:var(--s1);min-width:0;min-height:0;padding:var(--s2) var(--s2) var(--s1);background:var(--sr-surface);border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);box-shadow:var(--sr-e1)}
.ck-mosaik-kpi:hover{box-shadow:var(--sr-e-modal)}
.ck-mosaik-zeile{display:flex;align-items:baseline;gap:var(--s1);min-width:0}
.ck-mosaik-wert{min-width:0;font-family:var(--font-num);font-size:var(--fs-kpi-compact);line-height:1.05;font-weight:var(--fw-black);font-variant-numeric:tabular-nums;color:var(--sr-ink);overflow-wrap:anywhere}
.ck-mosaik-wert--leer{color:var(--sr-mut)}
.ck-mosaik-delta{font-size:var(--fs-small);font-weight:var(--fw-ui);white-space:nowrap}
.ck-ring-wrap{position:relative;display:grid;place-items:center;flex:none;width:min(200px,calc(100% + 16px));aspect-ratio:1;align-self:center;margin:0 -8px}
.ck-ring-wrap .ck-ring{grid-area:1/1;width:100%;height:100%}
.ck-ring-inhalt{grid-area:1/1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--s0);max-width:112px;text-align:center}
.ck-ring-inhalt .ck-donut-wert{font-size:var(--fs-kpi-standard);overflow-wrap:anywhere}
.ck-ring-inhalt .ck-delta{font-size:var(--fs-label)}
.ck-donut-basis{font-size:var(--fs-label);color:var(--sr-mut);line-height:1.3}
.ck-donut-ohne-ring{display:flex;align-items:baseline;gap:var(--s1);min-height:144px;padding-top:var(--s2)}
.ck-donut-anteile{text-align:center;line-height:1.4}
.ck-donut .ck-meta{margin-top:auto}

/* Schmaler Schirm: die Widgets behalten ihre Breite und die Leiste scrollt —
   Umbruch waere eine zweite Zeile, und genau die sollte verschwinden. */
@media (max-width:899px){
  .ck-leiste{flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;padding-bottom:calc(var(--s2) + 2px)}
  .ck-leiste>.ck-w{flex:0 0 auto;min-width:150px}
}

/* Das Zeitraum-Widget STEHT AUCH ALLEIN (app/views/projekt.js zeitkopf() und
   kwStandHtml) — dort traegt keine .ck-leiste den waagerechten Scroll-
   Rahmen von oben, und die vier Gruppen (Ausloeser, Vergleich, Tage-
   Optionen, ⓘ) liefen bei 390 px unausweichlich ueber die Kante: ihre
   Summenbreite in EINER Zeile lag bei rund 590 px. Ab 600 px bricht die
   Zeile deshalb sauber um; darueber bleibt sie unveraendert eine Zeile
   (Betreiber-Auftrag 14.09.2026). Der Mittelpunkt VOR einer neuen Zeile
   verschwindet mit ihr statt verwaist am Zeilenanfang zu stehen. */
@media (max-width:600px){
  .ck-w--zeitraum{flex-wrap:wrap;row-gap:var(--s1)}
  .ck-w--zeitraum .ck-zeit-punkt{display:none}
}

@media (max-width:1100px){
  .ck-mosaik{grid-template-columns:repeat(3,minmax(0,1fr));grid-template-rows:auto}
  .ck-mosaik>.ck-donut{grid-column:auto!important;grid-row:auto;min-height:260px}
  .ck-mosaik-zahlen{grid-column:1 / -1;grid-row:auto;grid-template-rows:repeat(3,minmax(0,1fr))}
}
@media (max-width:600px){
  .ck-mosaik{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ck-mosaik>.ck-donut{min-height:0}
  .ck-mosaik-zahlen{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:auto}
}

/* -------------------------------------------------------------- Karte ---- */
.ck-karte{position:relative;background:var(--sr-surface);border:0;border-radius:var(--sr-r-card);
  box-shadow:var(--edge),var(--sr-e1);padding:18px 18px var(--s3);
  display:flex;flex-direction:column;gap:var(--s1);min-width:0;min-height:132px;
  transition:box-shadow var(--t-fast) var(--ease),transform var(--t-fast) var(--ease)}
.ck-karte:hover{box-shadow:var(--edge),var(--sr-e-modal);transform:translateY(-2px)}
.ck-karte--link{cursor:pointer}
.ck-kachel-link{position:absolute;inset:0;border-radius:inherit;z-index:1}
.ck-kachel-link:focus-visible{outline:2px solid var(--focus-ton);outline-offset:2px}
.ck-karte--link .ck-kachel-kopf{position:relative;z-index:2}

/* DER PLATZ BIS ZUM ⓘ IST RESERVIERT (Befund 12.09.2026). Die Beschriftung
   war ein umbrechender Block ohne Ueberlaufregel: „SUCHANFRAGEN" lief in
   eine zweite Zeile unter das ⓘ, „KI-NENNUNGEN" brach mitten im Wort um.
   Jetzt haelt der Knopf seine Breite (flex:none), die Beschriftung nimmt den
   Rest (flex:1, min-width:0) und endet zur Not mit Auslassungspunkten — eine
   Zeile, kein Ueberlappen. Der volle Name steht am title der Kachel und im
   ⓘ-Popover. */
.ck-kachel-kopf{display:flex;align-items:center;gap:var(--s1);min-width:0;flex-wrap:nowrap}
.ck-kachel-kopf>.sr-erklaerung{flex:none;margin-left:auto}
.ck-label{font-size:var(--fs-label);font-weight:var(--fw-ui);line-height:1.3;
  letter-spacing:.08em;text-transform:uppercase;color:var(--sr-mut);flex:1 1 auto;min-width:0;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ck-meta{font-size:var(--fs-small);font-weight:var(--fw-body);line-height:1.45;
  color:var(--sr-mut);margin-top:auto}

/* ---------------------------------------------------------- Donut-Kachel - */
.ck-donut-zeile{display:flex;align-items:center;justify-content:space-between;gap:var(--s2);margin-top:2px}
.ck-donut-wert{font-family:var(--font-num);font-size:34px;line-height:1.05;font-weight:var(--fw-black);
  letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--sr-ink)}
.ck-donut-wert--leer{color:var(--sr-mut)}
.ck-donut-anteile{font-size:var(--fs-small);color:var(--sr-mut);margin-top:var(--s0)}
.ck-ring{flex:none}
/* SPUR NEUTRAL, FUELLBOGEN IN DER MARKENFARBE (Umbau 12.09.2026). Vorher
   war die Spur die Knopffarbe mit 28 % Deckkraft und der Bogen der
   Akzentton — zwei Blautoene uebereinander, in denen der Ring die Farbe des
   Mandanten nirgends trug. Jetzt ist die Spur die neutrale Haarlinie und der
   Bogen --sr-marke (app/views/layout.js setzt sie aus design.primary des
   Mandanten; Mandanten ohne eigenes Design bekommen dort die Hausfarbe).
   BUTT STATT ROUND: der abgerundete Bogen legte sich ueber den Anfang der
   Spur und liess den Ring innen eckig wirken. */
.ck-ring-spur{fill:none;stroke:var(--sr-hair);stroke-linecap:butt}
.ck-ring-wert{fill:none;stroke:var(--sr-marke,var(--sr-acc));stroke-linecap:butt}

/* ------------------------------------------------------------- Delta-Pille */
.ck-delta{display:inline-flex;align-items:center;gap:var(--s-2);border-radius:var(--sr-r-xs);
  padding:var(--s-2) var(--s1);font-size:var(--fs-small);font-weight:var(--fw-ui);
  line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}
.ck-delta--gut{color:var(--sr-ok-ink);background-color:var(--green-dim)}
.ck-delta--schlecht{color:var(--sr-err-ink);background-color:var(--red-dim)}
.ck-delta--neutral{color:var(--sr-mut);background-color:var(--sr-soft)}

/* --------------------------------------------------------- Kanal-Chart --- */
/* Reine Struktur — Farben tragen die `farbe`-Tokenrollen je Gruppe (siehe
   app/lib/cockpit.js KANAL_GRUPPEN), das Chart selbst rendert charts.js. */

/* ------------------------------------------------------- Seiten-Analyse -- */
.ck-reiter{display:inline-flex;gap:var(--s3);border-bottom:1px solid var(--sr-hair)}
.ck-reiter-tab{padding:var(--s1) 2px var(--s0);border:0;border-bottom:2px solid transparent;
  background:none;font:inherit;font-size:var(--fs-ui);font-weight:var(--fw-ui);color:var(--sr-mut);
  cursor:pointer;margin-bottom:-1px}
.ck-reiter-tab:hover{color:var(--sr-ink)}
.ck-reiter-tab[aria-selected="true"]{color:var(--sr-ink);border-bottom-color:var(--knopf-blau)}
.ck-reiter-tab:focus-visible{outline:2px solid var(--focus-ton);outline-offset:2px}

.ck-schalter-zeile{display:flex;flex-wrap:wrap;gap:var(--s2);margin-left:var(--s3)}
.ck-schalter{display:inline-flex;align-items:center;gap:var(--s1);padding:var(--s0) var(--s1) var(--s0) 4px;
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-pill);background:var(--sr-soft);
  font:inherit;font-size:var(--fs-small);font-weight:var(--fw-ui);color:var(--sr-mut);cursor:pointer}
.ck-schalter::before{content:"";width:14px;height:14px;flex:none;border-radius:50%;
  background-color:var(--sr-surface);border:1px solid var(--sr-hair);transition:background-color var(--t-fast) var(--ease),border-color var(--t-fast) var(--ease)}
.ck-schalter[aria-pressed="true"]{color:var(--sr-ink);background:var(--sr-surface);border-color:var(--knopf-blau)}
.ck-schalter[aria-pressed="true"]::before{background-color:var(--knopf-blau);border-color:var(--knopf-blau)}
.ck-schalter:focus-visible{outline:2px solid var(--focus-ton);outline-offset:2px}

.ck-seiten-gitter{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sr-gap-kpi)}
.ck-seite{display:flex;flex-direction:column;background:transparent;border:0;
  border-radius:0;overflow:hidden;color:inherit;text-decoration:none;
  transition:box-shadow var(--t-fast) var(--ease),transform var(--t-fast) var(--ease)}
.ck-seite:hover{background:var(--sr-soft);text-decoration:none}
.ck-seite:focus-visible{outline:2px solid var(--focus-ton);outline-offset:-2px}
.ck-seite[hidden]{display:none}

.ck-seite-bild{display:block;width:100%;height:150px;object-fit:cover;background:var(--sr-soft)}
.ck-seite-bild--leer{display:flex;align-items:center;justify-content:center;
  background:linear-gradient(160deg,var(--sr-soft),var(--sr-bg))}
.ck-seite-bild--leer span{font-family:var(--font-num);font-size:44px;font-weight:var(--fw-black);color:var(--sr-mut)}

.ck-seite-koerper{display:flex;flex-direction:column;gap:var(--s0);padding:var(--s2) var(--s3) var(--s3)}
.ck-seite-kopf{display:flex;align-items:center;gap:var(--s1)}
.ck-seite-pfad{font-size:var(--fs-small);color:var(--sr-mut);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ck-seite-titel{font-size:var(--fs-ui);font-weight:var(--fw-ui);color:var(--sr-ink);line-height:1.3}
.ck-seite-besch{font-size:var(--fs-small);color:var(--sr-mut);line-height:1.45}
.ck-seite-chips{display:flex;flex-wrap:wrap;gap:var(--s0)}
.ck-seite-zahlen{display:flex;flex-wrap:wrap;gap:var(--s2) var(--s3);margin-top:var(--s0);
  font-size:var(--fs-small);color:var(--sr-mut)}
.ck-seite-zahlen strong{font-variant-numeric:tabular-nums;color:var(--sr-ink);font-weight:var(--fw-bold)}
.ck-seite-d{font-size:var(--fs-label);margin-left:2px}
.ck-seite-d--gut{color:var(--sr-ok-ink)}
.ck-seite-d--schlecht{color:var(--sr-err-ink)}

.ck-mehr{margin-top:var(--s3)}
.ck-mehr[hidden]{display:none}

@media (max-width:899px){
  .ck-seiten-gitter{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:559px){
  .ck-seiten-gitter{grid-template-columns:1fr}
  .ck-schalter-zeile{margin-left:0}
}

/* -------------------------------------------------------- Bewegung aus --- */
@media (prefers-reduced-motion:reduce){
  .ck-karte,.ck-w,.ck-seite,.ck-schalter::before{transition:none}
}

@media(max-width:600px){
  .ck-mosaik{grid-template-columns:minmax(0,1fr)}
  .ck-mosaik>.ck-donut{min-height:220px}
  .ck-mosaik-zahlen{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ck-mosaik .ck-meta{font-size:var(--fs-label)}
}

.ck-mosaik-kpi{padding:10px 12px;gap:6px}
.ck-mosaik-kpi .ck-meta{font-size:var(--fs-label);margin-top:6px}
.ck-mosaik-kpi .ck-label{letter-spacing:.04em}
.ck-mosaik-zeile{flex-wrap:wrap}
.ck-mosaik-kpi .ck-kachel-kopf{position:relative;z-index:2}

/* ==================================================== Reihe Express Briefing
 * Zwei Karten in EINER Reihe (Umbau 12.09.2026): links das Express Briefing
 * ueber zwei Kachelbreiten, rechts die Kanal-Bilanz ueber vier. Die Reihe
 * traegt DASSELBE Sechs-Spalten-Raster und denselben Gap wie .ck-mosaik
 * darunter — die Kartenkanten stehen damit senkrecht auf denen des Mosaiks.
 * Aendert sich das Raster dort, gehoert es hier mit.
 *
 * align-items:start, damit eine eingeklappte Karte auf ihren Streifen
 * zusammenfaellt statt sich auf die Hoehe der Nachbarin zu strecken.
 */
.ck-briefing{display:grid;
  grid-template-columns:minmax(168px,1fr) repeat(3,minmax(0,1fr)) minmax(168px,1fr) minmax(168px,1fr);
  gap:var(--sr-gap-kpi);align-items:start}
.ck-briefing>.sr-karte:nth-child(1){grid-column:1 / span 2}
.ck-briefing>.sr-karte:nth-child(2){grid-column:3 / span 4}
/* Nur EINE Karte da (kein Briefing oder keine Kanaldaten): sie nimmt die
   volle Breite — zwei Sechstel Karte neben vier Sechsteln Nichts waere kein
   Raster, sondern ein Loch. */
.ck-briefing--eins{grid-template-columns:minmax(0,1fr)}
.ck-briefing--eins>.sr-karte:nth-child(1){grid-column:1}

/* Untereinander ab 1100 px — dieselbe Schwelle, an der auch die Chart-Reihe
   darueber auf eine Spalte faellt. */
@media (max-width:1100px){
  .ck-briefing{grid-template-columns:minmax(0,1fr)}
  .ck-briefing>.sr-karte:nth-child(1),
  .ck-briefing>.sr-karte:nth-child(2){grid-column:1}
}

/* ---- Die Briefing-Karte ist SCHMAL, egal wie breit das Fenster ist ----
 *
 * BEFUND 12.09.2026, gemessen am Dashboard von gigahertz.de bei 1440 px:
 * die Karte „Express Briefing" ist 350 px breit, ihr Inhalt war 536 px
 * breit. Der Satz „Pruef-Score 43/100 …" lief durch den rechten Rand, und
 * der Link „Technik & Ladezeiten → Audit & Verlauf →" stand vollstaendig
 * ausserhalb der Karte — auf der Kopfzeile der Kanal-Bilanz daneben.
 *
 * DIE URSACHE IST EINE BREAKPOINT-VERWECHSLUNG. Die Themenzeile
 * (produkt-polish.css .sr-thema-liste>.sr-thema) ist ein Raster aus drei
 * Spalten mit Mindestbreiten: 150 + 220 + 100 px plus zweimal 24 px
 * Zwischenraum = 518 px. Sie stapelt sich erst, wenn das FENSTER schmal
 * wird — und das Fenster ist hier 1440 px breit. Eine Karte, die nur ein
 * Sechstel davon bekommt, wird von einer Fensterabfrage nie erreicht.
 *
 * DESHALB HIER UND NICHT DORT: die Zeile bleibt in ihren anderen
 * Einsatzorten dreispaltig; nur innerhalb der Briefing-Reihe faellt sie auf
 * eine Spalte. Die Spezifitaet (0,3,0) gewinnt gegen die Grundregel (0,2,0)
 * unabhaengig von der Ladereihenfolge der beiden Dateien.
 *
 * `min-width:0` an der Karte ist der zweite Riegel: ein Rasterelement
 * schrumpft von sich aus nicht unter die Mindestbreite seines Inhalts und
 * waechst dann in die Nachbarspalte hinein, ohne dass irgendwo ein
 * Ueberlauf gemeldet wuerde.
 */
.ck-briefing>.sr-karte{min-width:0}
.ck-briefing .sr-thema-liste>.sr-thema{grid-template-columns:minmax(0,1fr);
  column-gap:0;row-gap:4px}
.ck-briefing .sr-thema-liste .sr-thema-kopf{flex-direction:row;flex-wrap:wrap;
  align-items:center}
.ck-briefing .sr-thema-liste .sr-thema-link{grid-column:1;justify-self:start;
  text-align:left}
.ck-briefing .sr-thema-satz{overflow-wrap:anywhere}

/* ------------------------------------------------------- Kanal-Bilanz --- */
/* Vier Zeilen: Name, Balkenspur, Wert, Δ-Pille. Die Spur ist ein SVG mit
   viewBox 0 0 100 20 und preserveAspectRatio="none" — die Balkenlaenge ist
   damit die Prozentzahl als `width`-ATTRIBUT am <rect>, also Geometrie und
   kein Stilattribut (die CSP verwirft style= lautlos). Die Hoehe steht hier
   fest bei 20 px, damit y/height im SVG Pixel bleiben. */
.ck-bilanz{display:flex;flex-direction:column;gap:var(--s2)}
.ck-bilanz-zeile{display:grid;grid-template-columns:minmax(96px,150px) minmax(0,1fr) auto auto;
  align-items:center;gap:var(--s2);min-width:0}
.ck-bilanz-name{font-size:var(--fs-small);font-weight:var(--fw-ui);color:var(--sr-ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.ck-bilanz-spur{display:block;width:100%;height:20px;min-width:0}
.ck-bilanz-wert{font-family:var(--font-num);font-size:var(--fs-ui);font-weight:var(--fw-bold);
  font-variant-numeric:tabular-nums;color:var(--sr-ink);text-align:right;min-width:56px}
.ck-bilanz-delta{min-width:64px;text-align:right}
.ck-bilanz-satz{margin:var(--s3) 0 0;font-size:var(--fs-small);color:var(--sr-mut);line-height:1.45}
/* Die Farbrollen sind dieselben wie im Kanal-Chart (app/lib/cockpit.js
   KANAL_GRUPPEN `farbe`) — je Gruppenschluessel eine Klasse, weil eine
   Farbe als Praesentationsattribut am <rect> je nach Engine nicht aus den
   Tokens aufloest. Kommt eine Gruppe hinzu, gehoert sie hier dazu. */
.ck-bilanz-seg--suche{fill:var(--series-1)}
.ck-bilanz-seg--ki{fill:var(--series-2)}
.ck-bilanz-seg--social{fill:var(--series-3)}
.ck-bilanz-seg--direkt{fill:var(--series-4)}
.ck-bilanz-seg--vor{fill:var(--sr-mut);opacity:.45}

/* --------------------------------------------------- Karten einklappen --- */
/* Der Klapp-Knopf haengt app/views/app.js (Baustein 23) in den Kartenkopf —
   ohne JavaScript stehen beide Karten offen, und das ist die richtige
   Voreinstellung. `order` setzt ihn VOR das ⓘ, egal in welcher Reihenfolge
   er eingehaengt wurde. */
/* EINE ZEILE IM KARTENKOPF (Befund 12.09.2026). Die Grundform bricht um
   (`flex-wrap:wrap`) und gibt dem Titel 220 px Mindestbreite — in der 350 px
   breiten Briefing-Karte landeten Meta und Knoepfe dadurch in einer zweiten
   Zeile, und die zugeklappte Karte war 91 statt 60 px hoch, also 31 px
   hoeher als ihre Nachbarin. In dieser Reihe laeuft der Kopf deshalb ohne
   Umbruch: Titel und Meta teilen sich den Platz und enden zur Not mit
   Auslassungspunkten, Chevron und ⓘ behalten ihre Breite. Damit sind beide
   Streifen gleich hoch. */
.ck-briefing .sr-karte-kopf{align-items:center;flex-wrap:nowrap}
/* DER KARTENNAME SCHRUMPFT NICHT (flex-shrink 0): „Express Briefing" endete
   sonst als „Express Briefi…", weil Flexbox den Fehlbetrag auf alle
   schrumpfbaren Teile verteilt. Der Name ist die Ueberschrift der Karte —
   was nachgibt, ist die Stand-Zeile daneben. Die Auslassungspunkte bleiben
   als letzte Sicherung stehen. */
.ck-briefing .sr-karte-kopf .sr-karte-titel{flex:1 0 auto;min-width:0;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* DIE META GIBT ZUERST NACH: wird der Platz knapp, soll der Kartenname
   ganz dastehen und die Stand-Zeile daneben kuerzen — nicht umgekehrt. Der
   hohe Schrumpffaktor sorgt genau dafuer (Flexbox verteilt den Fehlbetrag
   nach Basisbreite MAL Faktor). */
.ck-briefing .sr-karte-meta{flex:0 20 auto;min-width:0;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ck-briefing .ck-klapp,
.ck-briefing .sr-karte-kopf .sr-erklaerung{flex:none}
.ck-briefing .sr-karte-meta{order:1}
.ck-briefing .ck-klapp{order:2}
.ck-briefing .sr-karte-kopf .sr-erklaerung{order:3;margin-left:var(--s1)}
/* Das ⓘ der Karten ist derselbe Knopf wie an den Kacheln (ui.herkunftKnopf
   ueber werkzeugeHtml) — bis zum 12.09.2026 stand dort der Textlink „Wie
   gerechnet wird", rund 120 px, die im 350 px breiten Briefing-Kopf in eine
   eigene Zeile rutschten. Es steht gedaempft da und wird beim Ueberfahren
   der Karte deutlich, genau wie in der Leiste. */
.ck-klapp{display:inline-flex;align-items:center;justify-content:center;flex:none;
  width:28px;height:28px;margin-left:var(--s1);padding:0;border:0;border-radius:var(--sr-r-xs);
  background:none;color:var(--sr-mut);cursor:pointer;
  transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease)}
.ck-klapp:hover{background:var(--sr-soft);color:var(--sr-ink)}
.ck-klapp:focus-visible{outline:2px solid var(--focus-ton);outline-offset:1px}
.ck-klapp-pfeil{width:12px;height:12px;display:block;
  transition:transform var(--t-med) var(--ease)}
.ck-klapp[aria-expanded="false"] .ck-klapp-pfeil{transform:rotate(-90deg)}

/* SANFTE HOEHE OHNE FESTE ZAHL: der Schacht ist ein Raster mit EINER Zeile,
   die zwischen 1fr und 0fr wandert. Eine max-height-Loesung braeuchte eine
   geratene Obergrenze — zu klein schneidet sie ab, zu gross laeuft der
   Anfang der Bewegung ins Leere. */
.ck-klapp-schacht{display:grid;grid-template-rows:1fr;
  transition:grid-template-rows var(--t-med) var(--ease)}
.ck-klapp-inhalt{min-height:0}
/* overflow NUR waehrend der Bewegung und im zugeklappten Zustand: dauerhaft
   gesetzt schnitte es ⓘ-Popover ab, die aus dem Kartenkoerper herausragen. */
.ck-klapp-schacht--bewegt>.ck-klapp-inhalt,
.sr-karte[data-ck-zu="1"] .ck-klapp-inhalt{overflow:hidden}
.sr-karte[data-ck-zu="1"]>.ck-klapp-schacht{grid-template-rows:0fr}
/* EINGEKLAPPT: gleicher Rand oben wie unten. Der Kartenkopf traegt sonst
   oben --s3 und unten --s3 minus --s2 (weil der Koerper darunter sein
   eigenes Polster mitbringt) — ohne Koerper bliebe der Streifen unten
   sichtbar knapper als oben. */
.sr-karte[data-ck-zu="1"]>.sr-karte-kopf{padding-bottom:var(--s3);
  transition:padding-bottom var(--t-med) var(--ease)}

@media (prefers-reduced-motion:reduce){
  .ck-klapp,.ck-klapp-pfeil,.ck-klapp-schacht,
  .sr-karte[data-ck-zu="1"]>.sr-karte-kopf{transition:none}
}

/* ---- Dashboard-Flaeche (Betreiber-Auftrag 18.09.2026) -----------------
   Die Bausteine unter der Leiste stehen in einem 12-Spalten-Raster und
   werden vom Sysadmin per Drag & Drop geordnet und in der Breite gezogen
   (labor-client.js, gespeichert je Projekt in flaechen_layouts). Ohne
   gespeichertes Layout: jeder Baustein span 12 in Code-Reihenfolge =
   exakt das bisherige Bild. Hoehe bestimmen die Bausteine selbst
   (data-labor-nur-breite). */
.ck-flaeche{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));
  gap:var(--sr-gap-kpi);align-items:start;min-width:0}
.ck-baustein{position:relative;grid-column:span var(--labor-b,12);min-width:0}
.ck-baustein>.ck-charts{min-width:0}
/* Griffe: erst beim Zeigen auf den Baustein sichtbar, damit das Dashboard
   fuer den Sysadmin nicht dauerhaft nach Baustelle aussieht. */
.ck-greif{position:absolute;top:6px;left:6px;z-index:6;padding:3px 7px;
  border-radius:8px;border:1px solid var(--sr-hair);background:var(--sr-surface);
  color:var(--sr-mut);letter-spacing:-2px;font-size:13px;line-height:1;
  cursor:grab;touch-action:none;user-select:none;opacity:0;
  transition:opacity .12s ease;box-shadow:var(--sr-e1)}
.ck-greif-ecke{position:absolute;right:3px;bottom:3px;z-index:6;width:16px;height:16px;
  border-right:2px solid var(--sr-mut);border-bottom:2px solid var(--sr-mut);
  border-radius:0 0 4px 0;cursor:ew-resize;touch-action:none;opacity:0;
  transition:opacity .12s ease}
.ck-baustein:hover>.ck-greif,.ck-baustein:focus-visible>.ck-greif,
.ck-baustein.ist-gegriffen>.ck-greif{opacity:1}
.ck-baustein:hover>.ck-greif-ecke,.ck-baustein:focus-visible>.ck-greif-ecke,
.ck-baustein.wird-gezogen>.ck-greif-ecke{opacity:1}
.ck-baustein.ist-gegriffen{cursor:grabbing;
  filter:drop-shadow(0 14px 28px rgb(15 23 42 / 26%))}
.ck-baustein:focus-visible{outline:2px solid var(--sr-acc-line,var(--sr-hair));outline-offset:2px;border-radius:var(--sr-r-card)}
/* Schmale Schirme: halbe Bausteine wuerden unlesbar — alles volle Breite */
@media (max-width:900px){.ck-baustein{grid-column:span 12 !important}}

/* ---- Granulare Widgets (Betreiber-Auftrag 18.09.2026 abends) ----------
   Jede Kachel ist ein eigenes Widget; ZWEI Flaechen (Leiste + Hauptteil)
   im 12-Spalten-Raster. Die Vorgabebreite kommt als data-labor-breite aus
   dem Server-Markup (kein style-Attribut, CSP) und wird hier auf die
   CSS-Variable abgebildet; die Mechanik ueberschreibt sie per CSSOM. */
.ck-baustein[data-labor-breite="1"]{--labor-b:1}.ck-baustein[data-labor-breite="2"]{--labor-b:2}
.ck-baustein[data-labor-breite="3"]{--labor-b:3}.ck-baustein[data-labor-breite="4"]{--labor-b:4}
.ck-baustein[data-labor-breite="5"]{--labor-b:5}.ck-baustein[data-labor-breite="6"]{--labor-b:6}
.ck-baustein[data-labor-breite="7"]{--labor-b:7}.ck-baustein[data-labor-breite="8"]{--labor-b:8}
.ck-baustein[data-labor-breite="9"]{--labor-b:9}.ck-baustein[data-labor-breite="10"]{--labor-b:10}
.ck-baustein[data-labor-breite="11"]{--labor-b:11}.ck-baustein[data-labor-breite="12"]{--labor-b:12}
/* Die Leiste wird vom Flex-Band zum Raster, sobald sie eine Flaeche ist;
   ihre Kennzahl-Kacheln behalten die feste Bandhoehe. */
.ck-leiste--flaeche{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));
  gap:var(--sr-gap-kpi);align-items:stretch}
.ck-leiste--flaeche>.ck-baustein{min-width:0}
/* Die Karte füllt ihren Baustein GANZ: der Feinraster-Rest (bis 20 px)
   bleibt sonst als unsichtbarer Streifen unter der Karte stehen, und die
   Zieh-Ecke hängt darunter in der Luft. */
.ck-leiste--flaeche .ck-w,.ck-leiste--flaeche .ck-zeit{width:100%;height:100%}
.ck-leiste--flaeche .ck-greif{top:3px;left:3px;padding:2px 5px;font-size:11px}
/* NICHT KLEBEN (Option am Zeitraum-Widget, st:0 — Betreiber-Auftrag 18.09.,
   Screenshot 2/3): Sticky und Schleier hängen an der Leiste; abgeschaltet
   verhält sie sich wie jede andere Fläche. Nur die Leiste trägt den
   Schleier — Kacheln, die auf die Hauptfläche wandern, sind dort normale
   Widgets ohne Milchglas. */
.ck-leiste--frei{position:static}
.ck-leiste--frei::before{content:none}
/* Einzeln stehende Kacheln fuellen ihr Widget ganz */
.ck-baustein>.ck-mosaik-kpi,.ck-baustein>.ck-donut,.ck-baustein>.ck-karte{height:100%}
.ck-baustein>.sr-kpi-satz,.ck-baustein>.sr-kpi-gitter{margin:0;height:100%}
/* Schrift folgt der Widget-Breite (Betreiber-Auftrag: „Schriftgroessen
   bzw. Charts muessen sich anpassen"). Jedes Widget ist ein Container;
   die Werte skalieren mit cqi zwischen fester Unter- und Obergrenze —
   Charts ziehen ueber ihren ResizeObserver ohnehin nach. */
/* NUR NACH OBEN skalieren (Betreiber-Befund 18.09., Screenshot 2): eine
   Kachel muss sich in der Breite kürzen lassen, OHNE dass ihre Schrift
   schrumpft — die Untergrenze jedes clamp() ist deshalb die normale
   Basisgröße; mehr Breite macht die Zahl größer, weniger Breite nie
   kleiner. Labels und Meta bleiben ganz fest. */
.ck-baustein{container-type:inline-size}
.ck-baustein .ck-mosaik-wert{font-size:clamp(var(--fs-kpi-compact),9cqi,40px)}
.ck-baustein .ck-donut-wert{font-size:clamp(34px,10cqi,44px)}
/* Die Zahl IM Ring wächst nicht mit der Kachel — der Ring ist fix 144 px,
   eine hochskalierte 6-stellige Zahl brach dort um (Befund „128.549"). */
.ck-baustein .ck-ring-inhalt .ck-donut-wert{font-size:var(--fs-kpi-compact)}
.ck-baustein .ck-w-wert{font-size:clamp(var(--fs-kpi-compact),9cqi,34px)}
.ck-baustein .sr-kpi-wert{font-size:clamp(var(--fs-kpi),8cqi,40px)}

/* ---- Auto-Hoehe (Betreiber-Befund 18.09.2026, „zweite kleine Kachelreihe
   unter der ersten") ------------------------------------------------------
   Feines 8-px-Zeilenraster; die Zeilen-Spannweite je Widget setzt
   labor-client.js aus der gemessenen Inhaltshoehe (CSSOM). Kleine Kacheln
   stapeln sich damit neben einer hohen in Unterreihen, und der Leerraum
   unter einer kleinen Reihe ist ein echtes Ablageziel. stretch statt
   start: die Karte fuellt ihre gerundete Spannweite (max. 19 px Luft). */
.ck-flaeche[data-labor-auto-hoehe],.ck-leiste--flaeche[data-labor-auto-hoehe]{
  grid-auto-rows:8px;align-items:stretch}
.ck-flaeche[data-labor-auto-hoehe]>.ck-baustein{min-height:0}

/* ---- Hoehen-Grobraster + fuellende Charts (18.09.2026, Screenshot 1) --
   Die Kachel bestimmt die Hoehe (96-px-Takt, Ecke zieht auch vertikal,
   Doppelklick auf die Ecke = wieder Automatik); Verlaufs-Charts fuellen
   ihre Kachel per Flex, der ResizeObserver in charts.js zieht die
   Zeichnung nach. Der chart-eigene Hoehengriff entfaellt hier — es gibt
   nur EINE Hoehenwahrheit, die Kachel. */
[data-labor-auto-hoehe] .ck-greif-ecke{cursor:nwse-resize}
[data-labor-auto-hoehe] .chart-griff{display:none}
.ck-baustein>.ck-charts{height:100%;display:grid;min-width:0}
.ck-baustein .ck-charts>.sr-karte{display:flex;flex-direction:column;min-height:0}
.ck-baustein .chart-dynamisch{display:flex;flex-direction:column;flex:1;min-height:0}
/* 280 px Mindesthöhe: der Chart ist flexibel — mit einem kleineren
   Minimum kollabierte die Automessung der Kachel auf eben dieses Minimum
   und der Chart stand gequetscht da (Betreiber-Befund 18.09. spät). */
.ck-baustein .chart-dynamisch .chart-live{flex:1;min-height:280px}
/* Donut-Kacheln: Ring haelt sich an die verfuegbare Kachelhoehe */
.ck-baustein>.ck-donut{display:flex;flex-direction:column;min-height:0}
.ck-baustein .ck-donut-zeile{flex:1;min-height:0;display:flex;align-items:center;justify-content:center}
/* KEIN max-height am Ring-Wrap: 100 % der (bei der Messung 8 px kleinen)
   Zelle kollabierte die Inhaltsmessung zirkulär — der Ring ist ohnehin
   fix bemessen. */

/* ---- Widget-Zahnrad + Donut-Legende/Beschriftung (18.09.2026) ---------- */
/* OHNE KÄSTCHEN (Betreiber-Korrektur 18.09.): nur das Zahnrad-Zeichen,
   gleiche Größe und Zielfläche wie das ⓘ daneben. */
.ck-zahnrad{position:absolute;top:4px;right:26px;z-index:6;width:26px;height:26px;
  display:grid;place-items:center;padding:0;border:0;
  border-radius:var(--sr-r-xs);background:none;color:var(--sr-mut);font-size:16px;
  line-height:1;cursor:pointer;opacity:0;transition:opacity .12s ease}
.ck-zahnrad:hover{background:var(--sr-soft)}
.ck-baustein:hover>.ck-zahnrad,.ck-baustein:focus-within>.ck-zahnrad{opacity:1}
.ck-zahnrad:hover{color:var(--sr-ink)}
.ck-zahnrad-panel{position:absolute;top:0;left:calc(100% + 8px);right:auto;z-index:80;min-width:230px;max-width:280px;
  display:flex;flex-direction:column;gap:var(--s1);padding:var(--s2);
  background:var(--sr-surface);border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-card);box-shadow:var(--sr-e-modal)}
.ck-zahnrad-panel--links{left:auto;right:calc(100% + 8px)}
.ck-zr-kopf{display:flex;align-items:center;justify-content:space-between;gap:var(--s1);
  font-size:var(--fs-small);color:var(--sr-ink)}
.ck-zr-schliessen{flex:none;width:22px;height:22px;display:grid;place-items:center;padding:0;
  border:1px solid var(--sr-hair);border-radius:6px;background:var(--sr-surface);
  color:var(--sr-mut);font-size:11px;line-height:1;cursor:pointer}
.ck-zr-schliessen:hover{color:var(--sr-ink)}
.ck-zr-zeile{display:flex;align-items:center;gap:var(--s1);font-size:var(--fs-small);
  color:var(--sr-ink);cursor:pointer;min-width:0}
.ck-zr-text{flex:1;min-width:0;padding:3px 6px;border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-xs);background:var(--sr-surface);color:var(--sr-ink);
  font:inherit;font-size:var(--fs-small)}
.ck-zr-leer{margin:0;font-size:var(--fs-small);color:var(--sr-mut)}
/* Legende unter dem Ring: Farbkästchen in Ring-Farben */
.ck-donut-legende[hidden]{display:none}
.ck-donut-legende{display:flex;flex-wrap:wrap;gap:var(--s0) var(--s2);
  justify-content:center;font-size:var(--fs-label);color:var(--sr-mut)}
.ck-leg{display:inline-flex;align-items:center;gap:5px;min-width:0}
.ck-leg-farbe{width:10px;height:10px;border-radius:3px;flex:none}
.ck-leg-farbe--wert{background:var(--sr-marke,var(--sr-acc))}
.ck-leg-farbe--rest{background:var(--sr-hair)}
/* Beschriftungslinien am Ring: das SVG darf über seinen Kasten hinaus
   zeichnen, die Linienfarben folgen den Segmenten */
.ck-ring{overflow:visible}
.ck-callout-linie{fill:none;stroke-width:1.2}
.ck-callout-linie--wert{stroke:var(--sr-marke,var(--sr-acc))}
.ck-callout-linie--rest{stroke:var(--sr-mut)}
.ck-callout-text{font-size:10px;fill:var(--sr-mut);font-family:var(--font-num)}

/* ---- Zahnrad im Kachelkopf + Reset (18.09. abends) --------------------
   Das Zahnrad reiht sich rechts neben dem ⓘ in die Kopfzeile ein
   (labor-client.js zahnradEinreihen); absolut bleibt es nur bei Kacheln
   ohne Kopfzeile. Eine leere Subzeile kostet keinen Platz, bis das
   Zahnrad ihr einen Text gibt. */
/* Beide Kopf-Icons gleich groß (Betreiber-Korrektur 18.09.: mindestens
   ⓘ-Größe plus 10 %): 26-px-Zielfläche, 16-px-Zeichen — ⓘ zieht unten mit. */
.ck-zahnrad--kopf{position:static;top:auto;right:auto;width:26px;height:26px;
  margin-left:0;font-size:16px;opacity:.7;box-shadow:none;flex:none}
.ck-baustein:hover .ck-zahnrad--kopf,.ck-zahnrad--kopf:focus-visible{opacity:1}
.ck-baustein .sr-kpi-info{width:26px;height:26px}
.ck-baustein .sr-kpi-info svg{width:16px;height:16px}
.ck-meta--leer:empty{display:none}
.ck-zr-reset{margin-top:var(--s1);padding:5px 10px;border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-xs);background:var(--sr-soft);color:var(--sr-ink);
  font:inherit;font-size:var(--fs-small);cursor:pointer}
.ck-zr-reset:hover{background:var(--sr-surface);box-shadow:var(--sr-e1)}
/* Flächen-Reset wiegt schwerer als der Widget-Reset — gedämpfte Warnfarbe */
.ck-zr-reset--flaeche{margin-top:2px;color:var(--sr-warn-ink,#8a4b00)}

/* ---- Kein Selbst-Wachsen durch Textumbruch (Betreiber 18.09. spät) ----
   Meta-/Anteilszeilen in Widgets brechen nicht um (eine umbrechende
   Subzeile machte die Kachel von allein hoeher als ihre Nachbarn) —
   zu langer Text laeuft rechts in einen Verlauf ins Transparente aus.
   Der volle Wortlaut bleibt im title/ⓘ der Kachel. */
.ck-baustein .ck-meta,.ck-baustein .sr-kpi-meta,.ck-baustein .ck-donut-anteile,
.ck-baustein .ck-donut-basis{
  display:block;white-space:nowrap;overflow:hidden;text-overflow:clip;
  -webkit-mask-image:linear-gradient(to right,#000 calc(100% - 28px),transparent);
  mask-image:linear-gradient(to right,#000 calc(100% - 28px),transparent)}


/* ---- keyword-detail.css ---- */
/* Keyword-Detail: sichtbare Suchwege und ein lesbares Pflegeformular. */
.kw-detail-suche {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--s1);
  margin: 0 0 var(--sr-gap);
  padding: var(--s1) var(--s2);
  border-radius: var(--sr-r-ctl);
  background: var(--sr-soft);
}

.kw-detail-suche-label {
  margin-right: var(--s1);
  color: var(--sr-mut);
  font-size: var(--fs-label);
  font-weight: var(--fw-ui);
}

.kw-bearbeiten {
  display: grid;
  gap: var(--s3);
  margin: 0;
}

.kw-bearbeiten-feld {
  display: grid;
  gap: var(--s1);
  min-width: 0;
}

.kw-bearbeiten-feld--keyword,
.kw-bearbeiten-feld .feld-eingabe {
  width: 100%;
}

.kw-bearbeiten-einordnung {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--s3);
}

.kw-bearbeiten-speichern {
  display: flex;
  justify-content: flex-start;
}

.kw-bearbeiten-speichern .sr-knopf {
  min-height: 38px;
  white-space: nowrap;
}

.kw-detail-status {
  margin-top: var(--s4);
  padding-top: var(--s3);
  border-top: 1px solid var(--sr-hair);
}

.kw-detail-status p {
  margin: 0;
}

.kw-detail-status p + p {
  margin-top: var(--s1);
  color: var(--sr-mut);
}

.kw-detail-status-zeile {
  display: flex;
  align-items: center;
  gap: var(--s2);
}

.kw-detail-status-aktionen {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s2);
  margin-top: var(--s2);
}

.kw-detail-status-aktionen .vw-aktion {
  display: inline-flex;
  margin: 0;
}

.kw-detail-status-aktionen .sr-knopf svg {
  width: 16px;
  height: 16px;
  flex: 0 0 16px;
}

@media (max-width: 480px) {
  .kw-detail-suche {
    align-items: stretch;
  }

  .kw-detail-suche-label {
    flex-basis: 100%;
  }

  .kw-bearbeiten-einordnung {
    grid-template-columns: 1fr;
  }

  .kw-bearbeiten-speichern .sr-knopf,
  .kw-detail-status-aktionen,
  .kw-detail-status-aktionen .vw-aktion,
  .kw-detail-status-aktionen .sr-knopf {
    width: 100%;
  }

  .kw-detail-status-aktionen .sr-knopf {
    justify-content: center;
  }
}

/* Rechtes Keyword-Schubfach: die Detailansicht bleibt serverseitig gerendert. */
.kw-detail-drawer.sr-app {
  --kwd-title-size: var(--fs-kpi);
  --kwd-kpi-value-size: var(--fs-h1);
  --kwd-label-size: var(--fs-label);
  --kwd-radius: var(--sr-r-ctl);
  position: fixed;
  inset: 0 0 0 auto;
  box-sizing: border-box;
  width: min(900px, 100vw);
  max-width: none;
  height: 100dvh;
  max-height: none;
  margin: 0 0 0 auto;
  padding: 0;
  border: 0;
  border-left: 1px solid var(--sr-hair);
  background: var(--surface);
  color: var(--text);
  box-shadow: -24px 0 60px -20px rgb(0 0 0 / .28);
  overflow: hidden;
  flex-direction: column;
}

.kw-detail-drawer:not([open]) { display: none; }
.kw-detail-drawer[open] {
  display: flex;
  animation: kw-detail-ein .28s var(--ease);
}

.kw-detail-drawer::backdrop {
  background: rgb(0 0 0 / .38);
  animation: kw-detail-blende .18s ease-out;
}

.kw-detail-drawer-kopf {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--s3);
  flex: 0 0 auto;
  padding: 18px 24px 14px;
  border-bottom: 1px solid var(--sr-hair);
  background: var(--surface);
}

.kw-detail-drawer-kopf h2 { margin: 6px 0 0; font-size: var(--fs-h2); }
.kw-detail-drawer-zu { width: 40px; height: 40px; border: 1px solid var(--sr-hair); border-radius: var(--sr-r-ctl); background: var(--sr-soft); color: var(--text); font-size: 25px; line-height: 1; cursor: pointer; }
.kw-detail-drawer-zu:hover { background: var(--hover); }
.kw-detail-drawer-aktionen { display: flex; flex-wrap: wrap; gap: var(--s2); align-items: center; flex: 0 0 auto; padding: 10px 24px; border-bottom: 1px solid var(--sr-hair); background: var(--surface); }
.kw-detail-drawer-inhalt { flex: 1 1 auto; min-height: 0; overflow: auto; overscroll-behavior: contain; }
.kw-detail-drawer-inhalt > .section { margin-top: 24px; }
.kw-detail-drawer-inhalt > .section > .section-head { position: static; width: auto; height: auto; overflow: visible; clip: auto; clip-path: none; white-space: normal; }
.kw-detail-drawer-status { min-height: 220px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--s3); padding: 32px; color: var(--sr-mut); text-align: center; }
.kw-detail-drawer-spinner { width: 28px; height: 28px; border: 3px solid var(--sr-hair); border-top-color: var(--accent); border-radius: 50%; animation: kw-detail-drehen .7s linear infinite; }
.kw-detail-drawer-postfehler { margin-top: 20px; }
body.kw-detail-drawer-offen { overflow: hidden; }
html.lenis.lenis-stopped:has(.kw-detail-drawer[open]) { overflow: hidden; }
html:not(.lenis):has(.kw-detail-drawer[open]) { overflow: hidden; }
@keyframes kw-detail-ein { from { opacity: 0; transform: translateX(42px); } }
@keyframes kw-detail-blende { from { background: transparent; } }
@keyframes kw-detail-drehen { to { transform: rotate(360deg); } }

@media (max-width: 720px) {
  .kw-detail-drawer-kopf { padding: 14px; }
  .kw-detail-drawer-aktionen { padding: 9px 14px; }
  .kw-detail-drawer-inhalt { overflow-wrap: anywhere; }
}

@media (prefers-reduced-motion: reduce) {
  .kw-detail-drawer[open], .kw-detail-drawer::backdrop, .kw-detail-drawer-spinner { animation: none; }
}

/* Fixierter Kontext: Name, Einordnung und Kennzahlen bleiben am selben Ort.
   Auch bei langen Namen bleibt unterhalb Platz fuer die eigentlichen Details. */
.kw-detail-drawer-sticky {
  flex: 0 0 auto;
  max-height: 60dvh;
  overflow: auto;
  overscroll-behavior: contain;
  background: var(--sr-surface);
  border-bottom: 1px solid var(--sr-hair);
  box-shadow: 0 5px 16px rgb(0 0 0 / .035);
  z-index: 2;
}
.kw-detail-drawer-sticky .kw-detail-drawer-kopf { position: relative; display: block; padding: 22px 24px 12px; border: 0; }
.kw-detail-drawer-sticky .kw-detail-drawer-zu { position: absolute; top: 16px; right: 16px; width: 36px; height: 36px; }
.kw-detail-kopfzeile { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 16px; padding-right: 52px; }
.kw-detail-name-info { min-width: 0; flex: 1 1 350px; }
.kw-detail-name-info > summary { display: block; list-style: none; cursor: pointer; border-radius: var(--kwd-radius); white-space: normal; }
.kw-detail-name-info > summary::-webkit-details-marker { display: none; }
.kw-detail-drawer-kopf #kw-detail-drawer-titel { display: block; margin: 0; font-size: var(--kwd-title-size); line-height: 1.2; font-weight: 700; letter-spacing: -.025em; overflow-wrap: anywhere; }
.kw-detail-name-hinweis { margin-top: 8px; padding: 10px 12px; background: var(--sr-soft); color: var(--sr-mut); font-size: 12px; line-height: 1.5; border-radius: var(--sr-r-ctl); }
.kw-detail-kopfzeile .kw-detail-suche { flex: 0 0 auto; margin: 0; padding: 0; background: none; gap: 4px; }
.kw-detail-kopfzeile .kw-detail-suche-label { display: none; }
.kw-detail-suchlink { display: inline-flex; align-items: center; gap: 5px; min-height: 30px; padding: 4px 6px; border-radius: 5px; color: var(--sr-acc-ink); font-size: 11px; font-weight: 650; line-height: 1; text-decoration: none; }
.kw-detail-suchlink svg { width: 17px; height: 17px; flex: 0 0 17px; }
.kw-detail-suchlink:hover { background: var(--sr-soft); color: var(--accent); text-decoration: none; }
.kw-detail-meta { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px 16px; margin-top: 18px; }
.kw-detail-meta-feld { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; min-height: 42px; font-size: 12px; }
.kw-detail-meta-feld > span:first-child, .kw-detail-meta-label { color: var(--sr-mut); font-size: 10px; font-weight: 600; line-height: 1.4; letter-spacing: .055em; text-transform: uppercase; }
.kw-detail-meta-feld:last-of-type { min-width: 100px; flex: 1 1 160px; }
.kw-detail-meta-feld .tag { white-space: normal; line-height: 1.4; }
.kw-detail-meta-loeschen { display: inline-grid; place-items: center; align-self: center; flex: 0 0 34px; width: 34px; height: 34px; margin-left: auto; padding: 0; border: 1px solid transparent; border-radius: var(--sr-r-ctl); background: transparent; color: var(--sr-mut); cursor: pointer; }
.kw-detail-meta-loeschen svg { width: 18px; height: 18px; }
.kw-detail-meta-loeschen:hover { border-color: color-mix(in srgb,var(--red) 26%,transparent); background: color-mix(in srgb,var(--red) 9%,transparent); color: var(--red); }
.kw-detail-inline { min-width: 76px; border-radius: var(--kwd-radius); }
.kw-detail-inline > summary { display: grid; grid-template-columns: auto 14px; align-items: center; gap: 4px; min-height: 42px; padding: 0 4px 4px; border-radius: var(--kwd-radius); cursor: pointer; list-style: none; }
.kw-detail-inline > summary::-webkit-details-marker { display: none; }
.kw-detail-inline > summary > .kw-detail-meta-label { grid-column: 1 / -1; }
.kw-detail-inline > summary > span:last-child { color: var(--sr-mut); font-size: 13px; }
.kw-detail-inline > summary:hover, .kw-detail-inline[open] > summary { background: var(--sr-soft); }
.kw-detail-inline-form { display: grid; gap: 8px; padding: 12px; width: 230px; max-width: 100%; border: 1px solid var(--sr-hair); border-radius: var(--sr-r-ctl); background: var(--sr-soft); }
.kw-detail-inline-form > label { font-size: 12px; font-weight: 600; }
.kw-detail-inline-form > select { width: 100%; min-height: 36px; padding: 6px 8px; border: 1px solid var(--sr-hair); border-radius: var(--sr-r-ctl); background: var(--sr-surface); color: var(--sr-ink); font: inherit; font-size: 13px; }
.kw-detail-inline-aktionen { display: flex; gap: 6px; flex-wrap: wrap; }
.kw-detail-inline-aktionen button { min-height: 34px; }
.kw-detail-drawer-kpis { padding: 0 24px 18px; }
.kw-detail-drawer .kw-detail-drawer-kpis .sr-kpi-gitter { display: grid; grid-template-columns: repeat(4,minmax(0,1fr)); gap: 10px; margin: 0; }
.kw-detail-drawer-kpis .sr-kpi { min-height: 100px; padding: 12px; box-shadow: var(--edge); }
.kw-detail-drawer .kw-detail-drawer-kpis .sr-kpi-wert { font-size: var(--kwd-kpi-value-size); }
.kw-detail-drawer .kw-detail-drawer-kpis .sr-kpi-label { font-size: var(--kwd-label-size); }
.kw-detail-drawer-kpis .sr-kpi-meta { font-size: 10.5px; white-space: normal; line-height: 1.35; }
.kw-detail-drawer-kpis .sr-kpi-wert-zusatz { font-size: 11px; }
.kw-detail-drawer-inhalt { background: var(--sr-bg); padding: 20px 24px 40px; }
.kw-detail-drawer-inhalt [data-kw-drawer-body] > .section { margin: 0; display: grid; gap: 18px; }
.kw-detail-drawer-inhalt [data-kw-drawer-body] > .kw-detail-section {
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  box-shadow: none;
}
.kw-detail-drawer-inhalt [data-kw-drawer-body],
.kw-detail-drawer-inhalt [data-kw-drawer-body] > .section,
.kw-detail-drawer-inhalt [data-kw-drawer-body] > .section > * { min-width: 0; max-width: 100%; }
.kw-detail-drawer-feedback:not(:empty) { padding: 0 24px 12px; font-size: 13px; line-height: 1.5; }
.kw-detail-drawer-inhalt .sr-karte { margin: 0; }
.kw-detail-drawer-inhalt .sr-karte { transition: box-shadow .16s ease, transform .16s ease; }
.kw-detail-drawer-inhalt .sr-karte:hover { transform: translateY(-1px); box-shadow: var(--edge), var(--e2); }
@media (prefers-reduced-motion: reduce) {
  .kw-detail-drawer-inhalt .sr-karte { transition: none; }
  .kw-detail-drawer-inhalt .sr-karte:hover { transform: none; }
}
.kw-detail-drawer-inhalt .sr-karte-titel { font-size: 16px; }
.kw-detail-drawer-inhalt .sr-karte-koerper { font-size: 13px; line-height: 1.55; }
.kw-detail-drawer :is(summary,button,a,select):focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
@media (max-width: 720px) {
  .kw-detail-drawer-inhalt { padding: 14px 14px 32px; }
}
@media (max-width: 600px) {
  .kw-detail-drawer { --kwd-title-size: var(--fs-h1); --kwd-kpi-value-size: 19px; }
  .kw-detail-drawer-sticky .kw-detail-drawer-kopf { padding: 16px 14px 10px; }
  .kw-detail-name-info { flex-basis: 220px; }
  .kw-detail-meta { gap: 8px 12px; margin-top: 12px; }
  .kw-detail-meta-feld:last-of-type { flex-basis: 140px; }
  .kw-detail-drawer-kpis { padding: 0 14px 12px; }
  .kw-detail-drawer .kw-detail-drawer-kpis .sr-kpi-gitter { grid-template-columns: repeat(2,minmax(0,1fr)); gap: 8px; }
  .kw-detail-drawer .kw-detail-drawer-kpis .sr-kpi { min-height: auto; padding: 8px 10px; }
  .kw-detail-drawer .kw-detail-drawer-kpis .sr-kpi:has(.sr-kpi-info) .sr-kpi-meta { display: none; }
  .kw-detail-drawer-inhalt [data-kw-drawer-body] > .section { gap: 14px; }
  .kw-detail-drawer-feedback:not(:empty) { padding: 0 14px 12px; }
}


/* ---- seite-detail.css ---- */
/* Seitendetail: Unterschiede zum bestehenden Keyword-Schubfach. */
.seite-detail-drawer .kw-detail-drawer-kopf { padding-bottom: 14px; }
.seite-detail-kopfzeile { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--s3); padding-right: 52px; }
.seite-detail-titel { min-width: 0; flex: 1 1 auto; }
.seite-detail-drawer #seite-detail-drawer-titel { display: block; margin: 6px 0 8px; font-size: 28px; line-height: 1.2; font-weight: 700; letter-spacing: -.025em; overflow-wrap: anywhere; }
.seite-detail-drawer [data-seite-drawer-kopf] > h2 { padding-right: 52px; }
.seite-detail-pfad { max-width: 100%; color: var(--sr-mut); font-size: 12px; overflow-wrap: anywhere; word-break: break-word; }
.seite-detail-link { display: inline-block; margin-top: 10px; color: var(--sr-acc-ink); font-size: 12px; font-weight: 650; text-decoration: none; }
.seite-detail-link:hover { color: var(--accent); text-decoration: underline; }
.seite-detail-stand { flex: 0 0 auto; color: var(--sr-mut); font-size: 11px; line-height: 1.45; text-align: right; }
.seite-detail-stand strong { color: var(--text); font-size: 12px; }
.seite-detail-body { display: grid; gap: 18px; min-width: 0; }
.seite-detail-body > .sr-karte { min-width: 0; }
.seite-detail-drawer .sr-metagitter > span:nth-child(even) { min-width: 0; overflow-wrap: anywhere; word-break: break-word; }
.seite-detail-drawer .sr-metagitter .mono { overflow-wrap: anywhere; word-break: break-word; }

/* Wasserfall-Ressource: Kopf, Kennzahlen und Abschnitte beginnen an derselben
   Linie des Drawers. Die Hauptabschnitte brauchen deshalb keine zweite
   Karten-Einrückung; einzelne Anfragen trennt eine Linie statt weiterer
   verschachtelter Kartenränder. */
.seite-detail-drawer .technik-detail-kopfaktionen { align-items: center; margin: 14px 0 0; }
.seite-detail-drawer .technik-detail-kopfaktionen .sr-knopf { min-height: 34px; }
.seite-detail-drawer .technik-detail-oeffnen { display: inline-flex; align-items: center; gap: 6px; text-decoration: none; }
.seite-detail-drawer .technik-detail-oeffnen svg { width: 16px; height: 16px; flex: 0 0 16px; }
.seite-detail-drawer .technik-detail-kpis { min-width: 0; }
.seite-detail-drawer .technik-detail.seite-detail-body > .sr-karte { margin: 0; border-radius: 0; background: transparent; box-shadow: none; }
.seite-detail-drawer .technik-detail.seite-detail-body > .sr-karte:hover { transform: none; box-shadow: none; }
.seite-detail-drawer .technik-detail.seite-detail-body > .sr-karte > .sr-karte-kopf,
.seite-detail-drawer .technik-detail.seite-detail-body > .sr-karte > .sr-karte-koerper { padding-left: 0; padding-right: 0; }
.seite-detail-drawer .technik-detail.seite-detail-body > .sr-karte > .sr-probleme > .sr-problem { padding-left: 0; padding-right: 0; }
.seite-detail-drawer .technik-detail-anfragen > .sr-karte { margin: 0; border-radius: 0; border-top: 1px solid var(--sr-hair); background: transparent; box-shadow: none; }
.seite-detail-drawer .technik-detail-anfragen > .sr-karte:first-child { border-top: 0; }
.seite-detail-drawer .technik-detail-anfragen > .sr-karte:hover { transform: none; box-shadow: none; }
.seite-detail-drawer .technik-detail-anfragen > .sr-karte > .sr-karte-koerper { padding: var(--s2) 0; }
.seite-detail-drawer .technik-detail-anfragen .sr-metagitter + .sr-metagitter { margin-top: var(--s2); padding-top: var(--s2); border-top: 1px solid var(--sr-hair); }
.technik-detail-fundstellen { list-style: none; margin: 10px 0; padding: 0; }
.technik-detail-fundstellen li { padding: 8px 0; border-top: 1px solid var(--sr-hair); }
.technik-detail-fundstellen a { display: block; overflow-wrap: anywhere; }
.technik-detail-fundstellen svg { width: 12px; height: 12px; }
.technik-detail-fundstellen pre { white-space: pre-wrap; overflow-wrap: anywhere; font-size: 11px; }
.technik-detail-quellhinweis { border-left: 2px solid var(--sr-hair); padding-left: 10px; }
@media (max-width: 600px) {
  .seite-detail-kopfzeile { display: block; padding-right: 42px; }
  .seite-detail-drawer #seite-detail-drawer-titel { font-size: 23px; }
  .seite-detail-stand { margin-top: 12px; text-align: left; }
  .seite-detail-drawer .kw-detail-drawer-kopf { padding-bottom: 12px; }
  .seite-detail-drawer .sr-metagitter { grid-template-columns: minmax(0, 1fr); gap: 4px; }
  .seite-detail-drawer .sr-metagitter > .sr-startmeta-l:not(:first-child) { margin-top: 10px; }
  .seite-detail-drawer .technik-detail-kopfaktionen .sr-knopf { flex: 1 1 auto; justify-content: center; }
}


/* ---- technik.css ---- */
.technik-bereich { min-width: 0; }
.technik-zweispaltig { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; align-items: start; }
.technik-zweispaltig > .sr-karte { margin: 0; min-width: 0; }
.technik-erfolge { display: flex; align-items: center; gap: 16px; padding: 16px 0; }
.technik-erfolge-symbol { color: var(--green); background: var(--surface-2); border-radius: 50%; width: 56px; height: 56px; display: grid; place-items: center; font-size: 28px; }
.technik-erfolge strong { display: block; font-size: 32px; font-weight: 750; line-height: 1.2; }
.technik-erfolge span { display: block; }
.technik-erfolge > b { margin-left: auto; color: var(--green); font-size: 24px; }
.technik-fortschritt { width: 100%; height: 10px; accent-color: var(--green); }
.technik-quelle { color: var(--text-3); font-size: 12px; }
.technik-kategorien { display: grid; gap: 6px; }
.technik-kategorien button { display: grid; grid-template-columns: minmax(120px, 1fr) minmax(50px, 1fr) 30px; align-items: center; gap: 12px; border: 0; border-radius: 6px; padding: 9px; background: transparent; color: var(--text); text-align: left; cursor: pointer; font: inherit; }
.technik-kategorien button:hover, .technik-kategorien button[aria-pressed="true"] { background: var(--surface-2); }
.technik-kategorie-balken { height: 8px; border-radius: 8px; background: var(--surface-2); overflow: hidden; }
.technik-kategorie-balken { width: 100%; }
.technik-kategorie-balken rect { fill: var(--accent); }
.technik-filterstatus { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 0; }
.technik-filterstatus[hidden], .technik-bereich [hidden] { display: none !important; }
.technik-bereich .sr-karte { min-width: 0; }
.technik-bereich .chart-werte { margin-top: 6px; }
.technik-bereich .chart-werte-schalter { font-size: 12px; color: var(--text-3); }
@media (max-width: 900px) {
  .technik-zweispaltig { grid-template-columns: 1fr; }
}
.technik-live-form { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr) auto; align-items: end; gap: 12px; }
.technik-live-form label { display: grid; gap: 6px; }
.technik-live-form input, .technik-live-form select { box-sizing: border-box; width: 100%; padding: 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--surface); color: var(--text); font: inherit; }
.technik-live-job { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; padding: 12px 0; border-bottom: 1px solid var(--border); }
.seite-detail-aktionen { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 16px; }
@media (max-width: 700px) { .technik-live-form { grid-template-columns: 1fr; } }

.technik-bereich > h3:first-child { margin-top: 16px; }
.technik-zweispaltig > div { min-width: 0; }
.technik-zweispaltig > div > .sr-karte + .sr-karte { margin-top: 16px; }
.technik-kategorien button { padding-block: 6px; }

@media (max-width: 600px) {
  .technik-kpis .sr-kpi-gitter { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .technik-kpis .sr-kpi { min-width: 0; }
}

.technik-diff-wert { white-space: pre-wrap; overflow-wrap: anywhere; padding: 8px 0; }
#technik .technik-befunde {
  display: grid;
  gap: 24px;
}

#technik .technik-befunde > h3,
#technik .technik-befunde > .sr-karte {
  margin: 0;
}

#technik .technik-befunde .technik-zweispaltig {
  gap: 20px;
  align-items: start;
}

#technik .technik-befunde .technik-zweispaltig > div {
  display: grid;
  min-width: 0;
  gap: 20px;
}

#technik .technik-befunde .technik-zweispaltig > .sr-karte,
#technik .technik-befunde .technik-zweispaltig > div > .sr-karte,
#technik .technik-befunde .technik-zweispaltig > div > .sr-karte + .sr-karte {
  margin: 0;
}

#technik .technik-befunde table.tbl-drill.technik-befund-tabelle {
  display: table;
  width: 100%;
  max-width: 100%;
  table-layout: fixed;
  border-collapse: collapse;
  overflow: visible;
}

#technik .technik-befunde table.technik-befund-tabelle th:nth-child(1) { width: 52%; }
#technik .technik-befunde table.technik-befund-tabelle th:nth-child(2) { width: 18%; }
#technik .technik-befunde table.technik-befund-tabelle th:nth-child(3) { width: 18%; }
#technik .technik-befunde table.technik-befund-tabelle th:nth-child(4) { width: 12%; }

#technik .technik-befunde table.technik-befund-tabelle th,
#technik .technik-befunde table.technik-befund-tabelle td {
  padding: 14px 16px;
  vertical-align: top;
}

#technik .technik-befunde table.technik-befund-tabelle td {
  height: auto !important;
  white-space: normal;
  overflow-wrap: anywhere;
  line-height: 1.55;
}

#technik .technik-befunde table.technik-befund-tabelle tr.drill > td:first-child::before {
  content: none;
}

#technik .technik-befunde .befund-zeilentitel {
  display: block;
  font-size: 14px;
  font-weight: 600;
  line-height: 1.45;
}

#technik .technik-befunde .befund-zeilenmeta {
  display: block;
  max-width: 100%;
  margin-top: 6px;
  color: var(--text-3);
  font-size: var(--fs-small);
  overflow-wrap: anywhere;
  white-space: normal;
}

#technik .technik-befunde .technik-befund-filter {
  display: grid;
  grid-template-columns: minmax(160px, 1fr) minmax(160px, 1fr) minmax(200px, 2fr) auto;
  align-items: end;
  gap: 12px;
  margin-bottom: 16px;
}

#technik .technik-befunde .technik-befund-filter label {
  display: grid;
  gap: 6px;
}

#technik .technik-befunde .technik-befund-filter select,
#technik .technik-befunde .technik-befund-filter input {
  box-sizing: border-box;
  width: 100%;
  min-height: 44px;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--surface);
  color: var(--text);
  font: inherit;
}

#technik .technik-befunde table.technik-befund-tabelle tr.drill-detail > td {
  height: auto !important;
  padding: 20px;
  border-left: 3px solid var(--accent);
  font: inherit;
}

#technik .technik-befunde .befund-oeffnen { text-align: right; }
#technik .technik-befunde .befund-oeffnen > span { display: inline-flex; align-items: center; justify-content: flex-end; min-height: 24px; gap: 6px; white-space: nowrap; }
#technik .technik-befunde .befund-chevron { display: inline-block; transition: transform 140ms var(--ease); }
#technik .technik-befunde tr.drill[aria-expanded="true"] .befund-chevron { transform: rotate(180deg); }

#technik .technik-befunde .befund-detail {
  display: grid;
  min-width: 0;
  gap: 20px;
}

#technik .technik-befunde .befund-einordnung {
  padding: 16px;
  border: 0;
  border-radius: 8px;
  background: var(--surface);
}

#technik .technik-befunde .befund-einordnung p {
  margin: 8px 0 0;
  line-height: 1.6;
}

#technik .technik-befunde .befund-detail-inhalt {
  display: grid;
  grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
  gap: 32px;
}

#technik .technik-befunde .befund-detail-inhalt:has(.befund-detail-erklaerung:empty) {
  grid-template-columns: minmax(0, 1fr);
}

#technik .technik-befunde .befund-detail-erklaerung:empty {
  display: none;
}

#technik .technik-befunde .befund-detail-erklaerung p {
  margin: 0 0 16px;
  line-height: 1.6;
  max-width: 66ch;
}

#technik .technik-befunde .befund-detail-erklaerung p:last-child {
  margin-bottom: 0;
}

#technik .technik-befunde .befund-detail-erklaerung strong {
  display: block;
  margin-bottom: 4px;
}

#technik .technik-befunde .befund-detail-belege {
  min-width: 0;
  padding-left: 24px;
  border-left: 1px solid var(--border);
}

#technik .technik-befunde .befund-detail-inhalt:has(.befund-detail-erklaerung:empty) .befund-detail-belege {
  padding-left: 0;
  border-left: 0;
}

#technik .technik-befunde .befund-fund-titel {
  margin: 0 0 12px !important;
  font-size: 14px;
  font-weight: 600;
  letter-spacing: normal;
  text-transform: none;
}

#technik .technik-befunde .befund-fundstellen {
  margin: 0;
  padding: 0;
}

#technik .technik-befunde .befund-fundstellen li {
  margin: 0;
  padding: 10px 0;
  border-bottom: 1px solid var(--border);
  line-height: 1.55;
  overflow-wrap: anywhere;
}

#technik .technik-befunde .befund-fundstellen li:last-child {
  border-bottom: 0;
}

#technik .technik-befunde .befund-fundstellen .mono,
#technik .technik-befunde .befund-fundstellen a,
#technik .technik-befunde .befund-fundstellen .befund-fundort {
  max-width: 100%;
  white-space: normal;
  overflow-wrap: anywhere;
  word-break: normal;
}

#technik .technik-befunde .befund-rohdaten {
  margin: 16px 0 0;
}

#technik .technik-befunde .befund-rohdaten summary {
  display: list-item;
  box-sizing: border-box;
  padding: 12px 0;
  min-height: 44px;
  cursor: pointer;
}

#technik .technik-befunde .befund-rohdaten .befund-meldungen,
#technik .technik-befunde .befund-rohdaten .befund-meldungen li,
#technik .technik-befunde .befund-rohdaten .mono {
  max-width: 100%;
  white-space: normal;
  overflow-wrap: anywhere;
}

#technik .technik-befunde .befund-detail-fuss {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding-top: 16px;
  border-top: 1px solid var(--border);
}

#technik .technik-befunde .befund-detail-fuss .befund-herkunft {
  flex: 1 1 auto;
  min-width: 0;
  margin: 0;
  overflow-wrap: anywhere;
}

#technik .technik-befunde .befund-detail-fuss button {
  min-height: 44px;
}

@media (max-width: 900px) {
  #technik .technik-befunde .befund-detail-inhalt {
    grid-template-columns: minmax(0, 1fr);
  }
  #technik .technik-befunde .befund-detail-belege {
    padding-left: 0;
    border-left: 0;
  }
}

@media (max-width: 700px) {
  #technik .technik-befunde table.tbl-drill.technik-befund-tabelle,
  #technik .technik-befunde table.technik-befund-tabelle tbody {
    display: block;
    width: 100%;
  }

  #technik .technik-befunde table.technik-befund-tabelle tbody {
    min-width: 0;
  }

  #technik .technik-befunde table.technik-befund-tabelle colgroup {
    display: none;
  }

  #technik .technik-befunde table.technik-befund-tabelle thead {
    position: absolute;
    width: 1px;
    min-width: 0;
    max-width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }

  #technik .technik-befunde table.technik-befund-tabelle tr.drill {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    gap: 8px 12px;
    padding: 16px 12px;
  }

  #technik .technik-befunde table.technik-befund-tabelle tr.drill > td {
    display: block;
    padding: 0 !important;
  }

  #technik .technik-befunde table.technik-befund-tabelle tr.drill > td:first-child {
    grid-column: 1 / -1;
    position: relative;
  }

  #technik .technik-befunde table.technik-befund-tabelle tr.drill > td[data-label="Einordnung"] {
    grid-column: 1;
    grid-row: 2;
  }

  #technik .technik-befunde table.technik-befund-tabelle tr.drill > td[data-label="Betroffen"] {
    grid-column: 2;
    grid-row: 2;
    text-align: right;
  }

  #technik .technik-befunde table.technik-befund-tabelle tr.drill > td[data-label="Einordnung"]::before,
  #technik .technik-befunde table.technik-befund-tabelle tr.drill > td[data-label="Betroffen"]::before {
    content: attr(data-label);
    display: block;
    margin-bottom: 2px;
    color: var(--text-3);
    font-size: var(--fs-small);
    line-height: 1.4;
  }

  #technik .technik-befunde table.technik-befund-tabelle .befund-oeffnen { grid-column: 1 / -1; grid-row: 3; text-align: left; }
  #technik .technik-befunde table.technik-befund-tabelle .befund-oeffnen > span { width: 100%; justify-content: space-between; }

  #technik .technik-befunde table.technik-befund-tabelle tr.drill-detail:not([hidden]) {
    display: block;
    box-sizing: border-box;
    width: 100%;
    max-width: 100%;
  }

  #technik .technik-befunde table.technik-befund-tabelle tr.drill-detail > td {
    display: block;
    box-sizing: border-box;
    width: 100%;
    height: auto !important;
    padding: 16px !important;
  }

  #technik .technik-befunde table.technik-befund-tabelle [hidden] {
    display: none !important;
  }

  #technik .technik-befunde .technik-befund-filter {
    grid-template-columns: minmax(0, 1fr);
  }
}

@media (prefers-reduced-motion: reduce) {
  #technik .technik-befunde .befund-chevron {
    transition: none;
  }
}

.befund-quellen{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}.befund-lighthouse{margin-top:12px;padding-top:12px;border-top:1px solid var(--sr-hair)}
.monitor-verlauf{min-width:0}.monitor-werkzeuge{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:16px}.monitor-werkzeuge .chart-legende{gap:14px;font-size:var(--fs-small)}.monitor-werkzeuge .chart-legende span:first-child{color:var(--sr-ok-ink)}.monitor-werkzeuge .chart-legende span:nth-child(2){color:var(--sr-err-ink)}.monitor-werkzeuge .tt-skalen{margin:0}.monitor-werkzeuge button[aria-pressed=true]{border-color:var(--sr-acc-line);background:var(--sr-surface);color:var(--sr-ink)}.monitor-reihe{display:grid;gap:8px;margin-bottom:16px;font-size:var(--fs-label)}.monitor-reihe svg{display:block;width:100%;height:34px;overflow:visible}.monitor-ok{fill:var(--sr-ok-ink)}.monitor-ausfall{fill:var(--sr-err-ink)}.monitor-unbekannt{fill:var(--sr-hair)}.monitor-reihe rect:focus{stroke:var(--sr-ink);stroke-width:1;outline:none}.monitor-achse{display:flex;justify-content:space-between;font-size:var(--fs-small);color:var(--sr-mut)}.tt-befunde-link{margin:var(--s3) 0}


/* ---- technik-uebersicht.css ---- */
.tu-ansichten{
  display:flex;
  flex-direction:column;
  gap:var(--s4);
}

.tu-onpage{margin-top:var(--s5)}

.tu-onpage-kopf{
  display:flex;
  align-items:flex-start;
  justify-content:space-between;
  gap:var(--s3);
  margin-bottom:var(--s4);
}

.tu-onpage-kopf h2{margin:0;color:var(--sr-ink);font-size:var(--fs-h1);line-height:var(--lh-h1)}
.tu-onpage-kopf p{margin:var(--s1) 0 0;color:var(--sr-mut)}

#technik-uebersicht-wichtigste{
  border-color:color-mix(in oklab,var(--sr-acc) 34%,var(--sr-hair));
  background:linear-gradient(135deg,color-mix(in oklab,var(--sr-acc) 8%,var(--sr-surface)),var(--sr-surface) 58%);
  box-shadow:var(--sr-e1);
}

#technik-uebersicht-wichtigste>.sr-karte-kopf{
  padding-top:var(--s4);
  padding-bottom:var(--s3);
  border-bottom:2px solid color-mix(in oklab,var(--sr-acc) 38%,var(--sr-hair));
}

#technik-uebersicht-wichtigste .sr-karte-titel{
  font-size:var(--fs-h1);
  letter-spacing:-.01em;
}

#technik-uebersicht-wichtigste .sr-thema-liste{
  display:flex;
  flex-direction:column;
  gap:0;
}

#technik-uebersicht-wichtigste .sr-thema{
  display:grid;
  grid-template-columns:minmax(180px,.7fr) minmax(260px,1.7fr) auto;
  align-items:center;
  gap:var(--s3);
  padding:var(--s3) 0 var(--s3) var(--s3);
  border-bottom:1px solid var(--sr-hair);
  border-radius:0;
  background:transparent;
}

#technik-uebersicht-wichtigste .sr-thema:last-child{border-bottom:0}
#technik-uebersicht-wichtigste .sr-thema--warnung{border-left:4px solid var(--sr-warn)}
#technik-uebersicht-wichtigste .sr-thema--chance{border-left:4px solid var(--sr-ok)}
#technik-uebersicht-wichtigste .sr-thema--neutral{border-left:4px solid var(--sr-hair)}
#technik-uebersicht-wichtigste .sr-thema-kopf{align-items:center}
#technik-uebersicht-wichtigste .sr-thema-satz{font-size:var(--fs-ui)}

#technik-uebersicht-wichtigste .sr-thema-link{
  min-height:40px;
  margin:0;
  padding:0 var(--s3);
  justify-content:center;
  border:1px solid var(--sr-acc-line);
  border-radius:var(--sr-r-ctl);
  background:var(--sr-surface);
  white-space:nowrap;
}

#technik-uebersicht-wichtigste .sr-thema-link:hover{
  background:var(--sr-soft);
  text-decoration:none;
}

.tu-ansicht-schalter{
  display:inline-flex;
  align-self:flex-start;
  max-width:100%;
  padding:3px;
  gap:2px;
  overflow-x:auto;
  border-radius:var(--sr-r-ctl);
  background:var(--sr-soft);
}

.tu-ansicht-schalter button{
  min-height:38px;
  padding:7px 13px;
  border:0;
  border-radius:calc(var(--sr-r-ctl) - 2px);
  background:transparent;
  color:var(--sr-mut);
  font:inherit;
  font-size:var(--fs-label);
  font-weight:700;
  white-space:nowrap;
  cursor:pointer;
}

.tu-ansicht-schalter button[aria-selected="true"]{
  background:var(--sr-surface);
  color:var(--sr-ink);
  box-shadow:var(--sr-e1);
}

.tu-ansicht-schalter button:hover{color:var(--sr-ink)}

.tu-ansicht-schalter button:focus-visible,
.tu-frage:focus-visible,
.tu-feld a:focus-visible,
.tu-rubrik a:focus-visible,
.tu-alle-rubriken summary:focus-visible{
  outline:3px solid var(--sr-acc);
  outline-offset:2px;
}

[data-technik-panel][hidden]{display:none!important}

.tu-felder{
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--s4);
}

.tu-feld{
  min-width:0;
  padding:var(--s3);
  border-radius:var(--sr-r-card);
  background:var(--sr-soft);
  box-shadow:inset 4px 0 0 var(--sr-hair);
}

.tu-feld--ok{box-shadow:inset 4px 0 0 var(--sr-ok)}
.tu-feld--warn{box-shadow:inset 4px 0 0 var(--sr-warn)}
.tu-feld--err{box-shadow:inset 4px 0 0 var(--sr-err)}

.tu-feld-kopf,
.tu-rubrik-kopf,
.tu-feld-mitte,
.tu-feld-fuss,
.tu-rubrik-aktionen,
.tu-rubrik-meta{
  display:flex;
  align-items:center;
  gap:var(--s2);
}

.tu-feld-kopf{
  justify-content:space-between;
  align-items:flex-start;
  margin-bottom:var(--s2);
}

.tu-feld h3,
.tu-rubrik h4,
.tu-panel-kopf h3{
  margin:0;
  color:var(--sr-ink);
}

.tu-feld h3{
  font-size:var(--fs-h2);
  line-height:var(--lh-h2);
}

.tu-ueberzeile,
.tu-rubrik-feld{
  display:block;
  margin-bottom:2px;
  color:var(--sr-mut);
  font-size:var(--fs-label);
  font-weight:700;
  letter-spacing:.04em;
  text-transform:uppercase;
}

.tu-feld-mitte{
  align-items:center;
  min-height:120px;
}

.tu-feld-zahlen{
  display:grid;
  flex:1;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--s1) var(--s2);
  margin:0;
}

.tu-feld-zahlen div:last-child{grid-column:1/-1}

.tu-feld-zahlen dt{
  color:var(--sr-mut);
  font-size:var(--fs-label);
}

.tu-feld-zahlen dd{
  margin:2px 0 0;
  color:var(--sr-ink);
  font-size:var(--fs-small);
  font-weight:700;
}

.tu-ring-leer{
  width:112px;
  height:112px;
  flex:0 0 112px;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  border:9px solid var(--sr-hair);
  border-radius:50%;
  color:var(--sr-mut);
}

.tu-ring-leer strong{
  color:var(--sr-ink);
  font-size:var(--fs-kpi);
  line-height:1;
}

.tu-ring-leer span{font-size:var(--fs-label)}

.tu-feld-rubriken{
  display:flex;
  flex-wrap:wrap;
  gap:6px;
  margin-top:var(--s2);
}

.tu-feld-rubrik{
  display:inline-flex;
  align-items:center;
  gap:6px;
  min-height:30px;
  padding:4px 8px;
  border-radius:999px;
  background:var(--sr-surface);
  color:var(--sr-ink);
  font-size:var(--fs-label);
  text-decoration:none;
}

.tu-feld-rubrik span{color:var(--sr-mut);font-variant-numeric:tabular-nums}
.tu-feld-rubrik:hover{color:var(--sr-acc-ink)}
.tu-feld-rubrik--luecke{border:1px dashed var(--sr-hair);background:transparent}

.tu-feld-fuss{
  justify-content:space-between;
  flex-wrap:wrap;
  margin-top:var(--s2);
  padding-top:var(--s2);
  border-top:1px solid var(--sr-hair);
  color:var(--sr-mut);
  font-size:var(--fs-label);
}

.tu-feld-fuss a,
.tu-rubrik-aktionen a{
  color:var(--sr-acc-ink);
  font-weight:700;
  text-decoration:none;
}

.tu-feld-fuss a:hover,
.tu-rubrik-aktionen a:hover{text-decoration:underline}

.tu-frage{
  min-height:32px;
  padding:5px 9px;
  border:1px solid var(--sr-feld-line);
  border-radius:var(--sr-r-ctl);
  background:var(--sr-surface);
  color:var(--sr-ink);
  font:inherit;
  font-size:var(--fs-label);
  font-weight:700;
  cursor:pointer;
}

.tu-frage:hover{border-color:var(--sr-acc);color:var(--sr-acc-ink)}

.tu-delta{font-variant-numeric:tabular-nums}
.tu-delta--ok{color:var(--sr-ok-ink)!important}
.tu-delta--err{color:var(--sr-err-ink)!important}
.tu-delta--neutral{color:var(--sr-mut)!important}

.tu-alle-rubriken{
  margin-top:var(--s3);
  border-top:1px solid var(--sr-hair);
}

.tu-alle-rubriken summary{
  min-height:48px;
  display:flex;
  align-items:center;
  gap:var(--s1);
  color:var(--sr-ink);
  font-weight:800;
  cursor:pointer;
  list-style:none;
}

.tu-alle-rubriken summary::-webkit-details-marker{display:none}
.tu-alle-rubriken summary::after{content:'›';margin-left:auto;color:var(--sr-mut);font-size:24px;transform:rotate(90deg)}
.tu-alle-rubriken[open] summary::after{transform:rotate(-90deg)}

.tu-alle-rubriken summary span{
  padding:2px 7px;
  border-radius:999px;
  background:var(--sr-soft);
  color:var(--sr-mut);
  font-size:var(--fs-label);
}

.tu-rubriken-gitter{
  display:grid;
  grid-template-columns:repeat(3,minmax(0,1fr));
  border-top:1px solid var(--sr-hair);
}

.tu-rubrik{
  min-width:0;
  padding:var(--s3) var(--s2);
  border-bottom:1px solid var(--sr-hair);
}

.tu-rubrik:not(:nth-child(3n+1)){border-left:1px solid var(--sr-hair)}
.tu-rubrik-kopf{justify-content:space-between;align-items:flex-start}
.tu-rubrik h4{font-size:var(--fs-body);line-height:var(--lh-body)}

.tu-rubrik-score{
  min-width:42px;
  padding:5px 7px;
  border-radius:999px;
  background:var(--sr-hair);
  color:var(--sr-ink);
  text-align:center;
  font-size:var(--fs-small);
  font-weight:800;
  font-variant-numeric:tabular-nums;
}

.tu-rubrik--ok .tu-rubrik-score{background:color-mix(in oklab,var(--sr-ok) 16%,transparent);color:var(--sr-ok-ink)}
.tu-rubrik--warn .tu-rubrik-score{background:color-mix(in oklab,var(--sr-warn) 16%,transparent);color:var(--sr-warn-ink)}
.tu-rubrik--err .tu-rubrik-score{background:color-mix(in oklab,var(--sr-err) 16%,transparent);color:var(--sr-err-ink)}

.tu-rubrik>p{
  margin:var(--s1) 0;
  color:var(--sr-mut);
  font-size:var(--fs-small);
}

.tu-rubrik-meta{
  justify-content:space-between;
  flex-wrap:wrap;
  font-size:var(--fs-label);
}

.tu-rubrik-regel{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

/* Anzahl der Beanstandungen, die eine anerkannte Ausnahme entkraeftet hat.
   Steht neben der Befundzahl, weil beide zusammen den Rubrikwert erklaeren:
   der Wert kommt roh vom Pruefwerkzeug und enthaelt die widerlegten Funde
   weiterhin (app/views/technik-uebersicht.js, ausnahmeSatz()). */
.tu-rubrik-ausnahme{
  flex:none;
  padding:0 var(--s1);
  border-radius:var(--sr-r-ctl);
  background:var(--sr-soft);
  color:var(--sr-mut);
  font-size:var(--fs-label);
  white-space:nowrap;
}

.tu-rubrik-aktionen{
  flex-wrap:wrap;
  margin-top:var(--s2);
  padding-top:var(--s1);
}

.tu-rubrik-aktionen .sr-erklaerung-knopf{font-size:var(--fs-label)}
.tu-rubrik-aktionen .tu-frage{margin-left:auto}

.tu-panel-kopf{
  margin-bottom:var(--s3);
  max-width:78ch;
}

.tu-panel-kopf h3{font-size:var(--fs-h2)}
.tu-panel-kopf p{margin:var(--s1) 0 0;color:var(--sr-mut)}

.tu-luecke{color:var(--sr-warn-ink);font-weight:700}
.tu-leise{color:var(--sr-mut)}
.tu-lueckenhinweis{padding:var(--s3);border-radius:var(--sr-r-ctl);background:var(--sr-soft);color:var(--sr-mut)}

@media (max-width:900px){
  .tu-rubriken-gitter{grid-template-columns:repeat(2,minmax(0,1fr))}
  .tu-rubrik:not(:nth-child(3n+1)){border-left:0}
  .tu-rubrik:nth-child(even){border-left:1px solid var(--sr-hair)}
}

@media (max-width:720px){
  .tu-onpage{margin-top:var(--s4)}
  .tu-onpage-kopf{flex-direction:column;margin-bottom:var(--s3)}
  .tu-felder{grid-template-columns:1fr}
  .tu-feld{padding:var(--s2)}
  .tu-feld-mitte{align-items:flex-start}
  .tu-feld-zahlen{grid-template-columns:1fr}
  .tu-feld-zahlen div:last-child{grid-column:auto}
  #technik-uebersicht-wichtigste .sr-thema{grid-template-columns:1fr;padding-right:0}
  #technik-uebersicht-wichtigste .sr-thema-link{justify-self:stretch}
}

@media (max-width:520px){
  .tu-ansicht-schalter{align-self:stretch}
  .tu-ansicht-schalter button{flex:1}
  .tu-feld-mitte{flex-direction:column}
  .tu-rubriken-gitter{grid-template-columns:1fr}
  .tu-rubrik:nth-child(even){border-left:0}
  .tu-rubrik-aktionen .tu-frage{margin-left:0}
}

@media (prefers-reduced-motion:reduce){
  .tu-alle-rubriken summary::after{transition:none}
}


/* ---- technik-wasserfall.css ---- */
/* Wasserfall der Anfragen — Projektseite (Technik → Wasserfall) und das
   eigenstaendige Vollbild-Dokument.

   DREI DARSTELLUNGEN, EINE TABELLE (Auftrag 11.09.2026, Punkt 7). Kompakt,
   mit Phasen-Spalten und Nur-Zeitachse unterscheiden sich ausschliesslich
   darin, WELCHE Spalten sichtbar sind — das entscheiden die Regeln unter
   [data-tw-ansicht]. Drei getrennte Tabellen haetten drei Sortierzustaende,
   drei Filterzustaende und dreimal dieselben Zeilen im Dokument bedeutet.

   SPALTENFOLGE (nth-child, 1-basiert): 1 Anfrage · 2 Typ · 3 Status ·
   4 Groesse · 5 Start · 6 Dauer · 7-13 die sieben Phasen · 14 Zeitachse. */

.tw-root{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s3);min-width:0}
.tw-kopf{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--s3)}
.tw-kopf h3{margin:0;color:var(--sr-ink);font-size:var(--fs-h2)}
.tw-kopf p{margin:var(--s1) 0 0;color:var(--sr-mut);font-size:var(--fs-label)}

/* ------------------------------------------------------------- Phasenton */
.tw-legende{display:flex;flex-wrap:wrap;gap:var(--s1) var(--s3);color:var(--sr-mut);font-size:var(--fs-label)}
.tw-legende span{display:inline-flex;align-items:center;gap:var(--s1);white-space:nowrap}
.tw-legende i,.tw-karte-phase dt i{width:11px;height:11px;flex:0 0 auto;border-radius:3px;background:var(--tw-phase);
  box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--tw-phase),transparent 65%)}
.tw-phase--blockiert{--tw-phase:var(--text-3)}
.tw-phase--dns{--tw-phase:var(--series-3)}
.tw-phase--verbindung{--tw-phase:var(--series-4)}
.tw-phase--tls{--tw-phase:var(--series-7)}
.tw-phase--senden{--tw-phase:var(--series-5)}
.tw-phase--warten{--tw-phase:var(--series-2)}
.tw-phase--empfangen{--tw-phase:var(--series-1)}
.tw-phase--ohne{--tw-phase:var(--text-3);opacity:.55}
.tw-phase--offen{--tw-phase:var(--red)}

/* ------------------------------------------------------------ Seitenkarte */
.tw-seiten{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s3);min-width:0}
.tw-seite{margin:0;overflow:clip}
.tw-seite-kopf{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);padding:var(--s3) var(--s4);cursor:pointer;list-style:none;background:var(--sr-surface)}
.tw-seite-kopf::-webkit-details-marker{display:none}
.tw-seite-kopf span:first-child{display:grid;gap:3px;min-width:0}
.tw-seite-kopf strong{overflow-wrap:anywhere;color:var(--sr-ink);font-size:var(--fs-body)}
.tw-seite-kopf small{color:var(--sr-mut);font-size:var(--fs-label);font-weight:400}
.tw-seite-pfeil{width:9px;height:9px;flex:0 0 auto;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg);transition:transform .16s ease}
.tw-seite[open] .tw-seite-pfeil{transform:rotate(225deg)}
.tw-seite-inhalt{min-width:0;padding:0 var(--s4) var(--s4);border-top:1px solid var(--sr-hair)}

/* --------------------------------------------------- Segmente und Knoepfe */
.tw-steuerung{display:flex;align-items:center;flex-wrap:wrap;gap:var(--s2);padding:var(--s3) 0 0}
.tw-steuerung-rechts{display:flex;align-items:center;gap:var(--s1);margin-left:auto}
/* Der Segmentschalter ist bewusst zurueckhaltend: eine gerahmte Leiste, das
   gewaehlte Feld traegt die Flaeche. Er rundet, weil er ein Schalter ist —
   die 2px-Regel der App gilt fuer Chips und Marken, nicht fuer Bedienelemente. */
.tw-seg{display:inline-flex;align-items:center;gap:2px;padding:2px;border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-lg);background:var(--sr-soft);min-width:0;overflow:auto;scrollbar-width:none}
.tw-seg::-webkit-scrollbar{display:none}
.tw-seg-knopf{display:inline-flex;align-items:center;gap:var(--s1);min-height:30px;padding:4px 11px;
  border:0;border-radius:calc(var(--sr-r-lg) - 3px);background:none;color:var(--sr-mut);
  font:inherit;font-size:var(--fs-label);font-weight:600;white-space:nowrap;cursor:pointer}
.tw-seg-knopf:hover{color:var(--sr-ink)}
.tw-seg-knopf[aria-selected="true"],.tw-seg-knopf[aria-pressed="true"]{background:var(--sr-surface);color:var(--sr-ink);box-shadow:var(--edge)}
.tw-seg-zahl{min-width:20px;padding:0 5px;border-radius:var(--sr-r-badge);background:var(--sr-soft);
  font-variant-numeric:tabular-nums;font-weight:700;text-align:center}
.tw-seg-knopf[aria-selected="true"] .tw-seg-zahl{background:var(--accent-soft);color:var(--sr-acc-ink)}

/* ------------------------------------------------------------ Kopfbereich */
/* minmax(0,1fr) statt der Vorgabe `auto`: eine Rasterspalte waechst sonst auf
   die max-content-Breite ihres breitesten Kindes. Das breiteste Kind ist hier
   die Tabelle mit 940 px Mindestbreite — bei 390 px lief die ganze Tafel auf
   713 px auf, und .tw-seite{overflow:clip} schnitt sie lautlos ab statt die
   Seite scrollen zu lassen. Der Fehler war im Bild nicht zu sehen: es fehlten
   einfach Chips am rechten Rand. */
.tw-tafel{min-width:0;display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s2)}
.tw-tafel-kopf{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--s2) var(--s4);
  align-items:start;padding-top:var(--s4);padding-bottom:var(--s1)}
.tw-tafel-titelzeile{grid-column:1;min-width:0}
.tw-tafel-titel{margin:0;color:var(--sr-ink);font-size:var(--fs-h2);font-weight:700;
  /* Die h4-Grundregel (theme.css) setzt Versalien und Sperrung — das ist die
     Schreibweise fuer Rubriken, nicht fuer den Namen einer gemessenen Seite. */
  text-transform:none;letter-spacing:normal;overflow-wrap:anywhere}
.tw-tafel-stand{margin:2px 0 0;color:var(--sr-mut);font-size:var(--fs-label)}
.tw-anfragewerte{grid-column:1;display:flex;flex-wrap:wrap;gap:var(--s1) var(--s4);margin:0}
.tw-anfragewerte>div{display:grid;gap:0;min-width:0}
.tw-anfragewerte dt{color:var(--sr-mut);font-size:var(--fs-label)}
.tw-anfragewerte dd{margin:0;color:var(--sr-ink);font-size:var(--fs-body);font-weight:750;font-variant-numeric:tabular-nums}
.tw-anfragewerte small{color:var(--text-3);font-size:var(--fs-label)}
.tw-kacheln{grid-column:2;grid-row:1 / span 2;display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--s1);margin:0;padding:0;list-style:none}
.tw-kachel{display:grid;gap:1px;min-width:64px;padding:5px 10px;border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-ctl);background:var(--sr-surface);text-align:right}
.tw-kachel-name{color:var(--sr-mut);font-size:var(--fs-label);letter-spacing:.04em}
.tw-kachel-wert{color:var(--sr-ink);font-size:var(--fs-body);font-weight:750;font-variant-numeric:tabular-nums}

/* ---------------------------------------------------------------- Verlauf */
.tw-verlauf{margin:0;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-surface)}
.tw-verlauf-kopf{display:flex;align-items:baseline;gap:var(--s2);padding:var(--s2) var(--s3);cursor:pointer;
  list-style:none;color:var(--sr-ink);font-size:var(--fs-body);font-weight:650}
.tw-verlauf-kopf::-webkit-details-marker{display:none}
.tw-verlauf-kopf::before{content:"";width:8px;height:8px;flex:0 0 auto;border-right:2px solid currentColor;
  border-bottom:2px solid currentColor;transform:rotate(-45deg);transition:transform .16s ease}
.tw-verlauf[open] .tw-verlauf-kopf::before{transform:rotate(45deg)}
.tw-verlauf-kopf small{color:var(--sr-mut);font-weight:400;font-size:var(--fs-label)}
.tw-verlauf-inhalt{padding:0 var(--s3) var(--s3);border-top:1px solid var(--sr-hair)}
.tw-vl{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s1);padding-top:var(--s2)}
.tw-vl-namen{display:flex;flex-wrap:wrap;gap:var(--s1) var(--s3);margin:0;padding:0;list-style:none;
  color:var(--sr-mut);font-size:var(--fs-label)}
.tw-vl-name{display:inline-flex;align-items:center;gap:var(--s1)}
.tw-vl-spitze{color:var(--text-3)}
.tw-vl-punkt{width:9px;height:9px;border-radius:2px;background:var(--tw-vl)}
.tw-vl-name--t1,.tw-vl-wert--t1,.tw-vl-band--t1{--tw-vl:var(--series-1)}
.tw-vl-name--t2,.tw-vl-wert--t2,.tw-vl-band--t2{--tw-vl:var(--series-2)}
.tw-vl-name--t3,.tw-vl-wert--t3,.tw-vl-band--t3{--tw-vl:var(--series-3)}
.tw-vl-name--t4,.tw-vl-wert--t4,.tw-vl-band--t4{--tw-vl:var(--series-4)}
.tw-vl-flaechen{position:relative;height:220px}
.tw-vl-svg{display:block;width:100%;height:220px}
.tw-vl-stop-oben{stop-color:var(--tw-vl);stop-opacity:.42}
.tw-vl-stop-unten{stop-color:var(--tw-vl);stop-opacity:.03}
.tw-vl-linie{fill:none;stroke:var(--tw-vl);stroke-width:1.4;stroke-linejoin:round}
.tw-vl-grund{stroke:var(--sr-hair);stroke-width:1;vector-effect:non-scaling-stroke}
.tw-vl-faden{--tw-faden-x:0%;position:absolute;top:0;bottom:0;left:var(--tw-faden-x);width:1px;background:var(--sr-line);
  opacity:.6;pointer-events:none}
.tw-vl-tooltip{--tw-tooltip-x:50%;position:absolute;top:4px;left:var(--tw-tooltip-x);display:flex;flex-direction:column;gap:2px;
  max-width:min(240px,70%);padding:6px 9px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl);
  background:var(--sr-surface);box-shadow:var(--e2);color:var(--sr-ink);font-size:var(--fs-label);
  transform:translateX(-50%);pointer-events:none;z-index:3}
.tw-vl-tooltip strong{font-variant-numeric:tabular-nums}
.tw-vl-wert{color:var(--tw-vl);font-weight:650;white-space:nowrap}
.tw-vl-achse{display:flex;justify-content:space-between;color:var(--text-3);font-size:var(--fs-label);
  font-variant-numeric:tabular-nums}

/* ----------------------------------------------------- Chips und Filter */
.tw-leiste{display:flex;align-items:center;justify-content:space-between;gap:var(--s2);margin:var(--s1) 0 var(--s1)}
.tw-chips{display:flex;align-items:center;gap:var(--s1);min-width:0;overflow-x:auto;scrollbar-width:thin}
.tw-chip{display:inline-flex;align-items:center;gap:6px;min-height:28px;padding:3px 10px;
  border:1px solid var(--sr-hair);background:var(--sr-surface);color:var(--sr-mut);
  font:inherit;font-size:var(--fs-label);font-weight:600;white-space:nowrap;cursor:pointer}
.tw-chip:hover{color:var(--sr-ink);background:var(--sr-soft)}
.tw-chip[aria-pressed="true"]{border-color:var(--sr-acc-line);background:var(--accent-soft);color:var(--sr-acc-ink)}
.tw-chip-zahl{color:var(--text-3);font-variant-numeric:tabular-nums;font-weight:700}
.tw-chip[aria-pressed="true"] .tw-chip-zahl{color:var(--sr-acc-ink)}
.tw-filter{flex:0 1 260px;min-width:120px;min-height:30px;padding:4px 9px;border:1px solid var(--sr-feld-line);
  border-radius:var(--sr-r-ctl);background:var(--sr-surface);color:var(--sr-ink);font:inherit;font-size:var(--fs-label)}
.tw-leerfilter{margin:0;padding:var(--s2) var(--s1);color:var(--text-3);font-size:var(--fs-body)}
/* JEDE Klasse, die display setzt, muss [hidden] ausdruecklich zurueckholen:
   die Regel des Browsers ([hidden]{display:none}) hat die niedrigere
   Spezifitaet und verliert stumm gegen die Klasse — das Element bleibt
   sichtbar, obwohl das Attribut gesetzt ist. */
.tw-karte[hidden],.tw-vl-tooltip[hidden],.tw-leerfilter[hidden]{display:none}

/* --------------------------------------------------------------- Tabelle */
.tw-request-tabelle{overscroll-behavior:auto;scrollbar-gutter:stable}
.tw-request-tabelle table{min-width:940px}
.tw-request-tabelle td{vertical-align:middle}
.tw-request-tabelle th.tw-balken-kopf .th-sort-btn{justify-content:flex-start}
.tw-sortwert{display:none}
.tw-request-link{display:block;max-width:32ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--sr-acc-ink);font-weight:650;text-decoration:none}
.tw-request-link:hover{text-decoration:underline}
.tw-request-host,.tw-request-meta{display:block;max-width:34ch;margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--sr-mut);font-size:10px}
.tw-balken-zelle{width:38%;min-width:280px;padding-block:0!important;text-align:left!important}
.tw-balken{display:block;width:100%;height:14px}
.tw-phase{fill:var(--tw-phase)}
.tw-marke{stroke-width:1;opacity:.55;stroke-dasharray:2 2}
.tw-marke--paint{stroke:var(--series-6)}
.tw-marke--lcp{stroke:var(--series-8)}
.tw-marke--dcl{stroke:var(--series-7)}
.tw-marke--onload{stroke:var(--red);opacity:.75;stroke-dasharray:none}
.tw-root :is(summary,button,a):focus-visible{outline:2px solid var(--accent);outline-offset:3px}

/* Spaltensichtbarkeit je Darstellung (Spaltenfolge siehe Dateikopf). */
[data-tw-ansicht="tabelle"] .tw-request-tabelle :is(th,td):nth-child(n+7):nth-child(-n+13){display:none}
[data-tw-ansicht="zeitachse"] .tw-request-tabelle :is(th,td):nth-child(n+2):nth-child(-n+13){display:none}
[data-tw-ansicht="zeitachse"] .tw-request-tabelle table{min-width:420px}
[data-tw-ansicht="zeitachse"] .tw-balken-zelle{width:74%}
[data-tw-ansicht="zeitachse"] .tw-balken{height:22px}
[data-tw-ansicht="zeitachse"] .tw-request-link{max-width:44ch}
[data-tw-ansicht="phasen"] .tw-request-tabelle table{min-width:1320px}

/* ----------------------------------------------------- Karte beim Zeigen */
.tw-karte{--tw-karte-x:0px;--tw-karte-y:0px;position:fixed;top:var(--tw-karte-y);left:var(--tw-karte-x);z-index:60;
  display:grid;gap:var(--s2);width:min(360px,calc(100vw - 16px));max-height:min(70vh,520px);overflow:auto;
  padding:var(--s3);border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);
  background:var(--sr-surface);box-shadow:var(--e3);color:var(--sr-ink);font-size:var(--fs-label)}
.tw-karte-url{margin:0;overflow-wrap:anywhere;color:var(--sr-ink);font-family:var(--font-mono);font-size:11px;line-height:1.45}
.tw-karte-werte{display:grid;grid-template-columns:auto 1fr;gap:2px var(--s2);margin:0}
.tw-karte-werte>div{display:contents}
.tw-karte-werte dt{color:var(--sr-mut)}
.tw-karte-werte dd{margin:0;overflow-wrap:anywhere;color:var(--sr-ink);font-weight:650;font-variant-numeric:tabular-nums}
.tw-karte-phasen{display:grid;gap:3px;margin:0;padding-top:var(--s2);border-top:1px solid var(--sr-hair)}
.tw-karte-phase{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:2px var(--s2);align-items:center}
.tw-karte-phase dt{display:inline-flex;align-items:center;gap:var(--s1);color:var(--sr-mut)}
.tw-karte-phase dd{margin:0;color:var(--sr-ink);font-variant-numeric:tabular-nums}
.tw-karte-mini{grid-column:1 / -1;display:block;width:100%;height:6px}

/* ------------------------------------------------------------- Fusszeile */
.tw-fuss{display:flex;flex-wrap:wrap;justify-content:space-between;gap:var(--s1) var(--s3);
  padding-top:var(--s2);border-top:1px solid var(--sr-hair);color:var(--text-3);font-size:var(--fs-label)}
.tw-fuss-links{overflow-wrap:anywhere}
.tw-fuss-rechts{text-align:right;overflow-wrap:anywhere}

@media(max-width:700px){
  .tw-kopf{align-items:flex-start;flex-wrap:wrap}
  .tw-seite-kopf,.tw-seite-inhalt{padding-inline:var(--s2)}
  .tw-tafel-kopf{grid-template-columns:minmax(0,1fr)}
  .tw-kacheln{grid-column:1;grid-row:auto;justify-content:flex-start}
  .tw-kachel{flex:1 1 calc(50% - var(--s1))}
  .tw-anfragewerte{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s1) var(--s2)}
  .tw-leiste{flex-wrap:wrap}
  .tw-filter{flex:1 1 100%}
  .tw-request-tabelle{max-width:100%;overflow-x:auto}
  .tw-balken-zelle{min-width:180px}
  .tw-steuerung-rechts{margin-left:0}
  /* Die Karte wird zum unteren Blatt: bei 390 px hat eine schwebende Karte
     keinen Platz, an dem sie nicht die Zeile verdeckt, die sie erklaert. */
  .tw-karte{top:auto;left:0;right:0;bottom:0;width:auto;max-height:62vh;
    border-radius:var(--sr-r-card) var(--sr-r-card) 0 0}
}
@media(prefers-reduced-motion:reduce){.tw-seite-pfeil,.tw-verlauf-kopf::before{transition:none}}

/* ---------------------------------------------------- Vollbild-Dokument */
.tw-dokument{margin:0;padding:0;min-width:0;background:var(--sr-bg);color:var(--sr-ink);overflow:hidden}
.tw-dokument-inhalt{box-sizing:border-box;width:100%;height:100dvh;padding:8px;gap:4px;grid-template-rows:minmax(0,1fr)}
.tw-dokument-wasserfall,.tw-dokument .tw-tafel{min-width:0;min-height:0}
.tw-dokument-wasserfall{display:flex;flex-direction:column}
.tw-dokument .tw-tafel:not([hidden]){display:flex;flex-direction:column;flex:1;gap:4px}
.tw-dokument .tw-tafel[hidden]{display:none}
.tw-dokument .tw-steuerung{flex:0 0 auto;padding:2px 0 4px}
.tw-dokument .tw-seg-knopf{min-height:26px;padding:3px 9px}
.tw-dokument .tw-tafel-kopf{padding-top:var(--s2);padding-bottom:2px;gap:var(--s1) var(--s3)}
.tw-dokument .tw-tafel-titel{font-size:15px}
.tw-dokument .tw-kachel{min-width:56px;padding:3px 8px}
.tw-dokument .tw-leiste{margin-block:2px}
.tw-dokument .tw-request-tabelle{flex:1;height:auto;min-height:0;max-height:none!important;margin-top:0;overflow:auto;overscroll-behavior:contain}
.tw-dokument .tw-request-tabelle table{width:100%;min-width:900px}
/* Zellenpolsterung 6 px: sie IST der Abstand zwischen der letzten linken
   Spalte und dem senkrechten Strich vor der Zeitachse (Auftrag Punkt 2). */
.tw-dokument .tw-request-tabelle :is(th,td){height:21px;padding:1px 6px;font-size:11px;line-height:1}
.tw-dokument .tw-request-tabelle th{height:22px;font-size:10px}
.tw-dokument .tw-request-meta{display:none}
.tw-dokument .tw-request-host{display:none}
.tw-dokument .tw-request-tabelle .tw-request-link{max-width:38ch;padding:0;font-size:11px;line-height:14px;background:transparent;border-radius:0}
.tw-dokument .tw-balken-zelle{width:56%;min-width:360px}
/* Der durchgehende Strich links der Zeitachse — an jeder Zeile UND am
   Spaltenkopf, damit er nicht an der ersten Datenzeile beginnt. */
.tw-dokument .tw-request-tabelle :is(th,td).tw-balken-zelle{border-left:1px solid var(--sr-hair)}
.tw-dokument .tw-verlauf-inhalt{padding-bottom:var(--s2)}
.tw-dokument .tw-fuss{padding-top:4px}
@media(max-width:700px){
  .tw-dokument{overflow:auto}
  .tw-dokument-inhalt{height:auto;min-height:100dvh}
  .tw-dokument .tw-request-tabelle{height:auto;max-width:100%;overflow:auto}
}
@media print{.tw-steuerung,.tw-leiste,.tw-karte{display:none}.tw-request-tabelle{min-height:0;max-height:none!important;overflow:visible}}


/* ---- technik-tempo.css ---- */
.tt-root{display:grid;gap:var(--s3);min-width:0}.tt-auswahl,.tt-skalen{display:flex;flex-wrap:wrap;gap:var(--s1);margin-bottom:var(--s3)}.tt-auswahl button,.tt-skalen button{min-height:36px;padding:6px 13px;border:1px solid var(--sr-hair);border-radius:999px;background:var(--sr-soft);color:var(--sr-mut);font:inherit;font-size:var(--fs-label);cursor:pointer}.tt-auswahl button[aria-selected=true],.tt-skalen button[aria-selected=true]{border-color:var(--sr-acc-line);background:var(--sr-surface);color:var(--sr-ink);box-shadow:var(--edge)}.tt-metriken{display:grid;grid-template-columns:repeat(auto-fit,minmax(108px,1fr));gap:var(--s2);margin-bottom:var(--s3)}.tt-metrik{display:grid!important;grid-template-columns:12px 1fr;gap:3px 7px;min-width:0;padding:10px 12px;border:1px solid var(--sr-hair);border-radius:6px;background:var(--sr-soft);color:var(--sr-mut);cursor:pointer}.tt-metrik input{position:absolute;opacity:0;pointer-events:none}.tt-metrik .kw-wahl-farbe{grid-row:1/3;align-self:center;width:10px;height:10px;border:1px solid var(--sr-hair);border-radius:50%}.tt-metrik span:not(.kw-wahl-farbe){overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--fs-label)}.tt-metrik strong{color:var(--sr-ink);font-size:var(--fs-body);font-variant-numeric:tabular-nums}.tt-metrik:has(input:checked){border-color:var(--sr-acc-line);background:var(--sr-surface);box-shadow:var(--edge)}.tt-chartbereich{min-width:0;padding:var(--s2);border:1px solid var(--sr-hair);border-radius:6px;background:var(--sr-soft)}.tt-root [hidden]{display:none!important}.tt-details{margin-top:var(--s3);border-top:1px solid var(--sr-hair)}.tt-details summary{padding:var(--s3) 0 var(--s2);color:var(--sr-acc-ink);font-size:var(--fs-label);font-weight:650;cursor:pointer}.tt-tabelle{max-height:430px}.tt-tabelle table{min-width:900px}.tt-quellenzeile{margin:var(--s2) 0 0;color:var(--sr-mut);font-size:var(--fs-label)}.tt-meta{display:grid;grid-template-columns:max-content 1fr;gap:var(--s1) var(--s3);margin:0}.tt-meta dt{color:var(--sr-mut)}.tt-meta dd{margin:0;color:var(--sr-ink);overflow-wrap:anywhere}.tt-root :is(button,summary,a,label):focus-visible{outline:2px solid var(--accent);outline-offset:3px}@media(max-width:700px){.tt-metriken{grid-template-columns:repeat(2,minmax(0,1fr))}.tt-chartbereich{padding:var(--s1)}.tt-meta{grid-template-columns:1fr}.tt-meta dd{margin-bottom:var(--s1)}}@media(prefers-reduced-motion:reduce){.tt-root *{scroll-behavior:auto!important}}
.tt-kopf{display:flex;align-items:center;justify-content:space-between;gap:var(--s2)}.tt-kopf h3{margin:0;color:var(--sr-ink);font-size:var(--fs-h2)}.tt-metrik:focus-within{outline:2px solid var(--accent);outline-offset:3px}
.tt-metrik-hilfe{position:fixed;z-index:10000;box-sizing:border-box;width:min(340px,calc(100vw - 16px));padding:12px 14px;border:1px solid var(--sr-hair);border-radius:8px;background:var(--sr-surface);color:var(--sr-ink);box-shadow:0 6px 24px #0003;font-size:var(--fs-label);line-height:1.5;white-space:normal}.tt-metrik-hilfe[hidden]{display:none}
.tt-phasen{margin:0 0 var(--s3)}.tt-phasen summary{width:fit-content;margin-bottom:var(--s2);color:var(--sr-acc-ink);font-size:var(--fs-label);cursor:pointer}.tt-quellenzeile + [data-tt-choice-root]{margin-top:var(--s3)}


/* ---- keyword-quellen.css ---- */
.kw-tabellen-vorlauf { margin-inline:18px; }
#eigene-keywords-verlauf:not([open]) > summary { padding-bottom:var(--s3); }
.kw-verlauf-hilfe { display:flex; justify-content:flex-end; margin-bottom:var(--s2); }
:is(.kw-tracking-chart, #ki-sichtbarkeit) .chart-kopf { gap:6px; flex-wrap:wrap; margin-bottom:12px; }
.kw-tracking-chart .chart-quellen { display:flex; align-items:center; gap:4px; margin-right:auto; }
.kw-tracking-chart .chart-quelle-btn { display:inline-flex; align-items:center; gap:6px; min-height:30px; padding:4px 8px; border:0; border-radius:var(--sr-r-ctl); font:500 var(--fs-label) var(--font-body); color:var(--sr-mut); background:transparent; cursor:pointer; opacity:.55; }
.kw-tracking-chart .chart-quelle-btn::before { content:''; width:7px; height:7px; border-radius:50%; background:var(--sr-acc); }
.kw-tracking-chart .chart-quelle-btn + .chart-quelle-btn::before { background:var(--sr-ok); }
.kw-tracking-chart .chart-quelle-btn.aktiv { opacity:1; background:var(--sr-soft); color:var(--sr-ink); }
:is(.kw-tracking-chart, #ki-sichtbarkeit) .chart-zr-btn { padding-inline:8px; }
:is(.kw-tracking-chart, #ki-sichtbarkeit) .chart-zeitraum--kalender { margin-left:auto; flex-wrap:nowrap; align-items:center; }
.kw-tracking-chart .kw-wahl { margin:12px 0 0; padding:0; background:none; border:0; border-radius:0; box-shadow:none; }
.kw-tracking-chart .kw-wahl-chips { gap:4px; padding:0; margin:0; background:none; border:0; border-radius:0; }
.kw-tracking-chart .kw-wahl-chip { min-height:28px; padding:4px 7px; border-radius:var(--sr-r-ctl); font-size:var(--fs-label); font-weight:500; background:transparent; color:var(--sr-mut); }
.kw-tracking-chart .kw-wahl-chip:hover { background:var(--sr-soft); color:var(--sr-ink); }
.kw-tracking-chart .kw-wahl-chip.aktiv { background:var(--accent-soft); color:var(--sr-acc-ink); box-shadow:none; }
.kw-tracking-chart .kw-wahl-facette { display:inline-flex; gap:4px; margin:4px 16px 4px 0; }
.kw-tracking-chart .kw-wahl-kopf { padding:10px 0; gap:8px; border:0; }
.kw-tracking-chart .kw-wahl-liste { padding:8px 0; gap:4px 14px; grid-template-columns:repeat(auto-fit,minmax(min(100%,330px),1fr)); }
.kw-tracking-chart .kw-wahl-item { padding:7px 6px; align-items:center; }
.kw-tracking-chart .kw-wahl-name { white-space:normal; overflow:visible; text-overflow:clip; overflow-wrap:anywhere; font-size:var(--fs-small); line-height:1.4; }
.kw-tracking-chart .kw-wahl-meta { font-size:var(--fs-label); }
.kw-tracking-chart .kw-wahl-details { border-top:1px solid var(--sr-hair); }
.kw-tracking-chart .kw-wahl-details > summary { display:flex; align-items:center; gap:7px; padding:10px 0; list-style:none; cursor:pointer; font-size:var(--fs-small); color:var(--sr-mut); }
.kw-tracking-chart .kw-wahl-details > summary::-webkit-details-marker { display:none; }
.kw-tracking-chart .kw-wahl-details > summary::before { content:'›'; display:inline-block; font-size:20px; line-height:1; transition:transform .16s ease; }
.kw-tracking-chart .kw-wahl-details[open] > summary::before { transform:rotate(90deg); }
.kw-tracking-chart .kw-wahl-meta { display:flex; align-items:center; gap:6px; }
.kw-tracking-chart .kw-wahl-quelle { font-size:10px; color:var(--sr-mut); }
.kw-daten-fehlt { display:inline-grid; place-items:center; width:15px; height:15px; border:1px solid var(--sr-hair); border-radius:50%; font-size:10px; color:var(--sr-mut); }
.kw-quellverlaeufe { display:flex; flex-direction:column; gap:3px; min-width:88px; }
.kw-positionen { display:inline-grid; gap:3px; min-width:104px; text-align:left; }
.kw-position { display:grid; grid-template-columns:minmax(54px,auto) minmax(24px,auto); align-items:baseline; gap:7px; }
.kw-position-label { display:inline-flex; align-items:center; gap:5px; color:var(--sr-mut); font-size:10px; font-weight:var(--fw-ui); white-space:nowrap; }
.kw-position-wert { color:var(--sr-ink); font-variant-numeric:tabular-nums; text-align:right; white-space:nowrap; }
.kw-position[hidden] { display:none; }
.kw-quellverlauf { display:flex; align-items:center; gap:5px; min-height:22px; }
.kw-quellverlauf > svg { flex:0 0 auto; }
.kw-quellverlauf-label { flex:0 0 12px; font-size:10px; color:var(--sr-mut); }
.kw-volumen-quellen { display:inline-grid; gap:2px; min-width:74px; text-align:right; }
.kw-volumen-quelle { display:grid; grid-template-columns:34px minmax(30px,auto); align-items:baseline; gap:6px; white-space:nowrap; }
.kw-volumen-quelle small { color:var(--sr-mut); font-size:10px; font-weight:var(--fw-ui); text-align:left; }
.kw-volumen-quelle > span { color:var(--sr-ink); font-variant-numeric:tabular-nums; }
.kw-spark-einzel { display:inline-block; padding-inline:6px; color:var(--sr-acc); }
.kw-tracking-chart :is(button,summary):focus-visible { outline:2px solid var(--focus-ton); outline-offset:2px; }
@media (max-width:559px) {
  :is(.kw-tracking-chart, #ki-sichtbarkeit) .chart-kopf { gap:6px 4px; }
  :is(.kw-tracking-chart, #ki-sichtbarkeit) .chart-zeitraum--kalender { order:3; width:100%; justify-content:flex-end; }
  :is(.kw-tracking-chart, #ki-sichtbarkeit) .chart-zeitraum-felder { right:0; }
  .kw-tracking-chart .kw-wahl-zaehler { white-space:normal; }
}
@media (max-width:559px) {
  #eigene-keywords-verlauf:not([open]) > summary { padding-bottom:14px; }
}
.kw-quellen-filter { display:flex; align-items:center; justify-content:space-between; flex-wrap:nowrap; gap:12px; margin:0 0 var(--s2); position:relative; color:var(--sr-mut); font-size:var(--fs-label); }
.kw-quellen-legende { display:flex; align-items:center; gap:4px; flex:0 0 auto; margin-right:auto; }
.kw-quellen-optionen { display:flex; align-items:center; justify-content:flex-end; flex-wrap:wrap; gap:4px; min-width:0; }
.kw-quellen-filter button,.kw-quellen-filter a,.kw-quellen-filter summary { box-sizing:border-box; min-height:30px; border:0; border-radius:var(--sr-r-ctl); background:transparent; color:var(--sr-mut); font:inherit; font-weight:var(--fw-ui); text-decoration:none; cursor:pointer; }
.kw-quellen-filter button:hover,.kw-quellen-filter a:hover,.kw-quellen-filter summary:hover { background:var(--sr-soft); color:var(--sr-ink); }
.kw-quellen-filter button[data-kw-quelle-schalter] { display:inline-flex; align-items:center; gap:5px; padding:4px 7px; white-space:nowrap; opacity:.68; }
.kw-quellen-filter button[data-kw-quelle-schalter][aria-pressed="true"] { background:var(--sr-soft); color:var(--sr-ink); opacity:1; }
.kw-quelle-punkt { width:7px; height:7px; flex:0 0 7px; border-radius:50%; background:var(--sr-mut); }
.kw-quelle-punkt--eigen { background:var(--sr-acc); }
.kw-quelle-punkt--system { background:var(--sr-warn, #c47a16); }
.kw-wahl-quelle--system { color:var(--sr-warn-ink); }
.kw-quellverlauf--system svg { color:var(--sr-warn); }
.kw-quelle-punkt--gsc { background:var(--sr-ok); }
.kw-pflege-filter { display:flex; flex-wrap:wrap; gap:4px; margin-bottom:var(--s2); }
.kw-pflege-filter button { display:inline-flex; align-items:center; gap:5px; min-height:30px; padding:4px 8px; border:0; border-radius:var(--sr-r-ctl); background:transparent; color:var(--sr-mut); font:inherit; font-weight:var(--fw-ui); cursor:pointer; }
.kw-pflege-filter button[aria-pressed="true"] { background:var(--sr-soft); color:var(--sr-ink); }
.kw-quelle-zahl { color:var(--sr-mut); font-variant-numeric:tabular-nums; }
.kw-zeitraum-knopf { display:inline-grid; place-items:center; min-width:30px; padding:3px 5px; }
.kw-quellen-filter .ist-aktiv,.kw-quellen-filter .kw-zeitraum-knopf[aria-current="true"] { background:var(--accent-soft); color:var(--sr-acc-ink); }
.kw-tabellen-frei { position:relative; flex:0 0 auto; }
.kw-tabellen-frei summary { display:flex; align-items:center; gap:4px; padding:3px 7px; list-style:none; white-space:nowrap; }
.kw-tabellen-frei summary::-webkit-details-marker { display:none; }
.kw-tabellen-frei form { position:absolute; z-index:30; top:calc(100% + 6px); right:0; display:grid; grid-template-columns:1fr 1fr; gap:10px; width:max-content; max-width:min(360px,calc(100vw - 36px)); padding:12px; border:1px solid var(--sr-hair); border-radius:var(--sr-r-card); background:var(--sr-surface); box-shadow:var(--e2); }
.kw-tabellen-frei label { display:grid; gap:4px; color:var(--sr-mut); font-size:var(--fs-label); }
.kw-tabellen-frei input { min-width:0; min-height:34px; padding:4px 8px; border:1px solid var(--sr-hair); border-radius:var(--sr-r-ctl); background:var(--surface); color:inherit; }
.kw-tabellen-frei form button { grid-column:2; justify-self:end; padding-inline:10px; background:var(--sr-soft); }
.kw-tabellen-fehler { grid-column:1/-1; margin:0; color:var(--sr-err-ink); }
.kw-icon-knopf { width:30px; padding:0; font-size:18px !important; line-height:1; }
.kw-csv-knopf { padding:3px 7px; }
.kw-quellen-leer { padding:var(--s4); color:var(--sr-mut); text-align:center; }
.kw-quellen-tabelle tbody tr[data-row-url] { cursor:pointer; }
.kw-quellen-tabelle th { position:relative; cursor:grab; user-select:none; touch-action:pan-y; }
.kw-quellen-tabelle th .th-sort-btn { width:auto; cursor:grab; }
.kw-spalte-gezogen { opacity:.55; }
.kw-spalte-ziel-vor { box-shadow:inset 3px 0 0 var(--sr-acc); }
.kw-spalte-ziel-nach { box-shadow:inset -3px 0 0 var(--sr-acc); }
.kw-spalten-ziehen th,.kw-spalten-ziehen th .th-sort-btn { cursor:grabbing; }
.kw-quellen-tabelle + .kw-quellen-leer { margin-inline:18px; }
@media (max-width:760px) {
  .kw-quellen-filter { flex-wrap:wrap; }
  .kw-quellen-optionen { flex-basis:100%; }
  .kw-tabellen-frei { position:static; }
  .kw-tabellen-frei form { inset:calc(100% + 6px) 0 auto; width:auto; max-width:none; }
}

/* Kompakte Namen bleiben die gemeinsame Trefffläche für Sortieren und Ziehen. */
.kw-quellen-tabelle th .th-sort-btn, .kw-spalten-name { user-select:none; -webkit-user-select:none; touch-action:pan-y; }
.kw-spalten-name { display:inline-flex; align-items:center; min-height:24px; padding:5px 0; margin:-5px 0; border:0; background:none; color:inherit; font:inherit; text-transform:inherit; letter-spacing:inherit; cursor:grab; }
.kw-spalten-name:focus-visible { outline:2px solid var(--focus-ton); outline-offset:2px; }
.kw-quellen-tabelle th[aria-sort="ascending"], .kw-quellen-tabelle th[aria-sort="descending"] { color:var(--sr-acc-ink); }
html .sr-app .kw-quellen-tabelle table :is(th,td).sr-wahl-spalte:first-child { width:26px; min-width:26px; padding-inline:5px; text-align:center; }
.kw-ziel-link { display:inline-block; max-width:150px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; vertical-align:middle; font-size:var(--fs-label); }
.kw-soforthilfe { position:fixed; z-index:250; width:max-content; max-width:min(380px,calc(100vw - 16px)); max-height:min(320px,70vh); overflow:auto; padding:10px 12px; background:var(--sr-surface); color:var(--sr-ink); border:1px solid var(--sr-hair); border-radius:var(--sr-r-ctl); box-shadow:var(--e2); font-size:var(--fs-small); line-height:1.5; pointer-events:none; }
.kw-soforthilfe[hidden] { display:none; }
.kw-quellverlaeufe [data-kw-hilfe] { cursor:help; }

.kw-spalten-vorschau { position:fixed; z-index:260; pointer-events:none; padding:8px 12px; border:1px solid var(--sr-acc); border-radius:2px; background:var(--sr-surface); color:var(--sr-acc-ink); box-shadow:var(--e2); font-size:var(--fs-label); font-weight:700; text-transform:uppercase; }
.kw-spalten-vorschau[hidden] { display:none; }

/* Keyword-Bereich: klare Kartenflächen und ein gemeinsames 16-px-Raster. */
#keywords { --kw-abstand:16px; }
#keywords :is(.sr-verwaltung,#cluster,.kw-pflege) { gap:var(--kw-abstand); }
:root:not([data-theme="dark"]):not([data-theme="medium"]) #keywords :is(.sr-karte,.sr-kpi,.ck-w):not([data-wz-transparent="1"]) {
  border-color:#d9e1e9;
  box-shadow:0 1px 2px rgb(28 48 68 / 7%),0 5px 16px rgb(28 48 68 / 6%);
}
#keywords .sr-karte-kopf { gap:10px; }
#keywords .sr-karte-kopf .sr-karte-meta { font-size:var(--fs-label); }
#keywords #cluster { display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px; }
#keywords #cluster > :first-child { grid-column:1/-1; }

/* Datum und vier Hauptkennzahlen bleiben als kompakte Kopfzeile zusammen. */
#keyword-uebersicht .kwu-kopf { --ck-w-hoehe:76px;display:grid;grid-template-columns:auto minmax(0,1fr);gap:16px;min-width:0;align-items:stretch; }
#keyword-uebersicht .kwu-kopf-kpis { min-width:0; }
#keyword-uebersicht .kwu-kopf .sr-kpi-gitter { display:grid;grid-template-columns:repeat(4,minmax(0,1fr));height:100%;gap:12px; }
#keyword-uebersicht .kwu-kopf .sr-kpi { min-width:0;min-height:76px;padding:9px 10px; }
#keyword-uebersicht .kwu-kopf .sr-kpi-label { font-size:10px; }
#keyword-uebersicht .kwu-kopf .sr-kpi-wert { min-width:0;font-size:var(--fs-kpi-compact);overflow-wrap:anywhere; }
#keyword-uebersicht .kwu-kopf .sr-kpi-meta:empty { display:none; }
#keyword-uebersicht .kwu-kopf .sr-kpi-zeile { flex-wrap:wrap;gap:3px 6px; }
#keyword-uebersicht .kwu-kopf .ck-w--zeitraum { min-width:0; }
#keyword-uebersicht .kw-kpis--unten .sr-kpi-gitter { display:grid;grid-auto-flow:row;grid-template-columns:repeat(4,minmax(0,1fr)); }
#keyword-uebersicht .kw-kpis--unten .sr-kpi { min-height:116px; }

/* Die blaue Titelzone endet nach dem Titel und läuft dann WEICH aus:
   doppelt so lange Übergangsstrecke wie zuerst gebaut (Betreiber-Korrektur
   18.09.2026 — „das Blau geht zu schnell ins Hellblau und dann ins Weiß"). */
.sr-briefing--banner > .sr-briefing-kopf {
  min-height:52px;padding-block:8px;padding-right:64px;background-color:var(--sr-surface);border-radius:var(--sr-r-card);
  background-image:linear-gradient(100deg,var(--knopf-blau) 0 190px,color-mix(in srgb,var(--knopf-blau) 45%,var(--sr-surface)) 310px,var(--sr-surface) 450px);
}
.sr-briefing--banner > .sr-briefing-kopf > .sr-karte-titel { color:var(--auf-knopf); }
.sr-briefing--banner > .sr-briefing-kopf > .sr-karte-meta { color:var(--sr-mut); }
.sr-briefing--banner > .sr-briefing-info { top:10px; }
.sr-briefing--banner[open] > .sr-briefing-koerper { padding-top:12px; }
.sr-briefing--banner > .sr-briefing-kopf > .sr-karte-klapp-pfeil {
  display:grid;place-items:center;width:32px;height:32px;margin-top:0;transform:none;border:1px solid color-mix(in srgb,var(--sr-acc-ink) 28%,transparent);
  border-radius:var(--sr-r-card);background:var(--sr-surface);color:var(--sr-ink);box-shadow:0 2px 5px rgb(0 0 0 / 12%);
}
.sr-briefing--banner > .sr-briefing-kopf > .sr-karte-klapp-pfeil::before {
  content:'';width:9px;height:9px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:translateY(-2px) rotate(45deg);transition:transform .18s ease;
}
.sr-briefing--banner[open] > .sr-briefing-kopf > .sr-karte-klapp-pfeil::before { transform:translateY(2px) rotate(225deg); }
.sr-briefing--banner > .sr-briefing-kopf:hover > .sr-karte-klapp-pfeil { background:var(--sr-soft); }

#keyword-uebersicht .ru-reihe { grid-template-columns:repeat(3,minmax(0,1fr));align-items:stretch; }
#keyword-uebersicht .ru-kachel--breit { grid-column:span 2; }
#keyword-uebersicht .qw-charts--figuren { grid-template-columns:repeat(2,minmax(0,1fr));gap:24px; }
#keyword-uebersicht .qw-chart + .qw-chart { padding-left:24px;border-left:1px solid var(--sr-hair); }
#keyword-uebersicht .qw-chart h4 { font-size:14px; }
#keyword-uebersicht .kwf-donut { justify-content:stretch;gap:16px; }
#keyword-uebersicht .kwf-donut-bild { width:150px; }
#keyword-uebersicht .kwf-legende { flex-basis:100%;gap:8px; }
#keyword-uebersicht .kwf-gauge { grid-template-columns:minmax(0,1fr);justify-items:center;gap:12px; }
#keyword-uebersicht .kwf-gauge > * { grid-column:1;grid-row:auto;width:100%; }
#keyword-uebersicht .kwf-gauge > .kwf-gauge-bild { width:150px; }
#keyword-uebersicht .ru-kachel > .sr-karte > .sr-karte-koerper { display:flex;flex-direction:column;gap:12px; }
#keyword-uebersicht .ru-kachel-ziel { margin-top:auto;padding-top:12px;border-top:1px solid var(--sr-hair); }

#keywords #keyword-quickwins .kw-qw-raster { display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;align-items:start; }
#keywords #keyword-quickwins .kw-qw-breit { grid-column:1/-1; }
#keywords #keyword-quickwins .qw-detail-einstieg { padding:18px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-surface);box-shadow:var(--sr-e1); }
#keywords #keyword-quickwins .qw-detail-einstieg-kopf { align-items:start; }
#keywords #keyword-quickwins .qw-detail-einstieg-kopf p { max-width:62ch; }
#keywords #keyword-quickwins .kw-qw-raster > .sr-karte .qw-detail-ablauf { grid-template-columns:1fr;gap:8px;border:0; }
#keywords #keyword-quickwins .kw-qw-raster > .sr-karte .qw-detail-ablauf li { padding:0 0 8px;border:0;border-bottom:1px solid var(--sr-hair);grid-template-columns:minmax(0,1fr);gap:4px; }
#keywords #keyword-quickwins .kw-qw-raster > .sr-karte .qw-detail-ablauf li::after { display:none; }
#keywords #keyword-quickwins .kw-qw-raster > .sr-karte .qw-detail-zielzeile { grid-template-columns:minmax(0,1fr); }
#keywords #keyword-quickwins .kw-qw-raster > .sr-karte .qw-detail-tabelle table { min-width:0; }

/* Die Pflegefunktionen stehen rechts; der Suchfilter nutzt den Zwischenraum. */
#ukb-keywords .recherche-nav-verwalten { margin-left:auto; }
#ukb-keywords .recherche-nav-verwalten > summary { width:42px;justify-content:flex-end;padding:6px 0 6px 6px;color:var(--sr-acc-ink); }
#ukb-keywords .recherche-nav-verwalten > summary:hover { background:var(--sr-soft); }
.kw-quellen-suche { flex:1 1 200px;min-width:140px; }
.kw-quellen-suche:empty { display:none; }
.kw-quellwerte{display:grid;gap:6px;min-width:0}
.kw-quellwert{display:flex;align-items:baseline;gap:8px;min-width:0}
.kw-quellwert[hidden]{display:none}
.kw-quellwert>small{flex:0 0 48px;color:var(--sr-mut);font-size:var(--fs-label)}
.kw-quellwert .kw-ziel-link{min-width:0;overflow:hidden;text-overflow:ellipsis}
.kw-quellen-suche .sr-werkzeug-filter { width:100%;min-width:0;min-height:34px; }
.kw-quellen-legende { margin-right:0; }
.kw-quellen-optionen .kw-tabellen-frei { margin-left:12px; }
.kw-csv-knopf { display:inline-flex;align-items:center;gap:6px; }
#keywords .sr-werkzeugzeile:has(+ .kw-quellen-tabelle) { margin-block:0; }
.kw-pflege-kopf { display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr);gap:16px;align-items:stretch; }
.kw-pflege-kopf:has(> :only-child) { grid-template-columns:minmax(0,1fr); }
#keywords .kw-pflege-kopf .pk-kontingent { width:auto;margin:0;display:flex;flex-direction:column; }
#keywords .kw-pflege-kopf .pk-kontingent > .sr-pegel { flex:1;width:100%;justify-content:center;gap:12px; }
#keywords .kw-pflege-kopf :is(.pg-rest,.pg-ton,.pk-kontingent-takt) { display:none; }
#keywords .kw-pflege-kopf .kw-kontingent { margin:0;font-size:var(--fs-label); }

@media(max-width:1250px) {
  #keyword-uebersicht .kwu-kopf { grid-template-columns:1fr; }
  #keyword-uebersicht .kwu-kopf .ck-w--zeitraum { justify-content:space-between;min-height:64px; }
  #keyword-uebersicht .ru-reihe { grid-template-columns:repeat(2,minmax(0,1fr)); }
}
@media(max-width:760px) {
  #keywords #cluster,#keywords #keyword-quickwins .kw-qw-raster,.kw-pflege-kopf { grid-template-columns:minmax(0,1fr); }
  #keyword-uebersicht .kwu-kopf .sr-kpi-gitter,#keyword-uebersicht .kw-kpis--unten .sr-kpi-gitter { grid-template-columns:repeat(2,minmax(0,1fr)); }
  #keyword-uebersicht .kwu-kopf .ck-w--zeitraum { flex-wrap:wrap;gap:10px; }
  #keyword-uebersicht .ru-reihe { grid-template-columns:minmax(0,1fr); }
  #keyword-uebersicht .ru-kachel--breit { grid-column:auto; }
  #keyword-uebersicht .qw-charts--figuren { gap:12px; }
  #keyword-uebersicht .qw-chart + .qw-chart { padding-left:12px; }
  #keyword-uebersicht .kwf-donut-bild { width:120px; }
  #keyword-uebersicht .kwf-gauge > .kwf-gauge-bild { width:120px; }
  .kw-quellen-suche { flex-basis:calc(100% - 180px); }
  .sr-briefing--banner > .sr-briefing-kopf {
    background-image:linear-gradient(100deg,var(--knopf-blau) 0 155px,color-mix(in srgb,var(--knopf-blau) 42%,var(--sr-surface)) 255px,var(--sr-surface) 365px);
  }
}
@media(prefers-reduced-motion:reduce) { .sr-briefing--banner > .sr-briefing-kopf > .sr-karte-klapp-pfeil::before { transition:none; } }

.kw-herkunft-option { display: inline-flex; align-items: center; gap: 6px; padding: 6px 8px; font-size: var(--fs-small, 12px); cursor: pointer; }


/* ---- sidebar-rail.css ---- */
/* Navigation: eine fließende Breitenänderung, unabhängig vom mobilen Drawer. */
.sr-nav .sr-nav-item-icon,.sr-nav .sr-nav-item-icon svg{width:19.36px;height:19.36px;flex-shrink:0}
.sr-nav .sr-nav-item{font-size:calc(var(--fs-ui)*1.1);line-height:22px}
.sr-nav .sr-nav-gruppe-text,.sr-nav .sr-nav-label{font-size:calc(var(--fs-label)*1.1)}
.sr-sidebar-toggle{display:flex;align-items:center;justify-content:center;position:static;width:38px;height:38px;padding:8px;border:1px solid transparent;border-radius:var(--sr-r-ctl);background:transparent;color:var(--sr-mut);cursor:pointer;flex-shrink:0}
.sr-sidebar-toggle svg{width:22px;height:22px;flex:none;transition:transform .4s cubic-bezier(.22,.8,.22,1)}
.sr-sidebar-toggle:hover{color:var(--sr-acc-ink);background:var(--sr-soft);border-color:var(--sr-hair)}
.sr-projektkarte-icon{display:none;width:24px;height:24px;flex:0 0 24px}
.sr-projektkarte-icon svg{width:100%;height:100%}
.sr-sidebar-tooltip{position:fixed;z-index:200;max-width:min(280px,calc(100vw - 88px));padding:8px 12px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl);background:var(--sr-surface);color:var(--sr-ink);box-shadow:var(--sr-e-modal);font-size:var(--fs-small);font-weight:600;line-height:1.35;pointer-events:none;overflow-wrap:anywhere}
.sr-nav-bedienung{gap:4px;padding:8px;flex-shrink:0}
.sr-nav-bedienung .zahnrad{flex:0 0 auto;min-width:0}
.sr-nav-bedienung .usermenu--kopf{flex:0 0 auto}
.sr-nav-bedienung .sr-kopf-glocke{width:38px;height:38px}
.sr-nav-bedienung .sr-glocke-drop{position:fixed;left:calc(var(--sr-nav-w) + 8px);right:auto;top:auto;bottom:12px}
.sr-nav-bedienung :where(.sr-kopf-glocke,.sr-glocke-eintrag):focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:-2px}
.sr-nav-bedienung .zahnrad-btn{display:flex;align-items:center;justify-content:flex-start;gap:9px;width:100%;height:38px;padding:8px 10px;font-size:var(--fs-small)}
.sr-nav-bedienung .zahnrad-btn svg,.sr-nav-abmelden svg{width:19.36px;height:19.36px;flex-shrink:0}
.sr-nav-abmelden{margin:0;flex-shrink:0}
.sr-nav-abmelden button{display:flex;align-items:center;justify-content:center;width:38px;height:38px;padding:8px;border:0;border-radius:var(--sr-r-ctl);background:transparent;color:var(--sr-mut);cursor:pointer}
.sr-nav-abmelden button:hover{background:var(--sr-soft);color:var(--sr-err-ink)}
.sr-nav-bedienung button:focus-visible{outline:2px solid var(--focus-ton);outline-offset:-2px}
.sr-nav-bedienung .zahnrad-drop{position:fixed;left:calc(var(--sr-nav-w) + 8px);right:auto;top:auto;bottom:12px;width:320px;min-width:0;max-width:calc(100vw - 24px);max-height:calc(100dvh - 24px);overflow-y:auto;box-sizing:border-box}
@media (min-width:901px){
  .sr-nav{transition:width .46s cubic-bezier(.22,.8,.22,1)}
  .sr-nav-marke{height:62px;min-height:62px;padding-right:48px;overflow:hidden;transition:height .46s cubic-bezier(.22,.8,.22,1),padding .46s cubic-bezier(.22,.8,.22,1)}
  .sr-nav-marke>.sr-marke-logo{flex-shrink:0}
  .sr-nav-item{min-height:36px}
  .sr-nav :is(.sr-nav-item-text,.sr-nav-marke-text,.sr-projektkarte-text,.sr-nav-gruppe-text){opacity:1;transform:translateX(0);transition:opacity .18s ease,transform .34s cubic-bezier(.22,.8,.22,1),max-width .46s cubic-bezier(.22,.8,.22,1);max-width:190px}
  .sr-nav-gruppe{gap:8px}
  html[data-sidebar="collapsed"] .sr-nav{width:64px}
  html[data-sidebar="collapsed"] .sr-nav-marke{height:62px;padding:16px 20px;align-items:flex-start;gap:0}
  html[data-sidebar="collapsed"] .sr-sidebar-toggle svg{transform:rotateY(180deg)}
  html[data-sidebar="collapsed"] .sr-nav :is(.sr-nav-item-text,.sr-nav-marke-text,.sr-projektkarte-text,.sr-nav-gruppe-text){opacity:0;transform:translateX(-8px);max-width:0;width:0;flex:0 0 0;overflow:hidden;white-space:nowrap}
  html[data-sidebar="collapsed"] .sr-nav :is(.sr-nav-item-zahl,.sr-projektkarte-chev,.sr-nav-theme-text,.sr-nav-gruppe-chev){display:none}
  html[data-sidebar="collapsed"] .sr-nav-label{font-size:0;padding:8px 0 0;margin:5px 14px;border-top:1px solid var(--sr-hair);height:8px;overflow:hidden}
  html[data-sidebar="collapsed"] .sr-nav-label>*{display:none}
  html[data-sidebar="collapsed"] .sr-projektkarte{justify-content:center;padding:7px;gap:0;min-height:40px}
  html[data-sidebar="collapsed"] .sr-projektkarte-icon{display:flex}
  html[data-sidebar="collapsed"] .sr-nav :is(.sr-nav-item,.sr-nav-gruppe){justify-content:center;gap:0;padding:8px 0;min-height:38px}
  html[data-sidebar="collapsed"] .sr-nav .nav-item.sr-nav-item{padding:8px 0}
  html[data-sidebar="collapsed"] .sr-nav-item::before{background-image:radial-gradient(ellipse 38px 32px at center,var(--glow-a),transparent 78%)}
  html[data-sidebar="collapsed"] .sr-nav .sr-nav-item[aria-current] .sr-nav-item-text{transform:translateX(-8px)}
  html[data-sidebar="collapsed"] .sr-nav-bedienung{flex-direction:column;gap:4px;padding:8px}
  html[data-sidebar="collapsed"] .sr-nav-einstellung-text{display:none}
  html[data-sidebar="collapsed"] .sr-nav-bedienung .zahnrad-btn{width:38px;justify-content:center;padding:8px}
  html[data-sidebar="collapsed"] .sr-nav-bedienung .zahnrad-drop{left:72px}
  html[data-sidebar="collapsed"] .sr-nav-bedienung .sr-glocke-drop{left:72px}
}
@media (max-width:900px){.sr-sidebar-toggle,.sr-sidebar-tooltip{display:none}}
.sr-nav .sr-nav-item[aria-current] .sr-nav-item-text{transform:translateX(3px)}
@media (max-width:900px){
  .sr-nav-bedienung .zahnrad-drop{left:12px;right:auto;top:auto;bottom:64px;max-height:calc(100dvh - 88px)}
  .sr-nav-bedienung .sr-glocke-drop{left:12px;right:12px;top:auto;bottom:64px;width:auto;max-width:none}
}
@media (prefers-reduced-motion:reduce){
  .sr-nav,.sr-nav-marke,.sr-sidebar-toggle,.sr-sidebar-toggle svg,
  .sr-nav :is(.sr-nav-item-text,.sr-nav-marke-text,.sr-projektkarte-text,.sr-nav-gruppe-text){transition:none}
}


/* ---- smooth-scroll.css ---- */
/* Lenis 1.3.25: Dokument bleibt der Scrollbereich; horizontale Tabellen nativ. */
html.lenis,
html.lenis body { height: auto; }
html.lenis.lenis-smooth { scroll-behavior: auto !important; }
.lenis:not(.lenis-autoToggle).lenis-stopped { overflow: clip; }
.lenis [data-lenis-prevent],
.lenis [data-lenis-prevent-wheel],
.lenis [data-lenis-prevent-touch] { overscroll-behavior: contain; }
.lenis.lenis-smooth iframe { pointer-events: none; }
/* Dialoge geben das Mausrad nicht an die verdeckte Seite weiter. */
.sr-modal-grund,
.palette-scrim { overflow: auto; overscroll-behavior: contain; }


/* ---- tabellen-seiten.css ---- */
.tbl-wrap[data-sr-table-page],.sr-tabelle-wrap[data-sr-table-page]{--sr-table-max-height:66rem;max-height:var(--sr-table-max-height);overflow:auto;overscroll-behavior-y:auto}
.tbl-wrap[data-sr-table-page].sr-tabelle-unbegrenzt,.sr-tabelle-wrap[data-sr-table-page].sr-tabelle-unbegrenzt{max-height:none}
.tbl-wrap[data-sr-table-page] thead th,.sr-tabelle-wrap[data-sr-table-page] thead th{position:sticky;top:0;z-index:6;background:var(--thead-bg,var(--sr-surface))}
.sr-tabellen-seiten{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:var(--s2,12px);margin:var(--s1,8px) 18px var(--s2,12px);font-size:var(--fs-label)}
.sr-tabellen-seiten label{display:flex;align-items:center;gap:6px;color:var(--sr-mut)}
.sr-tabellen-seiten select{min-height:28px;border:1px solid transparent;border-radius:var(--sr-r-ctl);background:var(--sr-soft);color:inherit;padding:3px 22px 3px 7px}
.sr-tabellen-seiten-status{color:var(--sr-mut)}
.sr-tabellen-seiten-stand{grid-column:1;grid-row:1;display:flex;align-items:center;color:var(--sr-mut)}
.sr-tabellen-seiten-stand .sr-tabellen-umfang{font-variant-numeric:tabular-nums}
.sr-tabellen-seiten-stand .sr-tabellen-umfang:not(:empty)::before{content:'·';padding:0 7px}
.sr-tabellen-seiten + .sr-tabellen-umfang{display:block;margin:var(--s1,8px) 18px var(--s2,12px);color:var(--sr-mut);font-size:var(--fs-label);font-variant-numeric:tabular-nums}
.sr-tabellen-seiten [data-sr-load-more]{grid-column:1/-1;justify-self:center}
.sr-tabellen-seiten [hidden]{display:none}
.sr-tabellen-seiten[data-sr-optionen-bereit] > label{display:none}
.sr-tabellen-optionen-knopf{grid-column:3;grid-row:1;width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;padding:6px;border:1px solid transparent;border-radius:var(--sr-r-ctl);background:var(--sr-soft);color:var(--sr-mut);cursor:pointer}
.sr-tabellen-optionen-knopf svg{width:16px;height:16px}
.sr-tabellen-optionen-knopf:hover,.sr-tabellen-optionen-knopf[aria-expanded="true"]{background:color-mix(in oklab,var(--sr-acc) 12%,var(--sr-soft));color:var(--sr-ink)}
.sr-tabellen-optionen-knopf:focus-visible{outline:2px solid var(--sr-acc);outline-offset:2px}
.sr-karte-kopf>.sr-tabellen-optionen-knopf{margin-left:auto;grid-column:auto;grid-row:auto;flex:none;background:transparent}
.sr-karte-kopf>.sr-tabellen-optionen-knopf + .sr-erklaerung{margin-left:0}
.sr-tabellen-optionen{position:fixed;z-index:60;width:min(280px,calc(100vw - 16px));max-height:calc(100vh - 16px);overflow:auto;display:grid;gap:4px;padding:10px;background:var(--sr-surface);border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl);box-shadow:0 10px 28px rgba(0,0,0,.22);color:var(--sr-ink);font-size:var(--fs-label)}
.sr-tabellen-optionen > strong{padding:2px 6px 6px}
.sr-tabellen-optionen label{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:5px 6px;color:var(--sr-mut)}
.sr-tabellen-optionen select{min-height:28px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl);background:var(--sr-soft);color:var(--sr-ink);padding:3px 24px 3px 7px}
@media(max-width:600px){.sr-tabellen-seiten{grid-template-columns:1fr auto}.sr-tabellen-seiten-stand{grid-column:1}.sr-tabellen-optionen-knopf{grid-column:2}.sr-karte-kopf>.sr-tabellen-optionen-knopf{grid-column:auto}.sr-tabellen-seiten label{justify-content:flex-end}.sr-tabellen-seiten label:first-child{justify-content:flex-start}}


/* ---- lade-status.css ---- */
/* Lokale Ladeanzeige: kein Overlay, keine Fläche vor Ablauf der Verzögerung. */
.sr-lade-status{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px 12px;min-width:0;padding:9px 0;color:var(--sr-mut);font-size:var(--fs-small);line-height:1.35}
.sr-karte>.sr-lade-status{margin:0 var(--sr-card-pad,20px);border-top:1px solid var(--sr-hair)}
.sr-header .sr-lade-status,.sr-kapitel-kopf .sr-lade-status{flex:1 1 100%;width:100%;padding-block:6px}
.sr-lade-status-zeile{display:flex;align-items:baseline;gap:6px;min-width:0;grid-column:1/-1}
.sr-lade-status-text{min-width:0;color:var(--sr-ink);overflow-wrap:anywhere}
.sr-lade-status-detail,.sr-lade-status-zeit{flex:none;color:var(--sr-mut);font-variant-numeric:tabular-nums;white-space:nowrap}
.sr-lade-status-balken{grid-column:1/-1;display:block;width:100%;height:2px;overflow:hidden;border:0;border-radius:2px;appearance:none;background:var(--sr-hair);color:var(--sr-acc-line)}
.sr-lade-status-balken::-webkit-progress-bar{background:var(--sr-hair);border-radius:2px}
.sr-lade-status-balken::-webkit-progress-value{background:var(--sr-acc-line);border-radius:2px}
.sr-lade-status-balken::-moz-progress-bar{background:linear-gradient(90deg,var(--sr-acc-line),var(--sr-acc));border-radius:2px}
.sr-lade-status-balken:not([value]){background:linear-gradient(90deg,transparent 0,var(--sr-acc-line) 40%,transparent 75%) 0 0/38% 100% no-repeat,var(--sr-hair);animation:sr-lade-status-lauf 1.15s ease-in-out infinite}
.sr-lade-status-balken:not([value])::-webkit-progress-bar,.sr-lade-status-balken:not([value])::-webkit-progress-value{background:transparent}
.sr-lade-status--fehler{grid-template-columns:minmax(0,1fr) auto;color:var(--sr-err-ink)}
.sr-lade-status--fehler .sr-lade-status-zeile{grid-column:1;grid-row:1}
.sr-lade-status--fehler .sr-lade-status-text{color:var(--sr-err-ink)}
.sr-lade-status-wiederholen{grid-column:2;grid-row:1;min-height:34px;padding:6px 11px;border:1px solid var(--sr-err-ink);border-radius:var(--sr-r-ctl);background:transparent;color:var(--sr-err-ink);font:600 var(--fs-label)/1.2 var(--font);cursor:pointer}
.sr-lade-status-wiederholen:hover{background:var(--sr-soft)}
.sr-lade-status-wiederholen:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px}
.sr-lade-status-wiederholen:disabled{cursor:wait;opacity:.65}
@keyframes sr-lade-status-lauf{from{background-position:-60% 0,0 0}to{background-position:155% 0,0 0}}
@media(max-width:559px){
  .sr-lade-status-zeile{flex-wrap:wrap}
  .sr-lade-status-detail{flex-basis:100%}
  .sr-lade-status--fehler{grid-template-columns:1fr}
  .sr-lade-status--fehler .sr-lade-status-zeile{grid-column:1}
  .sr-lade-status-wiederholen{grid-column:1;grid-row:auto;justify-self:start}
}
@media(prefers-reduced-motion:reduce){
  .sr-lade-status-balken:not([value]){animation:none;background-position:0 0,0 0}
}


/* ---- produkt-polish.css ---- */
/* Gemeinsame Entscheidungs- und Datenansichten, auf den bestehenden SEO-Radar-Tokens. */
.sr-entscheidungswege{display:flex;align-items:center;flex-wrap:wrap;gap:8px 20px;margin:0 0 18px;font-size:var(--fs-small);line-height:1.5}
.sr-entscheidungswege>a{color:var(--sr-acc-ink);font-weight:var(--fw-ui);text-decoration:none}
.sr-entscheidungswege>a:hover{text-decoration:underline}
.sr-entscheidungswege>.tour-start{margin-left:auto}
.sr-ergebnis-bruecke{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 18px;margin:18px 0 24px;background:var(--sr-surface);border-radius:var(--sr-r-md);box-shadow:var(--sr-e1)}
.sr-ergebnis-bruecke>div{display:grid;gap:4px;min-width:0}
.sr-ergebnis-bruecke strong{font-size:var(--fs-ui);color:var(--sr-ink)}
.sr-ergebnis-bruecke span{font-size:var(--fs-small);color:var(--sr-mut);line-height:1.5}
.sr-ergebnis-bruecke>a{flex-shrink:0;font-size:var(--fs-small);font-weight:var(--fw-ui);color:var(--sr-acc-ink)}
.sr-anker-ziel{scroll-margin-top:100px;display:grid;gap:var(--sr-gap);min-width:0}
/* Rasterfelder tragen von Haus aus `min-width:auto` — ohne den Riegel bleibt
   das Feld mindestens so breit wie sein Inhalt (Chart-Mindestbreite,
   unumbrochener Text) und sprengt die Seite (390 px, Befund 14.09.2026:
   #kisonde-domains lief auf 700 px auf, obwohl sein eigener .chart-wrap
   overflow-x:auto traegt — genau das griff nie, weil schon das Grid-Feld
   selbst nicht auf die verfuegbare Breite schrumpfte). Dasselbe Muster wie
   `.ru-uebersicht>*{min-width:0}`. */
.sr-anker-ziel>*{min-width:0}
.sr-anker-ziel>.sr-karte{margin:0}
.sr-entscheidungswege a:focus-visible,.sr-ergebnis-bruecke a:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:4px;border-radius:2px}

/* Befunde sind Zeilen in einer Karte, keine zweite Kartenwand in ihrem Inneren. */
.sr-thema-liste{display:grid;grid-template-columns:minmax(0,1fr);gap:0}
.sr-thema-liste>.sr-thema{display:grid;grid-template-columns:minmax(150px,.85fr) minmax(220px,1.8fr) minmax(100px,.55fr);align-items:start;column-gap:24px;row-gap:8px;padding:16px 0;border:0;border-radius:0;background:transparent;box-shadow:none}
.sr-thema-liste>.sr-thema+.sr-thema{border-top:1px solid var(--sr-hair)}
.sr-thema-liste>.sr-thema:first-child{padding-top:4px}
.sr-thema-liste>.sr-thema:last-child{padding-bottom:4px}
.sr-thema-liste .sr-thema-kopf{display:flex;align-items:flex-start;gap:6px;flex-direction:column;min-width:0}
.sr-thema-liste .sr-thema-titel{font-size:var(--fs-ui);line-height:1.4}
.sr-thema-liste .sr-thema-satz{font-size:var(--fs-small);line-height:1.55;color:var(--sr-mut);min-width:0;overflow-wrap:anywhere}
.sr-thema-liste .sr-thema-link{margin:0;justify-self:end;text-align:right;line-height:1.45;font-size:var(--fs-small);color:var(--sr-acc-ink)}
.sr-thema-liste .sr-thema-link:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:4px}

/* Kleine Bedienfelder gehören visuell zur Tabelle; Fokus bleibt klar erkennbar. */
.sr-werkzeugzeile input:not([type=checkbox]),.tbl-werkzeuge input:not([type=checkbox]){min-height:32px;max-width:100%;font-size:var(--fs-small);border-color:var(--sr-hair);background:var(--sr-soft);border-radius:var(--sr-r-ctl)}
.sr-werkzeugzeile input:focus-visible,.tbl-werkzeuge input:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px}
.sr-tabellen-seiten{font-variant-numeric:tabular-nums}
.sr-tabellen-seiten select:hover{border-color:var(--sr-hair)}
.sr-tabellen-seiten select:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px}

/* Sieben oder acht Kennzahlen ergeben zwei volle Reihen statt sechs plus Rest. */
@media(min-width:1100px){
  html[data-kpi="kompakt"] .sr-kpi-gitter:has(>.sr-kpi:nth-child(7)):not(:has(>.sr-kpi:nth-child(9))){grid-template-columns:repeat(4,minmax(0,1fr))}
}
@media(max-width:900px){
  .sr-thema-liste>.sr-thema{grid-template-columns:minmax(140px,.8fr) minmax(0,1.5fr);column-gap:16px}
  .sr-thema-liste .sr-thema-link{grid-column:2;justify-self:start;text-align:left}
}
@media(max-width:600px){
  .sr-ergebnis-bruecke{align-items:flex-start;flex-direction:column;padding:14px}
  .sr-thema-liste>.sr-thema{grid-template-columns:minmax(0,1fr);padding:14px 0}
  .sr-thema-liste .sr-thema-kopf{flex-direction:row;flex-wrap:wrap;align-items:center}
  .sr-thema-liste .sr-thema-link{grid-column:auto;justify-self:start;text-align:left}
  .sr-entscheidungswege{gap:8px 14px}
}

.ki-vergleich{border-top:1px solid var(--sr-hair);padding-top:14px;margin-top:16px;font-size:var(--fs-small)}
.ki-vergleich-werte{display:flex;gap:12px 28px;flex-wrap:wrap;margin:8px 0}
.ki-vergleich p{color:var(--sr-mut);line-height:1.5;margin:6px 0 0}

/* Eine Karte um die Zusammenfassung; Kennzahlen darin ohne weitere Rahmen. */
.ki-kennzahlen-ueberblick .sr-kpi{background:transparent;border:0;border-radius:0;box-shadow:none;transform:none;padding:8px 0;min-height:0}
.ki-kennzahlen-ueberblick .sr-kpi::before{display:none}
.ki-kennzahlen-ueberblick .sr-kpi:hover{box-shadow:none;transform:none}
.ki-kennzahlen-ueberblick .sr-kpi-gitter{gap:16px 24px}
#dashboard-prioritaeten .sr-thema-link{align-self:center}
#dashboard-prioritaeten .explain{margin-top:12px}
.ki-ansatzpunkt{display:flex;gap:10px 24px;align-items:baseline;flex-wrap:wrap;font-size:var(--fs-small);line-height:1.5;color:var(--sr-mut)}
.ki-ansatzpunkt span{flex:1 1 340px}
.ki-ansatzpunkt strong{color:var(--sr-ink)}
.ki-ansatzpunkt a{color:var(--sr-acc-ink);font-weight:var(--fw-ui)}

/* Quick-Wins-Details: ein gemeinsamer Einstieg, danach die bestehenden
   Tabellenkarten. Die drei Spalten sind Vergleiche von Trefferzahlen; sie
   bekommen keine eigenen Kartenrahmen und wirken deshalb als eine Einheit. */
#keyword-quickwins .qw-detail-einstieg{min-width:0;padding:4px 0 20px;border-bottom:1px solid var(--sr-hair)}
#keyword-quickwins .qw-detail-einstieg-kopf{display:flex;align-items:baseline;justify-content:space-between;gap:12px 28px;margin-bottom:16px}
#keyword-quickwins .qw-detail-einstieg-kopf h3{margin:0;color:var(--sr-ink);font-size:var(--fs-h2);line-height:1.3}
#keyword-quickwins .qw-detail-einstieg-kopf p{max-width:72ch;margin:0;color:var(--sr-mut);font-size:var(--fs-small);line-height:1.5}
#keyword-quickwins .qw-detail-kategorien{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0}
#keyword-quickwins .qw-detail-kategorie{min-width:0;padding:0 20px}
#keyword-quickwins .qw-detail-kategorie:first-child{padding-left:0}
#keyword-quickwins .qw-detail-kategorie:last-child{padding-right:0}
#keyword-quickwins .qw-detail-kategorie+.qw-detail-kategorie{border-left:1px solid var(--sr-hair)}
#keyword-quickwins .qw-detail-kategorie-kopf{display:flex;align-items:start;justify-content:space-between;gap:12px;margin-bottom:8px}
#keyword-quickwins .qw-detail-kategorie-kopf>div{display:grid;gap:2px;min-width:0}
#keyword-quickwins .qw-detail-kategorie-kopf strong{color:var(--sr-ink);font-size:var(--fs-ui);line-height:1.3}
#keyword-quickwins .qw-detail-kategorie-kopf span{color:var(--sr-mut);font-size:var(--fs-label);line-height:1.3}
#keyword-quickwins .qw-detail-kategorie-kopf b{color:var(--sr-ink);font:700 24px/1 var(--font-num);font-variant-numeric:tabular-nums}
#keyword-quickwins .qw-detail-kategorie>.sr-bar{display:flex;width:100%;margin-bottom:10px}
#keyword-quickwins .qw-detail-kategorie .sr-bar-spur{width:100%}
#keyword-quickwins .qw-detail-beispiele{list-style:none;display:grid;gap:5px;margin:0;padding:0}
#keyword-quickwins .qw-detail-beispiel{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:baseline;gap:8px;min-width:0;color:var(--sr-acc-ink);font-size:var(--fs-label);line-height:1.35;text-decoration:none}
#keyword-quickwins .qw-detail-beispiel>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#keyword-quickwins .qw-detail-beispiel small{color:var(--sr-mut);font-size:inherit;white-space:nowrap}
#keyword-quickwins .qw-detail-beispiel:hover>span{text-decoration:underline}
#keyword-quickwins .qw-detail-beispiel:focus-visible,#keyword-quickwins .qw-detail-query:focus-visible,#keyword-quickwins .qw-detail-ziel:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:3px;border-radius:2px}
#keyword-quickwins .qw-detail-keine{margin:0;color:var(--sr-mut);font-size:var(--fs-label)}

/* Der Ablauf ersetzt zwei lange Einleitungsabsätze. Auf großen Schirmen ist
   die Leserichtung Prüfen → Maßnahme → Erfolgskriterium direkt sichtbar. */
#keyword-quickwins .qw-detail-ablauf{list-style:none;counter-reset:qw-schritt;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0;margin:0 0 18px;padding:0;border-block:1px solid var(--sr-hair)}
#keyword-quickwins .qw-detail-ablauf li{position:relative;display:grid;align-content:start;gap:4px;min-width:0;padding:12px 24px 12px 0;color:var(--sr-mut);font-size:var(--fs-small);line-height:1.45}
#keyword-quickwins .qw-detail-ablauf li+li{padding-left:24px;border-left:1px solid var(--sr-hair)}
#keyword-quickwins .qw-detail-ablauf li:not(:last-child)::after{content:'›';position:absolute;right:-6px;top:50%;z-index:1;translate:0 -50%;padding:0 2px;background:var(--sr-surface);color:var(--sr-acc-ink);font-size:22px;line-height:1}
#keyword-quickwins .qw-detail-ablauf strong{color:var(--sr-ink);font-size:var(--fs-label);letter-spacing:.03em;text-transform:uppercase}

/* Lange Suchanfragen bleiben zweizeilig lesbar. Der title-Text und der
   Keyword-Link bewahren den vollständigen Wert und öffnen das Detail. */
#keyword-quickwins .qw-detail-tabelle th:first-child,#keyword-quickwins .qw-detail-tabelle td:first-child{width:250px;max-width:250px}
#keyword-quickwins .qw-detail-query{display:-webkit-box;max-width:250px;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2;white-space:normal;line-height:1.4}
#keyword-quickwins .qw-detail-zielzeile{display:grid;grid-template-columns:minmax(120px,250px) max-content;align-items:start;gap:4px 10px;margin:2px 0}
#keyword-quickwins .qw-detail-ziel{display:-webkit-box;max-width:250px;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2;color:var(--sr-acc-ink);line-height:1.35;text-decoration:none;overflow-wrap:anywhere}
#keyword-quickwins a.qw-detail-ziel:hover{text-decoration:underline}
#keyword-quickwins .qw-detail-zielzeile small{color:var(--sr-mut);font-size:var(--fs-label);white-space:nowrap}

@media(max-width:980px){
  #keyword-quickwins .qw-detail-einstieg-kopf{display:grid}
  #keyword-quickwins .qw-detail-kategorien{grid-template-columns:1fr}
  #keyword-quickwins .qw-detail-kategorie{padding:14px 0}
  #keyword-quickwins .qw-detail-kategorie:first-child{padding-top:0}
  #keyword-quickwins .qw-detail-kategorie:last-child{padding-bottom:0}
  #keyword-quickwins .qw-detail-kategorie+.qw-detail-kategorie{border-left:0;border-top:1px solid var(--sr-hair)}
  #keyword-quickwins .qw-detail-beispiele{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
  #keyword-quickwins .qw-detail-beispiel{display:block}
  #keyword-quickwins .qw-detail-beispiel>span,#keyword-quickwins .qw-detail-beispiel small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
}
@media(max-width:680px){
  #keyword-quickwins .qw-detail-beispiele{grid-template-columns:1fr}
  #keyword-quickwins .qw-detail-beispiel{display:grid}
  #keyword-quickwins .qw-detail-ablauf{grid-template-columns:1fr}
  #keyword-quickwins .qw-detail-ablauf li,#keyword-quickwins .qw-detail-ablauf li+li{padding:10px 0;border-left:0}
  #keyword-quickwins .qw-detail-ablauf li+li{border-top:1px solid var(--sr-hair)}
  #keyword-quickwins .qw-detail-ablauf li::after{display:none}
}


/* ---- verwaltung-polish.css ---- */
/* SEO-Radar — Verwaltungsansichten.
 * Alle Regeln bleiben unter .sr-verwaltung; Farben kommen vollstaendig aus
 * den bestehenden Theme-Tokens. */

.sr-verwaltung{min-width:0}

/* Kommunikator: Einstellungen und echte Figur bleiben gemeinsam sichtbar. */
.sr-verwaltung .ka-km-konfiguration{display:grid;grid-template-columns:minmax(280px,1fr) minmax(390px,470px);gap:var(--s5);align-items:start}
.sr-verwaltung .ka-km-formulare{min-width:0}
.sr-verwaltung .ka-km-vorschau{position:sticky;top:calc(var(--sr-kopf-h,0px) + var(--s3));min-width:0;padding:var(--s3);border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-surface);box-shadow:var(--edge)}
.sr-verwaltung .ka-km-vorschau-kopf{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s2);margin-bottom:var(--s2)}
.sr-verwaltung .ka-km-vorschau-kopf>span{color:var(--sr-mut);font-size:var(--fs-label);text-align:right}
.sr-verwaltung .ka-km-vorschau-info{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s2);margin-bottom:var(--s2)}
.sr-verwaltung .ka-km-vorschau-info>span{display:grid;min-width:0;gap:2px;padding:var(--s2);border-radius:var(--sr-r-sm);background:var(--sr-soft)}
.sr-verwaltung .ka-km-vorschau-info small{color:var(--sr-mut);font-size:var(--fs-label)}
.sr-verwaltung .ka-km-vorschau-info strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--fs-small)}
/* HÖHE DER BÜHNE BESTIMMT DEN ABSTAND ZUM NÄCHSTEN ABSCHNITT (Befund
   11.09.2026). Vorschau und Formulare stehen in EINER Gitterzeile; die Zeile
   ist so hoch wie die höhere Spalte, und alles darunter — „Fachmodule je
   Projekt" mit seinem Projektfeld — rückt um die Differenz nach unten. Bei
   490 px Bühne waren das 230 px Luft unter dem Block „Auftritt", während
   Vorschauinhalt und Figur nur rund 340 px brauchten. Der Rest war leerer
   Bühnenboden, kein Abstand.

   Die Bühne hat deshalb jetzt EINE feste Höhe, und die Fenster-Attrappe darin
   misst in PROZENT dieser Höhe statt in Punkten. Damit bleibt der Unterschied
   zwischen den drei Dialoggrößen sichtbar, ohne dass eine Auswahl die ganze
   Seite auseinanderzieht. Nachgemessen mit
   scripts/proben/verwaltung-abschnitt-abstand.js. */
.sr-verwaltung .ka-km-buehne{position:relative;isolation:isolate;min-height:340px;overflow:hidden;border:1px solid var(--sr-hair);border-radius:var(--sr-r-sm);background:linear-gradient(145deg,var(--sr-soft),var(--sr-surface))}
.sr-verwaltung .ka-km-vorschau [data-ka-km-inhalt]{position:absolute;inset:0;overflow:hidden}
/* ---- FIGUR NEBEN DEM FENSTER, NICHT DARUEBER (Betreiber-Befund 12.09.2026)
   Die Buehne stellte Fenster und Figur UNTEREINANDER, die Anwendung stellt sie
   nebeneinander — die Vorschau zeigte damit eine Anordnung, die es nirgends
   gibt. Zwei Spalten: das Fenster steht auf der Seite, auf der die Sprechblase
   steht, die Figur auf der anderen. Rechts unten heisst Fenster links,
   links unten heisst Fenster rechts.

   `justify-items` schiebt beide an die INNERE Kante ihrer Spalte, damit
   zwischen ihnen genau die 8 Punkte Luft stehen und nicht der ganze Rest der
   Buehne. */
.sr-verwaltung .ka-km-vorschau .km{position:absolute!important;inset:12px!important;z-index:1;display:grid!important;grid-template-columns:minmax(0,1fr) auto!important;grid-template-rows:minmax(0,1fr)!important;grid-template-areas:"panel figur"!important;width:auto!important;height:auto!important;max-width:none!important;max-height:none!important;align-content:end!important;align-items:end!important;justify-items:end!important;gap:8px!important;background:transparent;box-shadow:none;pointer-events:none;transform:none!important}
.sr-verwaltung .ka-km-vorschau .km--links{grid-template-columns:auto minmax(0,1fr)!important;grid-template-areas:"figur panel"!important;justify-items:start!important}
.sr-verwaltung .ka-km-vorschau .km-blase{position:static!important;inset:auto!important;display:none!important}
.sr-verwaltung .ka-km-vorschau .km-panel,.sr-verwaltung .ka-km-vorschau .km-schwebe-panel{position:static!important;inset:auto!important;grid-area:panel;align-self:end!important;display:flex!important;box-sizing:border-box;width:min(210px,100%)!important;max-width:100%!important;height:62%!important;max-height:100%!important;margin:0!important;overflow:hidden!important;border:1px solid var(--sr-hair)!important;border-radius:var(--sr-r-card)!important;background:var(--sr-surface)!important;box-shadow:var(--km-schatten-panel)!important;transform:none!important}
.sr-verwaltung .ka-km-vorschau .km--chat-mittel .km-panel{width:min(280px,100%)!important;height:80%!important}
.sr-verwaltung .ka-km-vorschau .km--chat-gross .km-panel{width:min(350px,100%)!important;height:98%!important}
.sr-verwaltung .ka-km-vorschau .km--schwebend .km-schwebe-panel{overflow:visible!important;border:0!important;border-radius:0!important;background:transparent!important;box-shadow:none!important}
.sr-verwaltung .ka-km-vorschau .km-panel-kopf,.sr-verwaltung .ka-km-vorschau .km-intro,.sr-verwaltung .ka-km-vorschau .km-panel-fuss,.sr-verwaltung .ka-km-vorschau .km-schwebe-kontrollen{display:none!important}
.sr-verwaltung .ka-km-vorschau .km-verlauf{flex:1 1 auto;min-height:0;max-height:none;padding:12px;overflow:hidden;background:var(--sr-soft)}
.sr-verwaltung .ka-km-vorschau .km--schwebend .km-verlauf{background:transparent}
.sr-verwaltung .ka-km-vorschau .km-nachricht{max-width:94%;padding:8px 10px;font-size:12px;line-height:1.4}
.sr-verwaltung .ka-km-vorschau .km-form{flex:0 0 auto;box-sizing:border-box;width:100%;margin:0;padding:7px;gap:6px;border:0;border-top:1px solid var(--sr-hair);border-radius:0;background:var(--sr-surface);box-shadow:none}
.sr-verwaltung .ka-km-vorschau .km--schwebend .km-form{border:1px solid var(--sr-hair);border-radius:16px;box-shadow:var(--km-schatten-panel)}
.sr-verwaltung .ka-km-vorschau .km-eingabe{min-width:0;min-height:36px!important;max-height:74px!important;padding:7px 8px;font-size:12px;resize:none}
.sr-verwaltung .ka-km-vorschau .km--chat-mittel .km-eingabe{min-height:52px!important}
.sr-verwaltung .ka-km-vorschau .km--chat-gross .km-eingabe{min-height:68px!important}
.sr-verwaltung .ka-km-vorschau .km-form .knopf{min-height:32px;padding:5px 8px;font-size:11px}
.sr-verwaltung .ka-km-vorschau .km-mikrofon{width:30px;height:30px;min-width:30px;padding:7px}
/* ---- EIGENER EBENENBEZUG FUER DIE FIGUR (Betreiber-Befund 12.09.2026)
   `position:static` war der Grund fuer die zweite, riesige Figur in der
   Vorschau: die Bewegtbilder der Figur liegen als `position:absolute;inset:0`
   ueber dem Standbild und suchen sich ihren Bezug beim naechsten positionierten
   Vorfahren. Ohne eigenen Bezug am Knopf war das die Wurzel `.km` — die Videos
   spannten ueber die ganze Buehne (410x314 statt 84x120) und lagen ueber
   Fenster und Eingabe. `relative` aendert am Fluss nichts und gibt ihnen den
   Knopf zurueck. */
.sr-verwaltung .ka-km-vorschau .km-figur{position:relative!important;grid-area:figur;display:block!important;width:58px!important;height:84px!important;min-width:0;min-height:0;margin:0!important;padding:0;overflow:visible;border:0;border-radius:0;background:transparent!important;box-shadow:none!important;cursor:default;transform:none!important}
.sr-verwaltung .ka-km-vorschau .km--gross .km-figur{width:84px!important;height:120px!important}
/* Standbild und Video MUESSEN dieselbe Passform haben: das Video traegt Alpha,
   ein anders beschnittenes Standbild darunter scheint neben ihm durch und
   sieht aus wie eine zweite Figur (Befund 12.09.2026, gross + fest: Standbild
   `cover` aus kommunikator-polish.css .km--gross:not(.km--schwebend), Video
   `contain`). Vier Klassen im Selektor, damit die Regel unabhaengig von der
   Ladereihenfolge ueber den Drei-Klassen-Regeln der Figur liegt. */
.sr-verwaltung .ka-km-vorschau .km .km-figur-bild{display:block;width:100%!important;height:100%!important;border-radius:0;object-fit:contain;object-position:center bottom}
.sr-verwaltung .ka-km-vorschau .km .km-figur-video{border-radius:0;object-fit:contain;object-position:center bottom}
.sr-verwaltung .ka-km-vorschau .km-figur:hover{transform:none}
.sr-verwaltung .ka-km-vorschau template{display:none}

@media(max-width:980px){
  .sr-verwaltung .ka-km-konfiguration{grid-template-columns:1fr}
  .sr-verwaltung .ka-km-vorschau{position:relative;top:auto}
}
@media(max-width:559px){
  .sr-verwaltung .ka-km-konfiguration{gap:var(--s3)}
  .sr-verwaltung .ka-km-vorschau{padding:var(--s2)}
  .sr-verwaltung .ka-km-vorschau-kopf{align-items:flex-start;flex-direction:column;gap:2px}
  .sr-verwaltung .ka-km-vorschau-kopf>span{text-align:left}
  .sr-verwaltung .ka-km-vorschau-info{grid-template-columns:1fr}
  /* Schmales Fenster: schmalere Buehne, Hoehen wie oben als Anteil. */
  .sr-verwaltung .ka-km-buehne{min-height:360px}
  .sr-verwaltung .ka-km-vorschau .km{inset:8px!important}
  .sr-verwaltung .ka-km-vorschau .km--chat-klein .km-panel{width:min(190px,100%)!important}
  .sr-verwaltung .ka-km-vorschau .km--chat-mittel .km-panel{width:min(250px,100%)!important}
  .sr-verwaltung .ka-km-vorschau .km--chat-gross .km-panel{width:min(320px,100%)!important}
}
.sr-nav-rechtliches{position:relative;flex:0 0 auto}
.sr-nav-rechtliches>summary{display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:var(--sr-r-ctl);color:var(--sr-mut);cursor:pointer;list-style:none;font-size:20px;line-height:1}
.sr-nav-rechtliches>summary::-webkit-details-marker{display:none}
.sr-nav-rechtliches>summary:hover{background:var(--sr-soft);color:var(--sr-acc-ink)}
.sr-nav-rechtliches>summary:focus-visible{outline:2px solid var(--focus-ton);outline-offset:-2px}
.sr-nav-rechtliches-menue{position:absolute;bottom:calc(100% + 8px);left:0;display:grid;gap:2px;min-width:150px;padding:6px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-sm);background:var(--sr-surface);box-shadow:var(--sr-e1);z-index:140}
.sr-nav-rechtliches-menue a{display:block;padding:7px 9px;border-radius:var(--sr-r-ctl);color:var(--sr-ink);font-size:var(--fs-label);text-decoration:none;white-space:nowrap}
.sr-nav-rechtliches-menue a:hover,.sr-nav-rechtliches-menue a:focus-visible{background:var(--sr-soft);color:var(--sr-acc-ink)}
.sr-verwaltung .ki-kosten-form{display:flex;flex-wrap:wrap;align-items:flex-end;gap:16px;margin:18px 0 24px}
.sr-verwaltung .ki-kosten-form>.feld{flex:1 1 210px;min-width:0;margin:0;max-width:320px}
.sr-verwaltung .ki-kosten-form .feld-eingabe{width:100%;box-sizing:border-box}
.sr-verwaltung .ki-kosten-schalter-zeile{display:flex;align-items:center;gap:10px;min-height:40px}
.sr-verwaltung .ki-kosten-schalter-zeile input{width:18px;height:18px;margin:0;accent-color:var(--sr-acc-ink)}
.sr-verwaltung .ki-kosten-form>.knopf{min-height:40px;margin-bottom:22px}
.sr-verwaltung .ki-kosten-status{color:var(--sr-mut);font-size:var(--fs-small)}
.sr-verwaltung .ki-kosten-kennzahlen{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px;margin:18px 0}
.sr-verwaltung .ki-kosten-kennzahlen>div{min-width:0}
.sr-verwaltung .ki-kosten-kennzahlen dt{font-size:var(--fs-label);color:var(--sr-mut)}
.sr-verwaltung .ki-kosten-kennzahlen dd{margin:5px 0 0;font-size:var(--fs-h2);font-weight:700;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}
.sr-verwaltung .ki-kosten-erklaerung{font-size:var(--fs-small);color:var(--sr-mut);margin:14px 0}
.sr-verwaltung .ki-kosten-erklaerung summary,.sr-verwaltung .ki-kosten-intern>summary{cursor:pointer;color:var(--sr-acc-ink)}
.sr-verwaltung .ki-kosten-intern{margin-top:20px}
.ki-kosten-verwaltung .sr-karte-koerper h3{margin:24px 0 10px}
.ki-kosten-verwaltung .ki-kosten-arten{margin:0}
.ki-kosten-verwaltung .ki-kosten-arten>div{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:16px;padding:9px 0;border-bottom:1px solid var(--sr-hair)}
.ki-kosten-verwaltung .ki-kosten-arten>div:last-child{border-bottom:0}
.ki-kosten-verwaltung .ki-kosten-arten dd{margin:0;font-variant-numeric:tabular-nums}
.ki-kosten-verwaltung .ki-kosten-arten dd:first-of-type{color:var(--sr-mut)}
@media(max-width:600px){
  .sr-verwaltung .ki-kosten-form>.feld{max-width:none;flex-basis:100%}
  .sr-verwaltung .ki-kosten-form>.knopf{margin-bottom:0}
  .sr-verwaltung .ki-kosten-kennzahlen{gap:12px;grid-template-columns:repeat(2,minmax(0,1fr))}
}
.sr-verwaltung .tag{padding-block:2px;white-space:nowrap}

/* Berichte: Status und sein Schalter bilden je eine kompakte Einheit. Die
 * beiden Erzeugen-Aktionen bleiben auch unter der mobilen Tabellenbreite in
 * einer Reihe; die Tabelle selbst rollt weiterhin in ihrer .tbl-wrap-Huelle. */
.berichte-verwaltung th.sr-wahl-spalte,.berichte-verwaltung td.sr-wahl-spalte{width:28px;min-width:28px;padding-left:6px;padding-right:0}
.berichte-verwaltung .berichte-schalter-zelle,.berichte-verwaltung .berichte-aktionen-zelle{width:1%;white-space:nowrap}
.sr-body .berichte-verwaltung td .berichte-schalter{display:inline-flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:4px;white-space:nowrap}
.sr-body .berichte-verwaltung td .berichte-aktionen{display:inline-flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:4px}
.sr-body .berichte-verwaltung td .berichte-aktionen>form{flex:0 0 auto;min-width:32px}
@media (pointer:coarse){
  .sr-body .berichte-verwaltung td .berichte-aktionen{gap:12px}
}
.berichte-verwaltung .berichte-schalter .sr-ikon-knopf,.berichte-verwaltung .berichte-aktionen .sr-ikon-knopf{width:32px;height:32px}
.berichte-verwaltung .berichte-versand{min-width:190px;white-space:normal;line-height:1.35}
.berichte-verwaltung .berichte-versand-wert{display:block;color:var(--sr-ink)}
.berichte-verwaltung .berichte-zeilenmeta{display:block;margin-top:3px;max-width:34ch;color:var(--sr-mut);font-size:var(--fs-label);line-height:1.35;overflow-wrap:anywhere}

/* Benutzer: Rolle dort bearbeiten, wo sie gelesen wird. Die verbleibenden
 * Kontoeingriffe liegen geschlossen in einer einzigen, schmalen Zelle. */
.sr-verwaltung .vw-benutzer-tabelle table{min-width:1040px;table-layout:auto}
.sr-verwaltung .vw-benutzer-tabelle td{vertical-align:middle}
.sr-verwaltung .vw-benutzer-email{max-width:260px}
.sr-verwaltung .vw-benutzer-email .mono{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sr-verwaltung .vw-benutzer-rolle{min-width:172px}
.sr-verwaltung .vw-benutzer-mandant{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sr-verwaltung .vw-benutzer-login{white-space:nowrap}
.sr-verwaltung .vw-benutzer-aktionen{width:1%;min-width:98px;vertical-align:top}
.sr-body .sr-verwaltung td .vw-rollen-form{display:inline-grid;grid-template-columns:minmax(118px,1fr) 32px;gap:4px;width:166px;flex-wrap:nowrap}
.sr-verwaltung .vw-rollen-form .feld-eingabe--klein{width:100%;min-width:0}

.sr-verwaltung .vw-zeilenmenue{min-width:84px}
.sr-verwaltung .vw-zeilenmenue>summary{display:inline-flex;align-items:center;justify-content:flex-end;gap:7px;
  min-height:32px;padding:0 6px;border-radius:var(--sr-r-ctl);color:var(--sr-ink);
  font-size:var(--fs-label);font-weight:var(--fw-ui);cursor:pointer;list-style:none;white-space:nowrap}
.sr-verwaltung .vw-zeilenmenue>summary::-webkit-details-marker{display:none}
.sr-verwaltung .vw-zeilenmenue>summary:hover{background:var(--sr-soft);color:var(--sr-acc-ink)}
.sr-verwaltung .vw-zeilenmenue>summary:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px}
.sr-verwaltung .vw-zeilenmenue-pfeil{width:7px;height:7px;border-right:2px solid currentColor;
  border-bottom:2px solid currentColor;transform:rotate(45deg);transition:transform var(--t-fast) var(--ease)}
.sr-verwaltung .vw-zeilenmenue[open] .vw-zeilenmenue-pfeil{transform:rotate(-135deg)}
.sr-verwaltung .vw-zeilenmenue-liste{position:fixed;display:grid;grid-template-columns:1fr;
  gap:4px;width:min(260px,calc(100vw - 16px));max-height:calc(100dvh - 16px);overflow-y:auto;
  padding:8px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-sm);
  background:var(--sr-surface);box-shadow:var(--e2);z-index:500}
.sr-verwaltung .vw-menue-form{margin:0;min-width:0}
.sr-verwaltung .vw-menue-aktion{display:flex;align-items:center;gap:8px;width:100%;min-height:34px;
  padding:5px 8px;border:0;border-radius:var(--sr-r-ctl);background:transparent;color:var(--sr-ink);
  font:inherit;font-size:var(--fs-label);font-weight:var(--fw-ui);text-align:left;white-space:nowrap;cursor:pointer}
.sr-verwaltung .vw-menue-aktion svg{width:18px;height:18px;flex:none;color:var(--sr-mut)}
.sr-verwaltung .vw-menue-aktion:hover{background:var(--sr-soft);color:var(--sr-acc-ink)}
.sr-verwaltung .vw-menue-aktion:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:1px}
.sr-verwaltung .vw-menue-aktion--achtung,.sr-verwaltung .vw-menue-aktion--achtung svg{color:var(--sr-err-ink)}

/* Mandanten: Tarif, Speichern und Testphase bleiben in einer Zeile. */
.sr-verwaltung .vw-mandanten-tabelle table{min-width:1040px}
.sr-verwaltung .vw-mandant-tarif{min-width:228px;white-space:nowrap}
.sr-verwaltung .vw-tarif-zelle{display:flex;align-items:center;gap:4px;white-space:nowrap}
.sr-verwaltung .vw-tarif-zelle>.vw-aktion{flex:none}
.sr-verwaltung .vw-tarif-zelle select{width:152px;min-width:152px}
.sr-verwaltung .vw-zuordnung-tabelle table{min-width:700px}
.sr-verwaltung .vw-zuordnung-tabelle td:last-child select{width:min(260px,32vw)}

/* Rechte: Funktionsname und Ausnahmehinweis duerfen ordentlich umbrechen;
 * die beiden Schalter bleiben als gleich breite, ruhige Spalten stehen. */
.sr-verwaltung .vw-recht-funktion{min-width:360px;white-space:normal}
.sr-verwaltung .vw-recht-label{display:block;font-weight:600}
.sr-verwaltung .vw-recht-code{display:block;color:var(--sr-mut);font-size:var(--fs-label);margin-top:3px;background:none;padding:0;border:0;box-shadow:none}
.sr-verwaltung .vw-recht-funktion .tag{display:inline-block;margin:2px 0 2px 6px}
.sr-verwaltung .vw-recht-schalter{width:20%;min-width:140px}

/* Darstellung: die zwei globalen Entscheidungen bilden auf grossen
 * Arbeitsflaechen ein Paar; die lange Erklaerung bleibt darunter lesbar. */
.sr-verwaltung .vw-mandant-wahl{display:flex;align-items:center;gap:10px;margin:0 0 var(--sr-gap)}
.sr-verwaltung .vw-mandant-wahl .feld-eingabe--klein{min-width:194px}
/* ======================================================================
   VERWALTUNG → DARSTELLUNG (Umbau 12.09.2026)

   Die Seite trug bis dahin zwei Karten mit acht <select> und einem
   Speichern-Knopf am Fuss. Jetzt: Kacheln mit Farbmuster, Segmentschalter,
   Farbwaehler mit Kontrastzeile und eine mitlaufende Vorschau.

   KEIN STILATTRIBUT IM MARKUP. Farben, die aus der Datenbank kommen,
   stehen als `fill` in einem SVG (Praesentationsattribut) oder werden zur
   Laufzeit ueber das CSSOM gesetzt (verwaltung-client.js). Ein
   style="background:…" wuerde die Inhaltssicherheitsregel stillschweigend
   verwerfen — die Kachel saehe dann leer aus, ohne Fehlermeldung.

   DER ZUSTAND STEHT IM FELD, nicht in einem ARIA-Attribut: die Kacheln und
   Segmente sind Optionsfelder, `:has(:checked)` faerbt sie. Damit bleiben
   sie ohne JavaScript bedienbar und mit Pfeiltasten erreichbar.
   ====================================================================== */
.sr-verwaltung .vw-darstellung-form{margin:0}

/* ---- Buehne: Formularspalte und mitlaufende Vorschau ------------------- */
.sr-verwaltung .vw-dst-buehne{display:grid;grid-template-columns:minmax(0,1fr) minmax(260px,320px);gap:var(--s4);align-items:start}
.sr-verwaltung .vw-dst-spalte{min-width:0;display:flex;flex-direction:column;gap:var(--s4)}
.sr-verwaltung .vw-dst-vorschau{position:sticky;top:calc(var(--sr-kopf-h,0px) + var(--s3));min-width:0;
  padding:var(--s3);border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);
  background:var(--sr-surface);box-shadow:var(--edge)}
.sr-verwaltung .vw-dst-vorschau-titel{margin:0 0 var(--s2);font-size:var(--fs-label);font-weight:700;
  letter-spacing:.9px;text-transform:uppercase;color:var(--sr-mut)}
.sr-verwaltung .vw-dst-vorschau-karte{--vw-dst-primary:var(--sr-marke,#00abd7);--vw-dst-ink:var(--sr-ink);
  --vw-dst-text:var(--sr-mut);--vw-dst-canvas:var(--sr-soft);
  overflow:hidden;border:1px solid var(--sr-hair);border-radius:var(--sr-r-sm);background:var(--vw-dst-canvas)}
.sr-verwaltung .vw-dst-vorschau-band{padding:var(--s1) var(--s2);background:var(--vw-dst-primary);
  color:#fff;font-size:var(--fs-label);font-weight:700;letter-spacing:.6px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sr-verwaltung .vw-dst-vorschau-koerper{padding:var(--s2)}
.sr-verwaltung .vw-dst-vorschau-koerper p{margin:0}
.sr-verwaltung .vw-dst-vorschau-label{font-size:var(--fs-label);text-transform:uppercase;letter-spacing:.9px;color:var(--vw-dst-text)}
.sr-verwaltung .vw-dst-vorschau-kpi{font-size:var(--fs-kpi);line-height:1.1;font-weight:var(--fw-bold);
  letter-spacing:-.02em;color:var(--vw-dst-ink);font-variant-numeric:tabular-nums}
.sr-verwaltung .vw-dst-vorschau-text{margin-top:var(--s0);font-size:var(--fs-label);line-height:1.4;color:var(--vw-dst-text)}
.sr-verwaltung .vw-dst-vorschau-grafik{display:flex;align-items:flex-end;gap:var(--s2);margin-top:var(--s2)}
.sr-verwaltung .vw-dst-vorschau-grafik svg:first-child{flex:1 1 auto;min-width:0;height:78px}
.sr-verwaltung .vw-dst-vorschau-grafik svg:last-child{flex:0 0 58px;width:58px;height:58px}

/* ---- Kacheln ---------------------------------------------------------- */
.sr-verwaltung .vw-dst-kacheln{display:grid;grid-template-columns:repeat(auto-fill,minmax(168px,1fr));gap:var(--s2)}
.sr-verwaltung .vw-dst-kacheln--palette{grid-template-columns:repeat(auto-fill,minmax(196px,1fr))}
.sr-verwaltung .vw-dst-kachel{display:flex;flex-direction:column;gap:var(--s0);min-width:0;
  padding:var(--s2);border:1px solid var(--sr-feld-line);border-radius:var(--sr-r-ctl);
  background:var(--sr-surface);cursor:pointer;transition:border-color 140ms var(--ease),background 140ms var(--ease)}
.sr-verwaltung .vw-dst-kachel:hover{background:var(--sr-soft)}
.sr-verwaltung .vw-dst-kachel-feld{position:absolute;width:1px;height:1px;margin:-1px;padding:0;
  border:0;clip-path:inset(50%);overflow:hidden;white-space:nowrap}
.sr-verwaltung .vw-dst-kachel:has(.vw-dst-kachel-feld:checked){border-color:var(--knopf-blau);
  box-shadow:inset 0 0 0 1px var(--knopf-blau);background:var(--accent-soft)}
.sr-verwaltung .vw-dst-kachel:has(.vw-dst-kachel-feld:focus-visible){outline:2px solid var(--sr-acc-line);outline-offset:2px}
.sr-verwaltung .vw-dst-kachel .vw-dst-muster{display:block;width:100%;height:24px;border-radius:var(--sr-r-xs)}
.sr-verwaltung .vw-dst-kachel-titel{font-size:var(--fs-ui);font-weight:700;color:var(--sr-ink);overflow-wrap:anywhere}
.sr-verwaltung .vw-dst-kachel-sub{font-size:var(--fs-label);line-height:1.35;color:var(--sr-mut);overflow-wrap:anywhere}

/* ---- Segmentschalter -------------------------------------------------- */
.sr-verwaltung .vw-dst-seg{display:inline-flex;flex-wrap:wrap;border:1px solid var(--sr-feld-line);
  border-radius:var(--sr-r-ctl);overflow:hidden;background:var(--sr-surface);max-width:100%}
.sr-verwaltung .vw-dst-seg-teil{display:inline-flex;align-items:center;min-height:30px;
  padding:var(--s0) var(--s2);font-size:var(--fs-label);color:var(--sr-mut);cursor:pointer;
  border-right:1px solid var(--sr-feld-line);white-space:nowrap}
.sr-verwaltung .vw-dst-seg-teil:last-child{border-right:0}
.sr-verwaltung .vw-dst-seg-teil:hover{background:var(--sr-soft);color:var(--sr-ink)}
.sr-verwaltung .vw-dst-seg-feld{position:absolute;width:1px;height:1px;margin:-1px;padding:0;
  border:0;clip-path:inset(50%);overflow:hidden;white-space:nowrap}
.sr-verwaltung .vw-dst-seg-teil:has(.vw-dst-seg-feld:checked){background:var(--knopf-blau);color:var(--auf-knopf);font-weight:700}
.sr-verwaltung .vw-dst-seg-teil:has(.vw-dst-seg-feld:focus-visible){outline:2px solid var(--sr-acc-line);outline-offset:-2px}
.sr-verwaltung .vw-dst-seg--breit .vw-dst-seg-teil{font-size:var(--fs-ui);padding:var(--s1) var(--s3);min-height:36px}

/* ---- Farbfelder und Kontrast ------------------------------------------ */
.sr-verwaltung .vw-dst-felder{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:var(--s3)}
.sr-verwaltung .vw-dst-felder .feld{margin:0;min-width:0}
.sr-verwaltung .vw-dst-felder .feld-eingabe{width:100%}
.sr-verwaltung .vw-dst-farbwahl{display:flex;align-items:center;gap:var(--s1)}
.sr-verwaltung .vw-dst-farbwaehler{width:42px;height:36px;flex:none;padding:2px;
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl);background:var(--sr-surface);cursor:pointer}
.sr-verwaltung .vw-dst-kontrast{width:100%;margin-top:var(--s3);border-collapse:collapse;font-size:var(--fs-small)}
.sr-verwaltung .vw-dst-kontrast caption{caption-side:bottom;margin-top:var(--s1);text-align:left}
.sr-verwaltung .vw-dst-kontrast th,.sr-verwaltung .vw-dst-kontrast td{padding:var(--s1) var(--s2);
  border-bottom:1px solid var(--sr-hair);text-align:left}
.sr-verwaltung .vw-dst-kontrast th{font-size:var(--fs-label);text-transform:uppercase;letter-spacing:.8px;color:var(--sr-mut)}
.sr-verwaltung .vw-dst-kontrast .re{text-align:right}

/* ---- Hintergrund ------------------------------------------------------ */
.sr-verwaltung .vw-dst-bewegung{margin-top:var(--s0)}
.sr-verwaltung .vw-dst-staerke{margin-top:var(--s4)}
.sr-verwaltung .vw-dst-hg-kopf{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--s3);align-items:start}
.sr-verwaltung .vw-dst-hg-kopf>.feld{min-width:0;margin:0}
.sr-verwaltung .vw-dst-hg-kopf .vw-dst-staerke{margin-top:0}
.sr-verwaltung .vw-dst-hg-staerke .vw-dst-verlauf{height:52px}
.sr-verwaltung .vw-dst-hg-punkte{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s3);margin-top:var(--s4)}
.sr-verwaltung .vw-dst-hg-karte{display:grid;align-content:start;gap:var(--s3);min-width:0;padding:var(--s3);border:1px solid var(--sr-hair);border-radius:var(--sr-r-sm);background:var(--sr-surface)}
.sr-verwaltung .vw-dst-hg-karte-kopf{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s2);flex-wrap:wrap;padding-bottom:var(--s1);border-bottom:1px solid var(--sr-hair)}
.sr-verwaltung .vw-dst-hg-karte-kopf .sr-feld-hinweis{margin:0}
.sr-verwaltung .vw-dst-hg-quelle{display:flex;align-items:center;gap:var(--s2);min-height:62px;padding:var(--s1) 0}
.sr-verwaltung .vw-dst-hg-quelle>span{display:grid;gap:2px;min-width:0;color:var(--sr-ink);font-size:var(--fs-label)}
.sr-verwaltung .vw-dst-hg-quelle small{color:var(--sr-mut);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sr-verwaltung .vw-dst-hg-feld{display:grid;gap:var(--s1);min-width:0;color:var(--sr-mut);font-size:var(--fs-label);font-weight:600}
.sr-verwaltung .vw-dst-hg-feld>.feld-eingabe{width:100%}
.sr-verwaltung .vw-dst-hg-feld--breit .vw-dst-regler{max-width:none}
.sr-verwaltung .vw-dst-hg-positionen,.sr-verwaltung .vw-dst-hg-zusatz,.sr-verwaltung .vw-dst-hg-overlay-felder{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s3)}
.sr-verwaltung .vw-dst-hg-zusatz>.feld{min-width:0;margin:0}
.sr-verwaltung .vw-dst-hg-zusatz .vw-dst-farbwahl{width:100%}
.sr-verwaltung .vw-dst-hg-zusatz .vw-dst-farbwahl .feld-eingabe{min-width:0;width:100%}
.sr-verwaltung .vw-dst-hg-overlay{margin-top:var(--s3)}
.sr-verwaltung .vw-dst-hg-overlay-felder{grid-template-columns:minmax(150px,.45fr) minmax(260px,1fr);align-items:end}
.sr-verwaltung .vw-dst-hg-overlay .vw-dst-regler{max-width:none}
.sr-verwaltung .vw-dst-hg-projekte{margin-top:var(--s4)}
.sr-verwaltung .vw-dst-regler{display:flex;align-items:center;gap:var(--s2);max-width:420px}
.sr-verwaltung .vw-dst-regler input[type="range"]{flex:1 1 auto;min-width:0;accent-color:var(--knopf-blau)}
/* `flex-basis:3.5ch` beschrieb die INHALTSBREITE; Rahmen und Polster der
   Wertpille kamen oben drauf, und „60" brach in zwei Zeilen um. Die Pille
   waechst jetzt mit ihrem Inhalt und haelt nur eine Untergrenze. */
.sr-verwaltung .vw-dst-regler-wert{flex:0 0 auto;min-width:3.5ch;text-align:right;
  white-space:nowrap;box-sizing:content-box}
/* Die Vorschau des Verlaufs rechnet mit DENSELBEN Formeln wie die Seite
   selbst (theme-background.css) und liest dieselbe Variable. Der Regler
   schreibt --sr-verlauf-alpha ans <html>: damit aendert sich zugleich der
   echte Seitenhintergrund — die Vorschau ist die Seite. */
.sr-verwaltung .vw-dst-verlauf{display:block;height:88px;margin-top:var(--s2);
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-sm);background:
  radial-gradient(circle at 10% 8%,color-mix(in srgb,var(--sr-marke,#00abd7) calc(var(--sr-verlauf-alpha,.6) * 40%),transparent),transparent 42%),
  linear-gradient(180deg,color-mix(in srgb,var(--sr-marke,#00abd7) calc(var(--sr-verlauf-alpha,.6) * 14%),transparent),transparent 50%),
  linear-gradient(145deg,color-mix(in srgb,var(--knopf-blau) calc(var(--sr-verlauf-alpha,.6) * 17.5%),transparent),transparent 60%),
  var(--sr-bg)}
.sr-verwaltung .vw-dst-projekte{display:flex;flex-direction:column;gap:var(--s2);margin-top:var(--s1)}
.sr-verwaltung .vw-dst-projekt{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap;min-width:0}
.sr-verwaltung .vw-dst-projekt-name{flex:1 1 200px;min-width:0;font-size:var(--fs-ui);font-weight:600;
  color:var(--sr-ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sr-verwaltung .vw-dst-muster--punkt{width:24px;height:24px;flex:none;border-radius:50%;box-shadow:var(--edge)}

/* ---- Auftritt (Reiter 4) ---------------------------------------------- */
/* Der Vorführknopf und sein Hinweis stehen in einer Zeile und brechen auf
   schmalen Flächen darunter um. */
/* `flex-direction:row` AUSDRUECKLICH: .feld stapelt senkrecht, und in einer
   Spalte ist flex-basis die HOEHE — der Hinweis wuchs damit auf 260 px und
   riss ein Loch in die Karte (gemessen 12.09.2026: SPAN.sr-feld-hinweis
   h=260). */
.sr-verwaltung .vw-dst-vorfuehren{display:flex;flex-direction:row;align-items:center;
  gap:var(--s2);flex-wrap:wrap;margin-top:var(--s4)}
.sr-verwaltung .vw-dst-vorfuehren .sr-feld-hinweis{flex:1 1 260px;min-width:0;margin:0}
/* Zwei Kachelreihen hintereinander brauchen eine Fuge — ohne sie klebt die
   Ueberschrift der zweiten an der letzten Kachel der ersten. */
.sr-verwaltung .vw-dst-feld-luft{margin-top:var(--s3)}
/* Ausnahme je Projekt: zugeklappt ein Streifen, offen vier Felder. */
.sr-verwaltung .vw-dst-projekt-auf{border:1px solid var(--sr-hair);border-radius:var(--sr-r-sm);
  padding:var(--s1) var(--s2);background:var(--sr-surface)}
.sr-verwaltung .vw-dst-projekt-auf>summary{display:flex;align-items:baseline;gap:var(--s2);
  flex-wrap:wrap;cursor:pointer;list-style:revert}
.sr-verwaltung .vw-dst-projekt-auf>summary .sr-feld-hinweis{margin:0}
.sr-verwaltung .vw-dst-projekt-auf .feld{margin-top:var(--s2)}
.sr-verwaltung .vw-dst-projekt-regler-paar{display:flex;gap:var(--s3);flex-wrap:wrap}
.sr-verwaltung .vw-dst-projekt-regler{display:flex;align-items:center;gap:var(--s1);
  flex:1 1 220px;min-width:0;font-size:var(--fs-label);color:var(--sr-mut)}
.sr-verwaltung .vw-dst-projekt-regler input[type="range"]{flex:1 1 auto;min-width:0;
  accent-color:var(--knopf-blau)}

/* ---- Speichern -------------------------------------------------------- */
.sr-verwaltung .vw-dst-fuss{display:flex;align-items:center;gap:var(--s3);flex-wrap:wrap;margin-top:var(--s4)}
.vw-dst-leiste{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap;justify-content:flex-end}
.vw-dst-leiste-status{display:inline-flex;align-items:center;gap:var(--s0);padding:var(--s0) var(--s2);
  border-radius:var(--rpill);background:var(--amber-dim);color:var(--sr-warn-ink);
  font-size:var(--fs-label);font-weight:700;white-space:nowrap}
/* `display` aus einer Klasse schlaegt die Browservorgabe fuer [hidden] —
   ohne diese Zeile stuende der Hinweis auf ungespeicherte Aenderungen von
   Anfang an da, und die Eigenschaft `hidden` saehe trotzdem richtig aus
   (die Pruefung `el.hidden` haette es nicht gefunden). */
.vw-dst-leiste-status[hidden]{display:none}

@media (max-width:1100px){
  .sr-verwaltung .vw-dst-buehne{grid-template-columns:1fr}
  .sr-verwaltung .vw-dst-vorschau{position:static}
}
@media (max-width:700px){
  .sr-verwaltung .vw-dst-kacheln,.sr-verwaltung .vw-dst-kacheln--palette{grid-template-columns:1fr}
  .sr-verwaltung .vw-dst-felder{grid-template-columns:1fr;gap:var(--s2)}
  .sr-verwaltung .vw-dst-seg-teil{font-size:var(--fs-label);padding:var(--s0) var(--s1)}
  .sr-verwaltung .vw-dst-hg-kopf,.sr-verwaltung .vw-dst-hg-punkte,.sr-verwaltung .vw-dst-hg-positionen,.sr-verwaltung .vw-dst-hg-zusatz,.sr-verwaltung .vw-dst-hg-overlay-felder{grid-template-columns:1fr}
  .vw-dst-leiste-status{font-size:var(--fs-label);padding:2px var(--s1)}
}

/* KI-Fragen: Die Frage bleibt auf kleinen Breiten lesbar; die übrigen
 * Verwaltungs-Spalten liegen weiterhin in derselben waagerecht scrollbaren
 * Tabelle. Der explizite Wrapper verhindert, dass diese Spaltenregel andere
 * Tabellen mit langen Texten verändert. */
.sr-verwaltung .ki-fragen-katalog-tabelle{overflow-x:auto;max-width:100%}
.sr-verwaltung .ki-fragen-katalog-tabelle table{min-width:760px;table-layout:auto}
.sr-verwaltung .ki-fragen-katalog-tabelle .kw-name-zelle{white-space:normal}
.sr-verwaltung .ki-fragen-katalog-tabelle .kw-name-text{overflow-wrap:anywhere}

/* Crawler budget/limit labels inherit the old inline-form nowrap rule. In
 * this view the labels are explanatory field names and may wrap normally. */
.sr-body .kw-verwaltung-kopf~.sr-karte .kosten-inline-form .feld-label{white-space:normal;overflow-wrap:anywhere}

@media (max-width:760px){
  .sr-verwaltung .vw-darstellung-felder{grid-template-columns:1fr;gap:12px}
  .sr-verwaltung .vw-mandant-wahl{align-items:stretch;flex-wrap:wrap}
  .sr-verwaltung .vw-mandant-wahl .feld-label{flex:1 0 100%}
  .sr-verwaltung .vw-mandant-wahl .feld-eingabe--klein{flex:1 1 210px;min-width:0}
}

@media (max-width:600px){
  .sr-verwaltung .ki-fragen-katalog-tabelle table{table-layout:fixed;min-width:760px}
  .sr-verwaltung .ki-fragen-katalog-tabelle th:nth-child(2),
  .sr-verwaltung .ki-fragen-katalog-tabelle td:nth-child(2){
    width:clamp(180px,52vw,240px);min-width:180px;max-width:240px;
    white-space:normal;overflow-wrap:anywhere;vertical-align:top
  }
  .sr-verwaltung .ki-fragen-katalog-tabelle .kw-name:not([hidden]){display:flex;align-items:flex-start;gap:var(--s0);width:100%;white-space:normal}
  .sr-verwaltung .ki-fragen-katalog-tabelle .kw-name-text{flex:1 1 auto;min-width:0;white-space:normal;overflow-wrap:anywhere}
  .sr-verwaltung .ki-fragen-katalog-tabelle .kw-name .sr-ikon-knopf{flex:0 0 auto}
  .sr-verwaltung .ki-fragen-katalog-tabelle .kw-umbenennen:not([hidden]){display:grid;grid-template-columns:1fr;width:100%;white-space:normal}
  .sr-verwaltung .ki-fragen-katalog-tabelle .kw-umbenennen .feld-eingabe{width:100%;min-width:0}
}

@media (max-width:420px){
  .sr-verwaltung .vw-benutzer-tabelle table{min-width:980px}
  .sr-verwaltung .vw-mandanten-tabelle table{min-width:960px}
  .sr-verwaltung .vw-zeilenmenue-liste{padding:6px}
}

@media (prefers-reduced-motion:reduce){
  .sr-verwaltung .vw-zeilenmenue-pfeil{transition:none}
}

.sr-body .sr-verwaltung .vw-zeilenmenue>summary{border:0;box-shadow:none;background:transparent}
.sr-body .sr-verwaltung .vw-zeilenmenue>summary:hover{background:var(--sr-soft)}
.sr-verwaltung .vw-benutzer-tabelle .sr-name-zelle{min-width:170px}

/* Verwaltungsabschnitte folgen Größe und Hervorhebung der Projektreiter. */
.sr-kopf .sr-tabs{gap:0;margin-top:var(--s3)}
.sr-kopf .sr-tabs .nav-item--kapitel{display:inline-flex;align-items:center;min-height:36px;padding:var(--s1) 15px;border-bottom:2px solid transparent;font-size:var(--fs-ui);line-height:1.35}
.sr-kopf .sr-tabs .nav-item--kapitel[aria-current]{color:var(--knopf-blau);border-bottom-color:var(--knopf-blau);background:var(--accent-soft);border-radius:6px 6px 0 0}

/* --- Darstellung, Abschnitt E-Mails (11.09.2026) ------------------------ */
/* Sieben Felder, zwei davon mit Farbwaehler, darunter die Kontrasttabelle und
   die Vorschau. Dieselbe zweispaltige Rasterung wie die Chart-Felder darueber
   — die Seite soll nicht in der Mitte ihre Formsprache wechseln. */
.sr-verwaltung .vw-mail-felder{display:grid;grid-template-columns:repeat(2,minmax(240px,1fr));gap:18px}
.sr-verwaltung .vw-mail-felder .feld-eingabe{width:100%}
.sr-verwaltung .vw-mail-feld{margin:0}
.sr-verwaltung .vw-mail-feld .sr-feld-hinweis{margin:6px 0 0}
/* Farbwaehler und Hexfeld sind EIN Wert: der Waehler schreibt in das Feld,
   abgeschickt wird nur das Feld (leer = Systemfarbe). */
.sr-verwaltung .vw-mail-farbwahl{display:flex;align-items:center;gap:10px}
.sr-verwaltung .vw-mail-farbwaehler{width:44px;height:38px;flex:none;padding:2px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl);background:var(--sr-surface);cursor:pointer}
.sr-verwaltung .vw-mail-kontrast{margin-top:20px}
.sr-verwaltung .vw-mail-kontrast table{min-width:520px}
.sr-verwaltung .vw-mail-aktionen{display:flex;flex-wrap:wrap;align-items:center;gap:16px;margin-top:20px}
.sr-verwaltung .vw-mail-testform{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:0}
.sr-verwaltung .vw-mail-testform .sr-feld-hinweis{margin:0;max-width:44ch}
/* Vorschau: zwei Rahmen nebeneinander. Die Hoehe ist fest — eine Mail ist
   laenger als der Ausschnitt, und der Rahmen scrollt selbst; eine mitwachsende
   Hoehe brauchte eine Messung im Rahmen und damit Skript ueber die Grenze. */
.sr-verwaltung .vw-mail-vorschau{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px;margin-top:12px}
.sr-verwaltung .vw-mail-rahmen{margin:0;min-width:0}
.sr-verwaltung .vw-mail-rahmen figcaption{margin-bottom:6px;font-size:var(--fs-label);font-weight:600;color:var(--sr-mut)}
.sr-verwaltung .vw-mail-frame{display:block;width:100%;height:520px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-surface)}

@media (max-width:900px){
  .sr-verwaltung .vw-mail-vorschau{grid-template-columns:1fr}
  .sr-verwaltung .vw-mail-frame{height:420px}
}
@media (max-width:760px){
  .sr-verwaltung .vw-mail-felder{grid-template-columns:1fr;gap:12px}
}

/* Verwaltungsarbeitsplatz: eine Kartenebene, darunter Typografie, Abstände
   und Trennlinien. Eingaben und auswählbare Muster behalten ihre Kontur. */
:where(.sr-admin-workspace,.pe-seite){--vw-innen:clamp(18px,2vw,28px);--vw-abstand:24px}
.sr-admin-workspace .sr-verwaltung{gap:var(--vw-abstand)}
:where(.sr-admin-workspace,.pe-seite) .sr-karte{
  box-shadow:0 1px 3px color-mix(in srgb,var(--sr-ink) 5%,transparent),
    0 8px 28px -16px color-mix(in srgb,var(--sr-ink) 18%,transparent)}
:where(.sr-admin-workspace,.pe-seite) .sr-karte-kopf{padding:20px var(--vw-innen) 16px;gap:8px 14px}
:where(.sr-admin-workspace,.pe-seite) .sr-karte-koerper{padding:var(--vw-innen)}
:where(.sr-admin-workspace,.pe-seite) .sr-karte-titel{letter-spacing:-.018em}
:where(.sr-admin-workspace,.pe-seite) .sr-karte-meta{font-variant-numeric:tabular-nums}
:where(.sr-admin-workspace,.pe-seite) .sr-karte-koerper>p:first-child{margin-top:0}
:where(.sr-admin-workspace,.pe-seite) .sr-karte-koerper>p:last-child{margin-bottom:0}
:where(.sr-admin-workspace,.pe-seite) .sr-karte-fuss{padding:14px var(--vw-innen)}
:where(.sr-admin-workspace,.pe-seite) .sr-anlegen-form .feld-label{
  text-transform:none;letter-spacing:0;color:var(--sr-ink);font-size:var(--fs-small)}
:where(.sr-admin-workspace,.pe-seite) .feld-eingabe{
  transition:border-color 150ms var(--ease),box-shadow 150ms var(--ease),background 150ms var(--ease)}
:where(.sr-admin-workspace,.pe-seite) .feld-eingabe:focus-visible{
  outline:2px solid var(--sr-acc-line);outline-offset:2px}
:where(.sr-admin-workspace,.pe-seite) .sr-feld-hinweis{line-height:1.5}
:where(.sr-admin-workspace,.pe-seite) .sr-karte-koerper>.vw-form{margin:0;max-width:none;gap:18px 24px}
:where(.sr-admin-workspace,.pe-seite) .sr-karte-koerper>.vw-form>.feld{min-width:0;flex-basis:220px;margin:0}
.sr-admin-workspace .section>.lead{max-width:90ch;font-size:var(--fs-body);line-height:1.6;color:var(--sr-mut)}
.sr-admin-workspace .section>h3{margin:36px 0 8px;font-size:var(--fs-h2);letter-spacing:-.015em}
.sr-admin-workspace .section>h3+p{max-width:88ch;margin:0 0 18px;color:var(--sr-mut);line-height:1.55}
.sr-admin-workspace .section>.tbl-wrap{border-radius:var(--sr-r-card);background:var(--sr-surface);box-shadow:var(--sr-e1)}

/* Benutzer, Mandanten und Rechte: der Datensatz bleibt die visuelle Einheit. */
.sr-admin-workspace :is(.vw-benutzer-tabelle,.vw-mandanten-tabelle,.vw-zuordnung-tabelle) td{padding-top:15px;padding-bottom:15px}
.sr-admin-workspace .vw-benutzer-email .mono{font-size:var(--fs-label);color:var(--sr-mut)}
.sr-admin-workspace .vw-benutzer-tabelle .sr-name-zelle strong{font-weight:650}
.sr-admin-workspace .vw-rollen-form .feld-eingabe--klein{min-height:34px;background:var(--sr-surface)}
.sr-admin-workspace #matrix .vw-recht-funktion{padding-block:16px}
.sr-admin-workspace #matrix .vw-recht-code{font-size:11px;letter-spacing:.015em;margin-top:6px}
.sr-admin-workspace #matrix .vw-recht-schalter{vertical-align:middle}
.sr-admin-workspace #audit .sr-tabelle td{padding-block:14px}
.sr-admin-workspace #audit .sr-tabelle .mono{font-size:var(--fs-label)}

/* Darstellung: schmale Auswahlflächen, kräftige aktive Markierung und
   ruhiger Vorschauplatz. Die Palette ist ein Bedienelement, keine Unterkarte. */
.sr-admin-workspace .vw-dst-kachel{position:relative;padding:15px;gap:7px;border-color:var(--sr-hair);
  box-shadow:none;transition:background 160ms var(--ease),border-color 160ms var(--ease),transform 160ms var(--ease)}
.sr-admin-workspace .vw-dst-kachel:hover{border-color:var(--sr-acc-line);transform:translateY(-2px)}
.sr-admin-workspace .vw-dst-kachel:has(:checked){box-shadow:inset 3px 0 var(--knopf-blau);border-color:var(--knopf-blau)}
.sr-admin-workspace .vw-dst-kachel .vw-dst-muster{height:28px;margin-bottom:5px}
.sr-admin-workspace .vw-dst-vorschau,.sr-admin-workspace .ka-km-vorschau{border:0;padding:20px;box-shadow:var(--sr-e1)}
.sr-admin-workspace .vw-dst-vorschau-titel{letter-spacing:.1em}
.sr-admin-workspace .vw-dst-projekt{padding:14px 0;border-bottom:1px solid var(--sr-hair)}
.sr-admin-workspace .vw-dst-projekt:last-child{border-bottom:0}
.sr-admin-workspace .vw-dst-projekt-auf{border:0;border-bottom:1px solid var(--sr-hair);border-radius:0;background:transparent;padding:12px 0}
.sr-admin-workspace .vw-dst-seg{border-color:var(--sr-hair);padding:3px;gap:3px;border-radius:9px;background:var(--sr-soft)}
.sr-admin-workspace .vw-dst-seg-teil{border:0;border-radius:6px;min-height:32px}
.sr-admin-workspace .vw-dst-felder{gap:22px 26px}
.sr-verwaltung .vw-dst-verlauf{height:116px;background:var(--theme-background-verlauf),var(--theme-background-canvas)}

/* Intelligenz und MCP: Konfiguration links, Vorschau rechts. Hilfen und
   Anleitungen erhalten eine Linie, Funktionskarten bleiben eigenständig. */
.sr-admin-workspace .ka-km-formulare{padding:2px 0}
.sr-admin-workspace .ka-km-formulare>h3{margin:30px 0 8px;padding-top:24px;border-top:1px solid var(--sr-hair)}
.sr-admin-workspace .ka-km-formulare>p{max-width:64ch;color:var(--sr-mut);line-height:1.55}
.sr-admin-workspace .ka-km-formulare>.vw-form{max-width:none;gap:20px 24px;margin:12px 0 0}
.sr-admin-workspace .ka-km-formulare>.vw-form>.feld{min-width:0;flex-basis:220px}
.sr-admin-workspace .ka-zugang-form{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;padding:16px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-soft)}
.sr-admin-workspace .ka-zugang-form>.feld{grid-column:1/-1}
.sr-admin-workspace .ka-zugang-form>.knopf{grid-column:2;justify-self:end}
.sr-admin-workspace .ka-km-formulare>details.explain{margin-top:18px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-surface);box-shadow:none}
.sr-admin-workspace .ka-km-formulare>details.explain>summary{padding:13px 15px;font-weight:650;background:transparent}
.sr-admin-workspace .ka-km-formulare>details.explain>.ex-body{padding:0 15px 15px}
.sr-admin-workspace .ka-km-formulare>details.explain .vw-form{max-width:none;margin:10px 0 0;gap:14px 18px}
.sr-admin-workspace .ka-einsatzwege{display:flex;flex-wrap:wrap;align-items:center;gap:8px 18px;margin:20px 0;padding:14px 16px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-soft)}
.sr-admin-workspace .ka-einsatzwege>strong{flex-basis:100%;font-size:var(--fs-small)}
.sr-admin-workspace .ka-einsatzwege a{font-size:var(--fs-small)}
/* Abo-Konten als Karten (Betreiber-Auftrag 16.09.2026). Vorher steckte je
   Konto ein Formular in einer Tabellenzelle — die Kaestchen brachen um, der
   Knopf stand neben einer Beschriftung. Karten geben dem Formular die Breite,
   die es braucht, und die vier leeren Spalten daneben entfallen. */
.sr-admin-workspace .ka-abo-karten{
  display:grid;
  grid-template-columns:repeat(auto-fill,minmax(min(100%,320px),1fr));
  gap:16px;
  margin:18px 0 4px;
}
.sr-admin-workspace .ka-abo-karte{
  display:flex;
  flex-direction:column;
  gap:12px;
  padding:18px 20px 16px;
  border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-card);
  background:var(--sr-surface);
  box-shadow:var(--sr-e1);
}
.sr-admin-workspace .ka-abo-kopf{
  display:flex;
  align-items:flex-start;
  justify-content:space-between;
  gap:12px;
}
.sr-admin-workspace .ka-abo-titel{display:flex;flex-direction:column;gap:3px;min-width:0}
.sr-admin-workspace .ka-abo-titel>strong{font-size:var(--fs-ui);line-height:1.3;color:var(--sr-ink)}
.sr-admin-workspace .ka-abo-kennung{font-size:var(--fs-label);color:var(--sr-mut)}
.sr-admin-workspace .ka-abo-zustand{flex:none}
.sr-admin-workspace .ka-abo-modelle{display:flex;flex-wrap:wrap;gap:6px;margin:0}
.sr-admin-workspace .ka-abo-modell{
  padding:2px 8px;
  border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-ctl);
  background:var(--sr-soft);
  color:var(--sr-mut);
  font-size:var(--fs-label);
}
.sr-admin-workspace .ka-abo-verwendung{display:flex;flex-wrap:wrap;gap:6px;margin:0}
.sr-admin-workspace .ka-abo-betrieb{
  display:flex;flex-wrap:wrap;align-items:baseline;gap:8px;margin:0;
  font-size:var(--fs-label);color:var(--sr-mut);
}
.sr-admin-workspace .ka-abo-freigabe{
  display:flex;
  flex-direction:column;
  gap:0;
  margin:0;
  padding-top:12px;
  border-top:1px solid var(--sr-hair);
  min-width:0;max-width:none;
}
.sr-admin-workspace .ka-abo-schalter{
  display:flex;align-items:center;gap:10px;
  padding:7px 0;min-height:0;cursor:pointer;
  font-size:var(--fs-ui);color:var(--sr-ink);
}
.sr-admin-workspace .ka-abo-schalter input{
  flex:none;width:18px;height:18px;margin:0;accent-color:var(--sr-acc-ink);cursor:pointer;
}
.sr-admin-workspace .ka-abo-unterschalter{
  margin-left:28px;padding-left:12px;
  border-left:2px solid var(--sr-hair);
}
.sr-admin-workspace .ka-abo-schalter--unter{color:var(--sr-mut)}
.sr-admin-workspace .ka-abo-hinweis{
  margin:2px 0 0;font-size:var(--fs-label);color:var(--sr-mut);line-height:1.4;
}
.sr-admin-workspace .ka-abo-fuss{display:flex;justify-content:flex-end;margin-top:14px}
/* Anbieter-Freigaben nutzen dieselben Karten; zusätzlich Feldgruppen mit
   Beschriftung über Auswahl bzw. Schaltern. */
.sr-admin-workspace .ka-frei-gruppe{display:flex;flex-direction:column;gap:6px;margin:0;min-width:0}
.sr-admin-workspace .ka-frei-gruppe+.ka-frei-gruppe{margin-top:16px}
.sr-admin-workspace .ka-frei-gruppe .feld-eingabe{width:100%;max-width:none}
/* Knöpfe in einer Reihe auf gleicher Höhe, auch bei verschieden vielen Modellen. */
.sr-admin-workspace .ka-frei-karten .ka-abo-freigabe{flex:1}
.sr-admin-workspace .ka-frei-karten .ka-abo-fuss{margin-top:auto;padding-top:14px}
@media(max-width:559px){
  .sr-admin-workspace .ka-abo-karte{padding:16px}
  .sr-admin-workspace .ka-abo-fuss{margin-top:12px}
  .sr-admin-workspace .ka-abo-fuss .knopf{width:100%;justify-content:center}
}
.sr-admin-workspace :is(#anbieter,#einrichtung) details.explain{box-shadow:none;background:transparent;border-radius:0;border-bottom:1px solid var(--sr-hair)}
.sr-admin-workspace :is(#anbieter,#einrichtung) details.explain>summary{background:transparent;padding-left:0}
.sr-admin-workspace :is(#anbieter,#einrichtung) details.explain>.ex-body{padding:16px 0 20px}
.sr-admin-workspace #anbieter td .vw-form{min-width:260px;max-width:480px}
.sr-admin-workspace #anbieter .ki-kosten-schalter-zeile{min-height:36px;align-items:flex-start;gap:10px}
.sr-admin-workspace :is(#einrichtung,#arbeitsablaeufe) .sr-thema-liste{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,330px),1fr));gap:24px}
.sr-admin-workspace :is(#einrichtung,#arbeitsablaeufe) .sr-thema-liste>.sr-karte{margin:0}
.sr-admin-workspace .ki-kosten-kennzahlen{margin:0 0 24px;padding-bottom:22px;border-bottom:1px solid var(--sr-hair)}
.sr-admin-workspace .ki-kosten-kennzahlen dd{letter-spacing:-.035em}
.sr-admin-workspace .ki-kosten-form{padding-top:4px;gap:20px 26px}
.sr-admin-workspace .ki-kosten-intern{border-top:1px solid var(--sr-hair);padding-top:18px}

/* Projekt-Einstellungen: Projektanker und zwei gezielte Arbeitsbereiche. */
.pe-seite{min-width:0}
.pe-projekt-zurueck{display:flex;align-items:center;flex-wrap:wrap;gap:10px 20px;margin:0 0 24px;font-size:var(--fs-small)}
.pe-projekt-zurueck a{display:inline-flex;align-items:center;gap:9px;color:var(--sr-ink);font-weight:600;text-decoration:none}
.pe-projekt-zurueck a:hover{color:var(--sr-acc-ink)}
.pe-projekt-zurueck>span{color:var(--sr-mut);padding-left:20px;border-left:1px solid var(--sr-hair)}
.pe-allgemein-raster{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(300px,.8fr);gap:24px;align-items:start}
.pe-allgemein-gestaltung{display:grid;gap:24px;min-width:0}
.pe-allgemein-raster .sr-karte{margin:0}
.pe-seite #pe-titel .sr-anlegen-form{grid-template-columns:1fr;gap:18px;margin-top:22px}
.pe-seite #pe-stamm .sr-tabelle-wrap{border:0;box-shadow:none}
.pe-seite #pe-stamm table{min-width:0;width:100%}
.pe-seite #pe-stamm th{width:100px;font-size:var(--fs-label);color:var(--sr-mut);font-weight:500}
.pe-seite #pe-stamm :is(th,td){padding:13px 0;white-space:normal;overflow-wrap:anywhere;background:transparent}
.pe-seite #pe-stamm td{text-align:right;padding-left:14px}
.pe-seite #pe-stamm .app-fuss{margin-top:22px;line-height:1.55}
.pe-seite #pe-betrieb .kosten-formulare{margin:20px 0 0}
.pe-seite #pe-betrieb .kosten-inline-form{flex-direction:row;align-items:center;gap:20px}
.pe-seite .pk-form{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:28px}
.pe-seite .pk-feld{min-width:0}
.pe-seite .pk-feld-titel{font-size:var(--fs-body)}
.pe-seite .pk-feld-erklaerung{min-height:3em;font-size:var(--fs-small)}
.pe-seite .pk-feld textarea{width:100%;min-height:138px;box-sizing:border-box;resize:vertical}
.pe-seite .pk-form>button{grid-column:1 / -1;justify-self:start}
.pe-seite .pe-v-wege{gap:32px;grid-template-columns:repeat(2,minmax(0,1fr))}
.pe-seite .pe-v-weg+.pe-v-weg{border-left:1px solid var(--sr-hair);padding-left:32px}
.pe-seite .pe-v-weg-titel{font-size:var(--fs-body);color:var(--sr-ink);margin-bottom:10px}
.pe-seite .pe-v-weg>p{font-size:var(--fs-small);color:var(--sr-mut);line-height:1.55}
.pe-seite .pe-v-weg .sr-anlegen-form{grid-template-columns:1fr;gap:16px;margin-top:22px}
.pe-seite #pe-verantwortliche .kosten-inline-form{min-width:0}
.pe-seite .pe-dienst-form details.explain{box-shadow:none;border-radius:0;background:transparent;margin:0}
.pe-seite .pe-dienst-form details.explain>summary{background:transparent}
.pe-seite .pe-kosten-ki{border:0;border-left:1px solid var(--sr-hair);border-radius:0;background:transparent;padding:8px 24px}
.pe-seite .anb-projekt{padding:0;border:0;border-radius:0;background:transparent}
.pe-seite .anb-form-zeile details.explain{box-shadow:none;background:transparent;border-radius:0;margin:0}

/* Benachrichtigungen: Kanalverfügbarkeit, Anlassmatrix, eine Empfängerebene. */
.pe-seite #pe-benachrichtigungen>.sr-karte-koerper{padding-top:0}
.pe-b-kanalstatus{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px;padding:22px 0;margin-bottom:4px;border-bottom:1px solid var(--sr-hair)}
.pe-b-kanalstatus>div{display:flex;flex-wrap:wrap;align-items:center;align-content:start;gap:8px 10px;min-width:0}
.pe-b-kanalstatus>div>strong{font-size:var(--fs-small)}
.pe-b-kanalstatus>div>span:last-child:not(.sr-badge){width:100%;color:var(--sr-mut);font-size:var(--fs-label);line-height:1.5}
.pe-b-einleitung{padding-top:20px;color:var(--sr-mut)}
.pe-seite .pe-b-matrix{width:100%;min-width:610px;border-collapse:collapse}
.pe-seite .pe-b-matrix>thead>tr>th{padding-top:20px;padding-bottom:14px;background:transparent}
.pe-seite .pe-b-matrix .pe-b-anlass>td{border-bottom:0;padding-top:22px;padding-bottom:6px;background:transparent;vertical-align:top}
.pe-seite .pe-b-matrix .pe-b-anlass strong{font-size:var(--fs-body);font-weight:650;letter-spacing:-.01em}
.pe-seite .pe-b-matrix .pe-b-anlass-sub{margin-top:7px;max-width:43ch;font-size:var(--fs-small);line-height:1.5}
.pe-seite .pe-b-matrix .pe-b-anlass .sr-name-zelle{white-space:normal;min-width:210px}
.pe-seite .pe-b-empfaenger-zahl>span{display:block;margin-bottom:4px;font-size:var(--fs-small)}
.pe-seite .pe-b-matrix .pe-b-detail>td{padding:0 0 6px;background:transparent;border-bottom:1px solid var(--sr-hair)}
.pe-seite .pe-b-matrix .pe-b-detail:last-child>td{border-bottom:0}
.pe-seite .pe-b-editor{margin:0;border:0;border-radius:0;box-shadow:none;background:transparent}
.pe-seite .pe-b-editor>summary{display:flex;align-items:center;gap:10px;min-height:44px;width:fit-content;max-width:100%;box-sizing:border-box;
  padding:8px 16px;color:var(--sr-acc-ink);font-size:var(--fs-small);font-weight:600;cursor:pointer;list-style:none;border:0;background:transparent;border-radius:6px}
.pe-b-editor>summary::-webkit-details-marker{display:none}
.pe-seite .pe-b-editor>summary:hover{background:var(--sr-soft)}
.pe-b-editor>summary:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:-2px}
.pe-b-editor-anlass{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
.pe-b-editor-pfeil{width:7px;height:7px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(45deg);transition:transform 160ms var(--ease);margin-left:4px}
.pe-b-editor[open] .pe-b-editor-pfeil{transform:rotate(225deg)}
.pe-b-editor-inhalt{padding:22px 18px 18px;border-top:1px solid var(--sr-hair);margin-top:8px}
.pe-b-kanaele{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,290px),1fr));gap:32px;align-items:start}
.pe-seite .pe-b-kanaele>.pe-b-kanal{display:grid;grid-template-columns:1fr;align-items:start;gap:20px;min-width:0;padding:0;margin:0;background:transparent;border:0;border-radius:0;box-shadow:none}
.pe-b-kanal+.pe-b-kanal{border-left:1px solid var(--sr-hair)!important;padding-left:32px!important}
.pe-b-kanal-kopf{display:flex;align-items:center;justify-content:space-between;gap:10px}
.pe-b-kanal-kopf h4{font-size:var(--fs-body);font-weight:650;margin:0;color:var(--sr-ink)}
.pe-b-auswahl{min-width:0;padding:0;margin:0;border:0}
.pe-b-auswahl>legend{font-size:var(--fs-small);font-weight:600;padding:0;margin-bottom:8px;color:var(--sr-ink)}
.pe-seite .pe-b-haken{max-height:230px;gap:0;scrollbar-width:thin}
.pe-b-haken .ki-kosten-schalter-zeile{display:flex;align-items:flex-start;gap:11px;padding:10px 0;min-height:0;cursor:pointer}
.pe-b-haken .ki-kosten-schalter-zeile+.ki-kosten-schalter-zeile{border-top:1px solid var(--sr-hair)}
.pe-b-haken input{flex:0 0 auto;width:17px;height:17px;accent-color:var(--knopf-blau);margin:3px 0 0}
.pe-b-person{display:grid;gap:3px;min-width:0;line-height:1.45;overflow-wrap:anywhere}
.pe-b-person strong{font-size:var(--fs-small);font-weight:600}
.pe-b-person .vw-still{font-size:var(--fs-label)}
.pe-b-kanal-fuss{padding-top:2px}
.pe-seite .pe-b-kanal-fuss .knopf{white-space:normal;text-align:left;max-width:100%;min-height:40px}
.pe-seite .pe-b-kanal .feld-eingabe{min-width:0;width:100%}
.pe-b-empfaenger-liste{margin:0;padding-left:18px;line-height:1.7}
.pe-b-verlauf{margin-top:28px;padding-top:22px;border-top:1px solid var(--sr-hair)}
.pe-b-verlauf-kopf{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}
.pe-seite .pe-b-drilldown-titel{font-size:var(--fs-small);color:var(--sr-ink);margin:0}
.pe-b-verlauf>.app-fuss{margin:0;color:var(--sr-mut)}
.pe-seite .pe-b-verlauf .sr-tabelle-wrap{box-shadow:none;border:0;border-radius:0}
.pe-seite .pe-b-verlauf .sr-tabelle{min-width:590px}
.pe-seite .pe-b-matrix .pe-b-verlauf td{width:auto;white-space:normal;padding:10px 12px}

@media(max-width:1100px){
  .pe-allgemein-raster{grid-template-columns:1fr}
  .pe-allgemein-gestaltung{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start}
}
@media(max-width:820px){
  .pe-seite .pe-v-wege,.pe-seite .pk-form,.pe-allgemein-gestaltung{grid-template-columns:1fr}
  .pe-seite .pe-v-weg+.pe-v-weg{border-left:0;border-top:1px solid var(--sr-hair);padding:26px 0 0}
  .pe-b-kanalstatus{gap:16px}
  .pe-b-kanaele{grid-template-columns:1fr;gap:26px}
  .pe-b-kanal+.pe-b-kanal{padding:24px 0 0!important;border-left:0!important;border-top:1px solid var(--sr-hair)!important}
}
@media(max-width:559px){
  :where(.sr-admin-workspace,.pe-seite){--vw-innen:16px;--vw-abstand:18px}
  :where(.sr-admin-workspace,.pe-seite) .sr-karte-kopf{padding-top:18px;padding-bottom:14px}
  .pe-projekt-zurueck{margin-bottom:18px;gap:8px 12px}
  .pe-projekt-zurueck>span{padding-left:12px}
  .pe-b-kanalstatus{grid-template-columns:1fr;gap:14px}
  .pe-b-kanalstatus>div>span:last-child:not(.sr-badge){width:auto;flex-basis:100%}
  .pe-seite .pe-b-editor-inhalt{padding:20px 12px}
  .sr-admin-workspace .ka-km-formulare>.vw-form>.feld{flex-basis:100%}
}
@media(prefers-reduced-motion:reduce){
  :where(.sr-admin-workspace,.pe-seite) .feld-eingabe,.sr-admin-workspace .vw-dst-kachel,.pe-b-editor-pfeil{transition:none}
  .sr-admin-workspace .vw-dst-kachel:hover{transform:none}
}

/* Mailing: Typwahl, Redaktion und Freigabe sind getrennte Arbeitsflächen. */
.sr-mailing{min-width:0}
.kapitel-modus .sr-mailing:has(#meine-regeln:not([hidden])) .sr-mailing-mandant{display:none}
.sr-mailing-mandant{display:flex;align-items:center;flex-wrap:wrap;gap:12px;margin:0 0 24px;padding:0}
.sr-mailing-mandant>label{display:flex;align-items:center;gap:12px;font-weight:600;font-size:var(--fs-small)}
.sr-mailing .sr-inline-form .feld-eingabe{min-width:180px;max-width:100%;min-height:38px}
.sr-mailing .section>p{max-width:84ch;line-height:1.6;color:var(--sr-mut);margin:0 0 22px}
.sr-mailing .section>.tbl-wrap{background:var(--sr-surface);border-radius:var(--sr-r-card);box-shadow:var(--sr-e1)}
.sr-mailing :is(#katalog,#versionen,#regeln,#meine-regeln) td{padding-top:17px;padding-bottom:17px}
.sr-mailing #meine-regeln td:first-child>span{display:inline-block;margin-top:5px;color:var(--sr-mut);font-size:var(--fs-small)}
.sr-mailing #meine-regeln td:first-child strong{font-size:var(--fs-body)}
.sr-mailing #editor>.sr-stack{display:grid;gap:22px;min-width:0;max-width:1040px}
.sr-mailing #editor .sr-inline-form{display:flex;flex-wrap:wrap;gap:12px;margin:0}
.sr-mailing #editor .sr-inline-form>label{display:flex;align-items:center;flex-wrap:wrap;gap:12px;font-size:var(--fs-small);font-weight:600}
.sr-mailing .formular-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:22px;padding:var(--vw-innen);background:var(--sr-surface);border-radius:var(--sr-r-card);box-shadow:var(--sr-e1)}
.sr-mailing .formular-grid>.span-2{grid-column:1 / -1;min-width:0;margin:0}
.sr-mailing .formular-grid>label{display:grid;gap:9px;font-weight:600;font-size:var(--fs-small)}
.sr-mailing .formular-grid .feld-eingabe{width:100%;box-sizing:border-box;min-height:42px;padding:12px 14px;font-weight:400}
.sr-mailing .formular-grid textarea{min-height:320px;resize:vertical;font-size:var(--fs-body);line-height:1.65}
.sr-mailing .formular-grid>p{font-size:var(--fs-small);line-height:1.7;color:var(--sr-mut)}
.sr-mailing .formular-grid>p code{display:inline-block;margin:3px 0;font-size:var(--fs-label)}
.sr-mailing .formular-grid>.vw-aktionen{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:10px;border-top:1px solid var(--sr-hair);padding-top:20px}
.sr-mailing #versionen td:nth-child(4){min-width:200px;max-width:380px;white-space:normal;line-height:1.5}
@media(max-width:559px){
  .sr-mailing-mandant>label{align-items:flex-start;flex-direction:column;gap:6px}
  .sr-mailing .formular-grid{gap:18px}
  .sr-mailing .formular-grid>.vw-aktionen{justify-content:stretch}
  .sr-mailing .formular-grid>.vw-aktionen>.knopf{flex:1 1 100%;min-height:42px}
}

/* Diese beiden Ansichten besitzen eine zusätzliche Wurzel. Ihre Kapitel
   übernehmen deshalb dieselbe rahmenlose Hülle wie direkte sr-body-Kapitel. */
.sr-body :is(.pe-seite,.sr-mailing)>.section{
  margin:0;background:none;border:0;border-radius:0;box-shadow:none;padding:0}
.sr-body :is(.pe-seite,.sr-mailing)>.section:not([hidden]){display:flex;flex-direction:column;gap:24px}
.sr-body :is(.pe-seite,.sr-mailing)>.section[hidden]{display:none}
.sr-body :is(.pe-seite,.sr-mailing)>.section>.section-head{
  position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;padding:0}
.sr-body :is(.pe-seite,.sr-mailing)>.section>.sr-karte{margin:0}

/* Eine Detailzeile gehört zum Anlass und erhält keinen Tabellen-Zebrastreifen. */
.sr-app .pe-seite .pe-b-matrix>tbody>tr.pe-b-detail>td{background:transparent}
.pe-b-fehlt{display:block;max-width:12ch;margin-top:7px;font-size:11px;color:var(--sr-mut);line-height:1.4;white-space:normal}
.pe-seite .pe-b-matrix .sr-schalter:disabled{opacity:.7;cursor:not-allowed;transform:none;box-shadow:none}
.pe-seite .pe-b-matrix td[data-kanal-label]::before{display:none}
@media(max-width:640px){
  .pe-seite .pe-b-matrix{display:block;min-width:0}
  .pe-seite .pe-b-matrix>thead{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
  .pe-seite .pe-b-matrix>tbody{display:block;width:100%}
  .sr-app .pe-seite .pe-b-matrix>tbody>tr>td{height:auto;min-height:0}
  .pe-seite .pe-b-matrix .pe-b-anlass{display:flex;flex-wrap:wrap;gap:16px 18px;padding-top:22px}
  .sr-app .pe-seite .pe-b-matrix .pe-b-anlass>td{display:block;flex:1 1 70px;min-width:0;width:auto;padding:0;white-space:normal}
  .sr-app .pe-seite .pe-b-matrix .pe-b-anlass>td:first-child{flex-basis:100%}
  .sr-app .pe-seite .pe-b-matrix .pe-b-anlass>td:last-child{flex:1 1 110px}
  .pe-seite .pe-b-matrix td[data-kanal-label]::before{display:block;content:attr(data-kanal-label);font-size:var(--fs-label);color:var(--sr-mut);margin-bottom:7px}
  .pe-seite .pe-b-matrix .pe-b-empfaenger-zahl::before{display:block;content:"Empfänger";font-size:var(--fs-label);color:var(--sr-mut);margin-bottom:7px}
  .pe-seite .pe-b-matrix .pe-b-detail{display:block;width:100%;margin-top:10px}
  .pe-seite .pe-b-matrix .pe-b-detail>td{display:block;box-sizing:border-box;width:100%;padding:0 0 12px}
  .pe-seite .pe-b-editor>summary{padding-left:0;padding-right:8px}
  .pe-seite .pe-b-editor-inhalt{padding-left:0;padding-right:0}
  .pe-seite .pe-b-editor{width:100%}
  .pe-seite .pe-b-matrix .pe-b-verlauf{max-width:100%;min-width:0}
}

/* Bei einem einzigen Zustellweg teilen sich Kontakte und freie Adressen die
   Arbeitsbreite. Mehrere Wege behalten je eine eigene, beschriftete Spalte. */
@media(min-width:821px){
  .pe-seite .pe-b-kanaele>.pe-b-kanal:only-child{grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr);column-gap:32px}
  .pe-b-kanaele>.pe-b-kanal:only-child>.pe-b-kanal-kopf{grid-column:1 / -1}
  .pe-b-kanaele>.pe-b-kanal:only-child>.pe-b-kanal-fuss{grid-column:2}
}

/* Nur die wirksame Zugangsart zeigt ihre Auswahl. Beide Formularzweige
   bleiben vorhanden, damit ein Wechsel den bisherigen Stand bewahrt. */
.sr-anlegen-form:has(.ki-zugangsmodus input[value="bestand"]:checked) .ki-zugangsoptionen,
.sr-anlegen-form:has(.ki-zugangsmodus input[value="auswahl"]:checked) .ki-anbieter-bestand { display: none; }
.ki-zugangsoptionen .kw-kosten-wert { display: grid; gap: 6px; align-content: start; }
.ki-zugangsoptionen label { overflow-wrap: anywhere; }


/* ---- berichte-design.css ---- */
.berichte-design-liste{display:grid;gap:var(--s3)}
.berichte-design-plan{border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface)}
.berichte-design-plan>summary{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);padding:var(--s3);cursor:pointer;list-style-position:inside}
.berichte-design-plan>summary span{display:grid;gap:4px}
.berichte-design-plan>summary small{color:var(--text-2);font-weight:400}
.berichte-design-form{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s3);padding:0 var(--s3) var(--s3)}
.berichte-design-gruppe{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-content:start;gap:var(--s2);min-width:0;padding:var(--s3);border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface-2)}
.berichte-design-gruppe legend{padding:0 6px;font-weight:700;color:var(--text)}
.berichte-design-wahlen{display:flex;flex-wrap:wrap;gap:8px 16px;padding-top:8px}
.berichte-design-wahlen--abschnitte{grid-column:1/-1}
.berichte-design-wahl{display:inline-flex;align-items:center;gap:7px;min-height:32px;color:var(--text)}
.berichte-design-farbe{width:48px;height:38px;padding:2px;border:1px solid var(--line);border-radius:6px;background:var(--surface);cursor:pointer}
.berichte-design-form>.knopf{justify-self:start;grid-column:1/-1}
@media(max-width:820px){
  .berichte-design-form,.berichte-design-gruppe{grid-template-columns:1fr}
  .berichte-design-plan>summary{align-items:flex-start;flex-direction:column}
}


/* ---- bericht-raster.css ---- */
.br-dokument{--br-bg:var(--br-canvas,#f2f3f5);--br-surface:#fff;--br-copy:var(--br-text,#303842);--br-heading:var(--br-ink,#24282e);--br-border:#d8dee5;margin:0;width:100%;max-width:none;overflow-x:hidden;background:var(--br-bg);color:var(--br-copy);font:400 16px/1.65 var(--br-font,system-ui),sans-serif;color-scheme:light}.br-dokument[data-br-theme=medium]{--br-bg:#dfe4e7;--br-surface:#f4f6f7;--br-copy:#29333b;--br-heading:#18232b;--br-border:#bcc6cc}.br-dokument[data-br-theme=dark]{--br-bg:#12181d;--br-surface:#1d262d;--br-copy:#dbe3e8;--br-heading:#f5f8fa;--br-border:#34434d;color-scheme:dark}.br-dokument *{box-sizing:border-box}.br-dokument a{color:var(--br-heading);text-underline-offset:3px}.br-dokument button,.br-dokument input,.br-dokument textarea,.br-dokument select{font:inherit}
.br-hero{height:400px;min-height:400px;display:flex;align-items:flex-end;padding:clamp(32px,7vw,88px);color:#fff;background:linear-gradient(125deg,color-mix(in srgb,var(--br-primary,#00abd7) 86%,#102c3a),color-mix(in srgb,var(--br-primary,#00abd7) 42%,#18232b));border-bottom:5px solid var(--br-primary,#00abd7)}.br-dokument[data-br-theme=dark] .br-hero{background:linear-gradient(125deg,color-mix(in srgb,var(--br-primary,#00abd7) 45%,#0b1115),#111920)}.br-hero>div{width:min(1280px,100%);margin:auto}.br-hero h1{max-width:900px;margin:0;color:inherit;font:700 clamp(2rem,3.4vw,2.75rem)/1.12 var(--br-font,system-ui),sans-serif;letter-spacing:-.025em;overflow-wrap:anywhere}.br-hero p{margin:16px 0 0;color:inherit}.br-seitenlayout{display:grid;grid-template-columns:minmax(0,1fr);max-width:1616px;margin:auto}.br-hauptteil{min-width:0}
.br-modus,.br-werkzeuge{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:20px}.br-modus button,.br-werkzeuge button{min-height:44px;padding:7px 13px;border:1px solid rgba(255,255,255,.6);border-radius:7px;background:rgba(10,24,31,.3);color:#fff;cursor:pointer}.br-modus button[aria-pressed=true]{background:#fff;color:#17242c;box-shadow:0 0 0 2px rgba(255,255,255,.25)}
.br-toc{max-width:1280px;margin:32px auto 0;padding:0 24px}.br-toc strong{display:block;font-size:.78rem;letter-spacing:.1em;text-transform:uppercase}.br-toc ol{display:flex;flex-wrap:wrap;gap:5px 24px;margin:10px 0 0;padding:0;list-style:none}.br-toc li{margin:0}.br-toc-3{font-size:.9em}.br-toc a{text-decoration:none}.br-toc a:hover{text-decoration:underline}
.br-raster{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));align-items:start;gap:20px;max-width:1280px;margin:auto;padding:32px 24px 64px}.br-baustein{grid-column:span var(--br-span,3);min-width:0;border:1px solid var(--br-border);border-radius:12px;background:var(--br-surface);color:var(--br-copy);box-shadow:0 1px 2px rgba(10,20,30,.06)}.br-baustein--transparent{border-color:transparent;background:transparent;box-shadow:none}.br-inhalt{padding:clamp(20px,2.5vw,32px);overflow-x:auto}.br-inhalt>:first-child{margin-top:0}.br-inhalt>:last-child{margin-bottom:0}.br-inhalt p,.br-inhalt li{line-height:1.72}.br-inhalt p{max-width:74ch;margin:0 0 1.15em}.br-inhalt h1,.br-inhalt h2,.br-inhalt h3{color:var(--br-heading);font-family:var(--br-font,system-ui),sans-serif;letter-spacing:-.018em}.br-inhalt h2{margin:0 0 1.1em;font-size:clamp(1.3rem,2vw,1.7rem);line-height:1.25}.br-inhalt h3{margin:2em 0 .7em;font-size:1.12rem}.br-inhalt table{width:100%;border-collapse:collapse}.br-inhalt th,.br-inhalt td{padding:11px 13px;text-align:left;vertical-align:top;border-bottom:1px solid var(--br-border)}.br-inhalt th{color:var(--br-heading);background:color-mix(in srgb,var(--br-heading) 5%,transparent)}.br-inhalt img,.br-inhalt svg,.br-inhalt canvas{max-width:100%}.br-kennzahl-wert{display:block;color:var(--br-heading);font-size:2rem;font-weight:750;line-height:1.1;overflow-wrap:anywhere}.br-kennzahl-quelle,.br-kennzahl-stand{display:block;margin-top:8px;font-size:.76rem;line-height:1.4}.br-massnahmen{white-space:pre-wrap;overflow-wrap:anywhere}.br-ergaenzung{margin-top:28px;padding-top:22px;border-top:1px solid var(--br-border)}.br-leer{opacity:.7;font-style:italic}
.br-steuerung button,.br-steuerung select,.br-palette button,.br-speichern{min-height:44px;border:1px solid var(--br-border);border-radius:7px;background:var(--br-surface);color:var(--br-heading);padding:7px 12px;cursor:pointer}.br-speichern{background:var(--br-primary,#00abd7)!important;border-color:var(--br-primary,#00abd7)!important;color:#071f25!important;font-weight:700}.br-titel-feld,.br-massnahmen-feld{font-weight:700}.br-titel-feld{display:block;max-width:760px;margin-top:18px}.br-titel-feld input,.br-massnahmen-feld textarea{display:block;width:100%;margin-top:6px;padding:10px 12px;border:1px solid var(--br-border);border-radius:8px;background:var(--br-surface);color:var(--br-heading)}.br-massnahmen-feld{display:block;max-width:1280px;margin:26px auto 0;padding:0 24px}
.br-editor.ist-editieren .br-seitenlayout{grid-template-columns:minmax(0,1fr) 300px;gap:16px;padding-right:16px}.br-editor.ist-editieren .br-raster{background-image:linear-gradient(to right,color-mix(in srgb,var(--br-primary) 10%,transparent) 1px,transparent 1px);background-size:calc((100% - 48px)/6) 100%}.br-editor.ist-editieren .br-baustein{outline:1px dashed color-mix(in srgb,var(--br-primary) 30%,transparent)}.br-steuerung{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:9px 11px;border-bottom:1px solid var(--br-border);background:var(--br-bg);border-radius:12px 12px 0 0}.br-steuerung strong{margin-right:auto}.br-steuerung label{display:flex;align-items:center;gap:5px;font-size:.84rem}.br-steuerung button{min-width:44px;padding:4px 8px}.br-ziehgriff{padding:4px;cursor:grab;font-size:1.3rem;touch-action:none;user-select:none}.br-katalog-liste button{touch-action:none}.br-palette-innen{position:sticky;top:20px;padding:20px;border:1px solid var(--br-border);border-radius:12px;background:var(--br-surface)}.br-palette h2{margin:0;color:var(--br-heading)}.br-palette p{margin:5px 0 16px;font-size:.88rem}.br-katalog-liste{display:grid;gap:8px}.br-katalog-liste button{display:flex;align-items:center;gap:8px;width:100%;text-align:left}.br-katalog-liste button:disabled{opacity:.48}.br-insert-marker{grid-column:1/-1;height:5px;border-radius:9px;background:var(--br-primary)}.br-editor .ist-schwebend{position:relative;z-index:30;box-shadow:0 14px 28px rgb(15 23 42 / 26%);transition:none}.br-editor.ist-geaendert [data-br-save]::after{content:' *'}
@media(max-width:1100px){.br-raster{grid-template-columns:repeat(3,minmax(0,1fr))}.br-baustein{grid-column:span min(var(--br-span),3)}.br-editor.ist-editieren .br-seitenlayout{grid-template-columns:minmax(0,1fr) 270px}}
@media(max-width:780px){.br-hero{padding:28px 20px}.br-hero h1{font-size:1.75rem}.br-editor.ist-editieren .br-seitenlayout{display:block;padding-right:0}.br-palette-innen{position:static;margin:0 14px}.br-raster{grid-template-columns:repeat(2,minmax(0,1fr));padding:20px 14px 44px}.br-baustein{grid-column:span min(var(--br-span),2)}.br-toc{padding-inline:18px}}
@media(max-width:460px){.br-raster{grid-template-columns:1fr}.br-baustein{grid-column:1}.br-inhalt{padding:18px 16px}.br-toc ol{display:block}.br-toc li{margin:5px 0}}
.sr-bericht-nav{padding:0 8px 6px 28px}.sr-bericht-nav .sr-nav-item{min-height:44px;white-space:normal;font-size:12px;line-height:1.35;padding:8px 12px;border-left:2px solid var(--border,#dce0e3)}
@media(prefers-reduced-motion:reduce){.br-dokument *{scroll-behavior:auto!important;transition:none!important}}
.br-dokument{overflow-x:visible;font-family:Inter,system-ui,-apple-system,"Segoe UI",sans-serif}.br-dokument [hidden]{display:none!important}.br-dokument[data-br-theme=medium] .br-hero{background:linear-gradient(125deg,color-mix(in srgb,var(--br-primary,#00abd7) 66%,#31434d),#53616a)}.br-hero h1{font-family:Inter,system-ui,-apple-system,"Segoe UI",sans-serif}.br-toc strong{color:var(--br-heading)}.br-toc ol{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 24px}.br-toc-3{padding-left:18px}.br-insert-marker{position:fixed;z-index:20;height:4px;border-radius:9px;background:var(--br-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--br-primary) 22%,transparent);pointer-events:none}
@media(max-width:1440px){.br-editor.ist-editieren .br-raster{grid-template-columns:repeat(3,minmax(0,1fr))}.br-editor.ist-editieren .br-baustein{grid-column:span min(var(--br-span),3)}}
@media(max-width:1100px){.br-editor.ist-editieren .br-seitenlayout{display:block;padding-right:0}.br-editor.ist-editieren .br-palette-innen{position:static;margin:0 24px}.br-toc ol{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:780px){.br-toc ol{display:block}.br-toc li{margin:5px 0}}

.br-hero{color:#17242c;background:linear-gradient(125deg,color-mix(in srgb,var(--br-primary) 28%,#fff),color-mix(in srgb,var(--br-primary) 8%,#f2f5f7))}
.br-dokument .br-hero a{color:inherit}.br-hero .br-modus button,.br-hero .br-werkzeuge button{color:#17242c;background:rgba(255,255,255,.55);border-color:rgba(23,36,44,.24)}
.br-dokument[data-br-theme=medium] .br-hero{color:#fff;background:linear-gradient(125deg,color-mix(in srgb,var(--br-primary) 32%,#182a33),#384953)}
.br-dokument[data-br-theme=dark] .br-hero{color:#fff;background:linear-gradient(125deg,color-mix(in srgb,var(--br-primary) 22%,#0b1115),#111920)}
.br-dokument:not([data-br-theme=light]) .br-hero .br-modus button,.br-dokument:not([data-br-theme=light]) .br-hero .br-werkzeuge button{color:#fff;background:rgba(0,0,0,.25);border-color:rgba(255,255,255,.5)}
.br-hero .br-modus button[aria-pressed=true]{color:#17242c!important;background:#fff!important}
.br-inhalt h1,.br-inhalt h2,.br-inhalt h3,.br-inhalt h4{font-family:Inter,system-ui,sans-serif;line-height:1.3;color:var(--br-heading)}
.br-inhalt h1{font-size:1.8rem;margin:1.5em 0 1em}.br-inhalt h2{margin:2em 0 .8em}.br-inhalt h4{margin:1.5em 0 .6em}.br-inhalt>:first-child{margin-top:0}
.br-inhalt ul,.br-inhalt ol{padding-left:1.5em;margin:0 0 1.5em}.br-inhalt li{margin:.4em 0}.br-inhalt strong,.br-inhalt .lead,.br-inhalt .who{color:var(--br-heading)}.br-inhalt .karte-herkunft{display:block;font-size:.75rem;line-height:1.5;margin-top:12px;color:var(--br-copy)}
.br-toc summary,.br-text-einstellungen summary{cursor:pointer;min-height:44px;line-height:44px;color:var(--br-heading);font-weight:600}.br-toc ol{display:block;column-count:2;column-gap:32px}.br-toc li{break-inside:avoid;margin:6px 0}.br-toc a{display:inline-block;line-height:1.5}.br-toc-3{font-size:.85em}
.br-text-einstellungen{margin-bottom:20px;border-bottom:1px solid var(--br-border);padding-bottom:12px}.br-palette .br-titel-feld,.br-palette .br-massnahmen-feld{margin:12px 0;padding:0;font-size:14px}.br-palette input,.br-palette textarea{font-size:16px}
.br-baustein[data-br-id^="kennzahl-"] .br-inhalt{padding:18px 14px}.br-baustein[data-br-id^="kennzahl-"] h2{font-size:14px;line-height:1.4;letter-spacing:0}
@media(max-width:780px){.br-editor.ist-editieren .br-raster{grid-template-columns:repeat(2,minmax(0,1fr))}.br-editor.ist-editieren .br-baustein{grid-column:span min(var(--br-span),2)}.br-toc ol{column-count:1}}
@media(max-width:460px){.br-editor.ist-editieren .br-raster{grid-template-columns:1fr}.br-editor.ist-editieren .br-baustein{grid-column:1}.br-editor.ist-editieren .br-palette-innen{margin:0 14px}.br-hero{height:auto;min-height:400px}.br-hero h1{font-size:28px}}

.br-dokument{--bg:var(--br-bg);--surface:var(--br-surface);--surface-2:var(--br-bg);--border:var(--br-border);--border-l:var(--br-border);--text:var(--br-heading);--text-2:var(--br-copy);--text-3:var(--br-copy);--thead-bg:var(--br-bg);--thead-fg:var(--br-heading);--font-body:Inter,system-ui,sans-serif;--font-num:Inter,system-ui,sans-serif}
.br-dokument .br-speichern{background:var(--br-heading)!important;border-color:var(--br-heading)!important;color:var(--br-surface)!important}
.br-dokument [id]{scroll-margin-top:24px}.br-dokument :focus-visible{outline:3px solid var(--br-heading);outline-offset:3px}

.br-steuerung{position:relative;gap:6px;padding:6px 8px;font-size:13px}.br-steuerung strong{flex:1;min-width:0;overflow-wrap:anywhere}.br-kartenoptionen summary{list-style:none;display:flex;align-items:center;justify-content:center;width:44px;height:44px;cursor:pointer;border-radius:6px}.br-kartenoptionen summary::-webkit-details-marker{display:none}.br-kartenoptionen summary:hover{background:var(--br-border)}.br-kartenoptionen-inhalt{position:absolute;left:0;right:0;top:100%;z-index:10;display:flex;flex-wrap:wrap;gap:8px;padding:12px;background:var(--br-surface);border:1px solid var(--br-border);border-radius:0 0 8px 8px;box-shadow:0 8px 20px #0003}.br-kartenoptionen:not([open]) .br-kartenoptionen-inhalt{display:none}.br-kennzahl .delta-gut,.br-kennzahl .delta-schlecht,.br-kennzahl .delta-neutral{white-space:normal;font-size:13px;line-height:1.4}

.br-hero>div{position:relative;height:100%;display:flex;flex-direction:column;justify-content:flex-end}.br-toolbar{position:absolute;z-index:2;top:24px;right:0;display:flex;align-items:center;justify-content:flex-end;gap:8px}.br-modus,.br-werkzeuge{flex-wrap:nowrap;margin:0;gap:5px}.br-toolbar button{display:inline-flex;align-items:center;justify-content:center;width:38px;min-width:38px;height:38px;min-height:38px;padding:0;border-radius:8px}.br-toolbar button svg{width:18px;height:18px}.br-toolbar button:disabled{cursor:default;opacity:.38}.br-hero-aktionen{display:flex;align-items:center;gap:5px}.br-hero-aktionen a{display:inline-flex;align-items:center;min-height:38px;padding:6px 10px;border:1px solid rgba(23,36,44,.24);border-radius:8px;background:rgba(255,255,255,.55);font-size:13px;text-decoration:none}.br-dokument:not([data-br-theme=light]) .br-hero-aktionen a{border-color:rgba(255,255,255,.5);background:rgba(0,0,0,.25)}.br-history-status{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}.br-speicher-status{margin-left:4px;font-size:13px;white-space:nowrap}.br-werkzeuge .br-speichern{width:38px!important;padding:0!important}
.br-massnahmen-feld small{display:block;margin-top:7px;color:var(--br-copy);font-weight:400;line-height:1.45}.br-app-katalog{margin-top:24px;padding-top:18px;border-top:1px solid var(--br-border)}.br-app-katalog>h2{font-size:1rem}.br-app-katalog [data-br-katalog-status]{min-height:1.4em;margin:4px 0 12px}.br-app-katalog section+section{margin-top:16px}.br-app-katalog h3{margin:14px 0 7px;color:var(--br-heading);font-size:.88rem}.br-app-katalog h4{margin:12px 0 6px;color:var(--br-copy);font-size:.8rem}.br-katalog-kapitel,.br-katalog-seite{border-top:1px solid var(--br-border)}.br-katalog-kapitel>summary,.br-katalog-seite>summary{min-height:40px;padding:8px 2px;cursor:pointer;color:var(--br-heading);font-weight:650}.br-katalog-seite{margin-left:10px}.br-katalog-badge{margin-left:auto;padding:2px 6px;border-radius:999px;background:var(--br-bg);font-size:10px;line-height:1.4}
.br-inhalt .br-widget :is(.sr-kpi-wert,.ck-donut-wert){display:block;color:var(--br-heading);font-size:2rem;font-weight:750;line-height:1.1}.br-inhalt .br-widget :is(.sr-kpi-label,.ck-label){display:block;margin-top:7px;font-size:.8rem;line-height:1.4}.br-inhalt .br-widget svg{display:block;width:100%;height:auto;max-width:100%}
.br-hero-aktionen a{width:38px;height:38px;padding:0;justify-content:center}.br-hero-aktionen a svg{width:18px;height:18px;flex-shrink:0}.br-app-katalog button[data-br-add]{display:flex;align-items:center;gap:7px;width:100%;margin:6px 0;padding:9px;text-align:left;font-size:13px;line-height:1.35}.br-app-katalog button[data-br-add]:disabled{opacity:.5}.br-widget .sr-bericht-quelle{font-size:11px;line-height:1.45;color:var(--br-copy)}
@media(pointer:coarse){.br-toolbar button,.br-hero-aktionen a,.br-werkzeuge .br-speichern{min-width:44px!important;width:44px!important;min-height:44px;height:44px}}
@media(max-width:780px){.br-toolbar{top:18px;right:0;max-width:100%;flex-wrap:wrap}.br-hero-aktionen{order:3;width:100%;justify-content:flex-end}.br-speicher-status{display:none}}

/* Schmale Schirme: die Werkzeugleiste steht sonst absolut ueber dem Titel und
   verdeckt ihn, sobald die Ueberschrift mehr als zwei Zeilen braucht
   (gemessen bei 390 px am Bericht „Sichtbarkeit, Keywords und KI-Praesenz").
   Unter 560 px laeuft sie deshalb im Fluss ueber der Ueberschrift mit. */
@media(max-width:560px){
  .br-hero{height:auto;min-height:0;padding-top:16px}
  .br-hero>div{display:block}
  .br-toolbar{position:static;flex-wrap:wrap;justify-content:flex-start;margin:0 0 14px}
  .br-hero-aktionen{order:0;width:auto}
}


/* ---- theme-background.css ---- */
/* Der radiale Farbraum liegt rechts unten. Hausfarbe und Projektfarbe kommen
   aus dem Seitenkopf; die Stärke bleibt die gespeicherte Mandantenvorgabe. */
:root{
  --theme-background-secondary:transparent;
  --theme-background-x1:79%;--theme-background-y1:74%;
  --theme-background-w1:39%;--theme-background-h1:42%;
  --theme-background-x2:21%;--theme-background-y2:26%;
  --theme-background-w2:39%;--theme-background-h2:42%;
  --theme-background-overlay:transparent;
  --sr-verlauf-alpha:.6;
  --sr-kopf-ton:var(--sr-bg);
  --theme-background-canvas:var(--sr-bg);
  --theme-background-kern:calc(var(--sr-verlauf-alpha) * 75%);
  --theme-background-saum:calc(var(--sr-verlauf-alpha) * 22%);
  --theme-background-verlauf:radial-gradient(ellipse var(--theme-background-w1,39%) var(--theme-background-h1,42%) at var(--theme-background-x1,79%) var(--theme-background-y1,74%),
    color-mix(in srgb,var(--theme-background-primary,#2563eb) var(--theme-background-kern),transparent) 0%,
    color-mix(in srgb,var(--theme-background-primary,#2563eb) var(--theme-background-saum),transparent) 28%,
    color-mix(in srgb,var(--theme-background-primary,#2563eb) calc(var(--sr-verlauf-alpha) * 5%),transparent) 52%,
    transparent 76%);
  --theme-background-verlauf-zwei:radial-gradient(ellipse var(--theme-background-w2,39%) var(--theme-background-h2,42%) at var(--theme-background-x2,21%) var(--theme-background-y2,26%),
    color-mix(in srgb,var(--theme-background-secondary,transparent) var(--theme-background-kern),transparent) 0%,
    color-mix(in srgb,var(--theme-background-secondary,transparent) var(--theme-background-saum),transparent) 28%,
    transparent 76%);
}
.theme-background{position:fixed;inset:0;z-index:0;pointer-events:none;opacity:0;
  transition:opacity var(--t-med) var(--ease);background:transparent;transform-origin:79% 74%}
.sr-app{position:relative;z-index:1;background:transparent}
html[data-hintergrund="statisch"] .theme-background,
html[data-hintergrund="animiert"] .theme-background{
  opacity:1;background:linear-gradient(var(--theme-background-overlay,transparent),var(--theme-background-overlay,transparent)),var(--theme-background-verlauf-zwei),var(--theme-background-verlauf),var(--theme-background-canvas)}
html[data-hintergrund="statisch"],html[data-hintergrund="animiert"]{
  --sr-kopf-ton:var(--theme-background-canvas)}
html[data-theme="light"]{
  --theme-background-canvas:#fff;
  --theme-background-kern:calc(var(--sr-verlauf-alpha) * 75%);
  --theme-background-saum:calc(var(--sr-verlauf-alpha) * 22%)}
html[data-theme="dark"]{
  --theme-background-canvas:var(--sr-bg);
  --theme-background-kern:calc(var(--sr-verlauf-alpha) * 52%);
  --theme-background-saum:calc(var(--sr-verlauf-alpha) * 19%)}
html[data-theme="medium"]{
  --theme-background-canvas:var(--sr-bg);
  --theme-background-kern:calc(var(--sr-verlauf-alpha) * 52%);
  --theme-background-saum:calc(var(--sr-verlauf-alpha) * 19%)}
html[data-hintergrund="animiert"] .theme-background{animation:theme-background-drift 30s ease-in-out infinite alternate}
html[data-hintergrund="animiert"][data-theme-background-hidden="true"] .theme-background{animation-play-state:paused}
.theme-background-fehler{margin-top:var(--s1);font-size:var(--fs-small);color:var(--sr-err-ink)}
@keyframes theme-background-drift{from{transform:scale(1) translate3d(0,0,0)}to{transform:scale(1.04) translate3d(-.6%,-.8%,0)}}
@media (prefers-reduced-motion:reduce){.theme-background{transition:none}html[data-hintergrund="animiert"] .theme-background{animation:none}}


/* ---- kommunikator-polish.css ---- */
/* Kommunikator-Intro: ruhiger Einstieg, danach kompakter Chat. */
/* ==== SCHATTEN (Betreiber-Befund 12.09.2026) =============================
   VIER TOEPFE STATT EINEM, weil vier verschiedene Dinge Schatten werfen und
   sie verschieden gross sein muessen:

     --km-schatten-leise    Kleinkram: Groessenschalter, Schwebe-Knoepfe,
                            Intro-Bild. Bleibt klein — ein 30er Knopf mit
                            60 Punkten Streuung sieht nach Fehler aus.
     --km-schatten-blase    Sprechblase und Chatzeilen der schwebenden Figur.
     --km-schatten-fenster  Gespraechsfenster und Eingabeleiste.
     --km-schatten-figur    Die freigestellte Figur selbst — als
                            `drop-shadow`, damit er der Silhouette folgt und
                            nicht dem Rechteck.

   JE THEMA EIGENE DECKKRAFT. Auf hellem Grund traegt ein blaeulich gebrochenes
   Schwarz mit niedriger Deckkraft; auf mittlerem und dunklem Grund verschwindet
   dasselbe Schwarz, dort steht reines Schwarz mit deutlich hoeherer Deckkraft.
   Eine einzige Angabe fuer alle drei war entweder im Dunklen unsichtbar oder
   im Hellen schmutzig.

   --km-schatten-panel bleibt als Name bestehen (aeltere Regeln greifen darauf
   zu) und zeigt auf denselben Wert wie --km-schatten-fenster.

   JEDER TOPF STEHT IN ALLEN DREI THEME-BLOECKEN, keiner nur als Vorgabe
   daneben — so verlangt es scripts/css-pruefen.js (Punkt 4), und zwar aus
   Erfahrung: ein Token, der in zwei von drei Themes gepflegt ist, faellt im
   dritten still aus. Die Anwendung setzt `data-theme` immer (layout.js, ohne
   Anmeldung „light"). */
.km{--km-schatten-panel:var(--km-schatten-fenster)}
[data-theme="light"] .km{
  --km-schatten-leise:0 5px 16px rgba(18,27,43,.14),0 1px 3px rgba(18,27,43,.09);
  --km-schatten-blase:0 10px 28px rgba(18,27,43,.16),0 2px 6px rgba(18,27,43,.10);
  --km-schatten-fenster:0 26px 64px rgba(18,27,43,.22),0 6px 16px rgba(18,27,43,.12);
  --km-schatten-figur:drop-shadow(0 18px 24px rgba(18,27,43,.30)) drop-shadow(0 3px 5px rgba(18,27,43,.16));
  --km-schatten-karte:0 16px 48px rgba(10,12,15,.35),0 0 0 7px color-mix(in oklab,var(--sr-surface) 52%,transparent)}
[data-theme="medium"] .km{
  --km-schatten-leise:0 5px 16px rgba(0,0,0,.30),0 1px 3px rgba(0,0,0,.22);
  --km-schatten-blase:0 10px 28px rgba(0,0,0,.34),0 2px 6px rgba(0,0,0,.22);
  --km-schatten-fenster:0 26px 64px rgba(0,0,0,.46),0 6px 16px rgba(0,0,0,.28);
  --km-schatten-figur:drop-shadow(0 18px 24px rgba(0,0,0,.48)) drop-shadow(0 3px 5px rgba(0,0,0,.30));
  --km-schatten-karte:0 16px 48px rgba(0,0,0,.55),0 0 0 7px color-mix(in oklab,var(--sr-surface) 52%,transparent)}
[data-theme="dark"] .km{
  --km-schatten-leise:0 5px 16px rgba(0,0,0,.38),0 1px 3px rgba(0,0,0,.26);
  --km-schatten-blase:0 10px 28px rgba(0,0,0,.42),0 2px 6px rgba(0,0,0,.26);
  --km-schatten-fenster:0 26px 64px rgba(0,0,0,.56),0 6px 16px rgba(0,0,0,.34);
  --km-schatten-figur:drop-shadow(0 18px 24px rgba(0,0,0,.58)) drop-shadow(0 3px 5px rgba(0,0,0,.34));
  --km-schatten-karte:0 16px 48px rgba(0,0,0,.60),0 0 0 7px color-mix(in oklab,var(--sr-surface) 52%,transparent)}
.km-panel{width:min(500px,calc(100vw - 2*var(--s4)));max-height:min(74vh,700px);box-shadow:var(--km-schatten-fenster)}
/* ==== DREI GROESSEN, EIN GEFAELLE (Betreiber-Auftrag 12.09.2026) ==========
   „Gross" ist keine groessere Kopfzeile, sondern eine GESPRAECHSFLAECHE: das
   Fenster bekommt eine feste Hoehe (nicht nur eine Obergrenze), damit der
   Verlauf den Platz auch dann hat, wenn erst zwei Zeilen darin stehen. Mit
   `max-height` allein waere das Fenster so hoch wie sein Inhalt — der Verlauf
   bliebe bei seiner Mindesthoehe, und „Gross" hiesse nur „breiter".
   Klein bleibt, was es ist: Kopf, Einstieg, Verlauf, Eingabe und Fuss muessen
   dort vollstaendig ins Fenster passen. */
.km--chat-klein .km-panel{width:min(360px,calc(100vw - 2*var(--s4)));max-height:min(62vh,540px)}
.km--chat-mittel .km-panel{width:min(500px,calc(100vw - 2*var(--s4)));max-height:min(74vh,700px)}
.km--chat-gross .km-panel{width:min(720px,calc(100vw - 2*var(--s4)));height:min(88vh,960px);max-height:min(88vh,960px)}
.km--offen .km-figur{display:none}
.km-panel-kopf,.km-form,.km-panel-fuss{flex-shrink:0}
.km-panel-kopf{flex-wrap:wrap}
.km-panel-kopf>a.sr-ikon-knopf{text-decoration:none}
.km-verlauf{min-height:96px}
.km-intro{display:flex;flex:none;gap:var(--s3);padding:var(--s3);min-height:0;overflow-y:auto;background:var(--sr-soft);border-bottom:1px solid var(--sr-hair)}
/* DER EINSTIEG IST EINE ZEILE, KEINE BILDTAFEL (Betreiber-Auftrag
   12.09.2026). Das 230x210-Oberkoerperbild ist ersatzlos weg; an seiner
   Stelle steht der Kopf-Ausschnitt als runder Avatar, und Bereichsname,
   Ueberschrift, Satz und Beispielfragen ruecken kompakt daneben. Die Groesse
   folgt der Dialoggroesse: 96 Punkte bei Gross, 72 bei Mittel, 48 bei Klein —
   doppelt so gross wie der bisherige Klein-Avatar, so weit es der Kasten
   traegt. */
.km-intro-avatar{display:block;width:72px;height:72px;flex:none;align-self:flex-start;
  object-fit:cover;object-position:center;border-radius:50%;border:1px solid var(--sr-hair);
  background:var(--sr-surface);box-shadow:var(--km-schatten-leise)}
.km--chat-gross .km-intro-avatar{width:96px;height:96px}
.km-intro-inhalt{min-width:0;display:flex;flex-direction:column;gap:var(--s1)}
.km-intro-kapitel{font-size:var(--fs-label);font-weight:var(--fw-ui);letter-spacing:.08em;text-transform:uppercase;color:var(--sr-acc-ink)}
.km-intro h2{margin:0;font-size:var(--fs-h2);line-height:1.15;color:var(--sr-ink)}
.km-intro p{margin:0;color:var(--sr-mut);font-size:var(--fs-small);line-height:1.45}
.km-beispielfragen{display:flex;flex-wrap:wrap;gap:var(--s1);margin-top:var(--s1)}
.km-beispielfrage{border:2px solid var(--sr-hair);border-radius:var(--sr-r-pill);padding:var(--s1) var(--s2);background:var(--sr-surface);font:inherit;font-size:var(--fs-label);color:var(--sr-ink);cursor:pointer;text-align:left}
.km-beispielfrage:hover{border-color:var(--sr-acc-line);color:var(--sr-acc-ink)}
.km-beispielfrage:focus-visible{outline:2px solid var(--focus-ton);outline-offset:2px}
.km-figur-bild{filter:drop-shadow(0 7px 9px rgba(18,27,43,.22))}
/* ---- FESTE FIGUR: KREIS MIT WEICHER KANTE (Betreiber-Entscheid 12.09.2026)
   Die feste Figur steht in einer Scheibe in Flaechenfarbe und liegt ueber dem
   Inhalt — klein wie gross, im Gespraech wie davor. Die kleine Fassung war von
   Anfang an rund (72 Punkte, sr-bausteine.css); die grosse war ein Rechteck
   mit Kartenradius und endete an einer harten Kante mitten auf der Kachel
   darunter.

   ZWEI TEILE MACHEN DIE WEICHE KANTE: der Rundung folgt der Schatten von
   selbst, und der letzte Anteil von --km-schatten-karte legt einen breiten,
   halbdurchsichtigen Ring in Flaechenfarbe darum. Er ist kein Strich: 1 Punkt
   Kontur waere genau das, was hier nicht sein soll.

   WAS DER KREIS ABSCHNEIDET, ist am Alphakanal des Materials ausgerechnet
   (Satz v14, Standbilder und je sechs Frames der Gesten). Der eingeschriebene
   Kreis nimmt vom Oberkoerper-Ausschnitt 5,1–7,3 % der deckenden Punkte —
   Schulter und Arm — und vom Kopf-Ausschnitt 3,1–9,2 %. KEIN EINZIGER PUNKT
   DES KOPFES liegt draussen: der aeusserste Kopfpunkt sitzt bei Radius 0,468
   (Oberkoerper) bzw. 0,495 (Kopf) von 0,5. Deshalb bleibt es bei
   `object-fit:cover` und `object-position:center` — jede Verschiebung wuerde
   diesen Abstand verkleinern und zugleich den Kopfanker der Sprechblase
   verstellen (scripts/proben/kommunikator-anker-browser.js rechnet ihn aus
   genau diesen beiden Eigenschaften). Die zeigende Hand darf am Kreisrand
   enden; gemessen ist sie bei Radius 0,546 und wird beschnitten. */
.km--gross:not(.km--schwebend) .km-figur{box-shadow:var(--km-schatten-karte)}
/* BEWEGTBILD (Materialsatz v14, 12.09.2026). Die vier Videos liegen
   deckungsgleich ueber dem Standbild — dieselbe Kastengroesse, dieselbe
   Passung, derselbe Radius (`inherit` holt ihn vom Knopf, der ihn in jedem
   Modus schon traegt). Sichtbar werden sie erst, wenn kommunikator-figur.js
   einen dekodierten Frame UND einen gemischten Alphakanal gesehen hat; bis
   dahin und bei reduzierter Bewegung steht das Standbild darunter. Der
   Uebergang ist eine Blende, kein Schnitt: zwischen Ruheschleife und Geste
   liegen verschiedene Koerperhaltungen.

   Die drei Gesten (Zeigen, Winken, Denken) stehen im Markup NACH der
   Ruheschleife und liegen damit ohne eigene Stapelangabe darueber; sichtbar
   ist immer hoechstens eine — das haelt kommunikator-figur.js. */
.km-figur-video{position:absolute;inset:0;display:block;width:100%;height:100%;
  border-radius:inherit;object-fit:cover;object-position:center;
  filter:drop-shadow(0 7px 9px rgba(18,27,43,.22));
  opacity:0;pointer-events:none;transition:opacity var(--t-med) var(--ease)}
.km-figur-video[data-km-bereit]{opacity:1}
/* Laeuft die Ruheschleife, verschwindet das Standbild darunter. Das Video
   traegt Alpha: an jeder halbdurchsichtigen Kante mischt sich sonst das
   Standbild dazu (dunkler Saum), und weicht die Passform ab, steht neben dem
   Video eine zweite Figur. Nur Deckkraft, kein display: das Standbild
   bleibt das Mass fuer Kasten und Kopfanker. */
.km-figur-bild{transition:opacity var(--t-med) var(--ease)}
.km-figur:has(> .km-figur-video[data-km-video="ruhe"][data-km-bereit]) .km-figur-bild{opacity:0}
.km-figur-video--geste[data-km-spielt]{opacity:1}
/* WAEHREND EINER GESTE IST SIE DAS EINZIGE SICHTBARE MEDIUM (Betreiber-Befund
   12.09.2026). Bis hierher lief die Ruheschleife unter der Geste weiter und
   blieb dabei voll deckend: die Gesten tragen einen Alphakanal, also schien
   sie durch. Die Takes sind verschieden gerahmt — die zeigende Figur lehnt
   sich zur Seite —, deshalb stand ueber dem zeigenden Oberkoerper oben rechts
   ein zweiter Kopf. Dieselbe Regel gilt fuer das Standbild: es traegt die
   Geste sonst als zweite Silhouette mit, wenn der Alphakanal noch nicht
   gemessen ist und die Ruheschleife deshalb kein `data-km-bereit` hat.

   BLENDE, KEIN SCHNITT. Zwischen Ruhehaltung und Geste liegt ein
   Haltungswechsel; die 200 ms aus --t-med (geerbt vom Grundsatz oben) decken
   ihn ab. Ein harter Schnitt liesse die Figur springen. Waehrend der Blende
   sind zwei Medien zu sehen, ihre Deckkraft summiert sich auf eins — ein Loch
   entsteht nicht: kommunikator-figur.js setzt `data-km-spielt` erst, wenn ein
   Frame der Geste steht.

   KINDSELEKTOR. Die Regel gilt der Figur, in der die Geste laeuft. Die
   Livevorschau in Verwaltung -> Intelligenz -> Kommunikator klont weitere
   Figuren in dieselbe Seite; deren Ruheschleifen gehen das nichts an. */
.km-figur:has(> .km-figur-video--geste[data-km-spielt]) > .km-figur-video[data-km-video="ruhe"],
.km-figur:has(> .km-figur-video--geste[data-km-spielt]) > .km-figur-bild{opacity:0}
.km-blase,.km-nachricht{box-shadow:var(--km-schatten-leise)}
.km-eingabe{min-height:42px;font-size:14px;line-height:1.45}
.km-form{flex-wrap:wrap}
.km-form .km-eingabe{flex:1 1 100%;width:100%}
.km-form .km-mikrofon{margin-left:auto}
.km-form .knopf{min-height:34px;padding:6px 11px}
.km-panel-titel{row-gap:1px}
.km-intro{transition:max-height var(--t-med) var(--ease),padding var(--t-med) var(--ease),gap var(--t-med) var(--ease)}
.km--gespraech .km-intro{max-height:48px;padding:var(--s1) var(--s3);gap:var(--s2);overflow:hidden}
.km--gespraech .km-intro-avatar{width:34px;height:34px;align-self:center}
.km--gespraech .km-intro-inhalt{display:block}
.km--gespraech .km-intro h2,.km--gespraech .km-intro p,.km--gespraech .km-beispielfragen{display:none}

/* ==== DIALOGGROESSE „KLEIN" (Betreiber-Befund 12.09.2026) ================
   Klein ist 360 Punkte breit. Darin standen bis hierher dieselben Bauteile
   wie bei Gross: ein 230er Oberkoerper-Kasten, der Titel neben dem
   Groessenschalter und zwei Ikonknoepfen. Was uebrig blieb, war eine rund
   hundert Punkte schmale Saeule — der Kopftext brach Wort fuer Wort um, die
   Themenueberschrift stand hochkant.

   DREI SCHNITTE, ALLE NUR BEI KLEIN:
     1. Der Groessenschalter faellt in eine eigene Zeile (die Kopfzeile ist
        ohnehin umbruchfaehig). Damit hat der Titel die volle Breite neben
        Avatar und Ikonknoepfen.
        Dazu gehoert `flex-basis:0`: eine umbruchfaehige Flex-Zeile SCHRUMPFT
        ihre Kinder NICHT, sie bricht sie um. Mit `flex:1 1 auto` ging der
        Titel deshalb mit seiner Inhaltsbreite (288 Punkte) in die Rechnung,
        passte neben Avatar und zwei Ikonknoepfen nicht mehr in die 334
        Punkte des Kopfes — und Avatar, Titel, Schliessen und Schalter
        standen in VIER Zeilen uebereinander (Kopf 199 statt 110 Punkte
        hoch). Damit lief der Inhalt des Fensters 80 Punkte ueber dessen
        Hoechsthoehe, und `overflow:hidden` schnitt unten die Eingabezeile
        weg. Mit `flex-basis:0` startet der Titel bei null und waechst in
        den Rest der Zeile: kein Umbruch, keine vierte Zeile.
     2. Die Zusatzzeile im Titel bleibt einzeilig und kuerzt notfalls mit
        Auslassungspunkten — zusammen mit dem Namen darueber sind das zwei
        Zeilen, nie mehr.
     3. Statt des Oberkoerper-Kastens steht der Kopf-Ausschnitt als
        48-Punkte-Avatar; die Themenspalte bekommt eine Mindestbreite.
        Beide Bilder liegen im Markup (assistent.js), hier wird eines
        gezeigt: die Groesse wird zur Laufzeit umgeschaltet. */
.km--chat-klein .km-panel-titel{flex:1 1 0;min-width:0}
.km--chat-klein .km-panel-sub{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* DER EINSTIEG GIBT NACH, NICHT DIE EINGABEZEILE. Eingabezeile und Fusszeile
   schrumpfen nicht (Zeile 53), der Verlauf hat eine Mindesthoehe — waechst der
   Einstieg (langer Bereichsname), lief bisher unten etwas aus dem Fenster und
   `overflow:hidden` schnitt es weg. Mit `min-height:0` darf der Einstieg
   schrumpfen und rollt dann in sich; sichtbar bleibt alles. */
.km--chat-klein .km-intro{gap:var(--s3);padding:var(--s3);min-height:0;overflow-y:auto}
.km--chat-klein .km-intro-avatar{width:48px;height:48px}
.km--chat-klein .km-intro-inhalt{min-width:180px}
.km--chat-klein .km-intro h2{font-size:var(--fs-ui)}

/* Die frei positionierte Variante bleibt eine Figur mit Sprechblasen. Das
   Client-Skript setzt linke und obere Viewport-Koordinaten. */
.km{z-index:2147483000}
.km[popover]{margin:0;border:0;overflow:visible;background:transparent;color:inherit;padding:0;max-width:none;max-height:none}
.km::backdrop{display:none}
.km--schwebend{transition:none!important;right:var(--s4);bottom:var(--s4);display:block;width:max-content;background:transparent;box-shadow:none;pointer-events:none}
.km--schwebend .km-figur{grid-area:figur;align-self:end;display:block!important;min-width:0;min-height:0;padding:0;overflow:visible;border:0;border-radius:0;background:transparent;box-shadow:none;cursor:grab;touch-action:none}
.km--schwebend .km-figur:hover{transform:none}
.km--schwebend .km-figur-bild,.km--schwebend .km-figur-video{display:block;border-radius:0;object-fit:contain;object-position:center bottom;filter:var(--km-schatten-figur)}
.km--schwebend .km-figur-puls{inset:12% 3% 2%;border-radius:45%}
.km--schwebend.km--klein .km-figur,.km--schwebend.km--klein .km-figur-bild{width:96px;height:140px}
.km--schwebend.km--gross .km-figur,.km--schwebend.km--gross .km-figur-bild{width:170px;height:240px}
.km--wird-gezogen,.km--wird-gezogen .km-figur{cursor:grabbing;user-select:none}
/* KOPF-ANKER DER FREIGESTELLTEN FIGUR. Dieselben Werte wie in
   sr-bausteine.css, hier fuer den Ganzkoerper-Ausschnitt des Satzes
   (274x498): Kopf bei x 29,86…67,00 % / y 2,41…23,09 % (Blick links) bzw.
   x 26,36…63,23 % / y 2,51…24,89 % (Blick rechts), gemittelt. Seit dem
   12.09.2026 geht davon nur die Hoehe in die Lage der Blase ein — waagerecht
   haengen Blase und Fenster an der Kastenkante (kommunikator-position.js).
   Das Bild steht
   mit `object-fit:contain` unten im Kasten, ist also immer hoehenbegrenzt —
   dargestellte Breite = 0,5502 × Kastenhoehe, mittig.

   DER RAHMEN IST SEIT v13 BREITER (240 → 274 Punkte) und bleibt es in v14,
   die Figur darin gleich
   hoch: er muss von der linken Standkante bis zur nach rechts
   ausgestreckten Zeigehand reichen, damit alle sechs Takes denselben
   Kopfanker haben. Was dazugekommen ist, ist durchsichtig — die Figur wird
   dadurch nicht kleiner, ihr Kopf rueckt aber im Kasten nach innen. Deshalb
   sind diese Werte andere als im Satz v12.

   Die Blase selbst setzt kommunikator-position.js in Fensterkoordinaten —
   sie liest genau diese Eigenschaften aus. */
.km--schwebend{--km-figur-b:96px;--km-kopf-y:19px;--km-spitze:24px}
.km--schwebend.km--gross{--km-figur-b:170px;--km-kopf-y:32px}
.km--schwebend .km-blase{position:fixed;grid-area:blase;align-self:end;width:min(260px,calc(100vw - 120px));margin:0;padding:10px 12px;border-radius:14px;box-shadow:var(--km-schatten-blase)}
.km--schwebend .km-blase::after{left:auto;right:-7px;bottom:calc(var(--km-spitze) - 6px);width:12px;height:12px;border:0;border-right:1px solid var(--sr-hair);border-top:1px solid var(--sr-hair)}
/* Rechts vom Kopf steht die Blase, wenn links kein Platz mehr ist; dann
   zeigt die Spitze nach links. Die Klasse setzt kommunikator-position.js. */
.km--schwebend .km-blase--spitze-links::after{right:auto;left:-7px;border:0;border-left:1px solid var(--sr-hair);border-bottom:1px solid var(--sr-hair)}
.km--schwebend .km-blase-text{font-size:var(--fs-small);line-height:1.4}
/* ZWEI KNOEPFE UNTEREINANDER, RECHTS NEBEN DEM KOPF (Betreiber-Befund
   11.09.2026). Vorher standen sie nebeneinander und lagen damit ueber dem
   Kopf der Figur. `right:0` ist die rechte Kante des Figurkastens und liegt
   in jeder Groesse rechts des Kopfes; der obere Rand haengt
   an der Kopfmitte, faellt aber nie hinter den Kastenrand zurueck — zwei
   gestapelte Knoepfe sind hoeher als der Kopf der kleinen Fassung. */
.km-schwebe-kontrollen{position:absolute;right:0;bottom:auto;top:max(2px,calc(var(--km-kopf-y) - 31px));grid-area:figur;align-self:end;justify-self:end;z-index:2;display:flex;flex-direction:column;gap:3px;margin:0;opacity:0;pointer-events:none;transition:opacity var(--t-fast) var(--ease)}
.km--schwebend:hover .km-schwebe-kontrollen,.km--schwebend:focus-within .km-schwebe-kontrollen,.km--schwebend.km--offen .km-schwebe-kontrollen{opacity:1;pointer-events:auto}
.km-schwebe-kontrollen .sr-ikon-knopf{width:30px;height:30px;min-width:30px;padding:6px;border:1px solid color-mix(in oklab,var(--sr-hair) 78%,transparent);background:color-mix(in oklab,var(--sr-surface) 90%,transparent);box-shadow:var(--km-schatten-leise);text-decoration:none}
.km-schwebe-kontrollen svg,.km-mikrofon svg{width:16px;height:16px;display:block}
.km--schwebend:not(.km--offen) [data-km-zu]{display:none}
.km--schwebend.km--offen [data-km-position-reset]{display:none}
.km-schwebe-panel{position:fixed;grid-area:panel;align-self:end;width:min(460px,calc(100vw - 120px));max-height:min(68vh,620px);overflow:visible;border:0;background:transparent;box-shadow:none}
.km--schwebend.km--chat-klein .km-schwebe-panel{width:min(340px,calc(100vw - 120px));max-height:min(54vh,440px)}
.km--schwebend.km--chat-mittel .km-schwebe-panel{width:min(460px,calc(100vw - 120px));max-height:min(68vh,620px)}
.km--schwebend.km--chat-gross .km-schwebe-panel{width:min(640px,calc(100vw - 120px));height:min(82dvh,760px);max-height:min(82dvh,760px);overflow:hidden;background:var(--sr-surface);border:1px solid var(--sr-hair);box-shadow:var(--km-schatten-fenster)}
.km--schwebend .km-verlauf{min-height:0;max-height:min(38vh,280px);padding:8px 10px 10px;background:transparent;gap:6px;scrollbar-width:thin}
.km-verlauf>.km-nachricht:first-child{margin-top:auto}
.km--schwebend.km--chat-klein .km-verlauf{max-height:min(30vh,210px)}
.km--schwebend.km--chat-mittel .km-verlauf{max-height:min(45vh,390px)}
.km--schwebend.km--chat-gross .km-verlauf{flex:1 1 0;max-height:none;padding:var(--s3)}
.km--schwebend .km-nachricht{max-width:min(92%,560px);padding:10px 13px;border-radius:15px;box-shadow:var(--km-schatten-blase)}
.km--schwebend .km-nachricht--assistent{border-bottom-right-radius:4px;background:var(--sr-surface)}
.km--schwebend .km-nachricht--nutzer{border-bottom-left-radius:4px}
.km-nachricht--nutzer p{color:inherit}
.km--schwebend .km-form{padding:7px;border:1px solid var(--sr-hair);border-radius:16px;background:var(--sr-surface);box-shadow:var(--km-schatten-fenster);align-items:center;flex-wrap:wrap}
.km--schwebend.km--chat-gross .km-form{border:0;border-top:1px solid var(--sr-hair);border-radius:0;box-shadow:none}
.km--schwebend.km--gross.km--offen .km-figur{margin-bottom:0}
.km--schwebend .km-eingabe{min-height:40px;max-height:112px;padding:8px 10px;border:0;background:transparent;font-size:14px;line-height:1.45}
.km.km--chat-klein .km-eingabe{min-height:40px;max-height:64px;resize:none}
.km.km--chat-mittel .km-eingabe{min-height:64px;max-height:160px;resize:vertical}
.km.km--chat-gross .km-eingabe{min-height:88px;max-height:240px;resize:vertical}
.km--schwebend .km-eingabe:focus-visible{outline:0}
.km--schwebend .km-mikrofon{width:34px;height:34px;min-width:34px;padding:8px;flex:none}
.km--schwebend .km-form .knopf{min-height:34px;padding:6px 11px}
.km-sprachstatus{flex-basis:100%;font-size:11px;line-height:1.35;color:var(--sr-mut)}
.km--hoert-zu [data-km-mikrofon]{color:var(--red);box-shadow:0 0 0 2px var(--red)}
/* Seit dem Materialsatz v12 ist der Ausschnitt im Material geschnitten:
   Standbild und Video sind quadratisch und zeigen Kopf und Rumpf. Ein
   Versatz in `object-position` verschoebe nichts mehr (Bild und Kasten haben
   dasselbe Seitenverhaeltnis) und wuerde nur die Anker-Rechnung verdunkeln. */
.km--gross:not(.km--schwebend) .km-panel-avatar{width:44px;height:44px;border-radius:var(--sr-r-ctl);object-position:center}
.km--gross:not(.km--schwebend) .km-figur,.km--gross:not(.km--schwebend) .km-figur-bild{width:196px;height:196px;border-radius:50%}
.km--gross:not(.km--schwebend) .km-figur-bild{object-fit:cover;object-position:center}
.km--gross:not(.km--schwebend) .km-figur-puls{border-radius:50%}

/* ==== EIN MARKUP, ZWEI DARSTELLUNGEN (Umbau 12.09.2026) ==================
   Die Ansicht liefert seit heute EIN Markup (app/views/assistent.js
   figurHtml) — vorher zwei, eines je Darstellung. Der Grund steht im
   Optionsfenster: dort laesst sich „Schwebend" umlegen, und die Wirkung soll
   sofort an der Figur stehen. Mit zwei Markups hiesse das, das halbe
   Gespraechsfenster im Browser neu zu bauen und dabei Verlauf, Eingabe und
   alle Horcher zu verlieren.

   Die Unterschiede sind deshalb hier, wo sie hingehoeren:
     - Die Schwebe-Knoepfe (Position zuruecksetzen, Zahnrad, Schliessen)
       stehen in beiden Faellen im Markup; fest sind sie aus.
     - Das schwebende Fenster hat keine Fensterrahmung: Kopfzeile, Einstieg
       und Fusszeile fallen weg. Klein und Mittel zeigen Sprechblasen;
       Gross bietet eine durchgehende Gespraechsflaeche. */
.km:not(.km--schwebend) .km-schwebe-kontrollen{display:none}
.km--schwebend .km-intro,.km--schwebend .km-panel-fuss{display:none}
.km--schwebend .km-panel-kopf{padding:0;border:0;background:transparent;justify-content:flex-end;flex-wrap:nowrap}
.km--schwebend .km-panel-avatar,
.km--schwebend .km-panel-titel,
.km--schwebend .km-panel-kopf .sr-ikon-knopf{display:none}
/* Das Mikrofon sass bisher nur in der schwebenden Eingabeleiste; es steht
   jetzt in beiden — dieselbe Groesse wie dort. */
.km-mikrofon{width:34px;height:34px;min-width:34px;padding:8px;flex:none}
@media (max-width:559px){
  .km{
    bottom:calc(var(--s2) + env(safe-area-inset-bottom,0px));
  }
  .km--rechts{right:env(safe-area-inset-right,0px);left:auto}
  .km--links{left:env(safe-area-inset-left,0px);right:auto}
  .km-eingabe{font-size:16px}
  .km--rechts.km--offen .km-panel{margin-right:var(--s2)}
  .km--links.km--offen .km-panel{margin-left:var(--s2)}
  .km:not(.km--offen) .km-figur,
  .km:not(.km--offen) .km-figur-bild{
    width:44px;
    height:52px;
  }
  .km:not(.km--offen) .km-figur{
    min-width:44px;
    min-height:52px;
    overflow:hidden;
    touch-action:manipulation;
  }
  .km--rechts:not(.km--offen) .km-figur,
  .km--rechts:not(.km--offen) .km-figur-bild{
    border-radius:24px 0 0 24px;
  }
  .km--links:not(.km--offen) .km-figur,
  .km--links:not(.km--offen) .km-figur-bild{
    border-radius:0 24px 24px 0;
  }
  .km:not(.km--offen) .km-figur-bild,.km:not(.km--offen) .km-figur-video{object-fit:cover}
  .km:not(.km--offen) .km-figur:focus-visible{
    outline:3px solid var(--focus-ton);
    outline-offset:-4px;
  }
  .km-panel{
    width:calc(100vw - 2 * var(--s2) - env(safe-area-inset-left,0px) - env(safe-area-inset-right,0px));
    max-height:min(78dvh,calc(100dvh - 2 * var(--s2) - env(safe-area-inset-top,0px) - env(safe-area-inset-bottom,0px)));
  }
  .km--chat-klein .km-panel{width:min(330px,calc(100vw - 2 * var(--s2)));max-height:min(54dvh,460px)}
  .km--chat-mittel .km-panel{max-height:min(72dvh,620px)}
  .km--chat-gross .km-panel{height:auto;max-height:min(88dvh,760px)}
  .km-intro{gap:var(--s2);padding:var(--s2)}
  .km-intro h2{font-size:var(--fs-ui)}
  .km-beispielfrage{width:100%}
  .km--schwebend.km--klein .km-figur,.km--schwebend.km--klein .km-figur-bild{width:74px;height:108px;border-radius:0}
  .km--schwebend.km--gross .km-figur,.km--schwebend.km--gross .km-figur-bild{width:112px;height:158px;border-radius:0}
  .km--schwebend{--km-figur-b:74px;--km-kopf-y:14px}
  .km--schwebend.km--gross{--km-figur-b:112px;--km-kopf-y:21px}
  .km--schwebend .km-blase,.km-schwebe-panel{width:min(300px,calc(100vw - 88px));margin-right:0}
  .km-schwebe-panel{max-width:100%}
  .km--schwebend.km--gross .km-blase,.km--schwebend.km--gross .km-schwebe-panel{width:min(270px,calc(100vw - 126px))}
  .km--schwebend.km--chat-klein .km-schwebe-panel{width:min(240px,calc(100vw - 88px));max-height:min(48dvh,390px)}
  .km--schwebend.km--chat-mittel .km-schwebe-panel{width:min(300px,calc(100vw - 88px));max-height:min(66dvh,560px)}
  .km--schwebend.km--chat-gross .km-schwebe-panel{width:min(330px,calc(100vw - 88px));max-height:min(84dvh,700px)}
  .km--schwebend.km--gross.km--chat-klein .km-schwebe-panel{width:min(230px,calc(100vw - 126px))}
  .km--schwebend.km--gross.km--chat-mittel .km-schwebe-panel{width:min(270px,calc(100vw - 126px))}
  .km--schwebend.km--gross.km--chat-gross .km-schwebe-panel{width:min(300px,calc(100vw - 126px))}
  .km--schwebend.km--offen.km--chat-mittel .km-schwebe-panel{max-height:min(52dvh,390px)}
  .km--schwebend.km--offen.km--chat-gross .km-schwebe-panel{height:min(62dvh,460px);max-height:min(62dvh,460px)}
  .km--schwebend:not(.km--offen) .km-figur-bild,.km--schwebend:not(.km--offen) .km-figur-video{object-fit:contain}
  .km--schwebend:not(.km--offen) .km-figur{overflow:visible;touch-action:none}
  /* Schmales Fenster: der Kasten ist nur 74 Punkte breit, rechts vom Kopf
     bleiben 23 — deshalb hier 26er Knoepfe statt 30er. */
  .km--schwebend .km-schwebe-kontrollen .sr-ikon-knopf{width:26px;height:26px;min-width:26px;padding:5px}
  .km--schwebend .km-schwebe-kontrollen{top:max(2px,calc(var(--km-kopf-y) - 27px))}
  .km--schwebend .km-eingabe{flex-basis:100%;width:100%;font-size:16px}
  .km--schwebend .km-form .knopf{flex:1 1 auto}
  .km--gross:not(.km--schwebend):not(.km--offen) .km-figur,.km--gross:not(.km--schwebend):not(.km--offen) .km-figur-bild{width:132px;height:132px;border-radius:50%}
}
@media (prefers-reduced-motion:reduce){.km-beispielfrage,.km-intro,.km-schwebe-kontrollen{transition:none}.km--schwebend{scroll-behavior:auto}
  /* Doppelter Riegel: das Skript startet hier ohnehin kein Video (und laedt
     wegen preload="none" auch keines). Bleibt eines stehen, weil jemand die
     Einstellung waehrend der Sitzung umstellt, ist es hier trotzdem weg. */
  .km-figur-video,.km--schwebend .km-figur-video{display:none}}


/* ---- kommunikator-skills.css ---- */
.kms-form{display:block;max-width:780px;margin-top:var(--s5)}
.kms-liste{min-width:0;margin:0 0 var(--s5);padding:0;border:0}
.kms-modul{min-width:0;padding:20px 0;border-top:1px solid var(--sr-hair)}
.kms-modul:first-child{padding-top:0;border-top:0}
.kms-wahl{display:block;min-width:0}
.kms-titel{display:flex;align-items:center;gap:10px;min-width:0}
.kms-titel strong{font-size:var(--fs-body)}
.kms-beschreibung{display:block;margin:4px 0 0 26px;color:var(--sr-mut);line-height:1.5}
.kms-modul>p{margin:var(--s2) 0;color:var(--sr-mut)}
.kms-modul details{margin-top:var(--s2)}
.kms-modul summary{cursor:pointer;font-weight:650}
.kms-details-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s4);padding-top:var(--s3)}
.kms-details-grid h3{margin:0 0 var(--s2);font-size:var(--fs-small)}
.kms-details-grid ul{margin:0;padding-left:1.2rem}
.kms-weiter{margin-top:12px}
@media(max-width:620px){.kms-details-grid{grid-template-columns:1fr;gap:var(--s3)}.kms-form{max-width:100%}}


/* ---- kommunikator-stimme.css ---- */
/* Stimme des Kommunikators — sichtbare Zustaende und das Optionsfeld
   (12.09.2026, app/views/kommunikator-stimme.js und
   app/views/kommunikator-stimme-abschnitt.js).

   WARUM EINE EIGENE DATEI. Der Sprech- und der Hoer-Zustand gehoeren zur
   Stimme, nicht zum uebrigen Auftritt der Figur (kommunikator-polish.css)
   und nicht zu den Bausteinen (sr-bausteine.css). Sie steht als letzter
   Teil des app.css-Buendels und gewinnt damit bei gleicher Spezifitaet —
   sie muss gegen nichts gewinnen, benutzt aber dieselben Tokens.

   ZWEI ZUSTAENDE, ZWEI ANZEIGEN. Der Pulsring ist bereits da (.km-figur-puls,
   sr-bausteine.css) und laeuft beim Denken; beim Sprechen laeuft er im
   ruhigeren Takt und in der Akzentfarbe des Gespraechs — so ist „ich denke"
   von „ich rede" unterscheidbar, ohne ein zweites Element. Das Zuhoeren
   bleibt am Mikrofonknopf, wo der Nutzer es erwartet, und bekommt zusaetzlich
   einen Punkt in der Statuszeile: ein Mikrofon, das offen ist, muss man sehen
   koennen, ohne die Figur im Blick zu haben. */

.km--spricht .km-figur-puls{animation:km-puls 2.1s ease-out infinite;border-color:var(--sr-acc)}
.km--spricht .km-figur{box-shadow:var(--sr-e-modal),0 0 0 2px var(--sr-acc-line)}

/* Ein offenes Mikrofon ohne sichtbaren Hinweis gibt es nicht: der Punkt
   blinkt, solange aufgenommen wird, und verschwindet mit der Aufnahme. */
.km-hoer-punkt{display:none;width:8px;height:8px;margin-right:6px;border-radius:50%;background:var(--red);vertical-align:middle}
.km--hoert-zu .km-hoer-punkt{display:inline-block;animation:km-hoer-blinken 1.1s ease-in-out infinite}
.km--hoert-zu .km-sprachstatus{color:var(--sr-ink)}
@keyframes km-hoer-blinken{0%,100%{opacity:1}50%{opacity:.25}}

/* Gespraechsmodus: der Schalter bleibt gedrueckt sichtbar, damit niemand
   raetselt, warum das Mikrofon nach jeder Antwort von selbst aufgeht. */
.km--gespraechsmodus [data-km-gespraechsmodus]{color:var(--sr-acc);box-shadow:0 0 0 2px var(--sr-acc-line)}

/* --------------------------------------------------- Abschnitt „Stimme" */

.km-stimme{display:flex;flex-direction:column;gap:var(--s3)}
.km-stimme-zeile{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s2)}
/* `display:flex` schlaegt das eingebaute [hidden]{display:none} des Browsers
   — gleiche Spezifitaet, spaeter im Buendel. Ohne diese Zeile stuende die
   Anbieterstimmen-Zeile auch dann da, wenn die Browserstimme gewaehlt ist:
   das Merkmal `hidden` waere gesetzt und bliebe wirkungslos. */
.km-stimme-zeile[hidden],.km-stimme-nur-an[hidden]{display:none}
/* Die Zeilen liegen in EINEM Kasten (der bei „Aus" gedaempft wird) und
   brauchen deshalb ihren eigenen Abstand — die Luecke von `.km-stimme`
   wirkt nur zwischen dessen direkten Kindern. */
.km-stimme-nur-an{display:flex;flex-direction:column;gap:var(--s2)}
.km-stimme-zeile>label{min-width:104px;font-size:var(--fs-small);color:var(--sr-mut)}
.km-stimme-zeile select,.km-stimme-zeile input[type=range]{flex:1 1 160px;min-width:0}
.km-stimme-wert{min-width:44px;font-size:var(--fs-small);color:var(--sr-mut);text-align:right;font-variant-numeric:tabular-nums}
.km-stimme-hinweis{margin:0;font-size:var(--fs-small);line-height:1.4;color:var(--sr-mut)}
.km-stimme-modi{display:flex;flex-wrap:wrap;gap:var(--s2)}
.km-stimme-modi label{display:flex;align-items:center;gap:6px;font-size:var(--fs-small)}
.km-stimme-schalter{display:flex;align-items:center;gap:6px;flex:1 1 160px;font-size:var(--fs-small);min-width:0}
.km-stimme-fuss{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s2)}
/* Das Abspiel-Dreieck ist ein SVG ohne eigene Groesse — in einem Flex-Knopf
   zieht es sich sonst auf die halbe Knopfbreite auf (gemessen 12.09.2026:
   der Knopf war dreizeilig). Feste Masse, und der Text bricht nicht um. */
.km-stimme-fuss .knopf{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.km-stimme-fuss .knopf svg{width:13px;height:13px;flex:none}
.km-stimme-kosten{flex-basis:100%;font-size:var(--fs-small);color:var(--sr-mut)}
.km-stimme[data-km-stimme-modus=aus] .km-stimme-nur-an{opacity:.5;pointer-events:none}

/* AUF SCHMALEN SCHIRMEN STEHT DIE BESCHRIFTUNG UEBER DEM SCHIEBER. Bei 390
   Punkten bleiben nach Beschriftung (104 px), Schieber (mindestens 160 px)
   und Wert (44 px) keine 358 px uebrig: der Wert rutschte allein in die
   naechste Zeile und stand dort ohne Bezug („1200 ms"). Zusammen in einer
   Zeile bleibt der Bezug erhalten. */
@media (max-width:559px){
  .km-stimme-zeile>label{flex-basis:100%;min-width:0}
  .km-stimme-zeile input[type=range],.km-stimme-zeile select{flex:1 1 120px}
  .km-stimme-wert{text-align:left}
}


/* ---- konto-kosten-polish.css ---- */
/* Konto und Kosten: ein Rahmen je Bereich, Inhalte bleiben flach. */
.konto-seite,.kosten-seite{display:flex;flex-direction:column;gap:var(--sr-gap)}
.konto-seite>.konto-abschnitt{padding:var(--s3);border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-surface)}
.konto-abschnitt>h3{margin:0 0 var(--s2);font-size:var(--fs-h2);color:var(--sr-ink)}
.konto-seite .sr-karte,.kosten-seite .sr-karte{background:transparent;border:0;border-radius:0;box-shadow:none;padding:0}
.konto-seite .sr-karte-kopf,.kosten-seite .sr-karte-kopf{padding:0 0 var(--s2);border-bottom:1px solid var(--sr-hair)}
.konto-seite .sr-karte-koerper,.kosten-seite .sr-karte-koerper{padding:var(--s2) 0 0}
.konto-seite .konto-stammdaten .cards{grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s2)}
.konto-seite .konto-stammdaten .card{min-width:0;padding:var(--s2);border:0;border-radius:0;box-shadow:none;background:transparent}
.konto-seite .konto-stammdaten .cv{font-size:var(--fs-h2);line-height:1.15;overflow-wrap:anywhere}
.konto-seite .konto-stammdaten .cs{font-size:var(--fs-small)}
.kosten-seite>.section{padding:var(--s3)}
.kosten-seite .sr-kpi-gitter{margin:var(--s2) 0 var(--s3)}
.konto-seite .info .mono{white-space:normal;overflow-wrap:anywhere}
.kosten-seite .chart-wrap{margin-top:var(--s2)}
@media (max-width:700px){
  .konto-seite .konto-stammdaten .cards{grid-template-columns:repeat(2,minmax(0,1fr))}
  .konto-seite .konto-stammdaten .card:nth-child(2){grid-column:1/-1}
}
@media (max-width:480px){.konto-seite .konto-stammdaten .cards{grid-template-columns:1fr}.konto-seite .konto-stammdaten .card:nth-child(2){grid-column:auto}}
@media (prefers-reduced-motion:reduce){.konto-seite *,.kosten-seite *{transition:none}}

/* Kostenübersicht: Kennzahlen, Tabelle und Verlauf als getrennte Leseblöcke. */
.kosten-seite #ueberblick>.sr-kpi-gitter{margin:16px 0 28px}
.kosten-seite #ueberblick>.sr-karte{margin:0 0 32px}
.kosten-seite #ueberblick>.sr-karte:last-child{margin-bottom:0}
.kosten-seite .sr-karte-kopf{gap:12px;padding-bottom:14px}
.kosten-seite .sr-karte-koerper{padding-top:16px}


/* ---- browser-erweiterung.css ---- */
.browser-erweiterung { display: grid; grid-template-columns: minmax(0, 1fr); gap: 18px; min-width: 0; max-width: 100%; }
.browser-erweiterung > .section { box-sizing: border-box; min-width: 0; max-width: 100%; margin: 0; }
.be-feld { display: grid; gap: 6px; max-width: 720px; margin-top: 16px; font-weight: 650; }
.be-feld textarea { resize: vertical; }
.be-angebot { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 18px; margin-top: 14px; padding: 14px; border: 1px solid var(--border); border-radius: 8px; }
.be-angebot p { margin: 0; flex: 1 1 360px; }
.be-klein, .be-daten-meta { color: var(--text-2); font-size: .9em; }
.be-installation summary { cursor: pointer; font-weight: 650; }
.be-installation ol { margin-bottom: 0; }
.be-vorschau-liste { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 1px; margin: 0; border: 1px solid var(--border); background: var(--border); }
.be-vorschau-liste > div { min-width: 0; padding: 12px; background: var(--surface); }
.be-vorschau-liste dt { color: var(--text-2); font-size: .82em; font-weight: 700; text-transform: uppercase; letter-spacing: .03em; }
.be-vorschau-liste dd { margin: 4px 0 0; overflow-wrap: anywhere; white-space: pre-wrap; }
.be-auswahl-aktionen { display: flex; flex-wrap: wrap; gap: 8px; padding-top: 10px; }
.be-datenblock + .be-datenblock, .be-befund + .be-befund { margin-top: 18px; padding-top: 18px; border-top: 1px solid var(--border); }
.be-datenblock, .be-befund, [data-be-kontext-inhalt], [data-be-befunde-inhalt] { min-width: 0; max-width: 100%; overflow-wrap: anywhere; }
.be-datenblock .tbl-wrap { max-width: 100%; overflow-x: auto; }
.be-datenblock td, .be-datenblock th { overflow-wrap: anywhere; word-break: normal; }
.be-datenblock h3, .be-befund h3 { margin: 0 0 4px; }
.be-speichern .knopf { margin-top: 12px; }
@media (max-width: 640px) {
  .be-vorschau-liste { grid-template-columns: minmax(0, 1fr); }
  .be-feld, .be-feld .feld-eingabe { box-sizing: border-box; min-width: 0; max-width: 100%; width: 100%; }
}
.be-schritte, .be-punkte { margin: 0; padding-left: 1.3em; display: grid; gap: 8px; max-width: 900px; }
.be-reiter { border: 1px solid var(--border); border-radius: 8px; margin-top: 10px; background: var(--surface); }
.be-reiter > summary { cursor: pointer; padding: 12px 14px; display: flex; flex-wrap: wrap; gap: 4px 12px; align-items: baseline; }
.be-reiter-name { font-weight: 700; min-width: 90px; }
.be-reiter-kurz { color: var(--text-2); }
.be-reiter > .be-punkte { padding: 0 14px 0 2.3em; margin-bottom: 12px; }
.be-reiter > .be-klein { margin: 0 14px 12px; }
.be-verbunden-liste { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; max-width: 900px; }
.be-verbunden { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 16px; padding: 12px 14px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface); }
.be-verbunden-text { display: grid; gap: 2px; min-width: 0; overflow-wrap: anywhere; }
.be-verbunden form { margin: 0; }
.be-leer { color: var(--text-2); }
.be-verbinden-form { max-width: 720px; }
.be-verbinden-aktionen { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 14px; }
.be-verbinden-status { max-width: 720px; }
.be-verbinden-titel { font-size: 1.05em; }


/* ---- wettbewerber-analyse.css ---- */
.wa-analyse { min-width: 0; }
.wa-analyse .sr-karte { margin-bottom: 20px; }
.wa-beleg { min-width: 180px; max-width: 560px; }
.wa-zusatz { min-width: 0; width: 100%; max-width: none; }
.wa-beleg summary, .wa-zusatz summary { cursor: pointer; color: var(--sr-acc-ink); font-weight: 600; padding: 5px 0; overflow-wrap: anywhere; }
.wa-beleg-inhalt { margin-top: 8px; padding: 12px; background: var(--sr-soft); border-radius: 7px; border: 1px solid var(--sr-hair); font-weight: 400; white-space: normal; }
.wa-beleg-inhalt p { margin: 0 0 10px; }
.wa-beleg-inhalt li { margin-bottom: 7px; overflow-wrap: anywhere; }
.wa-beleg-inhalt ul { padding-left: 18px; max-height: 340px; overflow: auto; }
.wa-quelle { font-size: 12px; color: var(--sr-mut); margin: 12px 0 20px; }


/* ---- backlink-analyse.css ---- */
.bl-analyse{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--s4);min-width:0;max-width:100%}
.bl-analyse>*{min-width:0;max-width:100%}
.bl-analyse>.sr-kpis{margin:0}
.bl-datenumfang{margin:0;padding:var(--s2) var(--s3);border-left:3px solid var(--sr-acc);background:var(--sr-soft);color:var(--sr-mut);font-size:var(--fs-small)}
.bl-datenumfang strong{color:var(--sr-ink)}
.bl-massnahmen{display:grid;gap:var(--s2);margin:0;padding:0;list-style:none;counter-reset:bl-massnahme}
.bl-massnahmen li{position:relative;padding:var(--s2) var(--s3) var(--s2) 46px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-sm);counter-increment:bl-massnahme}
.bl-massnahmen li::before{content:counter(bl-massnahme);position:absolute;left:14px;top:12px;display:grid;place-items:center;width:22px;height:22px;border-radius:50%;background:var(--sr-acc);color:var(--sr-surface);font-weight:700}
.bl-massnahmen a{color:var(--sr-acc-ink);text-decoration:none}
.bl-massnahmen a:hover{text-decoration:underline}
.bl-massnahmen p{margin:3px 0 0;color:var(--sr-mut);font-size:var(--fs-small)}
.bl-tag{display:inline-flex;align-items:center;min-height:22px;padding:1px 7px;border-radius:999px;background:var(--sr-soft);color:var(--sr-mut);font-size:var(--fs-label);white-space:nowrap}
.bl-tag--ok{background:var(--green-dim);color:var(--green)}
.bl-tag--warn{background:var(--amber-dim);color:var(--amber)}
.bl-linkdetails{min-width:190px}
.bl-linkdetails>summary{color:var(--sr-acc-ink);font-weight:600;cursor:pointer}
.bl-linkdetails dl{display:grid;gap:5px;margin:8px 0;padding:8px;border-radius:var(--sr-r-sm);background:var(--sr-soft);font-size:var(--fs-label)}
.bl-linkdetails dl>div{display:grid;grid-template-columns:90px minmax(0,1fr);gap:8px}
.bl-linkdetails dt{color:var(--sr-mut)}
.bl-linkdetails dd{min-width:0;margin:0;overflow-wrap:anywhere}
.bl-linkdetails .sr-knopf{margin-top:3px;white-space:nowrap}
.bl-link-aktionen{display:flex;flex-wrap:wrap;gap:var(--s1);margin-top:var(--s1)}
.bl-einstiege{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s3)}
.bl-einstiege>a{display:grid;gap:var(--s1);padding:var(--s3);border:1px solid var(--sr-hair);border-radius:var(--sr-r-sm);color:var(--sr-ink);text-decoration:none}
.bl-einstiege>a:hover{border-color:var(--sr-acc-line);background:var(--sr-soft)}
.bl-einstiege>a:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px}
.bl-einstiege span{color:var(--sr-mut);font-size:var(--fs-small)}
.bl-struktur{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s3)}
.bl-struktur>div{display:grid;align-content:start;gap:5px;padding:var(--s3);border:1px solid var(--sr-hair);border-radius:var(--sr-r-sm)}
.bl-struktur span,.bl-struktur small{color:var(--sr-mut);font-size:var(--fs-label)}
.bl-struktur strong{font-size:var(--fs-h2);overflow-wrap:anywhere}
.bl-luecken{margin:0;padding-left:20px;color:var(--sr-mut)}
.bl-zweispaltig{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s4);align-items:start}
.bl-zweispaltig>*{min-width:0}
.bl-verteilungen{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s4)}
.bl-verteilungen h4{margin:0 0 var(--s2)}
.bl-verteilungen dl{display:grid;gap:7px;margin:0}
.bl-verteilungen dl>div{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:var(--s2);padding-bottom:5px;border-bottom:1px solid var(--sr-hair)}
.bl-verteilungen dt{min-width:0;overflow-wrap:anywhere;color:var(--sr-mut)}
.bl-verteilungen dd{margin:0;font-variant-numeric:tabular-nums;font-weight:600}
.bl-analyse .sr-tabelle td{vertical-align:top}
.bl-analyse .sr-tabelle td a{overflow-wrap:anywhere}
@media(max-width:800px){.bl-zweispaltig,.bl-verteilungen,.bl-struktur,.bl-einstiege{grid-template-columns:1fr}}
@media(max-width:600px){.bl-analyse{gap:var(--s3)}.bl-datenumfang{padding:var(--s2)}.bl-massnahmen li{padding-right:var(--s2)}}


/* ---- tabellen-tabulator.css ---- */
/* ─────────────────────────────────────────────────────────────────────────
   Datentabellen mit Tabulator — Haus-Optik.

   Tabulator bringt ein eigenes Grundtheme mit (tabulator.min.css, laedt zur
   Laufzeit als eigene Datei aus /assets/chart/…). Das bleibt als GERUEST
   stehen — Masse, Virtual-DOM-Positionen, Zieh-Griffe — und wird hier
   vollstaendig auf die Haustokens umgefaerbt: Kopfzeile, Zebra, Hover,
   Sortierpfeile, Zieh-Geist, Platzhalter, Fusszeile.

   SPEZIFITAET IST HIER FUNKTION, NICHT GESCHMACK. Die Bibliotheksdatei wird
   erst zur Laufzeit an den <head> gehaengt und steht damit HINTER dem
   App-Buendel: bei gleicher Spezifitaet gewaenne sie. Jede Regel unten
   beginnt deshalb mit `.sr-tabulator.tabulator` — beide Klassen liegen auf
   demselben Element (unsere Huelle, Tabulators eigene Klasse) und heben die
   Regel damit ueber die Bibliothek.

   CSP: keine style="…"-Attribute im Markup (die verwirft die Richtlinie
   still). Was Tabulator an Massen setzt, setzt es ueber el.style.* — CSSOM
   und damit erlaubt.
   ───────────────────────────────────────────────────────────────────────── */

.sr-tabulator.tabulator{
  background:transparent;
  border:0;
  border-radius:0;
  font-size:var(--fs-ui);
  font-family:var(--font-body);
  color:var(--sr-ink);
  overflow:hidden;
  max-width:100%;
}
/* Zwischen Titel/Unterzeile und Such- oder Seriensteuerung bleibt eine klare
   Stufe. Das Suchfeld nutzt die kompakte Eingabeform der SEO-Oberflaeche. */
.sr-karte>.sr-werkzeugzeile:has(+ .sr-tabelle-wrap),
.sr-karte>.sr-werkzeugzeile:has(+ .tbl-wrap){padding:16px 18px 12px}
.sr-karte>.sr-werkzeugzeile:has(+ .sr-tabelle-wrap) .sr-werkzeug-filter,
.sr-karte>.sr-werkzeugzeile:has(+ .tbl-wrap) .sr-werkzeug-filter,
.sr-karte .kw-quellen-suche .sr-werkzeug-filter{
  flex:0 1 240px;width:240px;max-width:100%;height:34px;min-height:34px;padding:0 10px;
  border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl);background:var(--sr-soft);box-shadow:none
}
html body .tabulator-tooltip{background:var(--sr-surface);color:var(--sr-ink);border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl);box-shadow:var(--sr-e1);font-family:var(--font-body);font-size:var(--fs-small)}

/* ── Kopfzeile ─────────────────────────────────────────────────────────── */
.sr-tabulator.tabulator .tabulator-header{
  background:var(--sr-surface);
  border-top:0;
  border-bottom:1px solid var(--sr-hair);
  color:var(--sr-mut);
  font-weight:var(--fw-ui);
}
.sr-tabulator.tabulator .tabulator-header .tabulator-col{
  background:var(--sr-surface);
  border-right:0;
  border-bottom:0;
}
.sr-tabulator.tabulator .tabulator-header .tabulator-col:focus-visible{
  outline:2px solid var(--sr-acc);
  outline-offset:-2px;
}
.sr-tabulator.tabulator .tabulator-header .tabulator-col .tabulator-col-content{
  padding:12px 16px;
}
.sr-tabulator.tabulator .tabulator-header .tabulator-col .tabulator-col-title{
  font-size:var(--fs-label);
  font-weight:var(--fw-ui);
  letter-spacing:.06em;
  text-transform:uppercase;
  color:var(--sr-mut);
  white-space:nowrap;
  text-overflow:ellipsis;
}
/* Der Zeiger sagt, dass diese Kopfzelle sich ziehen laesst. */
.sr-tabulator.tabulator .tabulator-header .tabulator-col.tabulator-movable-columns,
.sr-tabulator.tabulator.tabulator-block-select .tabulator-header .tabulator-col{cursor:grab}
.sr-tabulator.tabulator .tabulator-header .tabulator-col.tabulator-moving{
  cursor:grabbing;
  background:color-mix(in oklab,var(--sr-acc) 14%,var(--sr-surface));
  border:1px solid var(--sr-acc);
  border-radius:var(--sr-r-ctl);
  box-shadow:0 6px 18px rgba(0,0,0,.22);
  color:var(--sr-ink);
  opacity:.96;
}
.sr-tabulator.tabulator .tabulator-header .tabulator-col.tabulator-col-placeholder{
  background:color-mix(in oklab,var(--sr-acc) 10%,var(--sr-surface));
  border:1px dashed color-mix(in oklab,var(--sr-acc) 72%,transparent);
  border-radius:var(--sr-r-ctl);
  animation:sr-spaltenplatz 680ms ease-in-out infinite alternate;
}
@keyframes sr-spaltenplatz{
  from{background:color-mix(in oklab,var(--sr-acc) 5%,var(--sr-surface))}
  to{background:color-mix(in oklab,var(--sr-acc) 17%,var(--sr-surface))}
}
@media (prefers-reduced-motion:reduce){
  .sr-tabulator.tabulator .tabulator-header .tabulator-col.tabulator-col-placeholder{animation:none}
}
.sr-tabulator.tabulator .tabulator-header .tabulator-col.tabulator-sortable.tabulator-col-sorter-element:hover{
  background:var(--sr-surface);
}
.sr-tabulator.tabulator .tabulator-col-resize-handle{
  width:9px;
}
.sr-tabulator.tabulator .tabulator-col-resize-handle:hover{
  background:color-mix(in oklab,var(--sr-acc) 45%,transparent);
}
.sr-tabulator.tabulator .tabulator-col-resize-guide{
  background:var(--sr-acc);
  opacity:.8;
}

/* ── Sortierpfeile: dieselbe Sprache wie .th-sort-arrow ────────────────── */
.sr-tabulator.tabulator .tabulator-header .tabulator-col .tabulator-col-sorter .tabulator-arrow{
  border-bottom-color:var(--sr-hair);
}
.sr-tabulator.tabulator .tabulator-header .tabulator-col[aria-sort="none"] .tabulator-col-sorter .tabulator-arrow{
  border-bottom-color:var(--sr-hair);
}
.sr-tabulator.tabulator .tabulator-header .tabulator-col[aria-sort="ascending"] .tabulator-col-sorter .tabulator-arrow,
.sr-tabulator.tabulator .tabulator-header .tabulator-col[aria-sort="descending"] .tabulator-col-sorter .tabulator-arrow{
  border-bottom-color:var(--sr-acc);
  border-top-color:var(--sr-acc);
}

/* ── Zeilen: Zebra und Hover wie in .tbl-wrap table ───────────────────── */
.sr-tabulator.tabulator .tabulator-tableholder{
  background:transparent;
  overscroll-behavior-y:auto;
}
.sr-tabulator.tabulator .tabulator-tableholder:focus-visible{
  outline:2px solid var(--sr-acc);
  outline-offset:-2px;
}
.sr-tabulator.tabulator .tabulator-tableholder .tabulator-table{
  background:transparent;
  color:var(--sr-ink);
}
/* Keine eigene Mindesthoehe: die Zeilenhoehe kommt aus Zellpolster und
   Inhalt und deckt sich damit mit der Servertabelle (gemessen 12.09.2026:
   30–43 px dort wie hier). Eine gesetzte Mindesthoehe hat Tabulator ohnehin
   ueberschrieben und stand nur als tote Regel im Stylesheet. */
.sr-tabulator.tabulator .tabulator-row{
  background:transparent;
  border-bottom:0;
  cursor:default;
}
.sr-tabulator.tabulator .tabulator-row.tabulator-row-even{
  background:var(--sr-soft);
}
.sr-tabulator.tabulator .tabulator-row.tabulator-selectable:hover,
.sr-tabulator.tabulator .tabulator-row:hover{
  background:color-mix(in oklab,var(--sr-acc) 6%,transparent);
}
.sr-tabulator.tabulator .tabulator-row .tabulator-cell{
  padding:12px 16px;
  border-right:0;
  color:var(--sr-ink);
  font-size:var(--fs-ui);
  font-weight:var(--fw-body);
  white-space:normal;
  overflow:hidden;
  text-overflow:ellipsis;
}
.sr-tabulator.tabulator .tabulator-row .tabulator-cell.sr-td-num,
.sr-tabulator.tabulator .tabulator-row .tabulator-cell.sr-td-zahl{
  font-variant-numeric:tabular-nums;
  font-family:var(--font-num);
}
/* Links, Chips und Pillen aus dem Server-HTML bleiben, wie sie sind — die
   Zelle liefert nur den Platz dafuer. */
.sr-tabulator.tabulator .tabulator-row .tabulator-cell a{color:inherit;cursor:pointer}
.sr-tabulator-auswahl{display:inline-flex;align-items:center;justify-content:center}
.sr-tabulator-auswahl .sr-wahl{transform:scale(.9)}
/* Eine Grafik richtet sich nach der Zeile, nicht die Zeile nach der Grafik.
   Die kleinen Verlaufsgrafiken sind SVG auf `width:100%` mit viewBox: sie
   wachsen mit der Spalte und ziehen die Zeilenhoehe mit. Die Startbreite
   kommt zwar aus der Servertabelle (tabellen-tabulator.js spaltenLesen),
   aber der Nutzer darf die Spalte breiter ziehen — dieser Riegel haelt die
   Zeile dabei ruhig. */
.sr-tabulator.tabulator .tabulator-row .tabulator-cell svg{vertical-align:middle;max-height:24px}
[data-density="kompakt"] .sr-tabulator.tabulator .tabulator-row .tabulator-cell svg{max-height:18px}

/* Kompaktstufe zieht mit — dieselben Masse wie .tbl-wrap table im
   Kompaktmodus (sr-bausteine.css): 30 px Zeile, 4/10 px Polster. */
[data-density="kompakt"] .sr-tabulator.tabulator .tabulator-row{min-height:30px}
[data-density="kompakt"] .sr-tabulator.tabulator .tabulator-row .tabulator-cell{
  padding:4px 10px;font-size:var(--fs-label)}
[data-density="kompakt"] .sr-tabulator.tabulator .tabulator-header .tabulator-col .tabulator-col-content{
  padding:5px 10px}

/* ── Platzhalter, wenn der Filter nichts uebrig laesst ────────────────── */
.sr-tabulator.tabulator .tabulator-placeholder{
  background:transparent;
}
.sr-tabulator.tabulator .tabulator-placeholder .tabulator-placeholder-contents{
  color:var(--sr-mut);
  font-size:var(--fs-ui);
  font-weight:var(--fw-body);
}

/* ── Fusszeile: Blaetterung und Zeilen pro Seite ──────────────────────── */
.sr-tabulator.tabulator .tabulator-footer{
  background:transparent;
  border-top:1px solid var(--sr-hair);
  color:var(--sr-mut);
  font-size:var(--fs-label);
  padding:6px 16px;
}
.sr-tabulator.tabulator .tabulator-footer .tabulator-page-size,
.sr-tabulator.tabulator .tabulator-footer .tabulator-page{
  min-height:28px;
  border:1px solid transparent;
  border-radius:var(--sr-r-ctl);
  background:var(--sr-soft);
  color:inherit;
  padding:3px 10px;
  margin:0 2px;
}
.sr-tabulator.tabulator .tabulator-footer .tabulator-page:hover:not(:disabled){
  background:color-mix(in oklab,var(--sr-acc) 12%,var(--sr-soft));
  color:var(--sr-ink);
}
.sr-tabulator.tabulator .tabulator-footer .tabulator-page.active,
.sr-tabulator.tabulator .tabulator-footer .tabulator-page[data-page].active{
  background:var(--knopf-blau);
  color:var(--auf-knopf);
  border-color:var(--knopf-blau);
}
.sr-tabulator.tabulator .tabulator-footer .tabulator-page:disabled{opacity:.45}
.sr-tabulator.tabulator .tabulator-footer .tabulator-paginator label{color:var(--sr-mut)}
.sr-tabulator.tabulator .tabulator-footer .tabulator-page-counter{color:var(--sr-mut)}
.sr-tabulator.tabulator .tabulator-footer .tabulator-footer-contents{
  display:flex;align-items:center;gap:0
}
.sr-tabulator.tabulator .tabulator-footer .tabulator-paginator{margin-left:auto}
.sr-tabellen-umfang--tabulator{display:inline-flex;align-items:center;color:var(--sr-mut);font-variant-numeric:tabular-nums}
.sr-tabellen-umfang--tabulator:not(:empty)::before{content:'·';padding:0 7px;color:var(--sr-mut)}
/* Die Seitengroesse steht in der Optionenklappe. Die
   Seitenknoepfe bleiben in der Fusszeile direkt erreichbar. */
.sr-tabulator.tabulator .tabulator-footer .tabulator-paginator > label,
.sr-tabulator.tabulator .tabulator-footer .tabulator-paginator > .tabulator-page-size{display:none}

/* ── Kopfmenue (rechte Maustaste) ─────────────────────────────────────── */
.tabulator-menu{
  background:var(--sr-surface);
  border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-ctl);
  box-shadow:0 10px 28px rgba(0,0,0,.22);
  color:var(--sr-ink);
  font-size:var(--fs-label);
  padding:4px;
}
.tabulator-menu .tabulator-menu-item{
  border-radius:var(--sr-r-ctl);
  padding:6px 10px;
}
.tabulator-menu .tabulator-menu-item:hover{
  background:color-mix(in oklab,var(--sr-acc) 12%,transparent);
  color:var(--sr-ink);
}
.sr-tabulator-menue-eintrag{display:inline-flex;align-items:center;gap:8px}
.sr-tabulator-haken{display:inline-block;width:1em;color:var(--sr-acc)}

/* ── Zahnrad in der Werkzeugzeile + eigene Spaltenklappe ──────────────── */
.sr-tabulator-zahnrad{
  width:30px;
  height:30px;
  border:1px solid transparent;
  border-radius:var(--sr-r-ctl);
  background:var(--sr-soft);
  color:var(--sr-mut);
  cursor:pointer;
  padding:6px;
  display:inline-flex;
  align-items:center;
  justify-content:center;
}
.sr-karte-kopf>.sr-tabulator-zahnrad{margin-left:auto;flex:none;background:transparent}
.sr-karte-kopf>.sr-tabulator-zahnrad + .sr-erklaerung{margin-left:0}
.sr-tabulator-zahnrad svg{width:16px;height:16px}
.sr-tabulator-zahnrad:hover{background:color-mix(in oklab,var(--sr-acc) 12%,var(--sr-soft));color:var(--sr-ink)}
.sr-tabulator-zahnrad[aria-expanded="true"]{background:color-mix(in oklab,var(--sr-acc) 12%,var(--sr-soft));color:var(--sr-ink)}
.sr-tabulator-zahnrad:focus-visible{outline:2px solid var(--sr-acc);outline-offset:2px}

.sr-tabulator-klappe{
  position:fixed;
  z-index:60;
  width:min(280px,calc(100vw - 16px));
  max-height:calc(100vh - 16px);
  overflow:auto;
  background:var(--sr-surface);
  border:1px solid var(--sr-hair);
  border-radius:var(--sr-r-ctl);
  box-shadow:0 10px 28px rgba(0,0,0,.22);
  padding:6px;
  font-size:var(--fs-label);
  color:var(--sr-ink);
}
.sr-tabulator-klappe-gruppe{display:grid;gap:2px;padding:4px 0}
.sr-tabulator-klappe-gruppe + .sr-tabulator-klappe-gruppe{border-top:1px solid var(--sr-hair);margin-top:4px;padding-top:8px}
.sr-tabulator-klappe-titel{display:block;padding:4px 8px;color:var(--sr-ink);font-size:var(--fs-label)}
.sr-tabulator-klappe label{
  display:flex;align-items:center;gap:8px;
  padding:5px 8px;border-radius:var(--sr-r-ctl);cursor:pointer;
}
.sr-tabulator-klappe label:hover{background:color-mix(in oklab,var(--sr-acc) 10%,transparent)}
.sr-tabulator-klappe input{accent-color:var(--knopf-blau)}
.sr-tabulator-klappe select{margin-left:auto;min-height:28px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl);background:var(--sr-soft);color:var(--sr-ink);padding:3px 24px 3px 8px}

/* ── Was die Uebernahme ersetzt, verschwindet auch ────────────────────────
   `element.hidden` setzt nur die UA-Regel `display:none` — und die verliert
   gegen JEDE eigene display-Regel. `.sr-tabellen-seiten{display:grid}` aus
   tabellen-seiten.css ist genau so eine: die serverseitige Bedienleiste
   stand trotz hidden=true unter der Tabulator-Fusszeile, mit einer zweiten
   Zeilenzahl und einem zweiten „Zeilen pro Seite" (gemessen 12.09.2026 bei
   390 px). Diese Datei laedt spaeter und raeumt das auf. */
.sr-app .sr-tabellen-seiten[hidden],
.sr-app .tbl-wrap[hidden],
.sr-app .sr-tabelle-wrap[hidden]{display:none}

.sr-tabulator-hinweis{
  margin:var(--s1,8px) 18px var(--s2,12px);
  color:var(--sr-mut);
  font-size:var(--fs-label);
}

/* ── Aufgeklappte Restspalten auf schmalen Schirmen ───────────────────── */
.sr-tabulator.tabulator .tabulator-responsive-collapse{
  border-top:1px solid var(--sr-hair);
  border-bottom:0;
  padding:8px 16px;
}
.sr-tabulator.tabulator .tabulator-responsive-collapse table td,
.sr-tabulator.tabulator .tabulator-responsive-collapse table th{
  padding:3px 6px;font-size:var(--fs-label);color:var(--sr-ink);background:transparent;height:auto}
.sr-tabulator.tabulator .tabulator-responsive-collapse-toggle{
  background:var(--knopf-blau);color:var(--auf-knopf)}

/* Auf dem Telefon bleibt der waagerechte Lauf INNERHALB der Tabelle — die
   Seite selbst scrollt nie zur Seite. */
@media(max-width:600px){
  .sr-tabulator.tabulator{max-width:100%;overflow-x:hidden}
  .sr-tabulator.tabulator .tabulator-header .tabulator-col .tabulator-col-content{padding:8px 10px}
  .sr-tabulator.tabulator .tabulator-row .tabulator-cell{padding:8px 10px}
  /* Die Fusszeile bricht um, statt die Blaetterknoepfe aus dem Bild zu
     schieben: bei 390 px standen Zeilenzahl, Seitengroesse und vier
     Seitenknoepfe in einer Zeile, die letzten drei ausserhalb. */
  .sr-tabulator.tabulator .tabulator-footer{padding:6px 10px}
  .sr-tabulator.tabulator .tabulator-footer .tabulator-footer-contents{
    display:flex;align-items:center;justify-content:flex-start;gap:0;flex-wrap:wrap}
  .sr-tabulator.tabulator .tabulator-footer .tabulator-paginator{
    display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:4px;width:100%;margin-top:6px}
  .sr-tabulator.tabulator .tabulator-footer .tabulator-page{margin:0}
}


/* ---- seiten-werkzeuge.css ---- */
.sw-werkzeuge{display:grid;gap:10px}.sw-werkzeug{border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--surface);overflow:hidden}.sw-werkzeug>summary{padding:15px 18px;cursor:pointer;font-weight:700}.sw-werkzeug>summary:focus-visible,.sw-werkzeug :is(button,input,textarea):focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:3px}.sw-inhalt{display:grid;gap:14px;padding:0 18px 18px;border-top:1px solid var(--sr-hair)}.sw-caption{margin:14px 0 0;color:var(--sr-mut);font-size:12px}.sw-ansicht,.sw-redirect-aktionen{display:flex;flex-wrap:wrap;gap:8px}.sw-form{display:grid;gap:8px}.sw-form label{display:grid;gap:5px;color:var(--sr-mut);font-size:12px;font-weight:650}.sw-form input,.sw-form textarea{width:100%;padding:9px 10px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl);background:var(--surface);color:var(--text);font:inherit;resize:vertical}.sw-laenge{display:flex;justify-content:space-between;gap:10px;color:var(--sr-mut);font-size:11px}.sw-laenge .is-lang{color:var(--sr-warn-ink);font-weight:700}.sw-serp{max-width:620px;padding:15px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--surface)}.sw-serp[data-geraet="mobil"]{max-width:380px}.sw-serp-url{color:var(--text);font-size:12px;overflow-wrap:anywhere}.sw-serp-titel,.sw-serp-text{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.sw-serp-titel{margin-top:5px;color:var(--sr-acc-ink);font-size:20px;line-height:1.25;-webkit-line-clamp:1}.sw-serp-text{margin-top:4px;color:var(--sr-mut);font-size:13px;line-height:1.45;-webkit-line-clamp:2}.sw-serp[data-geraet="mobil"] .sw-serp-titel{-webkit-line-clamp:2}.sw-serp[data-geraet="mobil"] .sw-serp-text{-webkit-line-clamp:3}.sw-status{font-size:12px;color:var(--sr-mut)}.sw-redirect-ergebnis ol{display:grid;gap:8px;margin:0;padding-left:22px}.sw-redirect-ergebnis li{overflow-wrap:anywhere}.sw-redirect-ergebnis li small{display:block;color:var(--sr-mut)}[data-sw-config][hidden],[data-sw-redirect-abbruch][hidden]{display:none!important}@media(max-width:520px){.sw-inhalt{padding:0 14px 14px}.sw-werkzeug>summary{padding:13px 14px}.sw-laenge{display:grid;gap:2px}.sw-serp-titel{font-size:18px}}
.sw-ansicht .sr-knopf.is-active{border-color:var(--sr-acc-line);background:var(--sr-soft);color:var(--sr-acc-ink);box-shadow:none}


/* ---- recherche-navigation.css ---- */
.sr-app .sr-reiter:has(.recherche-nav){overflow:visible;-webkit-mask-image:none;mask-image:none}
.recherche-nav{position:relative;display:grid!important;min-width:0!important;width:100%;gap:0!important;overflow:visible}
.recherche-nav[hidden]{display:none!important}
.recherche-nav-primaerzeile{display:flex;align-items:stretch;min-width:0;width:100%;padding-right:42px;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}
.recherche-nav-primaerzeile::-webkit-scrollbar,.recherche-nav-sekundaer::-webkit-scrollbar{display:none}
.recherche-nav .recherche-nav-primaer[aria-current]{color:var(--sr-acc-ink);border-bottom-color:var(--sr-acc)}
.recherche-nav :is(.recherche-nav-sekundaer-link,.recherche-nav-verwalten-link){border:0!important;border-radius:0!important;background:transparent!important;box-shadow:none!important}
.recherche-nav-sekundaer{display:flex;gap:var(--s3);min-width:0;padding:var(--s1) var(--s2) 0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}
.recherche-nav .recherche-nav-sekundaer-link{min-height:32px;padding:5px 0 7px;font-size:var(--fs-small);border-bottom:2px solid transparent!important}
.recherche-nav .recherche-nav-sekundaer-link[aria-current]{color:var(--sr-acc-ink);border-bottom-color:var(--sr-acc)!important}
.recherche-nav-verwalten{position:absolute;z-index:2;top:0;right:0;display:grid;grid-template-columns:auto 42px;align-items:stretch;background:transparent;border-radius:var(--sr-r-ctl)}
.recherche-nav-verwalten[open]{background:var(--sr-surface)}
/* Blende vor dem Zahnrad (Folgefund 14.09.2026): die Primaerzeile scrollt
   UNTER dem absolut positionierten Zahnrad weiter, ein durchlaufender
   Reitertext liefe sonst genau in den Kreis. Deckt denselben Grund ab, den
   die Leiste an dieser Stelle ohnehin zeigt (--sr-kopf-ton faellt auf
   --sr-bg zurueck, wenn kein Mandantenhintergrund gesetzt ist — siehe
   theme-background.css), nicht eine geratene Farbe. Nur im geschlossenen
   Zustand: offen deckt bereits [open] die ganze Flaeche ab. */
.recherche-nav-verwalten:not([open])::before{content:'';position:absolute;top:0;bottom:0;right:100%;width:22px;
  background:linear-gradient(to right,transparent,var(--sr-kopf-ton,var(--sr-bg)));pointer-events:none}
.recherche-nav-verwalten>summary{grid-column:2;grid-row:1;display:flex;align-items:center;justify-content:flex-end;width:42px;min-height:36px;padding:var(--s1) 0 var(--s1) var(--s1);color:var(--sr-acc-ink);font-size:var(--fs-small);font-weight:600;cursor:pointer;list-style:none;background:var(--sr-kopf-ton,var(--sr-bg))}
.recherche-nav-verwalten[open]>summary{background:var(--sr-surface)}
.recherche-nav-verwalten>summary::-webkit-details-marker{display:none}
.recherche-nav-verwalten>summary::marker{content:''}
.recherche-nav-verwalten>summary:hover{color:var(--sr-ink)}
.recherche-nav-verwalten>summary:focus-visible,.recherche-nav-verwalten-link:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:-2px}
.recherche-nav-verwalten>div{grid-column:1;grid-row:1;display:flex;align-items:stretch;justify-content:flex-end;gap:var(--s3);padding-left:var(--s3)}
.recherche-nav .recherche-nav-verwalten-link{min-height:36px!important;padding:var(--s1) 0!important;border-bottom:2px solid transparent!important}
.recherche-nav .recherche-nav-verwalten-link[aria-current]{color:var(--sr-acc-ink);border-bottom-color:var(--sr-acc)!important}


/* ---- verwaltung-arbeitsplatz.css ---- */
/* Gemeinsame Arbeitsflächen für Mailing und technische Verwaltung. */
.sr-admin-workspace .sr-admin-sekundaer{display:block;margin-top:5px;color:var(--sr-mut);font-size:var(--fs-label);font-weight:400;line-height:1.5;overflow-wrap:anywhere}
.sr-admin-workspace .sr-admin-stand{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px;margin:16px 0 28px;padding:22px 0;border-block:1px solid var(--sr-hair)}
.sr-admin-stand>div{min-width:0}
.sr-admin-stand dt{color:var(--sr-mut);font-size:var(--fs-label)}
.sr-admin-stand dd{margin:8px 0 0;font-size:20px;font-weight:650;overflow-wrap:anywhere}
.sr-admin-stand small{display:block;margin-top:5px;font-size:var(--fs-small);font-weight:400;color:var(--sr-mut);line-height:1.5}
.sr-admin-workspace .sr-admin-schritte{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px;list-style:none;counter-reset:einrichtung;margin:24px 0;padding:0}
.sr-admin-schritte>li{position:relative;counter-increment:einrichtung;min-width:0;padding:0 0 0 42px}
.sr-admin-schritte>li::before{content:counter(einrichtung);position:absolute;left:0;top:0;display:grid;place-items:center;width:30px;height:30px;border:1px solid var(--sr-hair);border-radius:50%;color:var(--sr-acc-ink);font-weight:650;background:var(--sr-soft)}
.sr-admin-schritte a{display:inline-flex;align-items:center;min-height:32px;font-weight:650}
.sr-admin-schritte span{display:block;color:var(--sr-mut);font-size:var(--fs-small);line-height:1.5;margin-top:4px}
.sr-admin-workspace .sr-admin-endpunkt{display:flex;align-items:center;justify-content:space-between;gap:20px;margin:16px 0 24px;padding:18px 0;border-block:1px solid var(--sr-hair)}
.sr-admin-endpunkt>div{display:grid;gap:8px;min-width:0}
.sr-admin-endpunkt code{overflow-wrap:anywhere;white-space:normal}
.sr-admin-endpunkt>button{flex:none}
.sr-admin-workspace .sr-admin-hilfe{border:0;border-block:1px solid var(--sr-hair);border-radius:0;background:transparent;box-shadow:none;margin:16px 0;padding:0}
.sr-admin-hilfe>summary{display:list-item;min-height:44px;align-content:center;padding:10px 0;box-sizing:border-box;color:var(--sr-acc-ink);font-weight:600;cursor:pointer}
.sr-admin-hilfe>p,.sr-admin-hilfe>div{margin:0;padding:4px 0 18px;line-height:1.65}
.sr-admin-clientwahl>label{display:flex;align-items:center;gap:16px;font-weight:600;flex-wrap:wrap}
.sr-admin-clientwahl select{width:min(100%,320px)}
.sr-admin-client{padding:22px 0;border-bottom:1px solid var(--sr-hair);min-width:0}
.sr-admin-client[hidden]{display:none}
.sr-admin-client h3{margin:0 0 16px;font-size:17px}
.sr-admin-client ol{padding-left:24px;line-height:1.65;color:var(--sr-mut)}
.sr-admin-client li+li{margin-top:8px}
.sr-admin-client pre{max-width:100%;overflow:auto;box-sizing:border-box;line-height:1.6}
.sr-admin-workspace .sr-admin-fahrplan{margin:0;padding:0;list-style:none}
.sr-admin-fahrplan>li{display:grid;grid-template-columns:150px minmax(0,1fr);gap:20px;padding:20px 0;border-bottom:1px solid var(--sr-hair)}
.sr-admin-fahrplan p{margin:0;line-height:1.6}
.sr-admin-leer{padding:24px 0;max-width:70ch}
.sr-admin-leer h3{margin:0 0 10px;font-size:17px}
.sr-admin-leer p{color:var(--sr-mut);line-height:1.6;margin:0 0 18px}
.sr-admin-workspace .sr-admin-arbeitsliste td{white-space:normal;overflow-wrap:anywhere;height:auto;line-height:1.6}
.sr-mailing #editor>.sr-mail-editor{max-width:none}
.sr-mail-editor-raster{display:grid;grid-template-columns:minmax(0,1fr) minmax(320px,.85fr);gap:26px;align-items:start;padding:24px;background:var(--sr-surface);border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);box-shadow:var(--sr-e1)}
.sr-mailing .sr-mail-editor-raster>.formular-grid{padding:0;background:transparent;box-shadow:none;border-radius:0;gap:20px}
.sr-mailing .sr-mail-editor-raster textarea{min-height:360px;max-height:65vh}
.sr-mail-vorschau{min-width:0;border-left:1px solid var(--sr-hair);padding-left:26px}
.sr-mail-vorschau h3{font-size:17px;margin:0 0 10px}
.sr-mail-vorschau p{margin:0 0 18px;line-height:1.6}
.sr-mail-vorschau iframe{display:block;width:100%;height:560px;max-height:75vh;border:1px solid var(--sr-hair);border-radius:6px;background:#fff;box-sizing:border-box}
.sr-admin-formstatus{grid-column:1 / -1;min-height:20px;margin:0;color:var(--sr-mut);font-size:var(--fs-label);line-height:1.5}
.sr-admin-formstatus[data-geaendert="true"]{color:var(--sr-acc-ink)}
.sr-admin-workspace .sr-admin-planwahl{display:flex;align-items:center;flex-wrap:wrap;gap:16px;font-weight:600;margin-bottom:16px}
.sr-admin-planwahl select{max-width:480px;width:100%}
.sr-admin-workspace .berichte-design-plan{border:0;border-top:1px solid var(--sr-hair);border-radius:0;background:transparent}
.sr-admin-workspace .berichte-design-plan[hidden]{display:none}
.sr-admin-workspace .berichte-design-plan>summary{padding:18px 0}
.sr-admin-workspace .berichte-design-form{padding:0;gap:26px}
.sr-admin-workspace .berichte-design-gruppe{padding:18px 0 0;border:0;border-top:1px solid var(--sr-hair);border-radius:0;background:transparent}
.sr-admin-workspace .berichte-design-gruppe legend{padding:0 10px 0 0;font-size:17px}
.sr-admin-berichtvorschau{margin:0 0 26px}
.sr-admin-workspace .sr-admin-installation{margin:18px 0;padding-left:24px;line-height:1.7}
.sr-admin-installation li+li{margin-top:10px}
.sr-admin-workspace :is(.abl-detail,.abl-quitt-aktion) :is(td,dd){height:auto;white-space:normal;overflow-wrap:anywhere}
.sr-admin-workspace :is(.sr-admin-client,.sr-admin-schritte,.sr-admin-fahrplan) a:focus-visible,.sr-admin-hilfe>summary:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:3px}
@media(max-width:1100px){
  .sr-mail-editor-raster{grid-template-columns:minmax(0,1fr)}
  .sr-mail-vorschau{padding:22px 0 0;border-left:0;border-top:1px solid var(--sr-hair)}
}
@media(max-width:640px){
  .sr-admin-workspace :is(.sr-admin-stand,.sr-admin-schritte){grid-template-columns:1fr;gap:20px}
  .sr-admin-fahrplan>li{grid-template-columns:1fr;gap:10px}
  .sr-mail-editor-raster{padding:16px;gap:20px}
  .sr-mailing .sr-mail-editor-raster textarea{min-height:280px}
  .sr-admin-endpunkt{flex-wrap:wrap}
  .sr-admin-workspace :is(.sr-admin-client,.sr-admin-endpunkt,.sr-mail-editor) .knopf{min-height:44px}
}


/* ---- verwaltung-konten.css ---- */
/* Benutzer, Mandanten, Rechte und Audit im Verwaltungsarbeitsplatz. Alle
 * Farben und Abstände stammen aus den bestehenden Oberflächenvariablen. */

.sr-admin-workspace .sr-verwaltung :is(.vw-benutzer-tabelle,.vw-mandanten-tabelle,.vw-zuordnung-tabelle,.vw-audit-tabelle){max-width:100%;overflow-x:auto}
.sr-admin-workspace .sr-verwaltung :is(.vw-benutzer-tabelle,.vw-mandanten-tabelle,.vw-audit-tabelle) table{width:100%;table-layout:fixed}
.sr-admin-workspace .sr-verwaltung :is(.vw-person-email,.vw-person-meta,.vw-mandant-identitaet>span,.vw-recht-effekt){display:block}
.sr-admin-workspace .sr-verwaltung :is(.vw-person-email,.vw-mandant-identitaet .mono,.vw-person-meta,.vw-recht-effekt){color:var(--sr-mut);font-size:var(--fs-label);line-height:1.45}
.sr-admin-workspace .sr-verwaltung :is(.vw-person,.vw-mandant-identitaet,.vw-audit-konto,.vw-audit-details pre,.vw-detailwerte dd){min-width:0;overflow-wrap:anywhere}
.sr-admin-workspace .sr-verwaltung .vw-mobile-label{display:none;color:var(--sr-mut);font-size:var(--fs-label);font-weight:600}
.sr-admin-workspace .sr-verwaltung .vw-wahlziel{display:grid;place-items:center;width:32px;height:32px;cursor:pointer}

/* Benutzer: sechs Hauptspalten. Mandant und 2FA bleiben bei der Person, die
 * beiden editierbaren Werte liegen gemeinsam im Zeileneditor. */
.sr-admin-workspace .sr-verwaltung .vw-benutzer-tabelle table{min-width:760px}
.sr-admin-workspace .sr-verwaltung .vw-benutzer-tabelle :is(th,td).sr-wahl-spalte{width:40px}
.sr-admin-workspace .sr-verwaltung .vw-benutzer-person{width:auto;min-width:240px;white-space:normal}
.sr-admin-workspace .sr-verwaltung .vw-benutzer-rolle{width:132px}
.sr-admin-workspace .sr-verwaltung .vw-benutzer-status{width:120px}
.sr-admin-workspace .sr-verwaltung .vw-benutzer-login{width:144px;white-space:normal}
.sr-admin-workspace .sr-verwaltung .vw-benutzer-aktionen{width:100px}
.sr-admin-workspace .sr-verwaltung .vw-person>strong{display:block;font-weight:700;line-height:1.35;overflow-wrap:anywhere}
.sr-admin-workspace .sr-verwaltung .vw-person-email{margin-top:2px}
.sr-admin-workspace .sr-verwaltung .vw-person-meta{display:flex;flex-wrap:wrap;gap:2px 12px;margin-top:4px}
.sr-admin-workspace .sr-verwaltung .vw-rollenstatus{display:inline-flex;align-items:center;min-height:26px;padding:2px 8px;border-radius:var(--sr-r-xs);background:var(--sr-soft);font-weight:600;line-height:1.35;overflow-wrap:anywhere}
.sr-admin-workspace .sr-verwaltung .vw-konto-editor{margin-top:8px;border-top:1px solid var(--sr-hair);padding-top:6px}
.sr-admin-workspace .sr-verwaltung .vw-konto-editor>summary,
.sr-admin-workspace .sr-verwaltung :is(.vw-tarif-editor,.vw-mandant-details,.vw-audit-details)>summary{display:inline-flex;align-items:center;min-height:36px;color:var(--sr-acc-ink);font-size:var(--fs-label);font-weight:600;cursor:pointer;list-style:none}
.sr-admin-workspace .sr-verwaltung :is(.vw-konto-editor,.vw-tarif-editor,.vw-mandant-details,.vw-audit-details)>summary::-webkit-details-marker{display:none}
.sr-admin-workspace .sr-verwaltung :is(.vw-konto-editor,.vw-tarif-editor,.vw-mandant-details,.vw-audit-details)>summary::after{content:'›';margin-left:7px;transition:transform var(--t-fast) var(--ease)}
.sr-admin-workspace .sr-verwaltung :is(.vw-konto-editor,.vw-tarif-editor,.vw-mandant-details,.vw-audit-details)[open]>summary::after{transform:rotate(90deg)}
.sr-admin-workspace .sr-verwaltung :is(.vw-konto-editor,.vw-tarif-editor,.vw-mandant-details,.vw-audit-details)>summary:focus-visible{outline:2px solid var(--focus-ton);outline-offset:2px;border-radius:var(--sr-r-ctl)}
.sr-admin-workspace .sr-verwaltung .vw-konto-editor-inhalt{display:grid;gap:12px;margin-top:8px;padding:12px;border-radius:var(--sr-r-ctl);background:var(--sr-soft)}
.sr-admin-workspace .sr-verwaltung .vw-konto-editor-form{display:grid;grid-template-columns:minmax(150px,1fr) auto;align-items:end;gap:10px}
.sr-admin-workspace .sr-verwaltung .vw-konto-editor-form+.vw-konto-editor-form{padding-top:12px;border-top:1px solid var(--sr-hair)}
.sr-admin-workspace .sr-verwaltung .vw-konto-editor-form .feld{min-width:0;margin:0}
.sr-admin-workspace .sr-verwaltung .vw-konto-editor-form :is(.feld-eingabe,.knopf){min-height:40px}
.sr-admin-workspace .sr-verwaltung .vw-konto-editor-form .vw-editor-speichern{display:inline-flex;align-items:center;gap:7px;width:auto;padding-inline:12px;white-space:nowrap}
.sr-admin-workspace .sr-verwaltung .vw-konto-editor-form .vw-editor-speichern svg{width:17px;height:17px;flex:none}
.sr-admin-workspace .sr-verwaltung .vw-benutzer-aktionen .vw-zeilenmenue>summary{min-height:40px}

@media(max-width:1100px){
  .sr-admin-workspace .sr-verwaltung .vw-konto-editor-form{grid-template-columns:1fr}
  .sr-admin-workspace .sr-verwaltung .vw-konto-editor-form .vw-editor-speichern{justify-self:start}
}

/* Mandanten: Name und Slug bilden eine Einheit; Umfang und Tarif bleiben als
 * schnell lesbare Hauptspalten. Technische Angaben öffnen sich am Datensatz. */
.sr-admin-workspace .sr-verwaltung .vw-mandanten-tabelle{overflow:visible}
.sr-admin-workspace .sr-verwaltung .vw-mandanten-tabelle table{min-width:700px}
.sr-admin-workspace .sr-verwaltung .vw-mandanten-tabelle :is(th,td).sr-wahl-spalte{width:40px}
.sr-admin-workspace .sr-verwaltung .vw-mandant-person{min-width:210px;white-space:normal}
.sr-admin-workspace .sr-verwaltung .vw-mandant-identitaet>strong{display:block;font-weight:700;overflow-wrap:anywhere}
.sr-admin-workspace .sr-verwaltung .vw-mandant-identitaet .mono{margin-top:3px}
.sr-admin-workspace .sr-verwaltung .vw-mandant-umfang{width:160px}
.sr-admin-workspace .sr-verwaltung .vw-mandant-mengen{display:flex;flex-wrap:wrap;gap:5px 12px;line-height:1.4}
.sr-admin-workspace .sr-verwaltung .vw-mandant-mengen>span{white-space:nowrap}
.sr-admin-workspace .sr-verwaltung .vw-mandant-tarif{position:relative;width:230px;min-width:0;white-space:normal}
.sr-admin-workspace .sr-verwaltung .vw-mandant-aktionen{position:relative;width:92px}
.sr-admin-workspace .sr-verwaltung .vw-tarif-zelle{display:flex;align-items:center;flex-wrap:wrap;gap:6px 10px;white-space:normal}
.sr-admin-workspace .sr-verwaltung .vw-tarif-editor-inhalt,
.sr-admin-workspace .sr-verwaltung .vw-mandant-details-inhalt{position:absolute;top:calc(100% + 4px);right:0;z-index:40;display:grid;gap:12px;width:min(360px,calc(100vw - 32px));padding:14px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-surface);box-shadow:var(--e2)}
.sr-admin-workspace .sr-verwaltung .vw-tarif-editor-inhalt .vw-aktion{display:flex;align-items:center;flex-wrap:wrap;gap:6px}
.sr-admin-workspace .sr-verwaltung .vw-tarif-editor-inhalt select{width:min(220px,100%);min-width:0}
.sr-admin-workspace .sr-verwaltung .vw-mandant-name-form{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:10px;padding-top:10px;border-top:1px solid var(--sr-hair)}
.sr-admin-workspace .sr-verwaltung .vw-mandant-name-form .feld{min-width:0;margin:0}
.sr-admin-workspace .sr-verwaltung .vw-detailwerte{display:grid;gap:8px;margin:0}
.sr-admin-workspace .sr-verwaltung .vw-detailwerte>div{display:grid;grid-template-columns:minmax(110px,.45fr) minmax(0,1fr);gap:10px}
.sr-admin-workspace .sr-verwaltung .vw-detailwerte :is(dt,dd){margin:0}
.sr-admin-workspace .sr-verwaltung .vw-detailwerte dt{color:var(--sr-mut);font-size:var(--fs-label);font-weight:600}
.sr-admin-workspace .sr-verwaltung .vw-zuordnung-form{display:grid;grid-template-columns:minmax(150px,1fr) auto;gap:6px;width:100%}
.sr-admin-workspace .sr-verwaltung .vw-zuordnung-form select{width:100%;min-width:0}

/* Rechte: die Matrix ist die einzige waagerecht rollende Fläche. Rollen und
 * Funktion bleiben dabei sichtbar und jeder Zustand trägt ein Wort. */
.sr-admin-workspace .sr-verwaltung .vw-scroll-hinweis{margin:0 0 8px;color:var(--sr-mut);font-size:var(--fs-label)}
.sr-admin-workspace .sr-verwaltung .vw-rechte-scroll{max-width:100%;max-height:min(68vh,720px);overflow:auto;overscroll-behavior:contain;border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl)}
.sr-admin-workspace .sr-verwaltung .vw-rechte-scroll:focus-visible{outline:2px solid var(--focus-ton);outline-offset:2px}
.sr-admin-workspace .sr-verwaltung .vw-rechte-scroll table{min-width:860px;margin:0}
.sr-admin-workspace .sr-verwaltung .vw-rechte-scroll thead th{position:sticky;top:0;z-index:4;background:var(--sr-surface)}
.sr-admin-workspace .sr-verwaltung .vw-rechte-scroll :is(thead th:first-child,td:first-child){position:sticky;left:0;z-index:3;background:var(--sr-surface);box-shadow:1px 0 var(--sr-hair)}
.sr-admin-workspace .sr-verwaltung .vw-rechte-scroll thead th:first-child{z-index:5}
.sr-admin-workspace .sr-verwaltung .vw-recht-gruppe th{padding:10px 16px;background:var(--sr-soft);color:var(--sr-ink);font-size:var(--fs-label);letter-spacing:.02em;text-align:left}
.sr-admin-workspace .sr-verwaltung .vw-recht-funktion{min-width:340px;white-space:normal}
.sr-admin-workspace .sr-verwaltung .vw-recht-label{display:block;font-weight:700}
.sr-admin-workspace .sr-verwaltung .vw-recht-effekt{margin-top:3px;max-width:52ch}
.sr-admin-workspace .sr-verwaltung .vw-recht-technik{margin-top:5px}
.sr-admin-workspace .sr-verwaltung .vw-recht-technik>summary{color:var(--sr-mut);font-size:var(--fs-label);cursor:pointer}
.sr-admin-workspace .sr-verwaltung .vw-recht-code{display:block;margin-top:4px;padding:0;border:0;background:none;color:var(--sr-mut);font-size:var(--fs-label);overflow-wrap:anywhere}
.sr-admin-workspace .sr-verwaltung .vw-recht-schalter{width:170px;min-width:170px;vertical-align:middle}
.sr-admin-workspace .sr-verwaltung .vw-recht-schalter .vw-aktion{display:inline-flex}
.sr-admin-workspace .sr-verwaltung .vw-recht-wert{display:inline-flex;align-items:center;justify-content:flex-start;gap:7px;min-width:108px;min-height:36px;padding:4px 8px;border-radius:var(--sr-r-ctl);font-weight:600;white-space:nowrap}
.sr-admin-workspace .sr-verwaltung button.vw-recht-wert{width:auto}
.sr-admin-workspace .sr-verwaltung .vw-recht-wert svg{width:17px;height:17px;flex:none}
.sr-admin-workspace .sr-verwaltung .vw-recht-wert--geschuetzt{color:var(--sr-mut);background:var(--sr-soft)}

/* Audit: eine Filterzeile, danach vier lesbare Hauptspalten. IP und komplette
 * Rohangaben bleiben im aufklappbaren Detail erreichbar. */
.sr-admin-workspace .sr-verwaltung .vw-audit-filter{display:grid;grid-template-columns:minmax(180px,.7fr) minmax(260px,1.4fr) auto auto;align-items:end;gap:10px 16px;margin:0 0 10px}
.sr-admin-workspace .sr-verwaltung .vw-audit-filter .feld{min-width:0;margin:0}
.sr-admin-workspace .sr-verwaltung .vw-audit-filter :is(.feld-eingabe,.knopf){min-height:40px}
.sr-admin-workspace .sr-verwaltung .vw-audit-filterstand{margin:0 0 16px;color:var(--sr-mut);font-size:var(--fs-label);overflow-wrap:anywhere}
.sr-admin-workspace .sr-verwaltung .vw-audit-tabelle table{min-width:720px}
.sr-admin-workspace .sr-verwaltung .vw-audit-zeit{width:150px;white-space:normal}
.sr-admin-workspace .sr-verwaltung .vw-audit-aktion{display:block;overflow-wrap:anywhere;white-space:normal}
.sr-admin-workspace .sr-verwaltung .vw-audit-detail{width:220px}
.sr-admin-workspace .sr-verwaltung .vw-audit-details pre{max-width:100%;margin:8px 0 0;padding:10px;border-radius:var(--sr-r-ctl);background:var(--sr-soft);font:inherit;font-family:var(--font-mono);font-size:var(--fs-label);line-height:1.5;white-space:pre-wrap}
.sr-admin-workspace .sr-verwaltung .vw-audit-details p{margin:8px 0 0;color:var(--sr-mut);font-size:var(--fs-label)}

/* Darstellung: Formulargruppen liegen flach in einer Hauptfläche. Die
 * bestehende Vorschau und ihre wirksamen Werte bleiben unverändert. */
.sr-admin-workspace :is(#darstellung,#darstellung-charts,#darstellung-hintergrund,#darstellung-auftritt,#darstellung-mails) .sr-verwaltung>.sr-karte,
.sr-admin-workspace #darstellung .vw-dst-spalte>.sr-karte{border:0;border-bottom:1px solid var(--sr-hair);border-radius:0;background:transparent;box-shadow:none}
.sr-admin-workspace :is(#darstellung,#darstellung-charts,#darstellung-hintergrund,#darstellung-auftritt,#darstellung-mails) .sr-verwaltung>.sr-karte:last-child,
.sr-admin-workspace #darstellung .vw-dst-spalte>.sr-karte:last-child{border-bottom:0}

@media(max-width:960px){
  .sr-admin-workspace .sr-verwaltung :is(.vw-benutzer-tabelle,.vw-mandanten-tabelle,.vw-audit-tabelle){overflow:visible}
  .sr-admin-workspace .sr-verwaltung :is(.vw-benutzer-tabelle,.vw-mandanten-tabelle,.vw-audit-tabelle) table{display:block;min-width:0}
  .sr-admin-workspace .sr-verwaltung :is(.vw-benutzer-tabelle,.vw-mandanten-tabelle,.vw-audit-tabelle) thead{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
  .sr-admin-workspace .sr-verwaltung :is(.vw-benutzer-tabelle,.vw-mandanten-tabelle,.vw-audit-tabelle) tbody{display:grid;gap:10px}
  .sr-admin-workspace .sr-verwaltung :is(.vw-benutzer-tabelle,.vw-mandanten-tabelle,.vw-audit-tabelle) tr{display:grid;align-items:start;gap:8px 12px;padding:12px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-surface)}
  .sr-admin-workspace .sr-verwaltung :is(.vw-benutzer-tabelle,.vw-mandanten-tabelle,.vw-audit-tabelle) td{display:block;width:auto;min-width:0;height:auto;padding:0;border:0;background:transparent!important;text-align:left}
  .sr-admin-workspace .sr-verwaltung .vw-mobile-label{display:block;margin-bottom:2px}

  .sr-admin-workspace .sr-verwaltung .vw-benutzer-tabelle tr{grid-template-columns:32px minmax(0,1fr) auto}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-tabelle .sr-wahl-spalte{grid-column:1;grid-row:1/4;padding-top:4px}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-person{grid-column:2;grid-row:1}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-rolle{grid-column:2;grid-row:2}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-status{grid-column:3;grid-row:2}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-login{grid-column:2/4;grid-row:3}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-aktionen{grid-column:3;grid-row:1}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-aktionen .vw-mobile-label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
  .sr-admin-workspace .sr-verwaltung .vw-person-meta{margin-top:6px}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-person:has(.vw-konto-editor[open]){grid-column:2/4}

  .sr-admin-workspace .sr-verwaltung .vw-mandanten-tabelle tr{grid-template-columns:32px minmax(0,1fr) auto}
  .sr-admin-workspace .sr-verwaltung .vw-mandanten-tabelle .sr-wahl-spalte{grid-column:1;grid-row:1/4;padding-top:4px}
  .sr-admin-workspace .sr-verwaltung .vw-mandanten-tabelle .vw-mandant-person{grid-column:2;grid-row:1}
  .sr-admin-workspace .sr-verwaltung .vw-mandanten-tabelle .vw-mandant-umfang{grid-column:2;grid-row:2}
  .sr-admin-workspace .sr-verwaltung .vw-mandanten-tabelle .vw-mandant-tarif{grid-column:2/4;grid-row:3}
  .sr-admin-workspace .sr-verwaltung .vw-mandanten-tabelle .vw-mandant-aktionen{grid-column:3;grid-row:1}
  .sr-admin-workspace .sr-verwaltung .vw-mandanten-tabelle tr:not(:has(.sr-wahl-spalte)) .vw-mandant-person{grid-column:1/3}
  .sr-admin-workspace .sr-verwaltung .vw-mandanten-tabelle tr:not(:has(.sr-wahl-spalte)) .vw-mandant-umfang{grid-column:1/3}
  .sr-admin-workspace .sr-verwaltung .vw-mandanten-tabelle tr:not(:has(.sr-wahl-spalte)) .vw-mandant-tarif{grid-column:1/4}
  .sr-admin-workspace .sr-verwaltung :is(.vw-tarif-editor-inhalt,.vw-mandant-details-inhalt){position:static;width:100%;margin-top:8px;box-shadow:none}
  .sr-admin-workspace .sr-verwaltung .vw-mandant-aktionen:has(.vw-mandant-details[open]){grid-column:1/-1;grid-row:4}

  .sr-admin-workspace .sr-verwaltung .vw-audit-filter{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  .sr-admin-workspace .sr-verwaltung .vw-audit-filter :is(button,a){min-height:44px}
  .sr-admin-workspace .sr-verwaltung .vw-audit-tabelle tr{grid-template-columns:minmax(130px,.7fr) minmax(0,1fr)}
  .sr-admin-workspace .sr-verwaltung .vw-audit-zeit{grid-column:1;grid-row:1}
  .sr-admin-workspace .sr-verwaltung .vw-audit-aktion{grid-column:2;grid-row:1}
  .sr-admin-workspace .sr-verwaltung .vw-audit-konto{grid-column:1/-1;grid-row:2}
  .sr-admin-workspace .sr-verwaltung .vw-audit-konto::before{content:'Konto';display:block;margin-bottom:2px;color:var(--sr-mut);font-size:var(--fs-label);font-weight:600}
  .sr-admin-workspace .sr-verwaltung .vw-audit-detail{grid-column:1/-1;grid-row:3}
}

@media(max-width:559px){
  .sr-admin-workspace .sr-verwaltung :is(.vw-benutzer-tabelle,.vw-mandanten-tabelle) tr{grid-template-columns:44px minmax(0,1fr) auto}
  .sr-admin-workspace .sr-verwaltung :is(.vw-konto-editor>summary,.vw-tarif-editor>summary,.vw-mandant-details>summary,.vw-audit-details>summary,.vw-zeilenmenue>summary){min-height:44px}
  .sr-admin-workspace .sr-verwaltung :is(.vw-menue-aktion,.vw-recht-wert){min-height:44px}
  .sr-admin-workspace .sr-verwaltung .vw-konto-editor-form,
  .sr-admin-workspace .sr-verwaltung .vw-mandant-name-form,
  .sr-admin-workspace .sr-verwaltung .vw-zuordnung-form{grid-template-columns:1fr}
  .sr-admin-workspace .sr-verwaltung .vw-konto-editor-form :is(.feld-eingabe,.knopf),
  .sr-admin-workspace .sr-verwaltung .vw-mandant-name-form :is(.feld-eingabe,.knopf){min-height:44px;width:100%}
  .sr-admin-workspace .sr-verwaltung .vw-wahlziel{width:44px;height:44px}
  .sr-admin-workspace .sr-verwaltung :is(.vw-zuordnung-form,.vw-tarif-editor-inhalt) :is(.feld-eingabe,.sr-ikon-knopf,.knopf){min-height:44px}
  .sr-admin-workspace .sr-verwaltung :is(.vw-zuordnung-form,.vw-tarif-editor-inhalt) .sr-ikon-knopf{width:44px;height:44px}
  .sr-admin-workspace .sr-verwaltung .vw-detailwerte>div{grid-template-columns:1fr;gap:2px}
  .sr-admin-workspace .sr-verwaltung .vw-audit-filter{grid-template-columns:1fr}
  .sr-admin-workspace .sr-verwaltung .vw-audit-tabelle tr{grid-template-columns:1fr}
  .sr-admin-workspace .sr-verwaltung .vw-audit-tabelle :is(.vw-audit-zeit,.vw-audit-aktion,.vw-audit-konto,.vw-audit-detail){grid-column:1;grid-row:auto}
  .sr-admin-workspace .sr-verwaltung .sr-auswahl-leiste{max-width:100%;padding-block:8px}
}

@media(prefers-reduced-motion:reduce){
  .sr-admin-workspace .sr-verwaltung :is(.vw-konto-editor,.vw-tarif-editor,.vw-mandant-details,.vw-audit-details)>summary::after{transition:none}
}

@media(max-width:559px){
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-tabelle tr{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;padding:14px}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-tabelle .sr-wahl-spalte{grid-column:1;grid-row:1;padding:0}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-tabelle .vw-benutzer-aktionen{grid-column:2;grid-row:1;justify-self:end;width:auto}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-tabelle .vw-benutzer-person{grid-column:1/-1;grid-row:2;width:auto;min-width:0}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-tabelle .vw-benutzer-person:has(.vw-konto-editor[open]){grid-column:1/-1}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-tabelle .vw-benutzer-rolle{grid-column:1;grid-row:3;width:auto}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-tabelle .vw-benutzer-status{grid-column:2;grid-row:3;width:auto}
  .sr-admin-workspace .sr-verwaltung .vw-benutzer-tabelle .vw-benutzer-login{grid-column:1/-1;grid-row:4;width:auto}
  .sr-admin-workspace .sr-verwaltung .vw-person-meta{display:grid;gap:4px;margin-top:8px}
}


/* ---- verwaltung-projekt.css ---- */
/* Projektverwaltung und globale Anbindungen.
 * Die Regeln sind auf die neuen Wurzeln begrenzt und verwenden ausschließlich
 * die vorhandenen Theme-Variablen. */

.vp,.anb-seite{min-width:0}
.vp :is(a,.mono),.anb-seite :is(a,.mono){overflow-wrap:anywhere;word-break:break-word}
.vp :is(button,a,input,select,textarea,summary):focus-visible,
.anb-seite :is(button,a,input,select,textarea,summary):focus-visible{outline:2px solid var(--focus-ton,var(--sr-acc-line));outline-offset:2px}
.vp .feld-eingabe,.anb-seite .feld-eingabe{min-height:40px}
.vp .sr-karte{overflow:visible}
.vp .sr-karte-koerper{min-width:0}

/* Allgemein: ein Formularbereich und eine schmale Stammdatenleiste. */
.vp-allgemein-raster{display:grid;grid-template-columns:minmax(0,720px) minmax(240px,320px);gap:38px;align-items:start}
.vp-allgemein-form{display:grid;gap:26px;min-width:0}
.vp-allgemein-haupt,.vp-betrieb{min-width:0}
.vp-betrieb{padding-top:26px;border-top:1px solid var(--sr-hair)}
.vp-abschnitt-kopf{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:16px}
.vp-abschnitt-kopf h3{margin:0;font-size:17px;line-height:1.25;color:var(--sr-ink)}
.vp-abschnitt-kopf p{margin:6px 0 0;color:var(--sr-mut);font-size:13px;line-height:1.5}
.vp-gilt{margin:0;color:var(--sr-mut);font-size:13px}
.vp #pe-titel .sr-anlegen-form{display:grid;grid-template-columns:1fr;gap:16px;max-width:720px;margin:16px 0 0}
.vp #pe-betrieb .kosten-formulare{margin:16px 0 0}
.vp #pe-betrieb .kosten-inline-form{display:flex;align-items:center;flex-flow:row wrap;gap:16px;min-width:0}
.vp-stammdaten{min-width:0;padding-left:26px;border-left:1px solid var(--sr-hair)}
.vp-stammdaten dl{margin:0}
.vp-stammdaten dl>div{padding:10px 0;border-bottom:1px solid var(--sr-hair)}
.vp-stammdaten dt{color:var(--sr-mut);font-size:11.5px;line-height:1.4}
.vp-stammdaten dd{margin:4px 0 0;color:var(--sr-ink);font-size:13px;line-height:1.45;overflow-wrap:anywhere}
.vp-stammdaten .app-fuss{margin:18px 0 0}

/* Formzustand und Kontext. */
.vp-speicherzeile{display:flex;align-items:center;justify-content:space-between;gap:16px;grid-column:1 / -1;padding-top:16px;border-top:1px solid var(--sr-hair)}
.vp-form-status{color:var(--sr-mut);font-size:12.5px;line-height:1.45}
.vp-form-status[data-status="geaendert"]{color:var(--sr-ink);font-weight:600}
.vp-form-status[data-status="speichert"]{color:var(--sr-acc-ink);font-weight:600}
.vp-kontext-stand{display:flex;flex-wrap:wrap;gap:10px 22px;align-items:center;margin:0 0 16px;padding:12px 0;border-block:1px solid var(--sr-hair);font-size:12.5px;color:var(--sr-mut)}
.vp-kontext-stand strong{color:var(--sr-ink);font-variant-numeric:tabular-nums}
.vp .pk-form{display:grid;grid-template-columns:1fr;gap:26px;max-width:760px;margin:0}
.vp .pk-feld{gap:6px}
.vp .pk-feld-erklaerung{min-height:0;max-width:72ch}
.vp .pk-feld textarea{box-sizing:border-box;width:100%;min-height:120px;max-height:none;overflow-y:hidden;resize:vertical;line-height:1.55}
.vp .pk-feld:first-of-type textarea{min-height:168px}
.vp .pk-marke{font-size:11px;letter-spacing:.04em;text-transform:none}
.vp .pk-abschnitt{padding:16px 0;margin:0;border:0;border-bottom:1px solid var(--sr-hair);border-radius:0;background:transparent;box-shadow:none}
.vp .pk-form-abschnitt textarea{min-height:120px;max-height:none;overflow-y:hidden}

/* Verantwortliche und Aufnahmeauswahl. */
.vp #pe-verantwortliche .sr-tabelle{min-width:720px}
.vp #pe-verantwortliche .sr-name-zelle{min-width:230px;white-space:normal}
.vp-person-kontakt,.vp-person-art{display:block;margin-top:4px;color:var(--sr-mut);font-size:12px;line-height:1.4;overflow-wrap:anywhere}
.vp #pe-verantwortliche .kosten-inline-form{display:flex;align-items:center;flex-wrap:wrap;gap:8px;min-width:0}
.vp #pe-verantwortliche .kosten-inline-form .feld-eingabe{max-width:180px}
.vp-aufnahme-editor{margin-top:26px;padding-top:22px;border-top:1px solid var(--sr-hair)}
.vp-aufnahme-editor>summary{display:inline-flex;align-items:center;min-height:44px;padding:0 16px;border-radius:6px;background:var(--knopf-blau);color:var(--auf-knopf);font-size:13px;font-weight:700;cursor:pointer;list-style:none}
.vp-aufnahme-editor>summary::-webkit-details-marker{display:none}
.vp-aufnahme-editor-inhalt{padding-top:22px}
.vp-aufnahme-auswahl{display:flex;flex-wrap:wrap;gap:10px 24px;margin:0 0 22px;padding:0;border:0}
.vp-aufnahme-auswahl legend{width:100%;margin-bottom:6px;font-size:13px;font-weight:600}
.vp-aufnahme-auswahl label{display:flex;align-items:center;gap:9px;min-height:44px;cursor:pointer}
.vp-aufnahme-auswahl input{width:18px;height:18px;margin:0;accent-color:var(--knopf-blau)}
.vp .pe-v-wege{grid-template-columns:repeat(2,minmax(0,1fr));gap:32px}
.vp[data-vp-js] [data-vp-aufnahme-panel][hidden]{display:none}

/* Messung: drei Fachgruppen in einer Hauptfläche. */
.vp-mess-gruppen{display:grid;gap:0}
.vp-mess-gruppe{padding:26px 0;border-top:1px solid var(--sr-hair)}
.vp-mess-gruppe:first-child{padding-top:0;border-top:0}
.vp-mess-gruppe-kopf{display:flex;align-items:baseline;justify-content:space-between;gap:16px;margin-bottom:6px}
.vp-mess-gruppe-kopf h3{margin:0;font-size:17px;line-height:1.25}
.vp-mess-gruppe-kopf>span{color:var(--sr-mut);font-size:12.5px;text-align:right}
.vp-mess-feld{padding:16px 0;border-bottom:1px solid var(--sr-hair)}
.vp-mess-feld:last-of-type{border-bottom:0}
.vp-mess-feld-kopf{display:grid;grid-template-columns:minmax(220px,1.2fr) minmax(180px,1fr) minmax(150px,.8fr);gap:16px;align-items:start}
.vp-mess-feld-kopf h4{margin:0;font-size:13px;line-height:1.4}
.vp-mess-feld-kopf p{margin:5px 0 0;max-width:56ch;color:var(--sr-mut);font-size:12px;line-height:1.5}
.vp-mess-wert{font-size:13px;line-height:1.5;overflow-wrap:anywhere}
.vp-mess-quelle{display:flex;flex-direction:column;align-items:flex-start;gap:6px}
.vp-mess-quelle>span{color:var(--sr-mut);font-size:11.5px;line-height:1.4}
.vp-mess-zustaendig{margin:9px 0 0;color:var(--sr-mut);font-size:12px}
.vp-zeileneditor{margin-top:8px}
.vp-zeileneditor>summary{display:inline-flex;align-items:center;min-height:44px;color:var(--sr-acc-ink);font-size:12.5px;font-weight:600;cursor:pointer}
.vp-zeileneditor-inhalt{max-width:720px;padding:14px 0 4px}
.vp-zeileneditor .sr-anlegen-form{grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:16px}
.vp-zeileneditor .kosten-inline-form{margin-top:10px}
.vp-mess-zeit{display:flex;flex-wrap:wrap;justify-content:space-between;gap:6px 16px;margin-top:12px;padding:12px 14px;border-radius:6px;background:var(--sr-soft);font-size:12.5px}
.vp-mess-zeit span{color:var(--sr-mut)}

/* Benachrichtigungen: Anlässe statt leerer Kanalspalten. */
.vp .pe-b-kanalstatus{display:flex;flex-wrap:wrap;gap:10px 26px;padding:0 0 18px;margin:0;border-bottom:1px solid var(--sr-hair)}
.vp .pe-b-kanalstatus>div{display:grid;grid-template-columns:auto auto;gap:3px 8px;align-items:center}
.vp .pe-b-kanalstatus>div>span:last-child:not(.sr-badge){grid-column:1 / -1;width:auto}
.vp-anlass-liste{display:grid}
.vp-anlass{border-bottom:1px solid var(--sr-hair)}
.vp-anlass:last-child{border-bottom:0}
.vp-anlass>summary{display:grid;grid-template-columns:minmax(0,1fr) auto 12px;gap:16px;align-items:center;width:100%;max-width:none;box-sizing:border-box;min-height:64px;padding:12px 0;cursor:pointer;list-style:none}
.vp-anlass>summary::-webkit-details-marker{display:none}
.vp-anlass-name{display:grid;gap:3px;min-width:0}
.vp-anlass-name>span{color:var(--sr-mut);font-size:12px;line-height:1.4}
.vp-anlass-status{display:flex;gap:16px;font-size:12.5px;white-space:nowrap}
.vp-anlass-status>span:last-child{color:var(--sr-acc-ink)}
.vp .pe-b-editor-inhalt{padding:20px 0 26px;margin:0;border-top:1px solid var(--sr-hair)}
.vp-getrennte-posts{margin:0 0 18px;color:var(--sr-mut);font-size:12px;line-height:1.5}
.vp .pe-b-kanaele{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,340px),1fr));gap:32px}
.vp-kanal{display:grid;gap:18px;min-width:0}
.vp-kanal+.vp-kanal{padding-left:32px;border-left:1px solid var(--sr-hair)}
.vp .pe-b-kanal-kopf{padding-bottom:10px;border-bottom:1px solid var(--sr-hair)}
.vp .pe-b-empfaenger{display:grid;grid-template-columns:1fr;gap:16px;margin:0;min-width:0}
.vp .pe-b-empfaenger h5,.vp-kanal-schalter h5{margin:0;font-size:13px}
.vp .pe-b-haken{max-height:none;overflow:visible}
.vp .pe-b-haken>.app-fuss{margin:0;padding:0;border:0;font-size:12px;line-height:1.5}
.vp-kanal-schalter{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-top:16px;border-top:1px solid var(--sr-hair)}
.vp-kanal-schalter p{margin:4px 0 0;color:var(--sr-mut);font-size:11.5px;line-height:1.45}
.vp-kanal-schalter .kosten-inline-form{min-width:0}
.vp-kanal-schalter .sr-schalter{min-height:36px;box-shadow:none}
.vp-kanal-schalter .sr-schalter--aus{padding:2px 2px 2px 10px;border:1px solid var(--sr-hair);background:transparent;color:var(--sr-mut)}
.vp-kanal-schalter .sr-schalter--aus .sr-schalter-knauf{order:2;border:2px solid var(--sr-mut);background:transparent;box-shadow:none}
.vp-kanal-schalter .sr-schalter--aus:hover{background:var(--sr-soft)}
.vp .pe-b-verlauf{margin-top:26px;padding-top:20px}
.vp .pe-b-verlauf .sr-tabelle-wrap{max-width:100%}
.vp .pe-b-verlauf td{height:auto!important;white-space:normal;overflow-wrap:anywhere}

/* Kosten und Berichtspläne. */
.vp-kosten-status{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px}
.vp-kosten-status>div{display:grid;gap:4px;min-width:0}
.vp-kosten-status strong{font-size:20px;line-height:1.2;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}
.vp-kosten-status span{color:var(--sr-mut);font-size:11.5px;line-height:1.45}
.vp-kosten-pegel{margin-top:18px;padding-top:18px;border-top:1px solid var(--sr-hair)}
.vp #pe-kosten-steuerung .kosten-formulare{display:grid;grid-template-columns:repeat(4,minmax(150px,1fr));gap:20px 16px;align-items:end}
.vp #pe-kosten-steuerung .kosten-inline-form{min-width:0}
.vp #pe-kosten-steuerung .kosten-inline-form .feld-eingabe{width:100%;max-width:none}
.vp #pe-kosten-dienste .pe-dienst-form>td{height:auto}
.vp-bericht-plaene{display:grid}
.vp-bericht-plan{padding:26px 0;border-bottom:1px solid var(--sr-hair)}
.vp-bericht-plan:last-child{border-bottom:0}
.vp-bericht-kopf{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:16px}
.vp-bericht-kopf h3{margin:0;font-size:17px}
.vp-bericht-status{display:flex;flex-wrap:wrap;gap:18px 38px;margin:0 0 20px}
.vp-bericht-status>div{display:grid;gap:4px}
.vp-bericht-status dt,.vp-bericht-felder .feld-label{color:var(--sr-mut);font-size:11.5px}
.vp-bericht-status dd{margin:0;font-size:14px;font-weight:600;font-variant-numeric:tabular-nums}
.vp-bericht-felder{display:grid;grid-template-columns:minmax(240px,1fr) auto auto;gap:16px 28px;align-items:end}
.vp-bericht-felder>div{display:grid;gap:8px;min-width:0}
.vp-bericht-felder .berichte-schalter{min-height:44px;align-items:center}
.vp-bericht-felder .sr-inline-name{min-height:44px}

/* Anbindungen: Auswahl, vier klare Spalten und erreichbare Aktionen. */
.anb-seite>.lead{max-width:84ch}
.vp-anb-dienstwahl{display:flex;flex-wrap:wrap;gap:8px;margin:22px 0}
.vp-anb-dienstwahl .knopf{min-height:44px}
.vp-anb-dienstwahl .knopf[aria-pressed="true"]{background:var(--knopf-blau);color:var(--auf-knopf)}
.anb-seite[data-vp-js] [data-vp-anb-dienst][hidden]{display:none}
.anb-seite .anb-dienst{margin-bottom:20px}
.anb-seite .anb-datenstand{display:grid;gap:4px;min-width:0}
.anb-seite .anb-datenstand strong{font-size:12.5px;font-weight:600;line-height:1.4}
.anb-seite .anb-datenstand .anb-grund{margin:0;white-space:normal;overflow-wrap:anywhere}
.anb-seite .anb-projekt-tabelle{width:100%;min-width:680px;table-layout:fixed}
.anb-seite .anb-projekt-tabelle th:nth-child(1){width:27%}
.anb-seite .anb-projekt-tabelle th:nth-child(2){width:18%}
.anb-seite .anb-projekt-tabelle th:nth-child(3){width:37%}
.anb-seite .anb-projekt-tabelle th:nth-child(4){width:18%}
.anb-seite .anb-projekt-tabelle :is(th,td){height:auto;white-space:normal;overflow-wrap:anywhere}
.anb-seite .anb-projekt-tabelle .anb-zeile-meta{display:block;margin-top:5px;font-size:11.5px;line-height:1.4}
.anb-seite .vp-anb-aktion-zelle{text-align:right}
.anb-seite .vp-anb-aktion{min-width:76px;max-width:none;min-height:40px;white-space:nowrap;word-break:normal;overflow-wrap:normal}
.anb-seite .anb-panel{max-width:720px;margin:10px 0 4px 26px;padding:18px 0 4px 20px;border:0;border-left:2px solid var(--sr-acc-line);border-radius:0;background:transparent;box-shadow:none}
.anb-seite .anb-projekt-mehr{min-height:44px}
.anb-seite .anb-tabelle{width:100%;table-layout:fixed}
.anb-seite .anb-tabelle th:nth-child(1){width:25%}
.anb-seite .anb-tabelle th:nth-child(2){width:19%}
.anb-seite .anb-tabelle th:nth-child(3){width:25%}
.anb-seite .anb-tabelle th:nth-child(4){width:31%}
.anb-seite .anb-tabelle :is(th,td){height:auto;white-space:normal;overflow-wrap:anywhere}

/* Eingebettete Projektansicht: jeder Dienst als eigenstaendige, luftige Karte. */
.anb-projekt-dienste{margin-bottom:22px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:22px;min-width:0}
.anb-projekt-dienst{min-width:0}
.anb-projekt-dienst>.sr-karte{display:flex;flex-direction:column;height:100%;min-width:0;box-sizing:border-box}
.anb-projekt-dienst .sr-karte-kopf{align-items:flex-start;gap:18px}
.anb-projekt-dienst .sr-karte-titel{min-width:0;overflow-wrap:anywhere}
.anb-projekt-dienst .sr-karte-koerper{display:flex;flex:1;flex-direction:column;min-width:0}
.anb-projekt-dienst-nutzen{margin:0;color:var(--sr-ink);font-size:13.5px;line-height:1.55}
.anb-projekt-dienst-hinweis{margin:10px 0 0;color:var(--sr-mut);font-size:12px;line-height:1.5}
.anb-projekt-dienst-stand{display:grid;gap:10px;margin:20px 0 0;padding-top:16px;border-top:1px solid var(--sr-hair)}
.anb-projekt-dienst-stand>div{display:grid;grid-template-columns:100px minmax(0,1fr);gap:14px;align-items:baseline}
.anb-projekt-dienst-stand dt{color:var(--sr-mut);font-size:11.5px;line-height:1.4}
.anb-projekt-dienst-stand dd{min-width:0;margin:0;color:var(--sr-ink);font-size:12.5px;font-weight:600;line-height:1.45;overflow-wrap:anywhere;word-break:break-word}
.anb-projekt-dienst-einrichtung{margin-top:auto;padding-top:20px}
.anb-projekt-dienst-einrichtung>summary{display:inline-flex;align-items:center;min-height:40px;padding:0 14px;border-radius:6px;background:var(--knopf-blau);color:var(--auf-knopf);font-size:12.5px;font-weight:700;cursor:pointer;list-style:none}
.anb-projekt-dienst-einrichtung>summary::-webkit-details-marker{display:none}
.anb-projekt-dienst-form{min-width:0;margin-top:18px;padding-top:18px;border-top:1px solid var(--sr-hair)}
.anb-projekt-dienst-form :is(input,select,textarea){max-width:100%;box-sizing:border-box}
.anb-projekt-dienst-form .mono,.anb-projekt-dienst-form code{overflow-wrap:anywhere;word-break:break-word}

@media(max-width:980px){
  .vp-allgemein-raster{grid-template-columns:1fr;gap:26px}
  .vp-stammdaten{padding:26px 0 0;border-left:0;border-top:1px solid var(--sr-hair)}
  .vp-mess-feld-kopf{grid-template-columns:minmax(200px,1fr) minmax(170px,.8fr)}
  .vp-mess-quelle{grid-column:1 / -1;flex-direction:row;align-items:center;flex-wrap:wrap}
  .vp-kosten-status{grid-template-columns:repeat(2,minmax(0,1fr))}
  .vp #pe-kosten-steuerung .kosten-formulare{grid-template-columns:repeat(2,minmax(0,1fr))}
  .vp-bericht-felder{grid-template-columns:minmax(220px,1fr) repeat(2,auto)}
  .anb-projekt-dienste{grid-template-columns:1fr}
}

@media(max-width:700px){
  .vp .feld-eingabe,.anb-seite .feld-eingabe{min-height:44px}
  .vp .knopf,.anb-seite .knopf,.vp .sr-ikon-knopf,.anb-seite .sr-ikon-knopf{min-height:44px}
  .vp-kanal-schalter .sr-schalter{min-height:44px}
  .vp-speicherzeile{position:sticky;bottom:0;z-index:5;margin-inline:-12px;padding:10px 12px;background:var(--sr-surface);box-shadow:0 -8px 18px color-mix(in srgb,var(--sr-ink) 8%,transparent)}
  .vp-speicherzeile .knopf{flex:none}
  .vp-kontext-stand{align-items:flex-start;flex-direction:column;gap:8px}
  .vp .pk-feld textarea{min-height:120px}
  .vp .pe-v-wege{grid-template-columns:1fr}
  .vp .pe-v-weg+.pe-v-weg{padding:24px 0 0;border:0;border-top:1px solid var(--sr-hair)}
  .vp #pe-verantwortliche .sr-tabelle-wrap{overflow:visible;border:0;box-shadow:none}
  .vp #pe-verantwortliche .sr-tabelle{display:block;min-width:0}
  .vp #pe-verantwortliche thead{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
  .vp #pe-verantwortliche tbody{display:grid}
  .vp #pe-verantwortliche tr{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px 16px;padding:16px 0;border-bottom:1px solid var(--sr-hair)}
  .vp #pe-verantwortliche td{display:block;width:auto;height:auto!important;padding:0;border:0;background:transparent;white-space:normal}
  .vp #pe-verantwortliche td:first-child{grid-column:1 / -1}
  .vp #pe-verantwortliche td[data-label]::before{display:block;content:attr(data-label);margin-bottom:5px;color:var(--sr-mut);font-size:11.5px}
  .vp-mess-gruppe-kopf{align-items:flex-start;flex-direction:column;gap:5px}
  .vp-mess-gruppe-kopf>span{text-align:left}
  .vp-mess-feld-kopf{grid-template-columns:1fr;gap:10px}
  .vp-mess-quelle{grid-column:auto}
  .vp-zeileneditor .sr-anlegen-form{grid-template-columns:1fr}
  .vp-anlass>summary{grid-template-columns:minmax(0,1fr) 12px;gap:12px}
  .vp-anlass-status{grid-column:1 / -1;grid-row:2;white-space:normal}
  .vp-anlass>summary .pe-b-editor-pfeil{grid-column:2;grid-row:1}
  .vp .pe-b-kanaele{grid-template-columns:1fr}
  .vp-kanal+.vp-kanal{padding:24px 0 0;border-left:0;border-top:1px solid var(--sr-hair)}
  .vp-kanal-schalter{align-items:flex-start;flex-direction:column}
  .vp .pe-b-verlauf :is(table,thead,tbody,tr,th,td){height:auto!important}
  .vp-kosten-status{grid-template-columns:repeat(2,minmax(0,1fr))}
  .vp #pe-kosten-steuerung .kosten-formulare{grid-template-columns:1fr}
  .vp-bericht-status{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
  .vp-bericht-felder{grid-template-columns:1fr;align-items:start}
  .vp-bericht-felder .berichte-schalter{justify-content:flex-start}
  .anb-seite .anb-projekt-tabelle,.anb-seite .anb-tabelle{display:block;min-width:0}
  .anb-seite :is(.anb-projekt-tabelle,.anb-tabelle)>thead{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
  .anb-seite :is(.anb-projekt-tabelle,.anb-tabelle)>tbody{display:grid;width:100%}
  .anb-seite :is(.anb-projekt-tabelle,.anb-tabelle) tr{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px 16px;width:100%;padding:16px 0;border-bottom:1px solid var(--sr-hair)}
  .anb-seite :is(.anb-projekt-tabelle,.anb-tabelle) td{display:block;box-sizing:border-box;width:auto;height:auto!important;padding:0;border:0;background:transparent;white-space:normal}
  .anb-seite :is(.anb-projekt-tabelle,.anb-tabelle) td:first-child{min-width:0}
  .anb-seite .anb-projekt-tabelle td:nth-child(3),.anb-seite .anb-tabelle td:nth-child(3){grid-column:1}
  .anb-seite .anb-projekt-tabelle td:nth-child(4),.anb-seite .anb-tabelle td:nth-child(4){grid-column:2;text-align:right}
  .anb-seite :is(.anb-projekt-tabelle,.anb-tabelle) .drill-detail{display:block;padding:0;border:0}
  .anb-seite :is(.anb-projekt-tabelle,.anb-tabelle) .drill-detail[hidden]{display:none}
  .anb-seite :is(.anb-projekt-tabelle,.anb-tabelle) .drill-detail>td{display:block;width:100%;padding:0}
  .anb-seite .anb-panel{max-width:none;margin:0;padding:18px 0 22px;border-left:0;border-bottom:1px solid var(--sr-hair)}
}

@media(max-width:420px){
  .vp-abschnitt-kopf{align-items:flex-start;flex-direction:column}
  .vp-speicherzeile{align-items:flex-start;flex-direction:column}
  .vp-speicherzeile .knopf{width:100%}
  .vp-aufnahme-auswahl{flex-direction:column;gap:2px}
  .vp-kosten-status,.vp-bericht-status{grid-template-columns:1fr}
  .anb-seite :is(.anb-projekt-tabelle,.anb-tabelle) tr{grid-template-columns:minmax(0,1fr) auto;gap:10px 12px}
}

@media(prefers-reduced-motion:reduce){
  .vp *,.anb-seite *{scroll-behavior:auto!important;transition-duration:0s!important;animation-duration:0s!important;animation-iteration-count:1!important}
}


/* ---- verwaltung-betrieb.css ---- */
/* Kostensteuerung, Tarifvergleich, Datenbankprofil und DBM-Freigaben. */

.kosten-seite .kosten-projektwahl{display:flex;align-items:end;gap:12px;margin:0 0 var(--sr-gap);padding:14px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-surface)}
.kosten-seite .kosten-projektwahl .feld{flex:1 1 360px;max-width:680px;margin:0}
.kosten-seite .kosten-projektwahl .feld-eingabe{width:100%}
.kosten-seite .kosten-projektwahl-status{min-width:0;margin:0;color:var(--sr-mut);font-size:var(--fs-label);overflow-wrap:anywhere}
.kosten-seite [data-kosten-projekt][hidden]{display:none!important}
.kosten-seite .kosten-projekt .kosten-steuerzeile{overflow-wrap:anywhere}
.kosten-seite .kosten-formulare .sr-schalter,.vp .kosten-formulare .sr-schalter{width:auto;min-width:84px;align-self:flex-start;justify-self:start}

.tarif-seite .tarif-aktuell{display:flex;align-items:center;flex-wrap:wrap;gap:8px 12px;margin:0 0 14px;color:var(--sr-mut)}
.tarif-seite .tarif-aktuell>span:first-child{font-size:var(--fs-label);font-weight:600}
.tarif-seite .tarif-mobil{display:none}

.verwaltung-betrieb--datenbank .db-tabellen-kompakt table{width:100%;min-width:720px;table-layout:fixed}
.verwaltung-betrieb--datenbank .db-tabellen-kompakt th:first-child{width:auto}
.verwaltung-betrieb--datenbank .db-tabellen-kompakt :is(th,td):nth-child(2),
.verwaltung-betrieb--datenbank .db-tabellen-kompakt :is(th,td):nth-child(3){width:116px}
.verwaltung-betrieb--datenbank .db-tabellen-kompakt :is(th,td):nth-child(4){width:150px}
.verwaltung-betrieb--datenbank .db-tabellen-kompakt :is(th,td):nth-child(5){width:180px}
.verwaltung-betrieb--datenbank .db-tabellen-name{display:block;font-weight:700;overflow-wrap:anywhere}
.verwaltung-betrieb--datenbank :is(.db-tabellen-details,.db-sql-voll,.db-sql-kennzahlen)>summary{display:inline-flex;align-items:center;min-height:36px;margin-top:5px;color:var(--sr-acc-ink);font-size:var(--fs-label);font-weight:600;cursor:pointer}
.verwaltung-betrieb--datenbank .db-tabellen-details dl{display:grid;gap:7px;margin:8px 0 0;padding:10px;border-radius:var(--sr-r-ctl);background:var(--sr-soft)}
.verwaltung-betrieb--datenbank .db-tabellen-details dl>div{display:grid;grid-template-columns:minmax(120px,.55fr) minmax(0,1fr);gap:8px}
.verwaltung-betrieb--datenbank .db-tabellen-details :is(dt,dd){min-width:0;margin:0;overflow-wrap:anywhere}
.verwaltung-betrieb--datenbank .db-tabellen-details dt{color:var(--sr-mut);font-size:var(--fs-label);font-weight:600}
.verwaltung-betrieb--datenbank .db-sql-text{min-width:320px;max-width:60ch;white-space:normal}
.verwaltung-betrieb--datenbank .db-sql-text>code,
.verwaltung-betrieb--datenbank .db-sql-voll>code{display:block;max-width:100%;font-size:var(--fs-label);line-height:1.55;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word}
.verwaltung-betrieb--datenbank .db-sql-voll>code{margin-top:6px;padding:10px;border-radius:var(--sr-r-ctl);background:var(--sr-soft)}
.verwaltung-betrieb--datenbank .db-sql-kennzahlen dl{display:grid;gap:6px;margin:6px 0 0;padding:10px;border-radius:var(--sr-r-ctl);background:var(--sr-soft)}
.verwaltung-betrieb--datenbank .db-sql-kennzahlen dl>div{display:grid;grid-template-columns:minmax(120px,.8fr) minmax(0,1fr);gap:8px}
.verwaltung-betrieb--datenbank .db-sql-kennzahlen :is(dt,dd){min-width:0;margin:0;overflow-wrap:anywhere}
.verwaltung-betrieb--datenbank .db-sql-kennzahlen dt{color:var(--sr-mut);font-size:var(--fs-label);font-weight:600}

.verwaltung-betrieb--dbm .dbm-tabelle table{width:100%;min-width:700px;table-layout:fixed}
.verwaltung-betrieb--dbm .dbm-tabelle :is(th,td).sr-wahl-spalte{width:44px}
.verwaltung-betrieb--dbm .dbm-tabelle :is(th,td):nth-child(2){width:auto}
.verwaltung-betrieb--dbm .dbm-tabelle :is(th,td):nth-child(3){width:154px}
.verwaltung-betrieb--dbm .dbm-tabelle :is(th,td):nth-child(4){width:260px}
.verwaltung-betrieb--dbm .dbm-tabelle :is(th,td):nth-child(5){width:64px}
.verwaltung-betrieb--dbm .dbm-wahlziel{display:grid;place-items:center;width:36px;height:36px;cursor:pointer}
.verwaltung-betrieb--dbm .dbm-identitaet>strong,
.verwaltung-betrieb--dbm .dbm-identitaet>.mono{display:block;min-width:0;overflow-wrap:anywhere}
.verwaltung-betrieb--dbm .dbm-identitaet>.mono{margin-top:3px;color:var(--sr-mut);font-size:var(--fs-label)}
.verwaltung-betrieb--dbm .dbm-details>summary{display:inline-flex;align-items:center;min-height:36px;color:var(--sr-acc-ink);font-size:var(--fs-label);font-weight:600;cursor:pointer;overflow-wrap:anywhere}
.verwaltung-betrieb--dbm .dbm-details dl{display:grid;gap:8px;margin:8px 0 0;padding:10px;border-radius:var(--sr-r-ctl);background:var(--sr-soft)}
.verwaltung-betrieb--dbm .dbm-details dl>div{display:grid;gap:3px}
.verwaltung-betrieb--dbm .dbm-details :is(dt,dd){min-width:0;margin:0;overflow-wrap:anywhere}
.verwaltung-betrieb--dbm .dbm-details dt{color:var(--sr-mut);font-size:var(--fs-label);font-weight:600}
.verwaltung-betrieb--dbm .dbm-details ul{margin:0;padding-left:18px}
.verwaltung-betrieb--dbm .dbm-share-slug{display:block;max-width:100%;white-space:normal;overflow-wrap:anywhere;word-break:break-word}

@media(max-width:640px){
  .verwaltung-betrieb--datenbank .db-tabellen-kompakt table{display:block;min-width:0}
  .verwaltung-betrieb--datenbank .db-tabellen-kompakt thead{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
  .verwaltung-betrieb--datenbank .db-tabellen-kompakt tbody{display:grid;gap:16px}
  .verwaltung-betrieb--datenbank .db-tabellen-kompakt tr{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;padding:16px 0;border-bottom:1px solid var(--sr-hair)}
  .verwaltung-betrieb--datenbank .db-tabellen-kompakt tr[hidden]{display:none}
  .verwaltung-betrieb--datenbank .db-tabellen-kompakt td{display:block!important;width:auto!important;min-width:0;height:auto!important;padding:0;border:0;text-align:left;white-space:normal;background:transparent!important}
  .verwaltung-betrieb--datenbank .db-tabellen-kompakt td:first-child{grid-column:1/-1}
  .verwaltung-betrieb--datenbank .db-tabellen-kompakt td:nth-child(2)::before{content:'Daten MB'}
  .verwaltung-betrieb--datenbank .db-tabellen-kompakt td:nth-child(3)::before{content:'Index MB'}
  .verwaltung-betrieb--datenbank .db-tabellen-kompakt td:nth-child(4)::before{content:'Freiraum MB'}
  .verwaltung-betrieb--datenbank .db-tabellen-kompakt td:nth-child(5)::before{content:'Befund'}
  .verwaltung-betrieb--datenbank .db-tabellen-kompakt td:not(:first-child)::before{display:block;margin-bottom:4px;color:var(--sr-mut);font-size:var(--fs-label);font-weight:600}
  .kosten-seite .kosten-projektwahl{position:sticky;top:0;z-index:20;display:grid;padding:10px}
  .kosten-seite .kosten-projektwahl :is(.feld-eingabe){min-height:44px}
  .kosten-seite .kosten-formulare>.kosten-inline-form{width:100%}
  .kosten-seite .kosten-formulare :is(.feld-eingabe,.knopf,.sr-schalter){min-height:44px}

  .tarif-seite .tarif-vergleich-wrap{display:none}
  .tarif-seite .tarif-mobil{display:grid;gap:12px}
  .tarif-seite .tarif-mobil>.feld{margin:0}
  .tarif-seite .tarif-mobil>.feld .feld-eingabe{width:100%;min-height:44px}
  .tarif-seite .tarif-mobil-tafel{padding:14px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-surface)}
  .tarif-seite .tarif-mobil-tafel[hidden]{display:none!important}
  .tarif-seite .tarif-mobil-kopf{display:flex;align-items:start;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid var(--sr-hair)}
  .tarif-seite .tarif-mobil-kopf h3,.tarif-seite .tarif-mobil-kopf p{margin:0}
  .tarif-seite .tarif-mobil-kopf p{margin-top:3px;color:var(--sr-mut);font-weight:700}
  .tarif-seite .tarif-mobil-leistungen{display:grid;margin:0}
  .tarif-seite .tarif-mobil-leistungen>div{display:grid;grid-template-columns:minmax(0,1fr) minmax(110px,.65fr);gap:12px;padding:10px 0;border-bottom:1px solid var(--sr-hair)}
  .tarif-seite .tarif-mobil-leistungen>div:last-child{border-bottom:0}
  .tarif-seite .tarif-mobil-leistungen :is(dt,dd){min-width:0;margin:0;overflow-wrap:anywhere}
  .tarif-seite .tarif-mobil-leistungen dt{color:var(--sr-mut)}
  .tarif-seite .tarif-mobil-leistungen dd{font-weight:600;text-align:right}

  .verwaltung-betrieb--datenbank :is(.db-tabellen-details,.db-sql-voll,.db-sql-kennzahlen)>summary{min-height:44px}
  .verwaltung-betrieb--datenbank .db-sql-text{min-width:240px}

  .verwaltung-betrieb--dbm .dbm-tabelle{overflow:visible}
  .verwaltung-betrieb--dbm .dbm-tabelle table{display:block;min-width:0}
  .verwaltung-betrieb--dbm .dbm-tabelle thead{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
  .verwaltung-betrieb--dbm .dbm-tabelle tbody{display:grid;gap:10px}
  .verwaltung-betrieb--dbm .dbm-tabelle tr{display:grid;grid-template-columns:44px minmax(0,1fr) auto;gap:9px 12px;padding:12px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-card);background:var(--sr-surface)}
  .verwaltung-betrieb--dbm .dbm-tabelle td{display:block;width:auto!important;min-width:0;height:auto!important;padding:0;border:0;background:transparent!important}
  .verwaltung-betrieb--dbm .dbm-tabelle .sr-wahl-spalte{grid-column:1;grid-row:1/4}
  .verwaltung-betrieb--dbm .dbm-name{grid-column:2;grid-row:1}
  .verwaltung-betrieb--dbm .dbm-tabelle td:nth-child(3){grid-column:3;grid-row:1}
  .verwaltung-betrieb--dbm .dbm-kontext{grid-column:2/4;grid-row:2}
  .verwaltung-betrieb--dbm .dbm-aktion{grid-column:3;grid-row:3}
  .verwaltung-betrieb--dbm .dbm-wahlziel{width:44px;height:44px}
  .verwaltung-betrieb--dbm :is(.dbm-details>summary,.dbm-aktion .sr-ikon-knopf){min-height:44px}
  .verwaltung-betrieb--dbm .dbm-aktion .sr-ikon-knopf{width:44px;height:44px}
}

@media(max-width:420px){
  .tarif-seite .tarif-mobil-leistungen>div{grid-template-columns:1fr;gap:4px}
  .tarif-seite .tarif-mobil-leistungen dd{text-align:left}
  .verwaltung-betrieb--datenbank .db-tabellen-details dl>div{grid-template-columns:1fr;gap:2px}
}

@media(prefers-reduced-motion:reduce){
  .kosten-seite .kosten-projektwahl,.tarif-seite .tarif-mobil,.verwaltung-betrieb{scroll-behavior:auto}
}


/* ---- chart-studio.css ---- */
/* Breites, natives Diagramm-Studio. Die Position setzt chart-studio.js; die
   Reserve im Dokument verhindert, dass das geoeffnete Panel den Chart verdeckt. */
[hidden].chart-studio,
[hidden].chart-studio-platz,
.chart-studio [hidden],
.chart-konfig-menue[hidden] { display: none !important; }

.chart-studio-platz { min-height: 0; }

.chart-studio {
  display:grid;
  grid-template-rows:auto auto minmax(0,1fr);
  inset:auto;
  position: fixed;
  z-index: 2147483640;
  box-sizing: border-box;
  width: min(100% - 24px, 1120px);
  max-width: calc(100vw - 24px);
  max-height: 90dvh;
  margin: 0;
  padding: 0;
  overflow: hidden;
  border: 1px solid color-mix(in srgb, var(--sr-hair) 78%, var(--sr-acc));
  border-radius: var(--sr-r-card, 12px);
  background: var(--sr-surface);
  color: var(--sr-ink);
  box-shadow: var(--sr-e-modal, 0 16px 42px rgb(15 23 42 / 18%));
  animation: chart-studio-ein 180ms ease-out both;
}

.chart-studio::backdrop {
  background: transparent;
  pointer-events: none;
}

.chart-studio:popover-open { display: grid; grid-template-rows: auto auto minmax(0, 1fr); }

.chart-studio-kopf,
.chart-studio-tabs {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
  padding: 10px 14px;
  border-bottom: 1px solid var(--sr-hair);
}

.chart-studio-kopf { justify-content: space-between; }
.chart-studio-kopf > div:first-child { display: grid; gap: 2px; min-width: 0; }
.chart-studio-kopf strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chart-studio-hinweis,
.chart-studio-status { color: var(--sr-mut); font-size: var(--fs-small, 12px); line-height: 1.35; }
.chart-studio-aktionen { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px; }

.chart-studio-tabs { gap: 4px; padding-block: 6px; }
.chart-studio-tabs .chart-studio-knopf[aria-pressed="true"] {
  border-color: var(--sr-acc-line);
  background: var(--sr-soft);
  color: var(--sr-acc-ink);
}
.chart-studio-tabs .chart-studio-status { margin-left: auto; }

.chart-studio-body { min-height: 0; overflow: auto; overscroll-behavior: contain; padding: 12px 14px 14px; }
.chart-studio-formen,
.chart-studio-reihen { min-width: 0; }
.chart-studio-formen { display: grid; gap: 10px; }

.chart-studio-knopf,
.chart-studio-suche,
.chart-studio select {
  box-sizing: border-box;
  min-height: 30px;
  border: 1px solid var(--sr-hair);
  border-radius: var(--sr-r-ctl, 7px);
  background: color-mix(in srgb, var(--sr-surface) 94%, transparent);
  color: var(--sr-ink);
  font: inherit;
  font-size: var(--fs-small, 12px);
}
.chart-studio-knopf { padding: 5px 9px; cursor: pointer; }
.chart-studio-knopf:hover { border-color: var(--sr-acc-line); background: var(--sr-soft); }
.chart-studio-knopf:disabled { cursor: not-allowed; opacity: .52; }
.chart-studio-knopf--primaer { border-color: var(--sr-acc); background: var(--sr-acc); color: var(--sr-surface); font-weight: 700; }
.chart-studio-knopf--primaer:hover { background: var(--sr-acc-ink); color: var(--sr-surface); }
.chart-studio :where(button, input, select):focus-visible,
.chart-layout :where(button, a):focus-visible { outline: 2px solid var(--sr-acc-line); outline-offset: 2px; }

.chart-studio-optionen { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 10px; }
.chart-studio-optionen .chart-konfig-gruppe,
.chart-studio-formen .chart-konfig-gruppe { min-width: 0; }
.chart-studio .chart-konfig-gruppe { display: grid; gap: 4px; align-content: start; }
.chart-studio .chart-konfig-titel { color: var(--sr-mut); font-size: var(--fs-small, 12px); font-weight: 700; }
.chart-studio .chart-konfig-eintrag { display: flex; align-items: center; gap: 6px; width: 100%; text-align: left; white-space:normal; }
.chart-studio .chart-konfig-eintrag[aria-checked="true"] { border-color: var(--sr-acc-line); background: var(--sr-soft); color: var(--sr-acc-ink); }
.chart-studio-optionen label{display:flex;align-items:center;gap:7px;font-size:var(--fs-small);padding:4px 0}
.chart-studio-optionen input[type=range]{width:100%;min-width:0}
.chart-studio-optionen select{width:100%;min-width:0;padding:5px}
.chart-studio-optionen .chart-konfig-gruppe{margin:0;padding:12px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl,7px);background:color-mix(in srgb,var(--sr-surface) 96%,var(--sr-soft))}
.chart-studio-optionen .chart-konfig-gruppe--hauptwahl{grid-row:1;min-height:106px;border-color:color-mix(in srgb,var(--sr-hair) 65%,var(--sr-acc));background:color-mix(in srgb,var(--sr-surface) 94%,var(--sr-soft))}
.chart-studio-optionen .chart-konfig-gruppe--palette{grid-column:1/5}.chart-studio-optionen .chart-konfig-gruppe--typ{grid-column:5/9}.chart-studio-optionen .chart-konfig-gruppe--engine{grid-column:9/13}
.chart-studio-optionen .chart-konfig-gruppe--steuerung{grid-row:2}.chart-studio-optionen .chart-konfig-gruppe--achsen{grid-column:1/4}.chart-studio-optionen .chart-konfig-gruppe--legende{grid-column:4/7}.chart-studio-optionen .chart-konfig-gruppe--details{grid-column:7/10}.chart-studio-optionen .chart-konfig-gruppe--hoehe{grid-column:10/13}
.chart-studio-auswahlzeile{display:grid;grid-template-columns:minmax(0,1fr) 86px;align-items:center;gap:8px}
.chart-studio-wahlvorschau{display:flex;align-items:center;justify-content:center;gap:2px;height:30px;min-width:0;border:1px solid var(--sr-hair);border-radius:5px;background:var(--sr-soft);overflow:hidden}
.chart-studio-wahlvorschau>i{width:22%;height:8px;border-radius:2px}.chart-studio-wahlvorschau>span{padding:0 3px;color:var(--sr-mut);font-size:10px;text-align:center;line-height:1.15}.chart-studio-wahlvorschau:has(.chart-studio-engine-schema) .chart-studio-auswahlvorschau{width:54px}
.chart-studio-auswahlvorschau{width:82px;height:26px;fill:color-mix(in srgb,var(--sr-acc) 25%,transparent);stroke:var(--sr-acc);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.chart-studio-optionen p{margin:6px 0}
.chart-studio-optionen .chart-konfig-titel{padding:4px 0}
.chart-kartenkopf{flex-wrap:wrap;gap:6px 12px}
.chart-kartenkopf>.sr-karte-titel{flex:1 1 0;min-width:0}
.chart-kartenkopf>.chart-kopf{margin:0 0 0 auto;flex:0 0 auto}
.chart-kartenkopf>.chart-zeitraum-meta{flex:1 0 100%;order:5;margin:0;text-align:left}
.chart-karte-studio>.sr-karte-koerper{padding-bottom:var(--s3)}
.chart-karte-studio>[data-sr-wz][hidden]{display:none!important}
.chart-transparent,.chart-transparent .chart-dynamisch{background:transparent!important;box-shadow:none!important;border-color:transparent!important}
.chart-kartenkopf .chart-export-btn{width:32px;height:30px;padding:0;justify-content:center}
.chart-layout>.chart-zeitraum{justify-content:flex-start;margin:0 0 6px}
.chart-layout>.chart-legende[data-ausrichtung]:not([data-ausrichtung=auto]){display:flex}

.chart-studio-reihen { display: grid; grid-template-columns: minmax(0, 2fr) minmax(220px, 1fr); gap: 14px; min-height: 0; }
.chart-studio-katalog,
.chart-studio-auswahl { display: grid; align-content: start; gap: 8px; min-width: 0; }
.chart-studio-suche { width: 100%; padding: 6px 9px; }
.chart-studio-quellen { display: flex; flex-wrap: wrap; gap: 5px; }
.chart-studio-quellen select{width:100%;padding:5px 8px}
.chart-studio-fundus { display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:7px;min-height:0;overflow:visible; }
.chart-studio-fundus>.chart-studio-hinweis{grid-column:1/-1}
.chart-studio-auswahl { min-height:0;overflow:visible;padding:10px;border:1px solid color-mix(in srgb,var(--sr-hair) 65%,var(--sr-acc));border-radius:var(--sr-r-card,12px);background:var(--sr-surface); }
.chart-studio-fund,
.chart-studio-serie { display: grid; gap: 4px; min-width: 0; padding: 8px 9px; border: 1px solid var(--sr-hair); border-radius: var(--sr-r-ctl, 7px); background: color-mix(in srgb, var(--sr-surface) 88%, var(--sr-soft)); }
.chart-studio-serie + .chart-studio-serie { margin-top: 6px; }
.chart-studio-serienkopf{display:flex;align-items:center;gap:7px;min-width:0}.chart-studio-serienkopf strong{min-width:0}
.chart-studio-seriensteuerung{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.chart-studio-miniatur{flex:0 0 72px;width:72px;height:24px;fill:var(--sr-acc);stroke:var(--sr-acc);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.chart-studio-miniatur-flaeche{fill:color-mix(in srgb,var(--sr-acc) 28%,transparent)}.chart-studio-miniatur-linie{fill:none}
/* Flex mit Umbruch statt starrem Raster: in der schmalen Gruppe (3 von 12
   Spalten) rutschte der Wert sonst in die Beschriftung. */
.chart-konfig-gruppe--hoehe label{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:2px 6px}.chart-konfig-gruppe--hoehe input[type=range]{flex:1 1 100%;min-width:0}.chart-studio-hoehenwert{color:var(--sr-ink);font-variant-numeric:tabular-nums;font-weight:700;white-space:nowrap}
.chart-studio-fund strong,
.chart-studio-serie strong { overflow-wrap: anywhere; font-size: var(--fs-small, 12px); }
.chart-studio-fund small,
.chart-studio-serie small { color: var(--sr-mut); font-size: 11px; }
.chart-studio-fund p { margin: 0; color: var(--sr-mut); font-size: 11px; line-height: 1.35; }
.chart-studio-fund .chart-studio-knopf,
.chart-studio-serie .chart-studio-knopf,
.chart-studio-serie select { justify-self: start; width: auto; max-width: 100%; }
.chart-studio-grund { color: var(--sr-warn-ink, var(--sr-mut)); }

/* Chart-Kopf, Metazeile und DOM-Legende: der Canvas bleibt darunter sichtbar. */
.chart-layout { min-width: 0; }
.chart-layout .chart-kopf { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 14px; min-width: 0; }
.chart-layout .chart-meta,
.chart-layout .chart-kopf-meta,
.chart-layout .tt-quellenzeile { color: var(--sr-mut); font-size: var(--fs-small, 12px); line-height: 1.4; }
.chart-layout > .chart-legende { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 5px 12px; min-width: 0; margin: 8px 0 4px; }
.chart-layout > .chart-legende.chart-legende--geteilt { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); align-items: start; }
.chart-layout .chart-leg-gruppe { display: flex; flex-wrap: wrap; align-items: center; gap: 5px 10px; min-width: 0; }
.chart-layout .chart-leg-gruppe--rechts { justify-content: flex-end; }
.chart-layout .chart-leg-item { display: inline-flex; align-items: center; gap: 5px; min-width: 0; padding: 3px 5px; border: 0; background: transparent; color: var(--sr-ink); font: inherit; font-size: var(--fs-small, 12px); cursor: pointer; }
.chart-layout .chart-leg-item:hover { background: var(--sr-soft); }
.chart-layout .chart-leg-item .leg-text { overflow-wrap: anywhere; }
.chart-layout .chart-leg-item.aus { color: var(--sr-mut); opacity: .62; }
.chart-layout .chart-export-btn { display: inline-flex; align-items: center; justify-content: center; gap: 5px; width: 36px; min-width: 36px; height: 36px; padding: 0; border: 1px solid var(--sr-hair); border-radius: var(--sr-r-ctl, 7px); background: var(--sr-surface); color: var(--sr-ink); font: inherit; cursor: pointer; }
.chart-layout .chart-export-btn span:not([aria-hidden]) { display: none; }
.chart-layout .chart-export-btn:hover { border-color: var(--sr-acc-line); color: var(--sr-acc-ink); }
.chart-layout > .chart-legende[data-ausrichtung="links"],
.chart-layout > .chart-legende[data-ausrichtung="links"] > .chart-leg-gruppe { justify-content: flex-start; }
.chart-layout > .chart-legende[data-ausrichtung="rechts"],
.chart-layout > .chart-legende[data-ausrichtung="rechts"] > .chart-leg-gruppe { justify-content: flex-end; }
.chart-layout > .chart-legende[data-ausrichtung="zentriert"],
.chart-layout > .chart-legende[data-ausrichtung="zentriert"] > .chart-leg-gruppe { justify-content: center; }

@keyframes chart-studio-ein { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }

@media (max-width: 720px) {
  .chart-studio { max-height: 92dvh; }
  .chart-studio-kopf { align-items: flex-start; flex-direction: column; }
  .chart-studio-aktionen { width: 100%; justify-content: flex-start; }
  .chart-studio-tabs { flex-wrap:wrap; white-space: normal; }
  .chart-studio-tabs .chart-studio-status { margin-left:0;flex-basis:100%; }
  .chart-studio-optionen { grid-template-columns: minmax(0, 1fr); }
  .chart-studio-optionen .chart-konfig-gruppe--hauptwahl,.chart-studio-optionen .chart-konfig-gruppe--steuerung{grid-column:auto;grid-row:auto}
  .chart-studio-reihen { grid-template-columns: minmax(0, 1fr); }
  .chart-studio-auswahl { border-top: 1px solid var(--sr-hair); padding-top: 10px; }
  .chart-layout > .chart-legende.chart-legende--geteilt { grid-template-columns: minmax(0, 1fr); }
  .chart-layout .chart-leg-gruppe--rechts { justify-content: flex-start; }
}

@media (prefers-reduced-motion: reduce) {
  .chart-studio { animation: none; }
}

/* Dieselbe Chartinstanz zeigt den Entwurf auch im Studio und kehrt beim
   Schließen an ihren Platz zurück. Daten und Engine werden nicht dupliziert. */
.chart-studio-vorschau { margin: 0 0 12px; border: 1px solid var(--sr-hair); border-radius: 8px; background: var(--sr-surface); min-width: 0; }
.chart-studio-vorschau > summary { padding: 9px 12px; cursor: pointer; font-weight: 600; }
.chart-studio-vorschau-chart.sr-karte { margin: 0; padding: 10px; border: 0; box-shadow: none; min-width: 0; }
.chart-studio-vorschau .chart-dynamisch,
.chart-studio-vorschau .chart-live { min-width: 0; max-width: 100%; }
/* Keine eigene Vorschau-Hoehe: die Vorschau zeigt dieselbe Chartinstanz mit
   derselben Inline-Hoehe wie die App — was hier steht, steht so in der App. */
.chart-studio-vorschau .chart-konfig,
.chart-studio-vorschau .chart-griff { display: none; }
.chart-studio-vorschau svg { max-width: 100%; }

/* Diagrammtyp je Reihe unter „Darstellung“ (16.09.2026). */
.chart-studio-typreihen { display: grid; gap: 5px; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--sr-hair); }
.chart-studio-optionen label.chart-studio-typreihe { display: grid; grid-template-columns: 10px minmax(0, 1fr) minmax(120px, 44%); align-items: center; gap: 7px; padding: 0; }
.chart-studio-typreihe-farbe { width: 10px; height: 10px; border-radius: 3px; }
.chart-studio-typreihe > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-small, 12px); }

/* Reihenfolge und Farbe je Reihe im Reiter „Messreihen“. */
.chart-studio-serienkopf > strong { flex: 1 1 auto; }
.chart-studio-ordnen { display: inline-flex; flex: none; gap: 3px; }
.chart-studio-ordnen .chart-studio-knopf { min-width: 28px; min-height: 26px; padding: 2px 6px; }
.chart-studio-farbe { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.chart-studio-farbe input[type="color"] { width: 42px; height: 28px; padding: 2px; border: 1px solid var(--sr-hair); border-radius: var(--sr-r-ctl, 7px); background: var(--sr-surface); cursor: pointer; }

/* BREITES STUDIO (16.09.2026): ab 1280 px Vorschau links, Einstellungen
   rechts — statt beides untereinander und in der Höhe zu scrollen. */
@media (min-width: 1280px) {
  .chart-studio { width: min(100% - 24px, 1600px); }
  .chart-studio-body { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 6fr); gap: 14px; align-items: start; }
  .chart-studio-vorschau { grid-column: 1; grid-row: 1 / span 2; position: sticky; top: 0; margin: 0; }
  .chart-studio-formen,
  .chart-studio-reihen { grid-column: 2; grid-row: 1; }
  .chart-studio-reihen { grid-template-columns: minmax(0, 3fr) minmax(220px, 2fr); }
}


/* ---- chart-details.css ---- */
.chart-studio-optionen .chart-details-gruppe{grid-column:1/-1}
.chart-details-raster{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.chart-details-feld{display:grid!important;align-content:start!important;gap:4px!important;padding:0!important;color:var(--sr-mut);font-weight:700}
.chart-details-feld input,.chart-details-feld select{box-sizing:border-box;width:100%;min-width:0;min-height:32px;padding:5px 8px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl,7px);background:var(--sr-surface);color:var(--sr-ink);font:inherit;font-weight:400}
.chart-details-bedienung{grid-column:1/-1;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}
.chart-details-infofeld{grid-column:1/-1;display:grid;gap:6px}
.chart-details-info-kopf{display:flex;align-items:center;gap:8px;color:var(--sr-mut);font-size:var(--fs-small,12px);font-weight:700}
.chart-details-editor-werkzeuge{display:flex;gap:4px;margin-left:auto}
.chart-details-editor-werkzeuge button{width:28px;height:28px;padding:0;border:1px solid var(--sr-hair);border-radius:5px;background:var(--sr-surface);color:var(--sr-ink);font:inherit;font-weight:700;cursor:pointer}
.chart-details-editor{min-height:92px;max-height:220px;overflow:auto;padding:8px 10px;border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl,7px);background:var(--sr-surface);color:var(--sr-ink);font-size:var(--fs-body);line-height:1.5}
.chart-details-editor:focus{outline:2px solid var(--sr-acc-line);outline-offset:1px}
.chart-details-editor p,.chart-details-editor ul{margin:0 0 7px}.chart-details-editor>:last-child{margin-bottom:0}
.chart-details-ablage{display:flex;align-items:center;flex-wrap:wrap;gap:7px;min-width:0}
.chart-details-ablage--oben{margin:0 0 8px}.chart-details-ablage--unten{margin:8px 0 0}
.chart-details-vorschau-kopf{display:none;gap:3px;margin:0 0 8px}
.chart-studio-vorschau-chart .chart-details-vorschau-kopf{display:grid}
.chart-details--ohne-kartenkopf>.chart-details-vorschau-kopf{display:grid}
.chart-details-vorschau-kopf[hidden],.chart-details-ablage[hidden],.chart-details-info[hidden]{display:none}
.chart-details-info{min-width:min(100%,320px)}
.chart-details-info>summary{cursor:pointer;color:var(--sr-acc-ink);font-weight:700}
.chart-details-info-inhalt{padding:7px 0 0;color:var(--sr-ink);line-height:1.5}
.chart-details-info-inhalt p,.chart-details-info-inhalt ul{margin:0 0 7px}.chart-details-info-inhalt>:last-child{margin-bottom:0}
.chart-details-reset{grid-column:1/-1;justify-self:start}
@media(max-width:720px){.chart-details-raster,.chart-details-bedienung{grid-template-columns:minmax(0,1fr)}}

/* Zeitraum und Aktionen bilden rechts eine gemeinsame Werkzeugzeile. */
.sr-app .chart-kartenkopf>.chart-kopf,.chart-layout .chart-kopf,.chart-details-ablage{justify-content:flex-end;align-items:center;gap:8px 12px;padding-block:12px;box-sizing:border-box}
.sr-app .chart-kartenkopf>.chart-kopf{flex-wrap:wrap;max-width:100%;min-width:0}
.sr-app .chart-kartenkopf{align-items:center;padding-bottom:var(--s3)}
#cockpit-besuche>.sr-karte-kopf{padding-bottom:6px}
.sr-app .chart-kopf>.chart-zeitraum,.chart-details-ablage>.chart-zeitraum{margin:0 10px 0 0;align-items:center;flex-wrap:wrap;min-width:0;max-width:100%}
.chart-kopf>.sr-erklaerung,.chart-details-ablage>.sr-erklaerung{margin:0}
.chart-kopf>.chart-konfig,.chart-kopf>.chart-export{flex:none}
.chart-zeitraum-frei{position:relative;flex:none;font-size:var(--fs-label)}
.chart-zeitraum-frei>summary.chart-zr-frei-btn{display:inline-flex;align-items:center;gap:6px;height:30px;min-height:30px;padding:0 12px;list-style:none;border:1px solid var(--sr-hair);border-radius:var(--sr-r-ctl,7px);background:var(--sr-surface);color:var(--sr-ink);font-weight:600;cursor:pointer;box-sizing:border-box}
.chart-zeitraum-frei>summary::-webkit-details-marker{display:none}
.chart-zeitraum-frei>summary::after{content:"";width:5px;height:5px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(45deg);margin-top:-3px}
.chart-zeitraum-frei[open]>summary.chart-zr-frei-btn,.chart-zeitraum-frei>summary.chart-zr-frei-btn.aktiv{background:var(--sr-soft);border-color:var(--sr-acc-line);color:var(--sr-acc-ink)}
.chart-zeitraum-frei[open]>summary::after{transform:rotate(225deg);margin-top:3px}
.chart-zeitraum-frei>summary:focus-visible{outline:2px solid var(--sr-acc-line);outline-offset:2px}
.chart-zeitraum-frei>.chart-zeitraum-felder{position:absolute;z-index:40;right:0;top:calc(100% + 8px);display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;padding:14px;width:320px;max-width:calc(100vw - 40px);box-sizing:border-box;background:var(--sr-surface);border:1px solid var(--sr-hair);border-radius:12px;box-shadow:var(--e2)}
.chart-zeitraum-felder>label{display:grid;gap:6px;color:var(--sr-mut);font-size:var(--fs-small);font-weight:600}
.chart-zeitraum-frei>.chart-zeitraum-felder input{min-width:0;width:100%;min-height:38px;box-sizing:border-box;padding:7px 9px;font:inherit;border:1px solid var(--sr-hair);border-radius:7px;color:var(--sr-ink);background:var(--sr-soft)}
.chart-zeitraum-felder input:focus{outline:2px solid var(--sr-acc-line);outline-offset:1px}
@media(max-width:720px){.sr-app .chart-kartenkopf>.chart-kopf{flex:1 1 100%;width:100%}.sr-app .chart-kopf>.chart-zeitraum,.chart-details-ablage>.chart-zeitraum{margin-right:0;gap:3px}.chart-zeitraum-frei>.chart-zeitraum-felder{width:290px}}


/* ---- erkenntnis-tour.css ---- */
/* SEO-Radar — Praxis-Touren (Vorgang cmu0ekxfk001ay5ipy63buxz9).
 *
 * Bewusst dieselbe Formsprache wie das Quicktour-Framework in app.css
 * (.tour-backdrop/.tour-karte): eine Tour soll sich anfuehlen wie die andere,
 * auch wenn sie technisch etwas anderes tut. Eigene Klassen statt der
 * bestehenden, weil beide gleichzeitig offen sein koennen -- ein geteilter
 * Selektor haette sonst zwei Karten uebereinander positioniert.
 *
 * KEINE style=-ATTRIBUTE: die CSP verwirft sie stumm; variable Masse gehoeren
 * als Klasse hierher.
 */

.ptour-backdrop {
  position: fixed; inset: 0; z-index: 300; background: var(--scrim);
  opacity: 0; transition: opacity var(--t-med) var(--ease);
}
.ptour-backdrop[hidden] { display: none; }
.ptour-backdrop.offen { opacity: 1; }

.ptour-karte {
  position: fixed; z-index: 301;
  left: 16px; right: 16px; bottom: var(--s4); margin: 0 auto;
  width: min(520px, calc(100vw - 32px));
  max-height: min(78vh, 640px); overflow-y: auto;
  background: var(--surface); border-radius: var(--rlg);
  box-shadow: var(--edge), var(--e3);
  padding: 20px 22px 18px;
  opacity: 0; transform: translateY(10px);
  transition: opacity var(--t-med) var(--spring), transform var(--t-med) var(--spring);
}
.ptour-karte[hidden] { display: none; }
.ptour-karte.offen { opacity: 1; transform: translateY(0); }

.ptour-kopf { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.ptour-marke {
  font-size: var(--fs-label); font-weight: 700; text-transform: uppercase;
  letter-spacing: 1px; color: var(--knopf-blau);
}
.ptour-zaehler { font-size: var(--fs-label); color: var(--text-3); margin-left: auto; margin-right: 26px; }
.ptour-schliessen {
  position: absolute; top: 10px; right: 10px; width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  background: transparent; border: none; border-radius: var(--rsm);
  color: var(--text-3); font-size: var(--fs-h2); line-height: 1; cursor: pointer;
}
.ptour-schliessen:hover { background: var(--hover); color: var(--text); }
.ptour-schliessen:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }

.ptour-titel { margin: 0 26px 4px 0; font-size: var(--fs-h2); color: var(--text); }
.ptour-untertitel { margin: 0 0 12px; font-size: var(--fs-label); color: var(--text-3); }
.ptour-text { margin: 0 0 12px; font-size: var(--fs-body); line-height: 1.6; color: var(--text-2); }
.ptour-beleg, .ptour-frage { margin: 0 0 10px; font-size: var(--fs-small); color: var(--text-3); }
.ptour-beleg[hidden], .ptour-frage[hidden] { display: none; }
.ptour-beleg a { color: var(--knopf-blau); }

.ptour-fuss { display: flex; justify-content: flex-end; gap: 10px; margin-top: 4px; }
.ptour-fuss .ptour-btn:first-child { margin-right: auto; }
.ptour-btn {
  padding: 8px 16px; font: inherit; font-size: var(--fs-ui); font-weight: 650;
  border-radius: var(--rsm); cursor: pointer;
  transition: background var(--t-fast) var(--ease);
}
.ptour-btn--zurueck { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-2); }
.ptour-btn--zurueck:hover { background: var(--hover); }
.ptour-btn--zurueck:disabled { opacity: .4; cursor: not-allowed; }
/* BLAUE KNOEPFE BEKOMMEN WEISSE SCHRIFT: --knopf-blau mit --auf-knopf,
   nicht --accent/--on-accent. */
.ptour-btn--weiter { background: var(--knopf-blau); border: 1px solid var(--knopf-blau); color: var(--auf-knopf); }
.ptour-btn--weiter:hover { background: var(--knopf-blau-hover); color: var(--auf-knopf); }
.ptour-btn:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }

/* ------------------------------------------------------------- Auswahlliste */

.ptour-auswahl-liste { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.ptour-auswahl-knopf {
  display: flex; flex-direction: column; gap: 3px; width: 100%; text-align: left;
  padding: 10px 12px; cursor: pointer;
  background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--rsm);
  color: var(--text); font: inherit;
  transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
}
.ptour-auswahl-knopf:hover { background: var(--hover); border-color: var(--knopf-blau); }
.ptour-auswahl-knopf:focus-visible { outline: 2px solid var(--focus-ton); outline-offset: 2px; }
.ptour-auswahl-titel { font-size: var(--fs-ui); font-weight: 650; }
.ptour-auswahl-nutzen { font-size: var(--fs-small); color: var(--text-2); line-height: 1.45; }
.ptour-auswahl-meta { font-size: var(--fs-label); color: var(--text-3); }
.ptour-auswahl-hinweis { margin: 0; font-size: var(--fs-small); color: var(--text-3); }

@media (max-width: 480px) {
  .ptour-karte { padding: 16px 16px 14px; max-height: 82vh; }
  .ptour-fuss { flex-wrap: wrap; }
}

@media (prefers-reduced-motion: reduce) {
  .ptour-backdrop, .ptour-karte { transition: none; }
}

/* ---------------------------------- Einstieg im Kommunikator (km-intro) ----
 * Der Block sitzt unter den Beispielfragen und ist zugeklappt: die Touren
 * sind ein Angebot, nicht der Hauptweg ins Gespraech. Zugeklappt kostet er
 * eine Zeile.
 */
.km-praxis { margin-top: 10px; border-top: 1px solid var(--border); padding-top: 8px; }
.km-praxis-titel {
  cursor: pointer; font-size: var(--fs-small); font-weight: 650; color: var(--text-2);
  list-style: none; display: flex; align-items: center; gap: 6px;
}
.km-praxis-titel::-webkit-details-marker { display: none; }
.km-praxis-titel::before { content: '▸'; color: var(--text-3); transition: transform var(--t-fast) var(--ease); }
.km-praxis[open] > .km-praxis-titel::before { transform: rotate(90deg); }
.km-praxis-titel:hover { color: var(--text); }
.km-praxis-liste { margin-top: 8px; }


/* ---- labor.css ---- */
/* LABOR — Testfläche Drag & Drop & Resize (17.09.2026). Nur Grundgerüst:
   die Mechanik-Session ergänzt hier Zustände (greifen, ziehen, ablegen).
   Breiten kommen aus data-labor-breite bzw. der CSS-Variablen --labor-b,
   die eine Mechanik per CSSOM setzt (style-Attribute verwirft die CSP). */
.labor-flaeche{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:12px;min-height:220px;
  padding:14px;border:1px dashed var(--border);border-radius:var(--sr-r-lg,12px);background:var(--surface-2)}
.labor-flaeche--liste{grid-template-columns:repeat(6,minmax(0,1fr))}
.labor-flaeche--frei{display:block;position:relative;min-height:420px}
.labor-flaeche--frei .labor-widget{position:relative;display:inline-flex;flex-direction:column;width:240px;margin:0 12px 12px 0;vertical-align:top}
.labor-widget{position:relative;display:flex;flex-direction:column;gap:6px;min-width:0;padding:12px 14px;
  border:1px solid var(--border);border-radius:var(--sr-r-lg,12px);background:var(--surface);
  box-shadow:var(--e1,0 1px 3px rgb(15 23 42 / 8%));grid-column:span var(--labor-b,3);
  touch-action:none;user-select:none}
.labor-widget[data-labor-breite="2"]{--labor-b:2}.labor-widget[data-labor-breite="3"]{--labor-b:3}
.labor-widget[data-labor-breite="4"]{--labor-b:4}.labor-widget[data-labor-breite="6"]{--labor-b:6}
.labor-widget[data-labor-hoehe="2"]{grid-row:span 2}
.labor-widget:focus-visible{outline:2px solid var(--sr-acc-line,var(--border));outline-offset:2px}
.labor-widget-kopf{display:flex;align-items:center;gap:8px;min-width:0;color:var(--text-2);font-size:var(--fs-small,12px)}
.labor-widget-kopf strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}
.labor-widget-griff{cursor:grab;color:var(--text-3);letter-spacing:-2px}
.labor-widget-wert{font-size:26px;font-weight:700;font-variant-numeric:tabular-nums}
.labor-widget-fuss{color:var(--text-3);font-size:11px}
.labor-widget-ecke{position:absolute;right:4px;bottom:4px;width:14px;height:14px;cursor:nwse-resize;
  border-right:2px solid var(--text-3);border-bottom:2px solid var(--text-3);border-radius:0 0 3px 0;opacity:.6}
@media (max-width:720px){.labor-flaeche{grid-template-columns:repeat(2,minmax(0,1fr))}
  .labor-widget{grid-column:span 2}}

/* ---- Mechanik-Zustände (labor-client.js, 17.09.2026) ------------------
   Bewegung läuft ausschließlich über transform (Compositor); diese Regeln
   liefern nur Lift, Nachrücken (FLIP) und die absolute Lage der freien
   Fläche. Alle Maße setzt der Client per CSSOM — kein style-Attribut im
   Server-Markup. */
/* KEIN `dense`: dense packt eine abgelegte Kachel selbsttätig in die erste
   freie Lücke weiter oben — Betreiber-Befund 17.09.2026 („flutscht nach
   oben"): Ablegen in Zeile 2 landete in der 4-Spalten-Lücke von Zeile 1.
   Ohne dense folgt das Grid strikt der DOM-Reihenfolge, und die bestimmt
   der Zeiger; Lücken oben bleiben Lücken. */
.labor-flaeche{grid-auto-rows:minmax(112px,auto)}
.labor-flaeche--frei{grid-auto-rows:auto}
.labor-widget.labor-flip{transition:transform .22s cubic-bezier(.2,.7,.3,1)}
.labor-widget.labor-rastet{transition:transform .16s ease-out,width .16s ease-out,height .16s ease-out}
.labor-widget.ist-gegriffen{z-index:60;cursor:grabbing;box-shadow:0 12px 32px rgb(15 23 42 / 28%);
  opacity:.95;will-change:transform}
.labor-widget.ist-gegriffen .labor-widget-griff{cursor:grabbing}
.labor-widget.wird-gezogen{z-index:50;box-shadow:0 8px 22px rgb(15 23 42 / 20%);will-change:transform}
.labor-flaeche.labor-zieht{background:color-mix(in srgb,var(--surface-2) 88%,var(--sr-acc-line,#4a7ac2) 12%)}
.labor-widget-griff{cursor:grab;padding:2px 6px;margin:-2px 0 -2px -6px;touch-action:none}
.labor-widget-ecke{touch-action:none}
.labor-flaeche--frei .labor-widget.ist-frei{position:absolute;left:0;top:0;margin:0;display:flex;
  overflow:hidden}
.labor-ansage{position:fixed;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
@media (prefers-reduced-motion:reduce){
  .labor-widget.labor-flip,.labor-widget.labor-rastet{transition:none}}

/* Ohne Editier-Recht (kein data-labor-editierbar, Betreiber-Entscheid
   18.09.2026: nur Sysadmin richtet ein) zeigen die Flächen den
   gespeicherten Projekt-Stand ohne Griffe und ohne Greif-Zeiger. */
.labor-flaeche:not([data-labor-editierbar]) .labor-widget-griff,
.labor-flaeche:not([data-labor-editierbar]) .labor-widget-ecke{display:none}
.labor-flaeche:not([data-labor-editierbar]) .labor-widget{touch-action:auto;user-select:text}

/* ---- Generische Mechanik-Zustaende (18.09.2026) -----------------------
   labor-client.js bedient seit dem Dashboard-Rollout auch Flaechen ohne
   .labor-widget-Klasse (Cockpit-Bausteine). Die Bewegungs-Zustaende gelten
   deshalb fuer JEDES [data-labor-widget]; Optik (Schatten, Griffe) bringt
   jede Flaeche selbst mit. */
[data-labor-widget].labor-flip{transition:transform .22s cubic-bezier(.2,.7,.3,1)}
[data-labor-widget].ist-gegriffen{z-index:60;will-change:transform;opacity:.96}
[data-labor-widget].wird-gezogen{z-index:50;will-change:transform}
[data-labor-flaeche]:not([data-labor-editierbar]) [data-labor-griff],
[data-labor-flaeche]:not([data-labor-editierbar]) [data-labor-ecke]{display:none}
@media (prefers-reduced-motion:reduce){[data-labor-widget].labor-flip{transition:none}}

