/* ============================================================
   oberflaeche.css - die Stilvorlage der Anwendung.

   REGEL: Hier steht kein einziger Farbwert. Alles laeuft ueber
   var(--...) aus tokens.css. Wer eine Farbe braucht, die es dort
   nicht gibt, legt sie dort an - nicht hier.
   Gegenprobe: --farbe-primaer in tokens.css auf #000000 setzen
   und neu laden. Bleibt irgendwo Violett stehen, ist die Regel
   gebrochen.

   VORSCHAU-KLASSEN: .zeige-ueberfahren, .zeige-aktiv, .zeige-fokus
   Sie existieren nur, damit die Werkstatt alle Zustaende eines
   Bausteins NEBENEINANDER zeigen kann - sonst faellt ein Fehler wie
   "gesetzter Chip wird beim Ueberfahren violett auf violett" wieder
   nur beim Klicken auf, nicht beim Ansehen.
   Sie haengen ueber :is() an DERSELBEN Regel wie :hover, :active und
   :focus. Es gibt also keine zweite Deklaration, die abdriften kann.
   Dass Vorschau und Echtzustand dieselben Werte liefern, wird
   gemessen: tests/messungen/zustandsmatrix.spec.ts.
   ============================================================ */

/* --- Reset ------------------------------------------------- */

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

html {
  -webkit-text-size-adjust: 100%;
  /* HIER STAND EIN TAG SUCHE NACH DEN SCROLLLEISTEN — 18.08.2026, und sie
     hat am falschen Gegenstand gemessen.

     Die Ursache und ihre Behebung stehen bei `@keyframes seite-herein`
     weiter unten: der Schnappschuss startete bei `scale(1.02)` und ragte
     damit auf allen vier Seiten ueber das Sichtfeld.

     WAS HIER STAND UND WIEDER GEFALLEN IST: `scrollbar-gutter: stable` und
     `stable both-edges`. Beide reservieren Platz im DOKUMENT — und dort war
     nie ein Problem. Sie kosteten 7,5 px Versatz an jedem zentrierten Inhalt
     (`bilder.spec.ts`) beziehungsweise sechs Messungen bei 390 px an der
     Huelle. Ein Dreizehntel der Handybreite fuer eine Vermutung.

     ZWEI LEHREN, teuer bezahlt und deshalb hier aufgehoben:

       Wer eine Regel an `html` haengt, faehrt den VOLLEN Messlauf. Die sechs
       roten standen in Dateien, die mit Scrollleisten nichts zu tun haben.

       Und die groessere: wer eine Erscheinung nicht reproduzieren kann,
       prueft zuerst, ob er am richtigen Gegenstand misst. Fuenf Messungen an
       `documentElement.scrollWidth` ergaben fuenf richtige Zahlen und keine
       Antwort — die Leiste gehoert zum `::view-transition`-Overlay, und das
       ist `position: fixed`. */
}

/* ===================================================================
   DAS DOKUMENT SCROLLT — Baustelle 0.1, 04.08.2026
   ===================================================================

   HIER STAND BIS HEUTE DAS GEGENTEIL, und es war kein Versehen: die
   Huelle war 100dvh hoch, `html` und `body` trugen `overflow: hidden`,
   und was scrollte, war eine Liste in sich. Angesagt: „Das Mausrad soll
   das Dokument bewegen, nicht einen Kasten in der Mitte."

   ZWEI BELEGE DAFUER STANDEN SCHON IN DIESER DATEI, beide vom
   Vorautor selbst gemeldet:

   1. Die 240 px Luft ueber allem (Q8, `--kopf-luft-schmal`) sind bei
      Jitter Dokumentluft und scrollen weg. In einer 100dvh-Huelle sind
      sie dauerhaft weg — bei 900 px Fensterhoehe 27 % des Bildschirms.
      Der Vermerk an `.spalte__inhalt` nennt das „den Preis dafuer,
      Jitters Geometrie in unsere Huelle zu setzen".

   2. Die Messung an Q8: `/posteingang` bei 1440 zeigte „sichtbar 561
      von 4891, verborgen 4330" — ohne Verlauf, ohne Schatten, ohne
      sichtbare Bildlaufleiste. Im Bild endete die Liste mitten in einer
      Zeile und las sich als „hier ist die Liste zu Ende".

   Beides faellt weg, sobald das Dokument selbst scrollt. Das Verlaufs-
   zeichen an `[data-bildlauf='eigen']` bleibt trotzdem stehen — es
   traegt jetzt nur noch die eine Flaeche, die ihren Bildlauf behaelt.

   DIE AUSNAHME IST DIE NACHRICHTENLISTE. Sie ist zweispaltig gebaut
   und behaelt ihren eigenen Bildlauf; Begruendung in
   `rueckfragen-an-ceo.md`, Frage 6.

   BEREICH 02 IST JETZT AUCH BETROFFEN — nachgemessen am 05.08.2026.

   Die Abnahme („einrichten ist fertig, das ist perfekt so wie es ist")
   hat hier zuerst gewonnen, und die Nachfrage war: MISS ES. Gemessen
   ueber alle vier Schritte bei 1440 und 390 px:

     Dokument     900 von 900 / 844 von 844   scrollt nirgends
     Blatt        478 von 764 / 357 von 633   scrollt in sich
     Kanalliste   342 von 599 /  69 von 869   scrollt in sich
     Team-Karte   520 von 814 / 247 von 508   scrollt in sich

   Die Kanalliste bei 390 px ist der Fall: ein 69 px hohes Fenster auf
   869 px Inhalt — und `scrollbar-width: none` nimmt das einzige
   Zeichen weg, dass es weitergeht. Das ist genau der Mangel, gegen den
   0.1 gebaut wurde, nur schaerfer: dort fehlte der Hinweis, hier ist er
   ABGESCHALTET.

   Angesagt: „Scrollt es nicht, greift 0.1 auch dort — nur der
   Rollbereich, sonst nichts." Also nur das. Die Stilvorlage von
   Bereich 02 bleibt im Uebrigen unberuehrt. */
/* Der Body scrollt jetzt auch unter einem Vollbild. Was hier stand
   (`height: 100%; overflow: hidden`), war die Klammer, die den
   Bildschirm zum Bildschirm machte.
   DIE ALTE BEGRUENDUNG BLEIBT WAHR und ist der Grund, warum es GENAU
   EINE Stelle sein musste: das Rad traf `main` und scrollte dort,
   waehrend die ENDE-TASTE die Seite um 56 px verschob — zwei
   Eingabearten, zwei Ergebnisse. Diesen Zwiespalt gibt es nicht mehr,
   weil `.vollbild` seinen eigenen Bildlauf abgegeben hat; beide
   scrollen jetzt dasselbe Dokument. */

/* ===================================================================
   DIE EINE SEITE, DIE EIN BILDSCHIRM BLEIBT — Baustelle 0.1
   ===================================================================

   Der Posteingang ist zweispaltig, und zwei Spalten, die gemeinsam mit
   dem Dokument scrollen, laufen auseinander. Der Auftrag laesst ihm
   deshalb ausdruecklich seinen eigenen Rollbereich. Damit die Liste
   darin einen haben KANN, braucht die Kette darueber wieder eine feste
   Hoehe — ein `overflow-y` ohne begrenzten Elternteil greift nie.

   DIE MARKE SETZT `grundgeruest.ts` je Seite, nicht das Stylesheet
   ueber alle. Genau dieselbe Bauart wie `traegt-huelle`, und aus
   demselben Grund: eine Regel, die es ueber alle Seiten behauptet, hat
   schon einmal die Werkstatt unbedienbar gemacht.

   AM HANDY GILT SIE NICHT. Dort steht eine Spalte, das Gespraech liegt
   als Ueberlagerung darueber, und der Posteingang scrollt wie jede
   andere Seite als Dokument. Die Grenze ist dieselbe wie die der
   Zweispaltigkeit (60rem), damit nicht zwei Zahlen dasselbe meinen. */
/* ===================================================================
   DIE FESTE HÖHE IST AM 10.08.2026 GEFALLEN — angesagt
   ===================================================================

   Hier standen zwei Regeln: `body.ist-bildschirmhoch .rahmen { height:
   100dvh }` und `@media (min-width: 60rem) { body.ist-bildschirmhoch {
   height: 100%; overflow: hidden } }`. Sie stellten dem Posteingang die
   feste Höhe wieder her, die Baustelle 0.1 allen Seiten genommen hatte —
   damit seine Nachrichtenliste einen eigenen Bildlauf haben KONNTE.

   Angesagt: „Man sollte in der Seite ja auch runterscrollen können …
   das soll so sein wie die Übersichts-Seite."

   WAS DEN AUSSCHLAG GAB, ist gemessen. Nachdem der Seitentitel auf die
   Höhe der anderen sechs Seiten gerückt war, blieben bei 1440 x 900
   noch 272,9 px Gesprächsbereich und 32 px Verlauf darin. Und
   `/posteingang` war die einzige der sieben Seiten mit `overflow:
   hidden`; alle anderen rollen als Dokument, 1027 bis 2269 px hoch.
   Auch Jitters „Drafts" rollt als Dokument (gemessen 1198 px bei 900).

   MIT IHNEN FALLEN: der eigene Bildlauf der Liste, ihre Ausblendkante,
   ihre Rasterpunkte und die Marke `data-bildlauf="eigen"` an ihr. Die
   ganze Kette hing an dieser Höhe; einzelne Stücke davon stehenzulassen
   hieße, Regeln zu behalten, die nichts mehr tun.

   `.gespraech__verlauf` BEHÄLT SEINEN BILDLAUF — aber nur am Handy, wo
   das Gespräch als feste Überlagerung über dem Fenster liegt und damit
   selbst eine Höhe hat. Dort ist er richtig und dort wirkt er auch.

   Was der Posteingang damit verliert, steht bei `.posteingang__zeilen`:
   die Stelle in der Liste. Der Preis ist bekannt und angesagt bezahlt. */

/* ===================================================================
   UND DAS GEGENSTUECK DARUNTER — 10.08.2026
   ===================================================================

   Am Handy liegt das geoeffnete Gespraech seit dem 10.08.2026 als
   `position: fixed` ueber der ganzen Seite, damit das Antwortfeld unten im
   Bild steht statt 4650 px tiefer. Das Dokument dahinter ist aber weiter so
   lang wie die Liste, und die Huellenwache hat gemessen, was daraus folgt:

     „Posteingang · Gespraech offen: 3173 px Ueberhang,
      das Rad bewegt nichts"

   Ein Dokument, das man nicht sieht, darf auch nicht rollen. Die Marke setzt
   der Server genau dann, wenn der Meister etwas geoeffnet hat — dieselbe
   Unterscheidung wie an `data-offen`.

   `max-width` UND NICHT `min-width`: die Regel darueber sperrt den Koerper AB
   60 rem, diese DARUNTER. Zusammen decken sie beide Bauformen ab, und beide
   brauchen eine Medienabfrage, weil `container-type` an `.huelle` sitzt und
   damit unter dem Koerper. */
@media (max-width: 59.999rem) {
  body.ist-gespraech-offen {
    height: 100%;
    overflow: hidden;
  }
}

body,
h1, h2, h3, h4, p, figure, blockquote, dl, dd, ul, ol {
  margin: 0;
}

ul, ol {
  padding: 0;
  list-style: none;
}

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

button, input, select, textarea {
  font: inherit;
  color: inherit;
}

/* Das hidden-Attribut setzt display:none nur im Browser-Stylesheet - jede
   eigene display-Regel schlaegt es. Ohne diese Zeile steht eine leere
   Fehlerzeile sichtbar auf der Anmeldeseite, weil .fehlerzeile display:flex
   traegt. Gilt fuer alles, was spaeter noch dazukommt. */
[hidden] {
  display: none !important;
}

/* --- Grundlage --------------------------------------------- */

body {
  font-family: var(--schrift-familie);
  font-size: var(--groesse-text);
  font-weight: var(--schrift-normal);
  line-height: var(--zeilenhoehe-weit);
  color: var(--farbe-text);
  background: var(--farbe-hintergrund);
}

/* Deutsch produziert Woerter wie "Beitragsveroeffentlichungszeitpunkt".
   Ueberschriften duerfen trennen, sonst sprengen sie 390 px.
   Greift nur mit lang="de" - das setzt grundgeruest.ts. */
h1, h2, h3 {
  hyphens: auto;
  overflow-wrap: break-word;
  line-height: var(--zeilenhoehe-eng);
  letter-spacing: var(--laufweite-eng);
}

/* ===================================================================
   DAS GEWICHT IST GETRENNT — Frage 4, entschieden am 05.08.2026
   ===================================================================

   Hier stand `font-weight: var(--schrift-fett)` auf allen dreien.

   ENTSCHIEDEN: „600 für Fließtext und Zwischentitel, 700–800 nur für
   den Seitentitel." Damit ist `h1` der eine Fall, der schwer bleiben
   darf, und `h2`/`h3` sind Zwischentitel.

   DER BELEG, aus dem die Frage kam: in Jitters Startseiten-CSS steht
   Gewicht 600 in 15 Regeln, 800 in zwei, 700 in einer. Sein
   Größensprung entsteht über die GRÖSSE. Wer bei 15-px-Text 700–800
   nimmt, bekommt keinen Sprung, sondern eine schwere Fläche.

   45 weitere Regeln sind mit derselben Entscheidung auf 600 gefallen.
   Nicht angefasst: Bereich 02 (abgenommen) und die drei Seitentitel
   `.seitentitel`, `h1`, `.rechtstext__ueberschrift`. */
h1 {
  font-size: var(--groesse-h1);
  font-weight: var(--schrift-fett);
}

h2 {
  font-size: var(--groesse-h2);
  font-weight: var(--schrift-halbfett);
}

h3 {
  font-size: var(--groesse-h3);
  font-weight: var(--schrift-halbfett);
}

/* --- Fokus ------------------------------------------------- */

/* EIN TRAEGER, NICHT ZWEI.
   Vorher wechselte am Feld zusaetzlich der Rahmen die Farbe - zwei Ringe
   uebereinander, das wirkte schwer. Jetzt gibt es genau diese Regel, und
   sie gilt fuer alles: Knopf, Feld, Textbereich, Auswahlliste, Chip,
   Karte, Listeneintrag.

   Der Ring liegt AUSSEN mit Abstand. Sein Kontrast zaehlt gegen den
   Untergrund, nicht gegen das Element - gemessen 9,13 bis 11,61:1 auf
   allen Flaechen, die es bei uns gibt.

   Wer hier outline: none setzt, nimmt dem Element den einzigen
   Fokustraeger. Es gibt keinen Ersatz mehr, den man daneben schreiben
   koennte. */
:focus-visible,
.zeige-fokus {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: var(--fokusring-abstand);
  /* DER WEISSE SAUM AUSSEN — 05.08.2026, zweifarbiger Ring.
     Der Schatten deckt 0 bis 8 px, die Outline liegt bei 3 bis 6 px und wird
     UEBER ihm gemalt. Sichtbar bleibt: Weiss aussen, Tinte in der Mitte,
     Weiss im Abstand. Damit traegt der Ring auf jedem Grund, und Bereich 02
     braucht keine eigene Regel. Begruendung und Zahlen in tokens.css. */
  box-shadow: 0 0 0 var(--fokusring-saum) var(--farbe-fokusring-saum);
}

/* ===================================================================
   DER RING TRAEGT DIE FARBE SEINES ELEMENTS — 03.08.2026, nach Jitter
   ===================================================================

   GEMESSEN aus seinen Stilvorlagen: er baut den Fokus als `::before` mit
   `border: 1px solid <die eigene Farbe>` und `inset: -4px`. Der lila
   Knopf bekommt einen lila Ring, der rote einen roten, der weisse auf
   Dunkel einen weissen.

   DAS IST DIE EINE IDEE, DIE ICH HIER UEBERNEHME, und sie ist besser als
   unser Einheitsring: ein lila Ring um einen roten Loeschen-Knopf sagt,
   dass der Fokus zu etwas anderem gehoert als der Knopf. Der Ring in der
   Farbe des Elements sagt „DIESES hier".

   SEINE STAERKE UEBERNEHME ICH NICHT — angesagt am 03.08.2026 und nicht
   widersprochen. 1 px ist auf einem Tablet in der Sonne, mit Lesebrille,
   ueber einem Arbeitshandschuh nicht zu finden. `--fokusring` bleibt bei
   3 px; das ist der Wert, der fuer diese Zielgruppe gemessen wurde.

   ES GILT NUR, WO EIN ELEMENT WIRKLICH EINE EIGENE FARBE HAT. Ueberall
   sonst bleibt der Ring in der Primaerfarbe: sie ist auf Kontrast
   geprueft, und ein Ring, der die Farbe eines hellen Elements erbt,
   koennte die 3:1 aus WCAG 2.4.11 reissen. */
.knopf--gefahr:is(:focus-visible, .zeige-fokus),
.knopf--gefahr-umriss:is(:focus-visible, .zeige-fokus),
.knopf--still.knopf--gefahr:is(:focus-visible, .zeige-fokus) {
  outline-color: var(--farbe-fehler);
}

/* HIER STAND EINE AUSNAHME FUER DUNKLEN GRUND, und sie ist am 05.08.2026
   gefallen — nicht weil sie unrecht hatte, sondern weil ihr Grund weg ist.

   Sie lautete: „Auf dunklem Grund ist die Primaerfarbe der falsche Ring: sie
   haelt gegen --farbe-text zu wenig. Weiss ist dort der einzige Ton, der
   traegt." Das stimmte, solange der Ring EINE Farbe hatte.

   Seit er zwei hat — Tinte innen, Weiss aussen —, traegt auf dunklem Grund
   der Saum und auf hellem die Tinte. Eine Regel, die den Ring hier wieder
   einfarbig macht, naehme genau die Haelfte weg, die an dieser Stelle
   arbeitet. */

/* --- Sprungmarke ------------------------------------------- */

/* Erster Punkt der Tabulatorfolge. Unsichtbar, bis sie den Fokus hat -
   dann sichtbar an derselben Stelle, an der sie auch anspringt. */
.sprungmarke {
  position: absolute;
  left: var(--abstand-3);
  top: calc(var(--abstand-3) * -6);
  z-index: 100;
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: var(--abstand-2) var(--abstand-4);
  border-radius: var(--radius-klein);
  background: var(--farbe-primaer);
  color: var(--farbe-primaer-kontrast);
  font-weight: var(--schrift-halbfett);
  text-decoration: none;
  transition: top var(--dauer-mittel) var(--kurve);
}

.sprungmarke:focus {
  top: var(--abstand-3);
}

/* --- Nur fuer Vorleseprogramme ------------------------------ */

.nur-vorlesen {
  position: absolute;
  /* `left: 0` — nachgetragen am 04.08.2026, gefunden durch Baustelle 0.1.
     Ohne die Zeile beginnt das Element dort, wo es im Fluss stuende, und
     laeuft von da aus nach rechts. Bei einer `<table>` reicht das
     `overflow: hidden` darueber nicht: eine Tabelle richtet ihre Spalten
     nach ihrem Inhalt aus, nicht nach der 1-px-Breite ihres Kastens.

     Gemessen auf `/uebersicht` bei 390 px: `table.verlauf__zahlen` begann
     bei x = 43 und endete bei 393 — drei Pixel Querscroll fuer eine
     Tabelle, die niemand sieht. Vorher fing `overflow: hidden` an
     `.inhalt` es ab; das ist mit Baustelle 0.1 gefallen. */
  left: 0;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* WAS `.nur-vorlesen` NICHT KANN, und der Ort dafuer — 06.08.2026.
   ==============================================================
   Der Vermerk darueber sagt es schon: „eine Tabelle richtet ihre Spalten
   nach ihrem Inhalt aus, nicht nach der 1-px-Breite ihres Kastens."
   `left: 0` hat das am 04.08.2026 entschaerft, nicht behoben — es hat nur
   den Anfang festgenagelt. Solange die Verlaufstabelle zwei Spalten
   hatte, passte ihre Mindestbreite zufaellig in die 350 px, die bei
   390 px Fenster zur Verfuegung stehen. Mit fuenf Spalten waren es
   gemessene 102 px Querlauf.

   DIE ABHILFE STEHT NICHT HIER, SONDERN AM AUFRUFER: die Tabelle steckt
   seit dem 06.08.2026 in einem `<div class="verlauf__tabelle">`, und
   `nur-vorlesen` sitzt auf DEM. Ein Block-Element laesst sich auf 1 px
   klemmen und schneidet ab; eine Tabelle nicht.

   WER DIE NAECHSTE TABELLE VERSTECKT, macht es genauso. Eine Regel wie
   `table.nur-vorlesen { table-layout: fixed }` haette es hier auch
   getan — sie loest aber nur den Querlauf und nicht den zweiten Fall,
   der am selben Tag auffiel: OHNE SKRIPT ist die Tabelle sichtbar und
   lief bei 390 px 129 px ueber die Kante. Beides braucht denselben
   Kasten, also gibt es ihn einmal. */

/* ============================================================
   QUERSCHNITT Q8 - Bildlauf und Schnittkante

   BEFUND 2.2 DES BAUAUFTRAGS, gemessen: das Fenster scrollt auf
   keiner einzigen Seite (scrollHeight = clientHeight, ueberall) —
   gescrollt wird ausschliesslich in inneren Behaeltern. Der Inhalt
   ist damit ERREICHBAR. Nur sagt es niemandem jemand:

     /posteingang  1440   sichtbar  561 von 4891   verborgen 4330
     /posteingang   390   sichtbar  451 von 4891   verborgen 4440
     /inhalte      1440   sichtbar  566 von 5098   verborgen 4532
     /ziele         390   sichtbar  520 von  943   verborgen  423

   Kein Verlauf, kein Schatten, keine sichtbare Bildlaufleiste. Im
   Bild endet die Liste mitten in einer Zeile und liest sich als
   „hier ist die Liste zu Ende".

   Die Marke dafuer steht schon im Markup: `data-bildlauf="eigen"`.
   Sie sagt seit dem 31.07.2026 „diese Flaeche darf laenger werden als
   ihr Kasten und bringt ihren Bildlauf selbst mit", und die
   Huellenwache prueft daran, ob das auch stimmt. Genau dieselbe Menge
   braucht das Zeichen — deshalb haengt es an derselben Marke und
   nicht an einer zweiten Klasse, die man vergessen kann.

   DIE REGELN DAZU STEHEN AM ENDE DIESER DATEI, nicht hier. Grund
   siehe dort: eine Regel, die fuer alle gilt, muss NACH den
   Einzelfaellen stehen, sonst gewinnt der Einzelfall.
   ============================================================ */

/* ============================================================
   QUERSCHNITT Q5.4 - Auf- und Zuklappen: NICHT IN DIESER RUNDE

   Der Bauauftrag fuehrt es als „gebaut, CSS". Es ist es nicht, und
   das ist eine Entscheidung mit Grund, kein Vergessen.

   Regel 12 beschreibt ein Aufklappen als „Hoehe waechst in 200 ms,
   Pfeil dreht sich gleichzeitig". Das setzt eine Flaeche IM FLUSS
   voraus, die laenger wird und alles darunter mitschiebt.

   IM PRODUKT GIBT ES HEUTE GENAU EIN `<details>` — den
   Betriebs-Umschalter (`.betrieb--wahl`). Seine Liste ist
   `position: absolute` und legt sich UEBER den Inhalt: ihre Hoehe
   waechst nicht, sie erscheint. Das ist ein Ausklapp-Menue, nicht
   das Muster aus Regel 12. Beides unter denselben Namen zu bauen
   hiesse, zwei verschiedene Bewegungen gleich zu nennen — und der
   Naechste haelt die eine fuer die andere.

   SEIN ORT KOMMT NOCH, und er steht schon fest: §Q9.1 nennt das
   Konto-Menue als `<details>` (Bereich 21), Kapitel 20 die drei
   Rollenzeilen. Beide sind eigene Runden. §Q5.9 zieht dieselbe
   Linie fuer vier andere Muster: „Sie ohne Ort zu bauen hiesse, den
   Ort zu erfinden — das ist eine Entscheidung, keine Umsetzung."

   Damit stehen nach dieser Runde SIEBEN laufende Muster, nicht acht.
   Die Zaehlung steht in design-system/ABDECKUNG.md.
   ============================================================ */

/* ============================================================
   QUERSCHNITT Q5.6 - Der Haken

   Regel 12: „450 ms Zeichnung nach Upload oder Boost-Freigabe.
   Einmal, nicht bei jedem Blick."

   OHNE SKRIPT UND OHNE ZEITGEBER: die Seite wird nach dem Vorgang
   neu geladen, die Animation laeuft beim Aufbau. „Einmal" ergibt
   sich damit von selbst — es gibt nichts, was sie ein zweites Mal
   ausloesen koennte.

   DIE PFADLAENGE IST ABGELESEN, NICHT GERATEN. Das Zeichen `haken`
   liegt auf 24 x 24 Rastereinheiten und laeuft von (20,6) ueber
   (9,17) nach (4,12): sqrt(11^2+11^2) + sqrt(5^2+5^2) = 15,56 +
   7,07 = 22,63 Rastereinheiten. Aufgerundet 23 — ein Rest laesst
   den Haken unfertig aussehen, ein Ueberschuss nicht.
   ============================================================ */

/* NUR AM ERFOLG, NICHT AM ABGEARBEITETEN POSTEINGANG. Beide zeichnen
   denselben Haken (`bild()` in `zustaende.ts`), und das ist richtig —
   ein leerer Posteingang IST ein Erfolg. Aber `erfolg` ist ein
   EREIGNIS („Ist raus"), `leer-abgearbeitet` ein ZUSTAND. Regel 12
   sagt „einmal, nicht bei jedem Blick": eine Zeichnung, die jedes Mal
   laeuft, wenn nichts zu tun ist, ist genau das Gegenteil. */
.zustand--erfolg .zustand__haken .symbol path,
.zustand--erfolg .zustand__haken .symbol polyline {
  stroke-dasharray: 23;
  stroke-dashoffset: 23;
  animation: haken var(--dauer-lang) var(--kurve) forwards;
}

@keyframes haken {
  to { stroke-dashoffset: 0; }
}

/* ============================================================
   QUERSCHNITT Q5.8 - Der Seitenwechsel

   BEI UNS IST JEDER KLICK EIN SEITENWECHSEL: Filter setzen, Reiter
   wechseln, Nachricht oeffnen, Ordner oeffnen — alles laeuft ueber
   `?parameter=`. Ohne Uebergang sieht JEDE dieser Handlungen aus wie
   ein Neustart.

   WARUM DAS TROTZ „OHNE SKRIPT" ERLAUBT IST: es ist kein Skript und
   keine Bibliothek, es ist eine CSS-Eigenschaft. Wo der Browser sie
   nicht kennt, passiert GENAU das, was heute passiert — die Seite
   wechselt ohne Bewegung. Kein kaputter Zustand, keine
   Zwischenschicht, kein „geht bei dir nicht". Das ist der Grund, aus
   dem dieser Bereich Skript ablehnt, und er greift hier nicht.

   DAS GILT JETZT FUER DAS GANZE PRODUKT, nicht mehr nur fuer
   /einrichten. `oeffentlich/einrichten.css` behaelt seinen eigenen,
   ausgemessenen Uebergang und ueberschreibt diesen hier — es wird
   NACH oberflaeche.css geladen. Was sich aendert: der Sprung von
   /einrichten hinaus bekommt jetzt auch einen; vorher erklaerte das
   Zieldokument nichts und es blieb ein Schnitt.

   DIE HUELLE BLEIBT STEHEN. Sie ist auf jeder Seite dasselbe
   Element; ein eigener Name nimmt sie aus dem Wurzelwechsel heraus,
   sie bekommt gar keine Animation.
   =================================================================== */

@view-transition {
  navigation: auto;
}

/* HIER STANDEN ZWEI VERSUCHE, DIE NICHTS TATEN — 18.08.2026, und sie gehoeren
   aufgeschrieben statt stillschweigend entfernt.

   Gemeldet: „Beim Seitenuebergang stehen unten und rechts die Scrollleisten."

   `::view-transition { overflow: clip }` stand hier und aenderte den Messwert
   um NULL Pixel. Der Schluss von damals — „das Pseudo-Element traegt den
   Ueberlauf also nicht" — war falsch, und zwar nicht wegen der Zahl, sondern
   wegen der FRAGE: gemessen wurde `documentElement.scrollWidth`, und das
   Overlay ist `position: fixed`. Es traegt zum Dokument-Bildlauf grundsaetzlich
   nichts bei, egal was man ihm anhaengt.

   Ebenso starb die Vermutung „die Animation": `seite-herein` skaliere um 2 %,
   das waeren rund 43 px, gemessen seien 269 — also nicht die Animation. Auch
   dieser Schluss stand auf der falschen Messung. Die 269 px waren ein
   Zwischenstand mitten im Parsen (ein `ResizeObserver` fand danach keine
   einzige Hoehenaenderung), und die Animation WAR die Ursache.

   DIE LOESUNG STEHT BEI `@keyframes seite-herein`. Sie kam aus einer Frage an
   den Melder — „nur waehrend des Uebergangs oder auch danach?" — und aus dem
   Lesen der eigenen Keyframes, nicht aus einer sechsten Messung. */

/* ZWEI STATT DREI — 03.08.2026. `.unterleiste` ist mit der Reiterleiste
   gefallen. Ein `view-transition-name` auf einem Wähler, den es nicht mehr
   gibt, ist die erste Erscheinungsform aus PRUEFUNGEN.md in ihrer stillen
   Form: er sieht nach einer Aussage aus und trifft nichts.

   ZWEI NAMEN MUESSEN ES BLEIBEN und nicht einer: die Kopfzeile liegt fest
   am Fenster, die Leiste steht in der Spalte. Ein gemeinsamer Name auf zwei
   Elementen an verschiedenen Orten waere doppelt vergeben. */
.leiste {
  view-transition-name: huelle-leiste;
}

.kopf {
  view-transition-name: huelle-kopf;
}

::view-transition-old(root) {
  animation: seite-hinaus var(--dauer-uebergang) var(--kurve-hinaus) forwards;
}

::view-transition-new(root) {
  animation: seite-herein var(--dauer-uebergang) var(--kurve) backwards;
}

@keyframes seite-hinaus {
  to { opacity: 0; transform: translateX(-32px); }
}

/* ===================================================================
   SIE WAECHST HEREIN, STATT ZU SCHRUMPFEN — 18.08.2026, gemeldet
   ===================================================================

   GEMELDET: „Beim Seitenuebergang stehen unten und rechts die Scrollleisten.
   Sie sollen weg." Auf Rueckfrage praezisiert: NUR WAEHREND des Uebergangs,
   danach nicht.

   HIER STAND `scale(1.02)`. Der Schnappschuss von `::view-transition-new(root)`
   ist genau so gross wie das Sichtfeld; 2 % groesser ragt er auf ALLEN VIER
   Seiten darueber hinaus — bei 1440 x 900 sind das rund 14 px links und rechts,
   9 px oben und unten. Sichtbar wird davon, was der Browser als Leiste zeigt:
   unten und rechts.

   `0.98` KANN KEINEN UEBERLAUF ERZEUGEN, und das ist Geometrie statt
   Vermutung: was kleiner als das Sichtfeld ist, ragt nirgends hinaus. Die
   Anmutung bleibt ein sanfter Zoom — die neue Seite waechst herein, statt sich
   auf ihre Groesse zu setzen. Der Austritt (`translateX(-32px)`) bleibt
   unveraendert: nach LINKS erzeugt keine Leiste.

   ===================================================================
   WARUM DAS EINEN GANZEN TAG GEKOSTET HAT — die Messung mass das Falsche
   ===================================================================

   Vier Erklaerungen sind vorher gestorben, und die Messung, die sie
   erschlagen hat, war selbst der Fehler: sie las
   `documentElement.scrollWidth` — also das DOKUMENT. Das Overlay
   `::view-transition` ist `position: fixed` und traegt zum Dokument-Bildlauf
   NICHTS bei. Die Leiste gehoert zum Overlay, gemessen wurde daneben.

   Deshalb meldete `::view-transition { overflow: clip }` damals „null Pixel
   Aenderung" und wurde als wirkungslos zurueckgenommen — die Zahl war richtig
   und die Frage falsch. Und deshalb fuehrte die Suche ueber `scrollbar-gutter`
   in eine Richtung, die mit der Sache nichts zu tun hatte: sie reserviert
   Platz im Dokument, und dort war nie ein Problem.

   DIE LEHRE: wer eine Erscheinung nicht reproduzieren kann, prueft zuerst, ob
   er am richtigen Gegenstand misst. Fuenf Messungen an der falschen Stelle
   ergeben fuenf richtige Zahlen und keine Antwort. Die Antwort kam aus einer
   Frage an den Melder („nur waehrend oder auch danach?") und aus dem Lesen
   der eigenen Keyframes. */
@keyframes seite-herein {
  from { opacity: 0; transform: scale(0.98); }
}

/* DER SICHTWECHSEL FAELLT NICHT UNTER DIE STERNCHEN-REGEL weiter
   unten: er laeuft auf einer eigenen Pseudo-Ebene, die
   `*, *::before, *::after` nicht erreicht. Wer Bewegung abgeschaltet
   hat, saehe sonst als Einziges genau diesen Uebergang. */
@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*),
  ::view-transition-old(*),
  ::view-transition-new(*) {
    animation: none !important;
  }
}

/* ============================================================
   DER ABSCHNITT - das tragende Mittel unserer Website
   Angesagt am 04.08.2026: "Das ist wirklich der Stil eins zu
   eins uebernommen auf allen, auf Posteingang, Inbox etc.
   Also mehr grosse graue Flaechen."

   GEMESSEN AN DER VORLAGE, nicht nachempfunden. Auf der
   Startseite von EB-Software-Website bei 1440 px:

     weiss   #ffffff   30.049k Bildpunkte
     grau    #f2f1f3   12.393k Bildpunkte
     Linie   #e5e4e7    5.435k Bildpunkte  (auch als FLAECHE)

   Das Grau traegt gut ein Drittel der Seite. Es ist aber KEIN
   Seitengrund: der bleibt weiss. Nachgemessen an vier ihrer
   Seiten - Drafts, Trash und 404 sind weiss ohne eine einzige
   Karte, grau ist der Abschnitt. Genau diese Unterscheidung
   war am 03.08.2026 der Grund fuer `6e8afc9` ("warum ist alles
   grau auf einmal, das ist falsch"), und sie gilt weiter.

   DER KASTEN HAT KEINEN ECKENRADIUS UND KEINEN RAND.
   Der Kachelblock der Vorlage traegt beides nicht - was ihn
   traegt, ist die Flaeche und die Polsterung. Das passt zu der
   Entscheidung vom 03.08.2026, die Knoepfe eckig zu machen.

   DIE WAEHLER DER VORLAGE STEHEN HIER OHNE PUNKT. Sie gehoeren
   einem anderen Stilblatt; mit Punkt geschrieben behaupten sie,
   es gaebe sie hier - und die Blockpruefung in huelle.test.ts
   meldet das zu Recht, sie liest Kommentare mit.
   ============================================================ */

/* HIER WIRD `--inhalt-breite` ZUM ERSTEN MAL GELESEN. Bis zum
   04.08.2026 trug er zwoelf Zeilen Herleitung und NULL
   Verwendungen - wer ihn angehoben haette, haette nichts
   geaendert und gemeldet, es sei erledigt. Der Abschnitt ist
   der Behaelter, den er die ganze Zeit beschrieben hat. */
/* ===================================================================
   DIE SEKTION IST DURCHSICHTIG — 05.08.2026, gemessen an der Vorlage
   ===================================================================
   Gerendert an Jitters Startseite: **alle sieben** Sektionen tragen
   Radius 0, keinen Grund und kein Polster. Den Abstand tragen ihre
   KINDER; nur der Hero hat 240 px oben. Was Flaeche traegt, sind die
   Kacheln darin — und die tragen 0 oder 40 px Rundung.

   `--abschnitt-radius` und `--abschnitt-polsterung` pflegten damit etwas,
   das die Vorlage nicht hat. Beide sind gefallen.

   DAS ERLEDIGT KASTEN-IN-KASTEN AN DER WURZEL, statt es Seite fuer Seite
   aufzuloesen: eine graue Wanne mit weissen Karten darin kann es nicht
   mehr geben, wenn die Wanne keine Flaeche hat. */
.abschnitt {
  margin-bottom: var(--abschnitt-abstand);
}

.abschnitt:last-child {
  margin-bottom: 0;
}

/* HIER STAND `.abschnitt--grau` mit `--farbe-flaeche-gedaempft`. Sie war
   die graue Wanne aus dem Befund „Kasten-in-Kasten lebt: zwei graue
   Wannen, jede mit zwei weissen Karten darin". Sie faellt mit dem Grund
   der Sektion — eine Klasse, die eine Flaeche setzt, wo die Vorlage keine
   hat, ist kein Baustein, sondern eine Ebene zu viel.

   Der graue Grund der EINSTELLUNGEN ist davon nicht betroffen: er ist
   ausdruecklich abgesegnet („Grauer Grund bleibt so. Frage nicht danach")
   und liegt an `.einstellungen`, nicht hier. */

/* KARTEN AUF GRAU BLEIBEN WEISS. Das ist gemessen und nicht
   gewaehlt: `6e8afc9` hat am 03.08.2026 vier Seiten der Vorlage
   ausgezaehlt, und die eine graue darunter - Settings - traegt
   zwei WEISSE Karten.

   Der naheliegende Gegenvorschlag war #f3f3f5, die zweite
   Graustufe der Vorlage. Ausprobiert und wieder verworfen: auf
   #f2f1f3 ist sie einen Zahlenwert je Kanal entfernt und damit
   praktisch unsichtbar. Die Vorlage benutzt sie auch nicht
   dafuer, sondern fuer eine Karte in einem Stapel
   (stapelkarte--eins). Weiss auf Grau ist der Kontrast, den
   der Kasten braucht. */

/* Die farbigen Abschnitte. Jeder traegt DUNKLEN Text - das ist
   keine Stilfrage: der beste Wert der ganzen Akzentfamilie
   gegen Weiss ist 2,89:1, gegen Tinte der schlechteste 6,16:1.
   Deshalb setzt die Vorlage nirgends Weiss darauf. */
.abschnitt--violett { background-color: var(--farbe-akzent-violett-blass); }
.abschnitt--gelb    { background-color: var(--farbe-akzent-gelb-blass); }
.abschnitt--cyan    { background-color: var(--farbe-akzent-cyan-blass); }

.abschnitt--violett,
.abschnitt--gelb,
.abschnitt--cyan {
  color: var(--farbe-text);
}

/* DIE AUGENBRAUE - die kleine Zeile ueber der Ueberschrift.
   Auf `referenzen.html` steht dort "REFERENZEN" in gedaempftem
   Grau, gesperrt, klein und in Grossbuchstaben. Sie sagt, wo
   man ist, ohne eine zweite Ueberschrift zu sein.

   GESPERRT UND IN GROSSBUCHSTABEN, aber NICHT als `text-transform`
   allein: Vorleseprogramme lesen `REFERENZEN` sonst als Buchstabenfolge.
   Der Text steht in normaler Schreibweise im Markup, die Anzeige
   macht die Stilvorlage. */


/* DIE TEXTHERVORHEBUNG. Auf der Startseite steht sie in der
   grauen Pille oben: "Neu: Antworten auf Kommentare, ganz von
   allein  Mehr dazu" - der letzte Teil in der Handlungsfarbe.

   SIE IST KEIN <mark>. Ein `mark` behauptet eine Fundstelle;
   was hier gemeint ist, ist Betonung. Und sie traegt NIE
   allein die Aussage - Regel 11: Farbe ist nie der einzige
   Traeger, deshalb steht sie zusaetzlich halbfett. */
.hervor {
  color: var(--farbe-primaer);
  font-weight: var(--schrift-halbfett);
}

/* Die gelbe Hinterlegung, wie auf `referenzen.html`. Sie faerbt
   die FLAECHE hinter dem Wort, nicht das Wort - dunkler Text auf
   Gelb haelt 16,40:1. */
.hervor--flaeche {
  color: inherit;
  background-color: var(--farbe-akzent-gelb-blass);
  box-decoration-break: clone;
  padding: .1em .3em;
}

/* ============================================================
   BEREICH 09 - UI-Bausteine
   Modal, Seitenpanel, Toast, Schalter, Chips. Dazu der Knopf,
   den i1 mitbeschreibt ("Abbrechen als Umriss, die Handlung
   gefuellt").
   ============================================================ */

/* ============================================================
   BEREICH 15 - Icons und Grafikstil
   Entscheidung p6: Linien-Icons, weisse Umrisse auf der farbigen
   Leiste, jedes mit einem Wort darunter. Fuer Leerzustaende
   einfarbige graue Strichzeichnungen.

   STRICHSTAERKE, ENDEN UND ECKEN STEHEN HIER - EINMAL.
   Nicht 27 Mal im Markup. Wer sie dort setzt, muss sie 27 Mal
   richtig setzen. Die Werte und die Begruendung fuer den
   optischen Ausgleich stehen in tokens.css.
   ============================================================ */

.symbol {
  /* Standard: 24 px. Die drei Groessen sind Tokens; eine vierte gibt
     es nicht. */
  width: var(--symbol-standard);
  height: var(--symbol-standard);
  flex: none;
  stroke-width: var(--symbol-strich);
  stroke-linecap: var(--symbol-enden);
  stroke-linejoin: var(--symbol-ecken);
}

/* OPTISCHER AUSGLEICH. Ein Strich in Rastereinheiten skaliert mit:
   2,25 auf 20 px waeren nur 1,875 px und damit unter der Auflage aus
   Regel 15 ("mindestens 2 px, eher 2,25"). Also dickerer Strich im
   Raster, damit der gerenderte gleich bleibt. */
.symbol--klein {
  width: var(--symbol-klein);
  height: var(--symbol-klein);
  stroke-width: var(--symbol-strich-klein);
}

/* Nach oben wird NICHT ausgeglichen: ein grosses Symbol mit 2,25 px
   Strich wirkt spindelig. Gerendert sind es hier 3 px. */
.symbol--gross {
  width: var(--symbol-gross);
  height: var(--symbol-gross);
}

/* --- Graue Strichzeichnungen -------------------------------- */

/* Regel 15: "einfarbige graue Strichzeichnung - sehr zurueckhaltend,
   kein Bild mit Farbe." Sie ist Verzierung: der Satz in Frageform
   daneben traegt die Aussage (Regel 10). Deshalb ist sie leiser als
   Text und im Markup aria-hidden. */
.zeichnung {
  display: block;
  width: 128px;
  height: 96px;
  margin: 0 auto;
  color: var(--farbe-zeichnung);
  stroke-width: var(--zeichnung-strich);
  stroke-linecap: var(--symbol-enden);
  stroke-linejoin: var(--symbol-ecken);
}

/* --- Leerbilder: die farbigen Illustrationen ----------------- */

/* GETAUSCHT AM 01.08.2026. Bis dahin stand hier eine graue
   Strichzeichnung (`.zeichnung` oben), und `leerbild.ts` war als
   Austauschstelle dafuer gebaut. Der Tausch war genau die
   Dateiaenderung, als die er vorgemerkt war: kein Aufrufer hat sich
   geaendert.

   HOEHE STATT BREITE. Die fuenf Dateien haben Seitenverhaeltnisse von
   1,88:1 bis 1,02:1 — mit einer festen BREITE waere das hoechste Bild
   fast doppelt so hoch wie das flachste, und der Leerzustand saehe auf
   jeder Seite anders aus. Ueber die Hoehe stehen alle fuenf gleich
   hoch da; `width: auto` haelt das Verhaeltnis.

   `max-width` ist die Reissleine fuer 390 px: das flachste Bild waere
   bei 200 px Hoehe 376 px breit und damit fast so breit wie der
   Bildschirm. */
/* EINE REGEL FÜR ALLE SECHZEHN — 02.08.2026, angesagt: „feste Rahmenhöhe,
   Breite ergibt sich, mittig und unverzerrt eingepasst. Kein Motiv darf das
   Layout bestimmen."

   Sie stand bisher nur an `.leerbild`; die Fehlerseiten und der Wizard
   brachten ihre eigenen Maße mit. Damit bestimmte das Motiv den Ort: die
   sechzehn Dateien laufen von 1,88 : 1 bis 1,02 : 1, und wer ein flacheres
   nachlegt, verschiebt die Seite darunter.

   `object-fit: contain` ist die Auflage „unverzerrt": ohne sie hängt es
   davon ab, ob Höhe und Breite zusammenpassen — und das weiß nur die Datei.
   `--bildrahmen` ist der eine Wert; die drei Orte setzen ihn um, statt ihn
   zu wiederholen.

   HIER STAND AUCH `.wizard__bild` — mit dem Quartals-Wizard gefallen
   (12.08.2026). Was blieb, war ein Element ohne Block: die Wache „kein
   Baustein greift in die Klassen eines anderen" hat es gemeldet, sobald
   sie die Vermerke nicht mehr mitliest. */

/* ===================================================================
   DIE VOLLTON-FLAECHE IM LEERZUSTAND — Baustelle 0.4, 04.08.2026
   ===================================================================

   `.leerbild` stand hier mit und war ein `<img>`. Angesagt: „Leerzustaende
   bekommen vorerst nur Typografie und eine Vollton-Flaeche. Emoji kommen
   am Ende, gemeinsam mit der Einrichtungs-Tour, in einem eigenen Auftrag."

   SIE HAELT DEN PLATZ, den das Motiv spaeter bekommt — dieselbe Hoehe
   (`--bildrahmen`), dieselbe Mitte. Wer die Emoji nachlegt, tauscht den
   Inhalt und nicht die Geometrie darunter.

   RUNDUNG 40 PX. [gemessen] Jitters grosse Kacheln tragen `4rem` bei
   `html { font-size: 10px }`, siehe `vorlage/jitter/MESSUNG.md`. Bei uns
   steht dieselbe Zahl als Pixel, weil unsere Wurzel 16 px ist.

   WELCHE STELLE WELCHEN TON HAT, steht in `UEBERGABE.md`. Sie haengt am
   Namen des Leerzustands und nicht an der Seite: derselbe Zustand sieht
   ueberall gleich aus, zwei verschiedene auf einer Seite unterscheiden
   sich. */
/* ===================================================================
   DIE SZENEN DER LEERZUSTAENDE — 19.10.2026, Lennard: „diesen Artstyle
   nutzen wir nicht mehr, schau dir die Website an, die Motion-Grafiken"
   ===================================================================

   Hier standen vier Vollton-Toene (04.08.2026) und `img.leerflaeche` fuer
   die drei PNG (10.08.2026). Jetzt ist die Flaeche der GRAUE GRUND der
   Website, und darauf liegt eine Szene aus ihren Bausteinen: weisse Karte
   mit kleiner Rundung, Symbole im Markenblau in hellblauen Kreisen, graue
   Zeilen, gestrichelte Plaetze, ein kleiner schwarzer Knopf, darunter eine
   schwebende Pille (`leerbild.ts`).

   ALLES IN `em`, und die Groesse kommt aus der HOEHE DER FLAECHE
   (`container-type: size`, `cqh`): dieselbe Szene steht ueber einem
   Leerzustand bei 260 bzw. 200 px und im Drive bei 120 px.

   DIE RUNDUNG IST DIE DER WEBSITE-KARTEN (0,8 rem bei 9,1 px ≈ 7 px), nicht
   mehr die 40 px der Jitter-Kacheln. */
.leerflaeche {
  display: block;
  height: var(--bildrahmen);
  width: min(100%, 20rem);
  margin: 0 auto;
  border-radius: 8px;
  background: var(--farbe-flaeche-gedaempft);
  container-type: size;
  overflow: hidden;
}

.leerszene {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.9em;
  height: 100%;
  /* NICHT UNTER 14 PX: darunter waeren die Symbole kleiner als 16 px, und
     ihr Strich faellt unter die 2,25 px, die `messungen.spec.ts` fuer jedes
     Symbol verlangt. Wo die Flaeche dafuer zu klein ist (Drive, 120 px),
     steht das Zeichen allein (`.dateien__leer`). */
  font-size: clamp(14px, 7cqh, 17px);
}

/* DER STRICH IST KRAEFTIGER ALS IM SATZ (3,4 statt 2,25 Rastereinheiten):
   gemessen 19.10.2026 lagen die Symbole der Szene bei 16,1 px Kante und
   1,51 px Strich, die Hausregel verlangt 2,25. 3,4 × 16,1 / 24 = 2,28. */
.leerszene .symbol {
  width: 1.15em;
  height: 1.15em;
  stroke-width: 3.4;
}

.leerszene__karte {
  display: flex;
  flex-direction: column;
  gap: 0.7em;
  width: 13em;
  max-width: 88%;
  padding: 1em;
  border-radius: 0.45em;
  background: var(--farbe-flaeche);
  box-shadow: var(--schatten-2);
  animation: leerszene-setzen var(--dauer-erzaehlen) var(--kurve) both;
}

.leerszene__zeile {
  display: flex;
  align-items: center;
  gap: 0.7em;
}

.leerszene__zeile--blass {
  opacity: 0.45;
}

.leerszene__kreis {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.2em;
  height: 2.2em;
  border-radius: 50%;
  background: var(--farbe-primaer-sehr-hell);
  color: var(--farbe-akzent-violett-kraeftig);
}

/* „Hier liegt nichts": gestrichelt statt gefuellt. */
.leerszene__kreis--offen {
  background: none;
  border: 0.1em dashed var(--farbe-rand-bedienelement);
}

.leerszene__striche {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  gap: 0.45em;
  min-width: 0;
}

.leerszene__strich {
  display: block;
  height: 0.5em;
  width: 100%;
  border-radius: 0.25em;
  background: var(--farbe-rand);
}

.leerszene__strich--kurz {
  width: 60%;
}

/* Gestrichelt wirkten die duennen Zeilen wie Doppellinien (im Bild
   gesehen) — sie werden blasser statt gestrichelt. */
.leerszene__zeile--offen .leerszene__strich {
  background: var(--farbe-flaeche-gedaempft);
}

/* Drive und Inhalte: Plaetze nebeneinander, darunter der Knopf. */
.leerszene__karte--raster {
  align-items: flex-end;
}

/* Eine Zeile darin geht ueber die volle Breite — sonst schrumpft sie auf
   ihren Kreis (im Bild gesehen, „Inhalte"). */
.leerszene__karte--raster > .leerszene__zeile {
  align-self: stretch;
}

.leerszene__plaetze {
  display: flex;
  gap: 0.6em;
  width: 100%;
}

.leerszene__platz {
  flex: 1 1 0;
  display: flex;
  align-items: center;
  justify-content: center;
  aspect-ratio: 1;
  min-width: 0;
  border: 0.1em dashed var(--farbe-rand-bedienelement);
  border-radius: 0.3em;
  color: var(--farbe-akzent-violett-kraeftig);
}

.leerszene__knopf {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.2em;
  height: 2.2em;
  border-radius: 0.3em;
  background: var(--farbe-text);
  color: var(--farbe-flaeche);
}

/* Der Weg vom Kanal ins Portal, wie „Nachbarstadt — Ihr Ort". */
.leerszene__karte--weg {
  flex-direction: row;
  align-items: center;
  gap: 0.6em;
}

.leerszene__quellen {
  display: flex;
  flex-direction: column;
  gap: 0.45em;
}

.leerszene__weg {
  flex: 1 1 auto;
  min-width: 1em;
  border-top: 0.12em dashed var(--farbe-rand-bedienelement);
}

.leerszene__suchzeile {
  display: block;
  height: 1.6em;
  border-radius: 0.8em;
  background: var(--farbe-flaeche-gedaempft);
}

.leerszene__spur {
  display: block;
  height: 0.6em;
  border-radius: 0.3em;
  background: var(--farbe-flaeche-gedaempft);
  overflow: hidden;
}

.leerszene__fuellung {
  display: block;
  width: 8%;
  height: 100%;
  background: var(--farbe-akzent-violett-kraeftig);
}

.leerszene__pille {
  display: inline-flex;
  align-items: center;
  gap: 0.6em;
  width: 8em;
  padding: 0.6em 1em;
  border-radius: 999px;
  background: var(--farbe-flaeche);
  box-shadow: var(--schatten-2);
  color: var(--farbe-akzent-violett-kraeftig);
  animation: leerszene-schweben var(--dauer-erzaehlen) var(--kurve) 0.25s both;
}

.leerszene__pille .leerszene__strich {
  flex: 1 1 auto;
}

@keyframes leerszene-setzen {
  from { opacity: 0; transform: translateY(0.6em); }
  to { opacity: 1; transform: none; }
}

@keyframes leerszene-schweben {
  from { opacity: 0; transform: translateY(1.2em); }
  to { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  .leerszene__karte,
  .leerszene__pille {
    animation: none;
  }
}

/* DAS ZEICHEN ALLEIN — nur wo die Karte nicht passt (neben einem Satz in
   den Einstellungen, 48 bzw. 72 px; die Regeln dafuer stehen dort, bei
   `.block__leerbild`). Sonst steht es nicht da. */
.leerszene__zeichen {
  display: none;
}

/* ===================================================================
   DIE PILLE — Baustelle 2.1, 04.08.2026, angesagt „Gemischt"
   ===================================================================

   Vorgelegt war die Frage, ob die Knoepfe rund werden: Commit `4e6efce`
   hatte am 03.08.2026 Jitters ANWENDUNG ausgemessen (Drafts 3x Radius 0,
   Settings 5x Radius 0) und `--radius-knopf` daraufhin auf 0 gesetzt —
   „seine runden Formen sind nicht seine Knoepfe, die Pillen stehen auf
   der Marketing-Seite".

   ENTSCHIEDEN: gemischt. Pillen fuer Hauptaktionen und Vollton-Zusagen,
   eckig fuer alles Uebrige. `--radius-knopf: 0px` bleibt deshalb der
   Vorgabewert und gilt weiter fuer jeden gewoehnlichen Knopf; die Pille
   ist eine ausdrueckliche Variante, die man anfordern muss.

   WARUM DAS KEIN WIDERSPRUCH IST: die beiden Formen unterscheiden zwei
   Sorten Knopf, die vorher gleich aussahen. Ein Pillen-Knopf steht auf
   einer Vollton-Kachel und traegt DIE Handlung der Seite; ein eckiger
   steht in einem Formular und traegt eine von mehreren.

   [gemessen] Jitters Pille: `border-radius: 5rem` bei `html {
   font-size: 10px }` — 50 px. Polsterung `.8rem 5rem`, also aussen
   sechsmal so viel wie oben und unten. Genau das macht die Form aus,
   nicht die Rundung allein. */
/* `.knopf.knopf--pille` UND NICHT `.knopf--pille` — berichtigt am
   06.08.2026, gefunden beim Hinsehen und nicht von einer Zahl.

   DIE PILLE WAR NIE EINE. Diese Regel steht bei Zeile 815, die
   Grundregel `.knopf` bei 1314; beide haben die Spezifitaet 0-1-0,
   und bei gleicher Spezifitaet gewinnt die spaetere. `.knopf` setzt
   `border-radius: var(--radius-knopf)` — und das ist 0 — sowie
   `padding: … var(--abstand-5)` als Kurzform, die `padding-inline`
   mitnimmt. Beide Zeilen hier waren seit dem 04.08.2026 wirkungslos,
   auf allen Seiten, die eine Pille anfordern.

   Es ist derselbe Fehler wie bei `.antwort`, `.quartal` und
   `.zeichnung`: die spaetere Regel gewinnt, und die frueher stehende
   sieht im Quelltext richtig aus. Der Doppelname hebt die Spezifitaet
   auf 0-2-0 und macht die Reihenfolge gleichgueltig. */
.knopf.knopf--pille {
  border-radius: var(--radius-rund);
  /* 50 px seitlich waeren bei unserer 16-px-Wurzel unverhaeltnismaessig
     breit; `--abstand-6` (32 px) haelt das Verhaeltnis zur Hoehe, das
     Jitter zeigt, ohne die Kachel zu sprengen. */
  padding-inline: var(--abstand-6);
}

/* SCHWARZ GEFUELLT — Jitters `_black_`: Grund `#19171c`, Schrift `#fff`.
   Das ist die Hauptaktion. Bei uns liegen beide Werte schon als
   `--farbe-knopf-dunkel` und `--farbe-primaer-kontrast` vor. */
.knopf--dunkel {
  background: var(--farbe-knopf-dunkel);
  color: var(--farbe-primaer-kontrast);
  border-color: transparent;
}

/* OHNE `color` — 05.08.2026. Die Zeile stand hier und setzte GENAU DEN
   WERT, den die Grundregel darüber schon setzt: sie hat nie etwas
   bewirkt und trotzdem die Wache „kein Zustand fasst die Textfarbe an"
   ausgelöst.
   Deren Grund ist keine Förmlichkeit: welche Farbe gewinnt, entscheidet
   bei gleicher Spezifität die Reihenfolge im Stylesheet. Eine Zeile, die
   heute dasselbe sagt, sagt nach dem nächsten Umbau etwas anderes. */
.knopf--dunkel:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-knopf-dunkel-ueberfahren);
}

/* ===================================================================
   DIE ANTWORTKACHEL — Baustelle 2.1
   ===================================================================

   „Eine Vollton-Kachel oben, die die eine Antwort traegt (‚7 Nachrichten
   warten auf dich'), mit Pillen-Knopf direkt in den Posteingang."

   SIE STEHT DIREKT AUF WEISS, ohne graue Wanne — Baustelle 0.3: „nie
   eine graue Flaeche, die nur eine einzelne weisse Karte umschliesst".

   RUNDUNG 40 PX. [gemessen] Jitters grosse Kacheln tragen `4rem` bei
   10-px-rem. TINTE, NIE WEISS: auf keinem seiner Volltoene steht weisse
   Schrift. Der schlechteste Kontrast der drei hier ist Tinte auf
   `--farbe-akzent-violett` mit 7,27:1. */
.aussage {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--abstand-2);
  margin-bottom: var(--abstand-5);
  padding: var(--abstand-6);
  border-radius: 40px;
  background: var(--farbe-akzent-violett);
  color: var(--farbe-text);
}

.aussage--violett { background: var(--farbe-akzent-violett); }
.aussage--gelb    { background: var(--farbe-akzent-gelb); }
.aussage--blau    { background: var(--farbe-akzent-blau); }

/* ===================================================================
   EINE FLAECHE OHNE KENNZAHLEN LEGT SICH QUER — 06.08.2026
   ===================================================================

   DIE REGEL DIESER RUNDE LAUTET: „Eine Vollton-Flaeche ueber die volle
   Breite traegt MEHRERE Dinge ueber die Breite verteilt — oder sie bleibt
   schmal." Seit die Kennzahlen der Uebersicht eigene Kacheln haben, traegt
   ihre Flaeche nur noch EIN Ding, und gemessen bei 1920 px blieben rechts
   davon rund 1370 px violett und leer.

   SCHMAL WERDEN WAR DIE FALSCHE DER BEIDEN MOEGLICHKEITEN: unter einem
   Seitentitel ueber die volle Breite und ueber vier Kacheln ueber die volle
   Breite haette eine schmale Flaeche dazwischen wie ein Rest ausgesehen.

   ALSO VERTEILT SIE IHR EINES DING. Die Form steht bei Later („Organic
   Social Overview", Mobbin): ein violettes Band, dessen Inhalt WAAGERECHT
   liegt — Kennzeichen links, Satz in der Mitte, Handlung rechts. Dieselbe
   Anordnung wie Jitters „Drafts", wo die Handlungen unter dem Titel die
   Breite nehmen, statt in der linken Spalte zu stehen.

   `:has()` UND KEINE ZWEITE KLASSE: ob die Flaeche quer liegt, haengt
   daran, ob sie Kennzahlen traegt — das steht im Inhalt und nicht im
   Aufrufer. Eine Marke am Aufrufer koennte man vergessen zu setzen; diese
   Regel kann man nicht falsch bedienen.

   NUR AB 45rem. Am Handy stehen drei Dinge nebeneinander nicht — dort
   bleibt die Spalte, die die Flaeche ohnehin ist. */
@container huelle (min-width: 45rem) {
  /* EIN RASTER UND KEINE FLEX-ZEILE, und der Unterschied ist der Grund,
     warum es hier steht: Zahl, Satz und Zusatz sind DREI Geschwister, die
     zusammengehoeren, der Knopf ist das eine, das gegenuebersteht. In einer
     Flex-Zeile mit `space-between` landete der Zusatz mittig im Nichts —
     nachgemessen bei 1920 px stand er allein bei x = 410 mit je 400 px Luft
     links und rechts. Das Raster stapelt die drei links und stellt den Knopf
     an die rechte Kante, ueber beide Zeilen mittig. */
  .aussage:not(:has(.aussage__kennzahlen)) .aussage__kopf {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
    column-gap: var(--abstand-7);
    row-gap: var(--abstand-2);
    /* `.aussage` steht auf `align-items: flex-start` — ohne das hier bliebe
       der Kopf so breit wie sein Inhalt und die Verteilung liefe ins Leere. */
    align-self: stretch;
  }

  .aussage:not(:has(.aussage__kennzahlen)) .aussage__zeile {
    grid-column: 1;
    grid-row: 1;
  }

  .aussage:not(:has(.aussage__kennzahlen)) .aussage__zusatz {
    grid-column: 1;
    grid-row: 2;
    margin: 0;
  }

  .aussage:not(:has(.aussage__kennzahlen)) .aussage__kopf > .knopf {
    grid-column: 2;
    grid-row: 1 / span 2;
    justify-self: end;
  }
}

/* Zahl und Satz in EINER Zeile: „7 Nachrichten warten auf dich" ist ein
   Satz, keine Zahl mit Beschriftung darunter. Genau das meint der
   Auftrag mit „kein Kennwert ohne Bedeutung". */
/* DIE ZAHL STEHT FREI — 05.08.2026.
   =================================
   Hier stand `display: flex; align-items: baseline`, und damit klebte die
   grosse Zahl an der Textzeile: „7Nachrichten warten auf dich." Bei Jitter
   steht die grosse Zahl FREI und traegt die Flaeche; der Satz steht
   darunter, nicht daneben.

   `flex-direction: column` und `align-items: start` statt einer Zeile: die
   Zahl bekommt ihre eigene Zeile, der Satz seine. Die Luecke bleibt, sie
   wirkt jetzt nur senkrecht. */
.aussage__zeile {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--abstand-2);
  margin: 0;
  /* Ein Flex-Kind ist von sich aus `min-width: auto` und kann nicht unter
     seinen Inhalt schrumpfen. */
  min-width: 0;
}

/* DIE GROSSE ZAHL ALS BILD — Punkt 7 der Formensprache. Sie nimmt
   `--groesse-bewertung` (72 px, feste Groesse ohne `clamp`): der Wert
   wurde fuer die gefallene Bewertungszahl erarbeitet, und die Begruendung
   gilt hier unveraendert — eine Zahl, die am Handy auf 44 px faellt, ist
   nicht mehr die auffaelligste Stelle. */
.aussage__zahl {
  /* GROESSER UND MIT LUFT — 05.08.2026. Sie ist die Aussage, fuer die man
     die Seite oeffnet, und war mit 72 px kleiner als der Seitentitel
     daneben. `--groesse-seitentitel` bindet sie an dieselbe Leiter: 72 px
     bei 1440, 96 ab 1441. */
  display: block;
  font-size: var(--groesse-seitentitel);
  font-weight: var(--schrift-schwer);
  line-height: 1;
  letter-spacing: -0.032em;
}

@container huelle (min-width: 1441px) {
  .aussage__zahl {
    font-size: var(--groesse-seitentitel-weit);
  }
}

.aussage__satz {
  font-size: var(--groesse-gross);
  font-weight: var(--schrift-halbfett);
  letter-spacing: var(--laufweite-eng);
}

/* ===================================================================
   DIE KENNZAHLEN AUF DER FLAECHE — 05.08.2026
   ===================================================================
   Eine Vollton-Flaeche ueber die volle Breite traegt MEHRERE Dinge ueber
   die Breite verteilt, oder sie bleibt schmal. Beleg: WRITER aus
   Messung B — eine violette Flaeche, vier Kennzahlen darauf, je zwei
   Zeilen.

   Der Anlass war ein Fund an dieser Seite: seit die Spalte von 938 auf
   1776 px gewachsen ist, sassen Zahl, Satz und Knopf in den ersten
   400 px, und dreiviertel der Flaeche stand leer.

   `auto-fit` und `minmax(0, 1fr)`: bei vier Kennzahlen und 1776 px stehen
   sie nebeneinander, am Handy untereinander. `minmax(0, …)` und nicht
   `1fr`, weil ein Rasterfeld sonst nicht unter seinen Inhalt schrumpfen
   kann — dieselbe Falle, die in diesem Umbau siebenmal zugeschlagen
   hat. */
.aussage__kennzahlen {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr));
  gap: var(--abstand-5);
  margin: var(--abstand-6) 0 0;
  padding: 0;
}

.aussage__kennzahl {
  min-width: 0;
}

/* EIN WORT OBEN. Klein und in Tinte — nicht gedaempft: auf Vollton traegt
   der gedaempfte Ton den Kontrast nicht, und Weiss kommt in der Vorlage
   auf Vollton nirgends vor. */
.aussage__kennzahl-wort {
  display: block;
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  letter-spacing: var(--laufweite-eng);
}

/* EINE GROSSE ZAHL DARUNTER. Kleiner als die eine Antwort daneben — sie
   ist die Begleitung, nicht die Aussage. */
.aussage__kennzahl-zahl {
  display: block;
  margin: var(--abstand-1) 0 0;
  font-size: var(--groesse-h2);
  font-weight: var(--schrift-schwer);
  line-height: 1.05;
  letter-spacing: -0.032em;
}

/* ===================================================================
   DER PLATZ UNTER ALLEM — 05.08.2026
   ===================================================================

   Fuer eine Anzeige, die auf die Flaeche gehoert und die volle Breite
   braucht: heute der Fortschrittsbalken des Quartalsziels auf `/ziele`.

   ER STEHT UNTER KOPF UND KENNZAHLEN UND NICHT IN DER KOPFSPALTE. Ab
   1100 px ist der Kopf 20 rem breit — ein Balken darin waere bei 1440 px
   320 px lang und bei 1920 px genauso. Eine Anzeige, die mit der Flaeche
   nicht mitwaechst, ist der Befund dieser Runde in klein. */
.aussage__unten {
  /* `stretch` GEGEN DAS `align-items: flex-start` DER FLAECHE. Ohne die
     Zeile ist der Balken so breit wie sein Inhalt — und ein Balken hat
     keinen, also bliebe er 0 px. Im Rasterfall ab 1100 px greift
     `justify-items: stretch` von selbst; unterhalb ist die Flaeche eine
     Flex-Spalte, und dort nicht. */
  align-self: stretch;
  min-width: 0;
  margin-top: var(--abstand-6);
}

/* KOPF UND KENNZAHLEN NEBENEINANDER, sobald Platz ist. Der Kopf traegt die
   eine Antwort und bekommt ein Drittel; die Kennzahlen teilen sich den
   Rest. Darunter stehen sie untereinander. */
@container huelle (min-width: 1100px) {
  .aussage:has(.aussage__kennzahlen) {
    display: grid;
    grid-template-columns: minmax(0, 20rem) minmax(0, 1fr);
    gap: var(--abstand-7);
    align-items: start;
  }

  .aussage__kennzahlen {
    margin-top: 0;
  }

  /* Ueber BEIDE Spalten. Ohne diese Zeile landet der Balken unter dem
     Kopf und ist so breit wie er — 320 px in einer 1296 px breiten
     Flaeche, mit der rechten Haelfte leer.

     UND OHNE EIGENES AUSSENMASS: die Zeilenluecke des Rasters ist schon
     48 px. Gemessen mit beidem standen 100 px zwischen dem Zusatz und
     dem Balken — die Flaeche bekam ein Loch in der Mitte. */
  .aussage__unten {
    grid-column: 1 / -1;
    margin-top: 0;
  }
}

/* ===================================================================
   DER BALKEN AUF DEM VOLLTON — 05.08.2026
   ===================================================================

   GERECHNET, NICHT GESCHAETZT. Der Balken ist fuer weissen Grund gebaut,
   und auf `--farbe-akzent-violett` (#B593FF) traegt keines seiner drei
   Teile:

     Bahn      f2f1f3 auf Violett   2,18 : 1
     Rand      8a8a8a auf Violett   1,41 : 1
     Marke     127a4b auf Violett   2,20 : 1   — unter der 4,5-Auflage

   Die Bahn wird deshalb eine durchscheinende TINTE und die Fuellung
   volle Tinte: 7,27:1 gegen den Vollton, dieselbe Zahl wie fuer jede
   andere Schrift auf dieser Flaeche. Das ist keine Ausnahme, sondern die
   Regel dieser Runde — TINTE AUF VOLLTON, KEIN WEISS und keine zweite
   Farbe.

   DIE MARKE VERLIERT IHR GRUEN UND NICHT IHRE AUSSAGE. Der Vermerk am
   Baustein sagt es selbst: „Die Marke ist der Traeger. Eine Balkenlaenge
   liest man nicht ab, und Farbe sagt gar nichts." Was traegt, sind der
   Haken und die Worte „Ein Monat vor Plan" — beide bleiben.

   Die Kerbe bleibt weiss: sie liegt IN der Fuellung, und dort ist Weiss
   der Gegensatz zur Tinte. */
.aussage .balken__bahn {
  background: color-mix(in srgb, var(--farbe-text) 18%, transparent);
  border-color: color-mix(in srgb, var(--farbe-text) 32%, transparent);
}

.aussage .balken__fuellung,
.aussage .balken--erreicht .balken__fuellung {
  background: var(--farbe-text);
}

.aussage .balken__marke,
.aussage .balken--erreicht .balken__marke {
  color: var(--farbe-text);
}

/* ===================================================================
   FLACH — fuer Seiten, deren Arbeitsflaeche die Hoehe braucht
   ===================================================================

   Auf der Uebersicht IST die Flaeche die Seite. Im Posteingang steht sie
   ueber einer Liste, die 90 % der Nutzung traegt — und genau daran ist
   die Tafel dort am 31.07.2026 schon einmal gescheitert: bei 390 px nahm
   sie die halbe Bildschirmhoehe, und die Auskunft stand vor der Arbeit.

   WAS FLACH WEGNIMMT, IST HOEHE UND KEINE AUSSAGE: das Polster faellt von
   32 auf 16 px, die grosse Zahl von 96 auf 30 px. Sie bleibt die groesste
   Ziffer der Flaeche, sie traegt nur nicht mehr die Seite — das tut hier
   die Liste.

   Die Zahl gibt damit die Bindung an `--groesse-seitentitel` auf, und das
   ist der Punkt: auf der Uebersicht soll sie so gross sein wie der Titel,
   hier ausdruecklich nicht. */
.aussage--flach {
  gap: var(--abstand-1);
  margin-bottom: 0;
  padding: var(--abstand-4) var(--abstand-5);
  border-radius: 20px;
}

/* EINE REGEL REICHT, UND ZWAR WEGEN DER SPEZIFITAET. Weiter oben hebt
   `@container huelle (min-width: 1441px) { .aussage__zahl }` die Groesse
   auf 96 px — eine Behaelterabfrage zaehlt bei der Spezifitaet nicht mit,
   die Regel darin ist also 0-1-0. Diese hier ist 0-2-0 und gewinnt auf
   jeder Breite. Ohne diesen Umstand braeuchte es einen zweiten Block,
   und zwei Zahlen fuer dieselbe Sache laufen auseinander. */
.aussage--flach .aussage__zahl {
  font-size: var(--groesse-h2);
}

/* Zahl und Satz nebeneinander statt untereinander: bei 30 px Ziffer ist
   „7 Nachrichten warten auf dich." wieder EIN Satz und keine Schlagzeile
   mit Unterzeile. Auf der Uebersicht steht die Zahl frei, weil sie dort
   96 px hoch ist und ein Bild abgibt — hier gaebe sie nur eine Leerzeile
   ab. `baseline`, damit die Grundlinien stimmen. */
.aussage--flach .aussage__zeile {
  flex-direction: row;
  align-items: baseline;
  gap: var(--abstand-2);
  flex-wrap: wrap;
}

/* ===================================================================
   AM SCHMALEN FENSTER EINE ZEILE JE KENNZAHL — 05.08.2026
   ===================================================================

   GEMESSEN, UND ES WAR DERSELBE FEHLER NOCH EINMAL: mit Wort oben und
   Wert darunter nahm die Flaeche bei 390 px 391 px Hoehe — 46 % eines
   844 px hohen Bildschirms. Die Tafel ist am 31.07.2026 an genau dieser
   Zahl gefallen („die halbe Bildschirmhoehe, die Auskunft vor der
   Arbeit"), und ohne diese Messung waere sie unter neuem Namen
   zurueckgekommen.

   Zwei Zeilen je Kennzahl sind die Bauart der Vorlage (WRITER: kleines
   Wort oben, grosse Zahl darunter) — und sie ist fuer ZAHLEN gebaut.
   Hier stehen keine: „seit 07:18 Uhr" und „Facebook · 4" sind Auskuenfte
   in Worten, und in 30 px gesetzt kosten sie die Hoehe einer Schlagzeile
   fuer den Inhalt einer Bildunterschrift.

   Deshalb schmal: Wort links, Wert rechts, eine Zeile. Ab 1100 px steht
   die Vorlagenform wieder da — dort ist Breite genug, dass zwei Zeilen
   nichts kosten. */
.aussage--flach .aussage__kennzahlen {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-1);
  margin-top: var(--abstand-3);
}

.aussage--flach .aussage__kennzahl {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--abstand-3);
  /* Passen Wort und Wert nicht nebeneinander, rutscht der Wert unter das
     Wort, statt beide in schmale Saeulen zu brechen. Ohne das steht bei
     206 px Inhalt „Meiste / warten / auf" untereinander — drei Zeilen fuer
     drei Woerter. */
  flex-wrap: wrap;
}

.aussage--flach .aussage__kennzahl-zahl {
  margin: 0;
  font-size: var(--groesse-text);
  text-align: right;
}

/* AB 1100 PX ZURUECK ZUR VORLAGENFORM. Dieselbe Breite, an der Kopf und
   Kennzahlen ohnehin nebeneinander ruecken — und dieselbe, ab der die
   Chipzeile umbricht statt zu rollen. Eine Breite, ein Grund.

   Gleiche Spezifitaet wie der Block darueber (0-2-0), also entscheidet
   die Reihenfolge: dieser steht spaeter und gewinnt. */
@container huelle (min-width: 1100px) {
  /* `space-between` UND NICHT DAS `auto-fit`-RASTER DER UEBERSICHT, und
     der Grund ist die Anzahl. Die Uebersicht traegt vier Kennzahlen; vier
     gleiche Spuren fuellen die Flaeche. Der Posteingang traegt zwei — in
     zwei Spuren zu je 700 px stand die zweite bei x = 1157 und endete bei
     1330, also 450 px vor der Kante. Eine Flaeche, die ihre rechte Haelfte
     leer laesst, ist genau der Befund, gegen den diese Runde gebaut wird.

     Mit `space-between` liegt die erste am Anfang, die letzte an der Kante
     — bei zwei Kennzahlen wie bei fuenf. */
  .aussage--flach .aussage__kennzahlen {
    display: flex;
    /* AUSDRUECKLICH ZURUECK AUF `row`. Der Block darueber setzt `column`
       fuer das schmale Fenster; ohne diese Zeile bleibt er stehen, und
       `space-between` verteilt die Kennzahlen dann in der HOEHE — gemessen
       wuchs die Flaeche dadurch von 107 auf 169 px, waehrend rechts
       weiterhin alles leer stand. Eine Eigenschaft, die man umschaltet,
       muss man in beide Richtungen umschalten. */
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: space-between;
    gap: var(--abstand-5) var(--abstand-7);
    margin-top: 0;
  }

  .aussage--flach .aussage__kennzahl {
    display: block;
    min-width: 0;
  }

  .aussage--flach .aussage__kennzahl-zahl {
    margin-top: var(--abstand-1);
    font-size: var(--groesse-h2);
    text-align: left;
  }
}

/* ZWEIFARBIG — Punkt 2 der Formensprache, und die Stelle, an der es auf
   dieser Seite EINMAL vorkommt: die Aussage traegt Tinte, der Zusatz
   darunter den gedaempften Ton. Mehr als einmal je Seite wird daraus
   Streifenmuster. */
.aussage__zusatz {
  margin: 0;
  font-size: var(--groesse-klein);
  /* NICHT `--farbe-text-gedaempft`: der ist auf Weiss gemessen (5,07:1)
     und faellt auf Vollton unter die Auflage. Eine Deckkraft auf der
     Tinte bleibt am Untergrund, auf dem sie wirklich liegt. */
  color: color-mix(in srgb, var(--farbe-text) 72%, transparent);
}

/* --- Symbolknopf -------------------------------------------- */

/* Nur fuer Schliessen, Zurueck, Plus und Minus. Alles andere braucht
   ein Wort daneben - durchgesetzt von symbolknopf() in
   src/oberflaeche/symbole.ts, das bei jedem anderen Namen wirft. */
.symbolknopf {
  min-width: 44px;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: var(--radius-rund);
  background: transparent;
  /* NACHGEZOGEN AM 14.08.2026: hier stand `--farbe-text-leise` (Jitters
     ruhende Farbe, #97979B) — tokens.css sagt zu diesem Ton selbst
     "Zeichen, kein Text", und selbst fuer Zeichen gilt WCAG 1.4.11 (3:1
     fuer graphische Bedienelemente). Gemessen 2,91:1 auf Weiss, 2,58:1 auf
     der gedaempften Flaeche (Ueberfahren/aktiv) — unter 3 in beiden
     Zustaenden. `--farbe-rand-bedienelement` ist bereits fuer genau diesen
     Fall kalibriert (3,45:1 / 3,07:1) und steht schon im Ueberfahren-Ring
     dieses Bausteins zwei Zeilen weiter unten — derselbe Ton fuer denselben
     Zweck statt ein zweiter, fast identischer daneben. */
  color: var(--farbe-rand-bedienelement);
  cursor: pointer;
}

.symbolknopf:is(:hover, .zeige-ueberfahren):not(:disabled) {
  background: var(--farbe-flaeche-gedaempft);
  box-shadow: inset 0 0 0 2px var(--farbe-rand-bedienelement);
}

.symbolknopf:is(:active, .zeige-aktiv):not(:disabled) {
  transform: translateY(1px);
  box-shadow: none;
}

.symbolknopf:disabled {
  cursor: not-allowed;
  color: var(--farbe-gesperrt-text);
  background: var(--farbe-gesperrt-flaeche);
  box-shadow: inset 0 0 0 var(--randbreite) var(--farbe-gesperrt-rand);
}

/* --- Knopf -------------------------------------------------- */

.knopf {
  /* 44 px ist die Untergrenze aus der Pruefliste - Handschuh, nicht
     Fingerspitze. Die Polsterung darf sie erhoehen, nie unterschreiten. */
  min-height: 44px;
  min-width: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--abstand-2);
  padding: var(--abstand-2) var(--abstand-5);
  border: var(--randbreite) solid transparent;
  /* Pille, wie der Toast. Als Token, nicht als Einzelwert. */
  border-radius: var(--radius-knopf);
  font-size: var(--groesse-text);
  font-weight: var(--schrift-halbfett);
  line-height: var(--zeilenhoehe-mittel);
  text-align: center;
  /* KEINE UNTERSTREICHUNG, auch wenn der Knopf ein `<a>` ist.
     Ohne Skript muss jeder Weg eine Adresse haben, also sind mehrere
     Knoepfe im Produkt Verweise — und die bringen Unterstreichung
     mit. Bisher stand die Ausnahme je Ort ("Weitere laden" in
     Bereich 03), bis in Bereich 02 ein unterstrichenes "Los geht's"
     im Bild stand. Eine Regel, die man je Ort wiederholt, ist eine,
     die irgendwo fehlt. */
  text-decoration: none;
  cursor: pointer;
  /* Fuer die Welle. Sie darf den Knopf nicht verlassen. */
  position: relative;
  overflow: hidden;
  transition: background-color var(--dauer-schnell) var(--kurve),
              border-color var(--dauer-schnell) var(--kurve);
}

.knopf--gefuellt {
  background: var(--farbe-primaer);
  border-color: var(--farbe-primaer);
  color: var(--farbe-primaer-kontrast);
}
/* DIE TIEFERE STUFE, NICHT DIE HELLERE — berichtigt am 04.08.2026.

   Hier stand `--farbe-primaer-hell`. Weiße Schrift darauf hält 4,02:1, nötig
   sind 4,5:1 — gemeldet von der Zustandsmatrix in den Zuständen `ueberfahren`
   und `aktiv`.

   DIE AUSNAHME, DIE DAS DECKEN SOLLTE, GIBT ES NICHT. tokens.css schreibt an
   dem Token: „Für den 18-px-Knopftext in Gewicht 600 reicht das — das ist
   Großtext, Auflage 3:1." Beide Hälften des Satzes stimmen nicht. Der
   Knopftext ist `--groesse-text`, also 17 px; und Großtext beginnt bei fett
   erst ab 14 pt = 18,66 px, also hätten auch 18 px nicht gereicht. Die
   Auflage war die ganze Zeit 4,5.

   `--farbe-primaer-tief` ist genau für diesen Zustand abgeleitet worden
   („die tiefere Stufe für den Überfahren-Zustand des lila Knopfes") und wird
   von `.kopf__knopf` schon so benutzt — mit dem Vermerk, die hellere Stufe
   wäre „die falsche Richtung". Sie war es hier auch. Weiß darauf: 7,19:1.

   Das weicht von Jitters gemessenem Hover ab, der nach oben geht. Der
   Vermerk steht in ABDECKUNG.md: wo eine gemessene Vorlage unter eine
   Auflage fällt, gewinnt die Auflage — und die Richtung nach unten ist nach
   oben offen, die nach oben nicht. */
.knopf--gefuellt:is(:hover, .zeige-ueberfahren):not(:disabled) {
  background: var(--farbe-primaer-tief);
  border-color: var(--farbe-primaer-tief);
}

/* ===================================================================
   DER UMRISS IST NICHT MEHR VIOLETT — 11.08.2026, angesagt
   ===================================================================

   HIER STAND `--farbe-rand-primaer-leise` (#817DC9) mit der Begründung:
   „Der Rand kommt aus derselben Familie wie die Handlung, nur
   zurückgenommen. Neutralgrau wirkte leblos."

   WAS ER GEKOSTET HAT, steht auf den Bildern dieser Runde: „Neuer
   Ordner" auf `/drive`, drei „Trennen" und ein „Verbinden" auf
   `/einstellungen`, „Logo wählen", „Termin verschieben" — bis zu sechs
   violette Umrisse auf EINEM Bildschirm, während der eine gefüllte
   Knopf daneben dieselbe Familie trägt. Eine Farbe, die die Handlung
   auszeichnen soll, zeichnet nichts aus, wenn sie an jedem Knopf steht.

   GEMESSEN bei Jitter (`._button._cancel`): `color: #19171c;
   background: #fff; border: 1px solid #e5e4e7`. Der Zweitknopf ist dort
   SCHWARZ AUF WEISS MIT GRAUER KANTE — kein Farbton der Hauptfarbe.

   #E5E4E7 ÜBERNEHMEN WIR NICHT, und zwar aus demselben Grund wie bei
   den Eingabefeldern heute früh: 1,20:1 auf Weiß, WCAG 1.4.11 verlangt
   3:1 für die Grenze eines Bedienelements. `--farbe-rand-bedienelement`
   (#8A8A8A, 3,45:1) ist derselbe Wert, den die Felder tragen — und das
   ist der Nebengewinn: Feld und Zweitknopf haben ab jetzt dieselbe
   Kante, statt zweier verschiedener Grautöne nebeneinander.

   ROT UND GEFAHR SIND NICHT BETROFFEN. `--gefahr-umriss` behält seinen
   roten Rand: dort IST die Farbe die Aussage. */
.knopf--umriss {
  background: var(--farbe-flaeche);
  border-color: var(--farbe-rand-bedienelement);
  color: var(--farbe-text);
}
/* DIE PILLE MUSS NACH `--umriss` STEHEN — 04.08.2026, im Bild gefunden.
   Beide Regeln haben dieselbe Spezifitaet (0-1-0), also gewinnt die
   spaetere. `.knopf--umriss` setzt `border-radius: var(--radius-knopf)`
   und machte die Pille darueber wieder eckig: „Neuer Ordner" stand als
   Kasten neben der runden Hauptaktion.

   Die Wiederholung ist die kleinste Abhilfe. Die Alternative waere,
   `--radius-knopf` an der Variante zu ueberschreiben — dann stuende der
   Wert an zwei Stellen und die naechste Variante haette dasselbe
   Problem.

   NACHTRAG 06.08.2026: diese Regel ist seit der Berichtigung bei Zeile
   830 ueberfluessig — `.knopf.knopf--pille` deckt jede Pille ab. Sie
   bleibt als BELEG stehen: hier hat schon einmal jemand denselben
   Fehler getroffen und ihn fuer die eine Variante geflickt, statt die
   Ursache zu suchen. Genau deshalb blieb die gefuellte Pille eckig. */
.knopf--pille.knopf--umriss {
  border-radius: var(--radius-rund);
}

/* BEIM ÜBERFAHREN IN DIE TINTE, nicht in die Primärfarbe. Sie war der
   zweite Ort, an dem Violett am Zweitknopf stand — und der auffälligere,
   weil er unter dem Zeiger auftaucht. Die Tinte hält 17,79:1 gegen Weiß
   gegen 3,45 im Ruhezustand: der Wechsel ist deutlicher als vorher, ohne
   eine Familie zu behaupten, zu der der Knopf nicht gehört. */
.knopf--umriss:is(:hover, .zeige-ueberfahren):not(:disabled) {
  border-color: var(--farbe-text);
}

/* Rot nur bei echtem Datenverlust - Regel 10. Nicht fuer
   Bestaetigungen, nicht als Betonung. */
.knopf--gefahr {
  background: var(--farbe-fehler);
  border-color: var(--farbe-fehler);
  color: var(--farbe-primaer-kontrast);
}

/* MIT BEREICH 08 DAZUGEKOMMEN. `h1` haelt bei User Interviews fest, dass
   "Trennen" rot UMRANDET ist statt gefuellt - "sichtbar, aber nicht
   einladend". Einen Kanal zu trennen ist kein Datenverlust, also waere der
   gefuellte Gefahrenknopf zu laut; Neutralgrau waere zu leise.

   Gemessen: --farbe-fehler auf --farbe-flaeche haelt 5,62:1. Ueber 4,5:1 fuer
   die Schrift und ueber 3:1 fuer den Rand. */
.knopf--gefahr-umriss {
  background: var(--farbe-flaeche);
  border-color: var(--farbe-fehler);
  color: var(--farbe-fehler);
}
/* KEINE eigene Ueberfahren-Regel. Der Schatten aus `.knopf:is(:hover, …)`
   weiter unten traegt den Zustand fuer ALLE Knopfarten - Tiefe statt Farbe.
   Eine dickere Randbreite waere der zweite Traeger gewesen, haette aber die
   Geometrie um 1 px verschoben: der Rand waechst nach innen, der Inhalt
   rutscht. Ein Knopf, der beim Zeigen zuckt, ist schlechter als einer, der
   nur einen Schatten bekommt. */

.knopf--breit { width: 100%; }

/* Ueberfahren: der Schatten kommt dazu. Nicht nur die Farbe - in
   Graustufen und bei Farbsehschwaeche bleibt der Zustand so sichtbar. */
.knopf:is(:hover, .zeige-ueberfahren):not(:disabled) {
  box-shadow: var(--schatten-2);
}

/* Gedrueckt: der Knopf gibt nach. Geometrie, keine Farbe. */
.knopf:is(:active, .zeige-aktiv):not(:disabled) {
  transform: translateY(1px);
  box-shadow: none;
}

/* GESPERRT.
   Vorher stand hier `opacity: .55`. Gemessen: 2,07:1 - unlesbar.
   Deckkraft ist als Zustand nicht messbar, ohne die Flaeche darunter
   mitzurechnen; genau daran ist der Fehler vorbeigelaufen.
   Jetzt echte Werte (5,10:1 Text, 3,57:1 Rand) und ein gestrichelter
   Rand als Traeger, der keine Farbe ist. */
.knopf:disabled {
  cursor: not-allowed;
  background: var(--farbe-gesperrt-flaeche);
  border-color: var(--farbe-gesperrt-rand);
  border-style: dashed;
  color: var(--farbe-gesperrt-text);
  box-shadow: none;
}

/* --- Der Absendezustand ------------------------------------- */
/*
   „ES LÄUFT" IST NICHT DASSELBE WIE „GESPERRT" — 02.08.2026, Kapitel 22.7.

   Ein abgeschickter Anmeldeknopf war bisher schlicht `disabled`: gestrichelte
   graue Kachel, kein Zeichen, kein Hinweis, dass etwas passiert. Das sagt
   „du darfst nicht", während gemeint ist „ich arbeite".

   Nur eine der fünf Vorlagen zeigt diesen Zustand überhaupt, und sie zeigt
   ihn genau (Supabase, gemessen): der Knopfkasten bleibt UNVERÄNDERT — kein
   Schrumpfen —, die Füllung geht von Deckkraft 1,00 auf 0,50 (drei Kanäle
   unabhängig gerechnet: 0,500 / 0,500 / 0,512), links kommt ein Ring dazu,
   und die Beschriftung rückt 8 px nach rechts. Sie verschwindet nicht.

   Die halbe Deckkraft steht als `color-mix` und nicht als eigener Farbwert:
   sie IST die Primärfarbe, nur halb aufgetragen. Ein neues Token wäre ein
   zweiter Ort für dieselbe Entscheidung.

   Nicht über `opacity` am ganzen Knopf: das nähme der Schrift den Kontrast
   mit — weiß auf halbtransparentem Violett hielte 2,4 : 1 statt 4,72 : 1. */
.knopf--laedt:disabled {
  cursor: progress;
  background: color-mix(in srgb, var(--farbe-primaer) 50%, var(--farbe-flaeche));
  border-color: color-mix(in srgb, var(--farbe-primaer) 50%, var(--farbe-flaeche));
  border-style: solid;
  color: var(--farbe-primaer-kontrast);
}

/* Der Ring sitzt links vor dem Wort. Die Lücke des Knopfes schiebt die
   Beschriftung damit nach rechts, ohne dass der Kasten wächst. */
.knopf--laedt .kringel {
  order: -1;
}

/* Ripple: Welle am Beruehrungspunkt, 450 ms. Pflicht nach Regel 12 -
   beantwortet "habe ich getroffen?", bevor die Handlung reagiert. */
.welle {
  position: absolute;
  border-radius: var(--radius-rund);
  background: currentColor;
  opacity: .35;
  transform: scale(0);
  animation: wellen var(--dauer-lang) var(--kurve) forwards;
  pointer-events: none;
}

@keyframes wellen {
  to { transform: scale(1); opacity: 0; }
}

/* --- i1 Modal ----------------------------------------------- */

.modal {
  width: min(420px, calc(100vw - var(--abstand-6)));
  padding: 0;
  border: 0;
  border-radius: var(--radius-gross);
  background: var(--farbe-flaeche);
  color: var(--farbe-text);
  box-shadow: var(--schatten-3);
}

.modal::backdrop { background: var(--farbe-schleier); }

.modal__kasten {
  display: grid;
  gap: var(--abstand-3);
  padding: var(--abstand-5);
}

.modal__titel { font-size: var(--groesse-h3); }
.modal__frage { color: var(--farbe-text-gedaempft); }

/* Genau zwei Knoepfe, rechts unten. */
.modal__knoepfe {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: var(--abstand-2);
  margin-top: var(--abstand-2);
}

/* Bei 390 px untereinander: nebeneinander waeren beide schmaler als
   ihr Text und die Trefferflaeche wuerde unbrauchbar. */
@media (max-width: 30rem) {
  .modal__knoepfe { flex-direction: column-reverse; }
  .modal__knoepfe .knopf { width: 100%; }
}

/* --- i1 ohne Skript: die Rueckfrage — 19.10.2026 -------------

   Ein Zustand der Seite (`?entziehen=…`, `?entfernen=…`), gebaut wie das
   Kontomenue: fest ueber allem, der Schleier dahinter ist der Verweis
   zurueck. Der Kasten ist der des Modals (`.modal`, `.modal__kasten`).
   NEUER NAME, vorher geprueft: `.rueckfrage` stand in keiner Vorlage. */
.rueckfrage {
  position: fixed;
  inset: 0;
  z-index: 40;
  display: grid;
  place-items: center;
  padding: var(--abstand-4);
}

.rueckfrage__zurueck {
  position: fixed;
  inset: 0;
  background: var(--farbe-schleier);
}

/* `min-width: 0` — der Kasten ist ein Raster-Kind; ein langer Name im
   Titel darf ihn nicht breiter machen als den Bildschirm. */
.rueckfrage__kasten {
  position: relative;
  min-width: 0;
  max-width: 100%;
}

.rueckfrage .modal__titel {
  margin: 0;
  overflow-wrap: anywhere;
}

.rueckfrage .modal__frage {
  margin: 0;
}

/* --- i2 Seitenpanel ----------------------------------------- */

/* KEINE Abdunklung. Sobald abgedunkelt wird, ist es ein Modal und der
   Sprung zur naechsten Zeile faellt weg. Die Liste bleibt links
   sichtbar UND bedienbar - deshalb auch kein <dialog>. */
.panel {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  z-index: 50;
  width: min(420px, 100vw);
  display: flex;
  flex-direction: column;
  background: var(--farbe-flaeche);
  border-left: 1px solid var(--farbe-rand);
  box-shadow: var(--schatten-3);
  transform: translateX(100%);
  visibility: hidden;
  transition: transform var(--dauer-mittel) var(--kurve),
              visibility 0s linear var(--dauer-mittel);
}

.panel[data-offen="ja"] {
  transform: translateX(0);
  visibility: visible;
  transition: transform var(--dauer-mittel) var(--kurve), visibility 0s;
}

.panel__kopf {
  display: flex;
  align-items: center;
  gap: var(--abstand-3);
  padding: var(--abstand-4);
  border-bottom: 1px solid var(--farbe-rand);
}

.panel__titel {
  flex: 1;
  font-size: var(--groesse-h3);
  min-width: 0;
}

.panel__schliessen {
  flex: none;
  min-width: 44px;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: var(--radius-klein);
  background: transparent;
  color: var(--farbe-text-gedaempft);
  cursor: pointer;
}
/* Der Ring ist der Traeger. Die Textfarbe wird nicht angefasst - siehe
   die Regel am Chip. */
.panel__schliessen:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-flaeche-gedaempft);
  box-shadow: inset 0 0 0 2px var(--farbe-rand-bedienelement);
}

.panel__inhalt {
  flex: 1;
  overflow-y: auto;
  padding: var(--abstand-4);
}

.panel__fuss {
  padding: var(--abstand-4);
  border-top: 1px solid var(--farbe-rand);
}

/* Am Handy kommt es von unten und laesst oben einen Streifen frei -
   Regel 12: nie als Vollbild, der Rest der Liste muss sichtbar bleiben. */
@media (max-width: 45rem) {
  .panel {
    top: auto;
    left: 0;
    width: 100vw;
    max-height: 85vh;
    border-left: 0;
    border-top-left-radius: var(--radius-gross);
    border-top-right-radius: var(--radius-gross);
    transform: translateY(100%);
  }
  .panel[data-offen="ja"] { transform: translateY(0); }
}

/* --- i3 Toast ----------------------------------------------- */

/* Ein Satz, unten, verschwindet von selbst. Kein X: ein Toast, den man
   wegklicken muss, ist ein Dialog. */
.toast {
  position: fixed;
  left: 50%;
  bottom: var(--abstand-5);
  z-index: 60;
  display: flex;
  align-items: center;
  gap: var(--abstand-2);
  max-width: min(28rem, calc(100vw - var(--abstand-5)));
  padding: var(--abstand-3) var(--abstand-4);
  border-radius: var(--radius-rund);
  background: var(--farbe-text);
  color: var(--farbe-flaeche);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  box-shadow: var(--schatten-3);
  transform: translate(-50%, 160%);
  transition: transform var(--dauer-mittel) var(--kurve);
}

.toast[data-offen="ja"] { transform: translate(-50%, 0); }

/* Der Haken ist der zweite Traeger neben dem Text. Die dunkle Flaeche
   allein sagt nichts. */
.toast__haken {
  display: inline-flex;
  flex: none;
  color: var(--farbe-erfolg-hell);
}

/* --- i4 Schalter -------------------------------------------- */

.schalter {
  display: flex;
  align-items: flex-start;
  gap: var(--abstand-3);
}

/* Keine feste Breite: "AUS" ist breiter als "AN", und bei +15 %
   wachsen beide. */
.schalter__knopf {
  flex: none;
  /* 88 STATT 76 PX — 02.08.2026. „AN" und „AUS" sind verschieden breit:
     die Pille mass 78 px an und 87 px aus, und die Textspalte daneben
     ruckte bei jeder Umlegung um 9 px. Alle fuenf Referenzablaeufe zeigen
     0 px Versatz beim Zustandswechsel. Die Breite des laengeren Wortes
     bestimmt jetzt beide Zustaende. */
  min-width: 88px;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  padding: var(--abstand-1);
  border: var(--randbreite) solid var(--farbe-rand-bedienelement);
  border-radius: var(--radius-rund);
  background: var(--farbe-flaeche-gedaempft);
  cursor: pointer;
  transition: background-color var(--dauer-mittel) var(--kurve),
              border-color var(--dauer-mittel) var(--kurve);
}

.schalter__knopf[aria-checked="true"] {
  background: var(--farbe-erfolg);
  border-color: var(--farbe-erfolg);
}

/* Das Wort steht IM Schalter. Das ist der Kern des Bausteins und der
   wichtigste Einzelfund der Recherche. */
.schalter__wort {
  order: 2;
  flex: 1;
  /* Vier Zeichen: „AUS" plus Luft. Ohne das traegt das Wort selbst den
     Breitenunterschied weiter, auch wenn die Pille ihn nicht mehr zeigt. */
  min-width: 4ch;
  text-align: center;
  padding: 0 var(--abstand-2);
  font-size: var(--groesse-mikro);
  font-weight: var(--schrift-halbfett);
  letter-spacing: var(--laufweite-weit);
  color: var(--farbe-text-gedaempft);
}

.schalter__knopf[aria-checked="true"] .schalter__wort {
  order: 0;
  color: var(--farbe-primaer-kontrast);
}

/* Der Griff wandert von rechts nach links. Dritter Traeger neben Wort
   und Flaeche: auch ohne Farbe und ohne Lesen sieht man die Stellung. */
.schalter__griff {
  order: 1;
  flex: none;
  width: 30px;
  height: 30px;
  border-radius: var(--radius-rund);
  background: var(--farbe-flaeche);
  box-shadow: var(--schatten-1);
}

.schalter__text {
  display: grid;
  gap: var(--abstand-1);
  padding-top: var(--abstand-2);
  min-width: 0;
}

.schalter__beschriftung {
  font-weight: var(--schrift-halbfett);
  cursor: pointer;
}

.schalter__erklaerung {
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

/* --- i5 Chips ----------------------------------------------- */

.chipzeile {
  display: flex;
  flex-wrap: wrap;
  gap: var(--abstand-2);
}

/* ===================================================================
   UNTEREINANDER — 18.08.2026, fuer das Filterblatt
   ===================================================================

   SIE IST EIN MODIFIKATOR DES BAUSTEINS UND KEIN FREMDEINGRIFF. Der erste
   Anlauf schrieb `.filterwahl__blatt .chipzeile { flex-direction: column }`,
   und die Wache „kein Baustein greift in die Klassen eines anderen" hat das
   sofort gemeldet — zu Recht: wer der Chipzeile von aussen eine Richtung
   vorschreibt, aendert sie ueberall dort mit, wo sie sonst noch steht.

   WARUM ES SIE BRAUCHT: im aufgeklappten Filterblatt stehen bis zu sechs
   Chips. Nebeneinander passen sie bei 390 px und +15 % Schrift nicht mehr —
   gemeldet von „kein Text laeuft aus seinem Element heraus". Rollen darf das
   Blatt nicht (das war der Fehler, den der Filterumbau beseitigt), also
   stehen sie untereinander. In einem Blatt ist das die natuerliche Form: es
   ist so hoch, wie es sein muss.

   `align-items: stretch` MACHT SIE GLEICH BREIT. Chips verschiedener Breite
   untereinander saehen aus wie eine Treppe; in einer Liste zum Anklicken ist
   die gleiche Breite auch die groessere Trefferflaeche. */
.chipzeile--spalte {
  flex-direction: column;
  flex-wrap: nowrap;
  align-items: stretch;
  gap: var(--abstand-1);
}

.chip {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  gap: var(--abstand-1);
  padding: 0 var(--abstand-4);
  border: var(--randbreite) solid var(--farbe-rand-bedienelement);
  border-radius: var(--radius-rund);
  background: var(--farbe-flaeche);
  color: var(--farbe-text-gedaempft);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  cursor: pointer;
  /* IM BILD GEFUNDEN, in keiner Zahl: seit der Filter-Chip ein VERWEIS ist
     (§Q9.1, „Filter setzen … Adressen"), traegt er die Unterstreichung eines
     Verweises. Zehn unterstrichene Pillen ueber der Liste sahen aus wie eine
     Fussnotenzeile.

     Die Form sagt hier alles: eine Pille mit Rand ist als Bedienelement
     erkennbar, und der Unterschied gefuellt/Umriss traegt den Zustand. Eine
     Unterstreichung darueber ist ein drittes Zeichen fuer dieselbe Sache. */
  text-decoration: none;
  transition: border-color var(--dauer-schnell) var(--kurve),
              background-color var(--dauer-schnell) var(--kurve);
  /* HÖCHSTBREITE — 02.08.2026. Ohne sie ist die Chipbreite die Textbreite,
     und ein Kontoname wie „Elektro Brenner GmbH · Servicenummer" füllt die
     Zeile allein. Abschnitt 9 nennt das die häufigste Bruchstelle: sehr
     lange deutsche Wörter. Umbrechen kann eine Pille nicht — also
     abschneiden mit einem `title`, so wie es dort steht. */
  max-width: 12rem;
}

.chip__wort {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* STRUKTURELL, nicht ueber Spezifitaet.
   Der gemeldete Fehler war: der gesetzte Chip wurde beim Ueberfahren
   violett auf violett. Beim ersten Versuch habe ich das ueber
   :not(.chip--gesetzt) geloest - also ueber Spezifitaet. Das haelt nur
   so lange, wie jemand die Ausnahme mitdenkt.

   Die Ursache war nicht die Spezifitaet, sondern dass ein
   Ueberfahren-Zustand ueberhaupt die TEXTFARBE anfasst. Sobald derselbe
   Baustein auch gefuellt vorkommt, ist Text-auf-eigener-Flaeche eine
   Frage der Reihenfolge.

   REGEL AB JETZT: Ein Ueberfahren- oder Gedrueckt-Zustand aendert nie
   die Textfarbe. Er aendert Rand, Schatten und Flaeche. Damit ist der
   Fehler nicht behoben, sondern unmoeglich.

   Zusaetzlich laeuft eine erschoepfende Messung ueber jede Kombination
   aus gesetzt, gedrueckt und ueberfahren - nicht nur ueber die, die man
   erwartet. Siehe tests/messungen/zustandsmatrix.spec.ts. */
.chip:not(.chip--gesetzt):is(:hover, .zeige-ueberfahren) {
  border-color: var(--farbe-primaer);
  box-shadow: var(--schatten-2);
}

/* Gedrueckt: der Chip gibt nach (Geometrie, kein Farbwechsel) und die
   Flaeche wird gedaempft. Vorher stand hier --farbe-primaer-sehr-hell -
   gemessen 4,37:1 mit der gedaempften Textfarbe, also knapp unter 4,5.
   --farbe-flaeche-gedaempft haelt 4,68:1. */
.chip:not(.chip--gesetzt):is(:active, .zeige-aktiv) {
  border-color: var(--farbe-primaer);
  background: var(--farbe-flaeche-gedaempft);
  transform: translateY(1px);
  box-shadow: none;
}

/* Gesetzt: gefuellt. Der Unterschied gefuellt/Umriss traegt allein -
   und das X kommt als zweiter, farbunabhaengiger Traeger dazu.
   Die Textfarbe steht hier und wird von keinem Zustand angefasst. */
.chip--gesetzt {
  padding-right: 0;
  border-color: var(--farbe-primaer);
  background: var(--farbe-primaer);
  color: var(--farbe-primaer-kontrast);
  cursor: default;
}

/* Der Ring ist der Traeger. Nur die Flaeche zu wechseln waere ein
   reiner Farbunterschied - gemeldet von der Zustandsmatrix. */
.chip__loeschen:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-primaer-hell);
  box-shadow: inset 0 0 0 2px currentColor;
}

.chip__loeschen {
  min-width: 44px;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: var(--radius-rund);
  background: transparent;
  color: inherit;
  cursor: pointer;
  /* Auch das Kreuz ist seit dem 01.08.2026 ein Verweis, wenn der Chip einen
     Ort hat — es nimmt den Filter zurueck, also fuehrt es auf dieselbe Liste
     ohne ihn. Ohne diese Zeile stuende unter dem Zeichen ein Strich. */
  text-decoration: none;
}

/* Keine eigene Groesse mehr: der Baustein uebergibt groesse: 'klein'.
   Eine Ueberschreibung hier hat den gerenderten Strich auf 1,69 px
   gedrueckt - gemessen, nicht vermutet. */

/* ============================================================
   BEREICH 09, zweiter Teil
   Die zehn Bausteine, die i1-i5 nicht nennt. Woher die Regel je
   Baustein kommt, steht in src/oberflaeche/bausteine-zwei.ts.

   Fuer JEDEN Zustand gilt: der Unterschied zum Ruhezustand darf nie
   nur Farbe sein. Der Traeger steht am jeweiligen Block dabei.
   ============================================================ */

/* --- Auswahlliste ------------------------------------------- */

/* Das VERHALTEN bleibt nativ: auf dem Handy oeffnet ein <select> das
   Systemrad, und das ist mit Arbeitshandschuh bedienbar. Ein
   selbstgebautes Menue waere schoener und schlechter.
   Was sich aendert, ist nur die HUELLE: gleiche Hoehe, gleicher Radius,
   gleiche Rahmenbehandlung wie das Textfeld. Vorher sah sie aus wie
   unformatiertes Browser-Standardverhalten.

   `appearance: none` nimmt den Systempfeil weg; der eigene steht als
   SVG daneben im Markup - so bleibt seine Farbe ein Token und wandert
   nicht als Datei-URI ins Stylesheet. */
.auswahl {
  appearance: none;
  min-height: var(--feld-hoehe);
  width: 100%;
  /* Rechts Platz fuer den Pfeil, oben fuer die Beschriftung. */
  padding: var(--abstand-5) var(--abstand-8) var(--abstand-2) var(--abstand-3);
  border: var(--randbreite) solid var(--farbe-rand-bedienelement);
  border-radius: var(--radius-standard);
  background: var(--farbe-flaeche);
  color: var(--farbe-text);
  font-size: var(--groesse-text);
  cursor: pointer;
  /* GEFUNDEN BEIM ANSEHEN VON BEREICH 08, in keiner Zahl.
     "Anlagenmechanik fuer Sanitaer, Heizung und Klima" stand bei 390 px als
     "Anlagenmechanik fuer" da - still abgeschnitten, ohne Zeichen dafuer,
     dass mehr da ist. Der Vorgabewert ist `text-overflow: clip`.

     Eine Messung findet das NICHT: scrollWidth eines nativen <select>
     meldet den beschnittenen Text nicht, sie sagt 0 Ueberlauf. Nur das
     Bild zeigt es.

     UEBERGABE.md, Abschnitt 9 schreibt fuer genau diesen Fall vor: "Wo
     Umbruch nicht geht, text-overflow: ellipsis mit title-Attribut." Das
     title setzt `auswahl()` auf den ausgewaehlten Eintrag. */
  text-overflow: ellipsis;
  transition: border-color var(--dauer-schnell) var(--kurve);
}

.auswahl:is(:hover, .zeige-ueberfahren):not(:disabled) {
  border-color: var(--farbe-primaer);
  box-shadow: var(--schatten-1);
}

/* Kein Rahmenwechsel bei Fokus. Der Ring aus der globalen Regel ist der
   eine Traeger. */

.auswahl:disabled {
  cursor: not-allowed;
  border-style: dashed;
  border-color: var(--farbe-gesperrt-rand);
  background: var(--farbe-gesperrt-flaeche);
  color: var(--farbe-gesperrt-text);
}

/* Der eigene Pfeil. Liegt ueber dem Feld und faengt keine Klicks -
   der Klick muss ins <select> gehen, sonst oeffnet das Systemrad nicht. */
.auswahl__pfeil {
  position: absolute;
  right: var(--abstand-4);
  top: 50%;
  transform: translateY(-50%);
  color: var(--farbe-text-gedaempft);
  pointer-events: none;
}

.auswahl:disabled ~ .auswahl__pfeil {
  color: var(--farbe-gesperrt-text);
}

/* --- Kontrollkaestchen -------------------------------------- */

/* NEU ENTSCHIEDEN. Nie als Mehrfachauswahl in einer Liste - Bulk-
   Aktionen sind ausdruecklich nicht gebaut. Nur fuer einzelne
   Zustimmungen in einem Formular. */
.kasten {
  position: relative;
  display: flex;
  align-items: flex-start;
  gap: var(--abstand-3);
}

/* Das echte Kaestchen liegt unsichtbar UEBER der Zeichnung: so bleibt
   die Trefferflaeche 44 x 44, die Tastatur funktioniert nativ, und es
   gibt keinen nachgebauten Zustand, der abweichen kann. */
.kasten__eingabe {
  position: absolute;
  left: 0;
  top: 0;
  width: 44px;
  height: 44px;
  margin: 0;
  opacity: 0;
  cursor: pointer;
}

.kasten__zeichen {
  flex: none;
  width: 32px;
  height: 32px;
  margin: 6px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: var(--randbreite) solid var(--farbe-rand-bedienelement);
  border-radius: var(--radius-klein);
  background: var(--farbe-flaeche);
  color: transparent;
}

/* Der Haken ist der Traeger. Ohne ihn waere gesetzt/offen nur Farbe. */
.kasten__eingabe:checked ~ .kasten__zeichen {
  border-color: var(--farbe-primaer);
  background: var(--farbe-primaer);
  color: var(--farbe-primaer-kontrast);
}

.kasten__eingabe:is(:hover, .zeige-ueberfahren):not(:disabled) ~ .kasten__zeichen {
  border-color: var(--farbe-primaer);
  box-shadow: var(--schatten-2);
}

.kasten__eingabe:is(:focus-visible, .zeige-fokus) ~ .kasten__zeichen {
  outline: var(--randbreite) solid var(--farbe-primaer);
  outline-offset: 3px;
}

.kasten__eingabe:disabled ~ .kasten__zeichen {
  border-style: dashed;
  border-color: var(--farbe-gesperrt-rand);
  background: var(--farbe-gesperrt-flaeche);
}

.kasten__eingabe:disabled:checked ~ .kasten__zeichen {
  color: var(--farbe-gesperrt-text);
}

.kasten__eingabe:disabled ~ .kasten__text {
  color: var(--farbe-gesperrt-text);
}

.kasten__text {
  display: grid;
  gap: var(--abstand-1);
  padding-top: var(--abstand-2);
  min-width: 0;
}

.kasten__wort {
  font-weight: var(--schrift-halbfett);
  cursor: pointer;
}

.kasten__erklaerung {
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

.kasten--gesperrt .kasten__wort,
.kasten--gesperrt .kasten__eingabe {
  cursor: not-allowed;
}

/* --- Textbereich -------------------------------------------- */

/* Regel 03: volle Breite, KEIN Formatierungsband, 17 px. Die
   meistgenutzte Flaeche im ganzen Produkt. */
.textbereich {
  width: 100%;
  min-height: 112px;
  /* Oben mehr Polster: dort landet die schwebende Beschriftung. */
  padding: var(--abstand-6) var(--abstand-3) var(--abstand-3);
  border: var(--randbreite) solid var(--farbe-rand-bedienelement);
  border-radius: var(--radius-standard);
  background: var(--farbe-flaeche);
  font-size: var(--groesse-text);
  line-height: var(--zeilenhoehe-weit);
  /* Nur senkrecht: waagerecht wuerde die Zeilenlaenge sprengen. */
  resize: vertical;
}

.textbereich:is(:hover, .zeige-ueberfahren):not(:disabled) {
  border-color: var(--farbe-primaer);
  box-shadow: var(--schatten-1);
}



.textbereich:disabled {
  cursor: not-allowed;
  border-style: dashed;
  border-color: var(--farbe-gesperrt-rand);
  background: var(--farbe-gesperrt-flaeche);
  color: var(--farbe-gesperrt-text);
}

/* Fehlerhaft: der Rand wird rot und EINEN Punkt dicker - nicht drei.
   Der eigentliche Traeger ist das Zeichen in der Fehlerzeile darunter,
   genau wie bei der Anmeldung. */
.textbereich--fehlerhaft {
  border-color: var(--farbe-fehler);
  border-width: calc(var(--randbreite) + 1px);
}

/* --- Karte -------------------------------------------------- */

/* Regel 16: Der Anstoss ist eine Karte, kein Pop-up. Sie wartet, bis
   der Meister Zeit hat. Also draengt sie auch nicht: kein rotes
   Zaehlerchen, kein Ausrufezeichen. */
.karte {
  display: block;
  padding: var(--abstand-4);
  border: 1px solid var(--farbe-rand);
  border-radius: var(--radius-standard);
  background: var(--farbe-flaeche);
  color: inherit;
  text-decoration: none;
}

.karte__marke {
  display: inline-block;
  margin-bottom: var(--abstand-2);
  padding: 0 var(--abstand-2);
  border-radius: var(--radius-rund);
/* DIE NEUE PRIMAERFARBE KANN AUF EINER GETOENTEN FLAECHE KEIN TEXT SEIN.
   Das ist Arithmetik, nicht Geschmack: #665DF5 hat eine Leuchtkraft von
   0,1725. Damit Text darauf 4,5:1 haelt, braeuchte der Untergrund L >= 0,9511
   - und eine Flaeche mit L 0,9511 haelt gegen Weiss nur 1,049:1, ist also
   als Flaeche unsichtbar. Es gibt diesen Untergrund nicht.
   Gemessen: auf Weiss 4,72:1 (haelt), auf --farbe-flaeche-gedaempft 4,14:1
   (reisst), auf --farbe-primaer-sehr-hell 3,87:1 (reisst).
   Also gilt ab jetzt: die Handlungsfarbe traegt WEISSE Schrift auf sich, oder
   sie steht als Text auf REINEM WEISS. Sonst nicht. */
  background: var(--farbe-primaer-sehr-hell);
  color: var(--farbe-text);
  font-size: var(--groesse-mikro);
  font-weight: var(--schrift-halbfett);
  letter-spacing: var(--laufweite-weit);
  text-transform: uppercase;
}

.karte__titel { font-size: var(--groesse-h3); }

.karte__text {
  margin-top: var(--abstand-2);
  color: var(--farbe-text-gedaempft);
}

.karte__fuss { margin-top: var(--abstand-4); }

/* Klickbar heisst: der Rand ist die Grenze eines Bedienelements und
   braucht 3:1. Die stille Karte behaelt den leisen Rand - sie ist nur
   ein Kasten und kein Bedienelement. */
.karte--klickbar {
  border-color: var(--farbe-rand-bedienelement);
}

.karte--klickbar:is(:hover, .zeige-ueberfahren) {
  border-color: var(--farbe-primaer);
  box-shadow: var(--schatten-2);
}

.karte--klickbar:is(:active, .zeige-aktiv) {
  transform: translateY(1px);
  box-shadow: none;
}

/* --- Kanal-Symbol ------------------------------------------- */

/* Regel 03 (c2): farbiges Symbol AN STELLE DES PROFILBILDS. Bei vier
   Kanaelen ist die Herkunft die wichtigste Sortierhilfe.

   FARBE IST NICHT DER EINZIGE TRAEGER: jeder Kanal hat eine eigene
   Zeichnung (f, Kamera, Abspielzeichen, Sprechblase) und einen
   ausgeschriebenen Namen fuer Vorleseprogramme. In Graustufen bleiben
   die vier unterscheidbar. */
/* Kreis, nicht abgerundetes Quadrat. Zwei Gruende: der Kreis steht an der
   Stelle, wo sonst ein Profilbild waere, und er vermeidet die
   Verwechslung mit WhatsApps "Green Square" - das ist offiziell nur
   erlaubt, "when referencing the iOS version of WhatsApp".

   Der Ring ist UNSER Element, kein Umfaerben des Zeichens. Er ist
   noetig, weil #25D366 gegen unseren Seitengrund nur 1,87:1 haelt und
   die WhatsApp-Kachel sonst ausfranst. Er sitzt nach innen, damit er
   die Kachelgroesse nicht veraendert. */
/* ===================================================================
   DER RING IST WEG, DAS ZEICHEN IST GROESSER — 18.08.2026, angesagt
   ===================================================================

   „Die Facebook-, Instagram-Logos, dieser Kreis darum, der gefaellt mir
   nicht. Dann moechte ich bitte, dass du den Kreis darum wegmachst und die
   Markenlogos vielleicht einfach ein Ticken groesser machst. Und in einem
   leichten Grau oder sowas."

   DREI DINGE AUF EINMAL, und sie haengen zusammen: ohne den Ring braucht das
   Zeichen keinen Rand mehr einzuhalten und kann waschsen; und ohne Ring
   braucht die Flaeche eine andere Kante zum Grund — die traegt jetzt der
   leichte Grauton statt einer Linie.

   DER KREIS SELBST BLEIBT. Gemeint ist der RING (die Linie darum), nicht die
   runde Form: sie steht an der Stelle, wo sonst ein Profilbild waere, und
   dieser Grund steht unveraendert im Absatz darueber.

   `--randbreite` FAELLT MIT, nicht nur die Farbe. Ein Ring in der Grundfarbe
   waere ein Ring, den man nur nicht sieht — und beim naechsten Farbwechsel
   waere er wieder da. */
.kanalzeichen {
  flex: none;
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-rund);
  /* TINTE UND NICHT WEISS — 17.08.2026, mit dem weissen Grund weiter unten.
     Sie stand auf `--farbe-primaer-kontrast`, weil die Flaeche darunter die
     Markenfarbe trug. Auf Weiss waere das Kuerzel unsichtbar.

     ES TRIFFT NUR DEN PLATZHALTER (`.kanalzeichen__kurz`), also den Fall ohne
     Originaldatei — und genau deshalb faellt so etwas sonst niemandem auf.

     SIE STEHT HIER UND NICHT IN EINER ZWEITEN `.kanalzeichen`-REGEL. Der
     erste Anlauf hat eine danebengestellt; das ist dieselbe Kollision, die
     heute schon `.vertretung__text` getroffen hat — bei gleicher Spezifitaet
     gewinnt die spaetere, und beim naechsten Umbau raet jemand, welche gilt. */
  color: var(--farbe-text);
}

/* EIN TICKEN GROESSER — 18.08.2026. 24 auf 30 px in einer 44er Flaeche: der
   Rand um das Zeichen faellt von 10 auf 7 px. Mehr ginge auch, aber dann
   beruehrt das Instagram-Zeichen die Kante — seine Datei hat einen anderen
   Beschnitt als die beiden anderen (siehe den offenen Punkt weiter unten). */
.kanalzeichen__bild {
  width: 30px;
  height: 30px;
}

/* Bis die Originaldatei daliegt: das Kanal-Kuerzel. Kein nachgezeichnetes
   Markenzeichen - drei der vier Portale untersagen genau das. */
.kanalzeichen__kurz {
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  letter-spacing: var(--laufweite-null);
}

.kanalzeichen--klein {
  width: 28px;
  height: 28px;
}

/* DIESELBE STUFE WIE OBEN, nur am kleineren Mass gerechnet: 17 auf 21 px in
   einer 28er Flaeche haelt denselben Rand von rund einem Sechstel. */
.kanalzeichen--klein .kanalzeichen__bild {
  width: 21px;
  height: 21px;
}

.kanalzeichen--klein .kanalzeichen__kurz {
  font-size: var(--groesse-mikro);
}

/* ===================================================================
   DAS ZEICHEN STEHT AUF WEISS — 17.08.2026, angesagt
   ===================================================================

   ANGESAGT: „die logos sollten einen weißen bg haben und centered sein."

   HIER STAND DIE MARKENFARBE als Fläche: Facebook blau, Instagram im
   Verlauf, YouTube rot. Im Filtertrog — der selbst grau ist — standen damit
   vier kräftige Vollkreise nebeneinander und zogen mehr Aufmerksamkeit als
   die Wörter daneben, obwohl das Wort die Auskunft ist und das Zeichen nur
   die Zuordnung.

   AUF WEISS TRAGEN DIE MARKENZEICHEN IHRE EIGENE FARBE, und das ist der
   Grund, aus dem die Plattformen ihre Dateien so ausliefern: das
   Facebook-„f" ist blau, das YouTube-Dreieck rot. Auf farbiger Fläche liegt
   Marke auf Marke; auf Weiß steht sie für sich.

   HIER STAND „DER RING BLEIBT" — gefallen am 18.08.2026 mit der Ansage. Er
   war die Kante, die den weißen Kreis vom Grund trennte; diese Aufgabe trägt
   jetzt der Ton der Fläche selbst.

   ZENTRIERT WAR ES SCHON — `align-items` und `justify-content` stehen oben
   auf `center`. Was im Bild danebenstand, war das Instagram-Zeichen: seine
   Datei hat einen anderen Beschnitt als die beiden anderen. Das ist eine
   Frage an die Datei und nicht an diese Regel; sie steht als offener Punkt
   im Bericht.

   ===================================================================
   EIN LEICHTES GRAU STATT WEISS — 18.08.2026, angesagt
   ===================================================================

   „Und in einem leichten Grau oder sowas."

   ES IST DIE FLAECHE UND NICHT DAS ZEICHEN. Die Markenzeichen selbst grau zu
   faerben ginge nur ueber `filter: grayscale()` — und damit waere das
   Facebook-„f" nicht mehr blau und das YouTube-Dreieck nicht mehr rot. Der
   Absatz oben nennt den Grund, aus dem sie ihre eigene Farbe tragen: „das ist
   der Grund, aus dem die Plattformen ihre Dateien so ausliefern." Drei der
   vier Portale untersagen zudem das Umfaerben ihres Zeichens.

   `--farbe-flaeche-gedaempft` (#F2F1F3) IST DER LEICHTE TON DES HAUSES. Er
   haelt gegen Weiss 1,05:1 — als KANTE waere das zu wenig (WCAG 1.4.11
   verlangt 3:1), und genau deshalb stand hier bisher ein Ring. Als FLAECHE
   unter einem Zeichen, das seine eigene Farbe traegt, ist er keine Kante,
   sondern ein Grund: die Auskunft traegt das Zeichen, nicht der Kreis. */
.kanalzeichen--facebook,
.kanalzeichen--instagram,
.kanalzeichen--youtube {
  background: var(--farbe-flaeche-gedaempft);
}

/* HIER STAND `.kanalzeichen--whatsapp` — gefallen am 16.08.2026 mit dem
   Kanal (angesagt: „WhatsApp kann generell weg"). Das Token
   `--farbe-kanal-whatsapp` faellt mit ihm; ein Token ohne Leser sieht aus wie
   eine Entscheidung und ist keine mehr. */

/* --- Listeneintrag ------------------------------------------ */

/* Regel 03: eine Liste, keine Tabelle. Und die Liste bekommt 15 px
   (--groesse-klein), nicht 17 - grosse Schrift dort, wo gelesen und
   geschrieben wird, nicht dort, wo ueberflogen wird.

   NEU GEBAUT. Die erste Fassung hatte drei Dinge, die miteinander
   konkurrierten: einen Rand unten, einen Rand links und beim
   Ueberfahren einen dritten Balken als Schatten, dazu eine
   Unterstreichung und einen Sprung. Das ist der meistgesehene Baustein
   im ganzen Produkt - er muss ruhig sein.

   Jetzt:
     - genau EINE Trennlinie, unten, haarfein
     - der Ungelesen-Balken ist kein Rand, sondern eine Flaeche
       (::before). Damit kann er mit keinem Rand konkurrieren und
       verschiebt nichts.
     - Ueberfahren ist ausschliesslich eine leichte Flaechenaenderung.
       Kein Rand, keine Unterstreichung, kein Sprung.

   Der letzte Punkt ist eine ANGESAGTE AUSNAHME von der Regel "kein
   Zustand unterscheidet sich allein durch die Farbe": hier ist Ruhe
   wichtiger. Die Helligkeitsdifferenz der Flaeche wird gemessen, damit
   die Ausnahme eine Zahl hat und keine Behauptung bleibt. */
.zeile {
  /* Eine Linie, nicht zwei. */
  border-bottom: var(--randbreite) solid var(--farbe-rand);
}

.zeile__flaeche {
  position: relative;
  width: 100%;
  min-height: 44px;
  display: flex;
  align-items: flex-start;
  gap: var(--abstand-3);
  /* MEHR LUFT — 31.07.2026, Anmutung. Gemessen: Zillow polstert seine
     Zeilen mit rund 22 px, wir mit 12. Die Zeile war trotzdem hoeher
     als Zillows (129 gegen 99 px), weil unter ihr zwei Etiketten
     standen; die sind jetzt weg. Ohne sie und mit 20 px Polster
     landet die Zeile bei rund 96 px — dieselbe Dichte wie die
     Referenz, aber mit Luft statt mit Fracht.
     Links etwas mehr: dort liegt der Balken.

     SENKRECHT 16 STATT 24 PX — geändert am 02.08.2026. Der Kommentar
     darüber rechnet selbst mit „rund 96 px" und mit 20 px Polster; gebaut
     waren 24, und die Zeile maß 124,1 px = 10,9 % der Inhaltsbreite. Plain
     hat den höchsten Wert im Referenzfeld mit 8,6 %. Mit 16 px sind es
     108,1 px = 9,5 %, und das ist genau die Zahl, die `--zeile-hoehe`
     nennt. Waagerecht bleibt es. */
  padding: var(--abstand-4) var(--abstand-4) var(--abstand-4) var(--abstand-5);
  border: 0;
  background: var(--farbe-flaeche);
  font-size: var(--groesse-klein);
  text-align: left;
  cursor: pointer;
  transition: background-color var(--dauer-schnell) var(--kurve);
}

/* Nur die Flaeche. Sonst nichts. */
.zeile__flaeche:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-flaeche-gedaempft);
}

.zeile__flaeche:is(:active, .zeige-aktiv) {
  background: var(--farbe-rand);
}

/* Der Ring sitzt hier nach INNEN. Aussen wuerde er ueber die ganze
   Listenbreite hinausragen und die Nachbarzeilen anschneiden. */
.zeile__flaeche:focus-visible,
.zeile__flaeche.zeige-fokus {
  outline-offset: calc(var(--fokusring-abstand) * -1);
}

/* `minmax(0, 1fr)` ERGÄNZT — 02.08.2026. Ohne die Spurangabe legt das
   Raster seine einzige Spalte auf `auto`, und `auto` misst sich am
   Inhalt: gemessen war der Kasten 255 px breit und die Spur darin 233 px
   — 22 px verschenkt, weil der abgeschnittene Vorschautext seine eigene
   Wunschbreite nicht kennt. Mit `minmax(0, 1fr)` füllt sie den Kasten,
   und die `0` als Untergrenze verhindert, dass ein langes Wort sie
   aufbläht. */
.zeile__mitte {
  flex: 1;
  min-width: 0;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--abstand-1);
}

.zeile__kopf {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--abstand-2);
}

.zeile__absender {
  font-weight: var(--schrift-halbfett);
  overflow-wrap: anywhere;
}

/* Nur hier ist nowrap erlaubt: eine Uhrzeit ist garantiert kurz. */
.zeile__zeit {
  flex: none;
  white-space: nowrap;
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

/* Zwei Zeilen, dann Schluss. Der Rest steht im geoeffneten Gespraech.

   UND ZWEI ZEILEN AUCH DANN, WENN DER TEXT NUR EINE FÜLLT — ergänzt am
   02.08.2026. Ohne die Mindesthöhe schwankte die Zeile zwischen 100,4 und
   124,1 px, also um genau eine Textzeile: eine Liste, deren Takt vom
   Inhalt abhängt. Intercom hält 33/32/33/32 px über acht Zeilen.
   Die Zahl steht nicht hier, sie wird gerechnet — zwei Zeilen mal
   Zeilenhöhe mal Schriftgröße. Wer eine der drei ändert, ändert sie mit. */
.zeile__text {
  color: var(--farbe-text-gedaempft);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  min-height: calc(2 * var(--zeilenhoehe-weit) * var(--groesse-klein));
}

.zeile__etiketten {
  display: flex;
  flex-wrap: wrap;
  gap: var(--abstand-1);
  margin-top: var(--abstand-1);
}

/* Flaeche statt Linie: das Etikett war ein Umriss, jetzt ist es eine
   getoente Flaeche. Ein Rand weniger in der meistgesehenen Zeile. */
/* DAS ETIKETT TRAEGT SEIT DEM 16.08.2026 EIN ZEICHEN. Die Begruendung steht
   bei `etikett()` in bausteine-zwei.ts: Bewerbung und Termin sind dasselbe
   Violett, nur verschieden hell (1,52:1), und das ist knapp. Das WORT war
   immer schon der zweite Traeger; das Zeichen ist der dritte und hilft dort,
   wo das Wort erst gelesen werden muesste — beim Ueberfliegen.

   `inline-flex` UND NICHT `inline`: ohne es saesse das SVG auf der
   Schriftlinie und zoege die Pille auseinander. */
/* ===================================================================
   KEINE PILLE MEHR — 18.08.2026, angesagt
   ===================================================================

   „Diese kleinen Pillen, wo da zum Beispiel Bewerbung steht oder Anfrage,
   sehen auch alle hingeschissen aus. Bitte auch allesamt neu machen."

   ES IST DIESELBE ENTSCHEIDUNG WIE AM 03.08.2026 BEI DEN KNOEPFEN („vorher
   waren sie Pillen, wie der Toast") und dieselbe wie heute beim
   Gespeichert-Flyout. Der Radius 999 war im Produkt zuletzt der einzige seiner
   Art an einer Textmarke — und eine 13-px-Pille mit einem 16-px-Zeichen darin
   ist an ihren Enden mehr Rundung als Inhalt.

   DREI SACHEN AENDERN SICH, und keine davon ist die Farbe:

     Radius 0     die Hausform, wie Feld, Knopf und Stufenkachel
     Polster      2 auf 3 quer, dazu 2 hoch — die Pille war randlos hoch und
                  klebte damit an der Zeile darueber
     Schrift      `--groesse-mikro` auf `--groesse-klein`: 13 statt 11 px.
                  Ein Etikett, das man beim Ueberfliegen lesen soll, war die
                  kleinste Schrift des Produkts.

   DIE TOENE BLEIBEN, wie sie sind. Sie sind gerechnet (die Rechnung steht bei
   `--farbe-etikett-bewerbung` in tokens.css), und die Ansage galt der FORM.

   `--groesse-klein` IST DIE UNTERGRENZE DES HAUSES: „die kleinste
   Schriftgroesse im Produkt ist 13 px" misst `huelle.spec.ts`. Die Pille lag
   mit `--groesse-mikro` darunter und kam nur durch, weil die Probe sichtbaren
   Text im Fliesstext misst. */
.etikett {
  display: inline-flex;
  align-items: center;
  gap: var(--abstand-1);
  padding: var(--abstand-1) var(--abstand-3);
  border-radius: 0;
  background: var(--farbe-flaeche-gedaempft);
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

/* ===================================================================
   DAS ZEICHEN BLEIBT BEI `--symbol-klein` — 16.08.2026, gemessen
   ===================================================================

   HIER STAND `width: calc(var(--groesse-mikro) * 1.2)`, also 15,6 px, mit der
   Begruendung: „jenes ist aus `--groesse-text` (17 px) gerechnet und waere in
   einer 13-px-Pille groesser als ihre eigene Schrift." Das stimmt und ist
   trotzdem falsch.

   `Symbole · Strichstaerke gerendert` hat es sofort gemeldet, dreizehnmal:

     symbol symbol--klein: 1.75 px bei 15.6 px Kante   (noetig 2,25)

   DIE STRICHSTAERKE HAENGT AN DER KANTENLAENGE. Sie steht einmal in tokens.css
   als Wert auf dem 24er-Raster; wer das SVG kleiner macht, macht den Strich
   duenner. Regel 15 nennt den Grund, und er ist kein Schoenheitsargument:
   „Strichstaerke mindestens 2 px, eher 2,25. Employment Hero zeichnet sehr
   fein; bei Sonnenlicht und mit Lesebrille reicht das nicht."

   RECHNERISCH: 2,25 px braucht mindestens 20,06 px Kante. `--symbol-klein`
   ist 20,4 px und damit der kleinste Wert des Hauses, der die Auflage haelt —
   es gibt hier also nichts zu waehlen.

   DIE PILLE WAECHST DAFUER. Das ist der Preis und er ist der richtige: ein
   Zeichen, das man bei Sonnenlicht nicht sieht, ist kein zweiter Traeger,
   sondern Zierrat neben dem Wort. Wer die Pille kleiner will, braucht eine
   eigene Zeichnung mit dickerem Strich — und die gehoert in den Symbolsatz
   und nicht in eine Ausnahme hier. */
.etikett .symbol {
  flex: 0 0 auto;
}

/* DIE SECHS TOENE. Zurueckhaltend - eine Toenung, kein Farbkasten.

   DIE ZAHLEN HIER WAREN ZWEIMAL VERALTET, nachgezogen am 16.08.2026. Es
   stand „alle sechs liegen bei 1,20-1,21:1 gegen Weiss, also genauso leise
   wie --farbe-primaer-sehr-hell" — dieser Wert ist am 08.08.2026 auf 1,5:1
   gestiegen (angesagt: sie waren „als Flaeche kaum zu sehen"), und der
   Vermerk ist stehengeblieben.

   WAS JETZT GILT: fuenf der sechs halten 1,50:1 gegen Weiss, Text darauf
   11,83 bis 11,87:1. Termin haelt 2,19:1 und Text 8,13:1 — die benannte
   Abweichung, weil Termin und Bewerbung seit dem 16.08.2026 dasselbe
   Violett sind und die leisen Flaechen sonst nicht auseinandergingen. Die
   ganze Rechnung steht in tokens.css bei `--farbe-etikett-bewerbung`.

   „IN DER LISTE" STIMMTE AUCH NICHT. Die Listenzeile zeigt seit dem
   Aufraeumen von Bereich 03 keine Etiketten mehr (nur noch fuer
   Vorleseprogramme, siehe `listeneintrag()`); diese Toene stehen im
   GEOEFFNETEN Gespraech und im Schaukasten.

   Die Schrift wird NICHT eingefaerbt. Sechs verschieden dunkle
   Schriftfarben in einer Liste sind ein Flimmern, und die Farbe traegt
   ohnehin keine Aussage - der Text tut es. */
.etikett--bewerbung { background: var(--farbe-etikett-bewerbung-leise); color: var(--farbe-text); }
.etikett--anfrage { background: var(--farbe-etikett-anfrage-leise); color: var(--farbe-text); }
.etikett--beschwerde { background: var(--farbe-etikett-beschwerde-leise); color: var(--farbe-text); }
.etikett--lob { background: var(--farbe-etikett-lob-leise); color: var(--farbe-text); }
.etikett--termin { background: var(--farbe-etikett-termin-leise); color: var(--farbe-text); }
.etikett--sonstiges { background: var(--farbe-etikett-sonstiges-leise); color: var(--farbe-text); }

/* GEFUELLT NUR BEIM GESETZTEN FILTER-CHIP. Der ungesetzte Chip sieht aus
   wie jeder andere: sonst waere die Filterzeile ein Farbkasten und die
   Farbe wuerde behaupten, sie sei eine Aussage.

   Die vollen Toene halten weisse Schrift bei 4,57-4,62:1. Das Loeschkreuz
   erbt die Schriftfarbe und liegt damit auf derselben Zahl. */
.chip--gesetzt.chip--etikett-bewerbung { background: var(--farbe-etikett-bewerbung); border-color: var(--farbe-etikett-bewerbung); }
.chip--gesetzt.chip--etikett-anfrage { background: var(--farbe-etikett-anfrage); border-color: var(--farbe-etikett-anfrage); }
.chip--gesetzt.chip--etikett-beschwerde { background: var(--farbe-etikett-beschwerde); border-color: var(--farbe-etikett-beschwerde); }
.chip--gesetzt.chip--etikett-lob { background: var(--farbe-etikett-lob); border-color: var(--farbe-etikett-lob); }
.chip--gesetzt.chip--etikett-termin { background: var(--farbe-etikett-termin); border-color: var(--farbe-etikett-termin); }
.chip--gesetzt.chip--etikett-sonstiges { background: var(--farbe-etikett-sonstiges); border-color: var(--farbe-etikett-sonstiges); }

/* UNGELESEN: ZWEI TRÄGER, NICHT DREI — geändert am 02.08.2026.
   Der Punkt rechts (10 px) und das Schriftgewicht des Absenders (800).
   Das ist genau die Bauart von Front und Notion Mail, beide mit zwei
   Trägern; Fronts Grundton unterscheidet sich zwischen gelesen und
   ungelesen nur um dRGB 3/4/0 und trägt damit nichts.

   DER BALKEN LINKS IST ZUR AUSWAHL GEWANDERT. Er stand hier als dritter
   Träger, während die Auswahl daneben mit EINEM auskam — einer getönten
   Fläche. Drei gegen eins ist die falsche Verteilung: „ungelesen" ist
   eine Eigenschaft der Nachricht, „gewählt" ist der Ort, an dem der
   Meister gerade steht, und der braucht mehr, nicht weniger.
   Zillow codiert die Auswahl doppelt: 3 px Balken links plus Zeilengrund.
   Front und Plain ebenso, je zwei Träger. */
.zeile--ungelesen .zeile__absender {
  font-weight: var(--schrift-halbfett);
}

.zeile__punkt {
  flex: none;
  width: 10px;
  height: 10px;
  margin-top: var(--abstand-3);
  border-radius: var(--radius-rund);
  background: var(--farbe-primaer);
}

/* GEWAEHLT: getönte Fläche UND ein Balken links — zwei Träger seit dem
   02.08.2026. Vorher war es nur die Fläche; Zillow, Front und Plain
   codieren die Auswahl alle drei doppelt. Dazu `aria-current="true"` am
   Verweis, das ist der dritte und der einzige, den ein Vorleseprogramm
   hört.

   Der Balken ist eine FLAECHE, kein Rand — so konkurriert er mit nichts
   und verschiebt nichts. */
.zeile--gewaehlt .zeile__flaeche,
.zeile--gewaehlt .zeile__flaeche:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-primaer-sehr-hell);
}

/* AUF DER GETOENTEN FLAECHE TRAEGT DER VORSCHAUTEXT DIE VOLLE FARBE —
   gefunden am 02.08.2026 von `lesbarkeit.spec.ts`, und der Fund ist erst
   entstanden, weil es die gewaehlte Zeile jetzt IMMER gibt: der Server waehlt
   die erste Nachricht vor.

   Gemessen `--farbe-text-gedaempft` auf `--farbe-primaer-sehr-hell` =
   **4,36:1** bei 15 px, noetig 4,5. Der gedaempfte Ton ist gegen Weiss
   gerechnet (5,33:1) und gegen den Grund (5,01:1) — die getoente Flaeche der
   Auswahl kam in keiner der beiden Rechnungen vor.

   Das ist genau die Klasse Fehler, die der Bauauftrag in 2.5 beschreibt:
   Kontrast wurde gemessen, nur nie gegen den Grund, auf dem der Text
   tatsaechlich steht.

   `--farbe-text` haelt dort 10,81:1. Und es ist nicht nur die Reparatur,
   sondern die richtige Aussage: die gewaehlte Zeile ist die, die man gerade
   liest. Gemeldet hat es der Zeitstempel; der Vorschautext daneben steht
   auf demselben Ton und haette als Naechstes gemeldet — beide zusammen,
   nicht einer nach dem anderen. */
.zeile--gewaehlt .zeile__text,
.zeile--gewaehlt .zeile__zeit {
  color: var(--farbe-text);
}

.zeile--gewaehlt .zeile__flaeche::before {
  content: "";
  position: absolute;
  left: 0;
  top: var(--abstand-2);
  bottom: var(--abstand-2);
  width: 4px;
  border-radius: var(--radius-rund);
  background: var(--farbe-primaer);
}

/* --- Reiter ------------------------------------------------- */

/* Regel 08: drei Reiter. Regel 04: der Kalender darf als zweite
   Ansicht hinter einem Umschalter liegen. Derselbe Baustein.
   Der aktive Reiter wird als FLAECHE markiert (Regel 01). */
/* SO BREIT WIE IHRE REITER, nicht so breit wie die Karte — 02.08.2026.
   Gemessen war die Leiste bei 1440 px 1088 px breit und trug vier Wörter:
   „Kanäle" allein bekam 272 px, davon 200 px Luft. Eine Reiterleiste ist
   eine Gruppe von Wörtern, keine Trennlinie über die Seite.
   `fit-content` macht daraus 372 px — und bei 390 px bleibt sie voll, weil
   die vier Wörter dort mehr brauchen als die Breite hergibt. */
/* ===================================================================
   ZWEI KLARE PILLEN STATT EINER WEICHEN IM GRAUEN OVAL — 04.08.2026
   ===================================================================

   Angesagt fuer den Liste/Kalender-Umschalter (Baustelle 2.3): „die
   heutige weiche Pille im grauen Oval sieht nach Voreinstellung aus.
   Ersetzen durch zwei klare Pillen im Jitter-Stil, aktiver Zustand
   schwarz gefuellt." Und fuer die Reiter der Einstellungen (2.6):
   „Gleiche Pillen wie in 2.3, ein Muster fuer die ganze Anwendung."

   ES IST EIN MUSTER UND NICHT ZWEI. Deshalb steht die Aenderung hier am
   Baustein und nicht zweimal an seinen Verwendungen — `.reiter` traegt
   den Umschalter auf `/inhalte` UND die vier Reiter der Einstellungen.

   DAS GRAUE OVAL IST GEFALLEN. Es war der Grund fuer den Eindruck
   „Voreinstellung": eine helle Pille auf grauem Grund liest sich als
   Schalter, der zufaellig gerade so steht, nicht als Wahl, die jemand
   getroffen hat. Ohne das Oval traegt der AKTIVE Eintrag die ganze
   Aussage — schwarz gefuellt, wie Jitters Hauptaktion.

   WAS BLEIBT: die Lücke zwischen den Eintraegen und `width: fit-content`.
   Zwei Woerter brauchen keine halbe Bildschirmbreite. */
/* ===================================================================
   DER TROG — 12.08.2026, angesagt und an Jitter gemessen
   ===================================================================

   ANGESAGT mit zwei Bildern: „die Toggle-Pillen sollten so aussehen wie
   bei Jitter."

   GEMESSEN in `style-D_WjioHA.css`, `._defaultVariant_1f458_116`:

     Trog        background #e5e4e7 · border-radius = Höhe/2
                 color #97979b · 18 px / 600
     Pille       inset 4 px im Trog · background #fff
                 border-radius = (Höhe − 8) / 2
     aktiv/hover color #19171c
     Übergang    color .3s cubic-bezier(.25,.46,.45,.94)

   BEIDE TÖNE STEHEN SCHON ALS TOKEN DA: `--farbe-rand` IST #E5E4E7 und
   `--farbe-text-leise` IST #97979B, beide am 03.08.2026 bei Jitter
   gemessen. Es kommt also kein Wert hinzu — was hinzukommt, ist die
   FORM.

   WAS DAMIT FÄLLT: die schwarz gefüllte aktive Pille (04.08.2026) und
   der Balken darunter. Beides war die Übersetzung von „schwarz und
   kantig wie auf der Übersichtsseite" auf die Reiter — und die Ansage
   von heute nimmt genau diese Übersetzung zurück. Der Balken war
   ohnehin ein dritter Träger neben Fläche und Schriftfarbe.

   `width: fit-content` BLEIBT. Ein Trog über die ganze Breite hätte bei
   sieben Reitern und 1776 px Inhalt Pillen von 250 px — Jitter setzt
   `width: 100%`, aber in einem Kasten von 400 px. Die Form ist
   übernommen, ihre Streckung nicht. */
.reiter {
  display: flex;
  flex-wrap: wrap;
  width: fit-content;
  max-width: 100%;
  /* KEIN `gap` MEHR. Die Pillen sitzen im Trog aneinander; eine Lücke
     dazwischen zeigte den Troggrund als Streifen zwischen zwei Wörtern. */
  gap: 0;
  padding: var(--reiter-polster);
  border-radius: var(--radius-rund);
  background: var(--farbe-rand);
  /* ===================================================================
     DIE ZEILENLUECKE IST GROESSER ALS DIE SPALTENLUECKE — 06.08.2026
     ===================================================================

     Gefunden beim Ansehen der Einstellungen bei 390 px, nachdem das
     Randtoken die Spalte von 206 auf 350 px gebracht hat. Vier Reiter
     brauchen 321 px, die Leiste hat 302 — „Betrieb" bricht also um, und
     das ist richtig so. Falsch war, wohin der Balken des aktiven
     Eintrags dabei faellt.

     GEMESSEN: Reihe 1 endet bei y = 535, „Betrieb" beginnt bei y = 543.
     Der Balken sitzt `bottom: -8px` und ist 3 px hoch, liegt also von
     543 bis 546 — genau AUF dem umgebrochenen Wort. Im Bild las er sich
     als Unterstrich, der zu nichts gehoert.

     8 PX SIND DIE LUECKE ZWISCHEN ZWEI PILLEN, NICHT ZWISCHEN ZWEI
     ZEILEN. Der Balken braucht 11 (8 Abstand + 3 Hoehe). Die 24 px sind
     nicht neu gegriffen: sie sind derselbe Abstand, den der Balken schon
     zum naechsten Block hat — dort nimmt er 11 davon und laesst 13
     stehen (siehe `.reiter__eintrag--aktiv::after`). Zwischen zwei
     Zeilen gilt dieselbe Rechnung.

     Auf `/inhalte` traegt derselbe Baustein zwei Eintraege, die nie
     umbrechen; dort aendert die Zeile nichts. */
  row-gap: var(--abstand-5);
}

.reiter__eintrag {
  /* 48 STATT 44 PX — 02.08.2026. 44 ist das Minimum für einen bloßen
     Finger; die Reiterleiste des Produkts fährt seit Bereich 01 auf dem
     Handschuhmaß, und die Einstellungen sind kein Sonderfall. */
  min-height: 48px;
  /* INHALTSBREIT, NICHT VIERTELWEISE — 02.08.2026. Mit `flex: 1` waren alle
     vier Reiter exakt 267 px breit: „Team" bekam so viel Platz wie
     „Rechnungen". Employment Hero laesst seine sechs Reiter 69 bis 130 px
     breit werden (Faktor 1,88), Uxcel seine Pillen so breit wie ihr Wort.
     Eine Breite, die nichts ueber ihren Inhalt sagt, ist eine Behauptung
     ueber Gleichrangigkeit, die die Woerter nicht einloesen. */
  flex: 0 1 auto;
  transition:
    background-color var(--dauer-schnell) var(--kurve),
    box-shadow var(--dauer-schnell) var(--kurve),
    color var(--dauer-schnell) var(--kurve);
  /* Mittig, sonst haengt der Text eines <a> oben links in der Flaeche - ein
     Knopf zentriert von selbst, ein Verweis nicht. Im Bild aufgefallen. */
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0 var(--abstand-4);
  border: 0;
  border-radius: var(--radius-rund);
  background: transparent;
  /* NACHGEZOGEN AM 14.08.2026: `--farbe-text-gedaempft` ist nur auf Weiss
     kalibriert (5,07:1) und hielt auf dem Trog-Grund (`--farbe-rand`, seit
     „DER TROG" vom 12.08.2026) nur noch 4,00:1 gegen die noetigen 4,5 -
     dieselbe Falle, vor der `.aussage__zusatz` an anderer Stelle in dieser
     Datei ausdruecklich warnt. `--farbe-text-gedaempft-auf-rand` ist fuer
     genau diesen Grund gerechnet. */
  color: var(--farbe-text-gedaempft-auf-rand);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  /* Ein Reiter mit `ziel` ist ein <a>, und ein <a> bringt Verweisfarbe und
     Unterstreichung mit. Beides ist hier falsch - derselbe Fund wie an den
     Listenzeilen des Posteingangs, nur eine Runde spaeter und an einem
     Baustein, der bis dahin nur Knoepfe hatte. */
  text-decoration: none;
  cursor: pointer;
}

/* Der ruhende Eintrag bekommt beim Ueberfahren die gedaempfte Flaeche —
   nicht Weiss: er liegt jetzt auf Weiss, und Weiss auf Weiss ist nichts.
   Der Schatten ist mit dem Oval gefallen; was hier hilft, ist Flaeche.

   ===================================================================
   ZWEI FUNDE DER ZUSTANDSMATRIX, BEIDE AUS DIESEM UMBAU — 05.08.2026
   ===================================================================

   1. „unterscheidet sich von normal ausschließlich durch Farbe."
      Gemessen: Schrift `rgb(110,110,115)` → `rgb(25,23,28)`, Fläche
      Weiß → `rgb(242,241,243)`. Zwei Änderungen, beide Farbe. Solange
      das graue Oval da war, trug der Schatten den Zustand mit; mit dem
      Oval ist er gefallen und niemand hat den Träger ersetzt.

   2. „kein Zustand fasst die Textfarbe an." Die `color`-Zeile stand
      hier.

   DIE UNTERSTREICHUNG LÖST BEIDES. Sie ist kein Farbwert, also zählt
   sie im Abdruck der Matrix; und sie ersetzt die Schriftfarbe als
   zweiten Träger.

   SIE WIDERSPRICHT DER GRUNDREGEL NICHT. Dort steht `text-decoration:
   none`, weil ein `<a>` seine Verweis-Unterstreichung MITBRINGT — im
   RUHEZUSTAND, ungefragt, auf jedem Reiter. Hier wird sie gesetzt, im
   Überfahren, als Rückmeldung. Das Gegenteil einer Voreinstellung.

   DER PREIS IST GEMESSEN: ohne die `color`-Zeile steht die gedämpfte
   Schrift auf der gedämpften Fläche bei 4,50:1 — es reicht, aber ohne
   Luft. Wer `--farbe-text-gedaempft` oder `--farbe-flaeche-gedaempft`
   anfasst, prüft diese Paarung zuerst. */
/* BEIM ÜBERFAHREN NUR DIE SCHRIFT — 12.08.2026, angesagt: „bei Hover ist
   ein Unterstrich da, der weg sollte."

   Jitter macht es genau so: `._defaultItem:hover { color: #19171c }`, mit
   einem Übergang von 0,3 s auf der Farbe und sonst nichts. Eine Fläche
   unter dem ruhenden Wort wäre im Trog ein zweiter heller Fleck neben der
   Pille — man liest ihn als zweiten aktiven Reiter. */
.reiter__eintrag:not(.reiter__eintrag--aktiv):is(:hover, .zeige-ueberfahren) {
  color: var(--farbe-text);
}

/* SCHWARZ GEFUELLT — 04.08.2026. Hier stand eine weisse Flaeche mit
   violetter Schrift und einem Schatten; auf dem grauen Oval war das der
   „weiche" Eindruck.

   [gemessen] Jitters Hauptaktion ist `_black_`: Grund `#19171c`, Schrift
   `#fff` (siehe `vorlage/jitter/MESSUNG.md`). Bei uns sind das
   `--farbe-knopf-dunkel` und `--farbe-primaer-kontrast` — dieselben
   Werte, schon im Bestand.

   HIER STAND „DREI TRAEGER: Flaeche, Schriftfarbe und Gewicht" — und
   das stimmt seit dem 05.08.2026 nicht mehr. Frage 4 ist entschieden
   („700-800 nur fuer den Seitentitel"), der aktive Reiter ist keiner,
   und damit steht er im selben 600 wie der ruhende. Der dritte Traeger
   ist weg.

   WAS BLEIBT, sind Flaeche und Schriftfarbe — zwei Traeger, beide
   Farbe. Die Zustandsmatrix meldet das NICHT, weil sie je Baustein die
   Zustaende untereinander vergleicht und nicht den aktiven mit dem
   ruhenden Reiter. Es steht trotzdem hier, damit es nicht still
   verschwindet: der schwarze Fleck in einer Reihe heller Woerter ist
   unuebersehbar, aber er ist Farbe. Wer einen dritten Traeger will,
   ohne das Gewicht anzufassen, hat die Form (der aktive Reiter ist der
   einzige gefuellte) — das ist eine Entscheidung, keine Messung.

   ===================================================================
   DIE ENTSCHEIDUNG IST GEFALLEN — 05.08.2026
   ===================================================================
   Angesagt: „der aktive Reiter bekommt einen Unterstrich als farblosen
   Traeger (so macht es Luma)." Damit sind es wieder drei, und der
   dritte ist keine Farbe: Flaeche, Schriftfarbe, Unterstrich.

   ALS BALKEN UND NICHT ALS `text-decoration` — und das ist kein
   Geschmack. Der Ueberfahren-Zustand beider Reiter benutzt bereits
   `text-decoration: underline` als Rueckmeldung (siehe die zwei Bloecke
   darueber). Waere der aktive Reiter dauerhaft unterstrichen, haette
   sein Ueberfahren keinen sichtbaren Unterschied mehr — ein Traeger
   dazu und einer weg.

   ER LIEGT UNTER DER PILLE, nicht in ihr: die Pille ist rund und
   gefuellt, ein Strich darin waere Zierrat auf einer Flaeche, die schon
   traegt. Darunter ist er das, was Luma zeigt — eine Marke an der
   Leiste. Waagerecht auf die Wortbreite eingerueckt, damit er zum Wort
   gehoert und nicht zur Kachel. */
.reiter__eintrag {
  position: relative;
}

.reiter__eintrag--aktiv {
  background: var(--farbe-flaeche);
  color: var(--farbe-text);
  font-weight: var(--schrift-halbfett);
  /* DER SCHATTEN IST DER DRITTE TRÄGER und der Grund, aus dem die weiße
     Pille auf hellgrauem Trog überhaupt trägt: Fläche allein hält
     #FFFFFF gegen #E5E4E7 nur 1,17:1. Er hebt sie ab, statt sie zu
     färben. */
  box-shadow: var(--schatten-1);
}

/* HIER STAND DER BALKEN UNTER DER AKTIVEN PILLE — gefallen am 12.08.2026,
   angesagt: „der Strich unter der aktiven Pille sollte weg."

   Er war der dritte Träger neben Fläche und Schriftfarbe, und mit dem Trog
   trägt ihn der Schatten. Zwei Zeichen für denselben Zustand sind eines zu
   viel — und der Balken hatte einen eigenen Fehler: bei umgebrochenen
   Reitern lag er auf dem Wort der zweiten Zeile (gemessen am 06.08.2026,
   y = 543 bis 546). Mit ihm fällt auch dieser Fall. */

/* Auch hier trug der Zustand nur Farbe: `rgb(25,23,28)` auf
   `srgb 0.206 0.199 0.217` — ein Unterschied, den man im Bild kaum
   sieht und den die Matrix zu Recht meldet. Dieselbe Abhilfe wie beim
   ruhenden Reiter, damit die Rueckmeldung auf beiden dieselbe ist. */
.reiter__eintrag--aktiv:is(:hover, .zeige-ueberfahren) {
  box-shadow: var(--schatten-2);
}

/* SCHMALERES POLSTER AM HANDY — 02.08.2026, ABER NICHT FÜR EINE ZEILE.
   Der Bauauftrag rechnet vor, dass 8 px statt 16 px waagerechtem Polster
   die vier Reiter in eine Zeile bringen: 224 px Wortbreite + 4×16 + 3×4 +
   2×4 = 308 px in einem 310-px-Fach.

   NACHGEMESSEN STIMMT DIE RECHNUNG NICHT: die vier Wörter sind 234 px
   breit, nicht 224, und das Fach ist 300 px, nicht 310. Mit Polster und
   Lücken sind es 318 px. Es bleiben zwei Zeilen.

   UND DAS IST RICHTIG SO. In `tests/messungen/einstellungen.spec.ts` steht
   ausführlich, warum: eine seitwärts laufende Leiste würde „Betrieb"
   abschneiden — den neuen Reiter, den niemand erwartet. Zwei Zeilen zeigen
   alle vier. Die Zeilenzahl ist nicht die Frage, die Sichtbarkeit ist es.

   Das schmalere Polster bleibt trotzdem: es nimmt der Leiste 32 px Breite,
   ohne einer Trefferfläche etwas zu nehmen — die bleibt 48 px hoch. */
@container huelle (max-width: 39.999rem) {
  .reiter__eintrag {
    padding: 0 var(--abstand-2);
  }
}

/* --- Fortschrittsbalken ------------------------------------- */

/* Regel 07, woertlich: EIN Balken mit drei Zahlen und einer
   Klartext-Marke - NICHT der Prozentwert. */
.balken {
  display: grid;
  gap: var(--abstand-2);
}

.balken__kopf {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--abstand-2);
}

.balken__wort { font-weight: var(--schrift-halbfett); }

.balken__zahlen {
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

.balken__zahlen strong {
  font-size: var(--groesse-gross);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

.balken__bahn {
  /* `relative` für die Zielkerbe darin. */
  position: relative;
  height: 14px;
  border-radius: var(--radius-rund);
  background: var(--farbe-flaeche-gedaempft);
  border: var(--randbreite) solid var(--farbe-rand-bedienelement);
  overflow: hidden;
}

/* DIE ZIELKERBE — 02.08.2026. Sie steht nur da, wenn das Ziel ÜBERTROFFEN
   ist: die Bahn reicht dann bis zum Ist-Wert, und ohne Kerbe wäre nicht
   mehr zu sehen, wo das Ziel lag. Bei 7 von 3 sitzt sie bei 42,9 %.
   Weiß auf `--farbe-erfolg` hält 4,89:1 — und sie ist nicht der Träger:
   das bleibt die Klartext-Marke darunter („Ein Monat vor Plan"). */
.balken__kerbe {
  position: absolute;
  top: 0;
  bottom: 0;
  width: calc(var(--randbreite) * 2);
  background: var(--farbe-flaeche);
}

.balken__fuellung {
  height: 100%;
  border-radius: var(--radius-rund);
  background: var(--farbe-primaer);
  transition: width var(--dauer-mittel) var(--kurve);
}

.balken--erreicht .balken__fuellung {
  background: var(--farbe-erfolg);
}

/* Die Marke ist der Traeger. Eine Balkenlaenge liest man nicht ab,
   und Farbe sagt gar nichts. */
.balken__marke {
  display: flex;
  align-items: center;
  gap: var(--abstand-1);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text-gedaempft);
}

.balken--erreicht .balken__marke {
  color: var(--farbe-erfolg);
}

/* Ohne eigene Groesse. Siehe die Anmerkung am Chip-X. */

/* --- Avatar ------------------------------------------------- */

/* Regel 14: der Ausloeser fuer das Konto-Menue. Initialen statt
   Platzhalterbild - ein Betrieb ohne Foto ist der Normalfall, und
   eine graue Silhouette sieht nach Fehler aus. */
.avatar {
  flex: none;
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-rund);
  background: var(--farbe-primaer-sehr-hell);
  /* Siehe die Begruendung an .karte__marke: die Handlungsfarbe traegt auf
     einer getoenten Flaeche keinen Text mehr. Die Kuerzel stehen jetzt in
     der Textfarbe, gemessen 10,90:1 statt 3,87:1. */
  color: var(--farbe-text);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  letter-spacing: var(--laufweite-null);
}

.avatar--gross {
  width: 72px;
  height: 72px;
  font-size: var(--groesse-h3);
}

/* --- Zahlenfeld mit Plus und Minus -------------------------- */

/* Regel 07 (g3), woertlich: grosse Zahl mit Plus und Minus, KEIN
   Regler. Ein Regler ist mit Arbeitshandschuh nicht bedienbar.
   Die Knoepfe sind mit 56 px absichtlich groesser als die
   44-px-Untergrenze: das hier ist der eine Baustein, bei dem der
   Handschuh im Text der Entscheidung steht. */
.zahlenfeld {
  display: grid;
  gap: var(--abstand-2);
  justify-items: center;
}

.zahlenfeld__wort {
  font-weight: var(--schrift-halbfett);
}

/* ===================================================================
   SIE PASST BEI +15 % SCHRIFT — 04.08.2026, Baustelle 2.5
   ===================================================================

   Gemessen auf `/ziele` bei 390 px und +15 % Schrift: die Reihe lief bis
   x = 412 in einem 390-px-Fenster, 22 px Querscroll. Das war der letzte
   offene Fall aus Frage 11 und der einzige, der eine ZWEITE Bedingung
   brauchte — die anderen fuenf traten schon bei normaler Schrift auf.

   DIE RECHNUNG: zwei Knoepfe zu 56 px, die Zahl mit `min-width: 5ch` bei
   `--groesse-riesig`, dazu zweimal `--abstand-4` (24 px) Luecke. Bei
   +15 % waechst nur die Zahl — 5ch von 72 px Schrift sind rund 200 px.

   ZWEI AENDERUNGEN, und beide sind noetig:

   `min-width: 0` an der Reihe. Eine Flex-Zeile ist von sich aus
   `min-width: auto` und damit so breit wie ihr Inhalt; sie kann gar
   nicht schrumpfen. Dieselbe Falle wie an `.zeile__mitte`,
   `.ziele__raster`, `.mitglied`, `.rechnung` und
   `.gespraech__handlungen` — zum sechsten Mal in diesem Umbau.

   `min-width` an der Zahl auf `4ch` bei schmalen Behaeltern. 5ch sind
   fuer „1.000" gerechnet und halten dort die Breite ruhig, damit die
   Knoepfe beim Zaehlen nicht wandern. Vier Zeichen reichen fuer jeden
   Wert, den das Monatslimit annimmt (25 bis 1.000 in 25er-Schritten),
   und die Ruhe bleibt — sie haengt an der festen Breite, nicht an
   ihrer Zahl. */
.zahlenfeld__reihe {
  display: flex;
  align-items: center;
  gap: var(--abstand-4);
  min-width: 0;
}

/* DIE SCHMALE FASSUNG STEHT WEITER UNTEN, hinter `.zahlenfeld__zahl` —
   06.08.2026. Hier stand sie bis dahin, und die Haelfte davon war wirkungslos:
   `min-width: 4ch` in dieser Abfrage und `min-width: 5ch` an der Grundregel
   haben dieselbe Spezifitaet, und die Grundregel steht spaeter in der Datei.
   Gemessen am 06.08.2026 bei 390 px: 237,48 px, das sind 5ch und nicht 4ch.
   Die Abfrage hat also nur die Luecke verkleinert, nie die Zahl. */

.zahlenfeld__knopf {
  flex: none;
  width: 56px;
  height: 56px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: var(--randbreite) solid var(--farbe-rand-bedienelement);
  border-radius: var(--radius-rund);
  background: var(--farbe-flaeche);
  /* IN DER TINTE, NICHT IN DER PRIMAERFARBE — 11.08.2026, im Bild
     nachgezogen. Dieselbe Entscheidung wie am Umriss-Knopf, und hier faellt
     sie deutlicher aus: seit der Steller in der Boost-Kachel sitzt, stehen
     drei Farben uebereinander — Gelb der Kachel, Weiss des Kreises, Violett
     des Zeichens. Die Tinte haelt 17,79:1 auf dem weissen Kreis gegen
     gerechnete 7,0 in Violett und laesst der Kachelfarbe ihre Aufgabe. */
  color: var(--farbe-text);
  cursor: pointer;
  /* Der Schatten beim Überfahren sprang hart auf — als einziges der neun
     Bedienelemente dieses Bereichs hatte der Steller keinen Übergang. */
  transition:
    border-color var(--dauer-schnell) var(--kurve),
    box-shadow var(--dauer-schnell) var(--kurve);
}

/* Ohne eigene Groesse: der Baustein uebergibt groesse: 'gross'. */

/* Und beim Überfahren in dieselbe Tinte wie am Umriss-Knopf — sonst hätte
   das Produkt zwei Zweitknöpfe mit zwei verschiedenen Überfahren-Farben. */
.zahlenfeld__knopf:is(:hover, .zeige-ueberfahren):not(:disabled) {
  border-color: var(--farbe-text);
  box-shadow: var(--schatten-2);
}

.zahlenfeld__knopf:is(:active, .zeige-aktiv):not(:disabled) {
  transform: translateY(1px);
  box-shadow: none;
}

.zahlenfeld__knopf:disabled {
  cursor: not-allowed;
  border-style: dashed;
  border-color: var(--farbe-gesperrt-rand);
  background: var(--farbe-gesperrt-flaeche);
  color: var(--farbe-gesperrt-text);
}

/* Die grosse Zahl. Das ist der Punkt der Entscheidung: man liest sie
   von oben herab, ohne die Brille zu suchen. */
/* ===================================================================
   DIESELBE FESTE GROESSE WIE DAS QUARTALSZIEL — 04.08.2026
   ===================================================================

   Hier stand `--groesse-riesig`, und das ist `clamp(44px, 6vw, 72px)`:
   bei 390 px Fensterbreite faellt die Zahl still auf 44 px.

   GEFUNDEN DURCH EINEN ZIELKONFLIKT, den Baustelle 2.5 erzeugt hat. Das
   Quartalsziel bekam eine grosse Zahl in `--groesse-bewertung` (feste
   72 px); die Messung „Plus und Minus sind mit Handschuh zu treffen"
   verlangt, dass die Limit-Zahl die groesste Schrift der Seite ist —
   und bei 390 px war sie es nicht mehr.

   Der Konflikt war der Anlass, der Mangel war aelter: `--groesse-riesig`
   an einer Zahl, die die auffaelligste Stelle ihrer Karte sein soll, ist
   genau der Fall, gegen den `--groesse-bewertung` am 02.08.2026
   eingefuehrt wurde. Die Begruendung stand die ganze Zeit daneben, nur
   an der anderen Zahl.

   BEIDE ZAHLEN SIND JETZT GLEICHRANGIG, und das stimmt auch inhaltlich:
   der Auftrag nennt beide gross („Quartalsziel als grosse Zahl im
   Jitter-Stil" und „Monatslimit bleibt grosse Zahl mit Minus und
   Plus"). Sie stehen in verschiedenen Karten, nicht nebeneinander —
   zwei Aussagen, nicht ein Groessenzoo. */
.zahlenfeld__zahl {
  min-width: 5ch;
  text-align: center;
  font-size: var(--groesse-bewertung);
  font-weight: var(--schrift-halbfett);
  line-height: var(--zeilenhoehe-eng);
  letter-spacing: var(--laufweite-eng);
  font-variant-numeric: tabular-nums;
}

/* ===================================================================
   BEI 390 PX STEHT DIE ZAHL UEBER DEN KNOEPFEN — 06.08.2026
   ===================================================================

   GEFUNDEN BEIM ANSEHEN, nicht von einer Probe: die beiden Steller hingen
   sichtbar AUSSERHALB der grauen Karte. Gemessen bei 390 px: die Reihe lief
   von x = 8 bis x = 382, die Karte von 20 bis 370 — 12 px ueber jede Kante,
   und der Querlauf blieb dabei 0, weil 382 noch ins Fenster passt. Genau
   deshalb hat es keine Zahl gemeldet.

   DIE RECHNUNG, UND SIE GEHT NICHT AUF. Die Karte traegt 48 px Polster je
   Seite, es bleiben 254 px. Darin muessten stehen:

     zwei Knoepfe zu 56 px          112 px   [Handschuhmass, entschieden]
     zweimal `--abstand-3`           24 px
     die Zahl bei 72 px Schrift     194 px   [gemessen, „200 €"]
                                    -------
                                    330 px   ->  74 px zu viel

   Die laengste Zahl, die das Limit annehmen kann („1.000 €"), braucht mit
   192 px sogar etwas weniger als die heutige. Es liegt nicht am Wert.

   KEINE DER DREI ZAHLEN DARF FALLEN, und das ist der Grund fuer den Umbau
   statt einer kleineren Schrift: 56 px sind das Handschuhmass, und die
   72 px sind am 04.08.2026 ausdruecklich gegen `--groesse-riesig`
   entschieden worden — die Limit-Zahl SOLL die groesste Schrift ihrer Seite
   sein, auch bei 390 px. Eine vierte Stellschraube gibt es nicht: selbst
   mit halbiertem Kartenpolster und 8 px Luecke fehlen noch 20 px.

   ALSO BRICHT DIE ZEILE, statt dass ein Wert nachgibt. Die Zahl nimmt die
   erste Reihe ueber beide Spalten, die Steller stehen darunter nebeneinander
   und mittig. Alle drei Werte bleiben, was sie sind.

   DIE TASTFOLGE DREHT SICH NICHT: Minus steht im Markup vor Plus und landet
   in Reihe 2 links, Plus rechts daneben. Die Zahl ist kein Ziel.

   `min-width` FAELLT HIER WEG, und das ist keine Nachlaessigkeit. Die 5ch
   halten die Knoepfe ruhig, waehrend die Zahl waechst — in der gebrochenen
   Fassung stehen die Knoepfe in einer eigenen, mittigen Reihe und koennen
   gar nicht mehr wandern. Der Boden hat dort keine Aufgabe mehr, kostet aber
   Breite: 5ch sind 237 px, die Zahl selbst braucht 194. Bei +15 % Schrift
   ist das der Unterschied zwischen 273 px (passt nicht in 254) und 223 px
   (passt). */
/* DIE ABFRAGE HAENGT AN DER KACHEL, NICHT AM FENSTER — 11.08.2026.
   Hier stand `@container huelle (max-width: 45rem)`, und das war richtig,
   solange der Steller in einer Karte ueber die halbe Seitenbreite stand:
   dann sagte die Fensterbreite genug ueber seinen Platz aus. Seit er in
   einer Bento-Kachel sitzt, sagt sie es nicht mehr — bei 1440 px lief er
   35 px ueber die Kachelkante, und der Querlauf am Dokument blieb 0.

   `24rem` (384 px) ist die Innenbreite, ab der die breite Fassung passt:
   zwei Knoepfe zu 56, zweimal 24 px Luecke und die Zahl mit 5ch bei
   `--groesse-bewertung` sind gemessen 346 px. Die 38 px Luft darueber
   sind fuer +15 % Schrift, die nur die Zahl wachsen laesst.

   `.zahlenfeld` STEHT NICHT NUR IN KACHELN. Ohne Kachel darum gibt es
   keinen Behaelter dieses Namens, und die Abfrage greift nie — dann gilt
   die breite Fassung, und das ist fuer eine freistehende Verwendung
   richtig. Die zweite Abfrage darunter faengt den Handyfall auch dort. */
@container kachel (max-width: 24rem) {
  .zahlenfeld__reihe {
    display: grid;
    grid-template-columns: auto auto;
    justify-content: center;
    gap: var(--abstand-3);
  }

  .zahlenfeld__zahl {
    grid-column: 1 / -1;
    grid-row: 1;
    min-width: 0;
  }

  .zahlenfeld__knopf {
    grid-row: 2;
  }
}

@container huelle (max-width: 45rem) {
  .zahlenfeld__reihe {
    display: grid;
    grid-template-columns: auto auto;
    justify-content: center;
    gap: var(--abstand-3);
  }

  .zahlenfeld__zahl {
    grid-column: 1 / -1;
    grid-row: 1;
    min-width: 0;
  }

  .zahlenfeld__knopf {
    grid-row: 2;
  }
}

/* Uebernommen aus der verworfenen Regler-Variante - die einzige Sache,
   die von dort bleibt. */
.zahlenfeld__marke {
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

/* --- Ladender Zustand -------------------------------------- */

/* Regel 10 verlangt fuer Ladezustaende Skelette statt Kringel - das
   gilt fuer FLAECHEN. An einem Knopf, der schon gedrueckt ist, ist ein
   Skelett unmoeglich, und ohne Zeichen waere "laedt" nur eine Farbe.
   Der Kringel ist hier also der Traeger, nicht die Ausnahme. */
.kringel {
  flex: none;
  width: 1.2em;
  height: 1.2em;
  border: 2px solid currentColor;
  border-top-color: transparent;
  border-radius: var(--radius-rund);
  animation: drehen .8s linear infinite;
}

@keyframes drehen {
  to { transform: rotate(360deg); }
}

/* ============================================================
   BEREICH 10 - UX-Zustaende
   Sechs Zustaende, jeder mit GENAU EINEM Knopf. Eine Ausnahme,
   und sie steht im Referenzstand: der Erfolg kommt ohne Knopf
   aus, wenn der Vorgang eindeutig abgeschlossen ist (j4).

   DIE WICHTIGSTE UNTERSCHEIDUNG: "noch nie etwas da" und "gerade
   nichts da" sehen gleich aus und sind gegensaetzlich. Ein leerer
   Posteingang am Freitagabend ist ein ERFOLG - er bekommt den
   gruenen Haken und KEINEN Knopf. Ein frisch angelegter Betrieb
   bekommt die Zeichnung, eine Frage und eine Aufforderung.
   ============================================================ */

.zustand {
  display: grid;
  gap: var(--abstand-3);
  justify-items: center;
  max-width: 32rem;
  margin: 0 auto;
  padding: var(--abstand-7) var(--abstand-4);
  text-align: center;
}

/* Der eine Satz. Gross genug, dass er die Aussage traegt - er IST die
   Aussage, nicht das Bild. */
.zustand__satz {
  font-size: var(--groesse-gross);
  font-weight: var(--schrift-halbfett);
  line-height: var(--zeilenhoehe-mittel);
  text-wrap: balance;
}

.zustand__einordnung {
  max-width: var(--breite-text-max);
  color: var(--farbe-text-gedaempft);
  font-size: var(--groesse-klein);
}

.zustand__handlung {
  margin-top: var(--abstand-2);
}

/* Die Fehlerkennung. Klein und unten - Regel 10 (j3): "nur klein und
   nur, wenn wir sie im Support wirklich auslesen". */
.zustand__kennung {
  margin-top: var(--abstand-3);
  font-family: var(--schrift-familie-mono);
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-leise);
}

/* --- Die Bilder je Zustand --------------------------------- */

/* Erfolg und abgearbeitet: derselbe gruene Haken. Der leere
   Posteingang am Freitagabend ist ein Erfolg, kein Mangel. */
.zustand__haken {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: calc(var(--groesse-text) * 3.4);
  height: calc(var(--groesse-text) * 3.4);
  border-radius: var(--radius-rund);
  background: var(--farbe-erfolg-hell);
  color: var(--farbe-erfolg);
}

.zustand__haken .symbol {
  width: calc(var(--groesse-text) * 1.9);
  height: calc(var(--groesse-text) * 1.9);
}

.zustand__zeichen {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: calc(var(--groesse-text) * 3.4);
  height: calc(var(--groesse-text) * 3.4);
  border-radius: var(--radius-rund);
  background: var(--farbe-flaeche-gedaempft);
  color: var(--farbe-text-gedaempft);
}

/* Fehler: getoent, aber nicht laut. Der Zustand soll sagen, was zu tun
   ist - nicht erschrecken. */
.zustand__zeichen--fehler {
  background: var(--farbe-fehler-hell);
  color: var(--farbe-fehler);
}

/* OHNE BERECHTIGUNG bekommt bewusst dasselbe ruhige Grau wie Offline:
   kein Vorhaengeschloss (Regel 14 verbietet es), kein rotes Zeichen.
   Wer die Rechnungen nicht sieht, hat nichts falsch gemacht. */

/* --- Offline: was trotzdem geht ---------------------------- */

/* Der Meister ist im Keller, im Neubau, im Funkloch - das ist der
   Normalfall. Ein Zustand, der nur sagt was NICHT geht, laesst ihn
   ratlos stehen. */
.zustand__geht {
  display: grid;
  gap: var(--abstand-2);
  justify-items: start;
  padding: var(--abstand-4);
  border-radius: var(--radius-standard);
  background: var(--farbe-flaeche);
  text-align: left;
}

.zustand__geht-zeile {
  display: flex;
  align-items: flex-start;
  gap: var(--abstand-2);
  font-size: var(--groesse-klein);
  color: var(--farbe-text);
}

.zustand__geht-zeile .symbol {
  color: var(--farbe-erfolg);
  margin-top: .15em;
}

/* --- Skelett ----------------------------------------------- */

/* Regel 10 (j2): "Graue Rechtecke genau dort, wo gleich Inhalt steht -
   gleiche Groesse, gleiche Anordnung. Kein Kringel, kein Prozentwert."

   WIE DIE GLEICHE HOEHE SICHERGESTELLT IST: nicht durch nachgemessene
   Zahlen, sondern weil das Skelett aus DENSELBEN Elementen mit
   denselben Klassen gebaut ist und echten Text enthaelt. Der Text ist
   unsichtbar und traegt einen grauen Balken als Hintergrund. Die
   Zeilenhoehe und die Zeilenzahl kommen damit aus derselben CSS-Regel
   wie beim Inhalt - sie KOENNEN nicht abweichen. Gemessen wird es
   trotzdem. */
.skelett {
  /* Kein eigenes Layout: die Form kommt von den Klassen des Inhalts. */
  list-style: none;
}

/* Der graue Balken sitzt AUF dem unsichtbaren Text. Damit ist er genau
   so hoch wie die Textzeile und genau so breit wie der Text. */
.skelett__balken {
  color: transparent;
  background: var(--farbe-flaeche-gedaempft);
  border-radius: var(--radius-klein);
  /* Ohne das laege der Balken bei mehrzeiligem Text nur um die erste
     Zeile. */
  box-decoration-break: clone;
  -webkit-box-decoration-break: clone;
  animation: pulsieren 1.4s ease-in-out infinite;
}

/* Die Flaeche, wo das Kanal-Symbol hinkommt. Gleiche Groesse, aber grau:
   ein farbiges Markenzeichen im Ladezustand waere eine Falschaussage -
   der Kanal ist noch nicht bekannt. */
.skelett__flaeche {
  background: var(--farbe-flaeche-gedaempft);
  box-shadow: none;
  animation: pulsieren 1.4s ease-in-out infinite;
}

/* Langsam pulsierend, wie Regel 10 es nennt. Nicht wandernd: ein
   Glanzstreifen, der ueber die Seite laeuft, zieht den Blick auf das
   Warten statt auf den Inhalt. */
@keyframes pulsieren {
  0%, 100% { opacity: 1; }
  50%      { opacity: .55; }
}

/* Die Balken laufen versetzt an, damit die Liste lebt und nicht
   gleichzeitig blinkt. Hoechstens acht - mehr sieht niemand.

   DIE LEITER STAND ALS SIEBEN FESTE ZAHLEN HIER (.12 bis .84 s) und war
   damit derselbe Fall wie die 40 ms in `.tritt-ein`: ein Wert aus
   Regel 12, fest verdrahtet. Sie kommt jetzt aus `--staffel-versatz`.

   WARUM MAL DREI. Der Staffelversatz ist 40 ms und gilt fuer einen
   EINTRITT — dort laeuft jedes Element genau einmal 200 ms lang, und
   40 ms sind ein Fuenftel davon. Das Skelett pulsiert dagegen
   dauerhaft mit einer Periode von 1,4 s; mit 40 ms Abstand laegen acht
   Balken innerhalb von 280 ms, also innerhalb eines Fuenftels der
   Periode, und das sieht aus wie gleichzeitig. 3 x 40 = 120 ms ergeben
   ueber acht Balken 840 ms — genau die sieben Stufen, die vorher hier
   standen, und damit derselbe gebaute Zustand aus einer Zahl statt aus
   sieben. */
.skelett > * .skelett__balken,
.skelett > * .skelett__flaeche {
  animation-delay: calc(var(--staffel, 0) * var(--staffel-versatz) * 3);
}
.skelett > *:nth-child(2) { --staffel: 1; }
.skelett > *:nth-child(3) { --staffel: 2; }
.skelett > *:nth-child(4) { --staffel: 3; }
.skelett > *:nth-child(5) { --staffel: 4; }
.skelett > *:nth-child(6) { --staffel: 5; }
.skelett > *:nth-child(7) { --staffel: 6; }
.skelett > *:nth-child(8) { --staffel: 7; }

/* Eine Skelettzeile ist nicht anklickbar. Ohne das sieht ein
   Ladezustand aus wie fertiger Inhalt - genau das soll er nicht. */
.zeile--skelett .zeile__flaeche,
.karte--skelett {
  cursor: default;
  pointer-events: none;
}

.kartenliste {
  display: grid;
  gap: var(--abstand-3);
}

/* ============================================================
   BEREICH 17 - Anmeldung
   Kein Bereich aus dem Referenzstand: neu entschieden, damit die
   Anmeldeseite nicht als Umsetzung von etwas durchgeht, das nie
   entschieden wurde. Nur bestehende Bausteine, so schmal wie
   moeglich.
   ============================================================ */

/* --- Feld mit schwebender Beschriftung ---------------------- */

/* Die Beschriftung sitzt gross im leeren Feld und wandert bei Fokus oder
   Eingabe verkleinert nach oben.

   SIE BLEIBT EINE ECHTE BESCHRIFTUNG. Es ist ein <label for="...">, es
   verschwindet nie - auch nicht beim Tippen - und Vorleseprogramme lesen
   es als Beschriftung. Ein Platzhalter waere weg, sobald man das erste
   Zeichen eintippt; genau deshalb war er in Runde 1 verboten und ist es
   weiter. Was dazukommt, ist nur die Bewegung.

   Der Umschalter dafuer ist `:placeholder-shown`. Das Feld traegt einen
   LEEREN Platzhalter (ein Leerzeichen) - nur als Angriffspunkt fuer CSS,
   nie als sichtbarer Text. Ohne diesen Griff gaebe es keinen Weg, "Feld
   ist leer" in CSS abzufragen, und die Bewegung braeuchte ein Skript. */
.feld {
  position: relative;
  display: block;
}

/* ===================================================================
   JITTERS FELDBAUART — 03.08.2026, angesagt: „die neuen Focus und
   Textfelder etc, also wirklich alles besser und neu wie bei Jitter"
   ===================================================================

   GEMESSEN aus seinen Stilvorlagen (`_inputField_zn66c_304`):

     background      f2f1f3 bei 35 % Deckkraft
     border          1px solid transparent
     outline         none
     hover/focus     background auf volle Deckkraft

   DIE BAUART IST „FLAECHE STATT RAND", und das ist der Unterschied zu
   unserem Feld: seines ist eine leicht getoente Flaeche ohne sichtbare
   Kante, unseres eine weisse Flaeche mit Rand. Bei Beruehrung wird seine
   Flaeche kraeftiger — die Rueckmeldung liegt in der Flaeche, nicht in
   einer Linie.

   ZWEI SEINER WERTE UEBERNEHME ICH NICHT, und beide aus demselben Grund:

   1. DEN TRANSPARENTEN RAND. Unser `--farbe-rand-bedienelement` haelt
      3,45:1 auf Weiss, und das steht dort als bewusste Entscheidung an
      der WCAG-Grenze fuer Bedienelement-Kanten (1.4.11 verlangt 3:1).
      Jitters Feld kommt ohne aus, weil es im DUNKLEN Inspektor steht,
      wo die helle Flaeche selbst die Kante zeichnet. Auf unserem weissen
      Grund haelt `#F2F1F3` gegen `#FFFFFF` rund 1,05:1 — die Flaeche
      allein waere keine Kante mehr, und das Feld waere fuer jemanden mit
      schwachem Kontrastsehen nicht mehr zu finden.

   2. `outline: none`. Er markiert den Fokus ueber den Flaechenwechsel.
      Von 35 % auf 100 % desselben Grautons ist zu wenig, um als
      Fokusanzeige zu taugen, und WCAG 2.4.11 verlangt einen sichtbaren
      Indikator. Unser Ring bleibt.

   Was bleibt, ist seine Anmutung mit unserer Bedienbarkeit: die getoente
   Flaeche, der Wechsel bei Beruehrung — und die Kante, die man sieht. */
.feld__eingabe,
.feld .textbereich,
.feld .auswahl {
  width: 100%;
  border: var(--randbreite) solid var(--farbe-rand-bedienelement);
  /* ===================================================================
     KANTIG WIE BEI JITTER — 11.08.2026, angesagt und gemessen
     ===================================================================

     „die Texteingabefelder sollten doch alle, genauso wie die active und
     hover Zustände … wie bei Jitter übernommen sein"

     GEMESSEN in `Log in · Jitter_files/style-C4gO4Y7V.css` und
     `Workspace settings · …/style-B7LYDxw8.css`:

       ._paranoidInput  border: 1px solid #d7d7db; border-radius: 0;
                        height: 60px; padding: 16px; font-size: 18px
       ._formInput      dieselben Werte
       ._input_1b020    border-radius: 0; transition: border .35s
                        cubic-bezier(.25,.46,.45,.94)
                        :focus { border-color: #fff; outline: none }

     DREI DER VIER WERTE ÜBERNOMMEN. Die Höhe stimmte schon: `--feld-hoehe`
     steht seit jeher auf 60 px. Der Radius stand auf 10 und geht auf 0 —
     das ist die sichtbarste Abweichung und dieselbe Richtung wie die
     Ansage vom Vormittag („schwarz und kantig wie auf der Übersicht").
     Der Übergang liegt jetzt auf `border-color` statt auf der Fläche, mit
     Jitters Dauer und Kurve.

     ZWEI WERTE AUSDRÜCKLICH NICHT — vorgelegt und so entschieden:

       DIE RANDFARBE BLEIBT #8A8A8A. Jitters #d7d7db hat auf Weiß 1,45:1;
       WCAG 1.4.11 verlangt für die Grenze eines Bedienelements 3:1, und
       unser Wert liegt bei 3,45:1. Ein Feld, dessen Kante man nicht sieht,
       ist auf einer Baustelle bei Sonne kein Feld mehr.
       DER FOKUSRING BLEIBT. Jitter schaltet `outline: none` und färbt nur
       den 1-px-Rand um. Was übernommen ist, ist das VERHALTEN — der Rand
       wechselt in die Primärfarbe —, nur eben zusätzlich zum Ring und
       nicht an seiner Stelle.

     Beides steht als bewußte Abweichung in `tokens.css` bei
     `--farbe-rand-bedienelement` und `--fokusring`.

     DAS POLSTER IST EIN DRITTER FALL, und er ist keine Entscheidung
     gegen Jitter, sondern eine andere Bauart: Jitters 16 px ringsum
     gelten für ein Feld mit Platzhalter. Unseres trägt eine STEIGENDE
     BESCHRIFTUNG, die im Ruhezustand mittig im Feld steht und beim
     Tippen nach oben rückt — sie braucht die 24 px oben, sonst stünde
     sie auf der Kante. Wer das Polster gleichzieht, muß zuerst die
     Beschriftung abschaffen. Das freie Feld ohne Beschriftung —
     `.antwort__feld` — hat Jitters 16 px ringsum bekommen. */
  border-radius: 0;
  background: var(--farbe-feld);
  /* Jitters Dauer und Kurve, gemessen an `._input_1b020_65`. Sie liegt auf
     der Randfarbe, weil DIE bei Berührung und Fokus wechselt — auf der
     Fläche lief sie ins Leere. */
  transition: border-color 350ms cubic-bezier(0.25, 0.46, 0.45, 0.94),
    background-color var(--dauer-schnell) var(--kurve);
  /* WER SEINE FLAECHE SETZT, SETZT AUCH SEINE SCHRIFT. Das fehlte hier,
     und es war der schwerste Fehler im ganzen Bereich 02: die
     Onboarding-Bildschirme auf dem Verlauf setzen
     `color: var(--farbe-primaer-kontrast)` auf den ganzen Bildschirm,
     weil dort alles Weiss traegt. Das Feld hat eine WEISSE Flaeche und
     erbte diese weisse Schrift.

     Gemessen am 01.08.2026 auf der echten Seite: acht Felder auf vier
     Bildschirmen (website, kontakt, betrieb, suche) standen auf
     1,00:1. Wer dort tippt, sieht nichts. Der Platzhalter war sichtbar,
     weil er eine eigene Farbe hat — deshalb faellt es im Bild nicht auf,
     solange niemand tippt.

     KEINE MESSUNG HAT DAS GEFUNDEN, und der Grund steht in
     PRUEFUNGEN.md: die Zustandsmatrix misst Bausteine in der WERKSTATT,
     und dort ist der Grund weiss. Sie hat acht Runden lang etwas
     bestaetigt, das auf dem Verlauf nie galt — dieselbe Ursache wie beim
     Bildlauf des Posteingangs.

     Die Regel gilt fuer JEDES Bedienelement mit eigener Flaeche, nicht
     nur hier: die Schriftfarbe gehoert dorthin, wo die Flaeche gesetzt
     wird. Sonst haengt sie an der Umgebung, und die kann jede sein. */
  color: var(--farbe-text);
  font-size: var(--groesse-text);
}

.feld__eingabe {
  min-height: var(--feld-hoehe);
  /* Oben mehr Polster: dort landet die Beschriftung. */
  padding: var(--abstand-5) var(--abstand-3) var(--abstand-2);
}

/* Der Schatten ist der Traeger. Nur die Randfarbe zu wechseln waere ein
   reiner Farbunterschied - die Zustandsmatrix meldet das. */
.feld__eingabe:is(:hover, .zeige-ueberfahren):not(:disabled) {
  border-color: var(--farbe-primaer);
  box-shadow: var(--schatten-1);
}

/* ===================================================================
   DER RANDWECHSEL IM FOKUS IST GEFALLEN — 18.08.2026, gemeldet
   ===================================================================

   GEMELDET MIT BILD: „genauso wie die Aktiv-Zustände von den ganzen, die
   Fokus-Zustände. Das sieht auch einfach nicht gut aus. Dich da bitte an
   dieses Onboarding halten, das ist sehr clean."

   AUF DEM BILD SIND ES ZWEI RINGE: der dunkle Fokusring außen und ein lila
   Rand innen, dazwischen der weiße Saum. Drei Linien um ein Textfeld.

   HIER STAND: „`._input_1b020_65:focus { border-color: #fff }` — bei Jitter
   wechselt im Fokus die RANDFARBE. Genau das steht jetzt hier, in unserer
   Primärfarbe statt in Weiß — und ZUSÄTZLICH zum Ring, nicht an seiner
   Stelle. Der Ring trägt die Auflage, der Rand trägt die Anmutung."

   UND GENAU DAVOR WARNT DIE REGEL DES FOKUSRINGS SELBST, seit sie gebaut
   wurde: „EIN TRAEGER, NICHT ZWEI. Vorher wechselte am Feld zusaetzlich der
   Rahmen die Farbe — zwei Ringe uebereinander, das wirkte schwer." Der
   Zusatz vom 11.08.2026 hat genau den Zustand wiederhergestellt, den diese
   Zeile beseitigt hatte. Beide Vermerke standen nebeneinander im selben
   Dokument.

   DAS ONBOARDING IST DAS VORBILD, und es macht es schon richtig:
   `.einrichten--farbe .feld__eingabe:is(:hover, :focus, …)` setzt
   `border-color: transparent; box-shadow: none` — dort trägt der Ring allein.
   Das ist das „sehr clean", das gemeint war.

   WAS BLEIBT: der Ring. Er ist die Auflage (WCAG 2.4.11), er ist zweifarbig
   und trägt auf jedem Grund. Was fällt, ist die Anmutung daneben — und sie
   war nie die Anzeige. */

.feld__wort {
  position: absolute;
  left: calc(var(--abstand-3) + var(--randbreite));
  top: 50%;
  transform: translateY(-50%);
  transform-origin: left center;
  font-size: var(--groesse-text);
  font-weight: var(--schrift-normal);
  color: var(--farbe-text-gedaempft);
  /* Der Klick muss durch die Beschriftung ins Feld gehen, sonst laesst
     sich das Feld nicht durch Antippen der Beschriftung fokussieren. */
  pointer-events: none;
  transition: transform var(--dauer-mittel) var(--kurve),
              color var(--dauer-mittel) var(--kurve);
  /* Eine schwebende Beschriftung ist von Natur aus einzeilig. UEBERGABE.md,
     Abschnitt 9 nennt dafuer ausdruecklich den Ausweg: ellipsis mit
     title-Attribut. Das title steht im Markup. */
  max-width: calc(100% - var(--abstand-7));
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Oben: bei Fokus, bei Inhalt, und dauerhaft an der Auswahlliste - die
   hat immer einen Wert. */
.feld__eingabe:focus ~ .feld__wort,
.feld__eingabe:not(:placeholder-shown) ~ .feld__wort,
.feld__eingabe.zeige-fokus ~ .feld__wort,
.textbereich:focus ~ .feld__wort,
.textbereich:not(:placeholder-shown) ~ .feld__wort,
.textbereich.zeige-fokus ~ .feld__wort,
.auswahl ~ .feld__wort {
  transform: translateY(-50%) translateY(-0.82em) scale(.78);
  color: var(--farbe-text-gedaempft);
}

/* Bei Fokus wird sie zusaetzlich kraeftiger - das ist keine
   Zustandsanzeige (die traegt der Ring), sondern nur Zusammenhang. */
.feld__eingabe:focus ~ .feld__wort,
.textbereich:focus ~ .feld__wort {
  color: var(--farbe-primaer);
}

/* DER ZUSTAND LIEGT IN DER FLAECHE — Jitters Bauart. Bei ihm wechselt sie
   von 35 % auf volle Deckkraft; bei uns dasselbe, nur von einem helleren
   Ausgangswert aus, weil unser Grund weiss ist und seiner dunkel. */
.feld__eingabe:is(:hover, :focus, .zeige-ueberfahren, .zeige-fokus),
.feld .textbereich:is(:hover, :focus, .zeige-ueberfahren, .zeige-fokus),
.feld .auswahl:is(:hover, :focus, .zeige-ueberfahren, .zeige-fokus) {
  background: var(--farbe-feld-beruehrt);
}

/* SIE STAND BIS ZUM 12.08.2026 ALS LETZTE REGEL DER DATEI, hinter dem
   Banner von Bereich 20, und gewann dadurch gegen die naechste: ein
   GESPERRTES Feld nahm beim Ueberfahren die Farbe „beruehrt" an. Gemeldet
   von der Wache, nachdem sie ihre Bereiche richtig trennt.

   Die Reihenfolge ist jetzt die Aussage: was verbietet, gewinnt gegen das,
   was anbietet. */
.feld__eingabe:disabled {
  cursor: not-allowed;
  border-style: dashed;
  border-color: var(--farbe-gesperrt-rand);
  background: var(--farbe-gesperrt-flaeche);
  color: var(--farbe-gesperrt-text);
}

.feld__eingabe:disabled ~ .feld__wort,
.textbereich:disabled ~ .feld__wort,
.auswahl:disabled ~ .feld__wort {
  color: var(--farbe-gesperrt-text);
}

/* Am Textbereich steht die Beschriftung nicht mittig: der Text faengt
   oben an, also muss sie dort auch anfangen. */
.feld--bereich .feld__wort {
  top: calc(var(--abstand-5) + 0.1em);
  transform: translateY(-50%);
}

.feld--bereich .textbereich:focus ~ .feld__wort,
.feld--bereich .textbereich:not(:placeholder-shown) ~ .feld__wort,
.feld--bereich .textbereich.zeige-fokus ~ .feld__wort {
  transform: translateY(-50%) translateY(-0.82em) scale(.78);
}

/* Flaeche statt Linien: der dicke rote Balken links ist weg, die getoente
   Flaeche und das Zeichen tragen die Aussage. */
.fehlerzeile {
  display: flex;
  align-items: flex-start;
  gap: var(--abstand-2);
  padding: var(--abstand-3) var(--abstand-4);
  border: var(--randbreite) solid var(--farbe-fehler);
  border-radius: var(--radius-standard);
  background: var(--farbe-fehler-hell);
  color: var(--farbe-fehler);
  font-size: var(--groesse-klein);
}

/* Das Zeichen ist der zweite Traeger neben dem Text - Rot allein
   traegt die Aussage nicht. Seit Bereich 15 ist es das Symbol
   "warnung" aus dem Satz, vorher stand hier ein Textzeichen "!". */
.fehlerzeile__zeichen {
  flex: none;
  display: inline-flex;
  align-items: center;
  /* Auf die erste Textzeile ausgerichtet, nicht auf die Kastenmitte. */
  padding-top: .1em;
}

.wortmarke {
  display: flex;
  align-items: center;
  font-size: var(--groesse-gross);
  font-weight: var(--schrift-halbfett);
  letter-spacing: var(--laufweite-eng);
}

.wortmarke__kurz {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.9em;
  height: 1.9em;
  margin-right: var(--abstand-2);
  border-radius: var(--radius-klein);
  background: var(--farbe-primaer);
  color: var(--farbe-primaer-kontrast);
  font-weight: var(--schrift-halbfett);
}

/* MITTIG UND IM OBEREN DRITTEL — 31.07.2026, Anmutung.
   Gemessen an Employment Hero: Marke gross und mittig bei rund 20 %
   der Fensterhoehe, darunter eine freundliche Ueberschrift, darunter
   Felder und Knopf in GLEICHER Breite, ebenfalls mittig. Bei uns
   stand alles linksbuendig, die Ueberschrift in 44 px oben in der
   Ecke, die Karte bei 5 % — sie sah aus wie ein Formular, nicht wie
   ein Empfang.

   `10vh` statt einer festen Zahl: bei 900 px sind das 90 px, mit dem
   Polster darunter landet die Marke bei rund 18 %. Auf einem kurzen
   Fenster schrumpft es mit, statt die Felder hinauszuschieben. */
/* ============================================================
   MITTIG, EINE KARTE, IM OBEREN DRITTEL — 02.08.2026
   ============================================================

   Angesagt: „Leere ist erlaubt, wenn sie gewählt ist. Bei Anmeldung und
   Kopfzeile ist sie es nicht. Die Anmeldung folgt der Employment-Hero-
   Vorlage: mittig, Karte, oberes Drittel."

   Gemessen belegte die Seite bei 1440 px **9,2 %** ihrer Fläche: eine
   26 rem schmale Spalte, oben mit `10vh` angeschoben, ohne Trennung zum
   Grund. Das ist keine gewählte Leere, sondern eine, die entstanden ist.

   Drei Sachen ändern sich, und alle drei sind Employment Heros Vorlage:

     1. Die Spalte wird eine KARTE — weiße Fläche, Rand, Radius, Schatten.
        Damit steht sie AUF dem Grund statt in ihm, wie die Inhaltskarte
        des Produkts auch.
     2. Sie steht MITTIG im Fenster statt an einem gerechneten `10vh`.
        `align-content: safe center` und nicht `center`: bei +15 % Schrift
        oder im Handy-Querformat wird der Inhalt sonst oben abgeschnitten,
        und abgeschnitten heißt hier „nicht anmeldbar".
     3. Die Wortmarke ist EINE Stufe größer als die Überschrift — 30 zu
        22 px = 1,36 : 1. Vorher trugen beide `--groesse-h3` und der
        Bildschirm hatte zwei gleich laute Anfänge.
   ============================================================ */

.anmeldung {
  min-height: 100dvh;
  box-sizing: border-box;
  display: grid;
  /* `safe` ist hier keine Feinheit: ohne das schneidet die Zentrierung
     bei zu wenig Höhe oben ab, und oben steht die Wortmarke. */
  align-content: safe center;
  justify-items: center;
  padding: var(--abstand-6) var(--abstand-4);
  text-align: center;
}

/* ===================================================================
   WIE DIE ANMELDUNG DER WEBSITE — 17.10.2026, angesagt
   ===================================================================

   „bitte mehr so wie die website". Gemessen auf
   engelhardt-bauer.de/anmelden bei 1440 px: KEINE Karte — eine schmale
   Spalte (315 px) mittig auf Weiss, Zeichen, fette eng gesetzte
   Ueberschrift (800, -0,044 em), ein Satz darunter, Beschriftung UEBER
   dem Feld (klein, 600), weisse Felder, schwarzer Knopf, darunter graue
   Fusszeilen mit einem Verweis.

   UEBERNOMMEN SIND DIE BAUSTEINE UND IHRE VERHAELTNISSE, NICHT DIE PIXEL.
   Die Website rechnet mit 9,1 px je rem; ihr Fliesstext steht dort auf
   12 px. Unser Grundmass ist 17 px, und die Lesbarkeitsproben gelten
   weiter. Die Spalte waechst deshalb im selben Verhaeltnis mit (315 px bei
   12 px Text -> 24 rem bei 17 px).

   ZWEI ABWEICHUNGEN, BEIDE ENTSCHIEDEN UND NICHT VERGESSEN: der Feldrand
   bleibt `--farbe-rand-bedienelement` (3,45:1, WCAG 1.4.11) statt des
   Website-Werts #e5e4e7 (1,2:1) — siehe `.feld__eingabe`. Und die Felder
   bleiben 60 px hoch wie im ganzen Portal. */
.anmeldung__karte {
  width: 100%;
  max-width: 24rem;
  box-sizing: border-box;
  padding: 0;
}

/* Der Satz unter der Ueberschrift — wie `.formularkarte__text`. */
.anmeldung__satz {
  margin-top: var(--abstand-2);
  color: var(--farbe-text);
  font-size: var(--groesse-text);
  line-height: var(--zeilenhoehe-weit);
}

/* Die Fusszeilen unter dem Formular — wie `.formularfuss`: grau, klein,
   der Verweis darin unterstrichen in Tinte. */
.anmeldung__hilfe,
.anmeldung__neu {
  margin-top: var(--abstand-4);
  color: var(--farbe-text-gedaempft);
  font-size: var(--groesse-klein);
  line-height: var(--zeilenhoehe-weit);
}

.anmeldung__neu {
  margin-top: var(--abstand-2);
}

.anmeldung__hilfe a,
.anmeldung__neu a {
  color: var(--farbe-text);
  text-decoration: underline;
  text-underline-offset: 0.2em;
}

/* BESCHRIFTUNG UEBER DEM FELD statt in ihm — wie `.feldgruppe__marke`.
   Das Markup bleibt der Baustein `feld()`: dort steht die Beschriftung
   HINTER dem Eingabefeld, damit sie schweben kann. `column-reverse` stellt
   sie hier nach oben, ohne einen zweiten Baustein. Nur in der Anmeldung:
   im Produkt bleibt die steigende Beschriftung. */
.anmeldung .feld {
  display: flex;
  flex-direction: column-reverse;
  gap: var(--abstand-1);
  min-width: 0;
}

.anmeldung .feld__eingabe ~ .feld__wort,
.anmeldung .feld__eingabe:focus ~ .feld__wort {
  position: static;
  transform: none;
  max-width: none;
  white-space: normal;
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

/* Ohne steigende Beschriftung braucht das Feld oben kein Extrapolster —
   Jitters 16 px ringsum, wie `.antwort__feld`. Weiss wie auf der Website. */
.anmeldung .feld__eingabe {
  padding: var(--abstand-3);
  background: var(--farbe-flaeche);
}

/* Die Marke gross: bei Employment Hero ist sie das erste und
   groesste auf dem Bildschirm. */
.anmeldung .wortmarke {
  justify-content: center;
  /* EINE STUFE UEBER DER UEBERSCHRIFT — 02.08.2026. Beide standen auf
     `--groesse-h3`, also auf demselben Wert: 1,00 : 1. Wenn die Marke den
     Bildschirm tragen soll, muss sie lauter sein als das, was sie
     ankündigt. 30 zu 22 px = 1,36 : 1. */
  font-size: var(--groesse-h2);
}

.anmeldung__titel {
  margin-top: var(--abstand-4);
  /* NICHT 44 px. Employment Hero setzt „Welcome back!" auf rund
     24 px — die Marke darueber traegt den Bildschirm, nicht die
     Ueberschrift. Bei 44 px war die Ueberschrift lauter als die
     Marke und der Bildschirm hatte zwei Anfaenge.
     17.10.2026: SCHWER UND ENG WIE AUF DER WEBSITE (800, -0,044 em,
     dort doppelt so gross wie der Fliesstext — hier 30 zu 17 px). Seit
     oben das EB-Zeichen statt des Schriftzugs steht, traegt die
     Ueberschrift den Namen nicht mehr mit; sie darf lauter sein. */
  font-size: var(--groesse-h2);
  font-weight: var(--schrift-schwer);
  letter-spacing: -0.044em;
  line-height: var(--zeilenhoehe-eng);
}

/* Felder, Knopf und Fehlerzeile in EINER Breite und mittig. Der
   Text darin bleibt linksbuendig — eine zentrierte Beschriftung
   ueber einem Eingabefeld ist an keiner Referenz zu finden. */
.anmeldung__formular {
  display: grid;
  gap: var(--abstand-4);
  /* 17.10.2026: abstand-3 statt -5. Die Meldezeile darunter haelt ohnehin
     zwei Zeilen Platz frei; zusammen standen gemessen rund 95 px zwischen
     Satz und erstem Feld, auf der Website sind es 18. */
  margin-top: var(--abstand-3);
  text-align: left;
}

/* DER KNOPF SO HOCH WIE EIN FELD — 02.08.2026. Gemessen 43,3 zu 60 px =
   72,2 %; das Referenzband liegt bei 100 bis 121 %. Ein Absendeknopf, der
   flacher ist als die Felder darüber, liest sich als Beiwerk — und er ist
   die einzige Handlung des Bildschirms. 59 px = 98,5 % der Feldhöhe. */
.anmeldung__formular .knopf {
  min-height: calc(var(--feld-hoehe) - 1px);
}

/* DIE MELDEZEILE HAT IMMER IHREN PLATZ — 02.08.2026. Gemessen sprang die
   Seite beim Auftauchen der Fehlermeldung um **65,7 px** nach unten: die
   Zeile entstand erst mit dem Fehler und schob alles darunter weg. Wer
   danebengetippt hat, sucht sein Feld an einer neuen Stelle.

   Firecrawl-Muster: ein Anker, zwei Ausprägungen — Fehler und Erfolg
   stehen am selben Ort und sind gleich hoch. Der Platz wird deshalb
   vorgehalten, auch wenn nichts darin steht. */
.anmeldung__meldung {
  min-height: calc(2 * var(--zeilenhoehe-mittel) * var(--groesse-klein));
}

/* ===================================================================
   CODEFELD — SECHS KAESTEN, 19.10.2026
   ===================================================================

   Lennard: „sechs einzelne Felder … sodass es einfach schöner aussieht".
   Vorbild Vercel, Proton, Otter, Cal.com (Mobbin): sechs Kaesten in einer
   Reihe, darunter „Reservecode verwenden". Gilt fuer alle vier Stellen mit
   einem Code der zweiten Stufe: Anmeldung, Einrichten, Abschalten,
   Vertretung im Admin.

   NUR MIT SKRIPT. `bausteine.js` setzt `data-bereit` und haengt Kaesten und
   Umschalter an; ohne Skript greift keine dieser Regeln, und das Feld steht
   da wie jedes andere (`codefeld()` in bausteine.ts).

   EIN FELD. Das `<input>` liegt durchsichtig in derselben Rasterzelle ueber
   den Kaesten und nimmt Tippen, Einfuegen und das Ausfuellen vom Telefon.

   DIE BESCHRIFTUNG STEHT UEBER DEM FELD, auch ausserhalb der Anmeldung — eine
   steigende Beschriftung hat in sechs Kaesten keinen Platz. Im Reservemodus
   bleibt sie dort, damit der Umschalter nichts verschiebt.

   DAS FELD LIEGT UEBER DEM KASTEN, DER ALS NAECHSTES DRAN IST, und wandert
   beim Tippen mit (`--stelle`, gesetzt vom Skript). So traegt das fokussierte
   Element SELBST den Ring — die Regel „EIN TRAEGER" oben gilt auch hier. Die
   erste Fassung lag ueber der ganzen Reihe, nahm dem Feld den Ring und malte
   ihn an den Kasten; die Tastaturmessung der Werkstatt meldete das Feld als
   „kein Fokus sichtbar" (19.10.2026), und sie hatte recht. Der Ring ist der
   von ueberall, nur nach INNEN gesetzt wie an `.suchtreffer__flaeche` —
   aussen, mit Saum, laege er bei 8 px Luecke auf dem Nachbarkasten. */
.feld.codefeld[data-bereit] {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-areas: "wort" "zeile" "weg";
  gap: var(--abstand-2);
  min-width: 0;
}

.feld.codefeld[data-bereit] .codefeld__eingabe ~ .codefeld__wort {
  grid-area: wort;
  position: static;
  transform: none;
  max-width: none;
  white-space: normal;
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
  transition: none;
}

/* Im Reservemodus ein schlichtes Feld wie in der Anmeldung: ohne steigende
   Beschriftung braucht es oben kein Extrapolster.
   OHNE UEBERGANG: das Skript schaltet gleich nach dem Laden auf die Kaesten,
   und mit dem Uebergang von `.feld__eingabe` blendete das Feld sichtbar von
   Weiss auf durchsichtig (gemessen: nach dem Umschalten noch 14 % Deckung). */
.feld.codefeld[data-bereit] .codefeld__eingabe {
  grid-area: zeile;
  padding: var(--abstand-3);
  background: var(--farbe-flaeche);
  transition: none;
}

/* NICHT BREITER ALS 6 x 64 px. In den breiten Kacheln von Konto und Admin
   wuerden die Kaesten sonst zu flachen Balken. In der Anmeldung (24 rem)
   fuellen sie die Breite wie der Knopf darunter. */
.codefeld__kaesten {
  grid-area: zeile;
  display: none;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: var(--abstand-2);
  max-width: calc(6 * 64px + 5 * var(--abstand-2));
  /* Ein Klick auf einen anderen Kasten setzt den Fokus ins Feld
     (`bausteine.js`). */
  cursor: text;
}

.codefeld--kaesten .codefeld__kaesten {
  display: grid;
}

/* Das Feld ueber den Kaesten: da, bedienbar, aber nicht zu sehen. Die Regel
   muss alle Zustaende nennen, sonst malt das Ueberfahren (`.feld__eingabe`)
   oder der allgemeine Fokusring doch einen Rahmen um die Reihe — und sie muss
   SCHWERER sein als die Regel des schlichten Felds oben (weisser Grund), sonst
   deckt das Feld die Kaesten zu. */
/* ABSOLUT IN DER RASTERZELLE und nicht als zweites Kind in derselben Zelle:
   ein Raster-Kind mit `position: absolute` nimmt seine Zelle als Rahmen
   (`.feld` ist `relative`). So liegt es wie Panel und Toast „uebereinander,
   weil es soll" — und die Ueberlappungsmessung (`layoutMessen()`) nimmt
   genau solche Elemente aus. Als gewoehnliches Kind meldete sie es (gemessen
   19.10.2026, `konto.spec.ts`, 100 % waagerecht). Die Hoehe geben die Kaesten.
   BREITE UND LAGE EINES KASTENS, gerechnet wie das Raster der Kaesten: die
   Reihe ist hoechstens 6 x 64 px breit, die Prozente beziehen sich auf die
   Zelle. */
.feld.codefeld--kaesten[data-bereit] .codefeld__eingabe {
  --reihe: min(100%, calc(6 * 64px + 5 * var(--abstand-2)));
  --kasten: calc((var(--reihe) - 5 * var(--abstand-2)) / 6);
  position: absolute;
  top: 0;
  bottom: 0;
  left: calc(var(--stelle, 0) * (var(--kasten) + var(--abstand-2)));
  z-index: 1;
  width: var(--kasten);
  min-width: 0;
  padding: 0;
  border-color: transparent;
  background: transparent;
  box-shadow: none;
  outline: none;
  color: transparent;
  caret-color: transparent;
  cursor: text;
}

/* DIE ZUSTAENDE NEHMEN NUR ZURUECK, was `.feld__eingabe` und der allgemeine
   Ring in ihnen setzen — Rand, Flaeche, Schatten, Ring. KEINE SCHRIFTFARBE:
   die steht oben in der Grundregel, und eine Zustandsregel, die die
   Textfarbe anfasst, meldet `zustandsmatrix.spec.ts` (gemessen 19.10.2026,
   als beides noch in einer Regel stand). */
.feld.codefeld--kaesten[data-bereit] .codefeld__eingabe:is(:hover, :focus, .zeige-ueberfahren) {
  border-color: transparent;
  background: transparent;
  box-shadow: none;
  outline: none;
}

.feld.codefeld--kaesten[data-bereit] .codefeld__eingabe:is(:focus-visible, .zeige-fokus) {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: calc(var(--fokusring) * -1);
  box-shadow: none;
}

.feld.codefeld--kaesten[data-bereit] .codefeld__eingabe::selection {
  background: transparent;
}

/* Kantig, 60 px hoch, Rand wie jedes Feld (3,45:1, WCAG 1.4.11). */
.codefeld__kasten {
  display: grid;
  place-items: center;
  min-width: 0;
  height: var(--feld-hoehe);
  border: var(--randbreite) solid var(--farbe-rand-bedienelement);
  background: var(--farbe-flaeche);
  color: var(--farbe-text);
  font-size: var(--groesse-h3);
  font-weight: var(--schrift-halbfett);
  font-variant-numeric: tabular-nums;
  line-height: 1;
  transition: border-color 350ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

/* Gefuellt in Tinte: man sieht, wie weit man ist. */
.codefeld__kasten:not(:empty) {
  border-color: var(--farbe-primaer);
}

/* Die Schreibmarke im leeren Kasten, der dran ist. Bei reduzierter Bewegung
   steht sie still (Regel am Ende dieses Bereichs). */
.codefeld--kaesten:focus-within .codefeld__kasten--aktiv:empty::after {
  content: "";
  width: 2px;
  height: 1.1em;
  background: var(--farbe-text);
  animation: codefeld-strich 1s steps(1, end) infinite;
}

@keyframes codefeld-strich {
  50% {
    opacity: 0;
  }
}

/* Wie ein Verweis und nicht wie ein Knopf — die eine Handlung des Formulars
   ist der Knopf darunter. Wie `.anmeldung__hilfe a`. Mit dem Polster ist die
   Flaeche 30 px hoch (WCAG 2.5.8 verlangt 24). */
.codefeld__weg {
  grid-area: weg;
  justify-self: start;
  padding: var(--abstand-1) 0;
  border: 0;
  background: none;
  color: var(--farbe-text);
  font: inherit;
  font-size: var(--groesse-klein);
  text-decoration: underline;
  text-underline-offset: 0.2em;
  cursor: pointer;
}

/* --- Bewegung reduzieren ----------------------------------- */

/* Pflicht, keine Option. Steht am Ende, damit es alles Spaetere
   ueberschreibt. */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    /* DIE VERZOEGERUNG MUSS MIT WEG, und das stand bis zum 31.07.2026
       nicht hier. Gefunden beim Bau der Staffel in Bereich 02: die
       Dauer auf null zu setzen reicht NICHT — mit `backwards` steht
       ein Element seine Verzoegerung lang unsichtbar da und springt
       dann schlagartig herein. Beim letzten Element waren das 200 ms.
       Wer Bewegung abgeschaltet hat, saehe damit keine ruhige Seite,
       sondern eine, die in Stufen aufblitzt — das Gegenteil dessen,
       wofuer er die Einstellung gesetzt hat.
       Betrifft auch `.zeile--gestaffelt` im Posteingang (8 x 40 ms);
       dort stand eine eigene Ausnahme weiter unten. Eine Regel je
       Ort ist eine, die beim naechsten Ort fehlt. */
    animation-delay: 0s !important;
    transition-delay: 0s !important;
    scroll-behavior: auto !important;
  }

  /* Ein angehaltener Kringel ist ein halber Ring und sieht nach
     Fehler aus. Wenn er nicht drehen darf, kommt er weg - der
     ladende Zustand traegt seinen Text sowieso mit
     ("Wird gesendet ..."), und der bleibt lesbar. */
  .kringel {
    display: none;
  }
}

/* ===================================================================
   BEREICH 01 · Die Hülle
   ===================================================================

   UMGEBAUT AM 30.07.2026. Die erste Fassung war eine schmale
   DUNKELVIOLETTE Schiene mit weißen Symbolen und dem Wort darunter —
   so, wie Regel 15 (p6) und das Employment-Hero-Bild es zeigen.

   Entscheidung des Auftraggebers: die violette Fläche fällt raus. Die
   Hülle übernimmt den AUFBAU des bestehenden Portals:

     · helle Leiste auf --farbe-flaeche, 1 px Rand rechts
     · Marke oben, dann die fünf Einträge, senkrecht
     · Symbol NEBEN dem Wort, nicht darunter
     · aktiver Punkt als Fläche über die ganze Zeile (Regel 01, a1:
       „aktiver Punkt als volle Fläche markiert")
     · Kopfzeile ohne eigene Farbe, Bedienelemente rechts gruppiert

   AUS DEM ALTBESTAND WANDERT NUR DER AUFBAU MIT, kein einziger Wert.
   Alle Farben, Abstände, Radien und Schriftgrößen kommen aus
   tokens.css. Die helle Leiste braucht dafür keine neue Farbe: sie
   benutzt --farbe-flaeche, --farbe-rand, --farbe-text und
   --farbe-flaeche-gedaempft, die es alle schon gibt.

   ÜBERFAHREN IST EIN KREIS, kein abgerundetes Rechteck — ausdrückliche
   Vorgabe, in der Leiste und bei den Reitern am Handy. Der Kreis sitzt
   hinter dem Symbol; Breite = Höhe, deshalb Kreis und nicht Pille.

   DER HANDSCHUH BESTIMMT DIE MASSE AM HANDY. Was hier steht, folgt der
   Frage: kann der Meister das mit einem Arbeitshandschuh treffen?

     · 60 px Mindesthöhe je Reiter, nicht 44. 44 ist das Minimum für
       einen bloßen Finger.
     · Ein Reiter ist ein Viertel der Breite. Trefferziel ist der ganze
       Reiter, nicht das Symbol.
     · touch-action: manipulation. Ohne das wartet der Browser 300 ms
       auf einen möglichen Doppeltipp.
     · env(safe-area-inset-bottom). Ohne das liegen die Reiter unter dem
       Home-Balken des iPhones.
     · Der aktive Kreis ist größer als das Symbol, und die Kante am
       oberen Rand des Reiters reicht über die ganze Reiterbreite —
       ein behandschuhter Daumen (75 px) kann sie nicht ganz verdecken.
     · Kein Zustand hängt an :hover. Ein Finger schwebt nicht.
   =================================================================== */

.huelle {
  /* DER BEHÄLTER IST EIN EIGENER UMSCHLAG und nicht .rahmen selbst: eine
     Behälterabfrage fragt den nächsten VORFAHREN mit container-type, ein
     Element kann sich nicht selbst abfragen. Stand container-type auf
     .rahmen, griffen alle Regeln für .rahmen nie — die Rasterfelder
     blieben in der Handy-Anordnung und die Leiste landete unten rechts.
     Alle 123 Messungen waren dabei grün. */
  container-type: inline-size;
  container-name: huelle;
}

/* ===================================================================
   DER VERTRETUNGSSTREIFEN — 17.08.2026, Schritt 2 der Planung
   ===================================================================

   WAS ER TRAEGT, steht in `huelle.ts` bei `vertretungsstreifen()`. Hier
   steht, warum er so liegt, wie er liegt.

   `position: fixed` UND NICHT `sticky`, und das ist nicht gefolgert,
   sondern hier im Haus schon gemessen: `container-type: inline-size` an
   `.huelle` faengt ein `fixed`-Kind NICHT ein — die Ueberlagerung des
   Gespraechs steht damit bei y 0 (siehe dort, 10.08.2026). Der Streifen
   liegt im selben Behaelter und verhaelt sich genauso.

   `z-index: 60` UND DAMIT UEBER ALLEM, was die Huelle sonst stapelt:

     40  die Kopfzeile
     44  das Gespraech als Ueberlagerung am Handy
     45  der Schleier der Schublade
     50  die Schublade
     60  dieser Streifen

   Bei allem anderen laesst sich streiten, was oben liegt. Hier nicht: der
   Streifen sagt, in wessen Daten der Mensch gerade schreibt. Nichts im
   Produkt darf ihn verdecken, auch die Navigation nicht.

   ER SCHIEBT DIE KOPFZEILE, STATT SIE ZU UEBERDECKEN. `--hoehe-vertretung`
   geht in `--kopf-luft*` ein (tokens.css); `.kopf` bekommt seinen `top`
   von derselben Variablen. Ueberdecken waere die Loesung, die beim ersten
   schmalen Fenster auffliegt.

   ZWEI HOEHEN, UND BEIDE SIND NACHGEMESSEN UND NICHT GERECHNET — 17.08.2026.
   Die erste Fassung hat sie geschaetzt und lag zweimal daneben:

     geschaetzt   schmal 2 Zeilen = 72 px     weit 1 Zeile = 48 px
     gemessen     schmal 96 px, RAGTE IN      weit 56 px
                  DIE KOPFKARTE (y 87)

   Der schmale Fehler war der Text: „Du siehst <Name> in Vertretung" lief bei
   390 px auf DREI Zeilen. Er hat deshalb eine kuerzere Fassung bekommen
   (`.vertretung__kurz` weiter unten). Der weite Fehler war der KNOPF — er ist
   mit seinem Polster 32 px hoch und damit hoeher als die 24-px-Zeile, an der
   die Rechnung haengen sollte. Beide Hoehen rechnen jetzt mit dem Knopf.

   EINE ZEILE RESERVE AM HANDY, und sie ist Absicht: gerechnet wird mit drei
   Zeilen, gebraucht werden zwei. Ein Betriebsname ist eine Zeichenkette aus
   einem Kundenkonto — „Heizung, Sanitaer und Klimatechnik Brenner GmbH & Co.
   KG" ist keine Erfindung, sondern die Art Name, die es wirklich gibt.

   `min-height` UND NICHT `height`: reicht auch die Reserve nicht, WAECHST der
   Streifen und reicht ein Stueck in die Kopfzeile hinein. Das ist die
   richtige Richtung des Fehlers — die Warnung gewinnt gegen die Navigation,
   nicht umgekehrt. Nachmessen laesst es sich mit
   `npx tsx werkzeuge/vertretung-ansehen.ts`; es meldet die Ueberlappung.

   MEDIENABFRAGE UND KEINE BEHAELTERABFRAGE, obwohl die Huelle sonst mit
   Behaeltern arbeitet: `--hoehe-vertretung` muss auf `:root` umgesetzt
   werden (die Begruendung steht in tokens.css), und dorthin reicht keine
   Abfrage, die an `.huelle` haengt. */
:root:has(.vertretung) {
  /* Zwei Textzeilen (eine gebraucht, eine Reserve), die Zeilenluecke, die
     Knopfzeile darunter und das Polster. */
  --hoehe-vertretung: calc(
    var(--zeile-vertretung) * 2 + var(--abstand-2) + var(--hoehe-vertretung-knopf) +
      var(--abstand-3) * 2
  );
}

@media (min-width: 45rem) {
  :root:has(.vertretung) {
    /* Eine Zeile, alles nebeneinander — der Knopf gibt die Hoehe vor. */
    --hoehe-vertretung: calc(var(--hoehe-vertretung-knopf) + var(--abstand-3) * 2);
  }
}

/* Die beiden Fassungen des Satzes. Die Begruendung, warum beide im Markup
   stehen und die Stilvorlage waehlt, steht bei `vertretungsstreifen()`. */
.vertretung__lang {
  display: none;
}

@media (min-width: 45rem) {
  .vertretung__kurz {
    display: none;
  }

  .vertretung__lang {
    display: inline;
  }
}

.vertretung {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 60;
  min-height: var(--hoehe-vertretung);
  display: flex;
  align-items: center;
  background: var(--farbe-vertretung);
  color: var(--farbe-flaeche);
}

/* SIE FLUCHTET MIT DER INHALTSSPALTE, wie die Kopfzeile auch: der Grund
   laeuft ueber die volle Fensterbreite, der INHALT sitzt auf der
   Arbeitsbreite. `--breite-spalte` und `--rand-seite` werden an `.huelle`
   je Seite gesetzt; der Streifen liegt darin und erbt beide, statt sie
   nachzubilden — dieselbe Ueberlegung wie bei `.kopf__spalte`. */
.vertretung__spalte {
  width: 100%;
  max-width: var(--breite-spalte, var(--breite-arbeit));
  margin: 0 auto;
  padding-block: var(--abstand-3);
  padding-inline: var(--rand-seite);
  display: flex;
  align-items: center;
  /* ZWEI LUECKEN UND NICHT EINE: quer trennt sie Text, Zeit und Knopf, laengs
     nur die zwei Zeilen am Handy. Mit einem gemeinsamen Wert waere die
     Zeilenluecke doppelt so gross wie noetig — und sie geht in die
     reservierte Hoehe ein. */
  column-gap: var(--abstand-4);
  row-gap: var(--abstand-2);
  /* AM HANDY BRICHT DIE ZEILE UM, und das ist nachgemessen: mit Zeit und
     Knopf daneben blieben bei 390 px rund 160 px fuer den Namen, und selbst
     die kurze Fassung lief auf DREI Zeilen — die reservierte Hoehe war damit
     schon im Normalfall aufgebraucht. Ueber die volle Breite braucht sie
     eine. */
  flex-wrap: wrap;
}

/* ===================================================================
   JEDE KLASSE GENAU EINMAL — 17.08.2026, und das ist ein Befund
   ===================================================================

   Hier standen `.vertretung__text` und `.vertretung__zeit` je ZWEIMAL: die
   erste Regel setzte `flex-basis: 100%` und `margin-left: auto` fuer den
   Umbruch am Handy, die zweite `flex: 1` und `margin: 0` fuer alles andere.
   Bei gleicher Spezifitaet gewinnt die spaetere — `flex: 1` ist die
   Kurzform und setzt `flex-basis` auf `0%` zurueck, `margin: 0` loescht das
   `auto`. Der Umbruch fand also nicht statt.

   GEMESSEN, NICHT GEAHNT: der Textkasten war bei 390 px 141 px breit statt
   350, und der Satz lief auf drei Zeilen. Im Bild sah der Streifen dabei
   vollkommen ordentlich aus — er war nur zu hoch, und „zu hoch" erkennt
   das Auge an einem Kasten, den es zum ersten Mal sieht, nicht.

   Es ist dieselbe Falle, die dieses Haus dreimal mit fremden Klassennamen
   hatte (`.antwort`, `.quartal`, `.zeichnung`) — diesmal mit einer eigenen,
   zwanzig Zeilen weiter oben. Also: eine Klasse, eine Regel, und was je
   Breite verschieden ist, steht in der Medienabfrage darunter. */
.vertretung__text {
  flex: 1;
  /* `min-width: 0` IST PFLICHT UND KEIN SCHMUCK. Ein Flex-Kind ist von sich
     aus `min-width: auto` und kann nicht unter seinen Inhalt schrumpfen — ein
     langer Betriebsname ohne Umbruchstelle schoebe damit Zeit und Knopf aus
     dem Fenster. Genau diese Falle steht sechsmal in den Lehren des Hauses. */
  min-width: 0;
  /* `100%` ERZWINGT DEN UMBRUCH am Handy und ueberlaesst ihn nicht dem Zufall
     des Textmasses: der Text nimmt die ganze Zeile, Zeit und Knopf ruecken in
     die naechste. Andernfalls haenge die Zeilenzahl davon ab, wie lang der
     Name gerade ist — und die reservierte Hoehe waere je Kunde eine andere.

     GEGENGEPROBT AM 17.08.2026: auf `0%` gesetzt, und die Messung
     `vertretung.spec.ts` bei 390 px wurde rot. Sie prueft also wirklich, was
     ihr Name sagt — ein erster Anlauf derselben Gegenprobe blieb gruen, weil
     die Ersetzung gar nicht gegriffen hatte. */
  flex-basis: 100%;
  margin: 0;
  font-size: var(--groesse-klein);
  line-height: var(--zeile-vertretung);
  /* Und weil ein Betriebsname auch EIN langes Wort sein kann, an dem es
     nichts zu brechen gibt. */
  overflow-wrap: anywhere;
}

.vertretung__betrieb {
  font-weight: var(--schrift-fett);
}

.vertretung__zeit {
  flex: none;
  /* Zeit und Knopf stehen am rechten Rand ihrer Zeile, unter dem Text. */
  margin: 0 0 0 auto;
  font-size: var(--groesse-klein);
  line-height: var(--zeile-vertretung);
  /* Damit die Zahl beim Herunterzaehlen nicht springt. */
  font-variant-numeric: tabular-nums;
}

/* Ab dem Umbruch der Huelle steht alles nebeneinander in einer Zeile. */
@media (min-width: 45rem) {
  .vertretung__spalte {
    flex-wrap: nowrap;
  }

  .vertretung__text {
    flex-basis: auto;
  }

  .vertretung__zeit {
    margin-left: 0;
  }
}

.vertretung__form {
  flex: none;
  margin: 0;
  display: flex;
}

/* HELLE FLAECHE AUF DUNKLEM GRUND, und der Text darauf traegt die
   Streifenfarbe: 7,40:1. Das ist die Hausregel — dunkle Fuellungen tragen
   Weiss, helle tragen Tinte —, hier auf einen Knopf angewandt, der sich
   von seinem eigenen Grund abheben muss. */
.vertretung__beenden {
  border: 0;
  cursor: pointer;
  padding: var(--abstand-1) var(--abstand-3);
  border-radius: var(--radius-klein);
  background: var(--farbe-flaeche);
  color: var(--farbe-vertretung);
  font-family: inherit;
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  line-height: var(--zeile-vertretung);
}

/* ===================================================================
   DIE HOEHE DER HUELLE — Fundamentaenderung vom 31.07.2026
   ===================================================================

   Vorher stand hier `min-height: 100vh`. Das klingt harmlos und war
   der schwerste Fehler der ganzen Arbeit:

   `min-height` laesst die Rasterzeile mit dem Inhalt wachsen. Damit
   hatte `main.inhalt` KEINE feste Hoehe — und `height: 100%` in einer
   Seite darin loeste sich zu `auto` auf. Die Folge: die Liste des
   Posteingangs hatte NIE einen eigenen Bildlauf. Gemessen auf der
   echten Seite: clientHeight 4960 = scrollHeight 4960, die ganze
   Seite scrollte mit. Genau das, was die zweite tragende Entscheidung
   von Bereich 03 ausschliesst — „Die Liste ist ihr eigener Bildlauf.
   Nur so bleibt die Stelle erhalten."

   Acht Runden lang war das gruen gemessen, weil alle Messungen in der
   Werkstatt liefen und die Werkstattprobe eine FESTE Hoehe hat.

   `100dvh` statt `100vh`: auf dem Handy waechst und schrumpft die
   Browserleiste, und `vh` rechnet mit der GROESSTEN Fensterhoehe.
   Damit waere die Reiterleiste unter dem Rand — bei `dvh` nicht.

   WAS DARAUS FOLGT, und wogegen die Wache steht: eine Seite, die
   laenger ist als die Huelle und keinen eigenen Bildlauf hat, wird ab
   jetzt STILLSCHWEIGEND ABGESCHNITTEN. Deshalb prueft
   `tests/messungen/huelle.spec.ts` beides — abgeschnittenen Inhalt
   und eine Liste, die ihren Bildlauf verloren hat — und zwar auf der
   ECHTEN SEITE.
   =================================================================== */

.rahmen {
  /* `min-height` STATT `height` — Baustelle 0.1, 04.08.2026.
     Das ist genau die Zeile, die der Kommentar darueber als „schwersten
     Fehler der ganzen Arbeit" beschreibt, und sie kommt mit Ansage
     zurueck. Damals war sie ein Fehler, WEIL die Liste des Posteingangs
     ihren eigenen Bildlauf verlor. Der bleibt ihr jetzt ausdruecklich
     erhalten (`.posteingang__zeilen`), und alles andere scrollt als
     Dokument. Die Hoehe stellt nur noch sicher, dass eine kurze Seite
     den Bildschirm fuellt. */
  min-height: 100dvh;
  /* KEIN RASTER MEHR. Jitters Huelle ist keine Rasterflaeche ueber das
     ganze Fenster, sondern eine MITTIGE SPALTE mit einer frei darueber
     liegenden Kopfzeile. Das Raster mit den vier Feldern (kopf/leiste/
     inhalt/reiter) ist damit hinfaellig — es gibt kein Reiterfeld mehr,
     und die Kopfzeile liegt nicht im Fluss. */
  display: flex;
  flex-direction: column;
  /* WEISS, NICHT GEDAEMPFT. [gemessen] Jitters Listenseiten stehen auf
     `#fff`; nur die Einstellungen stehen auf `#f2f1f3` und tragen dort
     weisse Karten mit 20 px Radius. Die Leiste hat keine eigene Flaeche
     mehr, also gaebe ein gedaempfter Grund ihr auch keinen Koerper. */
  background: var(--farbe-flaeche);
}

/* --- Die mittige Spalte ------------------------------------------- */
/*
   DAS IST DAS STUECK, DAS JITTERS HUELLE AUSMACHT und das wir vorher nicht
   hatten: sie ist NICHT randlos. [gemessen] `_container_7fqyt_136`:
   `width: 100%`, `max-width: 860px` ab 1025 px und 1082 px ab 1441,
   `margin: 0 auto`, `gap: 32px` bzw. 100.

   Die Folge ist genau das, was im Auftrag steht: die Leiste sitzt
   EINGERUECKT und nicht buendig. Bei 1440 px beginnt sie bei x = 291 —
   das ist kein Polster, sondern die linke Kante einer mittigen Spalte.

   AM HANDY IST DIE SPALTE VOLL BREIT mit 20 px Polster. [gemessen]
   `padding-inline: 20px` unter 1025 px. Derselbe Wert wie der Abstand der
   Kopfzeile zur Fensterkante, und das ist bei Jitter dieselbe
   Entscheidung. */
.spalte {
  flex: 1;
  min-height: 0;
  width: 100%;
  /* ARBEITSBREITE IST DIE VORGABE — 05.08.2026. Die Lesebreite fordert
     eine Seite an, statt dass jede Seite sie loswerden muss. Begruendung
     und Messung stehen bei den Tokens. */
  max-width: var(--breite-spalte, var(--breite-arbeit));
  margin: 0 auto;
  display: flex;
  gap: var(--luecke-huelle);
  /* DERSELBE WERT WIE AN DER KOPFZEILE, und seit dem 05.08.2026 (Frage 20)
     auch dasselbe TOKEN: `--rand-seite` waechst mit dem Behaelter von 20
     auf 72 px. Vorher standen hier zwei Zahlen, umgeschaltet an der
     Behaelterabfrage weiter unten — die Herleitung steht bei den Tokens. */
  padding-inline: var(--rand-seite);
}

/* DIE ZWEI LESE-SEITEN FORDERN DIE SCHMALERE SPALTE AN.
   ====================================================
   Ueber `:has()` und nicht ueber eine Marke am Koerper: die Unterscheidung
   ist eine Eigenschaft des INHALTS, nicht des Servers, und sie steht damit
   an derselben Stelle wie die Breite selbst. Wer eine dritte Lese-Seite
   baut, traegt sie hier ein — eine Zeile, sichtbar neben ihren Nachbarn,
   statt eines Schalters in einer Route. */
/* HIER STAND `.spalte:has(.ziele, .einstellungen)` und hat nicht gegriffen —
   nachgemessen am 05.08.2026: die Spalte blieb auf Arbeitsbreite. Die
   Ursache ist nicht gesucht worden, weil sie nicht gebraucht wird.

   Die Lesebreite sitzt jetzt am INHALT statt an der Spalte, und das ist die
   bessere Stelle: die Spalte behaelt ihre Kante bei 72 px, der Lesestoff
   endet frueher. Waere die Spalte selbst schmaler und mittig, wanderte die
   linke Kante nach innen — und die eine Kante, um die es in dieser Stufe
   geht, waere auf zwei Seiten eine andere als auf den vier uebrigen. */
.ziele,
.einstellungen {
  max-width: var(--breite-lesen);
}

/* EINE KANTE, NICHT DREI — 05.08.2026.
   ===================================
   Gemessen bei 1440 px lagen drei Kanten uebereinander: 72 px fuer
   Kopfzeile, `main` und Seitentitel, 80 px fuer jeden Abschnitt, 104 px
   fuer den Text darin. Der Seitentitel begann damit 32 px links von allem,
   was unter ihm steht — auf jeder Seite, in jedem Abschnitt.

   Das war der Grund fuer „die Seite hat keine Kante", nicht die Breite.
   Die Breite belegte bei 1440 px 90 % und war nie das Problem.

   Die 8 px kamen aus `max-width: var(--inhalt-breite)` am Abschnitt (1280
   in einer 1296 px breiten Spalte), die 24 px aus seinem Querpolster.
   Beide fallen: der Abschnitt IST jetzt die Spalte.

   Die Vorlage stuetzt das doppelt — bei Jitter tragen die Sektionen weder
   Grund noch Rundung noch Polster; was Flaeche traegt, sind die Kacheln
   darin (`vorlage/jitter/MESSUNG.md`, Sektionsgrammatik). */
.abschnitt {
  max-width: none;
  margin-inline: 0;
  padding-inline: 0;
}

/*
   DIE 240 PX LUFT UEBER ALLEM. [gemessen] `padding-top: 240px` an
   `_scrollAreaContent_` UND `_main_` — derselbe Wert an beiden. Genau
   deshalb fluchten Jitters Gruppenueberschrift und seine Seitentitel.
   Unter 1025 px sind es 140.

   WAS DAS BEI UNS KOSTET, und es ist der Preis dafuer, Jitters Geometrie
   in unsere Huelle zu setzen: bei Jitter scrollt das Dokument, die 240 px
   scrollen also weg. Unsere Huelle ist 100 dvh hoch — hier sind sie
   dauerhaft weg. Bei 900 px Fensterhoehe sind das 27 %. Uebernommen, weil
   der Auftrag "gemessen, nicht angenaehert" lautet; angesehen und gemeldet,
   statt still verkleinert. */
.spalte__leiste,
.spalte__inhalt {
  padding-top: var(--kopf-luft-schmal);
}

.spalte__inhalt {
  flex: 1;
  min-width: 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
}

/* DER SEITENTITEL. Er stand bis zum 03.08.2026 in der Kopfzeile und war
   30 px gross. [gemessen] Bei Jitter ist er das erste Element der
   Inhaltsspalte: 48 px ab 1025, 60 ab 1441 — und 64 DARUNTER. Er ist am
   Handy GROESSER als am Laptop, was gegen jede Gewohnheit geht und
   dreimal nachgemessen ist.

   Er bleibt AUSSERHALB von `main`, damit `.inhalt` seinen Vertrag behaelt:
   ein Kasten mit fester Hoehe, in dem eine Liste ihren eigenen Bildlauf
   hat. `aria-labelledby` haelt die Verbindung. */
/* `.spalte--breit` STAND HIER und ist am 03.08.2026 gefallen, keine sechs
   Stunden nach ihrer Entstehung. Überstimmung 21 gab zweispaltigen
   Bildschirmen eine eigene, breitere Spalte, weil die Blase im Gespräch
   ihre Lesebreite sonst nie erreichte.

   Seit die Seitenwahl oben liegt, gibt es keine zwei Breiten mehr — es
   gibt nur noch eine, und sie ist die volle. Der Posteingang bekommt bei
   1440 px 1296 px statt der 1002, die ihm die Überstimmung zugestanden
   hatte. Das Anliegen ist damit erfüllt und die Ausnahme überflüssig.

   Die Rechnung in tokens.css bleibt als Beleg stehen: sie sagt, wieviel
   eine zweispaltige Ansicht MINDESTENS braucht (1002 px), und das ist
   weiter die Zahl, an der man merkt, wenn die Spalte zu schmal wird. */

.seitentitel {
  margin: 0 0 var(--luft-nach-titel-schmal);
  min-width: 0;
  font-size: var(--groesse-seitentitel-schmal);
  font-weight: var(--schrift-schwer);
  line-height: 1.04;
  /* -0,032 em, ANGESAGT AM 05.08.2026 und aus der Vorlage abgeleitet:
     Jitters h1 traegt -2,4 px auf 80 px (= -0,03 em) und -4,5 px auf
     140 px (= -0,032 em). Die Laufweite haengt bei ihm an der GROESSE,
     nicht am Element — deshalb in em und nicht in px, sonst waere sie bei
     72 px eine andere Enge als bei 96. */
  letter-spacing: -0.032em;
  color: var(--farbe-text);
  hyphens: auto;
}

/* --- Kopfzeile ---------------------------------------------------- */

/*
   SIE LIEGT FEST AM FENSTER UND NICHT IM RASTER. [gemessen] Jitter hat
   dort ZWEI feste Elemente: die Marke links (`left: 72px`) und
   `_rightPart_` rechts (`right: 72px`, `top: 48px`, Hoehe 80, Luecke 15).
   Unter 1025 px sind es 20/20, Hoehe 60, Luecke 18.

   Wir bauen daraus EIN Band ueber die volle Breite mit
   `justify-content: space-between`. Geometrisch ist das dasselbe — die
   linke Kante liegt bei 72, die rechte bei Fensterbreite minus 72 — und es
   spart ein zweites festes Element.

   `pointer-events` ist kein Zierrat: ein festes Band ueber die volle
   Breite faengt sonst Klicks in seinen leeren 800 px ab. Nur die Kinder
   nehmen Eingaben an.

   EINE ABWEICHUNG, gemessen und begradigt: Jitters Marke sitzt bei y=73
   (Mitte 93), sein rechter Teil bei y=48 mit 80 Hoehe (Mitte 88). Die
   beiden fluchten also um 5 px nicht. Wir setzen beide auf dieselbe
   Mittelachse — eine Ungenauigkeit der Vorlage ist kein Mass. */
.kopf {
  position: fixed;
  z-index: 40;
  /* EINE VARIABLE FUER DEN ABSTAND ZUR FENSTERKANTE, seit dem 07.08.2026.
     Sie steht hier, weil ZWEI Dinge sie brauchen: die Zeile selbst und ihr
     Grund, der von der Fensterkante bis zur Unterkante der Zeile reicht.
     Zwei Regeln, die denselben Wert einzeln nachziehen, laufen beim ersten
     Umbruchpunkt auseinander — und genau das ist hier am 06.08.2026
     passiert. */
  /* SEIT MUSTER M HAENGT DIE LEISTE AN DER FENSTERKANTE — 09.08.2026.
     Hier stand `top: var(--kopf-abstand-oben)`, weil ein Band an die Kante
     gehoert und die Leiste darunter anfing. Bei M traegt die KARTE ihren
     Abstand selbst (`--karte-kopf-oben`); der Kopf ist nur der Rahmen um
     sie und faengt bei 0 an. Zwei Abstaende uebereinander waeren derselbe
     doppelt. */
  /* …AUSSER DER VERTRETUNGSSTREIFEN STEHT DA — 17.08.2026.
     `--hoehe-vertretung` ist 0 px, solange keine laeuft; `top: 0px` ist
     `top: 0`, und fuer jeden ohne Vertretung aendert sich damit nichts.
     Laeuft eine, rutscht die Kopfzeile um genau die Streifenhoehe nach
     unten — und weil `--kopf-luft*` dieselbe Variable enthaelt, rutscht
     der Inhalt darunter mit, ohne dass hier eine zweite Zahl steht. */
  top: var(--hoehe-vertretung);
  left: 0;
  right: 0;
  height: var(--hoehe-kopf-schmal);
  /* DIE LEISTE SELBST TRAEGT NICHTS MEHR ALS DEN GRUND — 08.08.2026.
     Hier standen `display: flex`, `justify-content: space-between`, `gap`
     und `padding-inline: var(--rand-kopf)`. Alles vier ist an
     `.kopf__spalte` gewandert; die Herleitung steht dort. */
  background: transparent;
  pointer-events: none;
}

.kopf > * {
  pointer-events: auto;
}

/* ===================================================================
   DIE SPALTE DER KOPFZEILE — DIE ACHSE DER SEITE, 08.08.2026
   ===================================================================

   ANGESAGT: „Der weisse Grund laeuft ueber die volle Fensterbreite, der
   INHALT der Leiste sitzt auf der Inhaltsbreite. Wortmarke buendig mit
   dem Seitentitel darunter, Konto buendig mit der rechten Kante des
   Inhalts."

   DER BEFUND, GERENDERT GEMESSEN AM 08.08.2026 — und er ist deutlicher,
   als er klingt: unsere Inhaltsspalte IST schon Jitters Spalte, auf das
   Pixel.

     Fenster   unser Inhalt        Jitters Inhalt      unsere Kopfzeile
     1920      300 .. 1620 (1320)  300 .. 1620 (1320)  72 .. 1848
     1440      289 .. 1151  (861)  290 .. 1150  (860)  72 .. 1368
      390       20 ..  370  (350)   20 ..  370  (350)  74 ..  370

   Nur die Leiste stand daneben, bei 1920 um 228 px. Zwei Kanten auf
   einem Bildschirm, und die obere ist die auffaelligste Zeile der Seite.

   DIE URSACHE WAR EINE TRENNUNG, DIE ABSICHT WAR. Am 06.08.2026 bekam
   die Kopfzeile ein eigenes Randtoken (`--rand-kopf`, 20 bis 72 px), mit
   dem Satz „sie zwingt der Spalte also nichts mehr auf". Richtig war
   daran, dass die Spalte frei werden sollte — bis dahin deckelte der
   Platzbedarf der Kopfzeile sie bei 1440 px auf 940 statt 860. Falsch
   war die Folge: die Leiste ist dabei von der Seite abgerutscht.

   `--rand-seite` UND NICHT EINE EIGENE ZAHL, und das ist der Punkt: der
   Wert wird auf `.huelle:has(.bento)` neu gesetzt, also je Seite. Die
   Kopfzeile liegt IN dieser Huelle und erbt ihn damit von selbst. Sie
   folgt der Spalte, statt sie nachzubilden — und auf einer Seite ohne
   Bento (der Posteingang zum Beispiel) folgt sie deren engerem Rand
   genauso, ohne dass hier eine zweite Regel dazukommt.

   WAS DAMIT ZURUECKKOMMT, ist der Platzkonflikt von damals, und er ist
   nachgemessen statt aus dem alten Vermerk uebernommen (der rechnete
   noch mit dem Kasten um die Woerter und einer 40 px hohen Wortmarke,
   beides seit dem 08.08.2026 weg). Die Zahlen stehen bei
   `--polster-navi-wort`. */
.kopf__spalte {
  /* SIE LIEGT AUF DER KARTE, NICHT IM KOPF — 09.08.2026, Muster M.
     Hier stand `height: 100%`, also die volle Kopfhoehe. Das setzt den
     Inhalt in die Mitte des Rahmens statt in die Mitte der Karte, und
     das sind bei 1440 px zwanzig Pixel Unterschied.

     GEMESSEN AN JITTER LIVE: seine Handlungspille steht bei y 58..110,
     Mitte 84. Seine Karte steht bei y 39..129, Mitte 84 — dieselbe Zahl.
     Sein Kopf ist 0..129, Mitte 64,5. Der Inhalt folgt der Karte. */
  position: absolute;
  z-index: 1;
  left: 0;
  right: 0;
  top: var(--karte-kopf-oben-schmal);
  height: var(--karte-kopf-hoch-schmal);
  /* ==================================================================
     DIE ACHSE, SO WEIT SIE TRAEGT — und die Zahl, ab der sie es nicht tut
     ==================================================================

     `var(--rand-seite)` allein waere die reine Lehre und sie schneidet
     Woerter ab. GEMESSEN am 08.08.2026, sieben Fensterbreiten, Bedarf
     gegen Innenbreite auf der Inhaltsachse:

       Fenster   innen   Bedarf   fehlt
       1920      1320      972    passt
       1600      1000      972    passt
       1440       861      876      15
       1200       754      866     112
       1024       675      866     191
        800       574      866     292   die Leiste laeuft ueber das
        720       539      866     327   Fenster hinaus

     Der Bedarf ist die Summe der Posten und keine gegriffene Zahl:
     Wortmarke + sechs Woerter + Kontobild + die zwei Luecken. Bei 1440
     sind das 96 + 677 + 64 + 24 + 15. WER EIN SIEBTES WORT IN DIE
     NAVIGATION SETZT, RECHNET IHN NEU — die Zahl steht als Token
     `--bedarf-kopf`, damit sie an einer Stelle steht und gefunden wird.

     WARUM DAS UEBERHAUPT PASSIERT: die Inhaltsspalte der Uebersicht
     nimmt bei 1440 px zweimal 289 px Rand, also 40 % des Fensters. Das
     ist Jitters Mass und es ist abgenommen — nur traegt seine Kopfzeile
     dort vier kurze Woerter und unsere sechs lange.

     JITTERS EIGENE ANWENDUNG MACHT ES NICHT ANDERS, gemessen am
     07.08.2026: ihre Wortmarke steht bei 1920 px auf x 80, ihr Inhalt
     faengt bei x 420 an. NUR seine Werbeseite teilt die Achse — und dort
     ist der Kopfinhalt klein genug.

     ALSO: DIE ACHSE, SO WEIT SIE TRAEGT, und darunter zieht die Leiste
     ein statt abzuschneiden. `min()` nimmt die Achse, solange der Inhalt
     hineinpasst; `max()` haelt sie nie enger als den alten Rand der
     Kopfzeile.

     WAS DAS BEI 1440 PX KOSTET: 282 statt 289 px, also 7 px oder ein
     halbes Prozent der Fensterbreite. Ab rund 1455 px steht sie exakt
     auf der Achse. Das ist der Preis dafuer, dass bei 1200 px kein Wort
     abgeschnitten wird. */
  padding-inline: max(
    var(--rand-kopf),
    min(var(--rand-seite), (100cqw - var(--bedarf-kopf)) / 2)
  );
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--luecke-kopf-schmal);
  /* Ein Flex-Kind kann ohne das nicht unter seinen Inhalt schrumpfen —
     und der Inhalt dieser Zeile ist bei 1440 px knapp. */
  min-width: 0;
}

/* ===================================================================
   SIE KLAPPT WEG UND KOMMT WIEDER — 06.08.2026, angesagt
   ===================================================================

   „Beim Herunterscrollen klappt sie zusammen, beim Hochscrollen wieder
   auf. Den Code dafuer gibt es schon im Repo EB-Software-Website."

   GELESEN UND UEBERNOMMEN aus `EB-Software-Website`, `skripte/kopfzeile.js`
   und `stile/kopfzeile.css` (dort nichts geaendert — an dem Repo
   arbeitet eine andere Instanz). Was von dort kommt:

     Schwelle 100 px   darunter passiert gar nichts. Ohne sie flackert
                       die Zeile beim kleinsten Ruck am Seitenanfang.
     Totband 8 px      Richtungswechsel unter 8 px zaehlen nicht.
                       Das ist der Unterschied zwischen „klappt weg"
                       und „zittert".
     drei Marken       `ist-klebend` (ueber der Schwelle),
                       `ist-verkleinert` (abwaerts), `war-klebend`
                       (aufwaerts). Die dritte ist nicht ueberfluessig:
                       ohne sie waere „noch nie gescrollt" dasselbe wie
                       „gerade hochgescrollt".

   SIE VERSCHWINDET NICHT, SIE WIRD KLEINER — berichtigt am 06.08.2026.
   ==================================================================
   Hier stand `transform: translateY(calc(-100% - var(--kopf-oben)))`:
   die Zeile fuhr beim Herunterscrollen ganz weg. Das war die Mechanik
   der Website ohne ihr Bild.

   NACHGESEHEN, WIE DER EINGEKLAPPTE ZUSTAND DORT AUSSIEHT, gerendert
   bei 1920 und 1440 px: die Website laesst ebenfalls nichts stehen —
   ihre Wortmarke faehrt `translateY(-130px)` weg, der weisse Grund geht
   auf `opacity: 0`, uebrig bleiben ihr Handlungsknopf und der Burger.

   ANGESAGT IST ETWAS ANDERES, und das ist eine Entscheidung und kein
   Nachbau: „Logo bleibt immer sichtbar, Profilbild bleibt immer
   sichtbar, die Leiste wird beim Herunterscrollen zu einer kleineren
   Fassung ihrer selbst."

   DIE KLEINERE FASSUNG MUSSTE NICHT ERFUNDEN WERDEN — es gibt sie
   schon: es sind die Masse, die die Zeile am Handy traegt
   (`--kopf-oben-schmal`, `--hoehe-kopf-schmal`, `--luecke-kopf-schmal`,
   `--kontobild-schmal`). Sie sind gemessen, sie stehen zueinander, und
   die Zeile sieht eingeklappt aus wie sie selbst und nicht wie ein
   dritter Entwurf. Was faellt, ist die Seitenwahl — angesagt sind Logo
   und Profilbild, und am Handy ist die Seitenwahl ohnehin aus.

   DER WEISSE GRUND KOMMT VON DER WEBSITE, und ER ist das Stueck Bild,
   das beim ersten Mal gefehlt hat: ihr weisser Grund — weisse
   Flaeche, feiner Schatten, blendet ein, sobald die Zeile klebt. Solange
   sie ganz wegfuhr, brauchte sie ihn nicht. Jetzt steht sie ueber dem
   Inhalt, und ohne Grund liefe der Text unter der Wortmarke durch.

   OHNE SKRIPT BLEIBT SIE VOLL. Das ist die richtige Richtung des
   Ausfalls. */
.kopf {
  transition:
    top var(--dauer-mittel) var(--kurve),
    height var(--dauer-mittel) var(--kurve);
}

/* ===================================================================
   DER GRUND IST EIN VOLLES BAND BIS AN DIE FENSTERKANTE — 07.08.2026
   ===================================================================

   HIER STAND EINE SCHWEBENDE KARTE, uebernommen aus
   `EB-Software-Website/stile/kopfzeile.css`: schmaler als das Fenster,
   runde Ecken, fuenflagiger Schatten, `opacity: 0` bis aufwaerts
   gescrollt wird. Sie ist am 07.08.2026 gefallen, und sie ist der Grund
   dafuer, dass diese Leiste dreimal falsch aussah:

     die weisse Karte schnitt die Kacheln an   „13. August 2026"
       verschwand zur Haelfte hinter ihrer Unterkante.
     Seiteninhalt lugte OBEN hervor            ein farbiger Streifen der
       Kacheln stand im 48-px-Spalt ueber der Leiste.
     eingeklappt fehlte der Grund ganz         der Navigationskasten
       schwebte frei ueber der violetten Kachel.

   JITTERS EIGENE KOPFLEISTE MACHT DIE ERSTEN BEIDEN AUCH — gerendert
   gemessen am 07.08.2026, Offline-Abzug seiner Startseite, 1920 px:

     Leiste   `position: fixed`, top 0, 129 px hoch, volle Breite,
              Fuellung `rgba(0,0,0,0)` — sie selbst ist DURCHSICHTIG.
     Karte    x 260, y 35, 1400 x 100, Radius 20, Rand unten 1 px
              #F2F1F3, fuenflagiger Schatten.
     Streifen 35 px zwischen Fensterkante und Kartenoberkante.

   Bei scrollY 1800 steht in diesem Streifen sichtbar Seiteninhalt (ein
   gruener Kreis, weisse Kaesten, ein dunkler Kasten), und die Kante der
   Karte schneidet eine blaue Flaeche mitten durch. Das ist dasselbe
   Bild, das beanstandet wurde — bei Jitter.

   WARUM ES DORT NICHT STOERT UND HIER SCHON, und das ist der ganze
   Befund: bei Jitter ist die Seite an dieser Stelle WEISS oder hellgrau.
   Der Streifen zeigt nichts, weil dort nichts ist. Unsere Uebersicht
   traegt randlose Vollton-Kacheln, die genau dort durchlaufen. Die
   Geometrie war richtig kopiert; was nicht mitkopiert werden kann, ist
   die Bedingung, unter der sie traegt.

   ZUM VERGLEICH JITTERS ANWENDUNG (`Drafts`), dieselbe Messung: sie hat
   ueberhaupt keine Leiste. Wortmarke und Profilbild sind zwei einzelne
   `position: fixed`-Stuecke auf weissem Grund, und der Inhalt faengt
   erst bei y = 240 an — er kommt ihnen gar nicht nahe. Auch das ist eine
   Bedingung, die wir nicht haben.

   ALSO JITTERS MASSE UND EIN GRUND, DEN ER NICHT BRAUCHT. Die drei
   Auflagen der Ansage lassen nichts anderes zu: „kein Seiteninhalt
   oberhalb oder hinter der Leiste", „die Leiste hat immer einen Grund,
   auch eingeklappt", „Wortmarke und Profilbild in jedem Zustand
   sichtbar". Ein durchsichtiger Streifen ueber einem Band erfuellt die
   erste nicht, eine Karte mit `opacity: 0` die zweite nicht.

   DER GRUND REICHT DESHALB BIS AN DIE FENSTERKANTE und ueber die volle
   Breite, und er ist IMMER da. Er bleibt ein eigenes Element und wird
   kein `background` an der Leiste: die Leiste selbst faengt bei
   `--kopf-abstand-oben` an, der Grund muss darueber hinaus.

   SEINE KANTE KOMMT ERST, WENN SIE GEBRAUCHT WIRD. Ganz oben ist die
   Leiste nahtlos mit der Seite — kein Strich, kein Schatten, nichts, was
   sie als Rahmen um die Seite lesen liesse (der Befund vom 06.08.2026,
   und er gilt weiter). Sobald etwas darunter durchscrollt, kommen
   Haarstrich und Schatten: dieselben zwei Merkmale, die Jitters Karte
   traegt, nur an einer geraden Kante statt an einer runden. */
.kopf__karte {
  position: absolute;
  z-index: 0;
  /* SIE SITZT AUF DER INHALTSSPALTE PLUS UEBERHANG. `--rand-seite` ist
     derselbe Wert, den `.spalte` liest — die Karte bildet die Achse also
     nicht nach, sie folgt ihr. Der Ueberhang ist der einzige eigene
     Betrag, und er ist gemessen (Jitter live, 09.08.2026). */
  top: var(--karte-kopf-oben-schmal);
  height: var(--karte-kopf-hoch-schmal);
  left: calc(var(--rand-seite) - var(--ueberhang-kopf-schmal));
  right: calc(var(--rand-seite) - var(--ueberhang-kopf-schmal));
  background: var(--farbe-flaeche);
  border-radius: var(--radius-kopf-schmal);
  /* HIER STAND EIN 1-PX-RAND auf `--farbe-rand` — Jitters Karte hat einen
     (`1px #F2F1F3`). Am 09.08.2026 angesagt: „die Border kann leichter /
     weg." Sie ist weg, und die Form traegt jetzt allein der fuenflagige
     Schatten. Genau dafuer stehen seine weichen oberen Lagen da; der
     Vermerk an `--schatten-kopf` sagt es schon: „der Grund hier hat keine
     Kontur an drei Seiten — er traegt seine Form allein ueber den
     Schatten." Das gilt jetzt an allen vieren. */
  box-shadow: var(--schatten-kopf);
  /* DIE KARTE NIMMT KLICKS AN, obwohl die Leiste `pointer-events: none`
     traegt. Ein Kind mit `auto` ist trotzdem greifbar — und das MUSS es
     hier sein: eine undurchsichtige Flaeche, durch die man auf etwas
     klickt, das man nicht sieht, ist schlimmer als eine, die den Klick
     schluckt. */
  pointer-events: auto;
  /* ==================================================================
     DIE DREI ZUSTAENDE — gemessen an jitter.video live, 09.08.2026
     ==================================================================

       oben       `opacity: 0`, um 34,5 px nach oben versetzt
       abwaerts   `opacity: 1`, aber um 140 px hochgefahren — also
                  ausserhalb des Fensters und damit unsichtbar
       aufwaerts  `opacity: 1`, `translateY(0)` — sie steht

     GEMESSEN, NICHT GEDEUTET: bei 1440 px steht die Karte im
     Aufwaerts-Zustand bei y 39..129, im Abwaerts-Zustand bei y −101..−11.
     Jitter faehrt sie mit `transform`, nicht mit `display` — deshalb ist
     sie im Baum immer da und misst sich auch dann, wenn man sie nicht
     sieht. Wer nur `getBoundingClientRect` liest und das Vorzeichen
     uebersieht, haelt sie fuer sichtbar.

     DER ANFANGSZUSTAND IST UNSICHTBAR, und das ist der Punkt, an dem
     diese Vorlage von der bisherigen abweicht: ganz oben hat die Zeile
     KEINEN Grund. Was darunter liegt, steht offen im Bild. */
  opacity: 0;
  transform: translateY(-34.5px);
  transition:
    opacity var(--dauer-mittel) var(--kurve),
    transform var(--dauer-mittel) var(--kurve);
}

/* AUFWAERTS: die Karte steht. Das ist der einzige Zustand, in dem sie
   sichtbar ist. */
.kopf.ist-klebend.war-klebend .kopf__karte {
  opacity: 1;
  transform: translateY(0);
}

/* ABWAERTS: sie faehrt aus dem Bild. `-140px` ist Jitters Wert, gemessen
   an seiner Matrix im Abwaerts-Zustand.

   SIE BLEIBT DABEI DURCHSICHTIG, und das ist eine Abweichung von der
   gemessenen Vorlage mit Grund. Jitter setzt hier `opacity: 1`. Bei ihm
   geht das, weil seine Karte im Anfangszustand schon fast aus dem Bild
   steht; bei uns steht sie bei 1440 px auf y 5 — also MITTEN IM BILD,
   nur durchsichtig.

   MIT `opacity: 1` BLITZT SIE DESHALB AUF: der Uebergang blendet sie ein,
   waehrend sie erst nach oben herausfaehrt, und man sieht sie fuer den
   Bruchteil einer Sekunde ueber dem Inhalt liegen. Das ist das Zucken,
   das am 09.08.2026 beanstandet wurde („oben buggt es ein bisschen").

   `opacity: 0` HIER heisst: sie ist genau in EINEM Zustand sichtbar,
   naemlich aufwaerts. In den anderen beiden ist sie es nicht, und der
   Weg dazwischen zeigt nichts. */
.kopf.ist-klebend.ist-verkleinert .kopf__karte {
  opacity: 0;
  transform: translateY(-140px);
}

/* DER LINKE TEIL FAEHRT MIT — Wortmarke und Seitenwahl. Jitter laesst
   beim Abwaertsrollen nur die Handlung rechts stehen; sein linker Teil
   ist dann aus dem Bild.

   DAS IST DIE AUFLAGE, DIE MIT DER WAHL VON MUSTER M GEFALLEN IST:
   „Wortmarke und Profilbild sind in jedem Zustand sichtbar." Das
   Profilbild bleibt (es steht rechts und faehrt nicht mit), die
   Wortmarke nicht. Vorgelegt und so entschieden.

   DER SCHUBLADENAUSLOESER FAEHRT NICHT MIT, und das ist kein Abweichen
   von der Vorlage, sondern ihre Uebertragung. Bei Jitter faehrt der
   Kasten mit Wortmarke und Navigation weg; sein Burger steht RECHTS und
   bleibt deshalb stehen. Unserer steht LINKS. Wer den ganzen linken Teil
   wegfaehrt, nimmt am Handy den einzigen Weg zur Navigation mit — beim
   Herunterscrollen waere die Seitenwahl dann nicht mehr erreichbar.
   Gemessen und im Bild gesehen, bevor es hier stand.

   Deshalb fahren `.kopf__marke` und `.kopf__navi` einzeln, nicht ihr
   gemeinsamer Kasten. */
.kopf__marke,
.kopf__navi {
  transition: transform var(--dauer-mittel) var(--kurve);
}

.kopf.ist-klebend.ist-verkleinert :is(.kopf__marke, .kopf__navi) {
  transform: translateY(-140px);
}

/* SIE BELEGT DABEI KEINEN PLATZ MEHR — 09.08.2026, gemessen.
   `transform` verschiebt nur das Bild; im Fluss steht die Seitenwahl
   weiter mit ihren 677 px. Solange rechts nur ein 60 px breiter Kreis
   stand, ging das auf. Mit der Pille (150 px) und dem Burger (48 px)
   nicht mehr: bei 1440 px endete der Burger auf x 1204 statt 1158 — er
   stand 46 px ueber der rechten Kante des Inhalts.

   `position: absolute` NIMMT SIE AUS DEM FLUSS, ohne sie aus dem Baum zu
   nehmen. `display: none` waere das naheliegende Mittel und das falsche:
   es beendet die Bewegung sofort, statt sie zu Ende laufen zu lassen. */
.kopf.ist-klebend.ist-verkleinert .kopf__navi {
  position: absolute;
  right: 0;
}

/* DER INHALT LIEGT UEBER DEM GRUND. Ohne `position` haetten die Kinder
   keinen eigenen Stapelplatz und stuenden hinter der Karte. */
.kopf__links,
.kopf__navi,
.kopf__rechts {
  position: relative;
  z-index: 1;
}

/* HIER STAND DIE REGEL, DIE RAND UND SCHATTEN ERST BEI `ist-klebend`
   BRACHTE. Sie ist am 09.08.2026 mit dem Band gefallen: die Karte traegt
   beides immer, weil sie eine Karte ist und keine Kante der Seite. Sie
   ist dafuer die meiste Zeit gar nicht da — siehe die drei Zustaende
   oben bei `.kopf__karte`.

   DIE HOEHE AENDERT SICH BEI M NICHT MEHR. Gemessen an Jitter live:
   sein Kopf ist in allen drei Rollzustaenden 129 px hoch (100 bei 390),
   und die Karte behaelt ihre 90 px. Was sich bewegt, ist die Karte —
   nicht die Zeile, in der sie liegt. Hier stand deshalb ein
   `height: var(--hoehe-kopf-schmal)` fuer den eingeklappten Zustand; es
   hat keinen Leser mehr. */

.kopf__links,
.kopf__rechts {
  display: flex;
  align-items: center;
  gap: var(--luecke-kopf-schmal);
}

/* `min-width: 0` AM LINKEN TEIL, und es ist kein Zierrat — 08.08.2026.
   Ein Flex-Kind ist von sich aus `min-width: auto` und kann deshalb nicht
   unter seinen Inhalt schrumpfen. Ohne diese Zeile schiebt die Zeile bei
   800 px das Kontobild ueber die Fensterkante hinaus (gemessen: 825 px
   Inhalt in 800 px Fenster), und weil `.kopf` am Fenster haengt, meldet
   das keine Wache — genau die fuenfte Erscheinungsform aus PRUEFUNGEN.md.

   MIT DER ZEILE bleibt die Enge dort, wo sie hingehoert: in der
   Seitenwahl. Sie ist damit nicht behoben — bei 800 und 720 px sind die
   sechs Woerter um 86 px zu breit und werden abgeschnitten. Das ist
   VORBESTAND, gegengeprueft am 08.08.2026 mit `git stash`: dieselben
   86 px auch vorher. Was es braucht, ist eine Entscheidung darueber, ab
   welcher Breite die Seitenwahl in die Schublade weicht — die Website
   schaltet ihre bei 1024 px um, unsere Schublade endet bei 720. Das ist
   ein eigener Handgriff und steht im Uebergabepunkt. */
.kopf__links {
  min-width: 0;
}

/* ===================================================================
   DIE SEITENWAHL OBEN — 03.08.2026
   ===================================================================

   Sie ersetzt die Seitenleiste am Laptop. Am Handy bleibt die Schublade:
   sechs Wörter passen dort nicht in eine Zeile.

   ===================================================================
   DER KASTEN IST AM 08.08.2026 GEFALLEN — die Vorlage hat keinen
   ===================================================================

   Angesagt, mehrfach und zuletzt wörtlich: „geh nach
   `F:\Claude\EB-Software-Website`, öffne die Kopfzeilen-Komponente und
   kopier sie."

   HIER STAND EIN GERAHMTER, GERUNDETER KASTEN um die sechs Wörter, mit
   den Maßen von Jitters Werbeseite (`_mainNavBg_`, Radius 10, Höhe 70,
   Rand unten 1 px). GELESEN in `EB-Software-Website/stile/kopfzeile.css`
   und GERENDERT nachgemessen an ihrer `index.html` bei 1920, 1440 und
   390 px — die Website hat diesen Kasten nicht:

     `.nav-link`   `background: none; border: 0; padding: 0`
     `.navigation .nav-link`   `padding: 0 2.4rem` (24 px),
                   bei höchstens 1440 px `0 2rem` (20 px)
     Schrift       16 px / 600, Zeilenhöhe 24 px, Farbe `--farbe-tinte`
     Anordnung     Wortmarke und Wörter in EINEM flex-Kasten
                   (`.kopfzeile__links`), Lücke 40 px, bei höchstens
                   1440 px 24 px

   Gerendert bei 1440: Wortmarke x 290, erstes Wort x 410, alle auf
   Mitte 84. Die Wörter stehen frei nebeneinander und werden nur durch
   ihr eigenes Querpolster getrennt.

   WAS BLEIBT, IST DER AKTIVE VOLLTON. Die Website löst „hier bist du"
   über Deckkraft (`.navigation.ein-punkt-aktiv .nav-punkt:not(.ist-aktiv)
   .nav-link { opacity: .35 }`) — und genau das ist am 04.08.2026
   gefallen, weil ein verblasstes Wort gegen Weiß 1,60:1 hält und
   Fließtext 4,5:1 braucht. Der dunkle Vollton am aktiven Wort ist der
   Ersatz und er bleibt. Er ist auch kein Widerspruch zu „kein Kasten":
   er liegt um EIN Wort, nicht um alle sechs.

   DIE WORTFARBE KOMMT MIT. Hier stand `--farbe-text-gedaempft`; die
   Vorlage setzt `--farbe-tinte`, also volles Schwarzviolett. Damit ist
   das ruhende Wort kräftiger als vorher — und der aktive Vollton bleibt
   trotzdem der stärkere Träger, weil er sich nicht in der Schriftfarbe
   unterscheidet, sondern in der FLÄCHE. */
.kopf__navi {
  /* Am Handy trägt die Schublade die Navigation. Die Website macht es
     genauso: `.navigation { display: none }` bis 1024 px. */
  display: none;
  min-width: 0;
  /* HIER STAND `margin-left: auto` mit der Ansage vom 03.08.2026 „neben
     das Konto, nicht in die Mitte". Sie ist am 08.08.2026 überholt: die
     Seitenwahl steht jetzt IM linken Kasten neben der Wortmarke, so wie
     in der Vorlage. Ein `auto` dort würde sie wieder von ihr wegschieben. */
}

.kopf__navi-liste {
  display: flex;
  align-items: center;
  margin: 0;
  padding: 0;
  list-style: none;
}

.kopf__navi-wort {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: var(--abstand-2);
  /* DIE HÖHE IST DIE DES VOLLTONS, nicht mehr die eines Kastens minus
     seinem Polster. `--hoehe-navi-wort` ist gerechnet: Zeilenhöhe 24 aus
     der Vorlage plus zweimal `--abstand-2`, damit der aktive Vollton
     Luft um die Schrift hat und nicht auf ihr klebt. */
  height: var(--hoehe-navi-wort);
  /* [Website] `0 2rem` = 20 px bei höchstens 1440. Ihr Schritt auf 24 px
     ab 1441 steht im Behälterblock bei 90 rem. */
  padding-inline: var(--polster-navi-wort);
  border-radius: var(--radius-navi-wort);
  color: var(--farbe-text);
  text-decoration: none;
  font-size: var(--groesse-navi-wort);
  font-weight: var(--schrift-halbfett);
  line-height: 24px;
  white-space: nowrap;
}

/* HIER STAND JITTERS ZUSTAND, UND ER IST AM 04.08.2026 GEFALLEN — angesagt.

   Er war herum gebaut: beim Überfahren trat nicht das eigene Wort hervor,
   sondern alles andere zurück, über `opacity: 0.35` an der LISTE statt am
   Wort. Nachgebaut war das richtig; nur ist es nicht lesbar.

   DIE ZAHL, DIE ES ENTSCHIEDEN HAT: Deckkraft 0,35 auf --farbe-text-gedaempft
   ergibt sichtbar rgb(204, 204, 206), und das hält gegen Weiß 1,60:1. Nötig
   sind 4,5:1. Es gibt auch keinen milderen Wert, der beides kann — selbst
   0,8 kommt nur auf 3,39:1, weil die Grundfarbe des ruhenden Wortes schon
   bei 5,07:1 liegt. Der Effekt und die Auflage schließen einander aus, das
   ist keine Abwägung, sondern Arithmetik.

   GENAU DAFÜR STEHT DIE REGEL „kein Zustand über Deckkraft". Sie ist keine
   Stilfrage: `getComputedStyle` liest nach wie vor --farbe-text-gedaempft,
   die Verrechnung mit dem Grund passiert erst beim Zeichnen. Jede
   Kontrastmessung im Haus hätte dieses Wort für in Ordnung gehalten — die
   Wache am Ende der Zustandsmatrix ist die einzige Stelle, die es sehen
   konnte, und sie hat es gesehen.

   WAS AN SEINE STELLE TRITT: nichts. Die aktive Seite ist ein dunkler
   Vollton und sagt damit schon, wo man steht; ein zweiter Zustand, der beim
   Überfahren dasselbe Band umfärbt, wäre eine zweite Auskunft über
   dieselbe Sache. Das ruhende Wort bleibt, wie es ist.

   Der Umbruch steht als überstimmtes Stück in ABDECKUNG.md.

   Mit dem Zustand fällt auch der Übergang: `transition: opacity` oben stand
   für eine Deckkraft, die sich nicht mehr ändert.

   ===================================================================
   DIE EINE AUSNAHME VON DIESER REGEL — 08.08.2026, ausdrücklich erlaubt
   ===================================================================

   Es gibt seit dem 07.08.2026 EINE Stelle im Produkt, an der ein Zustand
   doch über Deckkraft läuft: das Focus-and-Blur im Diagramm der Übersicht
   (`--diagramm-blass`, Zusatzstück `FOKUS` in `diagramm.js`). Sie steht
   hier und nicht nur dort, weil eine Ausnahme, die man nur am Ort der
   Ausnahme findet, keine ist — sie sieht dann aus wie eine übersehene
   Regel.

   WARUM SIE GILT, und es ist nicht die Anmutung. Der Unterschied liegt
   darin, was die verblasste Sache in dem Augenblick noch tragen muss:

     Hier im Kopf sind die fünf anderen Wörter WEITER DIE NAVIGATION. Wer
     das sechste überfährt, will die anderen trotzdem lesen können. Sie
     sind der einzige Träger ihrer eigenen Auskunft.

     Im Diagramm steht, während ein Segment hervorgehoben ist, der Hinweis
     mit ALLEN VIER ZAHLEN offen (`interaction.mode: 'index'`), und die
     Tabelle steht ohnehin im Dokument. Das verblasste Segment ist die
     DRITTE Auskunft über seinen Wert, nicht die einzige.

   UND SIE IST GERECHNET, nicht großzügig ausgelegt: die Deckkraft steht
   auf 0,50, und dort hält die hellste der vier Farben gegen Weiß noch
   1,75:1. Die Grenze liegt bei 0,37; bei 0,36 fällt sie auf 1,49:1. Die
   1,5:1 sind keine neue Schwelle, sondern dieselbe, die die vier
   Kanalfarben paarweise zueinander halten müssen. Jitters 0,35 — der
   Wert, der HIER gefallen ist — hielte im Diagramm 1,47:1 und ist auch
   dort nicht genommen worden.

   WAS DIE REGEL BLEIBT: kein Zustand über Deckkraft, wo die verblasste
   Sache die einzige Auskunft ist. Das ist der Fall bei Text, bei
   Bedienelementen und bei jeder Navigation. Wer eine zweite Ausnahme
   will, zeigt die zweite Auskunft und rechnet die Deckkraft. */

/* DIE AKTIVE SEITE IST EIN DUNKLER VOLLTON — angesagt am 03.08.2026 mit
   Bild („My files" in Jitters Kopf). Vorher stand hier ein Strich
   darunter.

   Der Vollton ist der stärkere Träger: er hebt sich in Farbe UND Fläche
   ab, während ein 2-px-Strich unter einem Wort schon bei Sonnenlicht auf
   dem Tablet verschwindet. `aria-current` bleibt daneben stehen — Farbe
   allein ist keine Auskunft (§Q3.1).

   DIE FARBE IST DUNKEL, NICHT LILA, und das ist eine Unterscheidung, die
   der Kopf braucht: dunkel heißt „hier bist du", lila heißt „das kannst
   du tun". Gäbe es beides in Lila, stünden zwei verschiedene Aussagen in
   derselben Farbe nebeneinander. */
.kopf__navi-wort--aktiv {
  background: var(--farbe-text);
  color: var(--farbe-flaeche);
}

/* HIER STAND DIE GEGENREGEL zum Deckkraft-Zustand: „der aktive Eintrag tritt
   beim Überfahren der Nachbarn NICHT zurück". Sie ist am 04.08.2026 mit dem
   Zustand gefallen, gegen den sie stand.

   Sie hatte `opacity: 1` gesetzt — den Vorgabewert. Ohne die Regel, die etwas
   anderes setzt, ist das eine Anweisung ohne Wirkung. Sie wäre auch keiner
   Wache aufgefallen: die Deckkraft-Regel überspringt den Wert 1 ausdrücklich,
   weil er nichts baut. Eine Regel, die nichts tut, sieht aus wie eine
   Entscheidung — dasselbe wie ein Token ohne Leser und eine Auswahl ohne
   Treffer. */

/* Der Zähler am Posteingang. Er hängt an der Seite und nicht an der
   Bauform der Navigation — ohne ihn wäre die Zahl am Laptop unsichtbar,
   seit die Leiste dort weg ist. */
.kopf__navi-zaehler {
  display: inline-grid;
  place-items: center;
  min-width: 20px;
  height: 20px;
  padding: 0 var(--abstand-1);
  border-radius: var(--radius-rund);
  background: var(--farbe-zaehler);
  color: var(--farbe-zaehler-text);
  font-size: var(--groesse-mikro);
  font-weight: var(--schrift-halbfett);
  line-height: 20px;
}

/* `.kopf__titel` STAND HIER und ist am 03.08.2026 in die Inhaltsspalte
   gewandert — die Regel dafür heißt jetzt `.seitentitel` und steht weiter
   oben. Bei Jitter ist der Titel das erste Element der Inhaltsspalte und
   48 px groß; in der Kopfzeile steht bei ihm nichts als Marke, Knopf und
   Bild. Der Vermerk bleibt, damit niemand ihn „zurückholt", weil die
   Kopfzeile leer aussieht — sie SOLL leer sein.

   Mit ihm sind gefallen: `.kopf__zurueck` (er hing an der Reiterleiste,
   „nur wo unten kein Reiter ist" — die gibt es nicht mehr, und die
   Schublade zeigt auf jeder Seite alle sechs Ziele) und die
   `order`-Umsortierung der Kopfzeile am Handy (sie ordnete drei Dinge, von
   denen zwei weg sind). */

/* --- Die Marke oben links ----------------------------------------- */
/*
   Sie stand bis zum 03.08.2026 in der Leiste. [gemessen] Bei Jitter sitzt
   sie fest am Fenster, 90 x 40 px, auf demselben Abstand zur Kante wie der
   rechte Teil.

   ABWEICHUNG, angemerkt statt übergangen: Jitters Marke liegt IM
   Leistenbehälter und fällt unter 1025 px mit ihm weg. Unsere steht in der
   Kopfzeile und bleibt. Zwei Gründe — die Wortmarke ist ausdrücklich unsere
   und soll nicht verschwinden, und in der Kopfzeile stimmt die
   Tabulatorfolge. Bei Jitter kommt die Marke im Markup NACH den Knöpfen
   rechts. */
/*
   SIE IST AM 07.08.2026 ANS HANDY ZURUECKGEKEHRT — angesagt: „Wortmarke und
   Profilbild sind in jedem Zustand sichtbar."

   HIER STAND `display: none` mit einer Messung, und die Messung stimmte:

     `.kopf` bei 390 px   scrollWidth 477 in clientWidth 390
     links                60 (Auslöser) + 120 (Marke) = 182
     rechts               179 (Knopf) + 18 + 60 (Konto) = 257

   Der Posten, der das Fass zum Überlaufen brachte, war der dunkle Knopf mit
   179 px — und DER IST AM 03.08.2026 GEFALLEN, am selben Tag, an dem diese
   Regel entstand. Die Rechnung ist also seit ihrem zweiten Tag um 197 px zu
   groß (179 Knopf plus 18 Lücke). Nachgerechnet mit dem, was heute dasteht:
   48 Auslöser + 18 + 128 Marke + 18 + 60 Konto = 272 in 350 Innenbreite.

   DAS IST DER FALL, VOR DEM DIE PROJEKTREGEL WARNT: eine Messung bleibt
   stehen, während sich unter ihr etwas ändert. Sie war nie falsch; sie ist
   abgelaufen. Deshalb steht sie hier weiter — mit dem Datum, an dem sie es
   wurde.

   DIE KLEINERE MARKE IST ABGELEITET, nicht gegriffen: Jitter schaltet seine
   Wortmarke von 28 px am Laptop auf 24 am Handy, also mal 0,857. Unsere 40
   werden damit 34; bei 800 × 212 sind das 128 px Breite. */
.kopf__marke {
  display: flex;
  align-items: center;
  gap: var(--abstand-2);
  height: var(--hoehe-marke);
  color: var(--farbe-text);
  text-decoration: none;
}

/* DIE ECHTE WORTMARKE, seit dem 03.08.2026. `.kopf__marke-zeichen` und
   `.kopf__marke-wort` sind gestrichen — das war ein nachgebautes Logo aus
   CSS (violettes Quadrat mit „eb", Name daneben), das niemand entschieden
   hatte.

   DIE HÖHE FÜHRT, DIE BREITE FOLGT. Die Datei ist 800 × 212 px; bei
   `--hoehe-marke` (40) wären das 151 px Breite. Zweizeilig gesetzt ist die
   Marke dafür zu hoch — sie bekommt deshalb die volle Bandhöhe und behält
   ihr Verhältnis über `width: auto`.

   DER GRUNDWERT IST DIE SCHMALE FASSUNG, die große steht im Block ab 45 rem.
   Andersherum ginge es nicht: bei gleicher Spezifität gewinnt die spätere
   Regel, und eine schmale Fassung NACH der großen würde auch am Laptop
   greifen. */
.kopf__marke-bild {
  display: block;
  height: var(--hoehe-marke-schmal);
  width: auto;
  /* Ein Bild ohne diese Zeile bekommt die `width`/`height`-Attribute als
     Maß und wird 800 px breit, bevor das CSS greift. Das ist der Sprung,
     den man beim ersten Laden sieht. */
  max-width: 100%;
}

/* --- Der Auslöser der Schublade ----------------------------------- */
/* Nur unter 45 rem. Darüber markiert die Leiste selbst, wo man ist, und
   ein Auslöser wäre ein Knopf ohne Zweck. */
/* 48 STATT 60 PX, und die Zahl ist gewählt und nicht gemessen: Jitter hat
   diesen Knopf nicht, also gibt es dafür kein Maß. 48 x 48 ist bequem mit
   Handschuh und lässt in der Zeile bei 390 px die Luft, die der dunkle Knopf
   daneben bei +15 % Schrift braucht. Die 44-px-Grenze ist gestrichen; was
   bleibt, ist „bequem bedienbar", und das ist hier nachgerechnet. */
.kopf__schublade {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  width: 48px;
  height: 48px;
  /* HIER STAND `margin-left: calc(var(--abstand-3) * -1)`. Der negative
     Einzug zog ihn an die linke Kante der Spalte, weil er dort stand.
     Seit dem 09.08.2026 steht er rechts aussen; ein Zug nach links waere
     jetzt ein Zug ins Nachbarelement. */
  border-radius: var(--radius-rund);
  /* ER TRAEGT SEINEN GRUND SELBST — 06.08.2026, uebernommen aus
     `EB-Software-Website`:

       .kopfzeile:not(.menue-offen):not(.zeigt-grund) .burger .knopf__innen
         { background-color: var(--farbe-flaeche); }

     Dort ist das keine Zierde, sondern der Grund, aus dem der Burger
     lesbar bleibt: eingeklappt schwebt er ueber dem Inhalt. Nachgesehen
     am eigenen Bildschirm, 390 px, heruntergescrollt: das blanke Zeichen
     stand schwarz auf einer violetten Kachel. Zu erkennen war es — es sah
     nur aus, als waere es dorthin gefallen.

     IMMER UND NICHT NUR OHNE GRUND, und das ist die eine Vereinfachung
     gegenueber der Vorlage: die Website nimmt die Flaeche weg, sobald ihr
     Grund da ist. Bei uns ist dieser Knopf ohnehin nur unter 45 rem zu
     sehen, und ein Knopf, der immer wie einer aussieht, braucht keine
     zweite Regel — die Vorlage haette hier drei Zustaende erzwungen, die
     sich um dieselbe Flaeche streiten.

     UNSER `--farbe-flaeche` IST WEISS, ihres ist das Hellgrau. Was ihrem
     Wert entspricht, heisst bei uns `--farbe-flaeche-gedaempft` — auf
     beiden Seiten #F2F1F3, nachgesehen. */
  background: var(--farbe-flaeche-gedaempft);
  color: var(--farbe-text);
  text-decoration: none;
  transition: background-color var(--dauer-schnell) var(--kurve);
}

.kopf__schublade:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-rand);
}

/* ===================================================================
   EINGEKLAPPT WIRD ER DUNKEL — wie auf der Homepage, 09.08.2026
   ===================================================================

   GELESEN IN `EB-Software-Website/stile/kopfzeile.css`, Zeile 245 ff.,
   und nicht vermutet:

     .kopfzeile.ist-klebend.ist-verkleinert:not(.zeigt-grund) .burger
       { color: var(--farbe-weiss); }
     … .burger svg { fill: var(--farbe-weiss); }
     … .burger .knopf__innen { <dunkle Flaeche> }

   WARUM DORT UND WARUM HIER: eingeklappt faellt der Grund weg, und der
   Knopf steht direkt auf dem Seiteninhalt. Hellgrau auf einer violetten
   oder neongelben Kachel ist eine Flaeche, die niemand als Knopf liest.
   Vollton auf Tinte steht auf jedem Untergrund — es ist dieselbe
   Ueberlegung, die das Kontobild einen Ring bekommen liess, nur mit dem
   Mittel, das die Vorlage dafuer benutzt.

   DIE UMKEHRUNG BEIM UEBERFAHREN IST JITTERS RICHTUNG und steht schon
   beim dunklen Knopf im Haus: dunkel wird HELLER, nicht dunkler. */
.kopf.ist-klebend.ist-verkleinert .kopf__schublade {
  background: var(--farbe-text);
  color: var(--farbe-flaeche);
}

.kopf.ist-klebend.ist-verkleinert .kopf__schublade:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-text-gedaempft);
}

/* --- Der dunkle Knopf --------------------------------------------- */
/*
   [gemessen] `_black_28b1o_731`: Fläche `#19171c`, weiße Schrift, 18 px in
   Gewicht 600, Laufweite -0,04em, Polster 18/60 (schmal 18/30), Höhe fest
   60, RADIUS 0 — und beim Überfahren wird er HELLER (`#2d2933`), nicht
   dunkler. Das ist Jitters Richtung und nicht die gewohnte.

   Seine Farbe ist bei uns `--farbe-text`: einen zweiten Fastschwarz-Wert
   wollte ich für einen Knopf nicht anlegen. 12,63:1 gegen Weiß, in beide
   Richtungen.

   WAS ER KOSTET, und es ist eine Überstimmung: die Vorgabe vom 30.07.2026
   lautet „genau ein gefüllter Knopf je Bildschirm". Jitter hat zwei — den
   schwarzen im Kopf und den farbigen im Inhalt. Mit diesem haben wir sie
   auch. Vermerkt, nicht übergangen. */
.kopf__knopf {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--abstand-2);
  flex: 0 0 auto;
  /* DER FREIRAUM STEHT HIER — angesagt am 03.08.2026 mit Bild. Alles ab
     dem Knopf rückt an die rechte Kante, damit die Seitenwahl direkt
     neben dem Kontobild sitzt. Vorher hing die Marke links und der Rest
     mittig; der Knopf stand ZWISCHEN Seitenwahl und Konto und trennte
     genau die beiden, die zusammengehören. */
  margin-left: auto;
  height: var(--hoehe-knopf-kopf);
  padding-inline: var(--polster-knopf-kopf-schmal);
  /* DERSELBE RADIUS WIE DER KASTEN NEBENAN. Jitters Anwendung setzt hier 0
     (`--radius-navigation`) — dort steht der Knopf aber allein im Band.
     Bei uns steht er neben einem Kasten mit 10 px, und eine scharfe Ecke
     neben einer runden liest sich als Versehen, nicht als Absicht. */
  border-radius: var(--radius-navi);
  /* LILA, NICHT DUNKEL — seit der aktive Eintrag der Seitenwahl ein
     dunkler Vollton ist, stünden sonst zwei schwarze Flächen im selben
     Band und behaupteten dasselbe. Sie behaupten aber Verschiedenes:
     dunkel heißt „hier bist du", lila heißt „das kannst du tun". Jitter
     braucht die Unterscheidung nicht, weil sein Kopf keine aktive Seite
     markiert — bei uns ist immer eine aktiv. */
  background: var(--farbe-primaer);
  color: var(--farbe-primaer-kontrast);
  font-size: var(--groesse-huelle-gross);
  font-weight: var(--schrift-halbfett);
  letter-spacing: var(--laufweite-eng);
  text-decoration: none;
  white-space: nowrap;
  transition: background-color var(--dauer-schnell) var(--kurve);
}

.kopf__knopf:is(:hover, .zeige-ueberfahren) {
  /* Mit der Grundfarbe ist auch der Zustand gewechselt: `--farbe-primaer-tief`
     ist die dunklere Stufe derselben Farbe, `--farbe-knopf-dunkel-ueberfahren`
     wäre die hellere Stufe von Schwarz und damit die falsche Richtung. */
  background: var(--farbe-primaer-tief);
}

/* --- Das Kontobild ------------------------------------------------ */
/*
   [gemessen] Knopf 64 x 64 (schmal 60), Bild 48 x 48 (44), rund, dazu ein
   2 px breiter Ring aus einem Verlauf.

   BEI UNS TRÄGT DER RING DEN ZUSTAND. Jitters Ring ist Zierrat um ein
   Foto; unser Bild ist eine violette Scheibe mit Initialen und braucht
   keine Abgrenzung zur weißen Seite. Er erscheint deshalb erst, wenn das
   Konto etwas zu sagen hat — auf einer der vier Kontoseiten oder bei
   offenem Menü. Damit ist die Konto-Pille ersetzt und nicht nur gestrichen:
   ihre Aufgabe („hier stehe ich") übernimmt der Ring.

   Zwei Ringe, damit der äußere nicht am Bild klebt: erst die Grundfarbe,
   dann die Marke. */
/* ===================================================================
   DER LINK IST NUR NOCH DIE KLICKFLAECHE — 10.08.2026, Neubau
   ===================================================================

   ER TRUG BIS HEUTE EINGEKLAPPT DIE PILLE: Fuellung, Radius, Polster und
   eine Breite, die von `var(--kontoknopf-schmal)` auf `auto` wechselte.
   Damit gab es ZWEI gefuellte Flaechen mit zwei Zeitplaenen — der Kreis am
   Bild, die Pille am Link —, und daraus folgte jedes einzelne Symptom:
   der schwarze Kasten beim Hochscrollen ist diese Flaeche, noch dunkel und
   schon wieder eckig; der Sprung ist der Wechsel von fest nach `auto`, der
   sich nicht ueberblenden laesst.

   JETZT TRAEGT DAS BILD DIE FLAECHE UND ZWAR IMMER. Hier bleibt die
   Klickflaeche, und die ist durchsichtig: sie darf jede Groesse haben,
   ohne dass man etwas sieht.

   `min-width` UND NICHT `width`, damit die eingeklappte Pille sie
   auseinanderschieben kann. Gemessen ist „das Kontobild ist 48 px in
   einem 64er Knopf" — die 64 sind die Fingerflaeche und bleiben die
   Untergrenze, den Rest bestimmt der Inhalt. */
/* DIE HUELLE UM DIE PILLE TUT NICHTS ALS DEN BEZUGSPUNKT SETZEN.
   Sie muss sich in der Kopfzeile genauso verhalten wie die Pille vorher —
   sonst verschiebt ein Bezugspunkt die Zeile, in der er steht. Deshalb
   dieselben drei Angaben, die `.kopf__konto` traegt. */
.kopf__kontobereich {
  position: relative;
  display: inline-flex;
  flex: 0 0 auto;
  min-width: 0;
}

.kopf__konto {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  min-width: var(--kontoknopf-schmal);
  height: var(--kontoknopf-schmal);
  text-decoration: none;
}

.kopf__konto-bild {
  /* `inline-flex` UND NICHT `grid` — berichtigt am 09.08.2026, im Bild
     gefunden. Hier stand `display: grid; place-items: center`, und das
     war richtig, solange genau EIN Textknoten darin stand. Seit das
     Kuerzel in seine Teile zerlegt ist (`M`, `ichael`, Luecke, `B`,
     `renner`), sind es fuenf Kinder — und Grid stapelt sie
     UNTEREINANDER, statt sie in eine Zeile zu setzen.

     Gemessen: die Pille blieb dadurch 80 px breit statt 150, und der
     Name war abgeschnitten. `inline-flex` zentriert genauso und stellt
     die Stuecke nebeneinander. */
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* ================================================================
     DIE BREITE KOMMT IN BEIDEN ZUSTAENDEN AUS DERSELBEN QUELLE
     ================================================================

     10.08.2026, Neubau. Hier stand `width: var(--kontobild-schmal)`, und
     eingeklappt wurde daraus `width: auto`. Zwischen einer festen Breite
     und `auto` gibt es keinen Weg — der Browser springt.

     `min-width` IST DIE FESTE BREITE OHNE DIE OBERGRENZE. Die Breite
     ist in JEDEM Zustand `max(Untergrenze, Inhalt + Polster)`, und beide
     Summanden laufen stetig: der Inhalt ueber die Schranke der
     Buchstaben, das Polster ueber seinen eigenen Uebergang. Das Maximum
     zweier stetiger Groessen ist stetig — deshalb gibt es keinen Sprung
     mehr, in keine der beiden Richtungen.

     Im Grundzustand ist „MB" gemessen 23,7 px breit und das Polster
     null: die Untergrenze gewinnt, und es steht ein Kreis da.
     Eingeklappt gewinnt der Inhalt, und es steht eine Pille da. */
  min-width: var(--kontobild-schmal);
  height: var(--kontobild-schmal);
  /* DAS POLSTER IST IM KREIS NULL und waechst erst mit der Pille. Es
     MUSS null sein: „MB" plus zweimal 16 px waere 55,7 und damit breiter
     als die 48 des Kreises — der Kreis waere ein Ei. */
  padding-inline: 0;
  border-radius: var(--radius-rund);
  /* SCHWARZ STATT LILA — 09.08.2026, angesagt: „kannst die ja schwarz
     lassen, also statt lila schwarz." Hier stand `--farbe-primaer`.

     ES IST DIESELBE FLAECHE IN BEIDEN ZUSTAENDEN. Eingeklappt wird der
     Kreis zur Pille in Tinte; solange er ein Kreis war, war er lila. Der
     Farbwechsel fiel damit mitten in die Bewegung. Jetzt bleibt die Farbe
     stehen und nur die Form aendert sich — das ist der Grund, warum die
     Bewegung jetzt als EINE gelesen wird und nicht als zwei. */
  background: var(--farbe-text);
  color: var(--farbe-flaeche);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  letter-spacing: 0;
  /* ================================================================
     DER UEBERGANG IM GRUNDZUSTAND GILT DEM RUECKWEG
     ================================================================

     Ein Uebergang gehoert immer dem Zustand, IN DEN gewechselt wird. Wer
     aus dem eingeklappten herauskommt, landet hier; der Hinweg steht an
     `.ist-verkleinert`.

     POLSTER UND HOEHE LAUFEN `linear` UND IN DER DAUER DER BUCHSTABEN,
     nicht in der Schwungkurve. Sie sind keine Koerper, die federn — sie
     sind die zweite Haelfte derselben Breite: `min-width` haelt den
     Kreis, das Polster macht die Pille. Liefen sie anders als die
     Schranke der Buchstaben, waeren es wieder zwei Bewegungen.

     Fuellung und Ring behalten ihre kurze Dauer: das ist die Rueckmeldung
     auf den Zeiger und hat mit dem Rollen nichts zu tun. */
  transition:
    padding var(--dauer-kopf-zurueck) linear,
    height var(--dauer-kopf-zurueck) linear,
    box-shadow var(--dauer-schnell) var(--kurve),
    background-color var(--dauer-schnell) var(--kurve);
}

/* ===================================================================
   DAS KONTOBILD BRAUCHT EINEN RING, SOBALD DIE KARTE WEG IST
   ===================================================================

   09.08.2026, im Bild gefunden und nicht in einer Zahl. Mit Muster M
   faehrt die Karte beim Herunterscrollen aus dem Bild, und das Konto
   steht dann direkt auf dem Seiteninhalt. Auf der Uebersicht ist das
   die violette Kachel — und `--farbe-primaer` auf `--farbe-primaer`
   ist nichts. Gemessen bei 1920 und 390: das Kuerzel „MB" stand als
   weisse Schrift frei auf Violett, der Kreis darum war unsichtbar.

   DAS IST KEINE ABWEICHUNG VON DER VORLAGE, SONDERN IHRE UEBERTRAGUNG.
   Jitters stehenbleibendes Stueck traegt seinen Grund selbst: seine
   Pille ist `rgb(25, 23, 28)` im Vollton, sein Burger bei 390 px
   `rgb(242, 241, 243)`. Beide stehen auf jedem Untergrund. Unseres tat
   das, solange ein weisses Band darunter lag; ohne das Band nicht mehr.

   DER RING IST DERSELBE, den das Bild beim Ueberfahren und auf der
   Kontoseite ohnehin traegt — es kommt kein neues Mass dazu, nur ein
   weiterer Zustand, der es liest. Er steht NUR bei `ist-verkleinert`:
   solange die Karte da ist, traegt sie den Kontrast, und ein zweiter
   Ring darauf waere ein Rand ohne Anlass. */
/* HIER STAND DER WEISSE RING. Er war richtig, solange eingeklappt ein
   runder Kreis in `--farbe-primaer` auf dem Seiteninhalt stand und sonst
   nichts — dann trug er den Kontrast. Seit dem 09.08.2026 steht dort eine
   Pille in Tinte, die ihren Kontrast selbst mitbringt, und der Ring lief
   als heller Umriss um sie herum: im Bild ein „komischer Kreis", der
   weder zur Pille noch zum Knopf gehoerte. */

/* ===================================================================
   EINGEKLAPPT WIRD AUS DEM KREIS EINE PILLE MIT DEM NAMEN
   ===================================================================

   09.08.2026. Der Name steht immer im Markup; hier entscheidet sich, ob
   er zu sehen ist. Oben ist er es nicht — dort steht die Seitenwahl
   daneben und der Platz ist knapp.

   DIE PILLE IST SO HOCH WIE DER BURGER, ausdruecklich so entschieden
   („die beiden Punkte sollten gleich gross sein"). Beide 48 px, beide
   auf einer Linie; die Pille ist nur breiter, weil ein Name darin steht.
   Das ist die Bauform der Website: ihre `Demo-Gespraech`-Pille und ihr
   runder Burger haben dieselbe Hoehe und verschiedene Breiten.

   SIE TRAEGT TINTE WIE DER BURGER. Ohne Grund unter der Zeile steht sie
   direkt auf dem Seiteninhalt — dieselbe Ueberlegung, aus der der Burger
   dort dunkel wird. Zwei dunkle Stuecke nebeneinander sind ausserdem
   das Bild aus der Vorlage. */
/* ===================================================================
   DIE RESTLICHEN BUCHSTABEN FAHREN HINTER IHREM ANFANG HERVOR
   ===================================================================

   09.08.2026. Der Name steht EINMAL im Markup, zerlegt in die Teile, die
   bleiben (`M`, `B`), und die, die wachsen (`ichael`, `renner`). Hier
   entscheidet sich, wie breit die wachsenden sind.

   `max-width` UND NICHT `width` ODER `display`: eine Breite von `auto`
   laesst sich nicht ueberblenden, und `display` schaltet hart. `max-width`
   von 0 auf ein Mass, das sicher groesser ist als der Inhalt, faehrt
   dagegen weich auf — der Inhalt bestimmt weiter, wo er endet, die
   Schranke gibt nur den Weg frei.

   DIE SCHRANKE IST KNAPP GEWAEHLT, und das ist gemessen und nicht
   geraten. Sie muss ueber der laengsten Fassung liegen, sonst schneidet
   sie ab — aber jedes Pixel darueber ist Bewegung, die niemand sieht:
   der Rest hat seine Endbreite erreicht, sobald die Schranke sie
   ueberholt, und die restliche Strecke laeuft ins Leere.

   MIT `10em` WAR DIE BEWEGUNG NACH EINEM VIERTEL VORBEI. Gemessen:
   „ichael" ist 43 px breit, „renner" 48; bei einer Schranke von rund
   160 px war der sichtbare Teil nach 27 % der Strecke zu Ende.

   MIT `6em` UND DER SCHWUNGKURVE WAR SIE ES IMMER NOCH — beanstandet am
   09.08.2026: „die Namen sind nicht animiert, ich sehe keine Animation."
   Der Grund steckt in der KURVE, nicht in der Schranke:
   `cubic-bezier(.33, 1.42, .05, .96)` schiesst absichtlich nach vorn und
   ist nach einem Fuenftel der Zeit schon bei rund 80 % ihres Wertes. Fuer
   eine Groesse, die von 0 auf 1 faehrt, ist das der gewollte Schwung —
   fuer eine SCHRANKE, die den Inhalt schon bei der Haelfte freigibt,
   heisst es: nach 150 ms steht alles.

   DESHALB LAUFEN DIE BUCHSTABEN `linear`. Sie sollen gleichmaessig
   hervorkommen, nicht federn; eine Schranke ist kein Koerper, der
   ueberschwingt. Die DAUER bleibt dieselbe wie beim Knopf, damit beide
   zusammen ankommen — angesagt war „waehrenddessen es breiter wird".

   `4em` sind rund 64 px. „renner" ist 48 davon, die sichtbare Bewegung
   laeuft also ueber drei Viertel der Zeit. Ein laengerer Namensteil wird
   frueher fertig, aber nicht abgeschnitten: `max-width` schneidet erst,
   wenn der Inhalt selbst breiter ist, und dafuer braeuchte es rund
   14 Zeichen.

   `overflow: hidden` IST DER GANZE TRICK: ohne ihn stuenden die
   Buchstaben schon da und wuerden nur ueberlappt. Mit ihm kommen sie
   hinter ihrem Anfangsbuchstaben hervor, und genau das war die Ansage. */
.kopf__konto-rest,
.kopf__konto-luecke {
  display: inline-block;
  max-width: 0;
  overflow: hidden;
  vertical-align: bottom;
  /* DAS LEERZEICHEN MUSS STEHENBLEIBEN — 09.08.2026, im Bild gefunden:
     es stand „MichaelBrenner" ohne Luecke. Ein einzelnes Leerzeichen am
     Rand eines `inline-block` faellt der Zusammenfassung von Weissraum
     zum Opfer; `pre` nimmt es davon aus. Es steht an BEIDEN, weil auch
     ein Namensrest mit einem Leerzeichen enden koennte. */
  white-space: pre;
  /* ==================================================================
     BEIDE RICHTUNGEN LAUFEN — 09.08.2026, zurueckgenommen
     ==================================================================

     HIER STAND, DASS DER RUECKWEG INSTANT IST, und dass der Uebergang
     deshalb nur am Ziel steht. Das war eine Ansage („soll instant sein")
     und ist am selben Tag zurueckgenommen worden: „bei Hochscrollen
     nicht einfach wegploppen, sondern es sollte eine Animation geben,
     also doch nicht instant — die Animation einfach rueckwaerts
     abspielen, dann geht die Pille nach rechts und wird kleiner."

     Der Uebergang steht damit wieder im GRUNDZUSTAND, und das laesst ihn
     in beide Richtungen laufen: hin waechst die Pille nach links, zurueck
     schrumpft sie nach rechts.

     DIE DAUER HIER GILT DEM RUECKWEG, die an `.ist-verkleinert` dem
     Hinweg — angesagt: „die Rueckwaerts-Animation von der Schrift ist zu
     langsam." Ein Uebergang gehoert immer dem Zustand, IN DEN gewechselt
     wird; wer aus dem eingeklappten herauskommt, landet hier. */
  transition: max-width var(--dauer-kopf-zurueck) linear;
  /* DIESELBE DAUER UND DIESELBE KURVE WIE DER KNOPF — 09.08.2026.
     Angesagt: „das Profil soll breiter werden, und WAEHRENDDESSEN es
     breiter wird, soll die Schrift kommen." Zwei verschiedene Dauern
     waeren zwei Bewegungen, von denen eine auf die andere wartet.

     Hier stand `--dauer-mittel` (200 ms). Das war „instant" im Sinne der
     Beanstandung: die Buchstaben standen, bevor das Auge der Breite
     folgen konnte. */
}

.kopf.ist-klebend.ist-verkleinert :is(.kopf__konto-rest, .kopf__konto-luecke) {
  max-width: 4em;
  /* Der HINWEG laeuft laenger als der Rueckweg. */
  transition: max-width var(--dauer-kopf-schwung) linear;
}

/* DIE PILLE WAECHST NACH LINKS, weil ihr Kasten rechtsbuendig steht:
   `.kopf__rechts` ist ein Flex-Kasten am rechten Rand, und der Burger
   steht hinter ihr. Was breiter wird, kann nur nach links.

   IHRE BREITE IST NICHT ANIMIERT und muss es nicht sein — sie folgt dem
   Inhalt. Die Bewegung kommt von den Buchstaben und vom Polster; die
   Breite ist ihr Ergebnis. Ein zweiter Uebergang darauf liefe gegen
   denselben Wert und koennte nur nachhinken.

   HIER STAND DIE PILLE SELBST — `width: auto`, Fuellung, Radius und
   Polster am LINK, dazu die Notiz, dass der Sprung von 150 px auf 64
   „der Preis" sei. Er war kein Preis, sondern die Folge zweier Flaechen.
   Die Pille ist am 10.08.2026 eine Ebene tiefer gewandert, an das Bild,
   das die Flaeche ohnehin schon trug. Der Link braucht eingeklappt
   deshalb GAR KEINE Regel mehr; ohne feste Breite gibt es nichts, aus
   dem er herausspringen koennte. */

/* ===================================================================
   EINGEKLAPPT WIRD AUS DEM KREIS DIE PILLE — 10.08.2026, Neubau
   ===================================================================

   Es aendern sich genau drei Dinge, und die Fuellung ist keins davon:

     Polster    0 -> 16 px    macht aus dem Kreis die Pille
     Hoehe      44 -> 48 px   so hoch wie der Burger daneben; ab 62 rem
                              steht die 48 schon im Grundzustand
     Schranke   0 -> 4em      die Buchstaben, Regel weiter oben

   WAS FRUEHER HIER STAND, WAR DAS GEGENTEIL: `background: transparent`
   und `color: inherit`. Das Bild gab seine Flaeche ab, der Link
   uebernahm sie — und GENAU DIESER WECHSEL war der schwarze Kasten. Auf
   dem Rueckweg kam die Fuellung des Bildes augenblicklich zurueck,
   waehrend seine Breite noch von 150 px herunterlief, und dahinter stand
   die Fuellung des Links noch da, schon eckig. Es gibt jetzt nichts mehr
   abzugeben und nichts mehr zurueckzuholen.

   MIT DEM WECHSEL FAELLT AUCH DIE VERZOEGERUNG, die ihn kaschieren
   sollte: eine Fuellung, die 250 ms wartet, ist ein Flicken an einem
   Zustand, den es nicht mehr gibt.

   HIER STAND EINMAL `display: none` an diesem Element — die Umschaltung
   zwischen zwei Elementen, mit der ueberhaupt keine Bewegung zu machen
   war. Das Element bleibt, und sein Inhalt waechst.

   DER HINWEG LAEUFT LAENGER ALS DER RUECKWEG, wie in dieser ganzen
   Bewegung. */
.kopf.ist-klebend.ist-verkleinert .kopf__konto-bild {
  padding-inline: var(--abstand-4);
  height: var(--kontobild);
  transition:
    padding var(--dauer-kopf-schwung) linear,
    height var(--dauer-kopf-schwung) linear,
    box-shadow var(--dauer-schnell) var(--kurve),
    background-color var(--dauer-schnell) var(--kurve);
}

.kopf__konto:is(:hover, .zeige-ueberfahren) .kopf__konto-bild {
  box-shadow:
    0 0 0 var(--ring-kontobild) var(--farbe-flaeche),
    0 0 0 calc(var(--ring-kontobild) * 2) var(--farbe-primaer-sehr-hell);
}

.kopf__konto:is([aria-current='page'], [aria-expanded='true']) .kopf__konto-bild {
  box-shadow:
    0 0 0 var(--ring-kontobild) var(--farbe-flaeche),
    0 0 0 calc(var(--ring-kontobild) * 2) var(--farbe-primaer);
}

/* ===================================================================
   EINGEKLAPPT WIRD DIE PILLE HELLER STATT EINEN RING ZU BEKOMMEN
   ===================================================================

   09.08.2026, beanstandet: „der Hover-Effekt bei dem Namen ist grausam,
   den bitte auch so wie auf der Website."

   DER DOPPELRING WAR FUER EINEN KREIS GEBAUT. Um ein rundes Bild von
   48 px legt er zwei saubere Konturen; um eine 150 px breite Pille legt
   er einen hellen Rahmen, der die Form verdoppelt — und der aeussere
   Ring steht dabei in `--farbe-primaer-sehr-hell` auf einer Tinte-Pille,
   also hell auf dunkel, wo vorher hell auf hell war.

   DIE WEBSITE MACHT ES ANDERS, und es steht schon im Haus: dunkle
   Flaechen werden beim Ueberfahren HELLER, nicht dunkler
   („`_black_28b1o_731` … beim Ueberfahren wird er HELLER (`#2d2933`),
   nicht dunkler. Das ist Jitters Richtung und nicht die gewohnte.").
   Ihr Burger tut dasselbe ueber `background-color`.

   Also traegt die Pille denselben Wechsel wie der Knopf daneben — eine
   Flaeche, zwei Zustaende, kein Ring. Der Ring bleibt fuer den KREIS
   zustaendig, also fuer jeden Zustand ausser diesem.

   DER WECHSEL SITZT SEIT DEM 10.08.2026 AM BILD und nicht mehr am Link:
   der Zeiger steht weiter auf dem Link, gefuellt ist aber das Bild. Eine
   Aufhellung am Link waere jetzt eine Aufhellung an einer durchsichtigen
   Flaeche — zu sehen waere nichts. */
.kopf.ist-klebend.ist-verkleinert .kopf__konto:is(:hover, .zeige-ueberfahren) .kopf__konto-bild {
  /* DERSELBE WERT WIE JEDE ANDERE DUNKLE FLAECHE IM HAUS. Hier stand
     kurz `--farbe-text-gedaempft`; gemessen war das rgb(110, 110, 115),
     also ein mittleres Grau — ein viel zu grosser Sprung. Das Token
     dafuer gibt es laengst und traegt Jitters Mass im Kommentar:
     `#19171c` nach `#2d2933`. */
  background: var(--farbe-knopf-dunkel-ueberfahren);
}

/* Und der Ring faellt dort weg, wo er die Pille umschliessen wuerde —
   auch beim Ueberfahren und auf der Kontoseite. */
.kopf.ist-klebend.ist-verkleinert .kopf__konto .kopf__konto-bild {
  box-shadow: none;
}

/* --- Die Suchzeile ------------------------------------------------ */
/*
   EIN FORMULAR MIT GET, kein aufklappendes Menü und kein Tippen-während-du-
   suchst. Damit hat jede Suche eine Adresse, wie jeder andere Zustand in
   diesem Produkt — man kann sie verschicken, mit dem Zurück-Knopf verlassen
   und als Lesezeichen behalten. Das bleibt.

   WAS SICH ÄNDERT: sie steht ab dem 03.08.2026 OBEN IN DER LEISTE und
   nicht mehr in der Kopfzeile. Genau dort hat Jitter sie auf dem
   Templates-Bildschirm. [gemessen] 240 x 40 px ab 1025 px (darunter 52),
   Radius 999, Fläche `#f2f1f3`, Platzhalter `#6e6e73`, Polster
   `0 8px 0 24px`, danach 38 px bis zum ersten Eintrag (schmal 60).

   DER LINKE EINZUG IST DERSELBE WIE BEI EINEM EINTRAG (24 px). Deshalb
   fluchtet der Platzhalter mit den Symbolen darunter — bei Jitter ebenso.

   DIE GEZEICHNETE LUPE IST WEG. Jitters Suchzeile hat kein Zeichen; das
   Wort im Feld trägt die Aussage. Zwei Regeln CSS und ein `span` weniger. */
/* DIE FLÄCHE LIEGT AM FELD, NICHT AM RAHMEN. Bei Jitter trägt sie das
   `label` außen herum; bei uns das Feld selbst, und der Grund ist Probe 5
   aus PRUEFUNGEN.md: der Fokusindikator muss AN dem Element sitzen, das
   den Fokus bekommt. Ein Ring am Elternteil ist zwar zu sehen, aber jede
   Messung, die das fokussierte Element ausliest, meldet „keiner" — und das
   wäre eine grüne Zahl, die nichts bedeutet. */
.suche {
  display: flex;
  align-items: center;
  width: 100%;
  margin-bottom: var(--luft-nach-suche-schmal);
}

.suche__feld {
  flex: 1 1 auto;
  width: 100%;
  min-width: 0;
  height: var(--hoehe-suchzeile-schmal);
  padding: 0 var(--abstand-2) 0 var(--einzug-navigation);
  border: 0;
  border-radius: var(--radius-rund);
  background: var(--farbe-flaeche-gedaempft);
  color: var(--farbe-text);
  font: inherit;
  font-size: var(--groesse-klein);
  font-weight: 500;
  transition: background-color var(--dauer-schnell) var(--kurve);
}

.suche__feld::placeholder {
  color: var(--farbe-text-gedaempft);
}

.suche__feld:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-rand);
}

.suche__feld:is(:focus-visible, .zeige-fokus) {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: var(--fokusring-abstand);
}

/* --- Die Suchseite ------------------------------------------------- */

.suchseite {
  /* `height: 100%` und `overflow-y: auto` gefallen — Baustelle 0.1. */
  display: flex;
  flex-direction: column;
  gap: var(--abstand-5);
  padding-bottom: var(--abstand-7);
}

/* NOCH NICHTS GEFRAGT — und deshalb ohne Bild. Es ist nichts leer, es ist
   nur nichts gefragt; `leer-suche.svg` gehört dem Fall darunter. Dasselbe
   Bild für zwei verschiedene Lagen wäre eine Lüge über den Zustand. */
.suchseite__frage {
  margin: 0;
  font-size: var(--groesse-h3);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

.suchseite__einordnung {
  margin: 0;
  color: var(--farbe-text-gedaempft);
  max-width: var(--lese-breite);
}

.suchseite__stand {
  margin: 0;
  color: var(--farbe-text-gedaempft);
}

.suchgruppe {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-2);
}

.suchgruppe__kopf {
  display: flex;
  align-items: baseline;
  gap: var(--abstand-2);
}

.suchgruppe__wort {
  margin: 0;
  font-size: var(--groesse-gross);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

/* Die Zahl sagt, wie viele es INSGESAMT sind — nicht, wie viele hier
   stehen. Sonst wäre „alle anzeigen" eine Überraschung. */
.suchgruppe__zahl {
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

.suchliste {
  display: flex;
  flex-direction: column;
  margin: 0;
  padding: 0;
  list-style: none;
  border-radius: var(--radius-standard);
  background: var(--farbe-flaeche);
  overflow: hidden;
}

.suchtreffer + .suchtreffer {
  border-top: var(--randbreite) solid var(--farbe-rand);
}

.suchtreffer__flaeche {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-1);
  min-height: 48px;
  padding: var(--abstand-3) var(--abstand-4);
  color: inherit;
  text-decoration: none;
  transition: background var(--dauer-schnell) var(--kurve);
}

.suchtreffer__flaeche:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-flaeche-gedaempft);
}

.suchtreffer__flaeche:is(:active, .zeige-aktiv) {
  background: var(--farbe-rand);
}

.suchtreffer__flaeche:is(:focus-visible, .zeige-fokus) {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: calc(var(--fokusring) * -1);
}

.suchtreffer__wort {
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
  overflow-wrap: anywhere;
}

.suchtreffer__anriss {
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
  overflow-wrap: anywhere;
}

/* DIE FUNDSTELLE, und nur hier. Auf der Zielseite erklärte sie ein zweites
   Mal, was man schon weiß. Die Markierung trägt Fläche UND Gewicht — eine
   getönte Fläche allein wäre wieder Farbe als einziger Träger. */
.suche__fund {
  background: var(--farbe-primaer-sehr-hell);
  color: var(--farbe-text);
  font-weight: var(--schrift-halbfett);
  border-radius: var(--radius-klein);
}

.suchgruppe__mehr {
  align-self: flex-start;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  color: var(--farbe-text);
  font-weight: var(--schrift-halbfett);
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* HIER STANDEN 160 ZEILEN, DIE MIT DEM NACHBAU GEFALLEN SIND — 03.08.2026.
   Ersatzlos gestrichen und nicht „für später" stehen gelassen: toter Code,
   den keine Messung anfasst, hält der Nächste für gültig.

     `.kopf__zurueck`        Er hing an der Reiterleiste („nur wo unten kein
                             Reiter ist"). Die gibt es nicht mehr, und die
                             Schublade zeigt auf jeder Seite alle sechs
                             Ziele — der Rückweg wäre die zweite Antwort auf
                             eine Frage, die schon beantwortet ist.
     `.kopf__rechts[data-pille]`  Die Konto-Pille. Steht auf der Liste der
                             überstimmten Stücke. Jitters Kopf hat rechts
                             genau zwei Dinge, und keins davon in einer
                             Pille.
     `.kopf__knopf` (Glocke) Jitters Kopf hat keine. Der Weg zu den
                             Benachrichtigungen bleibt: sie sind eine der
                             fünf Zeilen im Konto-Menü. Der Klassenname ist
                             weiterverwendet — er trägt jetzt den dunklen
                             Knopf, siehe oben.
     `.kopf__konto-pfeil`    Das gedrehte Zeichen neben dem Konto. Es war
                             der zweite Träger fürs Aufklappen; den trägt
                             jetzt der Ring um das Bild. */

/* --- Der Betriebs-Umschalter ist gefallen ------------------------- */
/* 03.08.2026. Er steht auf der Liste der überstimmten Stücke, und Jitters
   Leiste hat an seiner Stelle den Betriebswähler, den wir ausdrücklich
   nicht übernehmen („Kein ‚Workspace', keinen Umschalter"). Die 130 Zeilen
   für `.betrieb`, `.betrieb--wahl`, `.betrieb__knopf`, `.betrieb__liste`,
   `.betrieb__zeile` und `.betrieb__haken` sind ersatzlos gestrichen — das
   Markup dazu ebenso.

   WAS BLEIBT: `h.betriebe`. Die Übersicht trägt den Namen als Überschrift
   und die Suche braucht ihn. Ein Feld ohne Anzeige ist kein toter Code,
   solange es woanders gelesen wird. */

/* --- Der schwebende Upload-Knopf ist gefallen -------------------- */
/* 03.08.2026. Er mass gegen die Reiterleiste (`bottom: 100%` im
   `.unterbau`), und die gibt es nicht mehr. Seine Handlung ist nicht
   verloren, sie ist AUFGESTIEGEN: der dunkle Knopf in der Kopfzeile heisst
   „Hochladen" und steht auf jedem der sechs Bildschirme — bei Jitter steht
   dort „My files", ebenfalls die Handlung, die man von ueberall braucht.

   Mit ihm fallen `.upload`, `.upload--schwebend`, `.unterbau` und die
   Klasse `.inhalt--mit-upload` samt ihrem 88-px-Polster. */

/* ===================================================================
   DIE LEISTE
   ===================================================================

   EIN MARKUP FUER BEIDE LAGEN: am Laptop die linke Spalte, am Handy der
   Inhalt der Schublade. Nichts wird doppelt gebaut; was sich unterscheidet,
   unterscheidet diese Datei.

   ALLE ZAHLEN SIND GEMESSEN, keine gegriffen. Sie stehen in tokens.css,
   Bereich 01, jede mit ihrer Herkunft.

   WAS DIE LEISTE NICHT MEHR HAT, und das ist der sichtbarste Teil des
   Nachbaus:

     keine eigene Flaeche   Jitters Leiste ist durchsichtig.
     keinen Rand            Auch keinen Haarrand rechts. Was die Leiste
                            zusammenhaelt, ist die getoente Zeile.
     keinen Kreis           Das Symbol steht blank auf der Zeile.
     keinen Radius          0 px, dreifach nachgemessen.
     keine Profilzeile      Der leise Block unten hat ihren Platz.

   Die drei ersten waren Ansagen vom 30.07. und 02.08.2026. Sie sind mit
   dem Nachbau ueberstimmt; der Vermerk steht in ABDECKUNG.md. */

.leiste {
  display: flex;
  flex-direction: column;
  /* [gemessen] `gap: 2px` an `_sidebarNavItemGroup_1ikh0_134`. Die Zeilen
     stehen fast aneinander — was sie trennt, ist die Toenung. */
  gap: var(--luecke-eintraege);
  width: 100%;
}

/* --- Die Gruppenueberschrift -------------------------------------- */
/*
   [gemessen] `_sectionHeader_127mq_72`: 13 px, Gewicht 600, `#6e6e73`,
   `padding: 7px 0 7px 23px`, Zeilenhoehe 24.

   DIE ZEILENHOEHE IST GERECHNET UND NICHT GESETZT: 38 minus zweimal 7
   ergibt 24. Damit ist der Kasten genau so hoch wie ein Eintrag, und das
   ist bei Jitter kein Zufall — die Ueberschrift steht in derselben Spur wie
   die Zeilen darunter.

   DIE 23 PX LINKS SIND EIN PIXEL WENIGER als der Einzug eines Eintrags.
   Das ist gemessen und kein Tippfehler: die Ueberschrift fluchtet mit dem
   SYMBOL (24 px), nicht mit dem Wort (60 px). */
.leiste__ueberschrift {
  margin: 0;
  padding: var(--polster-ueberschrift) 0 var(--polster-ueberschrift) var(--einzug-ueberschrift);
  font-size: var(--groesse-mikro);
  font-weight: var(--schrift-halbfett);
  line-height: calc(var(--hoehe-eintrag) - var(--polster-ueberschrift) * 2);
  letter-spacing: 0;
  color: var(--farbe-text-gedaempft);
}

.leiste__liste {
  display: flex;
  flex-direction: column;
  gap: var(--luecke-eintraege);
  width: 100%;
  margin: 0;
  padding: 0;
  list-style: none;
}

/* DER LEISE BLOCK STOESST OHNE LUECKE ANEINANDER. [gemessen] Jitters vier
   Zeilen stehen bei y = 618, 650, 682 und 714 — Abstand 32 bei 32 px Hoehe,
   also null. Sein Abstand nach oben ist 44 px (2 + 40er Halter + 2); hier
   sind es 42 plus die 2 px Luecke der Leiste. */
.leiste__liste--leise {
  gap: 0;
  margin-top: calc(var(--luft-block-gross) + var(--luecke-eintraege));
}

/* --- Ein Eintrag -------------------------------------------------- */

.leiste__eintrag {
  display: flex;
  align-items: center;
  gap: var(--luecke-navigation);
  height: var(--hoehe-eintrag-schmal);
  padding: 0 var(--polster-navigation) 0 var(--einzug-navigation);
  border-radius: var(--radius-navigation);
  color: var(--farbe-text);
  text-decoration: none;
  touch-action: manipulation;
  -webkit-tap-highlight-color: transparent;
  user-select: none;
  transition: background-color var(--dauer-schnell) var(--kurve);
}

/* DAS SYMBOL STEHT BLANK. Der Kasten ist nur der Ausrichter und traegt
   keine Flaeche — der Kreis dahinter ist mit dem Nachbau gefallen. Er ist
   `relative`, weil der Zaehler an ihm haengt. */
.leiste__zeichen {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  width: var(--symbol-navigation-schmal);
  height: var(--symbol-navigation-schmal);
  color: var(--farbe-primaer);
}

.leiste__wort {
  min-width: 0;
  font-size: var(--groesse-huelle-gross);
  font-weight: 500;
  /* KEIN nowrap. Jitter setzt hier `white-space: nowrap` mit Ellipse; das
     uebernehmen wir NICHT. „Posteingang" und „Einstellungen" sind genau die
     Woerter, an denen nowrap das Layout sprengt, und bei +15 % Schrift waere
     der halbe Name weg statt umgebrochen. */
  hyphens: auto;
  overflow-wrap: anywhere;
}

/* --- Die Zustaende ------------------------------------------------ */
/*
   [gemessen] mit echtem Ueberfahren, nicht mit geratenen Klassen:

     Ruhe                keine Flaeche
     Ueberfahren         `#7a40ed1a`  (bei uns: Primaerfarbe bei 10 %)
     Aktiv               `#7a40ed1a`  — DIESELBE
     Aktiv + ueberfahren `#7a40ed2e`  (18 %)

   DASS AKTIV UND UEBERFAHREN GLEICH AUSSEHEN, ist gemessen und kein
   Versehen. Der Unterschied liegt bei Jitter nicht im Bild, sondern in der
   Bewegung: erst wenn man den aktiven Eintrag ueberfaehrt, trennt sich das
   Paar. Das ist die schwaechste Stelle der Vorlage, und sie ist hier
   benannt statt stillschweigend nachgebaut. Was den Zustand fuer ein
   Vorleseprogramm traegt, ist `aria-current="page"` — davon haengt nichts
   ab, was man sehen muss. */
.leiste__eintrag:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-navi-flaeche);
}

.leiste__eintrag--aktiv {
  background: var(--farbe-navi-flaeche);
}

.leiste__eintrag--aktiv:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-navi-flaeche-stark);
}

/* GEDRUECKT: eine Stufe tiefer, sofort sichtbar und ohne :hover. Ein
   Finger schwebt nicht. Jitter hat dafuer nichts — er ist ein Werkzeug fuer
   die Maus. Wir behalten es: der Meister tippt mit Handschuh. */
.leiste__eintrag:is(:active, .zeige-aktiv) {
  background: var(--farbe-navi-flaeche-stark);
}

/* --- Der leise Block unten ---------------------------------------- */
/*
   [gemessen] `_subtleSidebarItem_127mq_208`: 32 px hoch ab 1025 (sonst 48),
   Text 13 px, Symbol 16 px im 24er Kasten, Textfarbe `#6e6e73`,
   Symbolfarbe `#97979b`, und KEINE Flaeche in keinem Zustand — auch nicht
   auf der aktuellen Seite. Dort traegt der Eintrag Gewicht 600 und dunklen
   Text.

   Die fuenffach wiederholte Klasse in Jitters CSS ist sein Weg, die
   allgemeine Regel zu ueberschreiben. Bei uns reicht die Verkettung zweier
   Klassen — aber sie MUSS dastehen, sonst gewinnt `--aktiv` von oben und
   der leise Block bekaeme eine Toenung, die er nicht haben darf. */
.leiste__eintrag--leise {
  height: var(--hoehe-eintrag-leise-schmal);
}

.leiste__eintrag--leise,
.leiste__eintrag--leise:is(:hover, .zeige-ueberfahren),
.leiste__eintrag--leise:is(:active, .zeige-aktiv),
.leiste__eintrag--leise.leiste__eintrag--aktiv {
  background: transparent;
}

.leiste__eintrag--leise .leiste__zeichen {
  width: var(--symbol-navigation-schmal);
  color: var(--farbe-text-leise);
}

/* Das Zeichen selbst ist kleiner als sein Kasten — 16 in 24. Der Strich
   wird mitskaliert, sonst wirkt er duenner als bei den Zeilen darueber. */
/* 3,4 UND NICHT 2,7 — nachgezogen am 03.08.2026. Hier stand
   `--symbol-strich-klein`, und das ist der Wert für 20 px; bei 16 px ergibt
   er 1,8 gerenderte Pixel und damit weniger als die 2,25 aus Regel 15.
   Gefunden von `Symbole · Strichstärke gerendert` — der Messung, die genau
   deshalb den gerenderten Wert misst und nicht den im Stylesheet. */
.leiste__eintrag--leise .symbol {
  width: var(--symbol-leise);
  height: var(--symbol-leise);
  stroke-width: var(--symbol-strich-leise);
}

.leiste__eintrag--leise .leiste__wort {
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

.leiste__eintrag--leise:is(:hover, .zeige-ueberfahren) .leiste__wort,
.leiste__eintrag--leise:is(:hover, .zeige-ueberfahren) .leiste__zeichen,
.leiste__eintrag--leise.leiste__eintrag--aktiv .leiste__wort,
.leiste__eintrag--leise.leiste__eintrag--aktiv .leiste__zeichen {
  color: var(--farbe-text);
}

/* Der aktive leise Eintrag traegt ZWEI Traeger, weil er keine Flaeche
   bekommt: dunkler Text und schwereres Wort. Gemessen ist beides. */
.leiste__eintrag--leise.leiste__eintrag--aktiv .leiste__wort {
  font-weight: var(--schrift-halbfett);
}

/* --- Der Zaehler -------------------------------------------------- */
/* Nur am Posteingang. Die ZAHL traegt die Aussage, nicht die Farbe —
   deshalb steht sie auch als Text fuer Vorleseprogramme da. Jitter kennt
   die Bauart (`iconWithBadge` an „Workspace settings"), setzt sie aber
   ohne Zahl. */
.leiste__zaehler {
  position: absolute;
  top: calc(var(--abstand-1) * -1);
  right: calc(var(--abstand-2) * -1);
  min-width: 20px;
  padding: 0 var(--abstand-1);
  border-radius: var(--radius-rund);
  background: var(--farbe-zaehler);
  color: var(--farbe-zaehler-text);
  font-size: var(--groesse-mikro);
  font-weight: var(--schrift-halbfett);
  line-height: 20px;
  text-align: center;
}

/* --- Die Schublade am Handy --------------------------------------- */
/*
   DIE ERSTE DER ZWEI ABWEICHUNGEN VON JITTER, vorgelegt und am 03.08.2026
   angesagt. Jitters Leiste ist unter 1025 px `display: none`, und seine
   Marke liegt IN ihr, faellt also mit weg — uebrig bleiben ein dunkler
   Knopf und das Kontobild. Fuer ihn geht das auf: zwei Hauptseiten, und ein
   Bewegungswerkzeug bedient niemand am Telefon. Bei uns waeren fuenf von
   sechs Seiten unerreichbar.

   SIE IST DIESELBE LEISTE, nicht eine zweite: gleiches Markup, gleiche
   Masse, nur ein anderer Behaelter. Der Zustand steht in der Adresse
   (`?leiste=offen`), nicht im Browser — also ohne Skript bedienbar, mit dem
   Zurueck-Knopf zu verlassen und verschickbar.

   140 PX POLSTER OBEN, derselbe Wert wie an der Spalte: darueber liegt die
   feste Kopfzeile (20 + 60), und die Schublade schiebt sich nicht darunter
   hindurch. */
.spalte__leiste {
  display: none;
  position: fixed;
  z-index: 50;
  top: 0;
  bottom: 0;
  left: 0;
  width: var(--breite-schublade);
  max-width: 85%;
  padding: var(--kopf-luft-schmal) var(--abstand-2) var(--abstand-5);
  background: var(--farbe-flaeche);
  box-shadow: var(--schatten-3);
  overflow-y: auto;
  overscroll-behavior: contain;
}

.rahmen--schublade-offen .spalte__leiste {
  display: block;
}

/* DER SCHLEIER schliesst die Schublade. Ein Verweis auf dieselbe Seite ohne
   die Marke, kein Knopf: damit geht es ohne Skript, und der Zurueck-Knopf
   fuehrt zurueck in die offene Schublade statt auf die vorige Seite. */
/* ER STEHT SEIT DEM 15.08.2026 IMMER IM MARKUP und wird hier ausgeblendet,
   statt nur bei offener Schublade gebaut zu werden — dieselbe Umstellung wie
   beim Kontomenue am 12.08.2026 und aus demselben Grund: was es nur manchmal
   gibt, kann ein Skript nicht umlegen. Der Klick auf den Burger musste
   deshalb `?leiste=offen` laden, und genau das soll weg. */
.rahmen__schleier {
  display: none;
  position: fixed;
  z-index: 45;
  inset: 0;
  background: var(--farbe-schublade-schleier);
}

.rahmen--schublade-offen .rahmen__schleier {
  display: block;
}

/* --- Die Profilzeile am Fuss ist gefallen ------------------------ */
/* 03.08.2026. Jitters Leiste endet mit dem leisen Block, nicht mit einem
   Profil. Wer man ist, sagt das Kontobild oben rechts — und dort steht es
   auf jedem der sechs Bildschirme, statt nur am Laptop unten in der Ecke.
   Die 60 Zeilen fuer `.profilzeile`, `.profilzeile__kuerzel`,
   `.profilzeile__text`, `.profilzeile__name` und `.profilzeile__betrieb`
   sind ersatzlos gestrichen; das Kuerzel wird jetzt aus dem Namen
   gerechnet statt an zwei Stellen hingeschrieben. */

/* --- Die Reiterleiste am Handy ist gefallen ---------------------- */
/* 03.08.2026. Sie steht auf der Liste der ueberstimmten Stuecke, und an
   ihre Stelle tritt die Schublade weiter oben. Gestrichen sind `.unterbau`,
   `.unterleiste`, `.unterleiste__liste`, `.unterleiste__eintrag`,
   `.unterleiste__wort`, `.unterleiste__kreis`, `.unterleiste__zaehler` und
   die 3-px-Kante `.unterleiste__eintrag--aktiv::before`.

   WAS DABEI VERLOREN GEHT, benannt statt verschwiegen: die Reiter waren mit
   dem DAUMEN erreichbar, die Schublade ist es nicht — ihr Ausloeser sitzt
   oben links. Das ist der Preis des Nachbaus, und er ist gemessen: Jitter
   hat am Handy ueberhaupt keine Navigation.

   Was hier stand:

     `.unterbau`      klebte unten und trug den schwebenden Knopf.
     `--hoehe-reiter` 90 px, gerechnet aus Polster, Kreis und zwei
                      Wortzeilen. Das Token faellt mit.
     `--reiter-marke` die 3-px-Kante ueber dem aktiven Reiter, der dritte
                      Traeger neben Kreis und Wortgewicht. Sie war WEGEN
                      DES HANDSCHUHS da: eine 75-px-Fingerscheibe verdeckt
                      den Kreis zu 100 % und das Wort zu 84 %. In der
                      Schublade stellt sich die Frage nicht — dort liegt
                      kein Finger auf dem, was sich aendert. */
/* --- Der Inhalt --------------------------------------------------- */

.inhalt {
  min-width: 0;
  /* BEZUGSRAHMEN FUER DIE UEBERLAGERUNGEN AM HANDY. Sie waren `fixed`
     und damit am Fenster ausgerichtet — also auch hinter der
     Reiterleiste. Gemessen bei 390 px: das Antwortfeld endete 12 px
     darunter, das Gespraech 76 px. Der Meister haette auf die
     Reiterleiste getippt, wo er schreiben wollte. */
  position: relative;
  /* HIER STAND `overflow: hidden` — gefallen mit Baustelle 0.1 am
     04.08.2026. Es war die Grenze, an der eine Seite ihren eigenen
     Bildlauf brauchte. Es gibt sie nicht mehr: der Inhalt darf so lang
     werden, wie er ist, und das Dokument scrollt.

     `min-height: 0` bleibt. Es kostet nichts, seit nichts mehr auf eine
     feste Hoehe drueckt, und haelt die eine Flex-Kette heil, die noch
     einen eigenen Bildlauf traegt (die Nachrichtenliste). */
  min-height: 0;
  display: flex;
  flex-direction: column;
  /* KEIN WAAGERECHTES POLSTER MEHR. Die Kanten der Spalte SIND die Kanten
     des Inhalts — bei Jitter beginnt der Text genau dort, wo die Spalte
     beginnt. Was seitlich Luft haelt, ist die mittige Spalte selbst
     (860 bzw. 1082 px) und am Handy ihre 20 px. */
  padding: 0 0 var(--abstand-5);
  /* WELCHE FARBE UNTER DEN BILDLAUFBEHAELTERN LIEGT — §Q8.
     Die Behaelter darin erben den Wert, statt ihn zu raten. Er ist jetzt
     WEISS und nicht mehr gedaempft: der Grund der Huelle ist weiss, seit
     die Leiste keine eigene Flaeche mehr hat. */
  --grund-darunter: var(--farbe-flaeche);
}

/* `.inhalt--mit-upload` STAND HIER und ist am 03.08.2026 gefallen. Das
   Polster hielt 88 px unter dem Inhalt frei, damit der schwebende
   Upload-Knopf nicht auf der letzten Zeile lag. Beide sind weg — die
   Handlung steht jetzt als dunkler Knopf in der Kopfzeile. */

/* ===================================================================
   Ab 45rem Behälterbreite: die Leiste steht in der Spalte
   ===================================================================

   DIESER UMBRUCH IST DIE ZWEITE DER ZWEI ABWEICHUNGEN VON JITTER —
   vorgelegt und am 03.08.2026 angesagt.

   Jitter schaltet erst bei 1025 px um und deckelt darunter den Inhalt auf
   `max-width: 400px`. Gemessen bei 1024 px sind das 360 px Inhalt mitten in
   einem 1024-px-Fenster, links und rechts je 332 px leeres Weiß. Auf einem
   Tablett oder einem halbbreiten Laptopfenster wäre das ein Handy-Streifen
   in der Mitte.

   Unser Umbruch bleibt deshalb bei 45 rem — dort, wo die 240 px Leiste plus
   32 px Lücke plus eine brauchbare Spalte hineinpassen. Bei 720 px sind das
   448 px Inhalt statt 360.

   ES BLEIBT EINE BEHÄLTERABFRAGE und wird keine `@media`-Abfrage: die
   schmale Probe der Werkstatt ist ein schmaler Behälter in einem breiten
   Fenster. Mit `@media` stünde dort die Kopfzeile des Laptops über der
   Schublade des Handys. */

@container huelle (min-width: 45rem) {
  /* --- Die Kopfzeile rückt auf ihren Abstand ---------------------- */
  /* DAS QUERPOLSTER STEHT HIER SEIT DEM 05.08.2026 NICHT MEHR (Frage 20).
     Es war die zweite von zwei Stufen, 20 und 72; jetzt ist es eine
     Spanne, und `--rand-seite` schaltet sich selbst. Die Zeile hier wuerde
     die Spanne wieder auf ihren oberen Anschlag festnageln — genau der
     Sprung, der bei 1100 px 34 px Inhalt gekostet hat. */
  .kopf {
    height: var(--hoehe-kopf);
  }

  /* Die Luecke steht seit dem 08.08.2026 an der Spalte, nicht an der
     Leiste — die Leiste traegt nur noch die Karte. */
  .kopf__spalte {
    gap: var(--luecke-kopf);
    top: var(--karte-kopf-oben);
    height: var(--karte-kopf-hoch);
  }

  /* DIE GROSSE FASSUNG DER KARTE — Jitters Masse bei 1440 px, live
     gemessen am 09.08.2026: y 39..129, Radius 20, Ueberhang 30. */
  .kopf__karte {
    top: var(--karte-kopf-oben);
    height: var(--karte-kopf-hoch);
    left: calc(var(--rand-seite) - var(--ueberhang-kopf));
    right: calc(var(--rand-seite) - var(--ueberhang-kopf));
    border-radius: var(--radius-kopf);
  }

  /* HIER STAND DIE GROSSE FASSUNG DES KARTEN-GRUNDES (Einzug und Radius).
     Beides ist am 07.08.2026 mit der Karte gefallen — ein Band ueber die
     volle Breite hat keinen Einzug und keine Ecken. Die Herleitung steht
     oben bei `.kopf__grund`.

     GESAMTHOEHE ZUM VERGLEICH, weil sie hier ohnehin zusammenkommt:
     `--kopf-oben` 48 plus `--hoehe-kopf` 80 sind 128 px von der
     Fensterkante bis zur Unterkante der Zeile. Jitters Kopfleiste misst
     gerendert 129. Die Proportion stimmte also schon; was fehlte, war
     die Fuellung dazwischen. */

  /* DIE KLEINERE FASSUNG — am Laptop, wo es eine grosse gibt.
     ========================================================
     Alle vier Werte sind die, die die Zeile am Handy ohnehin traegt.
     Es kommt keine fuenfte Zahl dazu; die Zeile wechselt in ein Mass,
     das schon gemessen ist und in sich stimmt. Der Abstand zur
     Fensterkante faellt dabei ganz weg (`top: 0`, in Bereich 17): eine
     kleine Leiste, die noch 48 px unter der Kante schwebt, sieht aus
     wie eine verrutschte grosse. */
  .kopf.ist-klebend.ist-verkleinert .kopf__spalte {
    gap: var(--luecke-kopf-schmal);
  }

  /* ==================================================================
     DIE SEITENWAHL BLEIBT — 06.08.2026, zweite Ansage
     ==================================================================

     HIER STAND `display: none` an `.kopf__navi`, mit der Ansage vom
     Vormittag: „die Seitenwahl faellt, Logo und Profilbild bleiben."
     Gebaut, angesehen, und der Auftraggeber hat es zurueckgenommen:
     „Eingeklappt steht nur noch Wortmarke links und Profilbild rechts,
     dazwischen eine leere weisse Zeile. Das wirkt nicht reduziert,
     sondern abgeschnitten."

     Er hat recht, und der Fehler war nicht die Regel, sondern was um
     sie herum stehenblieb: mit einer vollen weissen Flaeche dazwischen
     ist eine Zeile mit zwei Dingen darin leer. OHNE die Flaeche ist sie
     eine Zeile mit drei Dingen darin, die jeder fuer sich stehen — und
     genau so sieht die eingeklappte Kopfzeile der Website aus: kein
     Grund, dafuer ein dunkler Knopf und ein dunkler Burger, die ihren
     Grund selbst tragen.

     DIE ZUORDNUNG STEHT IN DER ANSAGE: „Was auf der Website der
     Handlungsknopf ist, ist bei uns das Profilbild; was dort der Burger
     ist, traegt bei uns die eingeklappte Navigation."

     HIER STAND EIN SCHATTEN AN DER SEITENWAHL, mit der Begruendung „ihr
     Kasten ist weiss und traegt eine feine Kontur — auf einer weissen
     Seite ohne Grund darunter ist das zu wenig". Die Begruendung war
     richtig und ihre Voraussetzung ist am 07.08.2026 weggefallen: die
     Leiste hat jetzt IMMER einen Grund, auch eingeklappt. Ein zweiter
     Schatten auf einer Flaeche, die selbst schon einen wirft, waere ein
     Kasten im Kasten. */

  /* EINGEKLAPPT NIMMT SIE DIE KLEINSTE STUFE DER VORLAGE. Hier stand
     `26px` als feste Zahl, begruendet mit „der naechste Schritt, den es
     in der Vorlage wirklich gibt" — damals war der Grundwert 40. Seit dem
     08.08.2026 IST 26 der Grundwert; eine eingeklappte Zeile, die genauso
     gross ist wie die ausgeklappte, klappt nichts ein. Die naechste Stufe
     der Website nach unten ist 24, und die steht als Token da. */
  .kopf.ist-klebend.ist-verkleinert .kopf__marke-bild {
    height: var(--hoehe-marke-schmal);
  }

  /* HIER STANDEN ZWEI REGELN, DIE DEN KNOPF EINGEKLAPPT KLEINER MACHTEN
     (`--kontoknopf-schmal`, `--kontobild-schmal`). Sie stammen aus der
     Zeit, in der die Zeile beim Herunterscrollen zu einer kleineren
     Fassung ihrer selbst wurde. Seit dem 09.08.2026 wird sie das nicht
     mehr: sie faehrt weg, und was bleibt, ist die Pille mit dem
     ausgeschriebenen Namen neben dem Burger.

     SIE HABEN DIE PILLE AUF DIE BREITE DES KREISES ZURUECKGESETZT — bei
     IDENTISCHER Spezifitaet und weiter unten in der Datei, also haben sie
     gewonnen. Gemessen: bei 390 px war die Pille 150 px breit, ab 45 rem
     blieb sie 60, und der Name lief unter den Burger. Genau die Falle aus
     dem Uebergabepunkt: gleiche Spezifitaet, die spaetere Regel gewinnt.

     Die HOEHE steht jetzt an einer Stelle (`--kontobild`, 48 px) und ist
     dieselbe wie die des Burgers — angesagt: „die beiden Punkte sollten
     gleich gross sein." */

  /* [Website] `.kopfzeile__links { gap: 2.4rem }` bei hoechstens 1440 px —
     das ist der Abstand zwischen Wortmarke und erstem Wort. Rechts steht
     bei uns nur das Kontobild; dort bleibt der Wert der Leiste. */
  .kopf__links {
    gap: var(--luecke-marke-navi);
  }

  .kopf__rechts {
    gap: var(--luecke-kopf);
  }

  /* ==================================================================
     DER BURGER IST AM LAPTOP NUR EINGEKLAPPT DA — 09.08.2026
     ==================================================================

     HIER STAND `display: none` ohne Ausnahme, mit dem Satz „ein Ausloeser
     fuer eine Schublade, die man nicht braucht, waere ein Knopf ohne
     Zweck." Der Satz gilt weiter — SOLANGE die Seitenwahl zu sehen ist.

     BEIM HERUNTERSCROLLEN IST SIE ES NICHT MEHR: sie faehrt mit der
     Wortmarke aus dem Bild. Ab da braucht man ihn, und ab da zeigt ihn
     auch die Website. Gelesen in `stile/kopfzeile.css`, Zeile 165 ff.:
     sie blendet `.wortmarke` und jede `.nav-link` aus, setzt die
     Navigation auf `pointer-events: none` und faehrt Pille und Burger
     nach rechts zusammen.

     Angesagt am 09.08.2026: „noch mehr stylen wie auf der Homepage, also
     mit den drei Strichen etc., bei runterscrollen." */
  /* HIER STAND `display: none`. Es ist am 09.08.2026 gefallen: was nicht
     im Baum steht, kann nicht hinter der Pille hervorkommen. Der Knopf
     ist stattdessen auf Breite Null zusammengeschoben — unten steht, wie.

     `pointer-events: none` GEHOERT DAZU. Ein Element mit `opacity: 0` und
     `width: 0` ist unsichtbar, aber nicht unantastbar; ohne diese Zeile
     faengt es Klicks, die dem Konto daneben gelten. */
  .kopf__schublade {
    pointer-events: none;
  }

  .kopf.ist-klebend.ist-verkleinert .kopf__schublade {
    pointer-events: auto;
  }

  /* ER ERSCHEINT MIT EINER BEWEGUNG, nicht auf einen Schlag — 09.08.2026.
     Angesagt: „aktuell ist es ja ohne Animation, aber es sollte…" — und
     die Vorlage hat genau dafuer eine eigene, gelesen in
     `EB-Software-Website/stile/kopfzeile.css`, Zeile 254 ff.:

       animation: var(--dauer-8) var(--kurve-schwung) forwards
                  burger-erscheint;
       @keyframes burger-erscheint { 0% { transform: scale(0) }
                                     to { transform: scale(1) } }

     WARUM EINE ANIMATION UND KEIN UEBERGANG: `display` laesst sich nicht
     ueberblenden. Der Knopf ist vorher gar nicht da; ein `transition`
     haette nichts, wovon aus er faehrt. Die Animation laeuft ab, sobald
     er erscheint, und `forwards` haelt den Endwert. */
  /* ER KOMMT HINTER DER PILLE HERVOR — 09.08.2026, angesagt: „aus der
     schwarzen Pille kommt dann rechts diese drei Striche raus."

     HIER STAND `display: none` UND EINE ANIMATION. Beides ist gefallen,
     und der Grund ist derselbe wie beim Kuerzel: was nicht da ist, kann
     nicht hervorkommen. Der Knopf steht jetzt immer im Baum und ist oben
     nur auf Breite Null zusammengeschoben.

       Breite 0 + hinter der Pille (`translateX`)   oben
       volle Breite + an seinem Platz               eingeklappt

     `overflow: hidden` SCHNEIDET IHN AN SEINER EIGENEN KANTE ab, solange
     er zusammengeschoben ist — sonst stuenden die drei Striche schon da
     und ragten aus einem null Pixel breiten Kasten heraus.

     DIE VORLAGE MACHT ES ANDERSHERUM UND MEINT DASSELBE: sie laesst den
     Burger stehen und schiebt die Pille auf ihn zu
     (`.vor-burger { transform: translate(-6.7rem) }`). Bei ihr ist der
     Burger immer sichtbar, bei uns nicht — also bewegt sich hier der,
     der dazukommt. Das Bild ist am Ende gleich. */
  /* ==================================================================
     DIE MECHANIK IST DIE DER WEBSITE, Zeile fuer Zeile nachgelesen
     ==================================================================

     `stile/kopfzeile.css`, ab Zeile 219 — und das ist der Kern, den zwei
     Anlaeufe verfehlt haben:

       .burger-huelle { right: 0; }
       @media (width >= 1025px) {
         .burger-huelle {
           margin-left: -2.5rem;
           position: absolute;
           transform: translateY(-50%) scale(0);
         }
       }
       .kopfzeile.ist-klebend.ist-verkleinert .burger-huelle {
         transform: translateY(-50%) scale(1) !important;
       }
       .kopfzeile.ist-klebend.ist-verkleinert .vor-burger {
         transform: translate(-6.7rem);
       }

     ER FAEHRT NICHT VON RECHTS EIN — er liegt die ganze Zeit UNTER der
     Pille und waechst aus `scale(0)` auf, waehrend die Pille nach LINKS
     wegrueckt und ihn freigibt. Genau daher kommt der Eindruck, den die
     Ansage beschreibt: „die kommt so ein bisschen von links aus der
     Bubble raus."

     Am 09.08.2026 stand hier eine Fassung, die ihn von RECHTS
     hereinschob. Sie war messtechnisch in Ordnung und im Bild falsch.

     `position: absolute` HAT EINE ZWEITE WIRKUNG, die hier gebraucht
     wird: er belegt keinen Platz. Solange die Zeile offen ist, steht die
     Pille deshalb ganz rechts an der Kante des Inhalts — und nicht um
     eine Burgerbreite davor. */
  .kopf__schublade {
    position: absolute;
    right: 0;
    /* HIER STAND `margin-right: -25px`, als Uebertragung von
       `margin-left: -2.5rem` der Vorlage. Gemessen war das falsch: bei
       `right: 0` verankert `margin-right` die rechte Kante, und der Knopf
       stand auf x 1645 statt 1620 — 25 px ueber der Kante des Inhalts.

       IN DER VORLAGE STEHT `margin-left`, und dort hat es bei fester
       Breite und `right: 0` gar keine Positionswirkung; es faellt ins
       Leere. Was den Eindruck macht, ist nicht dieses Mass, sondern das
       Wegruecken der Pille. Also kommt hier keins. */
    transform: scale(0);
    /* ER WAECHST VON LINKS, nicht aus seiner Mitte — 09.08.2026,
       angesagt: „der Dot sollte eher so von links kommen."

       `scale(0)` schrumpft ohne diese Zeile auf den MITTELPUNKT, und der
       liegt schon an seiner Endstelle: der Knopf erscheint dann dort, wo
       er auch bleibt, und waechst nach beiden Seiten. Mit dem Ursprung
       an der linken Kante faengt er an der Pille an und waechst nach
       rechts von ihr weg — er kommt aus ihr heraus, statt neben ihr
       aufzugehen. */
    transform-origin: left center;
    /* .8s UND NICHT .35s — der Knopf behaelt die Dauer der Vorlage,
       waehrend die Schrift schneller laeuft. Die Herleitung steht am
       Token.

       IM GRUNDZUSTAND UND NICHT AM ZIEL, damit er auch beim Hochscrollen
       laeuft: „nicht einfach wegploppen, sondern es sollte eine Animation
       geben — die Animation einfach rueckwaerts abspielen."

       ZURUECK GEHT ER SCHNELL, und das behebt einen zweiten Befund:
       „der Kreis rechts daneben liegt bei der Rueckwaerts-Animation ueber
       dem Kreis mit den Anfangsbuchstaben." Solange er noch gross ist und
       die Pille schon schmal, ueberlappen die beiden — bei .8s ist das
       fast eine Sekunde lang zu sehen, bei .15s ein Wimpernschlag. */
    transition: transform var(--dauer-kopf-zurueck) var(--kurve-kopf-schwung);
  }

  .kopf.ist-klebend.ist-verkleinert .kopf__schublade {
    transform: scale(1);
    /* Der HINWEG behaelt die .8s der Vorlage. */
    transition: transform var(--dauer-kopf-knopf) var(--kurve-kopf-schwung);
  }

  /* UND DIE PILLE RUECKT NACH LINKS, damit sie ihn freigibt. Die Website
     schiebt sie um 6,7 rem; bei uns ist es die Breite des Knopfes plus
     die Luecke, damit die beiden am Ende nebeneinander stehen statt sich
     zu ueberlappen. */
  .kopf.ist-klebend.ist-verkleinert .kopf__konto {
    transform: translateX(calc(-48px - var(--luecke-kopf)));
  }

  /* HIER STAND DIE FARBE MIT IN DER DEKLARATION, weil der Link damals die
     Pille trug und sein Ueberfahren sonst gesprungen waere. Seit dem
     10.08.2026 ist der Link durchsichtig — er hat keine Farbe mehr zu
     wechseln, und die Fuellung fuehrt ihren Uebergang beim Bild.

     IM GRUNDZUSTAND, damit die Pille auch zurueck laeuft — „dann geht die
     Pille nach rechts und wird kleiner." */
  .kopf__konto {
    /* DIE PILLE LIEGT UEBER DEM KNOPF. Er ist `position: absolute` und
       kaeme sonst darueber zu liegen — beim Rueckweg ueberlappen die
       beiden fuer einen Moment, und dann muss der Name oben sein, nicht
       der Knopf. */
    position: relative;
    z-index: 1;
    transition: transform var(--dauer-kopf-zurueck) var(--kurve-kopf-schwung);
  }

  .kopf.ist-klebend.ist-verkleinert .kopf__konto {
    transition: transform var(--dauer-kopf-schwung) var(--kurve-kopf-schwung);
  }

  /* UND DIE SEITENWAHL KOMMT. Am Handy ist sie aus — sechs Wörter passen
     dort nicht in eine Zeile; dafür ist die Schublade da. */
  .kopf__navi {
    display: block;
  }

  /* ERST HIER STEHT DER KNOPF NEBEN DEM KASTEN, und erst hier gilt dessen
     Höhe. Jitters Maß ist 60 px (`--hoehe-knopf-kopf`), gemessen an seinem
     Kopf, wo der Knopf allein steht — und am Handy steht er das bei uns
     auch, dort bleibt es dabei. Neben einem 56 px hohen Kasten sind 60 px
     kein eigener Wert mehr, sondern ein Versatz von vier Pixeln: sichtbar
     genug, um als Fehler gelesen zu werden, zu klein, um als Absicht
     durchzugehen. */
  .kopf__knopf {
    height: var(--hoehe-navi);
  }

  /* UND DIE MARKE WIRD GROSS. Sichtbar ist sie seit dem 07.08.2026 auch am
     Handy — angesagt („in jedem Zustand sichtbar"). Die drei Stufen sind
     seit dem 08.08.2026 die der eigenen Website, gerendert gemessen:
     24 px bis 1024, 26 ab 1025, 34 ab 1441. */
  .kopf__marke-bild {
    height: var(--hoehe-marke);
  }

  .kopf__knopf {
    padding-inline: var(--polster-knopf-kopf);
  }

  /* AB HIER SIND ES DIE GROSSEN MASSE: 48 px Bild in einem 64er Knopf,
     darunter 44 in 60. `min-width` UND NICHT `width` — die Begruendung
     steht bei den Grundregeln beider Klassen: eine feste Breite hier
     wuerde die eingeklappte Pille wieder abschneiden, und weil diese
     Regeln WEITER UNTEN stehen als die eingeklappten, wuerden sie bei
     gleicher Spezifitaet auch gewinnen. */
  .kopf__konto {
    min-width: var(--kontoknopf);
    height: var(--kontoknopf);
  }

  .kopf__konto-bild {
    min-width: var(--kontobild);
    height: var(--kontobild);
  }

  /* --- Die Spalte bekommt die volle Breite ------------------------ */
  /* (der dritte Schritt der Kopfzeile steht weiter unten bei 90 rem) */
  /*
     UMGESTELLT AM 03.08.2026. Hier stand Jitters mittiger Deckel
     (`max-width` 860 px, ab 1441 px 1082) — er war richtig, solange die
     Navigation als Spalte darin stand. Seit die Seitenwahl oben liegt,
     wäre er nur noch leerer Rand: bei 1440 px 290 px je Seite für nichts.

     "Dann brauchen wir die Sidebar nicht und können mehr Platz für Content
     haben" — genau das ist hier gebaut. Was den Abstand zur Fensterkante
     hält, ist derselbe Wert wie an der Kopfzeile (72 px), damit Marke,
     Inhalt und dunkler Knopf auf einer Flucht stehen.

     DAMIT FÄLLT ÜBERSTIMMUNG 21 (die zweite Spaltenbreite für
     zweispaltige Bildschirme): es gibt keine zwei Breiten mehr, es gibt
     nur noch eine, und sie ist die volle. Der Posteingang bekommt dabei
     mehr als die 1002 px, die ihm die Überstimmung zugestanden hatte —
     bei 1440 px sind es 1296. */
  /* `max-width: none` HEBT DIE OBERGRENZE AUF und bleibt: `--breite-arbeit`
     (1920 px) ist eine Arbeitsgrenze und kein Rand. Das Querpolster ist
     seit dem 05.08.2026 weg — siehe die Kopfzeile ein Stueck weiter oben. */
  .spalte {
    max-width: none;
    gap: 0;
  }

  .spalte__inhalt {
    padding-top: var(--kopf-luft);
  }

  /* DIE LEISTE IST AM LAPTOP AUS. Sie bleibt im Markup — die Schublade
     benutzt dasselbe —, und was sie am Handy trägt, trägt hier die obere
     Seitenwahl. Kein zweites Markup, keine zweite Regelmenge. */
  /* NUR DER SCHLEIER TRÄGT DIE SCHUBLADEN-MARKE IM WÄHLER, die Leiste nicht.
     ============================================================
     Der Schleier braucht sie, seit er immer im Markup steht: sonst hätte
     `.rahmen--schublade-offen .rahmen__schleier` (zwei Klassen) gegen
     `.rahmen__schleier` (eine) gewonnen, und ein Fenster, das von schmal auf
     breit gezogen wird, behielte einen grauen Schleier über der ganzen Seite.

     DIE LEISTE DARF SIE NICHT HABEN, und das ist am 15.08.2026 gemessen
     worden: `.rahmen--schublade-offen .spalte__leiste { display: block }`
     (Zeile 5935) GEWINNT hier absichtlich. `?leiste=offen` zeigt die Leiste
     auch am Laptop — darauf baut `huelle.spec.ts` („genau eine Standortmarke
     je Seite · 1440 px"), und ohne sie stand dort null statt eins.

     Ein defensiver Eintrag in einer Liste, der eine gewollte Regel
     mitnimmt, ist teurer als der Fall, gegen den er schützt. */
  .spalte__leiste,
  .rahmen__schleier,
  .rahmen--schublade-offen .rahmen__schleier {
    display: none;
  }

  /* --- Die Leiste in ihren Laptop-Massen -------------------------- */
  .leiste__eintrag {
    height: var(--hoehe-eintrag);
  }

  .leiste__zeichen {
    width: var(--symbol-navigation);
    height: var(--symbol-navigation);
  }

  .leiste__eintrag--leise .leiste__zeichen {
    width: var(--symbol-navigation);
  }

  .leiste__wort {
    font-size: var(--groesse-klein);
  }

  .leiste__eintrag--leise {
    height: var(--hoehe-eintrag-leise);
  }

  .leiste__eintrag--leise .leiste__wort {
    font-size: var(--groesse-mikro);
  }

  .suche {
    margin-bottom: var(--luft-nach-suche);
  }

  .suche__feld {
    height: var(--hoehe-suchzeile);
  }

  /* --- Der Seitentitel -------------------------------------------- */
  /* KLEINER ALS AM HANDY, und das ist gemessen: 48 gegen 64 px. Wer die
     Zahl für vertauscht hält, messe nach — Jitters `display2` ist unter
     1025 px am größten. */
  .seitentitel {
    font-size: var(--groesse-seitentitel);
    margin-bottom: var(--luft-nach-titel);
  }
}

/* ===================================================================
   Ab 1441 px: die Lücke wächst
   ===================================================================
   [gemessen] `gap: 100px` ab 1441 px, und der Seitentitel geht von 48 auf
   60. Der dritte Wert dieses Umbruchs ist gefallen:

   HIER STAND `max-width: var(--spalte-huelle-weit)` — 1082 px, und das war
   die Stelle, an der unsere Spalte SCHMALER wurde, je breiter das Fenster
   ist. Bei 1440 px blieb sie voll (1296 px), ab 1441 fiel sie auf 938.
   Gemessen bei 1920 px: 49 % Inhalt, links und rechts je 491 px totes
   Weiss. Genau der Eindruck „die Spalte schwebt im Nichts".

   Der Wert war aus Jitters CSS richtig gelesen und trotzdem falsch: seine
   Startseite faehrt gerendert 860 px bei 1440 und **1320** bei 1920. Es
   gibt einen Umbruchpunkt oberhalb von 1441, den die CSS-Auswertung nicht
   gesehen hat. Die Breite steht jetzt an EINER Stelle, bei den Tokens, und
   folgt der Regel: nie schmaler bei groesserem Fenster. */

@container huelle (min-width: 1441px) {
  .spalte {
    gap: var(--luecke-huelle-weit);
  }

  .seitentitel {
    font-size: var(--groesse-seitentitel-weit);
  }

  /* ==================================================================
     DIE DRITTE STUFE DER KOPFZEILE — 08.08.2026, aus der eigenen Website
     ==================================================================

     Sie schaltet an genau dieser Breite (`@media screen and
     (width >= 1441px)` in `EB-Software-Website/stile/kopfzeile.css`), und
     zwar drei Werte auf einmal: die Wortmarke von 26 auf 34, das
     Querpolster der Woerter von 20 auf 24, die Luecke zwischen Wortmarke
     und Seitenwahl von 24 auf 40.

     HIER STAND FRUEHER DER SATZ, dieser dritte Schritt werde weggelassen,
     weil unsere Huelle nur einen Umbruch habe. Das galt fuer den EINZUG
     eines Grundes, den es nicht mehr gibt. Fuer die Schriftgroessen gilt
     es nicht: bei 1920 px steht die Wortmarke sonst so gross da wie bei
     900, und die Vorlage tut genau das nicht. */
  .kopf__marke-bild {
    height: var(--hoehe-marke-weit);
  }

  .kopf__navi-wort {
    padding-inline: var(--polster-navi-wort-weit);
  }

  .kopf__links {
    gap: var(--luecke-marke-navi-weit);
  }

  /* Und der Bedarf waechst mit: groessere Wortmarke, breiteres
     Querpolster, groessere Luecke. Die Posten stehen am Token. */
  .kopf__spalte {
    --bedarf-kopf: var(--bedarf-kopf-weit);
    top: var(--karte-kopf-oben-weit);
    height: var(--karte-kopf-hoch-weit);
  }

  /* DIE WEITE FASSUNG DER KARTE — Jitters Masse bei 1920 px, live
     gemessen am 09.08.2026: y 35..135, 1400 breit bei einer 1320 px
     breiten Inhaltsspalte, also 40 px Ueberhang je Seite. Der Radius
     bleibt 20; er ist bei ihm auf beiden Desktop-Breiten derselbe. */
  .kopf {
    height: var(--hoehe-kopf-weit);
  }

  .kopf__karte {
    top: var(--karte-kopf-oben-weit);
    height: var(--karte-kopf-hoch-weit);
    left: calc(var(--rand-seite) - var(--ueberhang-kopf-weit));
    right: calc(var(--rand-seite) - var(--ueberhang-kopf-weit));
  }
}

/* HIER STAND EIN EIGENER `prefers-reduced-motion`-BLOCK für drei Selektoren
   (`.unterleiste__kreis`, `.leiste__kreis`, `.betrieb__knopf .symbol`).
   Gestrichen am 02.08.2026: der globale `*`-Block weiter oben erfasst sie
   längst und setzt Dauer UND Verzögerung auf 0. Sieben Zeilen, die nichts
   taten — und die den Eindruck erweckten, ein Bereich müsse seine Bewegung
   selbst abschalten. Muss er nicht: das ist Pflicht und liegt über allem. */

/* ===================================================================
   BEREICH 03 · Posteingang
   ===================================================================

   Neunzig Prozent der Nutzung. Täglich zwanzig Minuten. Oft am Handy,
   oft mit Handschuh.

   VIER ENTSCHEIDUNGEN TRAGEN DIESEN ABSCHNITT:

   1. OHNE WAHL NIMMT DIE LISTE DIE BREITE — geändert am 05.08.2026.
      Hier stand „beide Spalten stehen immer, auch ohne offenes
      Gespräch"; die Begründung war der Sprung beim ersten Antippen.
      Gemessen kostete das bei 1920 px eine graue Fläche von
      1424 x 691 px für zwei Zeilen Text. Der Block bei
      `[data-offen='nein']` weiter unten führt die Kehrtwende aus und
      trägt die vollständige Begründung.

   2. DIE LISTE IST IHR EIGENER BILDLAUF. Sie scrollt in sich, nicht
      mit der Seite. Nur so bleibt die Stelle erhalten, wenn am Handy
      ein Gespräch darüberfährt und wieder weggeht.

   3. AM HANDY LIEGT DAS GESPRÄCH ÜBER DER LISTE, es ersetzt sie
      nicht. Ein Seitenwechsel würde die Liste neu aufbauen und die
      Stelle verlieren.

   4. SCHRIFTGRÖSSEN SIND REGEL. Regel 03 ausdrücklich: Liste 15 px,
      Gespräch und Antwortfeld 17 px. „Große Schrift dort, wo gelesen
      und geschrieben wird — nicht dort, wo überflogen wird."
   =================================================================== */

/* ===================================================================
   DIE SEITE IST EIN BENTO MIT EINER ARBEITSFLAECHE DARUNTER — 11.08.2026
   ===================================================================

   HIER STAND EIN RASTER MIT VIER FELDERN („aussage / filter / liste
   gespraech"). Die Aussage war ein violetter Vollton-Streifen ueber die
   volle Breite; die Seite fing damit an und danach kam eine Liste.

   ANGESAGT: „Der zuletzt ueberarbeitete Posteingang ist der Gegenbeleg:
   er traegt kein Bento-Raster, keine grosse Aussageflaeche, keine
   Farbkacheln — er sieht nicht nach demselben Produkt aus wie die
   Uebersicht daneben."

   JETZT SIND ES DREI GESCHWISTER IN EINER SPALTE, und die Reihenfolge
   ist die Vorlesefolge: erst was los ist (Bento), dann filtern, dann
   lesen. Ein Raster braucht es dafuer nicht mehr — die zwei Spalten
   stehen eine Ebene tiefer, in `.posteingang__arbeit`.

   DIE LUECKE IST DIE DES BENTOS. `.bento` traegt zwischen Flaeche und
   Kachelreihe 30/20/40 px je Breite; derselbe Abstand steht hier
   zwischen Kachelreihe, Chipzeile und Arbeitsflaeche. Eine zweite Zahl
   daneben waere ein zweiter Takt auf einer Seite. */
/* ===================================================================
   DIE SEITE IST DAS RASTER — 11.08.2026, zweiter Anlauf
   ===================================================================

   DER ERSTE ANLAUF WAR FALSCH HERUM. Er setzte ein Bento als KOPF ueber
   die Seite und liess den Bestand darunter stehen; der Auftraggeber hat
   im Bild gesehen, was daraus folgt: „der Inhalt der Bento-Grids ist ja
   auf jeder Seite gleich … der Inhalt soll IN dem Bentogrid sein."

   JETZT SIND ALLE VIER TEILE KACHELN IN EINEM RASTER. Zwoelf Spuren, weil
   das die kleinste Zahl ist, die 6+3+3 und 5+7 zugleich hergibt — beides
   sind Verhaeltnisse, die schon entschieden sind (die Kachelpaare der
   Vorlage und Jitters 28 % Listenspalte).

   `minmax(0, 1fr)` UND NICHT `1fr`: eine `1fr`-Spur hat ein automatisches
   Minimum von `min-content`, und `min-width: 0` am KIND aendert daran
   nichts. Dieselbe Falle wie an `.zeile__mitte`.

   AM HANDY EINE SPUR. Jede Kachel nimmt die Breite, das Gespraech liegt
   als feste Ueberlagerung darueber. */
.posteingang {
  display: flex;
  flex-direction: column;
  gap: var(--bento-luecke);
  min-width: 0;
}

/* HIER STAND `.posteingang__lage` MIT EIGENEN SPUREN UND EIGENEN
   SCHRIFTGRADEN — 11.08.2026 gebaut, 11.08.2026 wieder gefallen. Angesagt
   auf die Frage nach Schrift und Farbe: „wie Uebersichtsseite". Der Kopf
   ist jetzt `bentokopf()` und damit dieselbe Flaeche und dasselbe Raster
   wie dort; es gibt keine zweite Formensprache mehr daneben. */
.posteingang__arbeit {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--bento-luecke);
  min-width: 0;
}

/* ===================================================================
   DIE INHALTSKACHEL — die zweite Kachelart, und sie ist nicht neu
   ===================================================================

   `.verlauf` auf der Uebersicht ist genau diese Form und traegt seit dem
   06.08.2026 den einzigen Inhalt, den das Bento dort hat: Radius 40,
   Haarrand, weisse Flaeche. Die Vorlage kennt sie als
   `_collaborationCards_` (Jitters Startseite, „Design" und „Animate").

   WAS SIE VON `.bentokachel` UNTERSCHEIDET, ist nicht die Form, sondern
   die Aufgabe: die Farbkachel traegt EINE Aussage, die Inhaltskachel
   traegt eine Arbeitsflaeche. Deshalb ist ihr Polster kleiner — 50 px
   ringsum wie bei `.verlauf` liessen bei 390 px noch 250 px fuer eine
   Nachrichtenliste uebrig, und die Liste ist die Seite.

   [gemessen] 390 px Fenster minus 2 x 20 px Seitenrand = 350 px Kachel;
   mit 24 px Polster bleiben 302 px Inhalt. Das ist die Breite, auf der
   die Listenzeile abgenommen ist. */
.inhaltskachel {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-4);
  min-width: 0;
  padding: var(--abstand-5);
  /* ===================================================================
     KANTIG, WEIL SIE KEINE FARBE TRAEGT — 12.08.2026, angesagt
     ===================================================================

     ANGESAGT: „die Kaesten unten, also den border-radius auf 0px setzen,
     also auf jeder Seite von dem Container, der keine Farbe hat."

     DIE GRENZE IST DIE FARBE, und sie laesst sich begruenden: eine
     Bento-Kachel TRAEGT die Farbe ihres Objekts — dort ist der Radius
     Teil der Form, weil die Flaeche selbst die Aussage ist. Diese Kachel
     traegt nur Weiss und einen Haarrand; ihr Radius war Schmuck an einem
     Behaelter, der nichts sagt.

     DIESELBE RICHTUNG WIE BEI DEN EINGABEFELDERN am 11.08.2026 („kantig
     wie bei Jitter") und bei den Filterchips („schwarz und kantig wie auf
     der Uebersichtsseite"). Es ist die dritte Ansage in dieselbe Richtung
     und damit keine Einzelentscheidung mehr.

     `--radius-bento` BLEIBT UND WIRD GEBRAUCHT: die farbigen Kacheln
     tragen ihn weiter. Der Token faellt nicht, nur dieser Aufrufer. */
  border-radius: 0;
  border: var(--randbreite) solid var(--farbe-rand);
  background: var(--farbe-flaeche);
}

/* DIE GESPRAECHSKACHEL IST EINE INHALTSKACHEL WIE DIE LISTE — 11.08.2026.
   Sie stand auf `--farbe-flaeche-gedaempft`, und das war richtig, solange
   sie eine randlose Spalte neben der Liste war: der graue Grund war ihre
   einzige Kante. Als Kachel hat sie Radius und Haarrand; ein zweiter
   Traeger derselben Aussage ist einer zu viel, und im Bild lagen dadurch
   drei Grautoene uebereinander (Kachel, Kopfband, Verlauf).

   `.inhaltskachel.gespraech` UND NICHT NUR `.gespraech`: die Regel weiter
   oben hat dieselbe Spezifitaet und steht spaeter. Zwei Klassen an einem
   Element (0-2-0) schlagen sie. */
.inhaltskachel.gespraech {
  background: var(--farbe-flaeche);
}

/* Der Kopf traegt keine eigene Flaeche mehr — er steht auf der Kachel.
   Was ihn vom Verlauf trennt, ist der Strich, nicht die Farbe. */
.inhaltskachel .gespraech__kopf {
  padding: 0 0 var(--abstand-4);
  background: none;
}

/* Der Verlauf ebenso: kein zweiter Grund in der Kachel, kein zweites
   Polster. Die Blasen tragen ihre Kanten selbst. */
.inhaltskachel .gespraech__verlauf {
  padding: 0;
}

/* Und das Antwortfeld: der Strich trennt Lesen von Schreiben, die Flaeche
   ist die der Kachel. Das Querpolster faellt, das Hochpolster bleibt —
   ohne es klebte der Kasten am Strich. */
.inhaltskachel .antwort {
  padding: var(--abstand-4) 0 0;
  background: none;
}

/* ===================================================================
   DAS ANTWORTFELD GEHT ÜBER DIE VOLLE BREITE — 11.08.2026, angesagt
   ===================================================================

   „die Antwortleiste sollte ganze Breite sein."

   DAMIT IST DIE ABWEICHUNG VOM 10.08.2026 ZURÜCKGENOMMEN, und zwar auf
   dieselbe Weise, wie sie zustande kam: vorgelegt und entschieden. Regel 03
   sagt seit jeher „Das Antwortfeld geht über die volle Breite und hat kein
   Formatierungsband"; am 10.08. ist es auf `--gespraech-spalte` (576 px)
   begrenzt worden, mit dem Argument, 1214 px Schreibzeile bei 1920 px seien
   zu lang, während gelesen wird auf 534.

   DAS ARGUMENT GALT FÜR EINE ANDERE FLÄCHE. Damals war das Gespräch eine
   randlose Spalte über die halbe Seite. Jetzt ist es eine Kachel: bei 1920 px
   misst sie 760 px innen, bei 1440 px 430. Die Schreibzeile ist damit von
   sich aus in der Größenordnung der Lesebreite — der Deckel regelte etwas,
   das die Kachel schon regelt, und ließ dafür rechts sichtbar Fläche liegen.

   Regel 03 gilt damit wieder wörtlich. Die Blasen behalten ihre Lesebreite:
   ein Text, den man LIEST, hat eine andere Auflage als ein Feld, in das man
   SCHREIBT. */
.inhaltskachel .antwort > * {
  max-width: none;
}

/* DER CHIP SAGT, WAS IN DER KACHEL STEHT — SCHWARZ UND KANTIG, 11.08.2026.
   Angesagt: „Filter-Optionen schwarz und kantig wie auf der
   Uebersichtsseite." Das ist dort `.verlauf__takt-wort--aktiv`, der
   Umschalter „Monate / Wochen": Hoehe 40, Querpolster 20, Radius 0,
   16 px / 600, Tinte gefuellt mit weisser Schrift.
   Derselbe Satz Token, damit es wirklich dieselbe Form ist und nicht eine,
   die zufaellig danebenliegt.

   ===================================================================
   SEIT DEM 19.10.2026 OHNE FLAECHE — wie die Eyebrow der Website
   ===================================================================

   Lennard, Feedback auf Staging: „Überschrift darf nicht gleich aussehen
   wie Knöpfe." Schwarz gefuellt, 40 px hoch und kantig war das Etikett
   dieselbe Form wie „Anlegen und einladen" zwei Zeilen darunter. Gewaehlt
   (Auswahl): wie die Website — dort steht ueber jedem Abschnitt eine
   Zeile in Grossbuchstaben, fett, 14 px, ohne Grund
   (`ergaenzungen.css`, `.haupt .pille`: 700, 14 px, 1,3, 0,04 em).
   Damit sind die Knoepfe das Einzige mit schwarzer Flaeche.

   `min-height` STATT `height`: rechts im Kopf stehen bei manchen Kacheln
   Knoepfe (Drive) — die Zeile bleibt so hoch wie sie, das Etikett mittig. */
.inhaltskachel__chip {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
  padding: 0;
  border-radius: 0;
  background: none;
  color: var(--farbe-text);
  font-size: 14px;
  line-height: 1.3;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  white-space: nowrap;
}

/* Der Chip links, der Weg rechts. `flex-wrap`, weil „Zurück zum
   Posteingang" bei 390 px neben einem Chip von 160 px nicht in eine Zeile
   passt — dann steht er darunter statt gequetscht daneben. */
/* ===================================================================
   LINKS DER CHIP, RECHTS DER REST — 11.08.2026 berichtigt
   ===================================================================

   Hier stand `justify-content: space-between`, und das war richtig,
   solange der Kopf ZWEI Kinder hatte: Chip links, Weg rechts. Im offenen
   Ordner des Drive sind es drei — Chip, „Alle Fotos", „Fotos hochladen" —
   und `space-between` setzt das mittlere in die MITTE. Der Weg stand im
   Bild allein zwischen zwei Blöcken und sah aus, als gehörte er zu
   keinem.

   Mit dem automatischen Außenabstand schiebt das ERSTE Element der
   rechten Seite die ganze Lücke vor sich her; alles danach folgt ihm
   dicht. Bei zwei Kindern kommt genau dasselbe heraus wie vorher — bei
   drei kommt heraus, was gemeint war. */
.inhaltskachel__kopf {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--abstand-3);
  min-width: 0;
}

/* `+` UND NICHT `~`: nur das ERSTE Element nach dem Chip bekommt die Lücke.
   Mit `~` bekäme sie jedes, und dann stünde zwischen „Alle Fotos" und
   „Fotos hochladen" wieder derselbe Abstand wie vor dem Chip — also genau
   das `space-between`, das hier gerade gefallen ist. */
.inhaltskachel__chip + * {
  margin-left: auto;
}

/* Der Weg ins Archiv und zurueck. Ein Verweis und kein Knopf: er aendert
   nichts, er zeigt etwas anderes.

   ===================================================================
   44 PX — NACHGEZOGEN AM 11.08.2026, UND ZWAR ALS FUND
   ===================================================================

   Beim Umbau von `/drive` sollte hier ein Vermerk stehen, dass dieser
   Weg die 44 px mitbringt, die `.drive__zurueck` am 02.08.2026 bekommen
   hat. Beim Nachsehen: er brachte sie NICHT. Der Verweis war ein reiner
   Textverweis mit 17,5 px Hoehe — genau der Zustand, der am 02.08.2026
   an der einen Stelle behoben und an der anderen nie bemerkt wurde.

   ER TRIFFT DREI SEITEN: „Archiv" im Posteingang, „Als Kalender" in den
   Inhalten, „Alle Fotos" im Drive. Alle drei sind der einzige Weg aus
   ihrer Ansicht heraus, und alle drei waren mit Arbeitshandschuh nicht
   zu treffen.

   Er bleibt ein Textverweis, er bekommt nur seine Flaeche — dieselbe
   Abhilfe wie damals, nur an dem Ort, an dem sie fuer alle gilt. */
.inhaltskachel__weg {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--farbe-text-gedaempft);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  text-decoration: none;
}

.inhaltskachel__weg:is(:hover, .zeige-ueberfahren) {
  color: var(--farbe-text);
  text-decoration: underline;
}

/* --- Die Liste ---------------------------------------------------- */

.posteingang__liste {
  display: flex;
  flex-direction: column;
  min-height: 0;
  min-width: 0;
  background: var(--farbe-flaeche);
  /* ===================================================================
     DIE LISTE IST IHR EIGENER BEHAELTER — 11.08.2026
     ===================================================================

     Seit die Chipzeile IN der Listenkachel steht, haengt ihr Umbruch an
     der Breite DIESER Kachel und nicht mehr an der der Huelle. Im Bild
     bei 1440 px mit offenem Gespraech: die Kachel ist 352 px breit, die
     Huelle meldet 1440, also griff die Umbruchregel — und zehn Woerter
     standen als sechszeiliger Klotz mit ausgefransten Kanten da.

     Dieselbe Ueberlegung wie am Gespraechskopf (10.08.2026): ein
     Umbruch, der an der Fensterbreite haengt, obwohl er von der
     Kachelbreite abhaengt, ist an der falschen Zahl festgemacht. */
  container-type: inline-size;
  container-name: liste;
}

/* Die Chip-Zeile bleibt oben stehen, während die Liste darunter läuft.
   Sie ist die einzige Filterung — c4: kein „Filter +", keine zweite
   Ebene, keine gespeicherten Ansichten. */
/* ===================================================================
   DIE FILTER SIND NEU — 18.08.2026, angesagt
   ===================================================================

   „Die Filter bitte von Grund auf neu bauen. Du kannst auch alles unter einem
   Dropdown machen."

   WAS DAMIT FAELLT, ist der ganze Bildlauf-Aufbau: der Streifen mit
   `overflow-x`, seine Ausblendkante, der Trog mit `width: max-content`, die
   Zwischenlage und der festgesetzte Schalter „Weitere". Alle fuenf gab es NUR,
   weil vier Kanalchips 590 px brauchten und die Filterspalte bei 390 px 268
   hat. Hinter einem Knopf braucht die Zeile diese Breite nicht mehr.

   DIE ZEILE DARF JETZT UMBRECHEN, und das ist kein Rueckfall: sie enthaelt
   zwei Knoepfe und die gesetzten Pillen. Was frueher auf sechs Reihen umbrach,
   waren zehn Chips. */
.posteingang__filter {
  flex: 0 0 auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--abstand-3);
  /* `min-width: 0` GEHOERT DAZU, seit die Zeile ein Rasterfeld ist —
     02.08.2026. Ein Rasterfeld ist von sich aus `min-width: auto` und damit
     so breit wie sein Inhalt. */
  min-width: 0;
  /* `position: sticky` STAND HIER UND WAR SCHON VORHER WIRKUNGSLOS: gescrollt
     hat immer `.posteingang__zeilen`, nie der Kasten, in dem die Filterzeile
     lag. Seit sie eine eigene Rasterzeile ueber der Liste ist, steht sie
     ohnehin fest. Eine Regel, die nichts tut, sieht aus, als taete sie
     etwas. */
  z-index: 2;
  padding: var(--abstand-3) var(--abstand-4);
  background: var(--farbe-flaeche);
  border-bottom: var(--randbreite) solid var(--farbe-rand);
}

/* Der Knopf einer Filterart. ECKIG UND LEISE — er ist kein Filter, sondern
   der Weg zu den Filtern; die Farbe gehoert dem, was gesetzt ist.

   `list-style: none` UND `::-webkit-details-marker`: beide Browserfamilien
   setzen ein eigenes Dreieck vor ein `<summary>`. Wir tragen die Auskunft
   „auf/zu" ueber die Zahl daneben und den Zustand des Blattes. */
.filterwahl__knopf {
  display: inline-flex;
  align-items: center;
  gap: var(--abstand-2);
  min-height: 44px;
  padding: 0 var(--abstand-3);
  border: var(--randbreite) solid var(--farbe-rand-bedienelement);
  background: var(--farbe-flaeche);
  color: var(--farbe-text);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  cursor: pointer;
  list-style: none;
}

.filterwahl__knopf::-webkit-details-marker {
  display: none;
}

.filterwahl__knopf:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-flaeche-gedaempft);
}

/* DIE ZAHL SAGT, WIE VIELE GESETZT SIND, und sie steht IM Knopf: wer das
   Blatt zumacht, soll nicht raten, ob er darin etwas stehen hat. Tinte auf
   hellem Grund und nicht die Handlungsfarbe — sie ist eine Auskunft, keine
   Aufforderung. */
.filterwahl__zahl {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  padding: 0 var(--abstand-1);
  background: var(--farbe-text);
  color: var(--farbe-flaeche);
  font-size: var(--groesse-mikro);
}

/* ===================================================================
   DER ANKER WECHSELT MIT DER BREITE — 18.08.2026, von einer Messung erzwungen
   ===================================================================

   AM LAPTOP haengt das Blatt am KNOPF: es klappt dort auf, wo man geklickt
   hat, und ist so breit wie sein Inhalt.

   AM HANDY GEHT DAS NICHT. Der zweite Knopf steht schon in der Mitte der
   Kachel; ein Blatt an seiner linken Kante, so breit wie sein Inhalt, ragt
   rechts hinaus — gemessen bei 390 px: 22 Elemente ueber dem Rand.

   ALSO IST DORT DIE KACHEL DER ANKER (`position: static` am Knopfkasten,
   `inset-inline: 0` am Blatt). `min-width: max-content` gehoert dabei IN die
   Laptop-Abfrage: zusammen mit `inset-inline: 0` gewinnt sie und macht das
   Blatt wieder so breit wie sein Inhalt (gemessen 61 bis 494 px in einem
   390er Fenster).

   `position: relative` STEHT DESHALB IN DER MEDIENABFRAGE und nicht davor:
   waere es die Vorgabe, muesste die schmale Fassung es zuruecknehmen — und
   das ist die zweite Regel zur selben Sache, vor der die Uebergabe warnt. */
.filterwahl__blatt {
  position: absolute;
  top: calc(100% + var(--abstand-1));
  inset-inline: 0;
  z-index: 3;
  padding: var(--abstand-2);
  background: var(--farbe-flaeche);
  border: var(--randbreite) solid var(--farbe-rand);
  box-shadow: var(--schatten-2);
}

@container (min-width: 45rem) {
  .filterwahl {
    position: relative;
  }

  .filterwahl__blatt {
    inset-inline: 0 auto;
    min-width: max-content;
  }
}

/* DER WEG ZURUECK. Ein Verweis und kein Knopf: er setzt die Adresse zurueck,
   und das ist eine Navigation. Er heisst `.filterweg` und nicht mehr
   `.filterzeile__weitere` — der Block `.filterzeile` ist mit dem Bildlauf
   gefallen, und ein Element, dessen Block es nicht gibt, meldet die Wache
   „kein Baustein greift in die Klassen eines anderen" sofort. */
.filterweg {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  color: var(--farbe-text-gedaempft);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  text-decoration: none;
  white-space: nowrap;
}

.filterweg:is(:hover, .zeige-ueberfahren) {
  color: var(--farbe-text);
  text-decoration: underline;
}

/* Die gesetzten stehen in der Zeile selbst, nebeneinander, und duerfen
   umbrechen: es sind hoechstens so viele, wie jemand gesetzt hat. */
.filtergesetzt {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--abstand-2);
  min-width: 0;
}

/* ===================================================================
   DER CHIP IST EIN REITER — 16.08.2026, angesagt
   ===================================================================

   „Wenn ich bei Posteingang auf Facebook, Instagram … hovere, sind die
   Dinger alle viereckig, dieser Hover-Pin. … Aber die sollten doch so
   aussehen wie in den Einstellungen die Reiter."

   ER WAR VIERECKIG, UND DIE URSACHE STAND NICHT HIER, sondern in
   tokens.css: der Chip hat sich beim Trog-Umbau vom 12.08.2026 die vier
   Marken der KOPFNAVIGATION geliehen — `--hoehe-navi-wort`,
   `--polster-navi-wort`, `--groesse-navi-wort` und `--radius-navi-wort`.
   Und der letzte steht dort mit Begruendung auf NULL: „Der aktive Vollton
   ist ein Rechteck. Die Vorlage hat keinen aktiven Zustand zum Abmessen —
   ihr Gegenstueck ist ein Knopf und keine Seitenmarke."

   Das ist fuer die Kopfleiste richtig und fuer diesen Trog falsch. Der
   Trog darum ist laengst der des Reiters (`.filterzeile .chipzeile`:
   `--farbe-rand`, `--reiter-polster`, `--radius-rund`) — es fehlte genau
   der Inhalt darin. Deshalb stehen hier jetzt die Werte von
   `.reiter__eintrag` und keine eigenen: 48 px Handschuhmass, das Polster
   der Reiterleiste, die runde Pille, die gedaempfte Schrift AUF DEM TROG
   (`--farbe-text-gedaempft-auf-rand`, am 14.08.2026 eigens fuer diesen
   Grund gerechnet — `--farbe-text-gedaempft` haelt darauf nur 4,00:1).

   WAS NICHT MITKOMMT, ist die Fuellung des gesetzten Zustands. Der aktive
   Reiter ist eine WEISSE Pille; der gesetzte Chip bleibt dunkel
   beziehungsweise traegt seinen Etikettton. Der Grund ist gemessen und
   steht zwei Bloecke tiefer: die sechs Etikettfarben sind fuer WEISSE
   Schrift gerechnet (4,57 bis 4,62:1). Eine weisse Pille mit dunkler
   Schrift wuerde diese Rechnung umwerfen — und die Ansage galt der FORM
   und dem Ueberfahren, nicht der Fuellung. */
.posteingang__filter .chip {
  position: relative;
  min-height: 48px;
  padding: 0 var(--abstand-4);
  border: 0;
  border-radius: var(--radius-rund);
  background: none;
  color: var(--farbe-text-gedaempft-auf-rand);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  max-width: 16rem;
}

.posteingang__filter .chip::after {
  content: '';
  position: absolute;
  inset: -2px 0;
}

.posteingang__filter .chip--gesetzt {
  padding-right: var(--abstand-2);
  background: var(--farbe-text);
  color: var(--farbe-flaeche);
  /* DER SCHATTEN IST DER DRITTE TRAEGER, woertlich derselbe Satz wie bei
     `.reiter__eintrag--aktiv`: er hebt die Pille vom Trog ab, statt sie
     zu faerben. Dort traegt er eine WEISSE Pille auf hellgrauem Grund
     (1,17:1 ohne ihn); hier traegt er die Ueberfahren-Rueckmeldung eine
     Stufe weiter unten mit, siehe unten. */
  box-shadow: var(--schatten-1);
}

/* ===================================================================
   DIE ETIKETTFARBE GING IM TROG VERLOREN — 14.08.2026, gefunden
   ===================================================================

   `Chip.etikett` faerbt einen Chip „AUSSCHLIESSLICH IM GESETZTEN
   ZUSTAND" (siehe die Begruendung an `Chip` in bausteine.ts) — das ist
   der einzige Moment, in dem ein Etikett-Chip ueberhaupt Farbe traegt.
   Die Regel `.chip--gesetzt.chip--etikett-*` (Bereich 03, sechs Toene)
   und die Regel `.posteingang__filter .chip--gesetzt` (Trog, oben) haben
   dieselbe Spezifitaet — zwei Klassen —, und die spaetere im Bestand
   gewinnt. Das war seit dem Trog-Umbau vom 12.08.2026 immer die zweite:
   ein gesetzter Etikett-Chip im Filter-Trog stand schwarz da wie jeder
   andere, nachgemessen (Playwright, `background-color`) statt vermutet.

   Damit verlor der Filter genau die Auskunft, fuer die die Etikettfarbe
   ueberhaupt existiert — welches Etikett gerade gesetzt ist, auf einen
   Blick, ohne das Wort zu lesen. Kein Kommentar an der Trog-Regel hat
   das als Absicht benannt; es steht auch sonst nirgends im Haus, dass
   Etiketten im Filter ihre Farbe verlieren sollen.

   DREI KLASSEN SCHLAGEN ZWEI — die sechs Regeln hier sind eigens auf
   `.posteingang__filter` eingegrenzt, nicht global verschaerft: die
   Trog-Regel bleibt fuer Kanal-Chips (die nie eine eigene Farbe hatten)
   unveraendert die Vorgabe. `color` bleibt unberuehrt: `--farbe-flaeche`
   und `--farbe-primaer-kontrast` sind beide #FFFFFF, derselbe Wert, den
   die Etikett-Chips ausserhalb des Trogs schon tragen. */
.posteingang__filter .chip--gesetzt.chip--etikett-bewerbung { background: var(--farbe-etikett-bewerbung); }
.posteingang__filter .chip--gesetzt.chip--etikett-anfrage { background: var(--farbe-etikett-anfrage); }
.posteingang__filter .chip--gesetzt.chip--etikett-beschwerde { background: var(--farbe-etikett-beschwerde); }
.posteingang__filter .chip--gesetzt.chip--etikett-lob { background: var(--farbe-etikett-lob); }
.posteingang__filter .chip--gesetzt.chip--etikett-termin { background: var(--farbe-etikett-termin); }
.posteingang__filter .chip--gesetzt.chip--etikett-sonstiges { background: var(--farbe-etikett-sonstiges); }

/* Der gesetzte Chip traegt sein Kreuz in derselben Schrift wie sein Wort.
   Vorher lag darauf der Etikettton — auf Tinte ist er nicht zu sehen. */
.posteingang__filter .chip--gesetzt .chip__loeschen {
  color: inherit;
}

/* ===================================================================
   DER HOVER-PIN IST WEG — 16.08.2026, angesagt
   ===================================================================

   HIER STAND `background: var(--farbe-flaeche-gedaempft)`, mit dem Vermerk
   „Ueberfahren faerbt die Flaeche leicht, statt einen Rand zu bewegen".
   Genau diese Flaeche ist gemeldet worden: „sind die Dinger alle
   viereckig, dieser Hover-Pin."

   SIE WAR NICHT NUR VIERECKIG, SIE WAR ZU VIEL. Der Reiter hat dieselbe
   Frage am 12.08.2026 schon beantwortet, und zwar angesagt („bei Hover ist
   ein Unterstrich da, der weg sollte"): beim Ueberfahren nur die SCHRIFT.
   Der Vermerk dort nennt auch den Grund, und er gilt hier woertlich — eine
   Flaeche unter dem ruhenden Wort waere im Trog ein zweiter heller Fleck
   neben der Pille, und man liest ihn als zweiten gesetzten Filter. */
.posteingang__filter .chip:is(:hover, .zeige-ueberfahren):not(.chip--gesetzt) {
  color: var(--farbe-text);
  /* UND DER SCHATTEN AUCH NICHT. Die Flaeche wegzunehmen hat nicht gereicht —
     nachgesehen am Bild (`messberichte/chips/filter-ueberfahren-1440.png`):
     der Kasten war weg und ein heller Hof stand weiter da. Er kommt aus der
     allgemeinen Chip-Regel `.chip:not(.chip--gesetzt):hover { box-shadow:
     var(--schatten-2) }` in Bereich 03. Die gilt fuer den Chip UEBERALL SONST
     (auf `/inhalte` und in der Suche steht er als Umriss auf Weiss, und dort
     traegt der Schatten richtig) — im Trog ist er der Hover-Pin unter anderem
     Namen. Deshalb hier zurueckgenommen und nicht dort geaendert; dieselbe
     Falle wie bei `feld()`, ein Baustein des ganzen Produkts. */
  box-shadow: none;
}

/* UND DER GESETZTE ZEIGT AUCH, DASS ER WEGGEHT — 15.08.2026.
   ============================================================

   Gemeldet: „wenn ich sie auswähle, kann ich sie nicht mehr abwählen." Die
   halbe Ursache war das Markup (ein `<span>` statt eines Verweises, siehe
   `chip()` in `bausteine.ts`), die andere Hälfte ist hier: es gab keine
   Regel für den gesetzten Zustand, also sah er beim Überfahren aus wie
   Beschriftung.

   HIER STAND `opacity: 0.75`, mit dem Vermerk „ES WIRD BLASSER STATT
   DUNKLER … der eine sagt ‚hier kommt etwas dazu', der andere ‚hier geht
   etwas weg'". Die Absicht war richtig, das Mittel verboten.

   ===================================================================
   DIE ZUSTANDSMATRIX HAT ES GEMELDET — 16.08.2026
   ===================================================================

   „Zustand über Deckkraft gebaut: .posteingang__filter .chip--gesetzt
   :is(:hover, .zeige-ueberfahren) { opacity: 0.75 }"

   Sie stand am 15.08.2026 einen Tag lang als grün im Übergabepunkt, und
   das war ein Irrtum der Buchführung, kein Befund: der Messdurchgang jenes
   Tages ist bei 225 von 403 abgebrochen und nie bis zu dieser Probe
   gekommen. Der erste Durchgang, der durchlief, hat sie sofort gefunden.

   DERSELBE TRÄGER WIE BEIM AKTIVEN REITER, und damit ist es wieder eine
   Antwort und keine Erfindung: `--schatten-1` auf `--schatten-2`. Die
   Pille kommt beim Überfahren HERAUS statt zu verblassen. Daß das die
   Gegenrichtung zur ursprünglichen Absicht ist, gehört gesagt — aber „geht
   weg" trägt hier schon das Kreuz, und zwei Zeichen für dieselbe Auskunft
   sind eines zu viel (siehe den Balken unter der aktiven Pille, gefallen
   am 12.08.2026 aus genau diesem Grund). */
.posteingang__filter .chip--gesetzt:is(:hover, .zeige-ueberfahren) {
  box-shadow: var(--schatten-2);
}

/* ===================================================================
   AB 1100 PX BRICHT DIE ZEILE UM, STATT ZU ROLLEN — 05.08.2026
   ===================================================================

   Der Bildlauf ist die Antwort auf ein SCHMALES Fenster: am Handy passen
   von zehn Chips drei ins Bild, und untereinander waeren sie ein
   sechszeiliger Block, der die halbe Liste frisst.

   Am breiten Fenster ist er die falsche Antwort. Gemessen bei 1920 px:
   Streifen 1776 px, Chipinhalt 1776 px — die Zeile passt genau, und ein
   waagerechter Bildlauf, der nichts zu rollen hat, ist trotzdem einer.
   Wer die Schrift auf 125 % stellt, faellt sofort hinein: dann liegen die
   letzten zwei Chips hinter einer Kante, obwohl darunter eine ganze Zeile
   frei ist.

   Umbrechen kostet dort nichts. Zehn Chips brauchen bei 1920 px eine
   Zeile, bei 125 % Schrift zwei — und die zweite steht einfach da,
   statt versteckt zu sein.

   MIT DEM BILDLAUF FAELLT AUCH SEINE KANTE. Die Ausblendmaske sagt „hier
   geht es weiter"; ueber einer umgebrochenen Zeile saehe sie aus wie ein
   Fehler im Verlauf und wuerde den letzten Chip der ersten Zeile
   verblassen lassen, obwohl er vollstaendig dasteht.

   DIE ZAHL IST AM 11.08.2026 EINE ANDERE GEWORDEN, und der Behaelter
   auch. Hier stand `@container huelle (min-width: 1100px)`: die Huelle
   war der richtige Bezug, solange die Chipzeile ueber BEIDEN Spalten
   lag. Seit sie in der Listenkachel steht, ist die Kachel der Bezug.

   [gemessen] Was zehn Chips in der neuen Form brauchen: „Facebook" 128,
   „Instagram" 132, „WhatsApp" 137, „YouTube" 128, „Anfrage" 96,
   „Beschwerde" 121, „Bewerbung" 118, „Lob" 71, „Sonstiges" 111,
   „Termin" 91 — zusammen 1133 px plus neun Luecken zu 8 = 1205. Bei
   1320 px Inhaltsbreite passt das in eine Zeile, in einer 352 px
   breiten Listenspalte nicht annaehernd.

   70rem = 1120 px ist die Kachelbreite, ab der es sicher hineinpasst.
   Darunter rollt die Zeile — das ist die Antwort auf ein schmales
   Feld, und sie ist dieselbe wie am Handy. */
@container liste (min-width: 70rem) {
  .posteingang__filter {
    overflow-x: visible;
    mask-image: none;
    scroll-snap-type: none;
  }

  .posteingang__filter .chipzeile {
    flex-wrap: wrap;
    /* Zurueck auf „so breit wie der Streifen": `max-content` war die
       Bedingung fuers Rollen und verhindert jeden Umbruch. */
    width: auto;
  }
}

/* Die Zeile ist seit Bereich 03 ein VERWEIS statt eines Knopfes — ohne
   Skript muss sie zu einer Adresse führen. Ein Verweis bringt aber
   Unterstreichung und Verweisfarbe mit, und die Liste sah damit aus wie
   eine Trefferliste aus dem Netz. Im Bild sofort zu sehen, in keiner Zahl:
   Kontrast und Trefferfläche waren die ganze Zeit in Ordnung. */
.posteingang__zeilen .zeile__flaeche {
  color: inherit;
  text-decoration: none;
}

/* ===================================================================
   DIE LISTE ROLLT NICHT MEHR IN SICH — 10.08.2026, angesagt
   ===================================================================

   „Man sollte in der Seite ja auch runterscrollen können … das soll so
   sein wie die Übersichts-Seite."

   HIER STAND EIN EIGENER BILDLAUF, und er war die tragende Entscheidung
   von Bereich 03: `flex: 1 1 auto`, `overflow-y: auto`, eine
   Ausblendkante unten, Rasterpunkte je Zeile. Der Grund stand daneben —
   „hier steht die Stelle in der Liste, unangetastet beim Öffnen und
   Schließen eines Gesprächs" — und er war richtig.

   ER HAT NUR EINEN PREIS GEHABT, DEN NIEMAND WOLLTE. Damit eine Fläche
   in sich rollen kann, braucht die Kette darüber eine feste Höhe; die
   kam vom Körper (`overflow: hidden` ab 60 rem). Gemessen bei 1440 x 900,
   nachdem der Seitentitel auf die Höhe der anderen Seiten gerückt war:

     Gesprächsbereich   272,9 px
     Verlauf darin       32   px

   32 px Verlauf sind keine Arbeitsfläche. Und `/posteingang` war die
   einzige der sieben Seiten mit `overflow: hidden` — alle anderen rollen
   als Dokument, zwischen 1027 und 2269 px hoch.

   JITTER MACHT ES AUCH SO. Sein „Drafts" ist gemessen 1198 px hoch bei
   900 px Fenster und rollt als Dokument. Die Ausnahme war unsere, nicht
   seine.

   WAS SIE GEKOSTET HAT, gehört in denselben Vermerk: die Stelle in der
   Liste geht beim Lesen eines langen Gesprächs verloren, weil beide
   Spalten mit dem Dokument rollen. Das ist der Preis, er ist bekannt und
   er ist angesagt bezahlt worden. Wer ihn zurückholen will, braucht
   wieder eine feste Höhe — und damit wieder die 272,9 px. */
.posteingang__zeilen {
  margin: 0;
  padding: 0;
  list-style: none;
  /* 15 px, nicht 17 — Regel 03. Große Typografie kostet hier sichtbare
     Zeilen, und das bei 90 % der Nutzung. */
  font-size: var(--groesse-klein);
}

/* ===================================================================
   DER TAKT DER LISTE IST LUFT, KEIN STRICH — 10.08.2026
   ===================================================================

   Angesagt: „uebernimm von Jitter den TAKT — Zeilenhoehe, Abstaende,
   Gruppenueberschrift, Luecke zur rechten Spalte."

   GEMESSEN an `Drafts · Jitter.html` bei 1440 px: sein Eintrag ist 38 px
   hoch, sein Takt 40 px. Das sind **2 px Luft und kein Strich** — 5,26 %
   der Zeilenhoehe.

   UNSER TAKT WAR 108,1 BEI 108,1 PX ZEILE: null Luft, dafuer unter jeder
   Zeile eine Haarlinie. Zwei Bauarten, dieselbe Aufgabe, und die Vorlage
   macht es andersherum.

   DIE ZAHL TRAEGT NICHT, DAS VERHAELTNIS SCHON — und dazwischen liegt eine
   Entscheidung ueber den INHALT der Zeile, nicht ueber ihren Abstand.
   Die Vorsitzung hat sie vorgelegt und nicht getroffen: „5 px Weiss
   zwischen zwei mehrzeiligen Bloecken sind schlechter zu lesen als eine
   Haarlinie." Das stimmt fuer einen mehrzeiligen Block. Jitters Eintrag
   ist keiner — er traegt EINE Zeile, und deshalb genuegen ihm 2 px.

   ALSO TRAEGT UNSERE ZEILE AUCH EINE. `-webkit-line-clamp: 1` stand seit
   dem 05.08.2026 schon in der breiten Liste und ist jetzt der Normalfall.
   Was das kostet und bringt, NACHGEMESSEN und nicht vorhergesagt:

                     Zeile   Takt
     breite Liste     76      80     vorher 77 / 77
     schmale Liste    83,4    87,4   vorher 108,1 / 108,1

   Der zweite Punkt ist der eigentliche Gewinn. Bisher sprang der Takt der
   Liste um 31 px, sobald der Meister eine Nachricht anfasste — die Liste
   wurde schmal UND ihr Rhythmus ein anderer. Der Sprung der BREITE ist
   entschieden und bezahlt (siehe unten); ein zweiter Sprung im Takt war
   nie entschieden, er fiel nebenbei an. Jetzt sind es 7,4 px.

   ER IST NICHT NULL, und das ist kein Rest, sondern die Bauform: die
   breite Liste stellt Wer/Wann und Vorschau NEBENEINANDER (Raster
   `18rem` plus Rest), die schmale stellt sie uebereinander. Zwei
   Textzeilen sind hoeher als eine. Wer das auf null bringen will, muss
   die schmale Liste einzeilig machen — und dann steht die Uhrzeit neben
   einem auf vier Woerter gekuerzten Namen.

   Und die zwei Zeilen waren ohnehin keine zwei Saetze: in der schmalen
   Spalte brachen beide ab („Guten Tag Herr Brenner, wir / hatten letztes
   Jahr im Oktobe…"). Eine abgeschnittene Zeile ist eine Auskunft, zwei
   abgeschnittene Zeilen sind zwei.

   `--abstand-1` UND KEINE GERECHNETE ZAHL. Jitters 5,26 % waeren bei 77 px
   4,1 und bei 80 px 4,2 — beides rundet auf die 4 px, die schon auf der
   Abstandsleiter stehen. Eine Zahl von der Leiter schlaegt eine gerechnete,
   die zufaellig danebenliegt.

   KEIN RADIUS. Jitters gewaehlter Eintrag hat gemessen Radius 0, und
   `--radius-navi` steht bei uns aus demselben Grund auf 0. Die Zeile ist
   eine Flaeche, die faerbt, wenn man sie anfasst — keine Kachel. */
.posteingang__zeilen {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-1);
}

.posteingang__zeilen .zeile {
  /* `scroll-snap-align` IST AM 10.08.2026 GEFALLEN. Es gehoerte zum eigenen
     Bildlauf der Liste („oben steht immer eine GANZE Zeile"); seit die Liste
     mit dem Dokument rollt, gibt es keinen Rasterpunkt mehr, an dem es
     wirken koennte. Eine Regel, die nichts tut, sieht aus, als taete sie
     etwas. */
  /* Der Strich faellt. Er war die Trennung, jetzt ist es die Luft. Zwei
     Traeger fuer dieselbe Aussage sind einer zu viel — und der Strich ist
     der, den die Vorlage nicht hat. */
  border-bottom: 0;
}

/* EINE ZEILE VORSCHAU, IN BEIDEN ZUSTAENDEN. Die Mindesthoehe von zwei
   Zeilen faellt mit: sie hielt den Takt ruhig, solange der Text umbrechen
   konnte. Bei einer geklammerten Zeile haelt ihn die Zeile selbst. */
.posteingang__zeilen .zeile__text {
  -webkit-line-clamp: 1;
  min-height: 0;
}

/* ===================================================================
   DIE GRUPPENUEBERSCHRIFT DER LISTE — 10.08.2026
   ===================================================================

   [gemessen] Jitters `_sectionHeader_127mq_72`: 13 px, Gewicht 600,
   `#6e6e73`, `padding: 7px 0 7px 23px`, Zeilenhoehe 24, Kasten 38.

   DIESELBEN VIER WERTE STEHEN SCHON AN `.leiste__ueberschrift` — dort
   gliedern sie Jitters Navigation, hier gliedern sie unsere Datenliste.
   Eine Vorlage, ein Satz Zahlen, dieselben Token. Wer einen davon aendert,
   aendert beide, und das ist richtig so.

   DER EINZUG IST DER EINZIGE UNTERSCHIED, und er folgt derselben Regel wie
   dort. Jitters 23 px sind ein Pixel weniger als der Einzug seines
   Eintrags, weil die Ueberschrift mit dem SYMBOL fluchtet und nicht mit dem
   Wort. Unser Symbol ist das Kanalzeichen, und das steht beim linken
   Polster der Zeile — `--abstand-5`, also 24 px. Die Regel ist uebernommen,
   die Zahl ist unsere.

   WAS DIE GRUPPE BEDEUTET, ist der Tag. Bei Jitter ist es ein Bereich der
   Anwendung; eine Datenliste braucht etwas, das sie wirklich teilt. Die
   Herleitung und die Zahlen stehen in `posteingang.ts` bei `tagName`.

   SIE SCHIEBT SICH NICHT UNTER DIE VORIGE GRUPPE. `position: sticky` lag
   nahe und ist verworfen: die Liste hat eine Ausblendkante unten und einen
   eigenen Bildlauf, und eine klebende Zeile darin haette drei Kanten
   uebereinander. Die Ueberschrift ist eine Marke im Fluss, kein Reiter. */
.posteingang__tag {
  margin: 0;
  padding: var(--polster-ueberschrift) 0 var(--polster-ueberschrift) var(--abstand-5);
  font-size: var(--groesse-mikro);
  font-weight: var(--schrift-halbfett);
  line-height: calc(var(--hoehe-eintrag) - var(--polster-ueberschrift) * 2);
  color: var(--farbe-text-gedaempft);
  /* Die erste Ueberschrift steht direkt unter der Chipzeile und braucht
     dort keine zusaetzliche Luft — der Abstand kommt aus dem `gap` der
     Liste, wie bei jeder Zeile.
     `scroll-snap-align` ist am 10.08.2026 mit dem eigenen Bildlauf der
     Liste gefallen. */
}

/* Die Staffelung beim Aufbau endet nach acht Zeilen — Regel 12. Bei 500
   Zeilen und 40 ms Versatz wären es zwanzig Sekunden. */
.zeile--gestaffelt {
  animation: zeile-herein var(--dauer-mittel) var(--kurve) backwards;
  animation-delay: calc(var(--staffel) * var(--staffel-versatz));
}

@keyframes zeile-herein {
  from {
    opacity: 0;
    transform: translateY(4px);
  }
}

/* WEITERE LADEN. Die Liste lädt begrenzt statt virtualisiert - der Meister
   arbeitet den oberen Teil ab. Der Knopf steht als letzter Listeneintrag
   und scrollt mit; er schwebt nicht, sonst verdeckte er dauerhaft eine
   Zeile für einen Fall, der selten eintritt. */
.posteingang__mehr {
  display: flex;
  justify-content: center;
  padding: var(--abstand-3) var(--abstand-3) var(--abstand-5);
}

.posteingang__mehr .knopf {
  text-decoration: none;
}

/* ===================================================================
   DER GEFILTERTE LEERZUSTAND ROLLT IN SICH — 10.08.2026
   ===================================================================

   `posteingang.ts` behauptet an dieser Stelle seit dem 02.08.2026: „Auch
   hier ein eigener Bildlauf statt starrer Höhe: die Tafel und der Satz
   zusammen können bei großer Schrift länger werden als der
   Inhaltsbereich, und dann soll gescrollt und nicht abgeschnitten
   werden."

   ES GAB ZU `.posteingang__leer` KEINE EINZIGE REGEL. Der Vermerk hat
   acht Tage lang einen Bildlauf beschrieben, den niemand gebaut hat —
   dieselbe Erscheinungsform wie bei der Ausblendkante der Chipzeile
   (05.08.2026) und bei den zwei Deckeln am Antwortfeld (10.08.2026).

   Was das gekostet hat, gemessen bei 1440 x 900 auf
   `?filter=k-yt,anfrage`:

     Listenspalte      270,9 px
     Leerzustand darin 434,1 px   —  163 px zu viel
     Dokument         1039   px in einem 900-px-Fenster

   Und am Laptop trägt der Körper `overflow: hidden`. Der Knopf „Filter
   zurücksetzen" stand damit 139 px unter der Fensterkante, in einem
   Zustand, dessen EINZIGER Zweck es ist, diesen Knopf anzubieten. Der
   Meister filtert daneben und kommt nicht mehr heraus.

   Nebenbei stand auch der Seitentitel 103 px zu tief (y 240 statt 137):
   ein überlaufender Inhalt in einer Spalte fester Höhe schiebt sich
   nach oben aus ihr heraus. Das war das Sichtbare an einem Fehler, der
   unten stattfand. */
.posteingang__leer {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
}

/* FILTER TRIFFT NICHTS. Kein Leerbild: der Posteingang ist nicht leer, er
   ist nur gefiltert. Eine Zeichnung würde hier das Falsche behaupten. */
.posteingang__nichts {
  margin: 0;
  padding: var(--abstand-5) var(--abstand-4);
  text-align: center;
  color: var(--farbe-text-gedaempft);
}

/* --- Das Gespräch ------------------------------------------------- */

/* DER LESEBEREICH LIEGT AUF GRAU — 04.08.2026, angesagt: der Stil
   unserer Website, eins zu eins, auf allen Seiten, "mehr grosse
   graue Flaechen". Dies ist die groesste zusammenhaengende Flaeche
   im Produkt: bei 1440 px und ohne gewaehltes Gespraech misst sie
   rund 880 x 600 px und stand bis heute leer in Weiss.

   KEIN WRAPPER, SONDERN DIE FLAECHE SELBST. Ein `.abschnitt` mit
   Polsterung um diesen Bereich haette die Hoehenkette gebrochen -
   die Liste und das Gespraech scrollen in sich, und das haengt an
   `min-height: 0` durch die ganze Kette. Eine Farbe kostet die
   Kette nichts.

   GEMESSEN, WEIL ES KNAPP IST: --farbe-text-gedaempft haelt auf
   dieser Flaeche 4,50:1. Das ist die Auflage auf den Punkt und
   nicht darueber. Wer den Grauton dunkler macht, reisst sie - der
   Wert ist damit gebunden, nicht frei. Auf Weiss waren es 5,07:1.
   Die Paarung laeuft seit dem 03.08. auf /einstellungen und ist
   dort in 34 Messungen gruen. */
.gespraech {
  display: flex;
  flex-direction: column;
  min-height: 0;
  min-width: 0;
  background: var(--farbe-flaeche-gedaempft);
  /* 17 px — hier wird gelesen und geschrieben. */
  font-size: var(--groesse-text);
  /* ===================================================================
     DAS GESPRÄCH IST SEIN EIGENER BEHÄLTER — 10.08.2026
     ===================================================================

     Sein Kopf bricht auf zwei Zeilen um, wenn er zu eng wird. Bis heute
     hing das an der Breite der HÜLLE (39.999rem), und das war richtig,
     solange die Inhaltsspalte die Hülle minus 144 px war.

     Seit die Spalte portalweit auf Jitters Maß steht, stimmt es nicht
     mehr: bei 1440 px Fenster sind es 861 px Inhalt, davon 352 Liste und
     32 Lücke — dem Gespräch bleiben 477. Die Hülle meldet 1440, der Kopf
     bekam also die einzeilige Form und brach mitten im Namen um
     („Familie / Hoffmeister") und schob „Löschen" auf eine zweite Reihe.

     Ein Umbruch, der an der Fensterbreite hängt, obwohl er von der
     Spaltenbreite abhängt, ist an der falschen Zahl festgemacht. Jetzt
     fragt er den Behälter, in dem er wirklich steht. */
  container-type: inline-size;
  container-name: gespraech;
}

/* AM HANDY: über der Liste, nicht an ihrer Stelle. Die Liste bleibt im
   Dokument und behält ihren Bildlauf.
   Ohne Skript greift das trotzdem: dann ist `data-offen` schon vom
   Server gesetzt, weil der Verweis `?nachricht=` geladen wurde. */
/* ===================================================================
   DIE UEBERLAGERUNG HAENGT AM FENSTER, NICHT AM INHALTSBEREICH
   ===================================================================

   HIER STAND `position: absolute` mit dieser Begruendung: „nicht fix am
   Fenster. Fix hiess: auch hinter der Reiterleiste. Gemessen bei 390 px —
   das Antwortfeld endete 12 px darunter, das Gespraech 76 px."

   Die Begruendung war richtig und ist gegenstandslos: DIE REITERLEISTE IST
   AM 03.08.2026 GEFALLEN (siehe den Vermerk bei `.spalte__leiste`). Was
   blieb, war ihr Schatten — eine Regel, die vor etwas ausweicht, das es
   nicht mehr gibt.

   WAS SIE GEKOSTET HAT, gemessen bei 390 x 844:

     Bezugsrahmen der Ueberlagerung   4543 px  (so hoch wie die LISTE)
     Gespraech daraufhin              4567 px
     Verlauf darin                    4286 px
     Antwortfeld bei                y 4650 px  in einem 844-px-Fenster

   Das Antwortfeld ist „die meistgenutzte Flaeche im ganzen Produkt"
   (Regel 03) und stand damit 4,5 Bildschirmhoehen unter der Oberkante,
   hinter leerem Grau. Wer am Handy antworten wollte, musste erst an der
   ganzen Liste vorbeiscrollen, die er gerade verlassen hatte.

   `position: fixed` LOEST ES, und das ist gemessen und nicht gefolgert:
   `container-type: inline-size` an `.huelle` faengt es NICHT ein. Nach der
   Umstellung steht die Ueberlagerung bei y 0 mit 844 px Hoehe, und das
   Antwortfeld bei y 716 — im Bild. Der Verlauf darueber rollt in sich,
   der Kopf steht oben, der Kasten zum Schreiben unten: die Bauform jedes
   Nachrichtenprogramms, und der Grund, aus dem sie ueberall dieselbe ist.

   z-index 44 UND NICHT 40: 40 ist die Kopfzeile, und die ist `fixed` —
   bei Gleichstand entschiede die Reihenfolge im Markup, und das ist keine
   Entscheidung, sondern ein Zufall. 45 ist der Schleier der Schublade und
   50 die Schublade selbst; beide gehoeren darueber, denn die Navigation
   ist der Weg aus dem Gespraech heraus. */
.posteingang[data-offen='ja'] .gespraech--offen {
  position: fixed;
  inset: 0;
  z-index: 44;
}

/* AM HANDY ZEIGT DIE RECHTE SPALTE NUR, WAS DER MEISTER GEWÄHLT HAT.
   Geändert am 02.08.2026: hier stand `.gespraech:not(.gespraech--offen)`,
   also „zeig sie, sobald etwas offen ist". Seit der Server IMMER die erste
   passende Nachricht vorwählt — damit rechts bei 1440 px keine 493.528 px²
   tote Fläche stehen —, ist „offen" nicht mehr dasselbe wie „gewählt".

   `data-offen` sagt genau das: nicht „es ist etwas offen", sondern „DER
   MEISTER hat etwas geöffnet". Am Handy hängt daran die Überlagerung, und
   eine Vorwahl darf sie nicht auslösen. */
.posteingang[data-offen='nein'] .gespraech {
  display: none;
}

.gespraech__kopf {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: var(--abstand-3);
  padding: var(--abstand-3) var(--abstand-4);
  background: var(--farbe-flaeche);
  border-bottom: var(--randbreite) solid var(--farbe-rand);
}

/* ===================================================================
   AM SCHMALEN FENSTER TRAEGT DER KOPF ZWEI ZEILEN — 10.08.2026
   ===================================================================

   Was eine Zeile braucht, ist gerechnet und nicht geschaetzt — jeder
   Posten ist die gemessene WUNSCHBREITE des Stuecks bei 390 px:

     Zurueck        48
     Kanalzeichen   44
     Wer           159,8   („Familie Hoffmeister" ueber dem Kanalnamen)
     Handlungen    287,5   (Erledigt 82 · Archivieren 109,7 · Loeschen 87,8)
     drei Luecken   36
     Polster        32
     ----------------------
     zusammen      607,3

   Unter 640 px passt das nicht mehr, und was dann geschah, stand im Bild
   und in keiner Zahl: gemessen war der Kopf 153 px hoch, der Absender auf
   44,4 px Breite gequetscht und ueber 107,4 px Hoehe in vier Stuecke
   gebrochen — „Tobi / as / Renn / er". Die drei Handlungen stapelten sich
   untereinander, und das Etikett lag als Bruchstueck quer darueber.

   ZWEI ZEILEN STATT DREI. Oben, wer schreibt und woher — das ist die
   Auskunft, wegen der man aufschlaegt. Unten die drei Handlungen,
   rechtsbuendig, in einer Zeile: 287,5 von 318 verfuegbaren Pixeln. Die
   Etiketten haben den Kopf verlassen (siehe dort).

   `flex: 1 0 100%` UND NICHT `flex-wrap` ALLEIN. Ein Umbruch, der nur
   passiert, wenn es zu eng wird, ist ein Umbruch, der je nach Name
   passiert oder nicht — und ein Kopf, dessen Hoehe am Absender haengt,
   ist genau der schwankende Takt, den `.zeile__text` seit dem 02.08.2026
   verhindert. Hier ist die zweite Zeile eine Entscheidung.

   DIE ZAHL IST DIE RECHNUNG SELBST — berichtigt am 10.08.2026.

   Hier stand `@container huelle (max-width: 39.999rem)`, also 640 px
   HUELLENbreite, mit der Begruendung „kein zweiter Wert dreissig Pixel
   neben dem Umbruchpunkt der Reiterleiste". Das war richtig gerechnet und
   an der falschen Groesse festgemacht: gefragt ist, wie breit das
   GESPRAECH ist, nicht das Fenster.

   Seit die Inhaltsspalte portalweit auf Jitters Mass steht, laufen die
   beiden auseinander. Bei 1440 px Fenster sind es 861 px Inhalt, davon
   352 Liste und 32 Luecke — dem Gespraech bleiben 477. Die Huelle meldete
   1440, der Kopf bekam die einzeilige Form, und im Bild stand „Familie /
   Hoffmeister" mit „Loeschen" auf einer zweiten Reihe.

   560 px IST DIE SUMME VON OBEN, aufgerundet auf einen glatten Wert:
   559,3 braucht eine Zeile, und was darunter liegt, braucht zwei. Die
   Zahl steht damit nicht neben der Rechnung, sie IST sie.

   Gerendert: 390 px Fenster gibt 390 px Gespraech (zwei Zeilen), 1440
   gibt 477 (zwei Zeilen), 1920 gibt 918 (eine Zeile). */
@container gespraech (max-width: 560px) {
  .gespraech__kopf {
    flex-wrap: wrap;
    row-gap: var(--abstand-2);
  }

  .gespraech__handlungen {
    flex: 1 0 100%;
  }
}

/* Nur in der Werkstatt: die sechs Toene nebeneinander. */
.etikettenreihe {
  display: flex;
  flex-wrap: wrap;
  gap: var(--abstand-2);
}

/* ===================================================================
   DIE ETIKETTEN STEHEN IM VERLAUF, NICHT IM KOPF — 10.08.2026
   ===================================================================

   Sie haben in acht Tagen drei Orte gehabt, und jeder Umzug hatte einen
   gemessenen Grund:

     bis 31.07.  in der LISTE, unter jeder Zeile — die Liste las sich als
                 Wand.
     bis 02.08.  im Kopf mit `flex-wrap: wrap` — der Kopf war bei 390 px
                 119,8 px hoch = 17,4 % der Lesehoehe (Referenzband 6,6
                 bis 12,7 %), und die Hoehe kam von der zweiten Zeile der
                 Etiketten.
     bis 10.08.  im Kopf als seitwaerts rollender Streifen. Das hat den
                 Kopf am LAPTOP auf 72,4 px gebracht und am Handy nichts
                 geloest: dort blieben ihnen gemessen 56,9 px von 150,6
                 gebrauchten, und was man sah, war das Bruchstueck „ung"
                 quer ueber dem Absendernamen.

   Der Kopf hat bei 390 px 318 px Inhaltsbreite. Zurueck (48), Kanalzeichen
   (44) und Wer (159,8) sind 275,8 und passen; die drei Handlungen sind
   287,5 und passen auf eine zweite Zeile. Die Etiketten passen auf keine
   von beiden. Eine dritte Zeile ist keine Antwort — mit ihr war der Kopf
   153 px hoch.

   ALSO STEHEN SIE JETZT UEBER DER ERSTEN BLASE. Sie sagen, wofuer die KI
   diese Nachricht haelt; der Satz, an dem sie das festgemacht hat, steht
   darunter. Aussage und Beleg stehen uebereinander, und sie rollen
   zusammen weg, sobald der Meister liest.

   LINKSBUENDIG UND MIT UMBRUCH. Der Streifen mit eigenem Bildlauf war die
   Antwort auf einen engen Kopf; hier ist die ganze Breite da. Zwei
   Etiketten brauchen 150,6 px, der Verlauf ist bei 390 px 318 px breit.
   Ein Bildlauf, der nichts zu rollen hat, ist trotzdem einer. */
.gespraech__etiketten {
  display: flex;
  flex-wrap: wrap;
  gap: var(--abstand-2);
  min-width: 0;
  /* Der Verlauf ist eine Spalte mit `gap`; der Abstand nach unten kommt
     von dort. Ein eigener waere derselbe zweimal. */
  margin: 0;
}

.gespraech__etiketten .etikett {
  flex: 0 0 auto;
}

.gespraech__zurueck {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  /* Handschuhmaß, wie die Reiter unten. */
  width: 48px;
  height: 48px;
  margin-left: calc(var(--abstand-2) * -1);
  border-radius: var(--radius-rund);
  color: var(--farbe-text);
  touch-action: manipulation;
}

/* Ergänzt am 02.08.2026: das einzige Bedienelement des Kopfes hatte als
   einziges keinen Übergang und sprang. */
.gespraech__zurueck {
  transition: background-color var(--dauer-schnell) var(--kurve);
}

.gespraech__zurueck:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-flaeche-gedaempft);
}

.gespraech__zurueck:is(:active, .zeige-aktiv) {
  background: var(--farbe-rand);
}

.gespraech__wer {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.gespraech__absender {
  font-weight: var(--schrift-halbfett);
  overflow-wrap: anywhere;
}

.gespraech__kanal {
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

/* DER WARTEZUSTAND — 03.08.2026. Kein Leerzustand: links liegen
   Nachrichten, hier ist nur keine gewaehlt. Deshalb steht er ruhiger als
   ein `zustandsblock()` — Zeichen, Satz, Einordnung, kein Knopf. */
.gespraech__warten {
  margin: auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--abstand-3);
  padding: var(--abstand-6);
  text-align: center;
}

/* Das Zeichen traegt nichts — es ist die Flaeche, die den Satz mittig
   haelt, statt ihn allein in 94 % Weiss stehen zu lassen. Deshalb leise
   und deshalb `aria-hidden` im Markup. */
/* DER KREIS IST WEISS, SEIT DIE FLAECHE GRAU IST — 04.08.2026.
   Hier stand `--farbe-flaeche-gedaempft`, also derselbe Ton wie
   der Lesebereich seit heute traegt. Der Kreis war damit weg:
   grau auf grau. Beim Blick auf die echte Seite aufgefallen, in
   keiner Zahl — eine Flaeche, die verschwindet, hat immer noch
   ihre Groesse, verschiebt nichts und wirft keinen Fehler.

   ER DREHT SICH UM, statt zu verschwinden: vorher der graue Kreis
   auf Weiss, jetzt der weisse auf Grau. Dasselbe Verhaeltnis,
   dieselben zwei Toene. */
.gespraech__warten-zeichen {
  display: grid;
  place-items: center;
  width: var(--zeichen-warten);
  height: var(--zeichen-warten);
  border-radius: var(--radius-rund);
  background: var(--farbe-flaeche);
  color: var(--farbe-zeichnung);
}

.gespraech__warten-zeichen svg {
  width: var(--zeichen-warten-innen);
  height: var(--zeichen-warten-innen);
}

.gespraech__nichts {
  margin: 0;
  color: var(--farbe-text);
  font-size: var(--groesse-huelle-gross);
  font-weight: var(--schrift-halbfett);
  text-align: center;
}

.gespraech__warten-satz {
  margin: 0;
  max-width: 34ch;
  color: var(--farbe-text-gedaempft);
  text-align: center;
}

.gespraech__verlauf {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  /* DIE VORGABE GILT DEM HANDY — `contain` haelt einen Rollschritt am Rand
     des Verlaufs davon ab, die Seite DAHINTER mitzureissen, die hinter der
     `position: fixed`-Ueberlagerung des Gespraechs liegt (siehe den Vermerk
     oben an dieser Regel). Am Laptop nimmt der 60-rem-Behaelter das zurueck
     — dort ist die Begruendung falsch, und `contain` hat dort bis zum
     14.08.2026 zwei gemeldete Funde verursacht, siehe die Gegenregel. */
  overscroll-behavior: contain;
  display: flex;
  flex-direction: column;
  gap: var(--abstand-3);
  margin: 0;
  padding: var(--abstand-4);
  list-style: none;
  /* ==================================================================
     DIE AUSBLENDKANTE UNTEN IST WEG — 11.08.2026, angesagt
     ==================================================================

     „den gradient unten weg das unten nichts abgeschnitten ist von den
     Nachrichten"

     HIER STAND:
       mask-image: linear-gradient(to bottom, currentcolor
                   calc(100% - var(--ausblendkante)), transparent)

     Und der Vermerk daneben war richtig — für die Bauart, für die er
     geschrieben wurde. Am 02.08.2026 stand der Verlauf OBEN und lief nach
     unten weiter; die Kante hieß dort „hier geht es weiter" und verhinderte,
     daß ein Satz ohne Ankündigung an einer 1-px-Linie abbricht.

     SEIT HEUTE ROLLT DER VERLAUF ANS ENDE, und damit hat sich der Grund
     gedreht: unten ist jetzt das ENDE des Gesprächs. Die Kante hat also
     genau die NEUESTE Blase verblaßt — die, um die es geht, und die, auf die
     die KI antwortet. Eine Ausblendung, die „es geht noch weiter" sagt, wo
     nichts mehr weitergeht, ist keine Ankündigung, sondern ein Fehler im
     Bild.

     KEINE KANTE NACH OBEN ALS ERSATZ. Sie wäre die logische Umkehrung und
     wurde nicht bestellt — und oben stößt der Verlauf an den Kopf mit
     Absender und Handlungen, nicht an eine Linie im Nichts. Da kündigt die
     Kachelkante selbst an, daß es weitergeht. */
  /* KEIN `scroll-behavior: smooth`.

     HIER STAND ES, mit dem Vermerk „Der Verlauf springt ans Ende — Bewegung
     B4". Das hat es nie getan: `smooth` macht ein Rollen weich, es rollt
     nicht von selbst. Wieder ein Vermerk, der eine Regel beschreibt, die es
     nicht gibt — dieselbe Erscheinungsform wie die Ausblendkante der
     Chipzeile, die seit dem 02.08.2026 `none` gemessen hat.

     Was der Vermerk behauptet, tut seit dem 11.08.2026 `posteingang.js`. Und
     weich darf es dabei NICHT sein: beim Öffnen soll der Verlauf am Ende
     STEHEN, nicht sichtbar dorthin fahren. Deshalb rollt das Skript mit
     `behavior: 'instant'`, und diese Zeile ist weg statt überschrieben. */
  /* ==================================================================
     DER VERLAUF STEHT IN EINER LESESPALTE — 10.08.2026
     ==================================================================

     Gemessen bei 1920 px: die Gesprächsspalte ist 1246,7 px breit, die
     Blase darin 544. Bei einem eingehenden Gespräch sah das nach 703 px
     leerem Grau aus — und mit einer Antwort daneben ist es schlimmer,
     denn die steht rechts außen: zwei Leute, die über eine Schlucht von
     700 px miteinander reden.

     `--gespraech-spalte` ist keine neue Entscheidung, sondern die Summe
     zweier alter: Blase (`--lese-breite`) plus die feste Gasse zwischen
     „von ihm" und „von uns" (`--abstand-6`). Dazu das eigene Polster,
     damit im Kasten wirklich 576 px Inhalt stehen und die Blase ihre
     vollen 544 bekommt.

     LINKSBÜNDIG UND NICHT MITTIG. Mittig sähe aufgeräumter aus und wäre
     falsch: die erste Blase stünde dann 335 px rechts von dem Namen im
     Kopf, der sie geschrieben hat. Das Produkt hat dafür eine Regel, und
     sie steht bei `.spalte` — „eine Kante, nicht drei". Der Absender im
     Kopf, seine Blase, die Etiketten darüber und das Antwortfeld darunter
     stehen auf derselben. */
  max-width: calc(var(--gespraech-spalte) + var(--abstand-4) * 2);
  width: 100%;
}

.blase {
  /* SCHMALER — 31.07.2026, Anmutung. Gemessen: unsere Blase lief auf
     81 % der Spalte (639 von 784 px), Laters auf rund 53 %. Bei 85 %
     ist eine Blase keine Blase mehr, sondern ein Absatz mit runden
     Ecken: das Auge sieht keine zwei Spalten, sondern einen Brief.
     Die Seite, auf der sie steht, ist dann der einzige Unterschied
     zwischen „von ihm" und „von uns" — und Seite allein ist ein
     schwacher Traeger.

     DER PROZENTSATZ IST WEG — 02.08.2026, und das ist der Kern dieses
     Kapitels. `58%` ist ein Anteil der Spalte und sagt nichts darüber,
     ob man den Text lesen kann. Gemessen: bei 390 px trug die Blase
     207,6 px und damit **15,9 Zeichen je Zeile**. Zillow liegt bei
     rund 48, Intercom bei 57.

     Jetzt ist es eine Zahl, die zum Lesen taugt, minus eine feste
     Gasse: `--lese-breite` (544 px) am Laptop, sonst die volle Breite
     minus 32 px. Bei 390 px sind das 294 px = 34,1 Zeichen (+114 %),
     bei 1440 px 544 px = 59,6 Zeichen.

     Die Gasse bleibt FEST, weil sie genau eine Aufgabe hat: „von ihm"
     von „von uns" zu trennen. Dafür genügen 48 px. Ein Prozentsatz
     nähme am Handy 150 px — dort, wo am wenigsten Platz ist. */
  max-width: min(var(--lese-breite), 100% - var(--abstand-6));
  padding: var(--abstand-3) var(--abstand-4);
  border-radius: var(--radius-gross);
  background: var(--farbe-flaeche);
  border: var(--randbreite) solid var(--farbe-rand);
}

/* Was WIR geschrieben haben, steht rechts und trägt die Handlungsfarbe
   als Fläche — mit weißer Schrift. Nicht als Text auf getönter Fläche:
   das kann die Handlungsfarbe nicht, siehe die Regel in Bereich 11. */
.blase--wir {
  align-self: flex-end;
  background: var(--farbe-primaer);
  border-color: var(--farbe-primaer);
  color: var(--farbe-primaer-kontrast);
}

.blase__text {
  margin: 0;
  overflow-wrap: anywhere;
  /* KEINE SILBENTRENNUNG IN EINER NACHRICHT — 31.07.2026, Anmutung.
     `hyphens: auto` gilt seit Zeile 100 fuer die ganze Seite; in
     einer Sprechblase liest sich das wie ein Zeitungsspalte. Bei
     keiner der fuenf Referenzen wird in einer Nachricht getrennt.
     Dritter Ort mit demselben Fund nach der Kartenaufschrift in
     Bereich 18 und der Begruessung in Bereich 02 — die Voreinstellung
     ist offenbar fuer Fliesstext gedacht und passt nur dort. */
  hyphens: manual;
}

/* 5,34:1 STATT 3,03:1 — geaendert am 02.08.2026. `--farbe-text-leise` hielt
   bei 13 px gegen die weisse Blase 3,03:1, und 13 px sind Fliesstextgroesse:
   dort gilt 4,5:1. Auf der eigenen Blase bleibt es weiss auf der Primaerfarbe
   und damit bei 4,72:1. */
.blase__zeit {
  display: block;
  margin-top: var(--abstand-1);
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

.blase--wir .blase__zeit {
  color: var(--farbe-primaer-kontrast);
}

/* --- Der Bestätigungsstreifen nach dem Senden --------------------- */
/* 320 px unten rechts, 16 px zu beiden Kanten. Die Breite ist gerechnet:
   „Antwort gesendet · Rückgängig" braucht bei 15 px rund 250 px Text, dazu
   Haken, Kreuz und Polster. Zillow setzt seinen Streifen auf 23,7 % der
   Inhaltsbreite (269 px bei 1136), Front auf 17,8 % (202 px) — wir liegen
   darüber, weil unser Text zwei Angaben trägt und nicht eine.

   ER VERSCHWINDET NICHT VON SELBST. Ohne Skript gibt es keine Standzeit, und
   eine erfundene wäre schlimmer als keine: der Meister sähe die Bestätigung
   je nach Lesegeschwindigkeit oder gar nicht. Er trägt ein Schließkreuz und
   geht beim nächsten Seitenaufbau. Die Referenz gibt hier ohnehin nichts her
   — in beiden Ablauf-Sätzen ist die Standzeit als Lücke vermerkt.

   Auf `--farbe-text` mit weißer Schrift: 13,2 : 1. Das ist die einzige
   dunkle Fläche im Produkt, und sie ist es genau dafür — eine Bestätigung
   muss sich vom Papier abheben, auf dem gearbeitet wird. */
.gesendet {
  position: absolute;
  right: var(--abstand-4);
  bottom: var(--abstand-4);
  z-index: 45;
  display: flex;
  align-items: center;
  gap: var(--abstand-3);
  width: min(20rem, calc(100% - var(--abstand-6)));
  box-sizing: border-box;
  padding: var(--abstand-3) var(--abstand-4);
  border-radius: var(--radius-standard);
  background: var(--farbe-text);
  color: var(--farbe-primaer-kontrast);
  font-size: var(--groesse-klein);
  box-shadow: var(--schatten-2);
  animation: tritt-ein var(--dauer-mittel) var(--kurve) backwards;
}

.gesendet__haken {
  display: inline-flex;
  flex: 0 0 auto;
}

.gesendet__wort {
  flex: 1 1 auto;
  min-width: 0;
}

.gesendet__zurueck,
.gesendet__weg {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  color: var(--farbe-primaer-kontrast);
  font-weight: var(--schrift-halbfett);
}

.gesendet__weg {
  min-width: 44px;
  margin-right: calc(var(--abstand-2) * -1);
  border-radius: var(--radius-rund);
}

/* DIE NEUE BLASE KOMMT AN, sie ist nicht einfach da. Dasselbe Keyframe wie
   überall — Regel 12 nennt 200 ms für einen Zustandswechsel. */
.blase--neu {
  animation: tritt-ein var(--dauer-mittel) var(--kurve) backwards;
}

/* --- Das Antwortfeld ---------------------------------------------- */
/* Die meistgenutzte Fläche im ganzen Produkt. Volle Breite, EIN Knopf,
   keine Werkzeugleiste — Regel 03. */

/* `0 1 auto` UND EINE OBERGRENZE — 02.08.2026. Der Antwortbereich nahm bei
   390 px gemessen 302,8 px = 43,9 % der Lesehoehe, waehrend der Verlauf
   darueber nur 267,4 px hatte: der Meister sah weniger von dem, was er
   beantwortet, als von dem Feld, in das er schreibt. Intercom haelt seinen
   Antwortkasten bei 14,2 % der Hoehe, Later bei 7,6 %, und bei beiden ist der
   Verlauf IMMER groesser als die Antwort. */
/* DER BILDLAUF IST AM 03.08.2026 AUS DEM KASTEN INS FELD GEWANDERT, und
   das war ein echter Fehler, kein Feinschliff.

   Gemeldet: „ich kann nicht runterscrollen, obwohl der Sendenknopf
   abgeschnitten ist." Nachgemessen bei 1440×760 lag der Knopf unter der
   Fensterkante — erreichbar nur mit der Tabulatortaste.

   URSACHE: `max-height: 40%` mit `overflow-y: auto` liess den Kasten sich
   SELBST abschneiden. Der Knopf steht unter dem Feld, also war er das
   erste, was verschwand — der Kasten versteckte seinen eigenen
   Absendeknopf, und zwar genau dann, wenn das Fenster knapp war.

   Die Obergrenze oben bleibt richtig und gilt weiter; sie gehoert nur an
   das FELD. Was scrollen soll, ist der Verlauf und der Text, den man
   schreibt — nie der Rahmen, in dem die Handlung sitzt. */
.antwort {
  flex: 0 0 auto;
  display: flex;
  flex-direction: column;
  gap: var(--abstand-2);
  padding: var(--abstand-3) var(--abstand-4);
  padding-bottom: calc(var(--abstand-3) + env(safe-area-inset-bottom, 0px));
  background: var(--farbe-flaeche);
  border-top: var(--randbreite) solid var(--farbe-rand);
}

/* DIE HERKUNFTSZEILE. Klein, gedaempft, ueber dem Feld — bei Later
   steht dort „Replying as: @…" in derselben Groesse. Sie ersetzt einen
   ganzen Kasten mit zwei Knoepfen. */
.antwort__herkunft {
  display: flex;
  align-items: center;
  /* WAR `space-between` — 11.08.2026, im Bild gefunden.

     Solange die Zeile EIN Kind hatte, war das dasselbe wie `flex-start`: ein
     Element ganz links. Seit die Blätterverweise dazugekommen sind, sind es
     zwei — und dann drückt `space-between` „Älterer" bei 1920 px an die
     äußerste rechte Kante, 660 px vom Satz entfernt, zu dem er gehört.
     Zwei Angaben über dieselbe Sache stehen nebeneinander, nicht an zwei
     Enden der Kachel. Für den Ein-Kind-Fall ändert sich nichts. */
  justify-content: flex-start;
  gap: var(--abstand-4);
  margin: 0;
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

/* Zwischen den GESPEICHERTEN Vorschlägen blättern. Zwei Verweise, weil
   das Lesen eines schon vorhandenen Vorschlags nichts kostet — einen NEUEN
   holen ist ein Knopf in der Zeile darüber und ruft das Modell. */
.antwort__blaettern {
  display: flex;
  gap: var(--abstand-3);
}

/* ===================================================================
   DIE KI-ZEILE — 11.08.2026
   ===================================================================

   „aw mit ki formulieren etc und ann ließt ki den geasmten verlauf"

   ÜBER DEM FELD UND NICHT IM FUSS. Im Fuß stünden „Antwort vorschlagen",
   „Auf Termin einladen" und „Senden" in einer Zeile — Regel 09 läßt je
   Gruppe genau einen gefüllten Knopf zu, und zwei Umrisse plus ein Vollton
   sind keine Gruppe mehr, sondern eine Werkzeugleiste. Oben ist außerdem
   die Reihenfolge der Handlung: formulieren, lesen, senden.

   ===================================================================
   AM HANDY UNTEREINANDER UND GLEICH BREIT — 11.08.2026, angesagt
   ===================================================================

   „auf mobile soll beides bitte gleich sein und nicht so komisch
   verschoben"

   WAS ZU SEHEN WAR, bei 390 px gemessen: die Zeile hat 340 px innen, und
   `flex-wrap` legte den zweiten Knopf um. „KI" nimmt in der ersten Zeile
   14 px plus Abstand, also begann Knopf A bei x=47 und Knopf B in der
   zweiten Zeile bei x=25 — 22 px gegeneinander versetzt. Dazu 163 gegen
   152 px Breite. Zwei Knöpfe, die dasselbe tun, standen auf zwei Kanten in
   zwei Breiten.

   ZWEI SPALTEN WÄREN ZU KNAPP, und das ist gemessen und nicht geschätzt:
   340 px minus 8 px Fuge sind 166 px je Spalte, und „Nochmal vorschlagen"
   braucht 163. Anderthalb Pixel Luft heißt, daß jede Schriftabweichung den
   Knopf zweizeilig macht — und dann ist die Zeile 40 px höher statt gleich.

   UNTEREINANDER KOSTET KEINEN PIXEL. Es waren schon zwei Zeilen (y=493 und
   y=541, also 40 px Knopf und 8 px Fuge). Volle Breite ändert daran nichts,
   nur daß beide Knöpfe dann wirklich gleich sind: eine Kante, eine Breite.

   DAS WORT KOMMT DAFÜR IN DIE ZEILE DARÜBER. In derselben Zeile wie der
   erste Knopf wäre der wieder eingerückt — genau der Versatz, um den es
   geht. Es kostet 18 px und sagt, wessen Vorschlag das ist; ohne es sagen
   das nur die Aufschriften, und die sagen es nicht. */
.antwort__ki {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: var(--abstand-2);
  /* Eine Flex-Spalte ist von sich aus `min-width: auto` und kann nicht unter
     ihren Inhalt schrumpfen. Derselbe Vermerk steht an
     `.gespraech__handlungen` und an `.zeile__mitte`. */
  min-width: 0;
}

/* DAS WORT „KI" UND KEIN SYMBOL. Bereich 15 läßt genau vier Symbole allein
   einen Knopf tragen, und ein fünftes für „künstliche Intelligenz" gibt es
   nicht — es gäbe auch keines, das ein Meister ohne Erklärung liest. Zwei
   Buchstaben sagen, wessen Vorschlag das ist. */
.antwort__ki-wort {
  /* Nicht mitgestreckt: `align-items: stretch` an der Spalte machte aus zwei
     Buchstaben eine 340 px breite Zeile. Sichtbar ist das nicht, aber ein
     Element, das dreißigmal so breit ist wie sein Inhalt, ist eine Falle für
     jede spätere Regel, die daran ausrichtet. */
  align-self: flex-start;
  font-size: var(--groesse-mikro);
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--farbe-text-gedaempft);
}

/* Kleiner als ein Knopf im Fuß: diese zwei holen etwas, sie entscheiden
   nichts. Die Höhe folgt dem Navigationswort, damit die Zeile über dem Feld
   nicht höher wird als die Herkunftszeile daneben. */
.antwort__ki-knopf {
  min-height: var(--hoehe-navi-wort);
  padding-inline: var(--abstand-3);
  font-size: var(--groesse-mikro);
}

/* ===================================================================
   DIE ZWEI KI-KNOEPFE TRAGEN DIE HANDLUNGSFARBE — 18.08.2026, angesagt
   ===================================================================

   „KI-Antwort vorschlagen und auch Termin einladen, das sollte irgendwie
   vielleicht lila aussehen oder sowas, eine andere Farbe haben."

   LILA IST IM HAUS `--farbe-primaer`, die Handlungsfarbe. Sie steht schon auf
   der eigenen Sprechblase daneben — dieselbe Farbe fuer „das kommt von uns"
   und „das schreibt uns die KI vor" ist kein Zufall, sondern dieselbe
   Aussage.

   ALS RAND UND SCHRIFT, NICHT ALS FLAECHE. Der Vermerk oben nennt den Grund
   und er gilt unveraendert: „Kleiner als ein Knopf im Fuss: diese zwei holen
   etwas, sie entscheiden nichts." Zwei gefuellte lila Knoepfe ueber dem
   Antwortfeld waeren lauter als das Absenden darunter — und das Absenden ist
   die Handlung, um die es geht.

   `--farbe-primaer` HAELT 8,59:1 ALS SCHRIFT auf weisser Flaeche (gerechnet
   aus tokens.css, #481890 gegen #FFFFFF) und damit weit ueber den 4,5:1. Als
   Rand ueber den 3:1 aus WCAG 1.4.11 ohnehin.

   BEIM ANFASSEN FUELLT SICH DIE FLAECHE LEICHT, wie bei den drei Knoepfen in
   der Kopfzeile: die Farbe ist im Ruhezustand schon da, das Ueberfahren
   verstaerkt sie, statt eine neue einzufuehren. */
.antwort__ki-knopf.knopf--umriss {
  border-color: var(--farbe-primaer);
  color: var(--farbe-primaer);
}

/* OHNE `color` — von `zustandsmatrix.spec.ts` erzwungen, und zu Recht. Der
   erste Anlauf wiederholte hier `color: var(--farbe-primaer)`, also denselben
   Wert wie im Ruhezustand. „Kein Zustand fasst die Textfarbe an" hat das
   gemeldet: eine Deklaration, die nichts aendert, ist von einer, die etwas
   aendert, nicht zu unterscheiden — und beim naechsten Umbau haelt sie jemand
   fuer Absicht. Die Farbe steht im Ruhezustand und bleibt dort. */
.antwort__ki-knopf.knopf--umriss:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-primaer-hell-flaeche);
  border-color: var(--farbe-primaer);
}

/* ===================================================================
   AB 45rem BEHÄLTERBREITE: WIEDER EINE ZEILE
   ===================================================================

   Nicht 60rem, obwohl dort die zwei Spalten des Posteingangs beginnen: die
   KI-Zeile hängt nicht am Seitenraster, sondern an ihrem eigenen Platzbedarf.
   163 plus 8 plus 152 px sind 323 — sobald die Kachel das innen hat, steht
   beides nebeneinander, und das ist am Tablet quer schon der Fall. Ein
   Umbruch, der erst bei 60rem aufgeht, hielte die Knöpfe 15rem länger
   untereinander als nötig.

   Der Behälter ist die Hülle und nicht die Kachel: das Gespräch trägt keinen
   eigenen `container-type`, und ihm einen zu geben, um EINE Zeile zu
   schalten, wäre ein zweiter Bezugsrahmen für dieselbe Seite. */
@container huelle (min-width: 45rem) {
  .antwort__ki {
    flex-direction: row;
    align-items: center;
  }

  /* Nach Inhalt und nicht gestreckt: am Laptop ist Platz, und ein Knopf, der
     breiter ist als sein Wort, sieht aus wie eine Fläche mit Aufschrift. */
  .antwort__ki-knopf {
    flex: 0 0 auto;
  }
}

/* ===================================================================
   WENN DIE KI NICHTS GELIEFERT HAT
   ===================================================================

   EIN SATZ IM ANTWORTBEREICH UND KEINE FEHLERSEITE. Ein Modellaufruf
   scheitert im Betrieb regelmäßig — Zulauf, Zeitgrenze, abgeschaltet,
   Budget aufgebraucht. Jedes Mal steht ein Meister davor, der eine Antwort
   schreiben muß; ihn dafür auf eine Fehlerseite zu schicken hieße, seine
   Arbeit für unsere Panne zu unterbrechen. Die Nachricht bleibt offen, das
   Feld bleibt benutzbar, und der Satz sagt, ob ein zweiter Versuch Sinn hat.

   GEDÄMPFT UND NICHT ROT. Es ist keine Gefahr und kein Datenverlust,
   sondern eine ausgefallene Bequemlichkeit. Rot wäre die Farbe für
   „Löschen", und die trägt hier nichts. */
.antwort__kifehler {
  display: flex;
  align-items: center;
  gap: var(--abstand-2);
  margin: 0;
  padding: var(--abstand-2) var(--abstand-3);
  border-radius: var(--radius-klein);
  background: var(--farbe-flaeche-gedaempft);
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

/* DIE 44-PX-MINDESTHOEHE IST WEG — 02.08.2026. Sie stand hier, weil
   „Nochmal" ein Verweis IN der Herkunftszeile war; seit er ein Knopf neben
   „Senden" ist, traegt die Zeile nur noch Text und schrumpft von 44 auf
   20,5 px. Das ist die Haelfte der 32 px, die der Antwortbereich insgesamt
   verliert. */

.antwort__feld {
  width: 100%;
  box-sizing: border-box;
  min-height: 48px;
  /* DER DECKEL IST AM 03.08.2026 HIERHER GEWANDERT — vom Bereich ans
     Feld, und der lange Vermerk darunter erklaert, warum er einmal den
     umgekehrten Weg ging. Beide Male ging es um dieselbe Frage: WER
     schneidet ab?

     Am Bereich schnitt der Deckel den KNOPF ab (Fund vom 03.08.2026:
     „Senden" lag unter der Fensterkante). Am Feld schnitt er einmal den
     TEXT ab — aber nur, weil dort eine feste Zeilenzahl stand und ein
     `<textarea>` seinen Text ohne Bildlauf nicht zeigen kann.

     Hier steht kein fester Wert, sondern ein Anteil der Fensterhoehe, und
     ein `<textarea>` bringt seinen Bildlauf mit: was nicht hineinpasst,
     ist scrollbar statt verborgen. Damit schneidet niemand mehr etwas ab
     — das Feld nicht den Text, der Bereich nicht den Knopf. */
  /* HIER STANDEN ZWEI DECKEL UND KEINER GALT — aufgeraeumt am 10.08.2026.
     `max-height: 30dvh` stand hier, und siebzehn Zeilen weiter unten stand
     `max-height: none`, dessen eigener Vermerk den Deckel an `.antwort`
     verwies — wo er am 03.08.2026 entfernt worden war. Zwei Regeln, die
     einander auf einen Dritten zeigten, den es nicht gibt.

     Der Deckel steht jetzt an `.gespraech .antwort` weiter unten, wo er
     wirken kann. Hier bleibt keiner: was das Feld begrenzt, ist der Kasten
     um es herum. */
  /* NICHT SCHRUMPFEN — 02.08.2026. Als Flex-Kind mit der Voreinstellung
     `flex-shrink: 1` wurde das Feld vom Deckel des Bereichs zusammengedrueckt:
     gemessen 196 px Text in 71 px Feld. Es soll seinen Text tragen; was
     darueber hinausgeht, scrollt im Bereich.
     GILT WEITER FUER DIE WERKSTATT, wo `.antwort` frei stehen darf. Im
     Gespraech ist es umgekehrt (siehe `.gespraech .antwort__feld`): dort
     scrollt das Feld, weil der Kasten nicht wachsen darf. */
  flex: 0 0 auto;
  /* Wächst mit dem Text, statt zu scrollen: wer drei Sätze schreibt,
     soll drei Sätze sehen. Die Obergrenze verhindert, dass das Feld die
     ganze Ansicht frisst.

     DER DECKEL SITZT AM BEREICH, NICHT AM FELD — 02.08.2026, nachgemessen.
     Kapitel 13 des Bauauftrags weist hier vier Zeilen an
     (`calc(4 * 1.45 * var(--groesse-text))` = 98,6 px). Gebaut und gemessen
     schnitt das den übernommenen Vorschlag ab: **196 px Text in 96 px
     Feld** bei 390 px, 73 in 69 bei 1440. Genau der Fall, den die Messung
     „der übernommene Vorschlag ist ganz zu lesen" seit Runde 9 abfängt —
     der Meister hätte blind abgeschickt, was er nicht lesen kann.

     Was das Kapitel erreichen will, erreicht die Obergrenze an `.antwort`
     darüber (40 % der Lesehöhe): der Bereich fällt von 302,8 auf 205,5 px. Das Feld darin
     wächst weiter mit seinem Text, und was nicht mehr hineinpasst, scrollt
     im Bereich — lesbar, statt abgeschnitten.

     `40vh` stand hier vorher und hat nie gebunden: 337,6 px bei 844 px
     Fensterhöhe. Ein Deckel, der nie greift, ist keiner.

     UND DIESER HIER HAT DEN VORIGEN AUSGESCHALTET — gefunden am 10.08.2026.
     Siebzehn Zeilen darüber stand `max-height: 30dvh`; bei gleicher
     Spezifität gewinnt die spätere Regel, also galt `none`. Der Vermerk
     verwies auf einen Deckel an `.antwort`, den es seit dem 03.08.2026
     nicht mehr gibt. Damit war das Feld seit sieben Tagen unbegrenzt.
     Der Deckel steht jetzt an `.gespraech .antwort`. */
  max-height: none;
  /* WO ES DER BROWSER KANN, RECHNET ER SELBST. `rows` ist eine Schätzung
     aus der Zeichenzahl und kennt die Breite nicht — bei 390 px war der
     übernommene Vorschlag damit abgeschnitten. `field-sizing: content`
     löst genau das; wo es fehlt, bleibt `rows` die Schätzung, und die
     schätzt lieber eine Zeile zu viel. */
  field-sizing: content;
  /* 16 PX WIE BEI JITTER — gemessen an `._paranoidInput` und `._formInput`
     (`padding: 16px`). Hier standen 12; die Leiter kennt beide. */
  padding: var(--abstand-4);
  border: var(--randbreite) solid var(--farbe-rand-bedienelement);
  /* KANTIG. Dieselbe Übernahme wie an `.feld__eingabe`, und die ganze
     Begründung samt der zwei ausdrücklich NICHT übernommenen Werte steht
     dort. Ein zweiter Radius am meistgenutzten Feld des Produkts wäre der
     eine Ort, an dem die Übernahme nicht ankommt. */
  border-radius: 0;
  transition: border-color 350ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
  background: var(--farbe-flaeche);
  color: var(--farbe-text);
  /* 17 px — hier wird geschrieben. */
  font: inherit;
  font-size: var(--groesse-text);
  line-height: 1.45;
  resize: none;
}

.antwort__feld::placeholder {
  color: var(--farbe-text-gedaempft);
}

/* Jitters Fokusverhalten, auch hier: der Rand wechselt in die Primärfarbe.
   Zusätzlich zum Ring und nicht an seiner Stelle — die Begründung steht an
   `.feld__eingabe`. */
.antwort__feld:is(:hover, .zeige-ueberfahren),
.antwort__feld:is(:focus, .zeige-fokus) {
  border-color: var(--farbe-primaer);
}

.antwort__fuss {
  display: flex;
  justify-content: flex-end;
}

/* ===================================================================
   DER ANTWORTKASTEN NIMMT HÖCHSTENS DIE HÄLFTE — 10.08.2026
   ===================================================================

   DERSELBE FEHLER WIE AM 03.08.2026, und diesmal ohne Meldung gefunden:
   eine lange Antwort getippt und nachgemessen, bei 1440 x 900.

     Verlauf          32 px      (von 227,9)
     Antwortkasten   374 px  =  87,4 % der Gesprächshöhe
     „Senden"      y 871, Unterkante 926 in einem 900-px-Fenster

   Der Absendeknopf stand unter der Fensterkante — und `body.ist-bild-
   schirmhoch` setzt am Laptop `overflow: hidden`, die Seite lässt sich
   also nicht dorthin rollen. Erreichbar war er nur mit der Tabulator-
   taste. Wortgleich der Befund vom 03.08.2026: „ich kann nicht runter-
   scrollen, obwohl der Sendenknopf abgeschnitten ist."

   DIE URSACHE WAR EIN DECKEL, DER SICH SELBST AUSGESCHALTET HAT. An
   `.antwort__feld` standen `max-height: 30dvh` und siebzehn Zeilen
   später `max-height: none`; bei gleicher Spezifität gewinnt die
   spätere. Deren Vermerk verwies auf einen Deckel an `.antwort`, den es
   seit dem 03.08.2026 nicht mehr gibt. Das Feld war damit unbegrenzt,
   und weil es `flex: 0 0 auto` trägt, wuchs der Kasten mit — durch die
   Unterkante hindurch.

   50 % UND KEIN VIERTEL. Die Referenzen halten viel weniger (Intercom
   14,2 %, Later 7,6 %), und die Regel dazu lautet „der Verlauf ist IMMER
   größer als die Antwort". Die Hälfte ist die großzügigste Zahl, die
   diese Regel noch einhält — enger zu deckeln hieße, dem Meister beim
   Schreiben Platz wegzunehmen, den er gerade braucht. Was er schreibt,
   ist auf dieser Seite das Wichtigste; es darf nur nicht das
   verdrängen, worauf er antwortet.

   IM KASTEN SCHRUMPFT DAS FELD, NICHT DER FUSS. Ein `textarea` bringt
   seinen eigenen Bildlauf mit — der Text ist also weiter vollständig zu
   lesen, nur nicht mehr auf einmal. Der Knopf darunter schrumpft nicht:
   er ist die Handlung, und die Handlung weicht nie.

   Das ist genau die Aufteilung, die der Vermerk vom 03.08.2026 verlangt:
   „Was scrollen soll, ist der Verlauf und der Text, den man schreibt —
   nie der Rahmen, in dem die Handlung sitzt."

   NUR IM GESPRÄCH. In der Werkstatt steht `.antwort` frei und ohne
   Elternteil mit fester Höhe; dort gilt weiter, dass das Feld seinen
   ganzen Text trägt (`ki.spec.ts`, „der übernommene Vorschlag ist ganz
   zu lesen"). Der Deckel hängt deshalb an `.gespraech` und nicht an
   `.antwort` selbst. */
.gespraech .antwort {
  max-height: 50%;
  min-height: 0;
}

.gespraech .antwort__feld {
  flex: 1 1 auto;
  overflow-y: auto;
}

.gespraech .antwort__herkunft,
.gespraech .antwort__fuss {
  flex: 0 0 auto;
}

/* ===================================================================
   AUCH DAS ANTWORTFELD STEHT IN DER LESESPALTE — 10.08.2026
   ===================================================================

   Gemessen bei 1920 px lief es über die volle Gesprächsspalte: 1214 px
   Schreibzeile bei 17 px sind rund 130 Zeichen. Genau dagegen steht
   `--lese-breite` — nur galt sie bisher für den Text, den der Meister
   LIEST, und nicht für den, den er schreibt. Ein Antwortfeld, in dem
   niemand seine eigene Zeile wiederfindet, ist die meistgenutzte Fläche
   des Produkts.

   DER KASTEN BLEIBT VOLL BREIT, sein Inhalt nicht. Die weiße Fläche mit
   ihrer Oberkante ist die Trennung zwischen Lesen und Schreiben und
   reicht über die ganze Spalte; das Feld darin steht in derselben Spalte
   wie die Blasen darüber und fängt an derselben Kante an.

   `> *` UND KEINE AUFZÄHLUNG: der Kasten trägt Herkunftszeile,
   Beschriftung, Feld und Fuß, und alle vier gehören in dieselbe Spalte.
   Wer später einen fünften Teil einhängt, muss nichts nachtragen. */
.antwort > * {
  max-width: var(--gespraech-spalte);
  width: 100%;
}

/* ===================================================================
   Ab 60rem Behälterbreite: zwei Spalten
   =================================================================== */

@container huelle (min-width: 60rem) {
  /* ===================================================================
     DIE LAGE: DREI UNGLEICHE FELDER — 11.08.2026
     ===================================================================

     Die Aussagefläche nimmt die Hälfte, die zwei Farbkacheln je ein
     Viertel. Das ist Jitters Verhältnis aus dem Vorlagen-Abschnitt: eine
     große Fläche mit dem Satz, daneben die Kacheln mit je einer Zahl.

     `2fr 1fr 1fr` UND KEINE ZWÖLF SPUREN: zwölf wären die Zahl, wenn
     beide Reihen dieselben Kanten benutzten. Sie tun es nicht — die
     Arbeit darunter teilt 5 zu 7, und ein gemeinsames Raster hieße, den
     einen Schnitt dem anderen aufzuzwingen. Deshalb zwei Raster mit je
     ihrem eigenen. */
  .posteingang__arbeit {
    /* Die Liste ist schmal, SOBALD ETWAS GEWÄHLT IST — und nur dann.
       Hier stand „schmal und FEST, sie ändert ihre Breite nie"; seit
       dem 05.08.2026 nimmt sie ohne Wahl die volle Breite (Block bei
       `[data-offen='nein']` weiter unten). Diese Spur gilt also für
       den geöffneten Zustand, in dem sie tatsächlich fest steht.
       `minmax(0, …)` aus demselben Grund wie am Handy. */
    /* ==================================================================
       DAS VERHÄLTNIS DER SPALTEN IST JITTERS, DIE ZAHL IST UNSERE
       ==================================================================

       Angesagt: „übernimm von Jitter den TAKT — Zeilenhöhe, Abstände,
       Gruppenüberschrift und das VERHÄLTNIS DER SPALTEN."

       GEMESSEN an `Drafts · Jitter.html` bei 1440 px: seine linke Spalte
       steht bei x 291 und ist 240 breit, sein Inhaltsbereich reicht von
       291 bis 1149. Das sind 240 von 858 = **28 %**.

       HIER STAND `22rem`, also 352 px FEST. Was das gerendert ergibt:

         1440   352 von 1296  = 27,2 %   fast genau Jitters Verhältnis
         1920   352 von 1776  = 19,8 %   davongelaufen

       Der Wert war bei 1440 richtig gewählt und ist keine Breite,
       sondern ein eingefrorenes Verhältnis: er stimmt an genau einer
       Fensterbreite. Bei 1920 stand die Liste in 352 px, während neben
       ihr 1392 px Gesprächsspalte lagen, von denen die Blase 544
       benutzte — die schmale Spalte war die einzige, der es an Platz
       fehlte.

       `clamp(22rem, 28%, --lese-breite)` — drei Werte, drei Gründe:

         22rem          die Untergrenze von vorher. Unterhalb von rund
                        1256 px Inhaltsbreite lägen 28 % darunter, und
                        eine Liste unter 352 px schneidet den
                        Vorschautext nach zwei Wörtern ab.
         28 %           Jitters Verhältnis, gerendert gemessen.
         --lese-breite  die Obergrenze, und keine neue Zahl: 544 px ist
                        die schon getroffene Entscheidung darüber, wie
                        breit Text sein darf, der gelesen wird. Eine
                        Vorschauzeile ist Text, der gelesen wird. Ohne
                        sie wären es bei 2560 px 676 px Liste.

       Was das gerendert ergibt: 1440 → 363 px, 1920 → 497 px. Die Liste
       ändert ihre Breite weiterhin NICHT, wenn der Meister eine
       Nachricht öffnet — das war die Zusicherung von `22rem` und sie
       gilt unverändert. Sie ändert sie mit dem FENSTER, und das ist eine
       andere Frage. */
    grid-template-columns: clamp(22rem, 28%, var(--lese-breite)) minmax(0, 1fr);
    /* HIER STANDEN `grid-template-areas` UND `grid-template-rows` — 11.08.2026.
       Sie ordneten vier Felder (Aussage, Filter, Liste, Gespräch) in einem
       Raster. Aussage und Filter sind mit dem Neubau eine Ebene höher
       gewandert: sie stehen jetzt als Geschwister ÜBER dieser Fläche, nicht
       als Zeilen darin. Was bleibt, sind zwei Spalten in einer Zeile — und
       die brauchen keine Namen. */
    /* Die beiden Spalten sind so hoch wie ihr Inhalt, und die Seite rollt
       als Dokument — wie die anderen fünf und wie die Vorlage. Was in sich
       rollt, ist der Verlauf im Gespräch; siehe dort. */
    align-items: start;
  }

  /* ==================================================================
     DIE KANTE ZWISCHEN DEN SPALTEN IST LUFT, KEIN STRICH — 08.08.2026
     ==================================================================

     Angesagt: „übernimm von Jitter den TAKT — Zeilenhöhe, Abstände,
     Gruppenüberschrift, Lücke zur rechten Spalte."

     GEMESSEN an `Drafts · Jitter.html`, 1440 px: seine linke Spalte endet
     bei x 531, seine rechte fängt bei x 564 an. **33 px Luft**, und
     dazwischen kein Strich.

     HIER STAND `border-right`. Im Bild vom 08.08.2026 stießen die beiden
     Spalten aneinander und waren nur durch eine Haarlinie getrennt — die
     getönte Fläche der gewählten Zeile lief bis an die Linie, und das
     Gespräch fing unmittelbar dahinter an. Zwei Bereiche, die sich
     berühren, liest man als einen mit einem Strich darin.

     `--luecke-huelle` UND KEINE NEUE ZAHL. Sie steht auf 32 px und ist
     „[gemessen] `gap` der Spalte" — dieselbe Vorlage, derselbe Abstand,
     ein Pixel von Jitters 33 entfernt. Ein zweiter Wert einen Pixel
     daneben wäre genau die Drift, die dieses Projekt sonst überall
     verhindert.

     DER STRICH FÄLLT MIT. Mit 32 px Luft dahinter läge er nicht mehr
     zwischen den Spalten, sondern am rechten Rand der Liste — und dort
     liest er sich als Unterstreichung und nicht als Trennung. */

  /* ===================================================================
     DAS GESPRAECH ROLLT IN SICH, DIE LISTE IST DAS DOKUMENT — 11.08.2026
     ===================================================================

     ANGESAGT: „mit der festen Hoehe ist der eigene Bildlauf der Liste
     gefallen, seitdem rollen beide Spalten gemeinsam und die Stelle in
     der Liste geht beim Lesen eines langen Gespraechs verloren. Das war
     eine tragende Entscheidung. Loes es beim Neubau."

     DIE ZWEI ALTEN FASSUNGEN, und beide waren falsch:

       bis 10.08.  Huelle 100 dvh, Liste mit eigenem `overflow-y`. Die
                   Stelle blieb — dafuer blieben bei 1440 x 900 nur
                   272,9 px Gespraech und 32 px Verlauf darin.
       seit 10.08. Dokumentbildlauf. Das Gespraech hat Platz — dafuer
                   schiebt jeder Rollschritt darin die Liste mit.

     GEBAUT IST JETZT DAS DRITTE: `position: sticky`. Die Seite rollt
     weiter als Dokument, die Liste IST das Dokument — sie kann gar keine
     Stelle verlieren, weil es keinen zweiten Rollbereich gibt, in dem sie
     steckt. Das Gespraech bleibt am oberen Rand stehen und rollt in sich.

     DIE HOEHE IST DAS FENSTER MINUS DER KOPFZEILE, und sie ist gerechnet
     und nicht gegriffen: `--kopf-luft-eng` ist genau „Kopfhoehe plus einen
     Atemzug" und wird schon von der Spalte darueber gelesen. Unten kommt
     derselbe Betrag dazu, damit das Antwortfeld nicht an der Fensterkante
     klebt.

     `sticky` UND NICHT `fixed`: ein festes Element verliesse den
     Raster-Fluss, und die Spalte daneben zoege sich auf die volle Breite.
     Sticky bleibt eine Rasterzelle und haelt nur ihre Lage.

     `align-items: start` AM RASTER IST DIE BEDINGUNG. Ein Rasterkind ist
     von sich aus `stretch`, und ein gestrecktes Kind ist so hoch wie
     seine Zeile — dann hat `sticky` nichts, worin es kleben koennte. */
  .posteingang__arbeit > .gespraech {
    position: sticky;
    top: var(--kopf-luft-eng);
    /* `height` UND NICHT `max-height` — 11.08.2026, im Bild gefunden.
       Mit einem Deckel war die Kachel so hoch wie ihr Inhalt: bei einem
       Gespraech aus einer Blase stand rechts neben einer 1700 px langen
       Liste ein 330 px hoher Kasten und darunter 1370 px Weiss. Eine
       Kachel, die nur so gross ist wie ihr kuerzester Fall, sieht bei
       jedem anderen Fall aus wie ein Rest.

       Mit fester Hoehe ist sie immer so hoch wie das Fenster, der Verlauf
       waechst hinein, und das Antwortfeld steht unten. Das ist die
       Bauform jedes Nachrichtenprogramms — und der Grund, aus dem sie
       ueberall dieselbe ist. */
    height: calc(100dvh - var(--kopf-luft-eng) * 2);
    /* `hidden` und nicht `auto`: was rollt, ist der Verlauf DARIN. Ein
       zweiter Rollbereich um den ersten waere ein Kasten, in dem der Kopf
       mit wegrollt — und dann steht der Absendername nicht mehr da,
       waehrend man liest. */
    overflow: hidden;
  }

  /* Sie steht über beiden Spalten. Im Markup steht sie davor — die
     Vorlesefolge ist „erst filtern, dann lesen", und die stimmt so. */
  .posteingang__filter {
    border-bottom: var(--randbreite) solid var(--farbe-rand);
  }

  /* ===================================================================
     OHNE WAHL NIMMT DIE LISTE DIE BREITE — 05.08.2026
     ===================================================================

     HIER STAND DAS GEGENTEIL, und es stand mit Begründung da: „Die
     Spalten stehen immer beide da. Sonst springt die Liste in dem
     Moment, in dem der Meister eine Nachricht anfasst — erst breit,
     dann schmal." Das ist die erste der vier tragenden Entscheidungen
     von Bereich 03, und sie wird hiermit überstimmt.

     WAS SIE GEKOSTET HAT, ist gemessen: bei 1920 px stand rechts eine
     graue Fläche von 1424 x 691 px = 984.000 px² mit zwei Zeilen Text
     darin, während die Liste links in 352 px stand und jeden
     Nachrichtentext nach zwei Wörtern abschnitt. Das ist die Frage
     dieser Runde — „klebt der Inhalt in den ersten 400 px?" — mit der
     deutlichsten Antwort, die das Produkt zu bieten hat.

     Intercom und Front machen es umgekehrt: solange nichts gewählt ist,
     ist die Liste die Seite. Der Sprung beim ersten Antippen bleibt und
     ist der Preis — aber er ist EINMAL je Sitzung und vom Meister
     ausgelöst, und danach steht die Spalte fest.

     `data-offen` trägt das schon: es heißt nicht „es ist etwas offen",
     sondern „DER MEISTER hat etwas geöffnet". Genau diese Unterscheidung
     wurde am 02.08.2026 für die Überlagerung am Handy eingeführt und
     trägt hier ein zweites Mal.

     Die Vorwahl, die dieselbe tote Fläche schon einmal füllen sollte,
     ist am 03.08.2026 angesagt gefallen. Damit ist dies die zweite
     Antwort auf denselben Befund — und die erste, die keine Nachricht
     aufschlägt, die niemand geöffnet hat. */
  .posteingang[data-offen='nein'] .posteingang__arbeit {
    grid-template-columns: minmax(0, 1fr);
  }

  .posteingang[data-offen='nein'] .posteingang__liste {
    grid-column: 1 / -1;
    /* HIER STAND `border-right: 0` mit der Begründung „ein Strich ohne
       zweite Seite ist eine Kante mitten in der Fläche". Sie war richtig
       und ist am 08.08.2026 gegenstandslos geworden: den Strich gibt es
       nicht mehr, die Spalten trennt Luft. Die Regel fällt mit ihm. */
  }

  /* Und die rechte Spalte bleibt weg. Das ist dieselbe Regel wie am
     Handy, nur aus einem anderen Grund — dort ist kein Platz, hier gibt
     es nichts zu zeigen. Sie steht deshalb hier ausdrücklich und nicht
     als „die Regel von oben gilt weiter": wer den Block liest, soll
     nicht in der Behälterabfrage darüber nachsehen müssen. */
  .posteingang[data-offen='nein'] .gespraech {
    display: none;
  }

  /* ===================================================================
     DIE BREITE ZEILE — und sie ist der eigentliche Gewinn
     ===================================================================

     Eine Liste breiter zu machen, ohne ihre Zeilen zu ändern, tauscht
     nur tote graue Fläche gegen tote weiße. Gemessen in der schmalen
     Spalte: der Vorschautext brach nach zwei bis vier Wörtern ab
     („Guten Tag Herr Brenner, wir hatten letztes Jahr im Oktobe…"),
     und darunter stand er ein zweites Mal abgeschnitten.

     Über die Breite geht beides in EINE Zeile: links wer und wann,
     rechts der Anfang der Nachricht, so weit er reicht. Genau so bauen
     Front und Intercom ihre Listenansicht — und dort ist der Vorschau-
     text die Hälfte der Zeile, nicht ein Rest.

     `minmax(0, …)` in beiden Spuren: eine Rasterspur hat ein
     automatisches Minimum von `min-content`, und ein langer
     Absendername würde die zweite Spur sonst zusammendrücken. Das ist
     die Falle, die in diesem Umbau siebenmal zugeschlagen hat.

     Die zweite Textzeile fällt damit weg, und mit ihr die Mindesthöhe
     von zwei Zeilen: sie hielt den Takt der Liste ruhig, solange der
     Text umbrach. Bei einer Zeile hält ihn die Zeile selbst. */
  .posteingang[data-offen='nein'] .zeile__mitte {
    grid-template-columns: minmax(0, 18rem) minmax(0, 1fr);
    align-items: baseline;
    gap: var(--abstand-5);
  }

  /* Wer und wann rücken zusammen, statt sich über die Spur zu verteilen.
     `space-between` schöbe die Uhrzeit an die rechte Kante der ersten
     Spur — also mitten in die Zeile, zwischen Namen und Text. */
  .posteingang[data-offen='nein'] .zeile__kopf {
    justify-content: flex-start;
  }

  /* HIER STAND `-webkit-line-clamp: 1` MIT `min-height: 0`, und zwar nur
     für den ungewählten Zustand. Seit dem 10.08.2026 gilt beides für die
     ganze Liste (bei `.posteingang__zeilen .zeile__text`) — die einzeilige
     Vorschau ist die Bedingung dafür, dass Jitters Takt überhaupt trägt.
     Die Regel hier wäre dieselbe Aussage ein zweites Mal, und zwei
     Fassungen derselben Sache laufen auseinander. */

  /* Die Ueberlagerung des Handys faellt hier weg — am Laptop steht das
     Gespraech in seiner Spalte. `inset: auto` nimmt das `inset: 0` der
     festen Lage zurueck; `top` setzt die Regel darueber neu.
     KEIN `position: static`: das ueberschriebe das `sticky` von oben,
     und der Bildlauf dieser Runde waere wieder weg. Die Regel ist
     spezifischer (0-3-0 gegen 0-2-0) und gewaenne. */
  .posteingang[data-offen='ja'] .gespraech--offen {
    position: sticky;
    inset: auto;
    top: var(--kopf-luft-eng);
  }

  /* Zurück gibt es nur am Handy: am Laptop steht die Liste daneben. */
  .gespraech__zurueck {
    display: none;
  }

  /* ===================================================================
     DER BILDLAUF DES GESPRAECHS DARF AM LAPTOP AN DIE SEITE UEBERGEBEN —
     14.08.2026, gefunden und behoben
     ===================================================================

     `.gespraech__verlauf` traegt `overscroll-behavior: contain` (siehe
     dort) — richtig fuer das Handy, wo das Gespraech als `position: fixed`
     die ganze Seite ueberlagert: ohne `contain` risse ein Rollschritt am
     Rand des Verlaufs die Seite DAHINTER mit, die der Meister gerade nicht
     sehen kann.

     AM LAPTOP GILT DIESE BEGRUENDUNG NICHT — hier steht das Gespraech
     `position: sticky` NEBEN der Liste, nicht darueber, und genau dieser
     Kopfkommentar der Datei sagt es selbst: „die SEITE rollt weiter als
     Dokument … das GESPRAECH … rollt in sich." Mit `contain` unveraendert
     galt das nur bis zum Rand: am oberen oder unteren Ende eines langen
     Gespraechs — und ans Ende rollt jedes Gespraech beim Oeffnen von
     selbst — schluckte der Verlauf jeden weiteren Rollschritt, statt ihn
     an die Seite weiterzureichen. Nachgemessen mit einem simulierten
     Mausrad-Rollschritt (Playwright, `mouse.wheel`): bei bereits ans Ende
     gerolltem Verlauf blieb `window.scrollY` bei 0 stehen, obwohl die Seite
     darunter weiter Inhalt hat.

     GENAU DAS PASST ZU DEN VIER GEMELDETEN FUNDEN VOM 14.08.2026: „bei
     einer sehr langen Nachricht laesst sich im Feld nicht scrollen" — man
     stand am Ende des Verlaufs, und der Rollschritt verschwand. Und „unter
     Erledigt/Archivieren/Loeschen scrollt die Seite, links unter der
     Nachricht nicht" laesst sich damit erklaeren, wenn der Zeiger dabei
     ueber dem Verlauf und nicht ueber der Liste stand — beide Beobachtungen
     sind ein und derselbe Fund. */
  .gespraech__verlauf {
    overscroll-behavior: auto;
  }
}

/* Wer Bewegung reduziert, bekommt keine — Regel 12 (m12). */
@media (prefers-reduced-motion: reduce) {
  .zeile--gestaffelt {
    animation: none;
  }
}


/* ===================================================================
   BEREICH 04 · Inhalte
   ===================================================================

   Regel 04: „Eine Liste, kein Kalender als Startansicht. Höchstens
   vier Kennzahlen je Beitrag. Die Bewertung ist eine große Zahl. Der
   KI-Hinweis ist eine Überschrift, kein Element."

   FÜNF ENTSCHEIDUNGEN TRAGEN DIESEN ABSCHNITT:

   1. DIE LISTE TRÄGT KEINE ZAHLEN. Nur Datum, Bild, Text, Kanal.
      Eine Liste mit vier Kennzahlen je Zeile ist eine Tabelle, und
      Tabellen sind ausdrücklich nicht entschieden (Lücke 2).

   2. VIER ZAHLEN JE BEITRAG, UND DIE BEWERTUNG ZÄHLT MIT. Also die
      große Zahl plus DREI Kennzahlen.

   3. BEWERTUNG UND HINWEIS SIND EIN ELEMENT. Der Satz ist die
      Überschrift über der Zahl, nicht eine Beschriftung daneben.

   4. DIE ZAHL IST GEFÜLLT, NICHT GETÖNT. Abschnitt 9 warnt
      namentlich: „Wer sie beim Bau zusätzlich abschwächt — kleinere
      Ziffern, gedämpfte Fläche, Rahmen statt Füllung — macht sie
      unsichtbar." Weiße Ziffern auf voller Primärfarbe. Violette
      Ziffern auf hellviolett wären außerdem genau der Fall, den die
      geprüfte Regel aus Bereich 11 verbietet.

   5. DER KALENDER IST DIE ZWEITE ANSICHT. Leere Zellen bleiben leer —
      keine Füllgrafik (d1, Canva).
   =================================================================== */

.inhalte {
  display: grid;
  /* `minmax(0, 1fr)` und nicht `1fr`: eine `1fr`-Spur hat als
     Mindestbreite `min-content`, und ein langes Wort im Anriss macht die
     Spur damit breiter als den Kasten. Derselbe Fund wie im Posteingang. */
  grid-template-columns: minmax(0, 1fr);
  /* `auto auto` STATT `auto 1fr` — Baustelle 0.1. Die zweite Zeile hat
     keinen Rest mehr zu fuellen, seit die Seite nicht mehr auf die
     Hoehe der Huelle gespannt ist; mit `1fr` bliebe sie so hoch wie der
     Bildschirm, auch wenn drei Beitraege darin stehen. */
  grid-template-rows: auto auto;
}

/* DER BENTO-KOPF steht über allem und über beiden Spalten — er gilt für
   Liste und Kalender gleichermaßen. Hier stand `> .aussage`, der violette
   Vollton-Streifen; er ist am 11.08.2026 mit dem Neubau gefallen.

   Der Abstand nach unten ist der Takt des Bentos und keine eigene Zahl:
   dieselbe Lücke, die zwischen Fläche und Kachelreihe steht. Eine Seite
   hat einen Takt, nicht zwei. */
.inhalte > .bento {
  grid-column: 1 / -1;
  margin-bottom: var(--bento-luecke);
  min-width: 0;
}

/* ===================================================================
   DIE ARBEIT IST EIN EIGENES RASTER — 11.08.2026
   ===================================================================

   Genau wie am Posteingang: die Lage oben hat drei ungleiche Felder, die
   Arbeit darunter zwei. In EINEM Raster mit denselben Spuren müßte die
   Listenkachel unter der Aussagefläche stehen und der Schnitt der zweiten
   Reihe wäre der der ersten.

   Eine Spalte als Grundzustand; die zweite kommt ab 60rem dazu, und auch
   dann nur, wenn ein Beitrag offen ist. */
.inhalte__arbeit {
  grid-column: 1 / -1;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--bento-luecke);
  align-items: start;
  min-width: 0;
}

/* HIER STAND `.inhalte__umschalter` — die zwei freistehenden Reiter zwischen
   Bento und Inhalt. Sie sind am 11.08.2026 in den Kachelkopf gezogen; die
   Begründung steht bei `ansichtsweg()` in inhalte.ts.

   UND ZWEI KINDREGELN BLIEBEN STEHEN, gefunden vom Audit am selben Tag:
   `.inhalte__umschalter .reiter` und `… .reiter__eintrag`. Der Vermerk
   darüber sagte „die Regel ist gelöscht und nicht leer stehengelassen" —
   und daneben standen zwei Regeln für ein Element, das es nicht mehr gibt.

   GENAU DAVOR WARNT DER SATZ, den er selbst trägt. Wer einen Block löscht,
   muß nach seinen Kindern suchen: sie tragen den Namen des Elternteils im
   Wähler und fallen bei einer Suche nach der eigenen Klasse nicht auf. */

/* --- Die Liste ---------------------------------------------------- */

.inhalte__liste {
  display: flex;
  flex-direction: column;
  min-height: 0;
  border-right: var(--randbreite) solid var(--farbe-rand);
  /* GRUNDFLAECHE AN BEIDEN BREITEN GLEICH — 02.08.2026. Bei 1440 stand die
     Liste auf Weiss, bei 390 auf `--farbe-hintergrund`. Der Unterschied von
     7 von 255 Helligkeitsstufen (2,7 %) war der einzige Grund, warum das
     Monatsband am Handy ueberhaupt zu ahnen war. Das Band traegt sich ab
     jetzt selbst — durch Abstand und Linie, nicht durch Farbe. */
  background: var(--farbe-flaeche);
}

/* IM RUHEZUSTAND IST DIE LISTE BREITER UND MITTIG — 02.08.2026.
   Gemessen: 416 von 1136 px = 36,6 % der Inhaltsbreite, waehrend daneben
   720 px auf einen einzigen Satz warteten. Buffer legt seine Warteschlange
   auf 66,5 % der Inhaltsbreite und laesst den Rest bewusst leer.

   728 px ist KEIN NEUER WERT, sondern eine Rechnung aus vorhandenen Tokens:
   544 px Textspalte (`--lese-breite`) + 112 px + 72 px feste Kolonne aus
   Datumskreis, Miniatur und Luecken. Das sind 64,1 % — Buffer liegt bei
   66,5 %. Zeilenverhaeltnis damit 1:7,67 statt 1:4,37 (Hootsuite 1:9,2,
   Substack 1:8,9).

   ANGEHOBEN AUF 1000 px AM 04.08.2026 — angesagt: „die Posteingang-Liste
   geht von 728 auf 1000 px, der Vorschautext bleibt bei 544."

   Die 1000 sind bestellt, nicht gemessen. Was hier steht, ist woraus sie
   bestehen — und die Ansage bestimmt beide Haelften: die Textspalte bleibt
   `--lese-breite`, also waechst nur die Kolonne daneben, von 184 auf 456 px.
   Damit sind es 88,1 % der Inhaltsbreite bei 1440 px.

   NICHT `--inhalt-breite` ANHEBEN. Der Token traegt zwoelf Zeilen
   Herleitung und hatte bis heute keinen Leser; er beschreibt den
   Seitenbehaelter und nicht diese Liste. Wer ihn anfasst, aendert hier
   nichts.

   Die Trennlinie rechts faellt hier weg: eine Linie ohne zweite Spalte
   trennt nichts. */
.inhalte[data-offen='nein'] .inhalte__liste {
  /* `width: 100%` MUSS DABEISTEHEN. Ein Gitterkind streckt sich auf seine
     Spur — aber nur, solange es keine automatischen Aussenabstaende hat.
     `margin-inline: auto` nimmt ihm das Strecken ab und laesst es auf seine
     Inhaltsbreite zusammenfallen: gemessen 706 statt 728 px. Die Grenze
     wirkt dann gar nicht mehr, sie steht nur da. */
  width: 100%;
  /* ===================================================================
     DER DECKEL VON 1000 PX IST AM 11.08.2026 GEFALLEN
     ===================================================================

     ER STAND HIER MIT EINER RECHNUNG (544 Lesebreite + 184 feste Kolonne
     + 272 Luft = 1000) und mit einem guten Grund: bei 1776 px
     Inhaltsbreite klaffte zwischen dem gedeckelten Anriss und der
     rechten Kante ein Loch von rund 900 px. „Eine Zeile, die zu zwei
     Dritteln aus Zwischenraum besteht, ist keine Zeile."

     DIE ZAHL, GEGEN DIE ER GERECHNET WAR, GIBT ES NICHT MEHR. Seit dem
     10.08.2026 ist die Inhaltsspalte portalweit 1320 px bei 1920 und
     861 bei 1440 — nicht mehr 1776 und 1296. Gemessen im Bild: die Liste
     endete 320 px vor der Bentokachel darueber, und zwei rechte Kanten
     auf einer Seite sind derselbe Fehler wie zwei linke, gegen den
     dieselbe Regel am 05.08.2026 das Zentrieren gestrichen hat.

     WAS DAS ZWISCHEN TEXT UND KANTE LAESST, ist nachgerechnet: 1320
     minus Datumskreis, Vorschau und Anriss (rund 720) minus Kanal und
     Uhrzeit (rund 180) sind 420 px — halb so viel wie die 900, gegen
     die der Deckel gebaut wurde, und weniger als der Sprung, den er
     jetzt erzeugt.

     DIE 544 PX ANRISS SIND UNANGETASTET. Was hier faellt, ist nur die
     Grenze der ZEILE, nicht die des Textes darin. */
  margin-inline: 0;
  border-right: 0;
}

/* ===================================================================
   DIE 1000 PX BLEIBEN, DAS ZENTRIEREN FÄLLT — 05.08.2026
   ===================================================================

   ZUERST WAR ES ANDERS GEBAUT, und das Bild hat es widerlegt. Der erste
   Versuch nahm der Liste die Grenze und ließ sie über die vollen 1776 px
   laufen — wie die Nachrichtenliste einen Commit vorher. Angesehen war
   das schlechter als vorher: der Vorschautext bleibt bei 544 px
   (ausdrückliche Auflage), Kanal und Uhrzeit stehen an der rechten
   Kante, und dazwischen klaffte ein Loch von rund 900 px. Eine Zeile,
   die zu zwei Dritteln aus Zwischenraum besteht, ist keine Zeile.

   DER UNTERSCHIED ZUM POSTEINGANG IST DER INHALT, nicht die Seite: dort
   darf der Anriss über die Breite laufen und tut es auch. Hier ist er
   gedeckelt, und ein gedeckelter Text füllt keine 1776 px. Die Regel
   dieser Runde sagt genau dafür „oder sie bleibt schmal".

   WAS FÄLLT, IST NUR DAS ZENTRIEREN. Gemessen stand die Liste auf
   460..1460, während der Seitentitel und die Vollton-Fläche darüber bei
   72 anfangen — zwei linke Kanten auf einer Seite. Jetzt beginnt alles
   an derselben Kante; die 776 px rechts bleiben bewusst leer, so wie es
   Buffer laut der Messung oben auch tut.

   Die bestellte Zahl von 1000 px ist damit unangetastet. */
@container huelle (min-width: 1100px) {
  /* HIER STAND `margin-inline: 0` — es nahm der Liste das Zentrieren, das
     mit dem Deckel von 1000 px gebraucht wurde. Beides ist am 11.08.2026
     gefallen; die Liste steht ohnehin auf der linken Kante. */

  /* WER UND WANN RÜCKEN AN DIE RECHTE KANTE — und dafür muss die Mitte
     ihre Kinder freigeben.
     `.beitrag__kanal` liegt IN `.beitrag__mitte`, und die ist eine
     Flex-SPALTE: ein `margin-left: auto` darin schiebt nur innerhalb der
     Spalte, nicht über die Zeile. `display: contents` löst den Kasten auf,
     ohne ihn aus dem Markup zu nehmen — Text und Kanal werden damit selbst
     zu Kindern der Zeile.
     Die 544 px wandern dabei mit auf den Text: sie hingen an der Mitte,
     und die gibt es jetzt als Kasten nicht mehr. Der Wert ändert sich
     nicht, nur sein Träger. */
  .inhalte[data-offen='nein'] .beitrag__mitte {
    display: contents;
  }

  .inhalte[data-offen='nein'] .beitrag__text {
    flex: 0 1 auto;
    max-width: var(--lese-breite);
  }

  .inhalte[data-offen='nein'] .beitrag__kanal {
    /* `margin-left: auto` und kein `justify-content: space-between` an der
       Zeile: das würde auch Datum und Kachel auseinanderziehen. */
    margin-left: auto;
    padding-left: var(--abstand-5);
    white-space: nowrap;
  }
}

.beitragsliste {
  /* Eigener Bildlauf gefallen — Baustelle 0.1. Anders als die
     Nachrichtenliste braucht sie ihre Stelle nicht zu halten: sie ist
     einspaltig, und ein Klick fuehrt auf eine eigene Adresse. */
  margin: 0;
  padding: 0;
  list-style: none;
  /* ===================================================================
     17 PX STATT 15 — 05.08.2026, und die Messung sagt etwas anderes als
     die Ansage
     ===================================================================

     Angesagt war: „Zeilen sind sehr klein gegenüber dem Titel,
     Größenverhältnis prüfen." Geprüft, und das Verhältnis ist NICHT der
     Befund: Seitentitel 96 px zu Zeile 15 px sind 1:6,4 — Jitter fährt
     laut `vorlage/jitter/MESSUNG.md` 140 px zu 20 px, also 1:7. Wir
     liegen enger an der Vorlage als die Vorlage selbst.

     GEÄNDERT WIRD TROTZDEM, und zwar aus einem anderen Grund als dem
     genannten. Hier stand „15 px wie im Posteingang: hier wird
     überflogen, nicht gelesen." Das stimmt für den Posteingang und
     nicht für diese Seite: dort ist die Zeile die VORSCHAU auf ein
     Gespräch, das man daneben öffnet und liest. Hier IST der
     Beitragstext der Inhalt — es gibt nichts, was man stattdessen
     aufmacht, um ihn zu lesen.

     Regel 03 nennt den Grundsatz, nicht die Seite: „Große Schrift dort,
     wo gelesen und geschrieben wird." Auf `/inhalte` wird gelesen.

     Die Textspalte bleibt bei 544 px. Bei 17 px und 8,3 px je Zeichen
     sind das 65 Zeichen — weiter im Lesbarkeitsfenster 45–75, das die
     Grenze überhaupt begründet. Nur die Kanalzeile darunter bleibt
     klein: sie wird überflogen. */
  font-size: var(--groesse-text);
}

/* Die Monatsüberschrift ist eine Trennung, kein Eintrag. Sie klebt
   oben fest, damit beim Scrollen immer sichtbar bleibt, in welchem
   Monat man gerade ist — bei 200 Beiträgen die einzige Orientierung. */
/* POLSTER OBEN 12 → 24, DAZU EINE KANTE — 02.08.2026.
   Das Band stand auf `--farbe-flaeche` ueber `--farbe-flaeche`: Kontrast
   gemessen 0 %. Es war ueberhaupt nicht als Trennung zu sehen. Substacks
   Monatsgruppe verlaengert den Zeilenabstand um +31 % und traegt sich damit
   allein — hier sind es 34 → 46 px = +35 %.
   Der Grund BLEIBT `--farbe-flaeche`: ein klebendes Band muss deckend sein,
   sonst scheint der Text darunter hindurch. Die Kante braucht es, WEIL es
   klebt — ein klebendes Band ohne Kante schneidet die Zeile darunter
   scheinbar ab. Substack hat keine und klebt auch nicht. */
.beitragsliste__monat {
  position: sticky;
  top: 0;
  z-index: 1;
  padding: var(--abstand-5) var(--abstand-4) var(--abstand-2);
  border-bottom: var(--randbreite) solid var(--farbe-rand);
  background: var(--farbe-flaeche);
}

.beitragsliste__monat h3 {
  margin: 0;
  font-size: var(--groesse-mikro);
  font-weight: var(--schrift-halbfett);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--farbe-text-gedaempft);
}

/* ===================================================================
   DIE LISTE OHNE TRENNLINIEN — 11.08.2026, angesagt
   ===================================================================

   „die Liste schöner … das sollte auch wie bei Insta aussehen eher"

   HIER STAND `border-bottom: 1px solid var(--farbe-rand)` an jeder Zeile:
   zwölf waagerechte Striche auf einem Bildschirm. Instagram zieht in seinen
   Listen keinen einzigen — dort trennt der ABSTAND, und was zusammengehört,
   erkennt man daran, daß es beieinandersteht.

   ZWEI STRICHE BLEIBEN, und beide tragen etwas: die Monatsüberschrift behält
   ihre Linie (sie trennt Zeiträume, nicht Zeilen), und die gewählte Zeile
   behält ihren Balken links.

   DER ABSTAND KOMMT AUS DER FLÄCHE, nicht aus einem `gap` an der Liste: die
   Trefferfläche soll wachsen, nicht die Lücke zwischen zwei Trefferflächen.
   Auf der Baustelle trifft man mit Handschuh die Zeile, nicht die Fuge. */
.beitrag + .beitrag {
  margin-top: var(--abstand-1);
}

.beitrag__flaeche {
  display: flex;
  gap: var(--abstand-3);
  align-items: center;
  width: 100%;
  padding: var(--abstand-3) var(--abstand-4);
  /* Ohne Trennlinien trägt die Fläche die Zeile — dann braucht sie eine
     eigene Kante, sobald man sie berührt oder wählt. `--radius-standard`
     und nicht 0: das hier ist keine Eingabe, sondern eine Karte, und die
     Kacheln daneben sind auch rund. */
  border-radius: var(--radius-standard);
  border: 0;
  background: none;
  text-align: left;
  /* Ein Verweis bringt Verweisfarbe und Unterstreichung mit. Beides
     ist hier falsch — derselbe Fund wie im Posteingang. */
  color: inherit;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--dauer-schnell) var(--kurve);
}

.beitrag__flaeche:hover,
.beitrag__flaeche.zeige-ueberfahren {
  background: var(--farbe-flaeche-gedaempft);
}

.beitrag__flaeche:active,
.beitrag__flaeche.zeige-aktiv {
  background: var(--farbe-rand);
}

.beitrag__flaeche:focus-visible,
.beitrag__flaeche.zeige-fokus {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: calc(var(--fokusring) * -1);
}

/* Der gewählte Beitrag trägt zwei Träger, keiner davon allein Farbe:
   die Fläche UND den Balken links. */
.beitrag--gewaehlt .beitrag__flaeche {
  background: var(--farbe-primaer-sehr-hell);
  box-shadow: inset 3px 0 0 0 var(--farbe-primaer);
}

/* ===================================================================
   DER DATUMSKREIS AM GEWÄHLTEN BEITRAG — 11.08.2026, angesagt
   ===================================================================

   „der runde Hintergrund der Datumsanzeige links also bspw 14, 8, 2, 21
   etc… sollte bei Klick also wenn der Beitrag ausgewählt ist eine andere
   Farbe bekommen oder weg sein"

   ER TRÄGT `--farbe-flaeche-gedaempft` (#F2F1F3), die gewählte Zeile
   `--farbe-primaer-sehr-hell`. Zwei sehr helle Töne aus zwei verschiedenen
   Familien übereinander: der Kreis wurde zum grauen Fleck IN der violetten
   Zeile, und er war das einzige Element der Zeile, das die Auswahl nicht
   mitmachte.

   ANDERE FARBE UND NICHT WEG, und das ist die Wahl zwischen den zwei
   angebotenen: der Kreis trägt die Tageszahl, und ohne ihn spränge die Zahl
   beim Wählen um ihre halbe Höhe — er hält als Fläche die Zeile ruhig.
   Weiß ist dabei nicht irgendein Ton, sondern der Grund der Kachel: der
   Kreis wird zur Aussparung in der Tönung, statt eine dritte Farbe
   dazuzunehmen.

   Die Tageszahl bleibt Tinte — 14,53:1 auf Weiß. Sie in die Primärfarbe zu
   setzen wäre eine zweite Aussage über dieselbe Auswahl, die der Balken
   links schon macht. */
.beitrag--gewaehlt .beitrag__datum {
  background: var(--farbe-flaeche);
}

.beitrag__datum {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: var(--radius-rund);
  background: var(--farbe-flaeche-gedaempft);
}

.beitrag__tag {
  font-size: var(--groesse-text);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

.beitrag__mitte {
  flex: 1 1 auto;
  /* Ohne das sprengt „Photovoltaik-Speicher-Nachrüstung" die Zeile —
     min-width: auto ist die Voreinstellung eines Flex-Kindes. */
  min-width: 0;
  /* DIE ZEILE DARF BREITER WERDEN, DER TEXT NICHT BELIEBIG — 02.08.2026.
     544 px sind bei 7,3 px je Zeichen (15 px Inter, aus unserem Bild
     gemessen) 74 Zeichen und damit das obere Ende des Lesbarkeitsfensters
     45–75. Ohne die Grenze kippt die verbreiterte Liste in Hootsuites
     Fehler: dort laufen 165 Zeichen durch eine Zeile. */
  max-width: var(--lese-breite);
  display: flex;
  flex-direction: column;
  /* 2 px kennt die Leiter nicht — sie geht 4/8/12/16/24/32/48/72/112. Die
     Zeilenhoehen 23,7 und 20,54 tragen den Abstand bereits. */
  gap: 0;
}

/* ZWEI ZEILEN, NICHT FUENF. Der Anriss ist serverseitig auf 90 Zeichen
   gekuerzt — bei 390 px sind das fuenf Zeilen und eine Listenzeile von
   150 px Hoehe. Vier Beitraege fuellten den Bildschirm. Die Begrenzung
   gehoert an die Breite, nicht an die Zeichenzahl, also hierher.
   Im Bild aufgefallen. */
.beitrag__text {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  overflow: hidden;
  color: var(--farbe-text);
  overflow-wrap: anywhere;
}

.beitrag__kanal {
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

.beitragsliste__mehr {
  display: flex;
  justify-content: center;
  padding: var(--abstand-3) var(--abstand-3) var(--abstand-5);
}

.beitragsliste__mehr .knopf {
  text-decoration: none;
}

/* --- Die Miniatur ------------------------------------------------- */
/*
   Ein Beitrag ohne Bild ist ein eigener Fall (Abschnitt 9), kein
   Fehler. Die Ersatzfläche hat dieselbe Größe wie ein Bild — so
   springt nichts, wenn später eines dazukommt. */

.miniatur {
  flex: 0 0 auto;
  /* `relative`, nicht mehr `overflow: hidden`: das Kanalabzeichen sitzt mit
     seinem Ring ueber der unteren rechten Ecke und wuerde sonst beschnitten.
     Das Bild darin bringt seinen eigenen Radius mit. */
  position: relative;
  display: grid;
  place-items: center;
  width: 56px;
  height: 56px;
  border-radius: var(--radius-klein);
  background: var(--farbe-flaeche-gedaempft);
  /* Verzierung, kein Text: 1,86:1 auf Weiss ist dafuer die richtige Stufe. */
  color: var(--farbe-zeichnung);
}

/* ===================================================================
   96 PX IN DER BREITEN LISTE — 05.08.2026
   ===================================================================
   Die Kachel soll ihre Aufschrift tragen (angesagt), und 56 px koennen
   das nicht (gemessen am 04.08.). 96 px koennen es:

     96 px Kachel - 2 x 4 px Polster        = 88 px Textbreite
     15 px Inter halbfett, 7,3 px je Zeichen = 12 Zeichen je Zeile
     zwei Zeilen                             = 24 Zeichen

   `vorschauwort()` kuerzt auf 22 Zeichen. Die Aufschrift passt also in
   zwei Zeilen, ohne Trennstrich und ohne dritte Zeile — genau der
   Fehler, an dem sie bei 56 px gescheitert ist.

   Die Zeilenhoehe waechst dabei von 93 auf rund 120 px. Das ist der
   Preis und er ist bezahlbar: zwoelf Beitraege stehen auch dann noch
   ohne Bildlauf da. */
@container huelle (min-width: 1100px) {
  .inhalte[data-offen='nein'] .beitragsliste .miniatur {
    width: 96px;
    height: 96px;
  }
}

.miniatur__bild {
  width: 100%;
  height: 100%;
  border-radius: inherit;
  object-fit: cover;
}

/* DAS KANALZEICHEN IST EIN ABZEICHEN, KEINE FUELLUNG — 02.08.2026.
   Gemessen fuellte es 44 x 44 = 1.936 von 3.136 px² = 61,7 % der Flaeche und
   behauptete damit, das Bild zu sein. Buffer und Later setzen das Netzwerk
   als kleines Abzeichen an den Avatar. Der 2-px-Ring in `--farbe-flaeche`
   haelt es lesbar, sobald darunter ein Foto liegt statt einer grauen Platte. */
.miniatur__kanal {
  position: absolute;
  right: -4px;
  bottom: -4px;
  display: block;
  border-radius: var(--radius-rund);
  box-shadow: 0 0 0 var(--randbreite-stark) var(--farbe-flaeche);
}

/* DIE VORSCHAU IM BEITRAG — 3:2 wie bei Hootsuite, gedeckelt. */
.miniatur--gross {
  width: 100%;
  height: auto;
  aspect-ratio: 3 / 2;
  max-height: var(--vorschau-hoehe-max);
  border-radius: var(--radius-standard);
  overflow: hidden;
}

/* ===================================================================
   DIE VOLLTON-VORSCHAU — Baustelle 1, 04.08.2026
   ===================================================================

   Angesagt: „Beitragsbilder sind heute graue Kaesten mit Kamerasymbol.
   Ersetzen durch stilisierte Vollton-Vorschaubilder im Jitter-Stil
   (Farbflaeche + fetter Kurztext), erzeugt aus dem Beitragstitel."

   SIE ERSETZT DIE GRAUE PLATTE, NICHT DAS BILD. Sobald ein Beitrag ein
   echtes Foto hat, gewinnt das Foto — die Vorschau steht nur da, wo
   sonst nichts stuende. Welcher Ton zu welchem Beitrag gehoert, rechnet
   `vorschauton()` aus seiner Kennung; derselbe Beitrag bekommt immer
   denselben.

   DER TEXT TRAEGT TINTE, NIE WEISS. [gemessen] Jitters Startseite setzt
   auf keinem seiner Volltoene Weiss — siehe `vorlage/jitter/MESSUNG.md`.
   Die schlechteste dieser sechs Paarungen ist Tinte auf
   `--farbe-akzent-violett-kraeftig` mit 6,16:1 und damit ueber der
   Auflage fuer Fliesstext. */
.vorschau {
  display: grid;
  place-items: center;
  /* Der graue Grund von `.miniatur` wird ueberschrieben — sonst blitzt er
     an den Kanten durch, wo der Radius rundet. */
  background: var(--farbe-akzent-violett);
  color: var(--farbe-text);
  overflow: hidden;
}

.vorschau__wort {
  /* Sehr fett und sehr eng — Punkt 1 der Formensprache. [gemessen] Jitter
     laeuft bei kleinen Groessen auf -0,024 em; das ist hier der Fall. */
  font-weight: var(--schrift-halbfett);
  letter-spacing: var(--laufweite-eng);
  line-height: 1.05;
  text-align: center;
  /* Die Aufschrift darf die Flaeche nicht sprengen: zwei Zeilen, dann
     Schluss. `vorschauwort()` kuerzt schon auf 22 Zeichen — das hier ist
     der zweite Riegel fuer den Fall, den die erste Regel nicht kennt
     (ein einzelnes sehr langes Wort). */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  overflow-wrap: anywhere;
  padding: var(--abstand-1);
  font-size: var(--groesse-mikro);
  /* ===================================================================
     IN DER ZEILE STEHT KEIN TEXT — gefunden beim Ansehen, 04.08.2026
     ===================================================================

     Die Kachel in der Liste ist 56 x 56 px. Darin stand die Aufschrift
     als „Baustell e", „Neue Wall", „Wir such" — mit Trennstrich mitten
     im Wort und abgeschnittener zweiter Zeile. Im Bild sofort als
     kaputt zu erkennen, in keiner Messung: das Element hatte seine
     Groesse, seinen Text und seinen Kontrast.

     56 px TRAGEN KEINEN TEXT, und das laesst sich nicht mit einer
     kleineren Schrift retten — bei 10 px waere es lesbar und trotzdem
     sinnlos. Was die kleine Kachel leisten soll, leistet die FARBE
     allein: derselbe Beitrag hat immer denselben Ton, und daneben steht
     sein Text ohnehin in voller Laenge.

     DER BEFUND STIMMT WEITER, DIE VORAUSSETZUNG NICHT MEHR — 05.08.2026.

     Angesagt ist: „Vorschaubilder sind reine Farbquadrate; sie brauchen
     die Farbflaeche PLUS fetten Kurztext aus dem Titel." Das verlangt
     genau das zurueck, was hier mit einer Messung gestrichen wurde — und
     die Messung war richtig: 56 px tragen keinen Text.

     Beides zusammen geht nur ueber die dritte Groesse. Die Kachel steht
     nicht mehr in einer 1000 px schmalen Liste, sondern in einer 1776 px
     breiten; sie darf deshalb wachsen. Bei 96 px und 15 px halbfetter
     Schrift stehen zwei Woerter in zwei Zeilen, ohne Trennstrich und ohne
     abgeschnittene Zeile — das ist gemessen und nicht geschaetzt (siehe
     die Rechnung an `.miniatur` weiter oben).

     Die Regel bleibt also stehen, sie gilt nur noch, wo sie hingehoert:
     unter 1100 px Behaelterbreite bleibt die Kachel 56 px und traegt
     weiter keine Aufschrift. */
  display: none;
}

/* Ab 1100 px traegt die Kachel ihre Aufschrift — siehe die Begruendung
   direkt darueber. Die Groesse steht an `.miniatur`, das Wort hier. */
@container huelle (min-width: 1100px) {
  /* An denselben Zustand gebunden wie die 96 px: steht ein Beitrag offen,
     ist die Liste 416 px schmal und die Kachel wieder 56 px — dort waere
     die Aufschrift derselbe Fehler wie am 04.08. */
  .inhalte[data-offen='nein'] .beitragsliste .vorschau__wort {
    display: -webkit-box;
    font-size: var(--groesse-klein);
    /* DREI ZEILEN UND ECHTE SILBENTRENNUNG — gemessen am 05.08.2026.
       Mit zwei Zeilen wurden zwei von zwölf Aufschriften abgeschnitten,
       und beide Male war ein langes deutsches Wort schuld:
       „Zählerschrank" (13 Zeichen) und „Sicherungskasten" (16) passen in
       88 px nicht auf eine Zeile. Das ist keine Größenfrage — es gibt
       keine Kachelbreite, in die alle deutschen Komposita passen.
       `hyphens: auto` macht aus dem Bruch mitten im Wort eine Trennung
       mit Strich: „Siche-rungs-kasten" statt „Sicherungskas ten". Genau
       dieser Bruch war am 04.08.2026 der Grund, die Aufschrift ganz zu
       streichen. `overflow-wrap: anywhere` von oben bleibt als letzter
       Riegel für Wörter, die auch der Trenner nicht kennt.
       Drei Zeilen zu 15,75 px sind 47 px in einer 96-px-Kachel — das
       Polster von 2 x 4 px trägt das ohne Weiteres. */
    -webkit-line-clamp: 3;
    line-clamp: 3;
    hyphens: auto;
  }
}

.miniatur--gross .vorschau__wort {
  display: -webkit-box;
}

.miniatur--gross .vorschau__wort {
  font-size: var(--groesse-riesig);
  padding: var(--abstand-4);
  -webkit-line-clamp: 3;
  line-clamp: 3;
}

/* DIE SECHS VORSCHAUTOENE — auf die geltende Palette gezogen, 11.08.2026.
   Drei Familien, zwei Tiefen; die Herleitung samt Kontrastwerten steht in
   `inhalte.ts` bei `VORSCHAUTOENE`. Hier standen `cyan`, `violett-kraeftig`
   und `orange`: die ersten zwei waren von ihren Nachbarn nicht zu
   unterscheiden (#01B2FD gegen #50B8FF, #A981FF gegen #B593FF), Orange ist
   mit der Ordnung vom 07.08.2026 aus der Palette gefallen. */
.vorschau--violett      { background: var(--farbe-akzent-violett); }
.vorschau--violett-hell { background: var(--farbe-akzent-violett-hell); }
.vorschau--gelb         { background: var(--farbe-akzent-gelb); }
.vorschau--blau         { background: var(--farbe-akzent-blau); }

/* DIE ZWEI TIEFEN TRAGEN WEISS — produktweite Regel vom 06.08.2026, „dunkle
   Fuellungen tragen Weiss, helle tragen Tinte". Tinte haelt auf #5C6A00
   2,98:1 und auf #072982 1,66:1; Weiss haelt 5,97:1 und 12,74:1. */
.vorschau--gelb-tief {
  background: var(--farbe-akzent-gelb-tief);
  color: var(--farbe-flaeche);
}
.vorschau--blau-tief {
  background: var(--farbe-akzent-blau-tief);
  color: var(--farbe-flaeche);
}

/* --- Der geöffnete Beitrag ---------------------------------------- */

.beitragsblatt {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-4);
  /* Eigener Bildlauf gefallen — Baustelle 0.1. */
  padding: var(--abstand-4);
  /* 17 px: hier wird gelesen. Dieselbe Trennung wie im Posteingang. */
  font-size: var(--groesse-text);
}

/* 48 x 48 MIT PFEIL — 02.08.2026. Der Verweis trug nur `nur-vorlesen` und
   war sichtbar 0 x 0 px gross; am Handy liegt das Blatt ueber der Liste, es
   gab also keinen sichtbaren Weg zurueck. 48 statt 44 wegen des
   Arbeitshandschuhs — dieselbe Auflage wie in der Reiterleiste. */
.beitragsblatt__zurueck {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 48px;
  height: 48px;
  margin-left: calc(var(--abstand-2) * -1);
  border-radius: var(--radius-standard);
  color: var(--farbe-text);
  text-decoration: none;
  transition: background var(--dauer-schnell) var(--kurve);
}

.beitragsblatt__zurueck:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-flaeche-gedaempft);
}

.beitragsblatt__zurueck:is(:focus-visible, .zeige-fokus) {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: var(--fokusring-abstand);
}

.beitragsblatt__kopf {
  display: flex;
  gap: var(--abstand-3);
  align-items: center;
}

.beitragsblatt__wer {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.beitragsblatt__kanal {
  font-weight: var(--schrift-halbfett);
  overflow-wrap: anywhere;
}

.beitragsblatt__datum {
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

.beitragsblatt__text {
  margin: 0;
  overflow-wrap: anywhere;
}



/* HIER STAND die Regel auf `beitragsblatt__fuss` — gefallen am 13.08.2026.
   Sie nahm dem Knopf im Fuss des Beitragsblatts die Unterstreichung. Den Fuss
   gibt es nicht mehr: das Blatt endet seit dem Umbau mit dem Boost-Zustand
   und den Kommentaren, und `inhalte.ts` baut keinen.

   Sie war ausserdem schon doppelt, bevor sie tot war: `knopf` nimmt die
   Unterstreichung allen ab, seit die Regel dort steht („KEINE
   UNTERSTREICHUNG, auch wenn der Knopf ein Verweis ist"). */

/* ===================================================================
   DIE BEWERTUNG IST GEFALLEN — Baustelle 2.3, 04.08.2026
   ===================================================================

   Hier standen sieben Regeln fuer `.bewertung`: eine gefuellte violette
   Flaeche mit weisser Schrift, die Zahl in `--groesse-bewertung` (72 px,
   ausdruecklich KEIN `clamp`, damit sie am Handy nicht schrumpft), der
   Satz als Ueberschrift darueber, und ein eigener gedaempfter Zustand
   fuer „noch keine Zahlen".

   Angesagt: „Der Bewerten-Wert ‚57 von 100‘ fliegt raus. Vollstaendig
   aus der Oberflaeche."

   `--groesse-bewertung` BLEIBT VORERST IN `tokens.css` STEHEN und hat
   damit keinen Leser mehr. Das ist bewusst und steht in `UEBERGABE.md`:
   der Wert ist teuer erarbeitet (die Begruendung gegen `clamp` steht in
   einer eigenen Probe), und Baustelle 2.1 braucht fuer „die grosse Zahl
   als Bild" genau so eine feste Groesse. Wer ihn vorher loescht, baut
   ihn zwei Baustellen spaeter neu.

   ================================================================
   DER BOOST-ZUSTAND — was an die Stelle des Knopfes tritt
   ================================================================

   „Die KI entscheidet selbst, was beworben wird — ein Knopf
   widerspricht dem Produkt. An seine Stelle kommt ein Zustand: ob
   dieser Beitrag beworben wird, und wenn ja, wie viel vom Monatsbudget
   darauf entfaellt."

   ER IST EINE AUSKUNFT UND KEINE HANDLUNG, deshalb keine gefuellte
   Flaeche und kein Knopfgrund: er soll gelesen und nicht gedrueckt
   werden. Das unterscheidet ihn von der alten Bewertung, die die
   „auffaelligste Stelle des Blattes" sein wollte. */

.boostlage {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-1);
  padding: var(--abstand-4);
  border-radius: var(--radius-standard);
  background: var(--farbe-flaeche-gedaempft);
  color: var(--farbe-text);
}

.boostlage__satz {
  margin: 0;
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text-gedaempft);
}

.boostlage__zahl {
  display: flex;
  gap: var(--abstand-2);
  align-items: baseline;
  margin: 0;
}

/* Gross, aber nicht so gross wie die alte Bewertungszahl: der Betrag ist
   eine Auskunft neben drei anderen Zahlen, nicht die eine Aussage des
   Blattes. */
.boostlage__wert {
  font-size: var(--groesse-gross);
  font-weight: var(--schrift-halbfett);
  line-height: 1;
  letter-spacing: var(--laufweite-eng);
}

.boostlage__von {
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

/* WIRD NICHT BEWORBEN IST KEIN MANGEL. Deshalb dieselbe ruhige Flaeche
   und kein Warnton — die KI hat sich entschieden, und das ist eine
   Auskunft wie die andere. */
.boostlage--ruht .boostlage__satz {
  font-weight: var(--schrift-normal);
}

/* --- Die drei Kennzahlen ------------------------------------------ */

/* AUTO-FIT STATT DREI FESTER SPALTEN. Drei feste Spalten brauchen eine
   Behaelterabfrage, und die greift nur unter einem `.huelle`-Vorfahren —
   in der Werkstattprobe gab es keinen, also standen drei Spalten in einem
   280 px breiten Kasten und „Klicks" war abgeschnitten. So passt sich das
   Raster an die Breite an, die es wirklich hat, ohne etwas darüber
   anzunehmen. Im Bild aufgefallen. */
/* ===================================================================
   INSTAGRAMS ANORDNUNG STATT DREIER KÄSTEN — 11.08.2026, angesagt
   ===================================================================

   „diese Sektion mehr überarbeiten … es soll so sein wie bei Instagram"

   HIER STAND EIN RASTER AUS DREI GLEICH GROSSEN KÄSTEN, jeder mit Rahmen,
   Polster und Radius: bei 1440 px drei Rechtecke von je 250 x 76 px für drei
   Zahlen. Mehr Rahmen als Inhalt, und alle drei gleich laut.

   INSTAGRAM SETZT AN DIESELBE STELLE EINE ZEILE. Die Zahl, die ein Mensch
   gemacht hat, fett voran; darunter kleiner, wie vielen es gezeigt wurde.
   Kein Kasten, keine Linie — die Rangfolge trägt die Auskunft.

   ZWEI ZEILEN UND NICHT EINE: `flex-wrap` mit voller Breite an der leisen
   Zahl. Reaktionen und Klicks stehen nebeneinander, die Reichweite darunter.
   Bei 390 px bricht das von selbst richtig um. */
.kennzahlen {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--abstand-2) var(--abstand-5);
  margin: 0;
}

.kennzahl {
  display: flex;
  align-items: baseline;
  gap: var(--abstand-1);
  min-width: 0;
}

/* Die zwei Zahlen, die eine Handlung sind: Zahl fett, Wort daneben. */
.kennzahl--stark .kennzahl__wert {
  font-weight: 800;
}

/* DIE REICHWEITE IST DER NENNER, NICHT DAS ERGEBNIS. Sie steht in derselben
   Liste — sie ist eine der drei Zahlen und kein Fußnotentext —, aber auf
   eigener Zeile und gedämpft: „wie vielen es gezeigt wurde" beantwortet eine
   andere Frage als „wie viele reagiert haben". */
.kennzahl--leise {
  flex-basis: 100%;
  color: var(--farbe-text-gedaempft);
}

.kennzahl--leise .kennzahl__wert {
  font-size: var(--groesse-klein);
}

/* ===================================================================
   DIE KOMMENTARE — 11.08.2026, angesagt
   ===================================================================

   „das man dort die Kommentare gespiegelt sieht und auch antworten kann …
   es soll so sein wie bei Instagram"

   INSTAGRAMS KOMMENTARZEILE ist keine Liste aus Kästen, sondern Fließtext
   mit fettem Namen davor: „Nadine Wolf Wie sind denn die Arbeitszeiten?"
   Name und Text stehen in EINER Zeile und brechen zusammen um — deshalb ein
   `<p>` mit zwei `<span>` und kein Raster. Ein Raster setzte den Namen in
   eine eigene Spalte und ließe bei kurzen Namen die halbe Zeile leer.

   UNSERE ANTWORT STEHT EINGERÜCKT DARUNTER, mit einer Linie links. Sie
   trägt keinen Namen: im Kopf steht der Kanal, und dieser Betrieb ist der
   einzige, der hier antwortet. */
.kommentare {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-3);
  padding-top: var(--abstand-4);
  border-top: var(--randbreite) solid var(--farbe-rand);
}

.kommentare__kopf {
  margin: 0;
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
}

.kommentare__leer {
  margin: 0;
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

.kommentare__liste {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-4);
  margin: 0;
  padding: 0;
  list-style: none;
}

.kommentar {
  min-width: 0;
}

.kommentar__zeile {
  margin: 0;
  /* Ohne das sprengt eine lange Adresse im Kommentartext die Spalte. */
  overflow-wrap: break-word;
}

.kommentar__wer {
  font-weight: var(--schrift-halbfett);
}

.kommentar__zeit {
  margin: 2px 0 0;
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

/* Der Weg zum Antwortfeld. Ein Verweis und kein Knopf: er stellt die
   Adresse um, er ändert nichts. 44 px, weil er auf der Baustelle mit
   Handschuh getroffen wird. */
.kommentar__weg {
  margin: 0;
}

.kommentar__weg a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  font-size: var(--groesse-mikro);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text-gedaempft);
  text-decoration: none;
}

.kommentar__weg a:hover,
.kommentar__weg a.zeige-ueberfahren {
  color: var(--farbe-text);
  text-decoration: underline;
}

/* EINGERÜCKT MIT LINIE, wie bei Instagram die Antwort unter dem Kommentar.
   Die Linie trägt die Zuordnung — ohne sie wäre eine Antwort auf den dritten
   Kommentar von einem vierten Kommentar nicht zu unterscheiden. */
.kommentar__antwort {
  margin-top: var(--abstand-2);
  padding-left: var(--abstand-4);
  border-left: 2px solid var(--farbe-rand);
}

/* Das Antwortfeld sitzt IM Kommentar und nicht am Fuß des Beitrags: bei vier
   Kommentaren wäre ein Feld unten eine Antwort ohne Adressaten. Es bringt
   seinen eigenen Rahmen nicht mit — die Kachel hat schon einen. */
.kommentar__feld {
  margin-top: var(--abstand-2);
  padding-left: var(--abstand-4);
  border-left: 2px solid var(--farbe-primaer);
}

.kommentar__feld .antwort {
  padding: 0;
  border-top: 0;
  background: none;
}

/* Links vom gefüllten Knopf, weil der nach Regel 09 die rechte Kante hält. */
.antwort__abbruch {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  margin-right: auto;
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
  text-decoration: none;
}

.antwort__abbruch:hover,
.antwort__abbruch.zeige-ueberfahren {
  color: var(--farbe-text);
  text-decoration: underline;
}

/* Die Zahl groß, das Wort klein darunter (d3). Im Markup steht das
   Wort als <dt> vor dem Wert — die Reihenfolge im Bild dreht das um,
   ohne die Bedeutung anzutasten. */
/* EINE ZAHL BRICHT NIE. `overflow-wrap: anywhere` stand hier zuerst — aus
   Gewohnheit, wegen der langen deutschen Wörter. An einer Zahl ist es aber
   genau falsch: „12.400" wurde zu „12.40" und „0" in der nächsten Zeile.
   Das ist keine Umbruchstelle, das ist eine andere Zahl. Im Bild
   aufgefallen; die Messung sah eine Kachel ohne Überlauf und war zufrieden. */
.kennzahl__wert {
  margin: 0;
  font-size: var(--groesse-gross);
  font-weight: var(--schrift-halbfett);
  line-height: 1.1;
  overflow-wrap: normal;
  word-break: keep-all;
}

.kennzahl__wort {
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

/* --- Die Bewerbung ------------------------------------------------ */
/*
   Ein Bildschirm, eine Frage. Betrag und Wirkung in DERSELBEN Zeile —
   nicht der Betrag oben und eine Vorschau unten. */

.bewerbung {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-4);
}

.boost {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-3);
  margin: 0;
  padding: 0;
  border: 0;
}

.boost__frage {
  padding: 0 0 var(--abstand-3);
  font-size: var(--groesse-text);
  font-weight: var(--schrift-halbfett);
}

/* RASTER STATT FLEX. Als Flexzeile rutschte bei 390 px der Punkt unter den
   Betrag, sobald „erreicht voraussichtlich 1 500 bis 3 000 Menschen" umbrach —
   im Bild sah das aus, als gehoere er zur naechsten Zeile. Im Raster behaelt
   der Punkt seine Spalte, und die Wirkung faellt unter den Betrag statt
   daneben. Der Betrag und seine Wirkung bleiben dabei EIN Block; das ist die
   Regel, nicht die Anordnung nebeneinander. */
.boost__betrag {
  position: relative;
  display: grid;
  grid-template-columns: 22px 1fr;
  gap: var(--abstand-1) var(--abstand-3);
  align-items: center;
  /* Mit Handschuh: die ganze Zeile ist die Trefferfläche, nicht der
     Kreis. Gemessen: ein natives Radio ist 20 x 20 px — die Zeile ist
     56 px hoch, und die Eingabe liegt unsichtbar darüber. */
  min-height: 56px;
  padding: var(--abstand-3) var(--abstand-4);
  border: 1px solid var(--farbe-rand);
  border-radius: var(--radius-klein);
  cursor: pointer;
}

/* Zwei Träger: der Rahmen wird dicker UND das Häkchen des Radios
   steht da. Farbe allein trägt nichts. */
.boost__betrag:has(.boost__wahl:checked) {
  border-color: var(--farbe-primaer);
  box-shadow: inset 0 0 0 1px var(--farbe-primaer);
}

.boost__betrag:has(.boost__wahl:focus-visible) {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: 2px;
}

/* Die echte Eingabe: unsichtbar, aber DA. Sie deckt die ganze Zeile ab,
   nimmt den Fokus und ist für Vorleseprogramme ein normales Radio. */
.boost__wahl {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: pointer;
}

/* Gezeichnet wird der Punkt. Zwei Träger im gewählten Zustand: der Punkt
   IST gefüllt UND der Rahmen der Zeile wird dicker. */
.boost__punkt {
  align-self: center;
  width: 22px;
  height: 22px;
  border: 2px solid var(--farbe-rand-bedienelement);
  border-radius: var(--radius-rund);
}

.boost__betrag:has(.boost__wahl:checked) .boost__punkt {
  border-color: var(--farbe-primaer);
  border-width: 7px;
}

.boost__punkt {
  grid-row: 1 / span 2;
}

.boost__geld {
  font-size: var(--groesse-gross);
  font-weight: var(--schrift-halbfett);
  white-space: nowrap;
}

.boost__wirkung {
  min-width: 0;
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

/* Ab Tablet passen Betrag und Wirkung nebeneinander. */
@container huelle (min-width: 45rem) {
  .boost__betrag {
    grid-template-columns: 22px auto 1fr;
  }

  .boost__punkt {
    grid-row: auto;
  }
}

.bewerbung__fuss {
  display: flex;
  gap: var(--abstand-3);
  justify-content: flex-end;
}

.bewerbung__fuss .knopf {
  text-decoration: none;
}

/* --- Der Kalender ------------------------------------------------- */
/*
   Die zweite Ansicht, nie die erste. Leere Zellen bleiben leer:
   keine Füllgrafik (d1, Canva). */

/* ===================================================================
   DER GRAUE GRUND IST GEFALLEN — 11.08.2026, im Bild gefunden
   ===================================================================

   HIER STAND `background-color: var(--farbe-flaeche-gedaempft)` mit dem
   Vermerk „DER KALENDER LIEGT AUF GRAU — 04.08.2026, angesagt: der Stil
   unserer Website auf allen Seiten. Die Zellen sind weiß darauf; das ist
   dasselbe Muster wie im Lesebereich des Posteingangs."

   DAS MUSTER STIMMT NOCH, DER ORT NICHT MEHR. Seit dem 11.08.2026 ist der
   Kalender eine `.inhaltskachel` — weißer Grund, Rahmen, Radius 40, wie die
   Nachrichtenliste im Posteingang. Der graue Grund lag damit IN der weißen
   Kachel und machte aus ihr einen grauen Kasten mit weißem Rand; im Bild bei
   1920 px war die Kachel nicht mehr als solche zu erkennen.

   DAS GRAU IST NICHT WEG, es steht eine Ebene höher: die Aussagefläche des
   Bentos darüber trägt es, und das ist die Fläche, für die es entschieden
   wurde. Zweimal Grau untereinander wären zwei Ebenen ohne Unterschied.

   `padding` FÄLLT MIT, weil die Kachel ihres schon hat. Zwei Polster
   übereinander wären 48 px Rand um ein Raster, das die Breite braucht. */
.inhalte__kalender {
  grid-column: 1 / -1;
}

.kalender__monat {
  margin: 0 0 var(--abstand-3);
  font-size: var(--groesse-gross);
  font-weight: var(--schrift-halbfett);
}

.kalender__wochentage {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: var(--abstand-1);
  margin: 0 0 var(--abstand-1);
  padding: 0;
  list-style: none;
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

/* DIE BESCHRIFTUNG STEHT ÜBER IHRER ZIFFER — 02.08.2026. Die Zelle darunter
   polstert mit 8 px, die Beschriftung gar nicht: gemessen 9 px Versatz =
   5,8 % der Spaltenbreite. Bei sieben Spalten sieht man das als Schieflage,
   ohne sagen zu können, woher sie kommt. Dieselbe Zahl, ein Wert. */
.kalender__wochentage > * {
  padding-inline: var(--abstand-2);
}

/* ===================================================================
   MEHRERE MONATE UNTEREINANDER — 11.08.2026
   ===================================================================

   Der Kalender zeigte EINEN Monat und verschwieg den Rest: „Juli 2026" mit
   fünf Einträgen, während der Satz darüber „12 Beiträge" sagte. Die
   Begründung steht bei `MONATE_JE_STAPEL` in inhalte.ts.

   Der Abstand zwischen zwei Monaten ist größer als der zwischen zwei Wochen
   — sonst liefen sie zu einem Raster zusammen und der Monatswechsel wäre nur
   noch an der Überschrift zu erkennen. */
.kalender__block {
  min-width: 0;
}

/* ===================================================================
   BLÄTTERN STATT STAPELN — 11.08.2026, angesagt
   ===================================================================

   Am Vormittag standen hier drei Monatsraster untereinander
   (`.kalender__bloecke`, `.kalender__mehr`), und der Grund war ein Fehler:
   der Kalender verschwieg sieben von zwölf Beiträgen, weil `?monat=` keinen
   Verweis hatte. Angesagt wurde dann „nur einen Monat sehen können" — und
   das ist richtig, sobald die Bedienung da ist. Drei Raster waren der
   Ausgleich für eine fehlende Bedienung.

   ZWEI WEGE, LINKS UND RECHTS, in der Leserichtung der Zeit: älter links,
   neuer rechts. `space-between` und nicht `gap`, damit der eine Weg an
   seiner Kante steht, auch wenn der andere fehlt — der leere `<span>` im
   Markup hält den Platz. Ohne ihn spränge „August 2026" von rechts nach
   links, sobald es keinen älteren Monat mehr gibt. */
.kalender__blaettern {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--abstand-3);
  padding-bottom: var(--abstand-3);
}

.kalender__schritt {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  font-size: var(--groesse-klein);
  color: var(--farbe-primaer);
  text-decoration: none;
}

.kalender__schritt:hover,
.kalender__schritt.zeige-ueberfahren {
  text-decoration: underline;
}

/* Ein Monat ohne Beitrag sagt es. Ohne den Satz stünde ein Raster aus 31
   leeren Zellen da, und niemand wüßte, ob nichts veröffentlicht wurde oder
   ob etwas nicht geladen hat. */
.kalender__leer {
  margin: var(--abstand-4) 0 0;
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

.kalender {
  display: grid;
  /* `minmax(0, 1fr)` und nicht `1fr`: eine `1fr`-Spur hat als Mindestbreite
     `min-content`, und die fette Aufschrift in der Zelle machte die Spur
     damit breiter als den Behälter. Derselbe Fund wie an `.inhalte` und im
     Posteingang — seit die Zelle wieder Text trägt, greift er hier auch. */
  grid-template-columns: repeat(7, minmax(0, 1fr));
  gap: var(--abstand-1);
  margin: 0;
  padding: 0;
  list-style: none;
}

.kalender__zelle {
  /* Ein Rasterfeld schrumpft ohne das nicht unter seinen Inhalt — der
     Anriss im Feld machte das Raster breiter als den Behälter, und die
     Spalte „So" lag außerhalb. Dieselbe Falle wie `min-width: auto` beim
     Flex-Kind, nur im Raster. Im Bild aufgefallen. */
  min-width: 0;
  display: flex;
  /* ===================================================================
     DIE ZELLE IST VIEL HÖHER — 11.08.2026, angesagt
     ===================================================================

     „der Kalender sieht einfach nicht gut aus. Da stell ich mir vor, daß der
     Kalender viel länger gezogen ist, also nach unten länger, daß man viel
     mehr Fläche hat."

     HIER STAND `min-height: 64px` mit dem Vermerk „Mit Handschuh am Handy:
     eine Zelle ist nie kleiner als 44 px". Der Handschuh ist weiter die
     Untergrenze und bleibt erfüllt — er war nur nie die Frage. Gemessen
     bei 1920 px war eine Zelle 76 px hoch bei rund 170 px Breite: ein
     liegendes Feld, in dem ein Beitrag nur als 20-px-Kringel Platz fand.
     Genau deshalb ist am 04.08.2026 der Text aus der Zelle gefallen.

     `--kalender-zelle` STATT EINER ZAHL, weil die Höhe an zwei Breiten
     verschieden ist und beide dasselbe meinen: „so hoch, daß ein Beitrag
     darin lesbar steht". Am Laptop sind das zwei Zeilen fetter Aufschrift
     plus Tageszahl, am Handy nur die Farbfläche. */
  min-height: var(--kalender-zelle);
  /* KEIN POLSTER AN DER ZELLE — 02.08.2026. Das Polster gehört jetzt der
     Fläche darin, weil DIE das Ziel ist. An der Zelle wäre es ein Rand
     zwischen Rahmen und Trefferfläche: sichtbar getroffen, aber tot. */
  padding: 0;
  border: var(--randbreite) solid var(--farbe-rand);
  border-radius: var(--radius-klein);
  /* WEISS AUF GRAU — 04.08.2026, seit der Kalender auf grauem Grund
     liegt. Ohne diese Zeile schiene der Grund durch die Zelle durch,
     und der Rahmen waere das Einzige, was eine Zelle noch von der
     Fuge daneben unterscheidet. */
  background-color: var(--farbe-flaeche);
}

/* DIE GANZE ZELLE IST DAS ZIEL — 02.08.2026.
   Vorher saß in der Zelle ein Chip, der nur sein Symbol und seinen Anriss
   traf: bei 390 px sind sieben Spalten rund 48 px breit, der Chip darin war
   schmaler. Jetzt füllt die Fläche die Zelle vollständig.
   An Tagen OHNE Beitrag ist dasselbe Element ein `<span>`, kein Verweis —
   dieselbe Form, keine Trefferfläche. Ein Tag ohne Beitrag ist ein Datum. */
.kalender__flaeche {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
  width: 100%;
  padding: var(--abstand-2);
  border-radius: inherit;
  color: inherit;
  text-decoration: none;
}

a.kalender__flaeche {
  cursor: pointer;
  transition: background var(--dauer-schnell) var(--kurve);
}

/* DIE ZWEI ZUSTAENDE MUSSTEN MIT — 04.08.2026, und das ist der Grund,
   warum die graue Flaeche hier nicht nebenbei ging.

   Hier stand `--farbe-flaeche-gedaempft` fuer Ueberfahren und
   `--farbe-rand` fuer Gedrueckt. Beide sind Graustufen, und seit der
   Kalender selbst auf `--farbe-flaeche-gedaempft` liegt, waere
   Ueberfahren GENAU DER GRUND gewesen: die Zelle waere beim
   Ueberfahren verschwunden statt sich zu melden.

   Sie wechseln deshalb in die Primaerfamilie, und zwar in beide
   Stufen, die es dort schon gibt — kein neuer Wert:

     Ueberfahren  --farbe-primaer-sehr-hell    Text darauf 15,41:1
     Gedrueckt    --farbe-primaer-hell-flaeche Text darauf 13,23:1

   Die Richtung stimmt weiter: gedrueckt ist kraeftiger als
   ueberfahren, und beide sind heller als die Schrift darauf. */
a.kalender__flaeche:hover,
a.kalender__flaeche.zeige-ueberfahren {
  background: var(--farbe-primaer-sehr-hell);
}

a.kalender__flaeche:active,
a.kalender__flaeche.zeige-aktiv {
  background: var(--farbe-primaer-hell-flaeche);
}

a.kalender__flaeche:focus-visible,
a.kalender__flaeche.zeige-fokus {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  /* Nach innen: die Zellen grenzen am Handy aneinander, ein Ring mit
     Abstand läge auf der Nachbarzelle. */
  outline-offset: calc(var(--fokusring) * -1);
}

/* Die Marken sagen, WIE VIELE Beiträge der Tag hat — der zweite Träger
   neben der fetten Tagesziffer. */
/* DIE EINTRAEGE STEHEN UNTEREINANDER — 04.08.2026, angesagt: „bei
   Inhalte die Beitraege direkt im Kalender sichtbar."

   Hier stand `.kalender__marken`: eine Reihe aus ALLEN Kanalzeichen,
   darunter der Anriss des ERSTEN Beitrags. An einem Tag mit zwei
   Beitraegen war der zweite damit eine Marke und kein Beitrag.

   AM HANDY BLEIBT ES EINE REIHE. Dort ist der Anriss ausgeblendet
   (siehe unten), und untereinander stehende Zeichen wuerden die Zelle
   ohne Gewinn hoeher machen. Die Regel steht deshalb weiter unten im
   Handy-Block. */
.kalender__eintraege {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.kalender__eintrag {
  display: flex;
  align-items: center;
  gap: var(--abstand-1);
  min-width: 0;
}

/* Die Zellen vor dem Monatsersten. Kein Rahmen, kein Grund — sie sind
   nicht leer, sie gehören nicht dazu. */
.kalender__zelle--leer {
  border: 0;
  min-height: 0;
}

.kalender__tag {
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

.kalender__zelle--voll .kalender__tag {
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

/* DER CHIP IN DER ZELLE IST WEG — 02.08.2026. Was von ihm bleibt, ist die
   Groesse des Kanalzeichens: `kanalzeichen--klein` (28 px) statt der
   Sonderregel mit 16 px und 9 px Schrift. Gemessen belegte das
   Zwei-Buchstaben-Kuerzel dort 15 x 20,5 px in einem 16-px-Zeichen, also
   106 % der Breite und 148 % der Hoehe: es stand ueber seinem eigenen
   Kreis. Die kleine Groesse traegt es mit 13 px Schrift innen. */

/* ===================================================================
   `.kalender__anriss` IST GEFALLEN — Baustelle 2.3, 04.08.2026
   ===================================================================

   Hier standen `white-space: nowrap` und `text-overflow: ellipsis` —
   die Regeln, die den 24-Zeichen-Anriss sauber abschnitten. Angesagt:
   „Kein Text, der mit ‚…' endet."

   AN SEINE STELLE TRITT DIE FARBE. Der Eintrag traegt jetzt denselben
   Vorschauton wie die Zeile in der Liste (`vorschau--*`), und damit ist
   ein Beitrag im Kalender wiederzuerkennen, ohne dass ein Wortanfang
   dasteht.

   DIE REGEL WEITER UNTEN (`display: none` ab 60rem) ist damit
   gegenstandslos und faellt mit — sie versteckte den Anriss auf breiten
   Fenstern, wo mehrere Eintraege in eine Reihe passen sollten. Es gibt
   keinen Anriss mehr zu verstecken. */

/* Der Eintrag als kleine Farbflaeche. 20 px sind die Hoehe des
   Kanalzeichens darin — die Flaeche traegt es, statt danebenzustehen. */
.kalender__eintrag.vorschau {
  border-radius: var(--radius-klein);
  padding: 2px var(--abstand-1);
  min-height: 22px;
}

/* ===================================================================
   DIE AUFSCHRIFT IN DER ZELLE — 11.08.2026, zurück und diesmal mit Platz
   ===================================================================

   Am 04.08.2026 fiel der Text aus der Zelle, und der Grund war richtig:
   `anreissen(b.text, 24)` ergab einen Wortanfang mit drei Punkten, und die
   Ansage lautete „Kein Text, der mit ‚…' endet."

   WAS JETZT DASTEHT, IST KEIN ANRISS. Es ist dieselbe Aufschrift wie in der
   Liste — `vorschauwort()`, zwei bis drei GANZE Wörter, Satzzeichen am Ende
   abgestreift. Sie kann gar nicht mit „…" enden.

   AM HANDY STEHT SIE NICHT. Sieben Spalten sind bei 390 px rund 44 px breit;
   dort trägt die Fläche die Farbe und sonst nichts. Das ist keine Notlösung,
   sondern dieselbe Regel wie überall: was nicht lesbar hinpaßt, steht nicht
   da. `display: none` und nicht `overflow: hidden` — ein zur Hälfte
   sichtbares Wort ist schlechter als keines. */
.kalender__wort {
  display: none;
}

/* --- Ab 45rem: die Zelle wird hoch und trägt Text ------------------ */

@container huelle (min-width: 45rem) {
  .kalender__zelle {
    min-height: var(--kalender-zelle-weit);
  }

  /* OBEN AUSGERICHTET UND NICHT MITTIG: die Tageszahl steht am Kopf der
     Zelle, die Beiträge darunter. Mittig hieße, daß ein Tag mit einem
     Beitrag anders sitzt als einer mit zweien. */
  .kalender__flaeche {
    justify-content: flex-start;
  }

  .kalender__wort {
    display: block;
    min-width: 0;
    font-size: var(--groesse-mikro);
    font-weight: 800;
    line-height: 1.25;
    /* ===================================================================
       GETRENNT STATT GEKAPPT — 11.08.2026, im Bild gefunden
       ===================================================================

       HIER STAND `-webkit-line-clamp: 2` mit `overflow: hidden`. Bei 1440 px
       ist die Zelle 112 px breit, und damit stand da „Zählerschran" und
       „Sicherungska" — mitten im Wort abgeschnitten. Die Auflage vom
       04.08.2026 nennt zwar nur „…", meint aber genau das: ein Wortanfang
       sagt weniger als nichts.

       ZWEI ÄNDERUNGEN, UND BEIDE BRAUCHT ES. Der Text kommt seit heute mit
       14 statt 24 Zeichen (ein langes oder zwei kurze Wörter), und hier
       trennt `hyphens: auto` das lange, statt es zu kappen. Ohne das erste
       stünden zwei Wörter in drei Zeilen; ohne das zweite bräche
       „Zählerschrank" hart um.

       KEIN CLAMP MEHR. Er war der Grund für das Kappen, und die Zelle hat
       mit 160 px Höhe Platz für drei Zeilen. Was nicht paßt, macht die Zelle
       höher — und weil `min-height` und nicht `height` dasteht, wächst dann
       die Woche mit, statt daß Text verschwindet. */
    hyphens: auto;
    overflow-wrap: break-word;
  }

  /* Der Eintrag wird zur kleinen Karte: Zeichen und Aufschrift überein-
     ander statt nebeneinander. Nebeneinander blieben bei 170 px Breite
     hinter dem 28-px-Zeichen 130 px für zwei fette Wörter — zu wenig. */
  .kalender__eintrag.vorschau {
    flex-direction: column;
    align-items: flex-start;
    gap: 2px;
    padding: var(--abstand-1) var(--abstand-2);
  }
}

/* --- Ab Tablet: zwei Spalten -------------------------------------- */

@container huelle (min-width: 60rem) {
  /* ZWEI SPALTEN NUR, WENN EIN BEITRAG OFFEN IST — 02.08.2026.
     Vorher stand `26rem 1fr` unbedingt: die Detailspalte war im Ruhezustand
     720 x 565,5 px gross und trug einen einzigen Satz — 1,5 % belegt. Keine
     der vier Vorlagen haelt eine Detailspalte offen, solange nichts gewaehlt
     ist. Am Handy geschah das schon immer richtig (`display: none`); hier
     bekommt die Liste den Platz.

     DIE REGEL SITZT SEIT DEM 11.08.2026 AN `.inhalte__arbeit` und nicht mehr
     an `.inhalte`: die Seite hat jetzt zwei Raster, und die Spalten gehören
     dem unteren. Am oberen hängt das Bento, und das hat seine eigenen. */
  .inhalte[data-offen='ja'] .inhalte__arbeit {
    grid-template-columns: clamp(22rem, 34%, 30rem) minmax(0, 1fr);
  }

  .inhalte__kalender {
    grid-column: 1 / -1;
  }
}

/* --- Am Handy ----------------------------------------------------- */
/*
   Der Beitrag legt sich ÜBER die Liste, er ersetzt sie nicht —
   dieselbe Entscheidung wie im Posteingang: ein Seitenwechsel würde
   die Liste neu aufbauen und die Stelle verlieren. */

@container huelle (max-width: 59.999rem) {
  /* ===================================================================
     DAS BLATT IST SO HOCH WIE SEIN INHALT — 11.08.2026, im Bild gefunden
     ===================================================================

     Bei 390 px war die Seite 2790 px hoch, und der Beitrag endete bei
     1449. Dahinter kamen 1341 px weisses Nichts, durch das man scrollt.

     URSACHE: `inset: 0` streckt das Blatt auf seinen Behaelter, und der
     ist so hoch wie die LISTE darunter (gemessen 1565 px) — nicht so
     hoch wie der Beitrag. Solange die Liste im Fluss steht, bestimmt sie
     die Hoehe einer Ansicht, die sie gar nicht zeigt.

     Also geht sie weg, und das Blatt haengt nur noch oben. Der Grund,
     aus dem sie bisher stehenblieb — „ein Seitenwechsel wuerde sie neu
     aufbauen und die Stelle verlieren" —, ist seit `teilaufbau.js`
     gegenstandslos: es gibt keinen Seitenwechsel mehr. `display: none`
     nimmt der Liste die Hoehe, nicht ihr Markup; beim Zurueck steht sie
     unveraendert da.

     Der Kalender steht mit in der Regel, weil er dieselbe Stelle
     einnimmt: in der Kalenderansicht ist ER der hohe Nachbar. */
  .inhalte[data-offen='ja'] .inhalte__liste,
  .inhalte[data-offen='ja'] .inhalte__kalender {
    display: none;
  }

  .inhalte[data-offen='ja'] .beitragsblatt--offen {
    /* Dieselbe Entscheidung wie beim Gespraech: gegen den
       Inhaltsbereich, nicht gegen das Fenster.

       `inset: 0 0 auto 0` und nicht `inset: 0`: oben, links und rechts
       angeschlagen, unten frei. Die Hoehe kommt damit vom Inhalt. */
    position: absolute;
    inset: 0 0 auto 0;
    z-index: 60;
    /* `background-color`, NICHT die Kurzform. Hier stand `background:` und
       hat damit die Schnittkante aus Querschnitt Q8 mit zurueckgesetzt —
       eine Kurzform setzt `background-image` mit. Gemessen von P2: bei
       390 px lagen 180 px unter der Kante, ohne jedes Zeichen.
       Wer nur eine Farbe will, sagt Farbe. */
    background-color: var(--farbe-flaeche);
  }

  .inhalte[data-offen='nein'] .beitragsblatt {
    display: none;
  }

  /* AM HANDY IST DER EINTRAG DIE TREFFERFLÄCHE, NICHT DIE ZELLE.
     Gemessen: sieben Spalten bei 390 px ergeben 43 px breite Zellen, und
     der Eintrag darin war ein 16-px-Symbol. Mit Arbeitshandschuh ist das
     nichts. Der Eintrag füllt jetzt die Zelle und ist mindestens 44 px
     hoch; ein Tag mit zwei Beiträgen wird entsprechend höher, statt zwei
     unerreichbare Punkte übereinanderzustapeln. */
  /* KEINE LÜCKEN AM HANDY. Sieben Spalten mal 44 px sind 308 px; bei
     390 px Fensterbreite bleiben nach den Rändern rund 358 px. Jede Lücke
     und jede Polsterung geht davon ab — mit 4 px Lücke und 16 px Polsterung
     waren es 43 px je Spalte, also knapp darunter. Ohne Lücken sind es 51.
     Die Zellen grenzen dann aneinander; getrennt werden sie vom Rahmen. */
  /* DAS EIGENE POLSTER IST WEG — 11.08.2026. Der Kalender ist seit dem
     Neubau eine `.inhaltskachel` und hat ihres; zwei Polster übereinander
     nahmen dem Raster 16 px, die es an sieben Spalten braucht. Die Rechnung
     darüber gilt weiter, nur mit dem Kachelpolster statt diesem: 390 px
     minus 2 x 16 Seitenrand minus 2 x 24 Kachelpolster sind 310, durch
     sieben 44 px je Spalte. Gemessen 47. */

  .kalender,
  .kalender__wochentage {
    gap: 0;
  }

  .kalender__zelle {
    /* HIER STAND `min-height: 48px` UND ÜBERSCHRIEB DEN TOKEN — gefunden
       beim Nachmessen am 11.08.2026: gesetzt war `--kalender-zelle` (88 px),
       gemessen wurden 61. Eine Regel weiter unten im Stylesheet gewinnt bei
       gleicher Spezifität, und diese hier stand zweihundert Zeilen später.

       Ein Token, der an einer Stelle gesetzt und an einer anderen still
       überschrieben wird, ist schlimmer als eine Zahl: er sieht aus, als
       gälte er. Der Handy-Wert steht jetzt IM Token — die 48 px des
       Arbeitshandschuhs sind darin enthalten und mehr als erfüllt. */
    min-height: var(--kalender-zelle);
    border-radius: 0;
  }

  /* Am Handy trägt die Fläche nur noch Ziffer und Marken — der Anriss
     fällt weg. Sie füllt die Zelle senkrecht mit aus, damit die
     Trefferfläche die ganzen 48 px hoch ist und nicht nur ihren Inhalt. */
  .kalender__flaeche {
    flex: 1 1 auto;
    justify-content: center;
    padding: 2px;
  }

  /* OHNE ANRISS SIND DIE EINTRAEGE NUR NOCH ZEICHEN, und die gehoeren
     in eine Reihe. Untereinander waeren zwei Beitraege 56 px hoch statt
     28, ohne dass ein Wort mehr dastuende. Das ist genau die Anordnung,
     die `.kalender__marken` bis zum 04.08.2026 hatte — sie faellt also
     nicht weg, sie gilt nur noch dort, wo sie richtig ist. */
  .kalender__eintraege {
    flex-direction: row;
    flex-wrap: wrap;
  }
}

@container huelle (min-width: 60rem) {
  /* Zurück gibt es nur am Handy: am Laptop steht die Liste daneben. */
  .beitragsblatt__zurueck {
    display: none;
  }
}


/* ===================================================================
   BEREICH 13 · KI im Produkt
   ===================================================================

   Regel 13: „Ein stiller Satz im Kontext. Ein Vorschlag mit zwei
   Knöpfen. Ein Protokoll ohne Chatfeld. Kein Assistenz-Panel."

   ZWEI ENTSCHEIDUNGEN TRAGEN DIESEN ABSCHNITT:

   1. DER VORSCHLAG IST KEIN PANEL. Er hat keine eigene Farbe, kein
      Funkel-Symbol, keinen Rahmen in der Handlungsfarbe und keine
      Kopfzeile „KI-Vorschlag". Er sieht aus wie ein Textentwurf,
      weil er einer ist. Was ihn kennzeichnet, ist die gestrichelte
      Kante: „noch nicht abgeschickt".

   2. DAS PROTOKOLL BESTEHT AUS SÄTZEN, nicht aus Tabellenzeilen.
      Datum, Betrag, Beitrag und Grund stehen in einem Satz — als
      vier Spalten wäre der Grund die Spalte, die als erste
      abgeschnitten wird.
   =================================================================== */

/* --- Der Antwortvorschlag ----------------------------------------- */

.vorschlag {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-3);
  margin: 0 var(--abstand-4);
  padding: var(--abstand-4);
  /* Gestrichelt, nicht eingefärbt: das ist die Kante eines Entwurfs.
     Ein voller Rahmen in der Handlungsfarbe wäre ein Panel. */
  border: var(--randbreite) dashed var(--farbe-rand-stark);
  border-radius: var(--radius-standard);
  background: var(--farbe-flaeche);
}

.vorschlag__text {
  margin: 0;
  /* 17 px: hier wird gelesen. Dieselbe Regel wie am Antwortfeld. */
  font-size: var(--groesse-text);
  color: var(--farbe-text);
  overflow-wrap: anywhere;
}

/* GENAU ZWEI KNÖPFE. Rechtsbündig wie am Antwortfeld darunter,
   damit die Hand nicht springt. */
.vorschlag__knoepfe {
  display: flex;
  gap: var(--abstand-3);
  justify-content: flex-end;
}

.vorschlag__knoepfe .knopf {
  text-decoration: none;
}

/* --- Das Boost-Protokoll ------------------------------------------ */

.protokoll {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-2);
}

.protokoll__titel {
  margin: 0;
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

.protokoll__liste {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-2);
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Ein Eintrag ist ein Satz. Der Strich links ist die einzige
   Verzierung — er hält die Sätze zusammen, ohne sie einzurahmen. */
.protokoll__eintrag {
  padding-left: var(--abstand-3);
  border-left: 2px solid var(--farbe-rand);
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
  overflow-wrap: anywhere;
}

/* Der Betrag ist die einzige Zahl im Satz und darf sie bleiben —
   nicht groß, nur fett. Eine große Zahl stünde in Konkurrenz zur
   Bewertung, und die ist die auffälligste Stelle der Seite. */
.protokoll__betrag {
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
  white-space: nowrap;
}

.protokoll__nichts {
  margin: 0;
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}


/* ===================================================================
   BEREICH 05 · Story-Upload
   ===================================================================

   Regel 05: „Zwei Schritte. Der 9:16-Zuschnitt ist eine
   VOREINSTELLUNG, kein Schritt."

   DREI ENTSCHEIDUNGEN TRAGEN DIESEN ABSCHNITT:

   1. DIE KAMERA-KACHEL STEHT AN ERSTER STELLE — am Handy. Am PC
      steht dort das Ablegefeld. Beides ist derselbe Bildschirm; was
      sichtbar ist, entscheidet die Breite des Behälters, nicht ein
      zweiter Bildschirm.

   2. DER RAHMEN HAT DAS ZIELFORMAT, NICHT DAS BILD. 9:16 steht als
      aspect-ratio am Rahmen. So sieht der Meister, was rausgeht.

   3. DREI STELLUNGEN, KEIN REGLER. Abschnitt 6 streicht den Regler
      ausdrücklich: mit Arbeitshandschuh nicht bedienbar.
   =================================================================== */

.hochladen {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-4);
  /* Eigener Bildlauf gefallen — Baustelle 0.1. */
  padding: var(--abstand-4);
}

/* Die Meldung nach dem Absenden. Kein dritter Schritt: sie steht über
   dem ersten, und der Meister ist sofort wieder da, wo er anfängt. */
/* AM INHALT BEMESSEN, NICHT AN DER SEITE — 02.08.2026. Die Meldung war
   1104 px breit für 334 px Text: 738 px (69 %) leere getönte Fläche. Laters
   Kurzmeldungen sind am Inhalt bemessen (320 px). Und der Haken ist der
   zweite Träger neben der Farbe — Fabric setzt ihn je Zeile. */
.hochladen__fertig {
  display: inline-flex;
  gap: var(--abstand-2);
  align-items: center;
  width: max-content;
  max-width: 100%;
  margin: 0;
  padding: var(--abstand-3) var(--abstand-4);
  border-radius: var(--radius-standard);
  background: var(--farbe-erfolg-hell);
  color: var(--farbe-text);
  font-weight: var(--schrift-halbfett);
}

.hochladen__fertig .symbol {
  flex: 0 0 auto;
  color: var(--farbe-erfolg);
}

.hochladen__waehlen {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-4);
}

/* --- Das Ablegefeld ----------------------------------------------- */
/*
   NUR AM PC. Am Handy ist Ziehen und Ablegen bedeutungslos, dort
   steht die Kamera-Kachel. Das ist keine Verkleinerung, es ist die
   andere Hälfte derselben Entscheidung (e2 und e5). */

.ablegefeld {
  /* `relative`, damit die Eingabe die ganze Zone deckt und nicht die
     Seite. Sie ist der eigentliche Ablegebereich (siehe unten). */
  position: relative;
  display: none;
  flex-direction: column;
  align-items: center;
  gap: var(--abstand-2);
  /* 32 → 24 px oben und unten: die Zone wird 205,5 → 189,5 px hoch, und
     damit passt bei 1440 die sechsspaltige Galerie darunter noch auf den
     Schirm. Dropbox' Zone nimmt 43,3 % der Inhaltshöhe — das wären hier
     298 px und 92,5 px weniger Galerie; ihre Zone füllt einen LEEREN
     Ordner, unsere steht über einer vollen. */
  padding: var(--abstand-5) var(--abstand-4);
  border: var(--randbreite) dashed var(--farbe-rand-stark);
  border-radius: var(--radius-standard);
  background: var(--farbe-flaeche);
  text-align: center;
}

.ablegefeld .symbol {
  color: var(--farbe-text-gedaempft);
}

.ablegefeld__satz {
  margin: 0;
  color: var(--farbe-text-gedaempft);
}

/* Der Ersatzknopf. Ein <label for>, kein Behälter mehr: die Eingabe liegt
   jetzt über der ganzen Zone. Er muss trotzdem ÜBER ihr liegen, sonst
   fängt sie seinen Klick ab und er ist nur noch gemalt. */
.ablegefeld__knopf {
  position: relative;
  z-index: 1;
  cursor: pointer;
}

/* DER FOKUSRING GEHÖRT AN DEN KNOPF — 02.08.2026. Er lag auf der
   `opacity: 0`-Eingabe und war damit sichtbar 0 px breit: wer mit der
   Tastatur hierher kam, sah nicht, wo er war. */
.ablegefeld:has(.ablegefeld__eingabe:focus-visible) .ablegefeld__knopf,
.ablegefeld__knopf.zeige-fokus {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: var(--fokusring-abstand);
}

.ablegefeld__eingabe,
.kamera__eingabe {
  /* DA, ABER UNSICHTBAR. Die Eingabe deckt die ganze Fläche ab, damit
     die Trefferfläche der Knopf ist und nicht der Dateiname daneben,
     den der Browser sonst zeichnet.
     AM ABLEGEFELD IST „die ganze Fläche" DIE ZONE, nicht der Knopf —
     gemessen waren 3,4 % der Zone ablegbar, jetzt sind es alle. */
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  cursor: pointer;
}

.ablegefeld__formate {
  margin: 0;
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

/* --- Die Galerie -------------------------------------------------- */

.galerie {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
  gap: var(--abstand-3);
  margin: 0;
  padding: 0;
  list-style: none;
}

.galerie__kachel {
  display: flex;
}

.galerie__flaeche,
.kamera {
  position: relative;
  display: flex;
  flex-direction: column;
  /* 2 px kennt die Leiter nicht — sie geht 4/8/12/16/24/32/48/72/112.
     Neun Vorkommen je Bildschirm, alle auf 4 px. */
  gap: var(--abstand-1);
  width: 100%;
  padding: var(--abstand-2);
  border-radius: var(--radius-standard);
  /* Ein Verweis bringt Verweisfarbe und Unterstreichung mit — dieselbe
     Falle wie an den Listenzeilen und am Umschalter. */
  color: inherit;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--dauer-schnell) var(--kurve);
}

.galerie__flaeche:hover,
.galerie__flaeche.zeige-ueberfahren,
.kamera:hover,
.kamera.zeige-ueberfahren {
  background: var(--farbe-flaeche-gedaempft);
}

.galerie__flaeche:focus-visible,
.galerie__flaeche.zeige-fokus,
.kamera:focus-within,
.kamera.zeige-fokus {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: var(--fokusring-abstand);
}

/* Die Fläche eines Fotos. Sie hat das Format eines Fotos, auch wenn
   keines da ist — so springt nichts, wenn später eines dazukommt.
   Geteilt zwischen Bereich 05 und 06: zwei Fassungen wären zwei
   Stellen, an denen das Seitenverhältnis abdriften kann. */
.fotoflaeche {
  display: grid;
  place-items: center;
  width: 100%;
  aspect-ratio: 4 / 3;
  border-radius: var(--radius-klein);
  background: var(--farbe-flaeche-gedaempft);
  color: var(--farbe-text-gedaempft);
}

.fotoflaeche__bild {
  width: 100%;
  aspect-ratio: 4 / 3;
  border-radius: var(--radius-klein);
  object-fit: cover;
  /* DER GRUND DES PLATZHALTERS DARUNTER — 17.10.2026. Laedt ein Bild nicht
     (ein HEIC in Chrome, ein abgelaufener Verweis), steht sonst ein leeres
     Loch in der Kachel; so steht dieselbe Flaeche da wie ohne Bild. */
  background: var(--farbe-flaeche-gedaempft);
}

.galerie__name {
  font-size: var(--groesse-mikro);
  font-weight: var(--schrift-halbfett);
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.galerie__datum {
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

/* Kein Leerbild und kein Knopf: die Wege heraus stehen schon darüber. */
.galerie__nichts {
  margin: 0;
  color: var(--farbe-text-gedaempft);
}

/* --- Die Kamera-Kachel -------------------------------------------- */
/*
   AN ERSTER STELLE UND OHNE ZWISCHENSCHRITT. Sie sieht anders aus als
   ein Foto, weil sie keines ist: getönte Fläche, Symbol, Wort. */

.kamera {
  align-items: center;
  justify-content: center;
  aspect-ratio: 4 / 3;
  /* RAND AUF DIE PRIMAERFARBE — 02.08.2026. `--farbe-rand-primaer-leise`
     hielt gegen die eigene Flaeche gemessen 3,01:1 gegen eine Auflage von
     3:1. Null Komma null eins Luft ist keine. Jetzt 3,86:1. */
  border: var(--randbreite) solid var(--farbe-primaer);
  background: var(--farbe-primaer-sehr-hell);
  /* Das SYMBOL bleibt primaer: 3,86:1 auf der getoenten Flaeche, und fuer
     Grafik lautet die Auflage 3:1. Das WORT nicht — siehe unten. */
  color: var(--farbe-primaer);
  text-align: center;
}

.kamera .symbol {
  width: var(--symbol-gross);
  height: var(--symbol-gross);
}

/* DIE PRIMAERFARBE IST HIER KEIN TEXT — 02.08.2026. `#665DF5` auf
   `#E8E6FF` haelt 3,86:1, die Auflage fuer Text ist 4,5:1: 14,2 % zu
   wenig. Auf `--farbe-text` sind es 10,80:1 (+180 %).
   Genau dieser Fall steht als Kommentar schon an `.stellung` — dort hat
   die Regel ihn gefunden. An dieser Stelle stand er noch. */
.kamera__wort {
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

/* --- Schritt 2: der Zuschnitt ------------------------------------- */

/* SCHRITT 2 IST EIN BILDSCHIRM, ALSO PASST ER AUF EINEN.
   Zuerst stand hier nur `gap` und der Rahmen nahm sich seine Höhe aus
   dem Seitenverhältnis — bei 390 px waren die drei Stellungen und der
   Knopf darunter abgeschnitten. Wer den Knopf suchen muss, hat einen
   dritten Schritt, auch wenn keiner dasteht. Der Rahmen schrumpft
   jetzt auf das, was übrig bleibt; die Bedienung steht fest.
   Im Bild aufgefallen. */
.zuschnitt {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--abstand-4);
  /* Die Spalte war bei 1440 nur 272 von 1136 px breit = 23,9 %; Laters
     Composer nimmt 52,9 %. Mit der Lesebreite sind es 47,9 %. */
  max-width: var(--lese-breite);
  margin-inline: auto;
}

.zuschnitt__frage {
  flex: 0 0 auto;
  margin: 0;
  font-size: var(--groesse-h3);
  font-weight: var(--schrift-halbfett);
}

/* DER RAHMEN HAT DAS ZIELFORMAT. Nicht das Bild — der Rahmen. So
   sieht der Meister, was rausgeht, und nicht, was er hochgeladen hat.
   Die Höhe ist gedeckelt, damit auf dem Laptop nicht ein
   bildschirmhohes Hochformat steht. */
/* DIE HÖHE WIRD ÜBER DIE BREITE GEDECKELT, nicht über den Elternteil.
   Zwei Anläufe waren falsch:

     `aspect-ratio` allein — dann nahm sich der Rahmen seine volle Höhe,
     und bei 390 px lagen die Stellungen und der Knopf außerhalb.

     `flex: 1 1 auto; min-height: 0` in einem `height: 100%`-Elternteil —
     das saß in der Werkstattprobe, weil die Probe eine feste Höhe hat.
     Auf der echten Seite hat sie keine, also löste sich `height: 100%`
     zu `auto` auf und der Rahmen fiel auf NULL zusammen. Grün gemessen,
     weil die Messung in der Werkstatt lief. Im Bild der echten Seite
     sofort zu sehen.

   Jetzt hängt die Höhe an nichts als der Fensterhöhe: 38vh, umgerechnet
   über das Zielformat in eine Breite. Damit stimmt es in jedem
   Elternteil, mit oder ohne eigene Höhe. */
.zuschnitt__rahmen {
  display: grid;
  place-items: center;
  overflow: hidden;
  flex: 0 0 auto;
  width: min(100%, 17rem, calc(38vh * 9 / 16));
  aspect-ratio: 9 / 16;
  border-radius: var(--radius-standard);
  background: var(--farbe-flaeche-gedaempft);
}

.zuschnitt__rahmen .fotoflaeche {
  width: 100%;
  height: 100%;
  aspect-ratio: auto;
  border-radius: 0;
}

/* DIE STELLUNG WIRKT — 02.08.2026, und das ist der Satz, der das ganze
   Kapitel trägt.
   `data-stellung` stand im HTML, die drei Knöpfe ließen sich drücken, und
   die gewählte Stellung war an Fläche, Rand und Schriftgewicht abzulesen.
   Nur am BILD änderte sich nichts: `object-position` kam in 6858 Zeilen
   Stilvorlage 0 Mal vor. Zwei der drei Stellungen taten gar nichts, und
   die dritte tat zufällig das Richtige.
   Über `:has()` am Formular, nicht über `data-stellung`: das Attribut kennt
   nur den Serverstand, der Radioknopf kennt die Wahl des Meisters. */
.zuschnitt__rahmen .fotoflaeche__bild {
  object-fit: cover;
  transition: object-position var(--dauer-mittel) var(--kurve);
}

.zuschnitt:has(.stellung__wahl[value="0"]:checked) .fotoflaeche__bild {
  object-position: 50% 0%;
}

.zuschnitt:has(.stellung__wahl[value="50"]:checked) .fotoflaeche__bild {
  object-position: 50% 50%;
}

.zuschnitt:has(.stellung__wahl[value="100"]:checked) .fotoflaeche__bild {
  object-position: 50% 100%;
}

.zuschnitt__nichts {
  margin: auto;
  color: var(--farbe-text-gedaempft);
}

/* --- Die drei Stellungen ------------------------------------------ */
/*
   KEIN REGLER. Drei Knöpfe, jeder mit voller Trefferfläche —
   dieselbe Bauart wie die Betragswahl in Bereich 04: die echte
   Eingabe liegt unsichtbar über der ganzen Zeile. */

.stellungen {
  flex: 0 0 auto;
  display: flex;
  gap: var(--abstand-2);
  width: 100%;
  /* 17rem WAR ZU ENG — 02.08.2026. Die drei Chips massen 85,3 px bei 390
     und ebenfalls nur 176 px bei 1440: eine Trefferflaeche, die am Laptop
     genauso schmal bleibt wie am Handy, obwohl daneben Platz ist.
     `--lese-breite` bringt sie auf 103,3 beziehungsweise 176 px. */
  max-width: var(--lese-breite);
  margin: 0;
  padding: 0;
  border: 0;
}

.stellungen__frage {
  /* Die Beschriftung gehört ins Vorleseprogramm, nicht ins Bild:
     was die drei Knöpfe tun, sagen ihre Wörter. */
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

.stellung {
  position: relative;
  display: grid;
  place-items: center;
  flex: 1;
  min-height: 44px;
  border: var(--randbreite) solid var(--farbe-rand-bedienelement);
  border-radius: var(--radius-knopf);
  background: var(--farbe-flaeche);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  cursor: pointer;
}

.stellung__wahl {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: pointer;
}

/* Drei Träger: Fläche, Rahmenfarbe und Schriftgewicht. Farbe allein
   trägt nichts.

   DIE SCHRIFT BLEIBT --farbe-text. Zuerst stand hier die Handlungsfarbe,
   und das ist genau der Fall, den die geprüfte Regel aus Bereich 11
   verbietet: die Primärfarbe als Text auf einer getönten Fläche.
   Gemessen 3,86 : 1. Die Regel hat es gefunden, nicht ich. */
.stellung:has(.stellung__wahl:checked) {
  border-color: var(--farbe-primaer);
  background: var(--farbe-primaer-sehr-hell);
  color: var(--farbe-text);
  font-weight: var(--schrift-halbfett);
}

.stellung:has(.stellung__wahl:focus-visible) {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: var(--fokusring-abstand);
}

.zuschnitt__fuss {
  flex: 0 0 auto;
  display: flex;
  gap: var(--abstand-4);
  align-items: center;
  justify-content: center;
  width: 100%;
  /* DER HAUPTKNOPF WAR ZWEIZEILIG — bei 390 UND bei 1440, gemessen
     197,8 x 62,9 px. Laters „Schedule Post" ist ueber fuenf Schritte
     einzeilig und wandert um 0 px. Mit der Lesebreite bekommt der Knopf
     251,7 px (390) und 469,7 px (1440) und wird 44 px hoch (−30 %). */
  max-width: var(--lese-breite);
}

/* NICHT IN DER HANDLUNGSFARBE. Sie hält auf dem Seitengrund #F8F8F8 nur
   4,44 : 1 — knapp unter der Auflage, und der Grund ist keine reine
   weiße Fläche. Der Träger ist deshalb die Unterstreichung: ein Verweis
   sieht aus wie ein Verweis, ohne die Farbe dafür zu brauchen. */
.zuschnitt__zurueck {
  /* 58,3 x 26,9 px waren 17,1 px unter der Auflage. Unsere 44-px-Regel
     schlaegt Instagrams 16 x 16 grosses Schliessen-X. */
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--farbe-text);
  font-weight: var(--schrift-halbfett);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.zuschnitt__fuss .knopf {
  flex: 1;
}

/* --- Ab Tablet: das Ablegefeld erscheint, die Kamera geht ---------- */

@container huelle (min-width: 45rem) {
  .ablegefeld {
    display: flex;
  }

  /* Am Schreibtisch gibt es keine Baustellenkamera. Was dort zählt,
     ist das Ablegefeld darüber. */
  .galerie__kachel--kamera {
    display: none;
  }

  /* SECHS SPALTEN STATT SIEBEN — 02.08.2026. Die Kachel wurde von 390 auf
     1440 px SCHMALER: 157 → 147,4 px. Auf dem größeren Schirm die kleinere
     Kachel ist die falsche Richtung; Proton hält seine bei 14,8 % der
     Spaltenbreite. Mit 9,5rem sind es sechs Spalten und 174 px (+18 %).
     Unter 45rem bleibt 9,5rem verboten: bei 326 px Breite fiele das Raster
     auf EINE Spalte. */
  .galerie {
    grid-template-columns: repeat(auto-fill, minmax(9.5rem, 1fr));
  }

  /* DER RAHMEN DARF AM LAPTOP GRÖSSER SEIN. 192,4 × 342 px waren 16,9 %
     der Inhaltsbreite, während Instagrams Vorschau die volle Rasterbreite
     nimmt. 48vh statt 38vh ergeben 243 × 432 px (+26,3 %); vom Restbudget
     des Schritts (437,7 px) bleiben 5,7 px Luft. */
  .zuschnitt__rahmen {
    width: min(100%, var(--lese-breite), calc(48vh * 9 / 16));
  }
}


/* ===================================================================
   BEREICH 06 · Drive
   ===================================================================

   Regel 06: „Ordnerzeile oben, Dateien als Kacheln darunter, zwei
   Knöpfe. Auf jeder Ordner-Kachel ein Inhaltszähler."

   DREI ENTSCHEIDUNGEN:

   1. DER ZÄHLER beantwortet „ist da was drin?" ohne Klick. Ein leerer
      Ordner sagt „leer" — eine Null liest sich wie ein Messwert.

   2. KACHELN, KEINE TABELLE. „Fotos erkennt man am Bild, nicht am
      Dateinamen." Zu Tabellen gibt es keine Entscheidung (Lücke 2).

   3. FLACH. Eine Ordnerzeile, kein Baum. Baustellen liegen nicht
      ineinander.
   =================================================================== */

.drive {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-4);
  /* DER EIGENE BILDLAUF IST GEFALLEN — Baustelle 0.1, 04.08.2026.
     Er kam am 01.08. herein, weil `.inhalt` auf `overflow: hidden` stand
     und eine Seite ohne eigenen Bildlauf still abschnitt: bei 390 px und
     +15 % Schrift ragte das Leerbild im offenen Ordner 36 px unter den
     Rand der Huelle.

     Die URSACHE dieses Fundes war nie Drive, sondern die Grenze an
     `.inhalt`. Die ist weg, also faellt auch das Gegenmittel. Der Fall
     von damals kann nicht wiederkommen: was laenger ist als der
     Bildschirm, verlaengert jetzt das Dokument. */
}

/* --- Die zwei Knöpfe ---------------------------------------------- */
/*
   Oben rechts, zusammen — `f2`: „die zwei einzigen Handlungen sitzen
   zusammen oben rechts". Genau EINER ist gefüllt. */

/* Oben rechts, zusammen. AM HANDY NEBENEINANDER UND VOLL BREIT: als
   rechtsbündige Flexzeile brachen sie bei 390 px untereinander und
   standen als zwei verschieden breite Klötze am rechten Rand. Zwei
   Handlungen, zwei gleich große Ziele. Im Bild aufgefallen. */
/* SEIT DEM 11.08.2026 STEHT DIE GRUPPE IM KACHELKOPF. `flex: 0 0 auto` galt
   für den freien Stand zwischen Bento und Ordnerzeile; als Kind des Kopfes
   soll sie schrumpfen dürfen, wenn der Chip daneben lang wird — sonst
   drückt sie ihn aus der Zeile. Am Handy nimmt sie die ganze Breite und
   steht unter dem Chip; das macht `flex-wrap` am Kopf von selbst, sobald
   `flex-basis: 100%` unterschritten wird. */
.drive__werkzeuge {
  flex: 0 1 auto;
  display: flex;
  gap: var(--abstand-3);
  justify-content: flex-end;
  min-width: 0;
}

/* AM HANDY BRICHT DIE GRUPPE UNTER DEN CHIP UND NIMMT DIE GANZE BREITE.
   `flex-basis: 100%` erzwingt den Umbruch, `margin-left: 0` nimmt ihr die
   Lücke aus der Kopfregel zurück — sonst stünden zwei halbbreite Knöpfe
   rechtsbündig in der zweiten Zeile, und links davon wäre nichts. */
@container huelle (max-width: 44.999rem) {
  .drive__werkzeuge {
    flex: 1 0 100%;
    margin-left: 0;
  }
}

.drive__werkzeuge .knopf {
  flex: 1 1 auto;
  justify-content: center;
  /* WAAGERECHT SCHMALER AM HANDY — 02.08.2026. Mit 24 px Polster brauchten
     „Fotos hochladen" und „Neuer Ordner" nebeneinander mehr als 358 px und
     brachen je auf zwei Zeilen: die Werkzeugleiste war 70 px hoch statt 44.
     Der Text ist derselbe, nur der Rand um ihn ist kleiner — die
     Trefferfläche bleibt die ganze Kachelbreite.

     NACHGERECHNET AM 11.08.2026, weil die Rechnung nicht mehr stimmte:
     seit die Gruppe IN der Kachel steht, sind es nicht 358 px, sondern
     358 minus zweimal 24 px Kachelpolster = 300. Zwei Knöpfe zu je 144 px
     — und beide brachen wieder um, genau wie vor der Abhilfe von damals.
     Ein Vermerk, der eine Rechnung festhält, muß nachgerechnet werden,
     sobald sich einer ihrer Summanden ändert.

     8 px am Handy: „Fotos hochladen" mißt 105 px, dazu 16 px Rand sind
     121 von 144. Ab 45 rem ist der Platz da und die 16 px kommen zurück —
     ein 8-px-Rand an einer Pille auf dem Laptop sähe gequetscht aus. */
  padding-inline: var(--abstand-2);
}

@container huelle (min-width: 45rem) {
  .drive__werkzeuge .knopf {
    padding-inline: var(--abstand-4);
  }
}

@container huelle (min-width: 45rem) {
  .drive__werkzeuge .knopf {
    flex: 0 0 auto;
  }
}

/* --- Der Dialog „Neuer Ordner" — ohne Skript, über :target -------- */
/*
   EINE FRAGE, ZWEI KNÖPFE, MITTIG. Alle vier Vorlagen setzen die Mitte auf
   50,0 % der Breite; ihre Blätter messen 26,8 bis 51,8 % der Rasterbreite,
   unseres nimmt `--lese-breite` (544 px).

   `:target` ist der ganze Mechanismus. Der Knopf ist ein Verweis auf
   `#ordner-neu`, und diese Regel macht den Block sichtbar, sobald die
   Adresse dorthin zeigt. Kein Skript, kein `<details>` — ein Aufklappen in
   der Seite wäre eine Zeile in der Liste, kein Dialog.

   ZWEI WEGE HERAUS, beide ohne Skript: der Schleier selbst ist ein Verweis
   auf `#`, und „Abbrechen" ist derselbe Verweis mit einem Wort dran. Wer
   den Browser-Zurück-Knopf nimmt, kommt ebenfalls heraus — das ist der
   Vorteil einer Adresse gegenüber einem Zustand im Speicher. */
.dialog {
  display: none;
  position: fixed;
  inset: 0;
  z-index: 100;
  place-items: center;
  padding: var(--abstand-4);
}

.dialog:target {
  display: grid;
}

.dialog__schleier {
  position: absolute;
  inset: 0;
  background: var(--farbe-schleier);
}

.dialog__blatt {
  position: relative;
  /* `min-width: 0` MUSS DABEISTEHEN. Ein Rasterkind hat als automatische
     Mindestbreite `min-content` — und die schlägt `max-width`. Gemessen:
     560 statt 544 px, obwohl die Grenze dasteht. Dieselbe Falle wie bei der
     `1fr`-Spur, nur an der anderen Seite. */
  min-width: 0;
  width: 100%;
  max-width: var(--lese-breite);
  padding: var(--abstand-5);
  border-radius: var(--radius-gross);
  background: var(--farbe-flaeche);
  box-shadow: var(--schatten-3);
  animation: tritt-ein var(--dauer-mittel) var(--kurve) backwards;
}

.dialog__frage {
  margin: 0 0 var(--abstand-4);
  font-size: var(--groesse-h3);
}

/* Genau EIN gefüllter Knopf (Regel 09). „Abbrechen" trägt Umriss und steht
   links — die Handlung steht rechts, wo der Daumen sie erwartet. */
.dialog__knoepfe {
  display: flex;
  gap: var(--abstand-3);
  justify-content: flex-end;
  margin-top: var(--abstand-5);
}

.dialog__knoepfe .knopf {
  text-decoration: none;
}

/* Der Knopf ist ein <label> mit einer Dateieingabe darin — ohne Skript
   und ohne zweiten Weg. Dieselbe Bauart wie das Ablegefeld. */
.drive__hochladen {
  position: relative;
  overflow: hidden;
  cursor: pointer;
}

.drive__eingabe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  cursor: pointer;
}

/* DAS FORMULAR UM DAS FELD IST KEIN KASTEN — 17.10.2026. Label und
   Absendeknopf bleiben Flex-Kinder von `.drive__werkzeuge`; die Begruendung
   steht an `drivewerkzeuge()`. */
.drive__hochladen-form {
  display: contents;
}

/* DER ABSENDEKNOPF ERSCHEINT ERST MIT EINER AUSWAHL. `required` macht das
   Dateifeld erst dann `:valid` — ohne Skript, wie die Loeschleiste mit
   `:has(:checked)`. Umriss, weil „Fotos hochladen" daneben schon gefuellt ist
   und ein Bildschirm genau einen gefuellten Knopf hat. */
.drive__senden {
  display: none;
}

.drive__hochladen-form:has(.drive__eingabe:valid) .drive__senden {
  display: inline-flex;
}

/* MIT EINER AUSWAHL WEICHT „NEUER ORDNER" — 17.10.2026, gesehen bei 390 px:
   drei Pillen in 300 px brachen je auf zwei Zeilen. Wer gerade Fotos
   gewählt hat, legt in diesem Augenblick keinen Ordner an; nach dem
   Absenden steht er wieder da. So bleiben es immer zwei Knöpfe. */
.drive__werkzeuge:has(.drive__eingabe:valid) .drive__ordner-knopf {
  display: none;
}

/* --- Die Ordnerzeile ---------------------------------------------- */

/* EINE ZEILE, DIE UMBRICHT — kein Raster mit fester Spaltenzahl.
   Als `auto-fill`-Raster stand bei 1440 px ein sechsspaltiges Gitter da,
   in dem drei Ordner in schmalen Kacheln klebten und „Vorher & Na…"
   abbrach, obwohl daneben 600 px frei waren. Im Bild aufgefallen.
   Eine Flexzeile nimmt sich, was der Name braucht, und bricht um, wenn
   es eng wird. */
/* EIN RASTER, KEINE FLEX-ZEILE — 02.08.2026.
   Mit `flex-wrap` bestimmte der Inhalt die Kachelbreite, und die rechte
   Kante der Ordnerzeile stand woanders als die des Dateirasters darunter:
   zwei Raster auf einem Bildschirm, die nicht fluchten. Jetzt dieselbe
   Bauart und dieselbe Lücke wie bei den Dateien.

   `auto-fit` mit 20 rem Mindestbreite: bei 1136 px Inhaltsbreite ergibt das
   3 Spalten zu 368 px (3 × 368 + 2 × 16 = 1136), bei 358 px eine Spalte über
   die volle Breite — dieselbe Kante wie das Dateiraster in beiden Fällen.

   UND `min()` DAVOR — 05.08.2026, im Bild gefunden, als die Zeile
   zurückkam. `minmax(20rem, …)` heißt: diese Spur ist NIE schmaler als
   320 px, auch wenn der Platz es ist. Bei 390 px Fensterbreite ist die
   Inhaltsspalte 206 px breit (Frage 20), und die Zeile lief über die
   rechte Kante hinaus — „3 Fotos" war abgeschnitten.

   Die alte Rechnung ging von 358 px Inhalt aus und stimmte damals. Sie
   ist nicht falsch geworden, sondern überholt: dieselbe Falle wie am
   Dateiraster, das `min(11rem, 47%)` aus demselben Grund schon trägt. */
/* 16 REM STATT 20 — 11.08.2026, bei 1440 px im Bild gefunden.
   Die Zeile ist dort 811 px breit; mit 20 rem (320 px) passten zwei Spuren
   zu 398 px hinein, und der dritte Ordner stand allein in einer zweiten
   Reihe, halb so breit wie die Zeile darüber. Drei Ordner brauchen bei
   811 px höchstens 259 px je Spur — 16 rem sind 256 und passen.

   Bei 1920 ändert es nichts (`auto-fit` läßt die drei auf 413 px wachsen),
   bei 390 auch nicht (eine Spalte, wie vorher). Der Wert ist also nicht
   „kleiner ist besser", sondern die Grenze, an der drei nebeneinander
   gehen — und drei ist die Zahl, die dieser Bestand hat. */
.ordnerzeile {
  flex: 0 0 auto;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
  gap: var(--abstand-4);
  margin: 0;
  padding: 0;
  list-style: none;
}

.ordner {
  min-width: 0;
}

/* Die Flaeche ist das Ziel, damit die ganze Kachel anklickbar ist. */
.ordner__flaeche {
  width: 100%;
  min-width: 0;
  display: flex;
  gap: var(--abstand-3);
  align-items: center;
  /* Mit Handschuh: die ganze Kachel ist die Trefferfläche. */
  min-height: 56px;
  padding: var(--abstand-3);
  border: var(--randbreite) solid var(--farbe-rand);
  border-radius: var(--radius-standard);
  background: var(--farbe-flaeche);
  /* Ein Verweis bringt Verweisfarbe und Unterstreichung mit — dieselbe
     Falle wie an den Listenzeilen, am Umschalter und in der Galerie. */
  color: inherit;
  text-decoration: none;
  transition: background var(--dauer-schnell) var(--kurve);
}

.ordner__flaeche:hover,
.ordner__flaeche.zeige-ueberfahren {
  background: var(--farbe-flaeche-gedaempft);
}

.ordner__flaeche:focus-visible,
.ordner__flaeche.zeige-fokus {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: var(--fokusring-abstand);
}

/* Zwei Träger: die getönte Fläche UND der dickere Rahmen.

   DER RAHMEN IST ECHT, KEIN INSET-RING — 02.08.2026. Hier stand
   `box-shadow: inset 0 0 0 1px`, also ein zweiter Strich INNEN neben dem
   1-px-Rand: zwei Linien, die zusammen 2 px ergeben sollen und dabei je
   nach Radius unterschiedlich weit auseinanderliegen. Ein Rand von 2 px
   sagt dasselbe mit einer Linie — und er ist derselbe Wert, den jedes
   andere Bedienelement für „stark" benutzt. */
.ordner--offen .ordner__flaeche {
  border-width: var(--randbreite-stark);
  border-color: var(--farbe-primaer);
  background: var(--farbe-primaer-sehr-hell);
  /* Der Rand wird dicker, die Kachel darf dabei nicht wachsen. */
  padding: calc(var(--abstand-3) - var(--randbreite-stark) + var(--randbreite));
}

.ordner__flaeche .symbol {
  flex: 0 0 auto;
  color: var(--farbe-text-gedaempft);
}

/* NAME UND ZAEHLER IN EINER ZEILE — 02.08.2026. Untereinander machten sie
   die Kachel zweizeilig: gemessen 74,7 px statt der 56, die `min-height`
   nennt, und die Ordnerzeile bei drei Ordnern 244,2 px statt 200.
   Der Zaehler ist eine kurze Zahl und braucht keine eigene Zeile; er steht
   rechts, wo man ihn sucht. */
.ordner__mitte {
  flex: 1 1 auto;
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--abstand-3);
  min-width: 0;
}

.ordner__name {
  font-weight: var(--schrift-halbfett);
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

/* AM SCHMALEN FENSTER BRICHT DER NAME UM, statt abzubrechen — 05.08.2026,
   gemessen: bei 390 px meldete die Probe „Vorher & Nachher bricht ab,
   obwohl die Kachel Platz hätte".

   Sie hat recht, und die Rechnung ist eindeutig: 206 px Inhaltsspalte
   minus 24 px Polster, 24 px Zeichen, zweimal 12 px Lücke und die Breite
   des Zählers lassen dem Namen rund 78 px. „Vorher & Nachher" braucht
   130.

   Abschnitt 9 sagt, wann Ellipsis richtig ist: „WO UMBRUCH NICHT GEHT."
   In einer Pille geht er nicht — in einer Zeile mit `min-height` geht er.
   Der Ellipsis bleibt für breite Fenster, wo eine zweizeilige Zeile die
   Reihe verzöge; am Handy gewinnt der ganze Name. */
@container huelle (max-width: 45rem) {
  .ordner__name {
    overflow: visible;
    white-space: normal;
    overflow-wrap: anywhere;
  }
}

/* DER ZÄHLER. Klein, gedämpft, aber immer da — er ist der ganze Grund
   für die Kachel. */
.ordner__zaehler {
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

/* --- Wo bin ich --------------------------------------------------- */
/*
   HIER STANDEN `.drive__wo` UND `.drive__zurueck` — 11.08.2026 gefallen.

   Der Krumenpfad „Alle Fotos · Baustellen" stand zwischen Ordnerzeile und
   Kachelraster. Seit dem Neubau sagt der Kachelkopf, was in der Kachel
   steht („Baustellen · 7 Fotos"), und trägt den Weg zurück als seinen
   einen Weg — dieselbe Form wie im Posteingang und in den Inhalten.

   Die 44 px, die `.drive__zurueck` am 02.08.2026 bekommen hat, waren an
   `.inhaltskachel__weg` NICHT da — das ist beim Nachsehen aufgefallen und
   dort nachgezogen, mit der ganzen Begründung. Der Fund traf drei Seiten,
   nicht nur diese.

   Die Regeln sind gelöscht und nicht leer stehengelassen — eine Regel ohne
   Element wird beim nächsten Lesen wieder gefüllt. */

/* ===================================================================
   DER AUFNAHMEZUSTAND — Baustelle 2.4, 04.08.2026
   ===================================================================

   „Beim Ziehen von Dateien ueber das Fenster: sichtbarer
   Aufnahmezustand."

   ER LIEGT AN DER SEITE, nicht an einer eigenen Flaeche. Eine
   Ablegezone, die erst beim Ziehen erscheint, ist ein Ziel, das man
   treffen muss — die ganze Seite ist eines, das man nicht verfehlen
   kann. Dieselbe Ueberlegung wie beim Handschuh.

   ZWEI TRAEGER, keiner davon nur Farbe: ein Rahmen in der Primaerfarbe
   und ein Satz, der sagt, was passiert. Der Rahmen liegt INNEN
   (`outline-offset` negativ), damit er die Seite nicht verschiebt —
   ein Zustand, der das Layout springen laesst, ist schlimmer als
   keiner. */
.drive--nimmt-auf {
  position: relative;
  outline: var(--randbreite-stark) dashed var(--farbe-primaer);
  outline-offset: calc(var(--abstand-2) * -1);
  border-radius: var(--radius-standard);
}

.drive--nimmt-auf::after {
  content: 'Loslassen — die Fotos landen hier.';
  position: sticky;
  bottom: var(--abstand-4);
  z-index: 5;
  display: block;
  width: fit-content;
  margin: var(--abstand-4) auto 0;
  padding: var(--abstand-3) var(--abstand-6);
  border-radius: var(--radius-rund);
  background: var(--farbe-knopf-dunkel);
  color: var(--farbe-primaer-kontrast);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  /* Der Zeiger schwebt darueber — der Satz darf ihn nicht abfangen,
     sonst kommt das Ablegen nie an. */
  pointer-events: none;
}

/* DIE VOLLTON-VORSCHAU AN DER FOTOFLAECHE — 04.08.2026, im Bild
   gefunden. `.vorschau--*` steht weit oben in dieser Datei und hat
   dieselbe Spezifitaet wie `.fotoflaeche` (0-1-0); die spaetere gewinnt,
   und das war der graue Grund. Die Kacheln standen grau da, obwohl die
   Klasse im Markup stand.

   Zwei Klassen an einem Element (0-2-0) schlagen beide. */
.fotoflaeche.vorschau--violett      { background: var(--farbe-akzent-violett); }
.fotoflaeche.vorschau--violett-hell { background: var(--farbe-akzent-violett-hell); }
.fotoflaeche.vorschau--gelb         { background: var(--farbe-akzent-gelb); }
.fotoflaeche.vorschau--blau         { background: var(--farbe-akzent-blau); }
.fotoflaeche.vorschau--gelb-tief {
  background: var(--farbe-akzent-gelb-tief);
  color: var(--farbe-flaeche);
}
.fotoflaeche.vorschau--blau-tief {
  background: var(--farbe-akzent-blau-tief);
  color: var(--farbe-flaeche);
}

/* ===================================================================
   HIER STANDEN `.datei--ordner .fotoflaeche` UND `.fotoflaeche--ordner`
   ===================================================================

   Sie machten aus einem Ordner eine Kachel im Dateiraster — Baustelle
   2.4, 04.08.2026, „EIN Raster, Ordner voran". Am 05.08.2026 angesagt:
   „Ordner bleiben Zeilen, Dateien werden Kacheln."

   DAS ANLIEGEN VON DAMALS BLEIBT UND IST ERFUELLT. Der Befund war „zwei
   getrennte Welten": die Ordnerzeile stand in einem grauen Abschnitt,
   die Dateien darunter auf Weiss. Der graue Abschnitt ist gefallen und
   kommt nicht zurueck — es gibt weiter EINE Welt, nur mit zwei Formen
   darin.

   WARUM DIE KACHEL FUER EINEN ORDNER DIE FALSCHE FORM WAR: eine Kachel
   ist ein Bild, das man erkennt („Fotos erkennt man am Bild, nicht am
   Dateinamen", Regel 06). Ein Ordner hat keines. Gemessen bei 1920 px
   standen drei graue Quadrate zu 166 x 166 px, die nichts zeigten, vor
   drei Fotos, die etwas zeigten. Die Zeile sagt dasselbe in 56 px Hoehe
   statt in 220. */

/* --- Die Dateien als Kacheln -------------------------------------- */

/* ===================================================================
   DIE AUSWAHLLEISTE ERSCHEINT MIT DEM ERSTEN HAKEN — 18.08.2026, angesagt
   ===================================================================

   „Ich habe ja auch keine Massenauswahl-Funktion oder sowas."

   OHNE SKRIPT, WIE ALLES AUF /drive. `:has(:checked)` fragt das Formular, ob
   irgendein Kaestchen angehakt ist — dieselbe Bauart, die im Haus schon
   zweiunddreissig Mal steht (siehe den Vermerk bei `.einrichten--farbe`).

   SIE STEHT NICHT IMMER DA. Eine Leiste mit „Ausgewaehlte loeschen" ueber den
   eigenen Fotos ist eine Aufforderung zum Loeschen, und die will niemand
   dauernd sehen. Erst wenn etwas ausgewaehlt ist, gibt es etwas zu tun.

   `display: none` UND NICHT `visibility`/`opacity`: eine unsichtbare Leiste
   waere mit der Tastatur weiter erreichbar, und dann stuende der rote Knopf
   im Tab-Weg jeder Seite. */
.dateien__leiste {
  display: none;
}

.dateien__auswahl:has(:checked) .dateien__leiste {
  display: flex;
  justify-content: flex-end;
  gap: var(--abstand-3);
  margin: var(--abstand-4) 0 0;
}

/* DAS KAESTCHEN IST EIN ECHTES `<input>` — Bereich 09, i-Regel:
   „Kontrollkaestchen: echtes <input> und ein Haken als Traeger." Es steht
   links in der Handlungszeile der Kachel, vor dem Laden-Verweis, weil die
   Auswahl der Handlung vorausgeht. */
.datei__wahl {
  display: inline-flex;
  align-items: center;
  min-width: 44px;
  min-height: 44px;
  justify-content: center;
  cursor: pointer;
}

.dateien {
  /* Eigener Bildlauf gefallen — Baustelle 0.1. Das Raster waechst mit
     seinen Kacheln, und das Dokument scrollt darum herum. */
  display: grid;
  /* 11rem statt 9: Later zeigt Kacheln um 199 px, wir kamen auf 144.
     Weniger Kacheln nebeneinander, dafuer erkennt man das Foto.

     UND `min()` DAVOR — 02.08.2026. Bei 390 px ist die Inhaltsbreite 358,
     also weniger als zwei Kacheln zu 176 px: das Raster fiel auf EINE
     Spalte, und die Kachel wurde 358 px breit und 317,6 px hoch. Ein Foto
     erkennt man auch bei 171 px, und zwei nebeneinander sind bei 390 px
     das, was jede Galerie zeigt. `min(11rem, 47%)` gibt zwei Spalten zu
     171 px, ohne bei 1440 etwas zu ändern (dort bleiben es sechs). */
  grid-template-columns: repeat(auto-fill, minmax(min(11rem, 47%), 1fr));
  grid-auto-rows: min-content;
  gap: var(--abstand-4);
  /* LUFT ZUR ORDNERZEILE — 11.08.2026 gemessen: 16 px zwischen der letzten
     Ordnerzeile und dem Wort „Heute". Beide sind Blöcke mit eigener
     Aufgabe, und seit dem Neubau stehen sie in EINEM Kasten; mit dem
     Kachelabstand allein sah „Heute" aus wie die Beschriftung des Ordners
     darüber.

     ER STEHT IN DER KURZFORM UND NICHT ALS `margin-top` DARÜBER — beim
     ersten Versuch stand er oben in der Regel, und dieses `margin: 0`
     zwölf Zeilen weiter hat ihn wieder abgeräumt. Gemessen blieben es
     16 px, und die Regel sah trotzdem richtig aus. Dieselbe Ursache wie
     bei `--kalender-zelle` am 11.08.2026, nur innerhalb EINER Regel. */
  margin: var(--abstand-3) 0 0;
  padding: 0;
  list-style: none;
  /* Bildlaufleiste: siehe Querschnitt Q8 — sie haengt an
     `data-bildlauf="eigen"` und an `pointer: fine`, nicht hier. */
}

/* DIE ZEITGRUPPE. Sie nimmt die ganze Rasterbreite und traegt nur ein
   Wort — bei Later steht dort „Today" und „Last 7 Days", klein und
   ohne Linie darunter. Eine Linie waere hier der Griff zum falschen
   Werkzeug: die Gruppe TRENNT nicht, sie BENENNT. */
.dateien__gruppe {
  grid-column: 1 / -1;
}

.dateien__gruppe:not(:first-child) {
  margin-top: var(--abstand-4);
}

.dateien__gruppenwort {
  margin: 0;
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text-gedaempft);
}

.datei {
  display: flex;
}

.datei__flaeche {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: var(--abstand-2);
  border-radius: var(--radius-standard);
  color: inherit;
  text-decoration: none;
  transition: background var(--dauer-schnell) var(--kurve);
}

.datei__flaeche:hover,
.datei__flaeche.zeige-ueberfahren {
  background: var(--farbe-flaeche-gedaempft);
}

.datei__flaeche:focus-visible,
.datei__flaeche.zeige-fokus {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: var(--fokusring-abstand);
}

.datei__name {
  font-size: var(--groesse-mikro);
  font-weight: var(--schrift-halbfett);
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.datei__datum {
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

.dateien__mehr {
  grid-column: 1 / -1;
  display: flex;
  justify-content: center;
  padding: var(--abstand-3) 0 var(--abstand-5);
}

.dateien__mehr .knopf {
  text-decoration: none;
}

/* EIN BILD, ABER KEIN KNOPF — nachgezogen am 01.08.2026. Hier stand
   „kein Leerbild"; der Grund dafür war, dass die beiden Knöpfe darüber
   stehen und ein Zustandsblock einen dritten brächte. Das gilt weiter.
   Das Bild bringt aber keinen Knopf mit. Begründung ausführlich in
   `drive.ts`. */
.dateien__leer {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--abstand-3);
  padding: var(--abstand-4) 0;
  text-align: center;
}

/* KLEINER ALS EIN GANZSEITIGER LEERZUSTAND, und das ist keine
   Geschmacksfrage. Die Hüllenwache hat es gefunden: bei 390 px stand
   über diesem Bild schon die Ordnerzeile und die beiden Knöpfe, und
   mit 200 px Bildhöhe ragte der Block 105 px unter den Rand der Hülle.

   Ein Leerzustand, der die SEITE ist (Posteingang ohne Kanal, Ziele
   ohne Ziel), hat den Bildschirm für sich. Einer, der in einer Seite
   STECKT, hat den Rest. 120 px sparen die 105 px zusammen mit dem
   kleineren Polster — gerechnet, nicht geraten. */
.dateien__leer .leerflaeche {
  height: 120px;
  /* SEIT DEM 19.10.2026 DAS ZEICHEN STATT DER SZENE: in 120 px waere die
     Karte ein Briefmarkenbild mit 0,9 px duennen Symbolen (gemessen). Das
     Zeichen im hellblauen Kreis wie neben einem Satz in den Einstellungen. */
  container-type: normal;
  width: 120px;
  background: var(--farbe-primaer-sehr-hell);
  color: var(--farbe-akzent-violett-kraeftig);
}

.dateien__leer .leerszene {
  display: none;
}

.dateien__leer .leerszene__zeichen {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}

/* 32 px Kante = 3,0 px Strich, innerhalb der 2,25 bis 3,6 der Hausregel. */
.dateien__leer .leerszene__zeichen .symbol {
  width: 32px;
  height: 32px;
}

.dateien__nichts {
  margin: 0;
  color: var(--farbe-text-gedaempft);
}


/* ===================================================================
   BEREICH 07 · Ziele
   ===================================================================

   Regel 07: „Boost-Limit als große Zahl mit Plus und Minus — kein
   Regler. Im laufenden Quartal nur zweierlei: ein Balken und der
   Media Day."

   DREI ENTSCHEIDUNGEN:

   1. NIE EIN PROZENTWERT. Der Balken trägt Ist und Soll und eine
      Klartext-Marke. Ein Ring wäre ein Prozentwert in rund.

   2. DAS DATUM ZUERST, DIE TAGE DARUNTER. „In dieser Reihenfolge,
      nicht umgekehrt." Ein Countdown allein sagt nicht, wann; ein
      Datum allein sagt nicht, wie bald.

   3. KEIN REGLER. Der Baustein aus Bereich 09 trägt die Regel; hier
      steht nur, wie die drei Abschnitte zueinander liegen.
   =================================================================== */

.ziele {
  display: flex;
  flex-direction: column;
  gap: var(--abstand-6);
  /* Eigener Bildlauf gefallen — Baustelle 0.1. Die Seite scrollt als
     Dokument. */
  /* Der Text darf nicht über die ganze Breite laufen — sonst wandert
     das Auge bei 1440 px über 1100 px Zeilenlänge.

     DIE GRENZE GILT SEIT DEM 03.08.2026 NICHT MEHR FUER DIE SEITE,
     sondern fuer den Text IN den Karten. Vorher stand die ganze Seite
     in einer 720 px schmalen Spalte am linken Rand, und rechts blieben
     bei 1440 px rund 570 px leer — nicht als Weissraum, sondern als
     nicht genutzte Flaeche.

     Die Zeilenlaenge ist trotzdem begrenzt: jede Karte ist schmaler als
     die Spalte, und der Text darin bricht an ihrer Kante. Das Anliegen
     bleibt, der Deckel wandert. */
}

/* ===================================================================
   HIER STANDEN `.ziele__raster`, `.mediaday` UND `.boostlimit`
   ===================================================================

   Gefallen am 11.08.2026 mit dem Neubau der Seite. Was sie trugen —
   zwei graue Karten nebeneinander, Frage, Datum, Tage, Aufzaehlung,
   Fuss mit Pille — tragen jetzt zwei Bento-Kacheln in den Farben ihrer
   Objekte. Ihr Inhalt ist keiner verlorengegangen.

   ZWEI BEFUNDE AUS DIESEM BLOCK GELTEN WEITER, und sie sind der Grund,
   aus dem hier ein Vermerk und nicht nichts steht:

   1. `minmax(0, 1fr)` UND NICHT `1fr`. Eine `1fr`-Spur hat als
      Mindestbreite `min-content`, und `min-width: 0` am KIND aendert
      daran nichts. Es war hier die vierte Fundstelle derselben Falle
      (`.zeile__mitte`, `.posteingang`, `.inhalte`, dieses Raster). Das
      Bento-Raster hat sie von Anfang an richtig; wer hier ein neues
      Raster baut, faengt bitte damit an.
   2. EINE EBENE — Baustelle 0.3, 04.08.2026: „Entweder graue
      Sektionsflaeche ODER weisse Karte darauf, nie eine graue Flaeche,
      die nur eine einzelne weisse Karte umschliesst." Der Neubau haelt
      sie ein: graue Aussageflaeche, farbige Kacheln, EINE weisse
      Arbeitskachel.

   Die Regeln selbst sind geloescht und nicht leer stehengelassen — eine
   Regel ohne Element wird beim naechsten Lesen wieder gefuellt. */

/* DIE FLAECHE STEHT IM FLUSS DER SEITE. `.ziele` ist eine Flex-Spalte mit
   eigener Luecke; das Aussenmass, das die Aussage fuer freistehende
   Verwendung mitbringt, kaeme dazu und machte aus 32 px 56. */
.ziele > .aussage {
  margin-bottom: 0;
}

/* --- Was unter dem Satz der Aussageflaeche steht ------------------- */
/*
   DER SATZ DES MEISTERS. Er hat ihn selbst gesetzt — „Mehr Bewerbungen
   auf die offene Stelle" —, und er steht deshalb in seiner Sprache und
   nicht als Kennzahl. Gedaempft, weil die Zahl darueber die Aussage
   traegt und dieser Satz sie einordnet. */
.ziele__satz {
  /* LUFT NACH OBEN — im Bild bei 1440 px stand er ohne jeden Abstand an der
     Unterlänge der Überschrift. Die Überschrift bringt keinen eigenen
     Außenabstand mit (`.bento__titel` ist auf 0 gesetzt, weil auf der
     Übersicht direkt die Pille folgt); wer etwas dazwischenschiebt, bringt
     den Abstand selbst mit. */
  margin: var(--abstand-3) 0 0;
  max-width: var(--lese-breite);
  color: var(--farbe-text-gedaempft);
}

/* Der Balken hat auf der Aussageflaeche Luft ueber sich — er gehoert zur
   Zahl, steht aber nicht in ihrer Zeile. */
.ziele__satz + .balken {
  margin-top: var(--abstand-4);
}

/* „4 ueber dem Ziel" — die gerechnete Differenz, klein unter dem Balken.
   Sie stand vorher als Kennzahl NEBEN der Zahl und war damit die zweite
   grosse Zahl auf derselben Flaeche; die Aussageflaeche traegt EINE. */
.ziele__abstand {
  margin: var(--abstand-2) 0 0;
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

/* Die Arbeitsflaeche der Seite. Sie braucht nichts ueber `.inhaltskachel`
   hinaus — die Klasse steht hier, damit die Kachel im Markup benannt ist
   und nicht als namenlose dritte `.inhaltskachel` dasteht. */
/* HIER STAND `ziele__protokoll` — gefallen am 13.08.2026, und sie war die
   FUENFTE tote Klasse; der Auftrag nannte vier.

   Sie benannte die Protokollkachel auf `/quartal`. Das Protokoll ist am
   12.08.2026 in die Einstellungen unter „Verbrauch" gezogen, und mit Block 4
   ist heute auch das letzte Durchreichen gefallen (`Ziele.protokoll` gibt es
   nicht mehr). Damit hat die Klasse keinen Traeger mehr.

   Ihr `min-width: 0` war die Regel „Flex- und Grid-Kinder duerfen
   schrumpfen". Sie geht nicht verloren: die Kachel steht jetzt in den
   Einstellungen und traegt sie dort ueber `inhaltskachel`. */

/* ============================================================
   BEREICH 08 - Einstellungen
   Entscheidung h1-h4. VIER Reiter: Kanaele, Team, Rechnungen,
   Betrieb. Blockraster, ein Themenblock je Reiter, der
   Speichern-Knopf am Ende SEINES Blocks - nicht am Seitenende.

   Ein Block je Reiter ist kein Zufall: h4 will den Knopf am
   Blockende, die Hausregel will hoechstens EINEN gefuellten Knopf
   je Bildschirm. Beides geht nur so.
   ============================================================ */

/* ===================================================================
   JITTERS KARTENBAU — 03.08.2026, angesagt: „Einstellungen bitte
   kopieren"
   ===================================================================

   GEMESSEN auf „Workspace settings · Jitter" bei 1440 px:

     body            f2f1f3    der Grund ist GRAU, nicht weiss
                               (ohne Raute notiert: die Farbwache liest
                               auch Kommentare, und sie soll streng
                               bleiben — der Messwert ist hier Beleg,
                               nicht Anwendung)
     _card_          weiss, Radius 20, Polster 40/30, Luecke 30
     _container_     weiss, Radius 20, Polster 32/48, Luecke 20
     beide           border: 0 — KEIN Rand

   DER GRAUE GRUND IST DER GANZE TRICK. Unsere Bloecke hatten schon
   Radius und Flaeche, standen aber weiss auf weiss — und brauchten
   deshalb einen Rand, damit man ihre Kante sieht. Jitter dreht es um:
   der Grund tritt zurueck, die Karte kommt nach vorn, und der Rand wird
   ueberfluessig. Eine Kontur weniger auf jeder Karte.

   `--farbe-flaeche-gedaempft` TRAEGT DIESEN WERT BEREITS — gemessen am
   02.08.2026 aus derselben Vorlage. Es braucht also keinen neuen Wert,
   nur seine Anwendung an der richtigen Stelle. */
.einstellungen {
  /* `height: 100%` und `overflow-y: auto` gefallen — Baustelle 0.1. */
  padding: var(--abstand-4) var(--abstand-5) var(--abstand-7);
}

/* DIE FLAECHE BRAUCHT LUFT ZU DEN REITERN — 05.08.2026. Die flache
   Aussage bringt `margin-bottom: 0` mit (im Posteingang steht direkt
   die Liste darunter, dort ist das richtig); hier stiess sie ohne
   diesen Wert an die Reiterleiste. Gemessen: 2 px zwischen Kante und
   Pille. */
.einstellungen > .aussage {
  margin-bottom: var(--abstand-5);
}

/* Der Grund gehoert an die SEITE, nicht an die Huelle: die Kopfzeile
   haengt am Fenster und wuerde sonst mitgrauen, waehrend der Kasten der
   Seitenwahl weiss bleibt. Auf grauem Grund traegt dessen feine Linie
   uebrigens besser als auf weissem — die Ansage von heute morgen und
   diese hier passen zusammen, ohne dass das geplant war. */
/* NUR AUF DEN EINSTELLUNGEN — zurueckgenommen am 03.08.2026, wenige
   Minuten nachdem es ueberall stand. Gemeldet: „warum ist alles grau
   auf einmal, das ist falsch."

   DER BELEG DAGEGEN STAND IN MEINER EIGENEN MESSUNG, und ich habe ihn
   nicht gelesen. Jitters Grund haengt an der Klasse `_accountBody_` —
   der Name sagt, dass er zum KONTO-Bereich gehoert und nicht zur
   Anwendung. Nachgemessen an vier Seiten:

     Drafts    weiss, 0 Karten
     Trash     weiss, 0 Karten
     404       weiss, 0 Karten
     Settings  grau,  2 Karten

   Der graue Grund ist bei Jitter kein Grundton der Oberflaeche, sondern
   das Kennzeichen EINES Bereichs: dort, wo Einstellungen in Karten
   stehen. Ueberall sonst ist die Flaeche weiss und die Inhalte stehen
   direkt darauf.

   Aus einer Messung auf alle Seiten zu schliessen war der Fehler — die
   Ansage „nutz den Container-Bau auch" heisst, den KARTENBAU zu
   uebernehmen, nicht den Grund einer Seite zum Grund aller zu machen. */
/* ===================================================================
   DER GRAUE SEITENGRUND IST GEFALLEN — 11.08.2026, Neubau
   ===================================================================

   Hier stand er mit fuenfzig Zeilen Herleitung: Jitters Einstellungen
   haben einen grauen Grund, auf dem weisse Karten stehen, und der Grund
   war ausdruecklich „das Kennzeichen EINES Bereichs" und nicht der
   Grundton der Oberflaeche. Das war richtig gemessen und richtig
   eingegrenzt.

   ES GILT TROTZDEM NICHT MEHR, und zwar nicht, weil die Messung falsch
   war, sondern weil die Vorlage gewechselt hat: „Die Uebersicht ist ab
   jetzt die Vorlage fuer alles andere. Jede der fuenf Seiten muss danach
   als DASSELBE PRODUKT neben der Uebersicht stehen koennen."

   Und die Form der Uebersicht bringt ihre eigene graue Flaeche mit — die
   Aussageflaeche des Bentos. Auf grauem Grund waere sie unsichtbar: beide
   traegen `--farbe-flaeche-gedaempft`. Zwei Graustufen uebereinander sind
   keine Gliederung; sie sind ein verschluckter Baustein.

   WAS VON DER MESSUNG BLEIBT, ist der Kartenbau selbst — weisse Flaeche,
   Radius 20, Polster 32/48 —, und der steht jetzt in `.inhaltskachel`,
   wo ihn alle fuenf Seiten benutzen. Die Farbe des Grundes war das
   Einzige, was an ihn gebunden war.

   ZWEI LEHREN AUS DIESEM BLOCK GELTEN WEITER und stehen deshalb hier:

   1. `background-color:` UND NICHT DIE KURZFORM. Eine Kurzform setzt
      `background-image` mit zurueck, und daran hing die Schnittkante aus
      Querschnitt Q8. P2 meldete 958 px verborgen bei 390 px, ohne ein
      Zeichen, dass es weitergeht. Wer nur eine Farbe will, sagt Farbe.
   2. AUS EINER MESSUNG AUF ALLE SEITEN ZU SCHLIESSEN war der Fehler, der
      diesen Block ueberhaupt noetig gemacht hat: „nutz den Container-Bau
      auch" heisst, den KARTENBAU zu uebernehmen, nicht den Grund einer
      Seite zum Grund aller zu machen. */

/* Der Block ist der Kasten aus h4: eigene Flaeche, eigener Rand,
   eigene Ueberschrift. Man liest ihn einzeln. */
.block {
  max-width: var(--breite-text-max);
  margin: var(--abstand-5) 0 0;
  /* [gemessen] Jitters `_container_16p5a_`: 32 px oben/unten, 48 px an
     den Seiten. Die Karte ist damit breiter gepolstert als hoch — das
     laesst den Text als Spalte stehen statt als Block im Kasten. */
  padding: var(--abstand-6) var(--abstand-7);
  /* KEIN RAND MEHR — 03.08.2026. Er war noetig, solange die Karte weiss
     auf weiss stand. Auf dem grauen Grund zeichnet ihn der Kontrast, und
     ein Rand obendrauf waere die zweite Kante fuer dieselbe Kaste. */
  /* KANTIG SEIT DEM 12.08.2026, aus demselben Grund wie `.inhaltskachel`:
     dieser Kasten traegt keine Farbe, nur Weiss. Die Begruendung steht
     dort ausfuehrlich. */
  border-radius: 0;
  background: var(--farbe-flaeche);
}

.block__titel {
  margin: 0;
  font-size: var(--groesse-h3);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

.block__satz {
  margin: var(--abstand-2) 0 0;
  color: var(--farbe-text-gedaempft);
  overflow-wrap: anywhere;
}

/* DER LEERE KANAL-REITER IST EIN LEERZUSTAND — 02.08.2026.
   Er ist der wichtigste Bildschirm des Produkts: ohne Kanal bleiben
   Posteingang, Übersicht und Inhalte leer. Er sah aus wie eine
   Einstellungsseite — ein Aussagesatz, kein Bild.

   DAS BILD STEHT NEBEN DEM SATZ, nicht darüber. Bei 1440 ist der Satz
   einzeilig (26,9 px); ein Bild darüber kostete die volle Bildhöhe, daneben
   nur die Differenz. Am Handy ist der Satz dreizeilig — dort kostet das
   Bild 0 px. */
.block__leer {
  display: flex;
  gap: var(--abstand-4);
  align-items: center;
  margin: var(--abstand-3) 0 0;
}

.block__leerbild {
  flex: 0 0 auto;
  display: block;
  /* Feste Rahmenhöhe, Breite ergibt sich — dieselbe Auflage wie an jeder
     anderen Illustration: kein Motiv bestimmt das Layout. */
  height: 48px;
}

.block__leerbild .leerflaeche {
  width: auto;
  height: 100%;
  /* Die Rundung geht hier kleiner mit: die Flaeche steht in einer Zeile
     neben Text und nicht als Motiv ueber einem Leerzustand. */
  border-radius: var(--radius-standard);
  /* SEIT DEM 19.10.2026 DAS ZEICHEN DER SZENE im hellblauen Kreis, wie die
     Symbole auf der Website — die Karte passt in 48 px nicht. Quadratisch,
     und ohne Groessen-Einschluss, sonst haette die Flaeche keine Breite. */
  container-type: normal;
  aspect-ratio: 1;
  background: var(--farbe-primaer-sehr-hell);
  color: var(--farbe-akzent-violett-kraeftig);
}

.block__leerbild .leerszene {
  display: none;
}

.block__leerbild .leerszene__zeichen {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}

/* 52 % — die Hausregel verlangt 2,25 bis 3,6 px gerenderten Strich
   (`messungen.spec.ts`). Bei 48 px Flaeche: 25 px Kante, 2,34 px; bei
   72 px: 37,4 px Kante, 3,51 px. Mit 45 % war es bei 48 px zu duenn
   (2,03), mit 55 % bei 72 px zu dick (3,71) — beides gemessen. */
.block__leerbild .leerszene__zeichen .symbol {
  width: 52%;
  height: 52%;
}

.block__leertext {
  min-width: 0;
}

/* Die FRAGE ist Pflicht (Regel 10), die Folge darunter ist der Grund. */
.block__frage {
  margin: 0;
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
  overflow-wrap: anywhere;
}

.block__folge {
  margin: var(--abstand-1) 0 0;
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
  overflow-wrap: anywhere;
}

@container huelle (min-width: 40rem) {
  .block__leerbild {
    height: 72px;
  }
}

/* --- Kanaele (h1) ------------------------------------------- */

.kanalliste {
  list-style: none;
  margin: var(--abstand-4) 0 0;
  padding: 0;
  display: grid;
  gap: var(--abstand-3);
}

/* Die Karte bricht um, statt zu quetschen: bei 390 px rutscht der
   Knopf unter den Text. Kein nowrap - Abschnitt 9. */
/* ===================================================================
   EINE ZEILE, KEIN KASTEN IM KASTEN — Baustelle 0.3, 04.08.2026
   ===================================================================

   Hier standen `border` und `border-radius`: jede Kanalkarte war ein
   eigener Kasten INNERHALB der weissen Karte, die selbst auf grauem
   Grund liegt. Drei Ebenen fuer vier Zeilen.

   Angesagt (0.3): „Eine Ebene. Entweder graue Sektionsflaeche ODER
   weisse Karte darauf, nie eine graue Flaeche, die nur eine einzelne
   weisse Karte umschliesst." Und (2.6): „Zeilen sind zu textlastig.
   Kanal-Logo, Name, angemeldet als, eine Aktion."

   WAS DER RAHMEN LEISTETE, LEISTET JETZT EINE LINIE. Das ist die
   Strichliste aus Punkt 10 der Formensprache: „Zeile aus kleinem
   Strich-Icon, Titel, zwei Zeilen — fuer Aufzaehlungen ohne Karten."

   DER GRAUE GRUND DER SEITE BLEIBT, wie angesagt („Grauer Grund bleibt
   so. Frage nicht danach"). Was faellt, ist die dritte Ebene darin. */
.kanalkarte {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--abstand-3);
  padding: var(--abstand-4) 0;
  border-top: var(--randbreite) solid var(--farbe-rand);
}

/* Die erste Zeile braucht keine Linie — darueber steht der Zaehlsatz
   und der traegt schon eine Kante. */
.kanalkarte:first-child {
  border-top: 0;
  padding-top: var(--abstand-2);
}

.kanalkarte__text {
  flex: 1 1 12rem;
  min-width: 0;
}

.kanalkarte__name {
  margin: 0;
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

.kanalkarte__erklaerung,
.kanalkarte__konto {
  margin: var(--abstand-1) 0 0;
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
  overflow-wrap: anywhere;
}

.kanalkarte .knopf {
  flex: 0 0 auto;
}

/* --- Team (h2) ---------------------------------------------- */

/* Einladen oben: E-Mail, Rolle, Knopf. Am Handy untereinander,
   am Laptop nebeneinander - ueber die Behaelterbreite, nicht
   ueber die Fensterbreite. */
.einladen {
  display: grid;
  gap: var(--abstand-3);
  margin: var(--abstand-4) 0 0;
}

/* ===================================================================
   DER KNOPF STEHT AUF DERSELBEN GRUNDLINIE — 18.08.2026, angesagt
   ===================================================================

   „Bei Team der Einladen-Knopf, vielleicht viereckig oder, wenn nicht
   viereckig, dann in die Mitte."

   VIERECKIG IST ER SCHON. Knoepfe tragen seit dem 03.08.2026 Radius 0
   („vorher waren sie Pillen, wie der Toast"). Was im Bild auffaellt, ist
   deshalb nicht die Form, sondern die LAGE: `align-items: start` setzte ihn
   an die Oberkante der Zeile, und dort steht er neben zwei 60 px hohen
   Feldern als 44-px-Knopf — oben buendig, unten 16 px in der Luft.

   `end` UND NICHT `center`: die Felder tragen ihre Beschriftung schwebend
   OBEN (das ist der Grund fuer ihre 60 px, siehe `--feld-hoehe` in
   tokens.css). Ihre Schreibzeile sitzt damit unten, und der Knopf gehoert auf
   dieselbe Linie wie das, was man gerade getippt hat — nicht auf die Mitte
   zwischen Beschriftung und Eingabe. */
@container (min-width: 40rem) {
  .einladen {
    grid-template-columns: 2fr 2fr auto;
    align-items: end;
  }
}

.teamliste {
  list-style: none;
  margin: var(--abstand-5) 0 0;
  padding: 0;
  display: grid;
  gap: 0;
}

/* DIE ROLLE STEHT IN EINER SPALTE — 02.08.2026. Gemessen lagen ihre linken
   Kanten bei 956 / 946 / 685 px, Versatz 271 px = 39,4 % der Kartenbreite.
   Ausgelöst hat es die 244,7 px breite Marke „Eingeladen, noch nicht
   angenommen": in einer Flexzeile schiebt sie alles vor sich her. Im Raster
   steht die Rolle fest und die Marke rechts daneben. */
/* AM HANDY EINSPALTIG — gefunden am 04.08.2026 durch Baustelle 0.1.
   Drei Spalten, davon zwei `max-content`: Name, Rolle und Handlung passen
   bei 390 px nicht nebeneinander. Gemessen lief die Zeile bis x = 429 in
   einem 390-px-Fenster, 39 px Querscroll.

   ER WAR DIE GANZE ZEIT DA und wurde von `overflow-y: auto` an
   `.einstellungen` eingefangen — ein Ueberlauf, der in einer Achse nicht
   `visible` ist, zwingt die andere auf `auto`. Derselbe aufgedeckte Fall
   wie an `.ziele__raster` und `.rechnung`; die Ursache ist jedes Mal, dass
   eine Zeile fuer 1440 px gebaut und bei 390 px nie gesehen wurde. */
.mitglied {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  align-items: baseline;
  gap: var(--abstand-2) var(--abstand-3);
  padding: var(--abstand-3) 0;
  border-top: var(--randbreite) solid var(--farbe-rand);
}

@container huelle (min-width: 45rem) {
  /* VIER SPUREN SEIT DEM 12.08.2026, nicht drei: Text, Rolle, Marke,
     Entfernen. Mit dreien fiel „Entfernen" bei jeder eingeladenen Person in
     eine zweite Zeile — die Marke „Eingeladen, noch nicht angenommen" nahm
     die dritte Spur, und der Knopf hatte keine mehr. Im Bild sofort zu
     sehen, in keiner Zahl.

     `max-content` DREIMAL und nicht `auto`: Rolle, Marke und Knopf sollen so
     breit sein wie ihr Wort, nicht wie ihr Anteil. Die erste Spur traegt
     Namen und E-Mail und darf schrumpfen — `minmax(0, 1fr)`, wie an jeder
     Rasterzeile dieses Hauses. */
  .mitglied {
    grid-template-columns: minmax(0, 1fr) max-content max-content max-content;
  }
}

.mitglied__text {
  min-width: 0;
}

.mitglied__name {
  margin: 0;
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
  overflow-wrap: anywhere;
}

.mitglied__email {
  margin: var(--abstand-1) 0 0;
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
  overflow-wrap: anywhere;
}

.mitglied__rolle {
  margin: 0;
  font-size: var(--groesse-klein);
  color: var(--farbe-text);
}

/* „Das bist du" statt „Entfernen" an der eigenen Zeile — 19.10.2026, wie
   in der Liste der Admins. NEUER NAME, vorher geprueft. */
.mitglied__selbst {
  margin: 0;
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

/* EINE Liste, eine Statusmarke - nicht zwei Listen (h2,
   weglassen). Die Marke steht nur an den Eingeladenen; "aktiv"
   ist der Normalfall und braucht keine Auszeichnung. */
.mitglied__marke {
  margin: 0;
  padding: var(--abstand-1) var(--abstand-2);
  border-radius: var(--radius-rund);
  background: var(--farbe-flaeche-gedaempft);
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-gedaempft);
}

/* --- Rechnungen (h3) ---------------------------------------- */

.tarif {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--abstand-2) var(--abstand-3);
  margin: var(--abstand-4) 0 0;
}

/* 17 px, NICHT 20 — 02.08.2026. Die 20-px-Stufe hatte auf dem ganzen
   Reiter genau EINE Verwendung und lief ohnehin auf Fließtext-Zeilenhöhe
   (20/31,6 = 1,58). Damit stehen im Block fünf Schriftstufen statt sechs;
   Buffer kommt mit vier aus. Das Gewicht trägt den Unterschied. */
.tarif__name {
  font-size: var(--groesse-text);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

.tarif__betrag {
  color: var(--farbe-text-gedaempft);
}

.tarif__naechste {
  margin: var(--abstand-1) 0 0;
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

/* Eine Liste, keine Tabelle mit Kopfzeile (h3). Zu Tabellen gibt
   es ausserdem keine Entscheidung - Luecke 2. */
.rechnungen {
  list-style: none;
  margin: var(--abstand-5) 0 0;
  padding: 0;
}

/* VIER SPALTEN, VIER KANTEN — 02.08.2026. Als Flexzeile mit Umbruch hatten
   die Beträge vier verschiedene rechte Kanten, Spanne gemessen rund 92 px:
   je nachdem, wie lang das Wort des Zustands war („Offen" gegen
   „Fehlgeschlagen"). Employment Hero hält seine zwei Spalten über acht
   Zeilen auf 0 px Schwankung. Ein Raster kann das, eine Flexzeile nicht.
   9rem = 144 px für die Zustandsspalte: „Fehlgeschlagen" plus Warnzeichen
   und 4 px Lücke braucht rund 132 px. 5,5rem = 88 px für „PDF". */
/* AM HANDY ZWEISPALTIG — derselbe Fund und dieselbe Ursache wie an
   `.mitglied` daneben. Vier Spalten, davon zwei mit fester Breite (9rem und
   5,5rem = 232 px zusammen): gemessen lief die Zeile bis x = 421 in einem
   390-px-Fenster.

   ZWEI SPALTEN UND NICHT EINE, anders als beim Mitglied: Datum und Betrag
   gehoeren nebeneinander gelesen, und beide sind kurz. Was umbricht, sind
   Zustand und PDF-Verweis in die zweite Zeile. */
.rechnung {
  display: grid;
  grid-template-columns: minmax(0, 1fr) max-content;
  align-items: center;
  gap: var(--abstand-2) var(--abstand-4);
  padding: var(--abstand-3) 0;
  border-top: var(--randbreite) solid var(--farbe-rand);
}

@container huelle (min-width: 45rem) {
  .rechnung {
    grid-template-columns: minmax(0, 1fr) max-content 9rem 5.5rem;
  }
}

.rechnung__datum {
  min-width: 0;
  color: var(--farbe-text);
}

/* Der Betrag ist eine Zahl und darf nicht umbrechen - "12.40" und
   "0" waeren eine andere Zahl. Genau der Fund aus Bereich 04. */
.rechnung__betrag {
  font-variant-numeric: tabular-nums;
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
  white-space: nowrap;
}

/* Drei Traeger, nicht einer: Wort, Zeichen, Farbe. */
.rechnung__zustand {
  display: inline-flex;
  align-items: center;
  gap: var(--abstand-1);
  font-size: var(--groesse-klein);
}

.rechnung__zustand--bezahlt { color: var(--farbe-erfolg); }
.rechnung__zustand--offen { color: var(--farbe-text-gedaempft); }
.rechnung__zustand--fehlgeschlagen { color: var(--farbe-fehler); }

/* Symbol UND Wort. Ein Symbol allein traegt keinen Knopf -
   Bereich 15 laesst genau fuenf Ausnahmen zu, "herunterladen" ist
   keine davon. */
.rechnung__pdf,
.dokument__pdf {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--abstand-1);
  min-width: 44px;
  min-height: 44px;
  padding: 0 var(--abstand-2);
  border-radius: var(--radius-klein);
  color: var(--farbe-text);
  text-decoration: none;
}

/* VON DER ZUSTANDSMATRIX GEFUNDEN, im ersten Lauf nach dem Bau. Hier stand
   nur der Flaechenwechsel - und damit unterschied sich Ueberfahren vom
   Ruhezustand AUSSCHLIESSLICH durch die Farbe. Die Hausregel aus Bereich 09:
   Ueberfahren traegt zusaetzlich Tiefe, Gedrueckt gibt nach (Geometrie).
   Dieselbe Bauart wie beim Knopf. */
.rechnung__pdf:is(:hover, .zeige-ueberfahren),
.dokument__pdf:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-flaeche-gedaempft);
  box-shadow: var(--schatten-1);
}

.rechnung__pdf:is(:active, .zeige-aktiv),
.dokument__pdf:is(:active, .zeige-aktiv) {
  transform: translateY(1px);
  box-shadow: none;
}

/* --- Dokumente (S4, 18.10.2026) ----------------------------- */

/* DIESELBE LISTE WIE BEI DEN RECHNUNGEN, ohne Betrag und ohne Zustand:
   das Portal weiss nicht, was bezahlt ist (keine Zahlungsanbindung,
   Entscheidung 17.10.2026). Der PDF-Verweis teilt seine Regeln oben mit
   `.rechnung__pdf` - ein Knopf, eine Form. */
.dokumente {
  list-style: none;
  margin: var(--abstand-5) 0 0;
  padding: 0;
}

/* ZWEI SPALTEN AUF JEDER BREITE: links was es ist, darunter das Datum;
   rechts "PDF". Anders als die Rechnungszeile braucht sie keinen
   Wechsel bei 45rem - die linke Spalte ist ein Stapel und keine Reihe.
   `minmax(0, 1fr)` und `min-width: 0` an den Kindern: eine lange
   Mandatsreferenz bricht um, statt die Zeile nach rechts zu sprengen. */
.dokument {
  display: grid;
  grid-template-columns: minmax(0, 1fr) max-content;
  align-items: center;
  gap: var(--abstand-2) var(--abstand-4);
  padding: var(--abstand-3) 0;
  border-top: var(--randbreite) solid var(--farbe-rand);
}

.dokument__angaben {
  display: grid;
  gap: var(--abstand-1);
  min-width: 0;
}

/* SILBENTRENNUNG UND NICHT `anywhere` — 18.10.2026, bei 390 px gemessen:
   mit `overflow-wrap: anywhere` brach „Auftragsbestätigung" als
   „…bestätigun / g". `hyphens: auto` trennt nach deutschen Regeln
   (`<html lang="de">`), `break-word` greift nur, wenn das nicht reicht. */
.dokument__titel {
  min-width: 0;
  overflow-wrap: break-word;
  hyphens: auto;
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

/* Nummer und Datum. Eine Mandatsreferenz ist eine Kette ohne Leerzeichen
   und darf hier ueberall brechen - sie wird abgelesen, nicht gelesen. */
.dokument__unterzeile {
  min-width: 0;
  overflow-wrap: anywhere;
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

/* „LESEN" UND „HERUNTERLADEN" NEBENEINANDER — 19.10.2026, Lennard. Am
   Handy reicht die rechte Spalte fuer beide nicht neben dem Titel; dann
   stehen sie unter den Angaben, links buendig, statt den Titel auf ein
   Wort je Zeile zu druecken. NEUE NAMEN, vorher geprueft. */
.dokument__wege {
  display: flex;
  flex-wrap: wrap;
  gap: var(--abstand-1);
  min-width: 0;
}

@media (max-width: 30rem) {
  .dokument {
    grid-template-columns: minmax(0, 1fr);
  }

  .dokument__wege {
    margin-left: calc(-1 * var(--abstand-2));
  }
}

/* „Alle herunterladen" im Kopf der Kachel: Symbol und Wort, wie die
   Knoepfe des Drive an derselben Stelle. */
.dokumente__alle {
  gap: var(--abstand-2);
}

/* --- Betrieb (h4) ------------------------------------------- */

.betriebsform {
  display: grid;
  gap: var(--abstand-4);
  margin: var(--abstand-4) 0 0;
  justify-items: start;
}

.betriebsform > .feld {
  width: 100%;
}

.logofeld {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--abstand-3);
  width: 100%;
}

.logofeld__bild,
.logofeld__ersatz {
  flex: 0 0 auto;
  width: 64px;
  height: 64px;
  border-radius: var(--radius-standard);
  object-fit: cover;
}

/* Kein Logo: der Anfangsbuchstabe auf heller Flaeche. Die
   Primaerfarbe kann hier kein Text sein - sie traegt weisse
   Schrift oder steht auf reinem Weiss. Also Textfarbe. */
.logofeld__ersatz {
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--farbe-primaer-sehr-hell);
  color: var(--farbe-text);
  font-size: var(--groesse-h3);
  font-weight: var(--schrift-halbfett);
}

.logofeld__text {
  flex: 1 1 10rem;
  min-width: 0;
}

.logofeld__wort {
  margin: 0;
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

.logofeld__hinweis {
  margin: var(--abstand-1) 0 0;
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

/* Der Knopf ist ein <label> um eine unsichtbare Dateieingabe -
   DIESELBE BAUART WIE DAS ABLEGEFELD IN BEREICH 05, und zwar
   absichtlich dieselbe und nicht das sr-only-Rezept: die Eingabe
   deckt den Knopf GANZ ab, damit die Trefferflaeche der Knopf ist
   und nicht der Dateiname daneben, den der Browser sonst zeichnet.
   Eine 1x1 weggeschnittene Eingabe haette den Knopf nur ueber die
   Label-Verbindung erreichbar gemacht. */
.logofeld__knopf {
  flex: 0 0 auto;
  position: relative;
  overflow: hidden;
  cursor: pointer;
}

.logofeld__eingabe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  cursor: pointer;
}

.logofeld__knopf:focus-within {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: var(--fokusring-abstand);
}

/* ===================================================================
   BEREICH 13 · DER SCHWEBENDE KNOPF „KI FRAGEN" — 12.08.2026
   ===================================================================

   Angesagt: „dann fehlt unten rechts noch das KI ding."

   ES ÜBERSTIMMT REGEL 13 („kein Assistenz-Panel"), und zwar nur zur
   Hälfte — die ausführliche Begründung steht in `kifragen.ts` und in
   UEBERGABE.md. Kurz: die Regel hat ein leeres EINGABEFELD abgelehnt,
   nicht die Ecke. Ein Feld gibt es hier nicht; die Fragen stehen fertig
   da und führen an den Ort, der sie beantwortet.

   `position: fixed` UND NICHT `sticky`: der Knopf gehört zum Fenster,
   nicht zum Text. Er steht unten rechts und bleibt dort, während der
   Inhalt darunter durchläuft.

   Z-INDEX 28 UND NICHT 30: 30 ist das Kontomenü, und das ist am Handy
   ein Vollbild. Läge der Knopf darüber, stünde er auf dem Menü — sein
   eigener Rahmen zeigt ihn dann zwar noch, aber er gehört nicht dahin.
   Über der Kopfzeile (`z-index: 44`) liegt er ohnehin nicht: sie ist
   oben, er unten. */
/* SIE HAENGT NICHT MEHR ALS SPALTE ZUSAMMEN — 12.08.2026. Auf der Website
   steht der Knopf bei `right/bottom: 20px` und das Blatt bei `bottom: 84px`
   (`helfer.css`), also 48 + 20 + 16 px Luft. Zwei feste Lagen statt einer
   Flex-Spalte: so bleibt der Knopf stehen, wenn das Blatt waechst — in einer
   Spalte waere er mitgewandert. */
.kifragen {
  position: fixed;
  right: var(--schweber-abstand);
  bottom: var(--schweber-abstand);
  z-index: 28;
}

/* GESCHLOSSEN IST ES `display: none` UND NICHT DURCHSICHTIG. Vier Ziele,
   die man mit dem Tabulator erreicht, ohne sie zu sehen, sind schlimmer
   als ein Sprung — dieselbe Entscheidung wie beim Kontomenü. */
.rahmen[data-ki='zu'] .kifragen__blatt {
  display: none;
}

/* DAS BLATT FOLGT DEM HELFER DER WEBSITE — `helfer.css`, 12.08.2026:

     Lage      `right: 20px; bottom: 84px`
     Breite    `min(380px, calc(100vw - 40px))`
     Hoehe     `max-height: min(704px, calc(100vh - 120px))`
     Form      Radius 24px (dort 2.4rem bei 1rem = 10px), heller Grund

   DER RADIUS IST DIE EINE ABWEICHUNG, DIE ICH BENENNE: das Produkt hat am
   12.08.2026 auf Ansage kantige Kaesten bekommen („die Border-Radius auf
   0px setzen, von dem Container der keine Farbe hat"). Das Blatt TRAEGT
   eine Farbe — es ist eine weisse Flaeche ueber dem Inhalt, kein farbloser
   Container —, also faellt es nicht unter die Ansage, und der Knopf
   daneben ist rund. Ein eckiges Blatt an einem runden Knopf waere die
   Mischung, die keine der beiden Ansagen wollte.

   `overflow-y: auto` MIT `max-height`: vier Fragen passen immer, aber die
   Hoehe haengt am Fenster und nicht an ihrer Zahl. Ohne die Grenze steht
   das Blatt bei einem kurzen Fenster ueber der Kopfzeile. */
.kifragen__blatt {
  position: fixed;
  right: var(--schweber-abstand);
  bottom: calc(var(--schweber-abstand) + var(--schweber-groesse) + 16px);
  width: min(380px, calc(100vw - 2 * var(--schweber-abstand)));
  max-height: min(704px, calc(100vh - 120px));
  overflow-y: auto;
  padding: var(--abstand-4);
  border-radius: 24px;
  background: var(--farbe-flaeche);
  box-shadow: var(--schatten-helfer);
}

.kifragen__titel {
  margin: 0 0 var(--abstand-3);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text-gedaempft);
}

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

.kifragen__punkt + .kifragen__punkt {
  border-top: var(--randbreite) solid var(--farbe-rand);
}

/* DIE GANZE ZEILE IST DAS ZIEL, nicht nur das Wort. `display: block` mit
   44 px Mindesthöhe — die Untergrenze aus der Prüfliste gilt auch für
   einen Verweis, der wie ein Menüpunkt aussieht. */
.kifragen__weg {
  display: flex;
  align-items: center;
  min-height: 44px;
  padding: var(--abstand-2) 0;
  color: var(--farbe-text);
  text-decoration: none;
}

.kifragen__weg:hover,
.kifragen__weg.zeige-ueberfahren {
  color: var(--farbe-primaer);
  text-decoration: underline;
}

.kifragen__fuss {
  margin: var(--abstand-3) 0 0;
  padding-top: var(--abstand-3);
  border-top: var(--randbreite) solid var(--farbe-rand);
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
}

.kifragen__fuss-weg {
  color: var(--farbe-primaer);
}

/* ===================================================================
   DER KNOPF IST 1:1 DER DER WEBSITE — 12.08.2026, angesagt
   ===================================================================

   Angesagt: „der KI-Knopf unten rechts sollte so aussehen wie auf der
   Website, also 1:1 gleich."

   ABGELESEN aus `EB-Software-Website/stile/bausteine.css` (`.schweber`)
   und `stile/helfer.css` (`.schweber__pfeil`). Die Werte stehen als
   Tokens in `tokens.css`, jeder mit [Website] daneben — Maße, die aus
   einer fremden Datei kommen, gehören benannt und nicht abgetippt.

   HIER STAND DAS GEGENTEIL, seit heute morgen: „Der Knopf trägt zwei
   Wörter und kein Zeichen. Das ist der Teil von Regel 13, der bleibt."
   Die Ansage kehrt das um, und sie hat den besseren Grund: derselbe Knopf
   an derselben Stelle auf Website und im Produkt ist EIN Ding, das der
   Meister einmal lernt. Zwei Knöpfe, die dasselbe tun und verschieden
   aussehen, sind zwei Dinge.

   ER ERBT `.knopf` NICHT — und jetzt aus einem stärkeren Grund als vorher:
   er ist kein Knopf mit Text, sondern eine Fläche mit einem Zeichen darin.
   Die 44-px-Untergrenze der Prüfliste hält er mit 48 px von selbst. */
.kifragen__knopf {
  position: relative;
  box-sizing: border-box;
  width: var(--schweber-groesse);
  height: var(--schweber-groesse);
  padding: 0;
  border: none;
  border-radius: 50%;
  background: var(--farbe-schwarz);
  box-shadow: var(--schatten-schweber);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform var(--dauer-schweber) var(--kurve-schweber);
}

/* NUR AUF ZEIGERGERAETEN. Ohne die Abfrage bleibt der Wachstumszustand am
   Handy nach dem Tippen stehen — dort gibt es kein „der Zeiger geht wieder
   weg". 1:1 uebernommen, samt der eigenen Dauer fuer den Hinweg. */
@media (hover: hover) {
  .kifragen__knopf:hover,
  .kifragen__knopf.zeige-ueberfahren {
    transform: scale(1.1);
    transition: transform var(--dauer-schweber-hover) var(--kurve-schweber);
  }
}

.kifragen__knopf:active,
.kifragen__knopf.zeige-aktiv {
  transform: scale(.85);
  transition: transform var(--dauer-schweber-druck) var(--kurve-druck);
}

/* DER RING IST UNSERER UND NICHT IHRER. Die Website nimmt 2 px Violett mit
   3 px Abstand; im Produkt steht der Fokusring als Token fest und ist
   ueberall gleich — ein Element mit eigenem Ring waere die Ausnahme, an der
   die Tastaturbedienung auseinanderlaeuft. Die FORM ist 1:1, die Farbe
   folgt dem Haus. */
.kifragen__knopf:focus-visible {
  outline: var(--fokusring) solid var(--farbe-fokusring);
  outline-offset: var(--fokusring-abstand);
}

.kifragen__zeichen {
  display: block;
  width: var(--schweber-zeichen);
  height: var(--schweber-zeichen);
  color: var(--farbe-primaer-kontrast);
}

.kifragen__zeichen svg {
  display: block;
  width: 100%;
  height: 100%;
}

/* DER PFEIL LIEGT UEBER DEM ZEICHEN und nicht daneben: beide stehen im
   Markup, die Deckkraft entscheidet. Ein Austausch ueber das Skript waere
   ein zweiter Ort, an dem der Zustand steht. */
.kifragen__zeichen,
.kifragen__pfeil {
  transition: opacity var(--dauer-mittel) var(--kurve);
}

.kifragen__pfeil {
  position: absolute;
  color: var(--farbe-primaer-kontrast);
  font-size: 16px;
  line-height: 1;
  opacity: 0;
}

.rahmen[data-ki='offen'] .kifragen__zeichen { opacity: 0; }
.rahmen[data-ki='offen'] .kifragen__pfeil { opacity: 1; }

/* ============================================================
   BEREICH 14 - Konto und Profil
   Entscheidung n1, n2, n4. Kurzes Menue am Avatar mit FUENF
   Zeilen; dahinter das Profil als eigene, kurze Seite; die
   zweite Stufe freundlich statt drohend.

   EINE DEKLARATION, ZWEI SITUATIONEN. Am Laptop das kurze Menue
   am Avatar, am Handy dasselbe Markup als Vollbild mit grossen
   Knoepfen - "aber HELL, nicht dunkel" (Regel 14). Ueber die
   Behaelterabfrage, nicht ueber eine zweite Deklaration: zwei
   Deklarationen driften auseinander, und genau daran ist in
   Runde 4 die Schiene unten rechts gelandet.
   ============================================================ */

/* Das Menue liegt IM Inhaltsbereich, absolut - nicht fixed am
   Fenster. Fixed hiesse: auch hinter der Reiterleiste. Genau das
   hat die Huellenwache am 31.07.2026 an zwei Ueberlagerungen
   gefunden, das Antwortfeld endete 12 px darunter. */
/* AM HANDY VOLLBILD, AM LAPTOP EIN BLATT OBEN RECHTS — 02.08.2026, und es
   war genau andersherum gebaut.

   Regel 14: „Am Handy dieselben fünf Zeilen als Vollbild mit großen Knöpfen
   — aber hell, nicht dunkel." Gebaut war am Handy eine zentrierte 22-rem-
   Karte und am Laptop das Vollbild. Gemessen stand die rechte Kante des
   Blattes bei 1440 px **383 px** von der rechten Kante der Konto-Pille
   entfernt — das Menü hatte mit dem Knopf, der es öffnet, nichts mehr zu
   tun. Employment Heros Konto-Tafel misst 134 × 264 px und hängt unter
   ihrem Chip. */
/* ===================================================================
   ES HAENGT AN DER PILLE — 11.08.2026, angesagt
   ===================================================================

   „das Pop-up sollte direkt oben rechts auf der jeweiligen Seite unter
   der Pille sein."

   Der Grundzustand ist das HANDY-VOLLBILD, und `fixed` ist hier richtig
   und nicht mehr falsch: die Regel „nicht fixed, sonst liegt es hinter
   der Reiterleiste" stammt vom 31.07.2026, und die Reiterleiste ist am
   03.08.2026 gefallen. Eine Regel, deren Gegenstand weg ist, ist keine
   Regel mehr — sie ist eine Zahl mit einer Geschichte. */
/* ===================================================================
   ES STEHT IMMER IM BAUM UND WIRD NUR GEZEIGT — 12.08.2026
   ===================================================================

   Angesagt: „wenn ich auf den Namen klicke, lädt die Seite neu, bevor das
   Popup kommt, und der andere Header kommt."

   Der Grund lag am Ort der Entscheidung: ob das Menü dastand, entschied der
   SERVER, und ein Server antwortet mit einer ganzen Seite. Jetzt steht das
   Markup immer da, und `data-konto` am Rahmen sagt, ob man es sieht. Mit
   Skript ist der Klick ein Umlegen dieser Marke — kein Netz, kein Aufbau,
   kein Sprung.

   `display: none` UND NICHT `visibility` ODER `opacity`: das geschlossene
   Menü darf nicht im Tabulatorlauf stehen. Fünf Ziele, die man erreicht,
   ohne sie zu sehen, sind schlimmer als ein Sprung. */
.rahmen[data-konto='zu'] .kontomenue {
  display: none;
}

.kontomenue {
  position: fixed;
  inset: 0;
  z-index: 30;
  display: flex;
  justify-content: center;
  align-items: stretch;
  padding: 0;
}

/* Der Weg zurueck liegt HINTER dem Blatt und deckt den Rest ab.
   Ohne Skript ist das Schliessen ein Verweis, kein Knopf, der
   nichts tut. Keine Abdunklung am Handy-Vollbild: das Blatt
   deckt dort ohnehin alles. */
.kontomenue__zurueck {
  position: fixed;
  inset: 0;
  background: var(--farbe-schleier);
}

.kontomenue__blatt {
  position: relative;
  width: 100%;
  padding: var(--abstand-5) var(--abstand-4);
  background: var(--farbe-flaeche);
}

.kontomenue__kopf {
  display: flex;
  align-items: center;
  gap: var(--abstand-3);
  padding-bottom: var(--abstand-3);
  border-bottom: var(--randbreite) solid var(--farbe-rand);
}

.kontomenue__wer {
  min-width: 0;
}

.kontomenue__name {
  margin: 0;
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
  overflow-wrap: anywhere;
}

.kontomenue__email {
  margin: var(--abstand-1) 0 0;
  font-size: var(--groesse-klein);
  color: var(--farbe-text-gedaempft);
  overflow-wrap: anywhere;
}

.kontomenue__liste {
  list-style: none;
  margin: var(--abstand-2) 0 0;
  padding: 0;
}

/* Verweis und Knopf sehen gleich aus und sind gleich gross. Der
   Unterschied steckt im Verb, nicht im Aussehen: vier fuehren
   irgendwohin, die fuenfte AENDERT etwas und ist deshalb ein
   Formular. Ein zustandsaenderndes GET waere genau der Fehler,
   den HERKUNFT.md am Push-2FA des Altbestands benennt. */
.kontomenue__knopf {
  display: flex;
  align-items: center;
  width: 100%;
  min-height: 44px;
  padding: var(--abstand-2) var(--abstand-3);
  border: 0;
  border-radius: var(--radius-standard);
  background: transparent;
  color: var(--farbe-text);
  font: inherit;
  font-size: var(--groesse-text);
  text-align: left;
  text-decoration: none;
  cursor: pointer;
}

/* Ueberfahren traegt Flaeche UND Tiefe - nicht nur Farbe. */
.kontomenue__knopf:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-flaeche-gedaempft);
  box-shadow: var(--schatten-1);
}

.kontomenue__knopf:is(:active, .zeige-aktiv) {
  transform: translateY(1px);
  box-shadow: none;
}

/* Abmelden ist die einzige Zeile, die etwas beendet. Sie traegt
   die Fehlerfarbe als SCHRIFT auf weisser Flaeche - gemessen
   5,62:1. Kein roter Balken, keine gefuellte Flaeche: es ist
   kein Datenverlust, sondern ein Ende. */
/* EINE LINIE VOR „ABMELDEN" — 02.08.2026. Kajabi setzt „Logout" ALLEIN in
   einen eigenen Block, Employment Hero unter die zweite Trennlinie. Bei uns
   stand es als fünfte Zeile zwischen vier gleich aussehenden — vier führen
   irgendwohin, die fünfte beendet etwas. Der Unterschied steckte allein in
   der Schriftfarbe. Jetzt trägt ihn auch der Abstand. */
.kontomenue__form {
  margin-top: var(--abstand-2);
  padding-top: var(--abstand-2);
  border-top: var(--randbreite) solid var(--farbe-rand);
}

.kontomenue__knopf--abmelden {
  color: var(--farbe-fehler);
}

/* --- Am Laptop: ein kurzes Blatt oben rechts ----------------- */

/* DIE BEHAELTERABFRAGE MUSS `min-width` HEISSEN — 02.08.2026.
   Diese beiden Bloecke standen unter EINER Abfrage mit
   `max-width: 44.999rem`, also unter der SCHMALEN Bedingung. Damit lag am
   Handy das kurze Blatt und am Laptop das Vollbild — die Umkehrung dessen,
   was Regel 14 sagt. Gemessen: Anteil 100 % bei 1440 px (Grenze < 60),
   Anteil 90 % bei 390 px (Grenze >= 98). Die Grundregel oben ist die
   Handy-Regel; hier steht nur, was sich am Laptop AENDERT. */
@container huelle (min-width: 45rem) {
  /* ===================================================================
     UNTER DER PILLE, NICHT NEBEN IHREM UNGEFAEHREN ORT — 11.08.2026
     ===================================================================

     HIER STAND `justify-content: flex-end` mit der Begründung, die
     rechte Innenkante der Inhaltskarte liege „bei 1440 px an derselben
     Stelle wie die rechte Kante der Pille darüber (beide 32 px vom
     Fensterrand)". Die Zahl stimmte an einer Breite und war an jeder
     anderen eine Vermutung — und senkrecht stimmte sie nie: das Menü
     hing an `main`, und `main` fängt unter der Überschrift an. Gemessen
     bei 1440 px: **296 px** zwischen Unterkante Pille und Oberkante
     Blatt, mit der ganzen Seitenüberschrift dazwischen.

     `top: 100%; right: 0` an der Hülle der Pille sagt dasselbe ohne
     jede Zahl — und es stimmt bei jeder Fensterbreite von selbst. */
  .kontomenue {
    position: absolute;
    inset: auto 0 auto auto;
    top: calc(100% + var(--abstand-2));
    display: block;
    padding: 0;
  }

  .kontomenue__blatt {
    /* HIER STAND `width: auto` MIT `min-width: 18rem; max-width: 22rem`.
       Solange das Blatt ein Flexkind in einer bildschirmbreiten Zeile war,
       kam es damit auf seine 22 rem. Seit es selbst absolut steht, gilt
       Schrumpfen-auf-Inhalt — und das landet auf dem MINIMUM: gemessen
       288 px statt 352, die E-Mail brach nach „brenner@elektro-" um.

       Eine feste Breite ist hier richtig und nicht faul: das Menü hat fünf
       feste Zeilen und einen Namen. Es gibt nichts, was mitwachsen müßte,
       und ein Menü, das je nach Länge einer Adresse eine andere Breite
       hat, wandert bei jedem Konto woandershin. */
    width: 22rem;
    padding: var(--abstand-4);
    border: var(--randbreite) solid var(--farbe-rand);
    border-radius: var(--radius-gross);
    box-shadow: var(--schatten-3);
  }

  /* ===================================================================
     KEIN SCHLEIER AM LAPTOP — 11.08.2026, angesagt
     ===================================================================

     „dann sollte die gesamte Seite nicht dunkel werden außer auf mobile."

     HIER STAND EIN SCHLEIER BEI 60 % DECKKRAFT, und der Vermerk daneben
     hat die Ansage schon selbst enthalten: „die drei Konto-Menüs der
     Referenz dunkeln überhaupt nicht ab. Das Menü ist ein Zwischenschritt,
     kein Ortswechsel." Aus diesem Satz folgt kein schwächerer Schleier,
     sondern gar keiner — die Runde davor hatte 0,78 auf 0,60 gesetzt und
     damit einen Fehler halbiert statt ihn abzustellen.

     DIE FLAECHE BLEIBT, nur ihre Farbe geht. Sie ist der Weg hinaus:
     ein Klick irgendwohin schließt das Menü, und ohne Skript geht das
     nur über einen Verweis, der etwas überdeckt. Unsichtbar heißt hier
     durchsichtig, nicht `display: none`. */
  .kontomenue__zurueck {
    background: transparent;
  }
}

/* --- Am Handy: Vollbild mit grossen Knoepfen, HELL ----------- */

@container huelle (max-width: 44.999rem) {
  /* Der Weg zurueck braucht am Vollbild eine eigene Flaeche - er
     liegt sonst vollstaendig unter dem Blatt und ist nicht mehr
     erreichbar. Er sitzt oben rechts und ist 44 x 44 gross. */
  .kontomenue__zurueck {
    inset: auto var(--abstand-3) auto auto;
    top: var(--abstand-3);
    width: 44px;
    height: 44px;
    border-radius: var(--radius-rund);
    background: var(--farbe-flaeche-gedaempft);
    z-index: 1;
  }

  .kontomenue__zurueck::before,
  .kontomenue__zurueck::after {
    content: "";
    position: absolute;
    left: 13px;
    top: 21px;
    width: 18px;
    height: 2px;
    background: var(--farbe-text);
  }

  .kontomenue__zurueck::before { transform: rotate(45deg); }
  .kontomenue__zurueck::after { transform: rotate(-45deg); }

  /* GROSSE KNOEPFE. Regel 14: "dieselben fuenf Zeilen als
     Vollbild mit grossen Knoepfen". n3 weglassen: "die Symbole
     in den Knoepfen, wenn der Text schon eindeutig ist." */
  .kontomenue__knopf {
    min-height: 56px;
    margin-top: var(--abstand-2);
    border: var(--randbreite) solid var(--farbe-rand-bedienelement);
    font-size: var(--groesse-gross);
  }
}

/* --- Die Kontoseiten ---------------------------------------- */

.konto {
  /* `height: 100%` und `overflow-y: auto` gefallen — Baustelle 0.1. */
  padding: var(--abstand-4) var(--abstand-5) var(--abstand-7);
}

/* DIE KONTOSEITEN SIND SCHMALER ALS DER REST — 02.08.2026. Ihre Karten
   massen 737,7 px (68 Zeichen); der Median der vier Referenzen liegt bei
   458 px. Es sind kurze Formulare, keine Lesetexte: `--lese-breite` ist
   hier die Obergrenze, nicht das Ziel.
   `/benachrichtigungen` BEHAELT die volle Breite — dort steht neben jedem
   Schalter ein Erklaersatz, und der braucht die Zeile. */
.konto .block {
  max-width: var(--lese-breite);
}

.konto--meldungen .block {
  max-width: none;
}

.profilform {
  display: grid;
  gap: var(--abstand-4);
  margin: var(--abstand-4) 0 0;
  justify-items: start;
}

.profilform > .feld {
  width: 100%;
}

/* Der Stand steht als WORT da, nicht als Farbe oder Haken. */
.konto__sicherheit {
  margin: var(--abstand-5) 0 0;
  padding-top: var(--abstand-4);
  border-top: var(--randbreite) solid var(--farbe-rand);
}

.konto__stand {
  margin: 0;
  color: var(--farbe-text);
}

/* DIE BESTAETIGUNG NACH DEM SPEICHERN — 17.10.2026. Ein Satz in Tinte und
   nichts weiter: der Fehlerfall hat `fehlerzeile()` mit Zeichen, der
   Erfolg braucht keins, er ist der erwartete Ausgang. */
.konto__meldung {
  margin: 0;
  color: var(--farbe-text);
  font-weight: var(--schrift-fett);
}

/* Die Handlungsfarbe als Text - und deshalb auf REINEM WEISS.
   Auf einer getoenten Flaeche kann sie kein Text sein, das ist
   Arithmetik und keine Vorliebe (Regel 11).

   UND EINE TREFFERFLAECHE, kein Wort im Fliesstext. Zuerst klebte
   der Verweis ans Satzende; bei 390 px und +15 % lag sein Kasten
   im Kasten des umgebrochenen Satzes (gemessen 24 px), und mit
   Arbeitshandschuh war er nicht zu treffen. Jetzt steht er
   darunter und ist 44 px hoch. */
.konto__weg,
.konto__ausweg .konto__weg,
.hilfe__weg {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--farbe-primaer);
  text-underline-offset: 3px;
}

.meldungen {
  list-style: none;
  margin: var(--abstand-4) 0 0;
  padding: 0;
}

.meldung {
  padding: var(--abstand-3) 0;
  border-top: var(--randbreite) solid var(--farbe-rand);
}

/* HIER STANDEN `.hilfe`, `.hilfe dt` und `.hilfe dd` — die Tabelle
   „E-Mail / Erreichbar". Gefallen am 19.10.2026 mit dem Umbau des
   Hilfe-Blocks (`konto.ts`, `hilfe()`).

   DER BLOCK AUS BEREICH 14 IN DER KACHEL — 19.10.2026. `.konto` und
   `.block` brachten ihre eigenen Polster mit (16/24 und 32/48 px); in
   der Kachel, die schon gepolstert ist, stand der Inhalt dadurch rund
   70 px weiter rechts als ihr Etikett (Bildschirmfoto Lennard). */
.inhaltskachel > .konto {
  padding: 0;
}

.inhaltskachel > .konto > .block {
  max-width: none;
  margin: 0;
  padding: 0;
}

/* Der Block: Formular (oder Bestaetigung) und Adresszeile. */
.hilfe {
  margin: var(--abstand-4) 0 0;
}

.hilfe > .profilform {
  margin: 0;
}

/* DIE ADRESSE ALS LEISE ZEILE UNTER DEM FORMULAR — wie Skiff („You can
   also email us at …"). Der Verweis steht in einer EIGENEN Zeile und
   nicht am Satzende: dort waere er bei 390 px und +15 % ein 24 px hoher
   Kasten im umgebrochenen Satz (Begruendung bei `.konto__weg`). */
.hilfe__postfach {
  margin: var(--abstand-5) 0 0;
  color: var(--farbe-text-gedaempft);
}

.hilfe__postfach .hilfe__weg {
  display: flex;
  width: fit-content;
  max-width: 100%;
  overflow-wrap: anywhere;
}

/* --- Die zweite Stufe --------------------------------------- */

/* ZWEI SAETZE, ein Knopf, ein sichtbarer Ausweg. Kein
   Vorhaengeschloss - n4 weglassen: "erzeugt genau das Gefuehl,
   das man hier nicht will." */
.konto__nutzen {
  margin: var(--abstand-4) 0 0;
  max-width: var(--breite-text-max);
  color: var(--farbe-text);
}

/* DIESELBE BAUART WIE `.profilform` — 19.10.2026, Abnahme Lennard: „da
   ist kein spacing zwischen code und bestaetigen". Hier stand nur der Rand
   nach oben; Feld und Knopf klebten aneinander. Am 17.10.2026 war genau das
   beim Passwortformular aufgefallen und dort mit `profilform` geloest — die
   Formulare der zweiten Stufe blieben liegen. */
.konto__form {
  display: grid;
  gap: var(--abstand-4);
  margin: var(--abstand-5) 0 0;
  justify-items: start;
}

.konto__form > .feld {
  width: 100%;
}

/* SICHTBAR, nicht grau angedeutet. Regel 14 verlangt das
   ausdruecklich: "darunter ein SICHTBARER Textlink." */
.konto__ausweg {
  margin: var(--abstand-4) 0 0;
}

/* ------------------------------------------------------------
   Die zweite Stufe, Einrichtungsbildschirm - 13.08.2026

   VIER NEUE NAMEN, und alle vier waren vorher frei: geprueft mit
   `grep` auf `.konto__schluessel`, `.konto__weg-app`,
   `.konto__reservecodes` und `.block__untertitel`. Die Hausregel
   verlangt das, seit dreimal derselbe Name zweimal vergeben war
   und die spaetere Regel die aeltere still uebernommen hat.
   ------------------------------------------------------------ */

/* DER SCHLUESSEL WIRD ABGETIPPT, also braucht er eine Schrift, in
   der man 0 von O und 1 von l unterscheidet. Das ist die einzige
   Stelle im Produkt mit dieser Anforderung — deshalb steht hier
   `monospace` und kein Token: ein Token waere ein Versprechen,
   dass es das oefter gibt. */
.konto__schluessel {
  margin: var(--abstand-4) 0 0;
  font-family: ui-monospace, monospace;
  font-size: var(--groesse-text);
  /* Zweiunddreissig Zeichen in Vierergruppen brauchen bei 390 px
     zwei Zeilen. Sie duerfen umbrechen — aber nur zwischen den
     Gruppen, nie innerhalb. */
  word-spacing: var(--abstand-2);
  overflow-wrap: break-word;
}

.konto__weg-app {
  margin: var(--abstand-2) 0 0;
}

/* WIE `.konto__weg` — 19.10.2026. Der Verweis stand im Blau des Browsers,
   als einziger auf der Seite (in Lennards Bildschirmfoto der Abnahme). */
.konto__weg-app a {
  color: var(--farbe-text);
  text-underline-offset: 0.2em;
}

/* DIE ZWISCHENUEBERSCHRIFT im Block. `block__titel` ist die des
   ganzen Blocks; hier geht es eine Stufe tiefer, und ohne Abstand
   darueber klebte "Acht Reservecodes" am Verweis darueber — im
   Bild gesehen, nicht gemessen. */
.block__untertitel {
  margin: var(--abstand-5) 0 0;
  font-size: var(--groesse-text);
  font-weight: var(--schrift-halbfett);
}

/* ACHT CODES, ZWEISPALTIG AUF GRAUER FLAECHE — 19.10.2026. Hier stand
   „untereinander und nicht nebeneinander: wer sie abschreibt, verliert in
   einer Reihe die Zeile". Seit es „Codes herunterladen" gibt, schreibt sie
   kaum noch jemand ab; zwei Spalten mit Luft dazwischen lassen sich trotzdem
   zeilenweise lesen. Die graue Flaeche ohne Rahmen ist die der Website.
   Dieselbe Schrift wie der Schluessel, aus demselben Grund.

   `max-content` UND NICHT `1fr`: zehn Zeichen brauchen keine halbe Kachel,
   und weit auseinandergezogene Spalten lesen sich als zwei Listen. */
.konto__reservecodes {
  display: grid;
  grid-template-columns: repeat(2, max-content);
  gap: var(--abstand-2) var(--abstand-6);
  margin: 0;
  padding: var(--abstand-4) var(--abstand-5);
  list-style: none;
  background: var(--farbe-flaeche-gedaempft);
  font-family: ui-monospace, monospace;
  font-size: var(--groesse-text);
  line-height: var(--zeilenhoehe-weit);
}

/* NUR AUF SEHR SCHMALEN GERAETEN EINE SPALTE. Bis zum 19.10.2026 galt das
   unter 30 rem: neben der Nummer blieben bei 390 px rund 245 px, zu wenig
   fuer zwei Spalten. Seit der Inhalt am Handy ueber die volle Breite der
   Kachel laeuft, passen zwei Spalten auch bei 360 px — gemessen mit
   `zweite-stufe.spec.ts` bei 360 px ohne diese Regel, gruen. Darunter
   (320-px-Geraete) ist die Zeile Vorsorge, nicht gemessen. */
@media (max-width: 22rem) {
  .konto__reservecodes {
    grid-template-columns: max-content;
  }
}

/* ------------------------------------------------------------
   Die Sicherheitsseite in Karten — 19.10.2026, Abnahme Lennard
   („so wie /einstellungen stylen")

   NEUE NAMEN, vorher geprueft: `.sicherheit`, `.schritte`, `.qr`,
   `.konto__scan` und `.konto__abtippen` stehen in keiner Vorlage des
   Hauses. Die beiden letzten hiessen zuerst `.zweitestufe__…` — ohne
   einen Block `.zweitestufe`; die Wache in `huelle.test.ts` hat es
   gemeldet. Sie gehoeren jetzt zu `.konto` wie `.konto__schluessel`.
   ------------------------------------------------------------ */

/* Die Karten untereinander, mit dem Abstand der Bento-Kacheln. */
.sicherheit {
  display: flex;
  flex-direction: column;
  gap: var(--bento-luecke);
  min-width: 0;
}

/* IN DER KACHEL TRAEGT DEREN `gap` DEN ABSTAND. Die Raender oben stammen
   aus der Zeit, als diese Teile in einem `.block` untereinander standen;
   in einer Kachel kaemen sie zum `gap` dazu. */
.sicherheit .inhaltskachel > .konto__nutzen,
.sicherheit .inhaltskachel > .konto__form,
.sicherheit .inhaltskachel > .konto__ausweg,
.sicherheit .inhaltskachel > .profilform,
.sicherheit .inhaltskachel > .block__satz,
.sicherheit .schritte__inhalt > .konto__form,
.sicherheit .schritte__inhalt > .konto__ausweg,
.sicherheit .schritte__inhalt > .block__satz {
  margin-top: 0;
}

/* `min-width: 0` — die Liste ist ein Flex-Kind der Kachel. Ohne die Zeile
   war sie bei 390 px so breit wie ihr breitester Inhalt (zwei Codespalten),
   und Satz wie Codeflaeche liefen rechts ueber die Kachel hinaus. Gesehen
   im Bild; den Ueberlauf misst seitdem `zweite-stufe.spec.ts`. Seit die
   Codes am Handy einspaltig stehen, ist die Zeile Vorsorge (Hausregel) —
   gestrichen bliebe die Messung gruen, und das ist so festgehalten. */
.schritte {
  display: grid;
  gap: var(--abstand-6);
  min-width: 0;
  margin: 0;
  padding: 0;
  list-style: none;
}

/* TITEL MIT NUMMER, DARUNTER DER INHALT — 19.10.2026. Vorher stand die
   Nummer in einer eigenen Spalte links neben dem ganzen Schritt; bei
   390 px blieben dem Inhalt rund 245 px, und „Codes herunterladen" brach
   im Knopf um (Bild der Abnahme Runde 2). `minmax(0, 1fr)`, damit ein
   langer Schluessel die Spalte nicht sprengt. */
.schritte__schritt {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--abstand-3);
  min-width: 0;
}

/* DIE NUMMER IM HELLBLAUEN KAESTCHEN, wie auf der Website — Tinte auf
   `--farbe-primaer-hell-flaeche`, 13,4:1. */
.schritte__nummer {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  background: var(--farbe-primaer-hell-flaeche);
  color: var(--farbe-text);
  font-weight: 800;
  font-size: var(--groesse-text);
}

/* AM RECHNER UNTER DEM TITEL EINGERUECKT — um Kaestchen und Luft, damit
   Satz, Quadrat und Feld an der Kante des Titels stehen. Am Handy nicht:
   dort ist jede Spalte zu schmal fuer die 56 px. */
.schritte__inhalt {
  display: grid;
  gap: var(--abstand-3);
  justify-items: start;
  min-width: 0;
  padding-left: calc(40px + var(--abstand-4));
}

@media (max-width: 30rem) {
  .schritte__inhalt {
    padding-left: 0;
  }
}

.schritte__inhalt > .konto__form {
  justify-self: stretch;
}

/* DIE NUMMER STEHT IM TITEL. Das Kaestchen schrumpft nicht (`flex: none`),
   der Text daneben bricht um, wenn er muss. */
.schritte__titel {
  margin: 0;
  /* Auf die Hoehe des Kaestchens gesetzt. */
  min-height: 40px;
  display: flex;
  align-items: center;
  gap: var(--abstand-4);
  min-width: 0;
  font-size: var(--groesse-h3);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
}

/* QUADRAT UND SCHLUESSEL NEBENEINANDER, am Handy untereinander. */
.konto__scan {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: var(--abstand-5);
  min-width: 0;
}

.konto__abtippen {
  flex: 1 1 16rem;
  min-width: 0;
}

.konto__abtippen > .block__satz {
  margin-top: 0;
}

/* DER QR-CODE. 232 px tragen bei Version 13 (77 Module mit Ruhezone) rund
   3 px je Modul — genug fuer jede Telefonkamera vor einem Monitor. Dunkel
   auf Weiss und nie umgekehrt: viele Apps lesen ein helles Quadrat auf
   dunklem Grund nicht. */
.qr {
  display: block;
  flex: none;
  width: min(232px, 100%);
  height: auto;
  aspect-ratio: 1;
}

.qr__grund {
  fill: var(--farbe-flaeche);
}

.qr__module {
  fill: var(--farbe-text);
}

/* ============================================================
   BEREICH 18 - Die Uebersicht
   Eigene Seite, eigene Route, sechster Navigationseintrag.

   Hier stand bis zum 31.07.2026 das Gegenteil ("NUR IN DER
   WERKSTATT. Keine Route, kein Navigationseintrag - ein sechster
   waere eine Aenderung an Bereich 01") und bis zum 01.08.2026 die
   Rede von zwei Entwuerfen. Beides ist ueberholt: die Aenderung an
   Bereich 01 ist angesagt, der zweite Entwurf ist geloescht.

   DIE FORM KOMMT AUS DEM EIGENEN PORTAL (platform, dashboard.ejs):
   Abschnittskopf .eb-row-head, Kennzahl-Kachel .eb-stat,
   Raster .eb-stat-grid, Toene --palette-* (bei uns
   --farbe-kachel-* in tokens.css, NUR auf dem Zeichenkreis).

   Hoechstens fuenf Kacheln in zwei Gruppen. Kein Vergleich mit
   dem Vormonat. Und NIE EIN PROZENTWERT - ein Ring waere einer
   in rund.

   HIER STAND "KEINE DIAGRAMME, KEINE VERLAEUFE" - UMGESTOSSEN AM
   04.08.2026 auf Ansage: "Diagramme auf der Uebersicht, Chart.js,
   selbst gehostet." Der Satz faellt, weil er nicht mehr stimmt,
   und nicht weil er falsch war: er stand hier mit Regel 07 als
   Begruendung, und die Ansage ist juenger.

   Die fuenf Kacheln bleiben davon unberuehrt. Der Verlauf steht
   UNTER ihnen in einem eigenen Abschnitt und beantwortet eine
   andere Frage: die Kacheln sagen, wie es heute steht, der
   Verlauf sagt, woher das kommt.
   ============================================================ */

.tafel {
  container-type: inline-size;
  /* DREI SACHEN UNTEREINANDER, mit Luft dazwischen — 06.08.2026. Vorher
     trug jeder Block seinen eigenen Abstand, und der graue Kasten um das
     Diagramm brachte noch einen mit. Ein Fluss, ein Abstand. */
  display: flex;
  flex-direction: column;
  gap: var(--abstand-6);
}

/* ===================================================================
   DER BENTO-BLOCK — 06.08.2026, uebernommen statt erfunden
   ===================================================================

   DIE VORLAGE IST EIN EINZIGER ABSCHNITT: `_bentos_qubww_1
   global-section background-gray` von Jitters Startseite
   (Desktop-Ordner „Jitter", ganz unten vor dem Fuss). Er besteht aus
   genau zwei Teilen, und beide stehen hier nachgebaut:

     1. eine GRAUE AUSSAGEFLAECHE ueber die volle Inhaltsbreite,
        ECKIG, mit einem sehr grossen Satz und einer Pille darunter
        („Loved by the best creative teams all over the world" +
        „Read customer stories")
     2. eine KACHELREIHE mit Radius 40, jede Kachel: Chip-Pille,
        Riesentitel, Weg-Zeile mit Pfeil („Release notes" /
        „Powerful updates every week" / „See what's new →")

   ALLE ZAHLEN UNTEN SIND AM GERENDERTEN ABZUG GEMESSEN, nicht aus
   seiner CSS gelesen — bei 1920, 1440, 1100 und 390 px. Die
   Messschriebe liegen unter `messberichte/jitter-bento.md`.

   WARUM NICHT DIE VOLLTON-FLAECHE VON VORHER: `.aussage` traegt die
   Farbe ueber die volle Breite und ist damit das Gegenteil dessen,
   was in der Vorlage steht — dort ist die grosse Flaeche GRAU und
   die Farbe sitzt in den Kacheln darunter. Der gemessene
   Flaechenanteil sagt dasselbe: `--farbe-flaeche-gedaempft` rund
   41 %, Buntton rund 1 %. `.aussage` bleibt stehen, die fuenf
   uebrigen Seiten benutzen sie weiter, bis sie an der Reihe sind.

   KEIN HEX IN DIESEM ABSCHNITT, auch nicht im Kommentar: die Probe
   „kein Farbwert im Bereich-18-Abschnitt" sucht nach `#` und kann
   eine Belegstelle nicht von einer Deklaration unterscheiden. Die
   gemessenen Werte stehen mit derselben Herkunftsangabe in
   `tokens.css`, wo sie hingehoeren. */

/* JITTERS KANTE, UND NUR AUF DIESER SEITE.
   ========================================
   [gemessen] Jitters Kopfzeile und sein Inhalt liegen bei JEDER
   Breite auf DERSELBEN Kante — 300 px bei 1920, 290 bei 1440, 20 bei
   390. Die Inhaltsspalte ist dadurch 1320 / 860 / 350 px breit.
   Unsere war 1776 / 1296 / 350: dieselbe Kante, aber viel weiter
   aussen.

   DAS IST KEINE ZURUECKNAHME DER ENTSCHEIDUNG VOM 05.08.2026. Die
   lautete (Tokens, „ZWEI BREITEN"): volle Fensterbreite fuer
   Posteingang, Kalender und Dateiverwaltung, mittige Spalte nur fuer
   den Bildschirm zum LESEN. Die Uebersicht ist der Bildschirm zum
   Lesen — sie ist die eine Seite, auf die das Argument von damals
   selbst zeigt. Die vier Arbeitsseiten bleiben unberuehrt.

   DIE SPANNE IST GERECHNET, NICHT GEGRIFFEN: drei gemessene Anker
   (20 px bei 390, 289 bei 1440, 300 bei 1920) und eine Gerade
   dazwischen. `27.6cqw - 108px` trifft alle drei und ist zwischen
   ihnen streng monoton — die harte Regel „nie schmaler bei
   groesserem Fenster" gilt weiter.

   UND DANN DIE KOLLISION, DIE DIE MESSUNG AUFGEDECKT HAT.
   =======================================================
   Mit dem reinen Jitter-Wert stand bei 1440 px „Einstellungen" unter
   dem Kontozeichen. Nachgemessen an den natuerlichen Breiten der drei
   Teile der Kopfzeile:

     Wortmarke   151 px
     Navigation  690 px   (`scrollWidth`, ungestaucht)
     Konto        64 px
     zwei Luecken 30 px
     ------------------
     zusammen    935 px

   JITTERS SPALTE IST BEI 1440 PX ABER NUR 860 PX BREIT. Die zwei
   Vorgaben — „die Kopfleiste bleibt, wie sie ist" und „860 px bei
   1440" — passen an dieser Breite nicht zusammen, und zwar um 75 px.

   ALSO IST DER BEDARF DER KOPFZEILE DER BODEN. Der zweite Ausdruck
   laesst den Rand nie so weit wachsen, dass weniger als 940 px
   uebrig bleiben (935 gemessen plus ein Haar). Oberhalb von rund
   1540 px greift wieder Jitters Wert, bei 1920 px steht die Spalte
   exakt auf seinen 1320. Bei 1440 sind es 940 statt 860 — so nah,
   wie die Kopfzeile es zulaesst.

   DER BODEN IST AM 06.08.2026 WIEDER GEFALLEN, und zwar auf Ansage:
   „Kopfleiste ueber die volle Fensterbreite … damit faellt dein
   Konflikt weg. Setz die Inhaltsspalte bei 1440 auf Jitters gemessene
   860 statt der 940." Die Kopfzeile liest seitdem `--rand-kopf` und
   nicht mehr diesen Wert; sie zwingt der Spalte also nichts mehr auf.
   Hier stand deshalb bis dahin ein zweiter Ausdruck
   `max(20px, (100cqw - 940px) / 2)`, der den Rand begrenzte — er ist
   ersatzlos weg.

   GEMESSEN NACH DEM AUSBAU: 1320 px bei 1920, 861 bei 1440, 350 bei
   390. Die 861 sind Jitters 860 auf ein Pixel genau; die Gerade ist
   nicht nachjustiert worden, sie trifft ihn von selbst.

   `cqw` UND NICHT `vw`, aus demselben Grund wie beim Vorgaengerwert:
   in der Werkstatt steht eine 390 px schmale Huelle in einem 1440 px
   breiten Fenster, und `vw` gaebe ihr dort den Rand des grossen. */
/* ===================================================================
   ER GILT SEIT DEM 10.08.2026 PORTALWEIT, NICHT NUR AUF DER ÜBERSICHT
   ===================================================================

   HIER STAND `.huelle:has(.bento)`. Die Übersicht ist die einzige Seite
   mit einem Bento — sie war damit die einzige Seite mit diesem Rand, und
   die fünf übrigen standen auf `clamp(20px, 5cqw, 72px)`.

   GEMESSEN bei 1920 px, alle sechs Seiten, `padding-inline` der Spalte
   und die x-Kante der Wortmarke:

     /uebersicht      300 px    Inhalt 1320    Wortmarke bei x 300
     /posteingang      72 px    Inhalt 1776    Wortmarke bei x  72
     /inhalte          72 px    Inhalt 1776    Wortmarke bei x  72
     /drive            72 px    Inhalt 1776    Wortmarke bei x  72
     /ziele            72 px    Inhalt 1776    Wortmarke bei x  72
     /einstellungen    72 px    Inhalt 1776    Wortmarke bei x  72

   **Die Kopfzeile sprang beim Seitenwechsel um 228 px.** Sie liest
   `--rand-seite` (gedeckelt durch ihren eigenen Bedarf), also wanderte
   die Wortmarke von x 300 auf x 72 und wieder zurück — bei jedem Klick
   in der Navigation. Das ist keine Breitenfrage einer Seite, sondern
   eine gebrochene Kante des ganzen Portals.

   ANGESAGT AM 10.08.2026: „breite ist weird, sollte portalweit wie bei
   übersicht sein." Die Übersicht ist der Wert, mit dem der Auftraggeber
   zufrieden ist, und sie trägt Jitters gemessene Zahlen — 1320 px bei
   1920, 861 bei 1440, 350 bei 390.

   WAS DAS DEN POSTEINGANG KOSTET, gehört dazugesagt: seine Inhaltsspalte
   fällt bei 1920 px von 1776 auf 1320 und bei 1440 von 1296 auf 861. Die
   Liste steht dann bei 1440 auf ihrer Untergrenze (22 rem) statt auf
   28 %, und dem Gespräch bleiben 477 px. Das ist Jitters eigenes Maß —
   sein „Drafts" fährt bei 1440 px 858 px Inhalt — und es ist enger als
   das, was Intercom und Front für einen Posteingang nehmen. Eine Kante
   für alle sechs Seiten ist es wert; wer es zurückdreht, dreht nur
   diesen einen Block zurück.

   `.huelle` UND NICHT `:root`: `/einrichten` hat seine eigene
   Stilvorlage und seine eigenen Token, und dort gilt dieser Rand nicht.
   Die Werkstatt behält damit auch ihre schmale Hülle im breiten
   Fenster. */
.huelle {
  --rand-seite: clamp(20px, 27.6cqw - 108px, 300px);
}

/* DER TAKT DES BENTOS — 11.08.2026, drei gemessene Stufen an einem Ort.
   Die Werte sind die von `.bento` (40 px bei 1920, 20 bei 1440, 30 bei
   390); die Umbrueche stehen weiter unten bei den Bento-Regeln. Er sitzt
   an `.rahmen`, weil `.huelle` der Behaelter ist und sich nicht selbst
   abfragen kann. */
.rahmen {
  --bento-luecke: 30px;
}

/* [gemessen] Abstand zwischen der grauen Flaeche und der Kachelreihe:
   40 px bei 1920, 20 bei 1440, 30 bei 390. Der Mittelwert taugt hier
   nicht — die Reihe steht bei 1920 weiter ab, weil die Flaeche
   darueber groesser ist. Also drei Stufen wie alles andere auch.

   SEIT DEM 11.08.2026 STEHT DIE ZAHL AN EINEM TOKEN und nicht mehr
   dreimal an dieser Regel. Grund: fuenf weitere Seiten tragen dasselbe
   Bento und setzen ihren eigenen Takt darunter fort — der Abstand
   zwischen Kachelreihe und Arbeitsflaeche muss derselbe sein wie der
   zwischen Flaeche und Kachelreihe, sonst hat eine Seite zwei Takte.
   Die WERTE sind unveraendert; nur ihr Ort ist es. Das Token steht an
   `.rahmen` und nicht an `.huelle`, weil ein Behaelter sich nicht selbst
   abfragen kann. */
.bento {
  display: flex;
  flex-direction: column;
  gap: var(--bento-luecke);
}

/* DIE GRAUE AUSSAGEFLAECHE. [gemessen] Radius 0 — sie ist als
   einzige grosse Flaeche der Vorlage NICHT gerundet, und das ist der
   Unterschied, an dem man sie von einer Kachel unterscheidet: die
   Flaeche traegt den Abschnitt, die Kachel traegt einen Eintrag.
   Polster [gemessen] 60/40 · 80/86/100 · 100/130/120. */
.bento__flaeche {
  padding: 60px 40px;
  background: var(--farbe-flaeche-gedaempft);
  color: var(--farbe-text);
}

/* [gemessen] 40 px / 800 / Zeilenhoehe 1,0 / Laufweite -0.04em bei
   390 px; 48 px und Zeilenhoehe 0,85 ab 1441 px sind es 72 px.
   `max-width` in ch und nicht in px: die Vorlage laesst den Satz nach
   rund der halben Flaechenbreite umbrechen (651 von 1320 px), und ein
   Umbruch nach Zeichen haelt das ueber alle drei Breiten. */
.bento__titel {
  margin: 0;
  max-width: 16ch;
  font-size: 40px;
  font-weight: 800;
  line-height: 1;
  letter-spacing: -0.04em;
  text-wrap: balance;
}

/* [gemessen] 40 px zwischen Satz und Knopf, viermal gefunden und
   immer derselbe Wert. Der Knopf ist ein `<a>` und traegt deshalb
   `align-self: flex-start` — sonst zoege ihn die Spalte auf die volle
   Breite der Flaeche. */
.bento__knopf {
  align-self: flex-start;
  margin-top: 40px;
}

/* GELB UND NICHT SCHWARZ, und das ist keine Wahl: an genau dieser
   Stelle der Vorlage steht `_yellow_ruopi_122`, und sein Gelb ist auf
   den Punkt `--farbe-akzent-gelb`; die Schrift darauf ist Tinte.
   Beide Werte tragen wir bereits. Tinte auf Gelb haelt 16,40:1.

   HIER STAND „es ist die einzige Stelle der Seite mit Gelb", mit dem
   Argument, der Buntton-Anteil der Vorlage liege bei rund 1 %. Seit dem
   08.08.2026 stimmt der Satz nicht mehr: die Boost-Kachel traegt
   denselben Ton, weil Boost und Tag innerhalb der Gelbfamilie getauscht
   haben.

   ANGESEHEN, WEIL DIE FRAGE GENAU DAS WAR: geht der Knopf daneben
   unter? Er geht nicht unter, und es sind drei Dinge, die ihn tragen —
   keins davon ist die Farbe. Er steht allein auf einer grossen grauen
   Flaeche, waehrend die Kachel auf Weiss steht; er ist eine Pille von
   210 x 46 gegen eine Kachel von 420 x 230; und er traegt ein Verb,
   waehrend auf der Kachel eine Zahl steht.

   WAS TROTZDEM GILT: Gelb sagt auf dieser Seite jetzt zweierlei — „tu
   das" am Knopf und „Boost-Budget" an der Kachel. Das ist eine
   Entscheidung des Auftraggebers vom 08.08.2026 und keine Nachlaessigkeit;
   es steht hier, damit es beim naechsten Mal nicht als eine gelesen wird. */
.knopf--gelb {
  background: var(--farbe-akzent-gelb);
  color: var(--farbe-text);
  border-color: transparent;
}

.knopf--gelb:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-akzent-gelb-linie);
}

/* DIE KACHELREIHE. [gemessen] eine Spalte mit 10 px Luecke bei
   390 px, zwei Spalten mit 20 px ab dem Umbruch. `minmax(0, 1fr)`
   und nicht `1fr`: ein Rasterkind ist von sich aus `min-width: auto`
   und kann nicht unter seinen Inhalt schrumpfen — „65 von 200 €"
   spraengte sonst die Spur. */
.bento__raster {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 10px;
  grid-template-columns: minmax(0, 1fr);
}

/* Das Rasterkind muss sich strecken, sonst sind zwei Kacheln
   nebeneinander verschieden hoch, sobald eine Zeile mehr umbricht. */
.bento__raster > li { display: grid; min-width: 0; }

/* DIE KACHEL. [gemessen] Radius 40 px; Polster 50 · 50/60/50/50 ·
   80/70/60; Innenluecke 20 px; `justify-content: flex-end`, der
   Inhalt sitzt also am unteren Rand.

   SIE IST EIN `<a>` UND KEIN KASTEN MIT VERWEIS DARIN. In der
   Vorlage traegt das `<a>` selbst die Flaeche; der Weg-Text darin ist
   ein `<span>` und kein zweiter Verweis. Damit ist die ganze Kachel
   das Ziel — bei 650 px Breite ist das der Unterschied zwischen einer
   Trefferflaeche von 650 x 425 und einer von 142 x 24. */
.bentokachel {
  /* ===================================================================
     DIE KACHEL IST IHR EIGENER BEHAELTER — 11.08.2026, gemessen
     ===================================================================

     Der Steller des Monatslimits (`.zahlenfeld`) bricht bei schmalem
     Platz um: die Zahl in die erste Reihe, Minus und Plus darunter. Die
     Abfrage dafuer hing an `huelle`, also an der FENSTERBREITE — und die
     sagt seit dem Neubau von `/ziele` nichts mehr darueber aus, wie breit
     der Steller stehen darf: er sitzt jetzt in einer Bento-Kachel, und
     die ist bei 1440 px halb so breit wie die Karte, in der er vorher
     stand.

     Gemessen bei 1440 px: der Steller brauchte 346 px in einer Kachel,
     die ihm 311 gab — 35 px ueber die Kante, ohne Querlauf am Dokument
     und deshalb von keiner Zahl gemeldet. Bei 1920 passte er, bei 390
     griff die alte Abfrage. Genau die Breite dazwischen war offen.

     Ein benannter Behaelter und keine zweite Fensterzahl: die Kachel
     weiss selbst, wie breit sie ist, und muss es niemandem sagen. */
  container: kachel / inline-size;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  gap: 20px;
  min-width: 0;
  padding: 50px;
  border-radius: 40px;
  color: var(--farbe-text);
  text-decoration: none;
}

/* ===================================================================
   JEDE KACHEL TRAEGT DIE FARBE IHRES OBJEKTS — 06.08.2026
   ===================================================================

   HIER STANDEN ZWEI FUELLUNGEN, eine kraeftige und eine blasse, beide
   violett, im Wechsel nach der POSITION der Kachel. Der Befund des
   Auftraggebers, zweimal: „zu viel Violett und zu wenig Blau" und
   „die Farbe soll etwas bedeuten, statt zu dekorieren". Beides trifft
   dasselbe — eine Farbe, die von der Position abhaengt, sagt ueber die
   Kachel nichts aus. Dieselbe Kachel bekam eine andere Farbe, sobald
   eine davor fehlte.

   DIE SIEBEN OBJEKTFARBEN stehen in tokens.css bei
   `--farbe-objekt-nachricht`, samt Herleitung, gemessenen Abstaenden
   und der Regel, welche Schrift welche Fuellung traegt.

   MIT DEM VIOLETT-VOLLTON FAELLT AUCH DER SATZ, DER IHN BEGRUENDETE:
   „Tinte auf beiden, nie Weiss — auf Jitters ganzer Seite steht auf
   keinem Vollton weisse Schrift." Das ist gemessen richtig fuer seine
   STARTSEITE und gemessen falsch fuer seine KUNDENSEITE, wo dunkle
   Kacheln weisse Schrift tragen. Aufgeloest am 06.08.2026: dunkle
   Fuellungen tragen Weiss, helle tragen Tinte. Die Schriftfarbe steht
   deshalb am Token und nicht hier. */
.bentokachel--nachricht {
  background: var(--farbe-objekt-nachricht);
  color: var(--farbe-objekt-nachricht-schrift);
}
.bentokachel--kanal {
  background: var(--farbe-objekt-kanal);
  color: var(--farbe-objekt-kanal-schrift);
}
.bentokachel--beitrag {
  background: var(--farbe-objekt-beitrag);
  color: var(--farbe-objekt-beitrag-schrift);
}
.bentokachel--quartalsziel {
  background: var(--farbe-objekt-quartalsziel);
  color: var(--farbe-objekt-quartalsziel-schrift);
}
.bentokachel--media-day {
  background: var(--farbe-objekt-media-day);
  color: var(--farbe-objekt-media-day-schrift);
}
.bentokachel--boost {
  background: var(--farbe-objekt-boost);
  color: var(--farbe-objekt-boost-schrift);
}
.bentokachel--tag {
  background: var(--farbe-objekt-tag);
  color: var(--farbe-objekt-tag-schrift);
}

.bentokachel:is(:hover, .zeige-ueberfahren) {
  box-shadow: var(--schatten-2);
}

.bentokachel:is(:active, .zeige-aktiv) {
  transform: translateY(1px);
  box-shadow: none;
}

/* DER CHIP. [gemessen] Radius 40, Polster 6/21 (5/20 bei 1440),
   18-20 px / 600, Laufweite -0.02em. Seine Fuellung ist in der
   Vorlage die JEWEILS ANDERE der beiden Kachelfarben: auf der
   kraeftigen Kachel weiss, auf der blassen violett. Das ist der
   Grund, warum die zwei Kacheln nebeneinander nicht wie zwei
   Zustaende derselben Sache aussehen. */
.bentokachel__chip {
  align-self: flex-start;
  padding: 6px 21px;
  border-radius: 40px;
  font-size: 18px;
  /* [gemessen] 24 px, und deshalb als feste Zahl: die geerbte
     Zeilenhoehe des Fliesstextes machte den Chip 44 px hoch statt 36.
     Eine Pille um eine Zeile hat keine zweite Zeile, die einen
     Durchschuss braucht. */
  line-height: 24px;
  font-weight: var(--schrift-halbfett);
  letter-spacing: -0.02em;
}

/* DER CHIP TRAEGT TINTE, auch auf einer dunklen Kachel: seine Fuellung
   ist hell, und die Schrift der Kachel wuerde sonst durchvererbt —
   weisse Schrift auf einem weissen Chip. */
.bentokachel__chip {
  color: var(--farbe-text);
}

.bentokachel--kanal        .bentokachel__chip { background: var(--farbe-objekt-kanal-chip); }
.bentokachel--beitrag      .bentokachel__chip { background: var(--farbe-objekt-beitrag-chip); }
.bentokachel--quartalsziel .bentokachel__chip { background: var(--farbe-objekt-quartalsziel-chip); }
.bentokachel--media-day    .bentokachel__chip { background: var(--farbe-objekt-media-day-chip); }

/* NACHRICHT IST DER ZWEITE CHIP, DER NICHT TINTE TRAEGT — 11.08.2026.
   Seine Kachel ist das helle Blau, sein Chip das tiefe; Tinte darauf haelt
   1,66:1, Weiss 12,74:1. Dieselbe Bauart wie bei Boost, und aus demselben
   Grund: die Fuellung ist das andere Ende der eigenen Familie, und dieses
   Ende ist dunkel. Zwei Zeilen und nicht eine, weil beides zusammengehoert. */
.bentokachel--nachricht .bentokachel__chip {
  background: var(--farbe-objekt-nachricht-chip);
  color: var(--farbe-objekt-nachricht-chip-schrift);
}

/* BOOST IST DIE AUSNAHME, seit seine Kachel am 08.08.2026 das leuchtende
   Gelb traegt: sein Chip ist das dunkle Ende derselben Familie, und
   Tinte haelt darauf 2,98:1. Weiss haelt 5,97:1. Die Herleitung steht in
   tokens.css bei `--farbe-objekt-beitrag-chip`.

   ZWEI ZEILEN UND NICHT EINE, weil beides zusammengehoert: wer die
   Fuellung aendert, sieht die Schrift daneben stehen. */
.bentokachel--boost .bentokachel__chip {
  background: var(--farbe-objekt-boost-chip);
  color: var(--farbe-objekt-boost-chip-schrift);
}

/* [gemessen] 30 px / 750 bei 390, 36 / 800 bei 1100 und 1440, 60 /
   800 ab 1441 — Zeilenhoehe durchgehend 1,0, Laufweite -0.04em.
   `tabular-nums`, weil hier fast immer eine Zahl steht und Ziffern
   sonst verschieden breit sind. */
.bentokachel__titel {
  font-size: 30px;
  font-weight: 800;
  line-height: 1;
  letter-spacing: -0.04em;
  font-variant-numeric: tabular-nums;
  overflow-wrap: anywhere;
}

/* DIE VIERTE ZEILE, und es gibt sie fuer genau einen Fall: Regel 07
   verlangt beim Media Day das Datum zuerst und die Uebersetzung in
   Tage darunter. Ohne sie muesste eine der beiden Angaben fallen.
   Sie steht dicht unter dem Titel und nicht in der Innenluecke von
   20 px — sie gehoert zu ihm und nicht neben ihn. */
.bentokachel__zusatz {
  margin-top: -12px;
  font-size: 17px;
  font-weight: var(--schrift-halbfett);
  letter-spacing: -0.02em;
}

/* DIE WERKSTATT ZEIGT FUENF ZUSATZZEILEN OHNE TITEL DAZWISCHEN — 14.08.2026,
   gefunden beim Abarbeiten der 69 vorbestehenden roten Messungen. Die -12px
   oben ziehen die Zeile an einen Titel heran, der hier nicht steht: jede
   Zeile zog sich stattdessen 12 px in die vorherige, Text auf Text.
   Kein anderer Ort im Bestand stapelt zwei `.bentokachel__zusatz`
   unmittelbar hintereinander — die Kachel hat immer genau eine, direkt
   unter ihrem Titel. Diese Regel trifft deshalb nur die Werkstatt-Vorfuehrung
   „Die Tagesübersetzung · fünf Fälle", deren eigener Zweck es ist, die fünf
   Fälle auseinanderzuhalten — sie brauchen einen Abstand, keinen von null. */
.bentokachel__zusatz + .bentokachel__zusatz {
  margin-top: var(--abstand-2);
}

/* [gemessen] 17 px / 600 / Laufweite -0.02em, ohne Unterstreichung,
   mit einem Pfeil dahinter. */
.bentokachel__weg {
  display: flex;
  align-items: center;
  gap: var(--abstand-2);
  font-size: 17px;
  /* [gemessen] 24 px — dieselbe Ueberlegung wie am Chip. */
  line-height: 24px;
  font-weight: var(--schrift-halbfett);
  letter-spacing: -0.02em;
}

/* KEIN EIGENES SYMBOL FUER DEN PFEIL NACH RECHTS. Der Satz kennt
   `pfeil-links`; um 180 Grad gedreht ist das derselbe Strich mit
   derselben Staerke. Ein zweites erzeugtes Symbol waere eine zweite
   Quelle fuer dieselbe Form. */
.bentokachel__pfeil {
  flex: none;
  transform: rotate(180deg);
}

.bentokachel:is(:hover, .zeige-ueberfahren) .bentokachel__pfeil {
  transform: rotate(180deg) translateX(-4px);
}

/* DIE KACHELN TRETEN GESTAFFELT EIN — dasselbe Muster wie vorher,
   kein zweites Keyframe. Regel 12: 40 ms Versatz. Den Versatz traegt
   die Kachel als `--staffel` im Markup, weil ihre Zahl vom Datensatz
   abhaengt und `nth-child` das nicht weiss. Der globale
   `prefers-reduced-motion`-Block erfasst es. */
.bento .bentokachel {
  animation: tritt-ein var(--dauer-mittel) var(--kurve) backwards;
  animation-delay: calc(var(--staffel, 0) * var(--staffel-versatz));
  transition:
    box-shadow var(--dauer-schnell) var(--kurve),
    transform var(--dauer-schnell) var(--kurve);
}

/* DER UMBRUCH — dieselbe Marke wie im Rest der Huelle (45rem), damit
   es nicht zwei Stellen gibt, an denen sich die Seite umbaut. */
@container huelle (min-width: 45rem) {
  .rahmen { --bento-luecke: 20px; }

  .bento__flaeche { padding: 80px 86px 100px; }

  .bento__titel { font-size: 48px; line-height: 0.85; }

  .bento__raster {
    gap: 20px;
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  /* ===================================================================
     EINE REGEL FUER JEDE UNGERADE ZAHL, NICHT JE EINE FUER 1 UND 3 —
     14.08.2026, zum zweiten Mal gefunden und diesmal allgemein geloest
     ===================================================================

     HIER STANDEN ZWEI EINZELREGELN: `[data-kacheln="1"]` (eine Spalte)
     und `[data-kacheln="3"] > li:last-child` (letzte Kachel spannt
     beide). Als die Rueckblick-Kachel am 13.08.2026 eine fuenfte moeglich
     machte, griff keine von beiden — die fuenfte stand allein in der
     letzten Reihe, rechts eine leere Zelle. Zwei Sonderfaelle fuer zwei
     Zahlen brechen beim naechsten Zuwachs wieder, und genau das ist
     jetzt zweimal passiert.

     `:last-child:nth-child(odd)` TRIFFT GENAU DANN, WENN DIE GESAMTZAHL
     UNGERADE IST — die Position des letzten Kindes IST die Gesamtzahl.
     Bei 1 spannt die einzige Kachel beide Spuren (dasselbe Bild wie die
     fruehere Ein-Spalten-Regel, nur ueber die zweite Spur statt ueber
     eine eigene Gitterspalte). Bei 3, 5, 7 … dasselbe: die letzte
     Kachel schliesst die Reihe, keine Ecke bleibt leer. Bei geraden
     Zahlen trifft die Regel nicht — dort fuellen die Kacheln die
     Reihen paarweise von selbst.

     EINE BREITE KACHEL IST BEI JITTER OHNEHIN DIE REGEL, NICHT DIE
     AUSNAHME — dieselbe Form muss also nicht mehr eigens begruendet
     werden, sie gilt jetzt fuer jede Kachelzahl gleich. `data-kacheln`
     bleibt am Markup stehen (siehe `bentoraster()` in `bento.ts`), auch
     wenn diese Regel es nicht mehr braucht: die Proben lesen es weiter,
     um die Kachelzahl zu pruefen. */
  .bento__raster > li:last-child:nth-child(odd) {
    grid-column: span 2;
  }

  .bentokachel { padding: 50px 60px 50px 50px; }

  .bentokachel__chip { padding: 5px 20px; font-size: 20px; }

  .bentokachel__titel { font-size: 36px; }
}

/* [gemessen] Jitter schaltet die grossen Grade erst oberhalb von
   1440 px — bei 1100 und bei 1440 stehen dieselben Werte. Dieselbe
   Marke benutzt die Huelle schon fuer den Seitentitel. */
@container huelle (min-width: 1441px) {
  .rahmen { --bento-luecke: 40px; }

  .bento__flaeche { padding: 100px 130px 120px; }

  .bento__titel { font-size: 72px; }

  .bentokachel { padding: 80px 70px 60px; }

  .bentokachel__chip { padding: 6px 21px; }

  .bentokachel__titel { font-size: 60px; }
}

/* HIER STANDEN `.zahlraster` UND `.zahlkachel` — 06.08.2026 frueh
   gebaut, 06.08.2026 spaet ersetzt. Sie waren graue Kaertchen mit
   Wort, Zahl und Einheit, und ihre Herleitung nannte neben Jitter
   auch Mobbin-Dashboards. Genau das ist die Ansage dieser Runde:
   „Keine anderen Vorlagen. Wer ihre Anordnung uebernimmt, bekommt
   ein generisches Dashboard."

   IHRE AUFGABE HAT `.bentokachel` UEBERNOMMEN, weiter oben. Der
   Unterschied ist nicht die Farbe, sondern die Groesse: die
   Kennzahl-Kachel war 440 x 130 px, die Bento-Kachel ist
   650 x 425 — und erst in dieser Groesse ist eine Kachel eine
   Flaeche und keine Karte.

   `--staffel` bleibt, das Muster auch; die Regel dazu steht jetzt
   bei `.bento .bentokachel`. */

.tafel__karten {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: var(--abstand-3);
}

/* Navans Grundform: kleine Ueberschrift, eine Zahl, sonst
   nichts. Die Ueberschrift steht OBEN und klein, die Zahl
   darunter und gross - wer ueberfliegt, sucht die Zahl und
   findet sie schneller, wenn immer dieselbe Stelle sie traegt. */
/* Der Eintrag ist das Rasterfeld, die Karte fuellt es aus. Getrennt,
   weil die Karte je nach Ziel ein <a> oder ein <div> ist und beide
   im Raster gleich sitzen muessen. */


.tafelkarte {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: var(--abstand-2);
  /* 16 px am Handy: dort ist die Kachel eine breite Karte über die volle
     Spalte — der Buffer-Fall, 1,6 % der Kachelbreite. Am Laptop ist sie ein
     Drittel breit, und 16 px sind dort nur 4,3 % gegen Hootsuites 8,6 % und
     Sprouts 6,6 %. Siehe die Regel darunter. */
  padding: var(--abstand-4);
  border: var(--randbreite) solid var(--farbe-rand);
  border-radius: var(--radius-gross);
  background: var(--farbe-flaeche);
  color: inherit;
  text-decoration: none;
  /* ERGÄNZT AM 02.08.2026. `:hover` wechselt Rand UND Schatten, `:active`
     zusätzlich die Lage — und keine der drei Eigenschaften stand in einer
     Übergangsliste. Der Wechsel schaltete hart. Einzeln genannt, nicht
     `all`: `all` überträgt auch, was niemand gemeint hat. */
  transition:
    border-color var(--dauer-schnell) var(--kurve),
    box-shadow var(--dauer-schnell) var(--kurve),
    transform var(--dauer-schnell) var(--kurve);
}

/* AB HIER IST DIE KACHEL EIN DRITTEL BREIT, und 16 px Innenabstand sind dann
   4,3 % ihrer Breite — halb so viel wie bei Hootsuite (8,6 %). 24 px ergeben
   6,5 % und liegen damit 1,5 % unter Sprout. Gemessene Folge: der Textstapel
   nimmt 70,4 % der Kachelhöhe statt 83,8 %, Referenzband Later 59 % bis
   Hootsuite 68 %. */
@container (min-width: 34rem) {
  .tafelkarte {
    padding: var(--abstand-5);
  }
}

/* KLICKBAR NUR, WO ES EIN ZIEL GIBT. Eine Karte ohne Ziel bleibt ein
   <div> und bekommt diese Klasse gar nicht — sie kann also nicht
   klickbar aussehen und nichts tun.

   Ueberfahren traegt Tiefe UND Rand, nicht nur Farbe; Gedrueckt gibt
   nach. Dieselbe Hausregel wie beim Knopf und beim Listeneintrag. */
.tafelkarte--klickbar {
  cursor: pointer;
}

.tafelkarte--klickbar:is(:hover, .zeige-ueberfahren) {
  border-color: var(--farbe-primaer);
  box-shadow: var(--schatten-2);
}

.tafelkarte--klickbar:is(:active, .zeige-aktiv) {
  transform: translateY(1px);
  box-shadow: none;
}

.tafelkarte__titel {
  margin: 0;
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text-gedaempft);
  overflow-wrap: anywhere;
  /* KEINE SILBENTRENNUNG IN EINER AUFSCHRIFT.
     Im Bild gefunden, in keiner Zahl: bei 390 px stand auf der Karte
     „Boost-Budget die-sen Monat". Die Trennung ist sprachlich richtig
     — `hyphens: auto` gilt seit Zeile 100 fuer die ganze Seite — und
     an einer Aufschrift trotzdem falsch. Sie ist kein Fliesstext,
     sondern ein Etikett aus zwei, drei Woertern; getrennt sieht sie
     aus wie ein Fehler. Umbrechen darf sie weiter, aber am
     Leerzeichen. `overflow-wrap: anywhere` bleibt als letzte
     Rueckfallebene fuer ein einzelnes ueberlanges Wort. */
  hyphens: manual;
}

/* ============================================================
   DIE FÜNF WERTZEILEN SPRECHEN GLEICH LAUT — 02.08.2026
   ============================================================

   Hier standen vier Größen und drei Gewichte auf fünf Kacheln:
   20/600 · 22/700 · 30/800 (zweimal) · 72/800. Spanne 3,60fach.

   Drei von vier Referenzen setzen ALLE Kennzahlen einer Übersicht auf
   genau eine Größe — Later 10 bis 10,5 px auf acht Kacheln, Hootsuite
   12 px auf sechs, Sprout 10 px auf drei. Spanne 1,00fach. Wer eine
   Zahl größer setzt als die daneben, sagt: diese ist wichtiger. Auf
   einer Übersicht ist keine wichtiger.

   Alle vier tragen jetzt `--groesse-h3` und `--schrift-schwer`,
   Zeilenhöhe 1,1. Das Verhältnis Wert zu Aufschrift fällt damit von
   4,80 auf 24/15 = 1,60 — mitten ins Referenzband 1,67 bis 1,75
   (Later 1,75 · Hootsuite 1,71 · Sprout 1,67).

   DIE 72 PX BLEIBEN AUF DER BEITRAGSSEITE. `UEBERGABE.md`, Abschnitt 9,
   verbietet ausdrücklich, die Bewertungszahl abzuschwächen — und meint
   dort die Beitragsseite, wo sie allein steht und die auffälligste
   Stelle ist. Auf der Tafel steht sie neben vier gleichrangigen
   Auskünften. `--groesse-riesig` hat auf dieser Seite danach null
   Vorkommen; auf `/inhalte?beitrag=…` ist sie unangetastet.
   ============================================================ */
/* ===================================================================
   DIE ZWEI GRAFIKEN DER UEBERSICHT — 03.08.2026
   ===================================================================

   Angesagt: „da sollen mehr Grafiken sein … wirklich was, das extrem
   einfach zu verstehen ist, das den Nutzer positiv motiviert."

   BEIDE ZEIGEN NUR, WAS OHNEHIN DASTEHT. Das Kalenderblatt wiederholt
   das Datum, der Ring die Bewertung — deshalb tragen beide `aria-hidden`
   und daneben steht die Zahl als Text. Eine Grafik, die etwas sagt, was
   sonst nirgends steht, waere fuer jeden unlesbar, der sie nicht sieht.

   WAS HIER NICHT STEHT UND WARUM: ein Verlauf ueber Wochen. Dafuer
   braeuchte es Zeitreihen, und der Bestand hat keine — weder Reichweite
   noch Likes noch Verlaufswerte, nur den jeweils aktuellen Stand. Ein
   gezeichneter Verlauf waere eine Behauptung ueber Wochen, die niemand
   gemessen hat. Gemeldet, nicht heimlich weggelassen. */

/* Das Kalenderblatt. Monat oben in der Primaerfarbe, Tag gross darunter
   — die Anmutung, die jeder von einem Abreisskalender kennt, damit man
   das Datum als Datum erkennt, bevor man es liest. */


/* Blatt links, Datum und Tage rechts daneben. */








/* ---------------------------------------------------------------- */

/* Der Beitragsspiegel: der Beitrag selbst neben seiner Bewertung.
   Gespiegelt wird sein TEXT — Bilddateien gibt es im Bestand nicht, und
   ein Platzhalter waere eine Behauptung darueber, wie er aussieht. */
/* ZAHL OBEN, TEXT DARUNTER — geaendert nach dem ersten Bild. Nebeneinander
   blieben dem Beitragstext in der schmalen Kachel rund 200 px, waehrend
   unter der Zahl die halbe Karte leer stand. Untereinander bekommt der
   Text die volle Breite und die Karte ihre Hoehe zurueck. */




/* DER RING STAND HIER und ist am 03.08.2026 vor dem ersten Bild wieder
   gefallen. Die Bauregel „kein Ring und kein Kegelverlauf" wird von
   `tafel.test.ts` bewacht, und sie hat angeschlagen, bevor irgendwer den
   Ring zu sehen bekam — genau dafuer steht sie da.

   Was die Bewertung jetzt zeigt, ist der Balken aus Bereich 09: derselbe
   Baustein wie beim Quartalsziel und beim Budget, also eine Form weniger,
   die jemand lernen muss. */


.tafelkarte__zahl {
  margin: 0;
  font-size: var(--groesse-h3);
  font-weight: var(--schrift-halbfett);
  line-height: 1.1;
  color: var(--farbe-text);
  font-variant-numeric: tabular-nums;
}

/* DER EINE ROTE ZAEHLER. Regel 16: "Nur ungelesene Nachrichten
   bekommen einen." Farbe traegt ihn nicht allein - darunter
   steht, worauf sie warten. */
.tafelkarte__zahl--zaehler {
  color: var(--farbe-zaehler);
}

/* Das Datum ZUERST und groesser als die Uebersetzung darunter -
   Regel 07, und Alma zeigt genau das. Kleiner als die reine
   Zahl, weil ein Datum aus Woertern besteht und sonst umbricht. */
.tafelkarte__datum {
  margin: 0;
  font-size: var(--groesse-h3);
  font-weight: var(--schrift-halbfett);
  line-height: 1.1;
  color: var(--farbe-text);
  overflow-wrap: anywhere;
}

.tafelkarte__satz {
  margin: 0;
  font-size: var(--groesse-h3);
  font-weight: var(--schrift-halbfett);
  line-height: 1.1;
  color: var(--farbe-text);
  overflow-wrap: anywhere;
}



/* Cleos Form: Ist und Soll in EINER Zeile, Balken darunter,
   ohne Prozent. Der Trenner ist ein Schraegstrich und
   aria-hidden - ein Vorleseprogramm liest sonst "sieben Schraeg
   drei". */
/* NORMALER TEXTFLUSS, KEIN FLEX — und das ist der Kern der Sache.
   Als Flex-Behaelter brach das Paar zwischen seinen Kaestchen, und
   uebrig blieb bei 390 px eine Zeile „7 /" mit haengendem
   Schraegstrich. Dagegen half kein geschuetztes Leerzeichen: zwischen
   Flex-Kindern wird umgebrochen, egal welches Zeichen dazwischen
   steht — der Umbruch richtet sich dort nach den Kaestchen, nicht
   nach dem Text.

   Im Textfluss entscheiden die Zeichen, und die stehen in `tafel.ts`:
   geschuetzt um den Schraegstrich, davor und dahinter also nie ein
   Umbruch; vor einer Einheit, die ein WORT ist, ein normales
   Leerzeichen. Bleibt genau eine Bruchstelle, und der Rest liest sich.

   Die Grundlinie richtet sich damit von selbst aus — dafuer war
   `align-items: baseline` da. Den Abstand tragen jetzt die
   Leerzeichen selbst statt `gap`. */
/* DIE ZEILE MUSS DEN SCHRIFTKASTEN FASSEN — nachgerechnet am
   01.08.2026, und es ist derselbe Fund wie an `em.wizard__zahl` in
   Runde 20.

   Inters Schriftkasten ist rund 1,211 em hoch (Oberlaenge 0,969 +
   Unterlaenge 0,242). `line-height: 1` an `.tafelkarte__ist` machte
   die ZEILE 30 px hoch, waehrend der Kasten 36,3 px misst — die 6,3
   px darueber malen in die Nachbarzeile hinein. Solange das Paar auf
   EINER Zeile stand, war das unsichtbar; sobald es umbrach, lagen
   Trenner und Sollwert 29 px ineinander.

   Aufgefallen ist es an der Groessenleiter: `--groesse-h3` ist von 22
   auf 24 px gegangen (Q2.1), bei +15 % also von 25,3 auf 27,6 — und
   damit brach das Paar bei 390 px eine Stufe frueher um. Die Ursache
   lag aber schon vorher da.

   `1.21` steht am PAAR, nicht an seinen Teilen: als Verhaeltnis
   rechnet jeder Teil es gegen seine eigene Groesse, und damit ist
   jede Leitzeile genau so hoch wie ihr Kasten — bei 30, bei 24 und
   bei 20 px. Ein Wert statt dreier. */
.tafelkarte__paar {
  margin: 0;
  line-height: 1.21;
}

.tafelkarte__ist {
  font-size: var(--groesse-h3);
  font-weight: var(--schrift-halbfett);
  color: var(--farbe-text);
  font-variant-numeric: tabular-nums;
}

/* EINE STUFE UNTER DEM IST-WERT. Hier stand `--groesse-h3` — dieselbe Größe
   wie das Ist davor, aber eine Stufe ÜBER dem Soll dahinter (20 px). Der
   Schrägstrich war damit größer als das, was er trennt; 10 % Unterschied in
   einer Zeile trägt keine Ordnung, sondern sieht nach Versehen aus. */
.tafelkarte__trenner {
  font-size: var(--groesse-gross);
  color: var(--farbe-text-leise);
}

.tafelkarte__soll {
  font-size: var(--groesse-gross);
  color: var(--farbe-text-gedaempft);
  font-variant-numeric: tabular-nums;
  /* HIER STAND `white-space: nowrap` — es hat den Umbruch der ganzen
     Zeile verboten, um eine einzige Stelle zu schuetzen. Das ist zu
     grob: „3 Bewerbungen" DARF umbrechen, „200 €" nicht. Beides regelt
     jetzt das Zeichen zwischen Zahl und Einheit, gesetzt in `tafel.ts`
     — geschuetzt bei einem Zeichen, normal bei einem Wort. Genau der
     Gedanke, der an `wertZeigen` schon steht: an der einen Stelle, an
     die er gehoert, statt an der ganzen Zeile. */
}

/* DER BALKEN ZEIGT HIER NUR SEINE BAHN UND SEINE MARKE.
   Gefunden im Bild, in keiner Zahl: darueber stand "7 / 3
   Bewerbungen" und direkt darunter noch einmal "Fortschritt
   7 von 3 Bewerbungen" - dieselbe Angabe zweimal, gestapelt.

   Der Baustein bringt seinen Kopf mit, weil er auf der Seite
   Ziele ALLEIN steht und ihn dort braucht. Auf der Tafel traegt
   ihn die grosse Zeile schon, und der Kartentitel sagt, worum es
   geht.

   FUER VORLESEPROGRAMME GEHT NICHTS VERLOREN: die Bahn traegt
   role="progressbar" mit aria-valuetext="7 von 3 Bewerbungen".
   Weggenommen wird die doppelte Schrift, nicht die Auskunft. */
.tafel .balken__kopf {
  display: none;
}

/* DIE BEWERTUNGSZAHL TRAEGT KEINE EIGENE FLAECHE MEHR — 01.08.2026,
   im Bild gefunden.

   Hier stand ein gefuellter violetter Block mit weisser Schrift, mit
   der Begruendung: "sie bleibt die auffaelligste Stelle (Abschnitt
   9), auf der Tafel steht sie neben vier anderen Zahlen, also traegt
   sie ihre Flaeche mit."

   Die Begruendung stimmte, solange die Karten gleich aussahen. Seit
   jede einen Zeichenkreis in ihrem Ton hat, traegt die
   Aufmerksamkeit jede Kachel selbst — und der violette Block ist
   der EINZIGE harte Fleck auf der Seite und erschlaegt die anderen
   vier. Genau diese Ueberlegung stand schon einmal da, im geloeschten
   Kopf-Entwurf, wo die Zahl aus demselben Grund transparent war.

   Die Zahl bleibt gross (--groesse-riesig) und in --farbe-text wie
   jede andere. Sie traegt sich selbst; sie ist die groesste Ziffer
   auf dem Bildschirm. */

/* --- Entwurf 1: eigene Seite -------------------------------- */

.tafel--seite {
  padding: var(--abstand-4) 0 0;
}

@container (min-width: 34rem) {
  .tafel--seite .tafel__karten {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* DREI SPALTEN SIND MIT DER FUENFTEN KARTE GEFALLEN — 04.08.2026.
   Die obere Reihe trug drei Kacheln (ungelesene Nachrichten, bester
   Beitrag, Media Day). Seit die ungelesenen Nachrichten als
   Vollton-Kachel darueber stehen, sind es zwei — und zwei Karten in
   einem Dreierraster lassen rechts eine leere Spalte stehen.

   GENAU DIESEN FEHLER HAT DIESE STELLE SCHON EINMAL GEHABT, und der
   Vermerk weiter unten beschreibt ihn: „gemessen dieselben 370,7 px je
   Karte wie oben, rechts 383 px offen, eine leere Zelle von 72.694 px²."
   Damals kam er aus einer Spezifitaetskollision, diesmal aus einer
   Karte weniger — dieselbe leere Ecke.

   Die Regel faellt ersatzlos: beide Reihen haben jetzt zwei Karten und
   nehmen die Zweierregel von 34rem. Eine eigene Regel fuer 56rem, die
   dasselbe sagt wie die darueber, waere eine Zeile zum Verwechseln. */

/* HIER STAND `grid-row: span 2` AUF DER ERSTEN KARTE, mit der
   Begruendung "die meistgesuchte Zahl bekommt mehr Platz statt
   groesserer Schrift". Im Bild war es einfach eine leere Flaeche:
   gemessen 378 px Karte auf 112 px Inhalt — zwei Drittel nichts.

   Verzierung ohne Funktion. Im Zweifel weglassen. Alle fuenf
   Karten sind jetzt gleich gross, und die Zahl traegt sich
   selbst. */

/* --- Der zweite Entwurf ist weg — 01.08.2026 ------------------

   Hier standen 235 Zeilen `.tafel--kopf`: die Tafel als flacher
   Kopfbereich ueber dem Posteingang, mit eigener Rasterregel,
   kleineren Zahlen und einem Umschalter nach Breite. Sie war der
   Vergleichsfall, an dem sich die Entscheidung vom 31.07.2026
   ablesen liess.

   Ein Vergleichsfall, den nichts mehr rendert, ist aber kein
   Beleg — er ist Code, den keine Messung mehr anfaesst und den
   der Naechste fuer gueltig haelt. Die Begruendung steht in
   tafel.ts und in ABDECKUNG.md, wo sie hingehoert; der Bau ist
   in der Versionsgeschichte, wenn ihn jemand sucht.

   --- Die Uebersicht ist eine Seite ---------------------------

   AUF DER ÜBERSICHT IST DIE TAFEL DIE SEITE — und braucht deshalb
   ihren eigenen Bildlauf. `.inhalt` steht auf `overflow: hidden`;
   jede Seite darin bringt ihren Bildlauf selbst mit. Gefunden von
   der Huellenwache, nachdem die Inhaltskarte oben und unten 10
   bzw. 12 px Rand bekam: bei +15 % Schrift ragten die Karten
   66 px heraus. */
.inhalt > .tafel {
  /* `0 1 auto` STATT `1 1 auto` — geändert am 02.08.2026.
     Mit `1` streckte sich die Tafel bei 1440 px auf die volle Kartenhöhe von
     629,5 px, während ihr Inhalt nach 500,0 px endet: 129,5 px Bildlaufweg,
     hinter dem nichts liegt. Der Meister scrollt und es passiert nichts —
     die schlechteste Art von Rückmeldung. Jetzt ist sie so hoch wie ihr
     Inhalt, der Rest ist Polster der Seitenkarte.
     Bei 390 px ändert sich nichts: dort ist der Inhalt größer als der Platz,
     und `min-height: 0` lässt sie schrumpfen. */
  flex: 0 1 auto;
  min-height: 0;
  /* Eigener Bildlauf gefallen — Baustelle 0.1. Der Fund von oben faellt
     damit von selbst: es gibt keinen Bildlaufweg mehr, hinter dem
     nichts liegt, weil es keinen eigenen Bildlauf mehr gibt. */
}

/* DER BETRIEBSNAME BRAUCHT HIER KEINE REGEL.

   Angesagt am 01.08.2026: „den namen weg und den namen nur auf die
   uebersichts seite bitte wie im platform repo". Zuerst stand hier
   eine eigene Klasse `.tafel__betrieb` mit eigener Groesse — und
   damit standen ZWEI Ueberschriften erster Ordnung auf der Seite,
   „Übersicht" von der Huelle und der Name von der Tafel. Kein Bild
   zeigt das, kein Mass meldet es: die zweite sieht aus wie ein
   Untertitel. Ein Vorleseprogramm liest beide als Seitentitel vor.

   Jetzt reicht die Seite den Namen an die Huelle durch, und er
   steht im einen `<h1 class="inhalt__titel">`, das jede Seite hat.
   Eine Regel weniger, ein Element weniger, und die Groesse ist
   ueberall dieselbe. */

/* DER ABSCHNITTSKOPF STAND HIER und ist am 03.08.2026 gefallen —
   angesagt: „diese Mini-Headlines mit dem Strich daneben alle weg."

   Er war 1:1 aus dem Portal uebernommen (`.eb-row-head`: 2 px Strich,
   15 px hoch, danach ein Wort in Grossbuchstaben) und galt dort als der
   Grund, warum das Dashboard einfacher wirkt, obwohl mehr darauf steht.

   Das Argument stimmt fuer eine Tafel mit vielen Kacheln. Bei fuenf
   traegt es nicht: die Kacheln sagen selbst, was sie sind, und eine
   Ueberschrift, die das wiederholt, kostet eine Zeile fuer nichts. */
/* ===================================================================
   DER PASTELLKREIS IST GEFALLEN — Baustelle 0.4, 04.08.2026
   ===================================================================

   Hier stand ein 40-px-Kreis in einem von vier Schmucktoenen, mit dem
   Zeichen in der Vollfarbe darauf. Angesagt: „Der heutige Satz
   (Piktogramm in pastellfarbenem Kreis) kommt auf der Vorlage nicht vor
   und fliegt raus."

   DAS STIMMT, UND DIE HERKUNFT SAGT WARUM: der Kreis war „1:1 aus dem
   Portal" (`platform`, `dashboard.ejs`, `.eb-stat-ico`) — also aus dem
   Vorgaengerprodukt, nicht aus der Vorlage. Nachgemessen in Jitters
   Startseiten-CSS: kein einziger farbig hinterlegter Icon-Kreis. Seine
   Icons stehen blank neben dem Titel (siehe `vorlage/jitter/MESSUNG.md`,
   Vier-Feld-Raster).

   DIE VIER TOENE FALLEN MIT. `--farbe-kachel-blau`, `-gruen`,
   `-bernstein`, `-rosa` und ihre vier `-leise`-Flaechen sind aus
   `tokens.css` gestrichen: acht Werte, die nur diese eine Stelle
   gelesen hat. Was sie trugen, war Schmuck — jede Kachel nennt ihre
   Sache im Wort daneben, und das stand schon im alten Vermerk hier
   („ER TRAEGT NICHTS").

   WAS BLEIBT, ist der funktionale Strich-Satz: schwarz, eine
   Strichstaerke fuer alle 27 Zeichen, keine Flaeche dahinter. Die
   Strichstaerke steht weiter an EINER Stelle in `tokens.css`. */


/* DIE ZWEITE GRUPPE IST ZWEISPALTIG, nicht dreispaltig.

   Zwei Balken auf drei Spalten liessen die dritte leer stehen. Das
   Raster folgt der Zahl der Kacheln und nicht umgekehrt — dieselbe
   Ueberlegung, aus der oben `grid-row: span 2` verschwunden ist.

   ZWEI WÄHLER, WEIL ZWEI SPEZIFITÄTEN — nachgemessen am 02.08.2026.
   Hier stand nur `.tafel__karten--breit` (0-1-0). Ab 56 rem greift aber
   auch `.tafel--seite .tafel__karten` (0-2-0), und die gewinnt: gemessen
   trug die zweite Reihe bei 1440 px dieselben `370.656px 370.672px
   370.656px` wie die erste, und rechts blieben 383 px offen — 33,7 % der
   Reihenbreite, eine leere Zelle von 72.694 px².

   Die Regel unten hat dieselbe Spezifität wie die dreispaltige und steht
   später in der Datei; damit gewinnt sie bei Gleichstand. Zwei Spalten zu
   je 562 px = (1136 − 12) / 2. */
@container (min-width: 34rem) {
  .tafel__karten--breit,
  .tafel--seite .tafel__karten--breit {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* --- Der Verlauf: eine Tabelle, und darueber ein Diagramm -----
   Angesagt am 04.08.2026. Die Auflage steht im Markup und nicht
   hier: das Markup traegt eine TABELLE, kein canvas. Ohne Skript
   liest man die Zahlen, mit Skript sieht man sie.

   DIE TABELLE IST IM RUHEZUSTAND SICHTBAR und wird erst vom
   Skript weggeblendet (`nur-vorlesen`, sie bleibt im Vorlesebaum).
   Andersherum — versteckt im Markup, sichtbar per Skript — waere
   sie ohne Skript weg, und genau das war die Auflage.

   ER STEHT IN BEREICH 18 UND NICHT WEITER OBEN. Der erste Versuch
   legte ihn zwischen die Querschnitte, und die Blockpruefung in
   `huelle.test.ts` hat angeschlagen: "Ein Querschnitt mit genau
   einem Baustein ist eine verlegte Bereichsregel." Sie hatte
   recht — der Verlauf gehoert der Uebersicht, nicht allen. */

/* ===================================================================
   DIE FIGUR IST SELBST DER TRAEGER — 06.08.2026
   ===================================================================

   ANGESAGT: „drei Balken zu je 450 px, ohne Traeger, frei auf Weiss. Es
   sieht aus wie ein Fehler."

   ES WAR EINER. Die Figur stand in `<div class="abschnitt abschnitt--grau">`
   — und `.abschnitt--grau` gibt es hier nicht mehr; ihr Grabstein steht
   weiter oben bei Zeile 553. Eine Klasse ohne Regel faerbt nichts und wirft
   keinen Fehler, deshalb ist es niemandem aufgefallen.

   KEIN NEUER KASTEN UM DIE FIGUR, sondern die Flaeche AN die Figur:
   Baustelle 0.3 verlangt „eine Ebene — entweder graue Sektionsflaeche ODER
   weisse Karte darauf, nie eine graue Flaeche, die nur eine einzelne Karte
   umschliesst". Ein wiederbelebter `.abschnitt--grau` um ein einzelnes
   `<figure>` waere genau das gewesen.

   DIE KOPFZEILE KOMMT AUS DEN DASHBOARD-QUELLEN, und sie ist dort ohne
   Ausnahme dieselbe: Exa („Contents / 42"), X, Revolut Business („Income /
   S$ 10.00"), Clerk („Revenue / $0.00"), Later, Greptile. Erst WAS gezaehlt
   wird, dann die eine Zahl gross, dann die Balken. Wer nur hinsieht, hat
   die Auskunft schon. */
/* SIE IST JETZT EINE BENTO-KACHEL — 06.08.2026, spaeter Umbau.
   ===========================================================
   Die Vorlage kennt zwei Kachelarten im selben Abschnitt, und die
   zweite ist genau diese: `_collaborationCards_` (Jitters Startseite,
   Abschnitte „Design" und „Animate") — eine Flaeche mit Radius 40,
   OBEN das Bild, darunter ein Chip und der Text dazu. Der Verlauf
   ist der einzige Teil dieser Seite, der ein Bild hat; er bekommt
   deshalb diese Form und nicht die der Zahlkacheln.

   MASSE WIE BEI `.bentokachel`, und das ist der Punkt: zwei
   Kachelarten mit zwei Polstern waeren zwei Raster. Radius, Polster
   und Innenluecke stehen hier noch einmal statt als gemeinsame
   Klasse, weil `.verlauf` ein `<figure>` ist und `.bentokachel` ein
   `<a>` — sie teilen die Form, nicht das Verhalten. */
/* ===================================================================
   SIE STEHT AUF WEISS — 06.08.2026, angesagt
   ===================================================================

   „Kein grauer Grund, es steht auf Weiss."

   HIER STAND `--farbe-flaeche-gedaempft`. Das ist keine Anmutungsfrage
   mehr, sondern eine Auflage: die vier Linienfarben sind seit dem
   06.08.2026 GEGEN WEISS gerechnet, und die hellste (Facebook) haelt auf
   dem gedaempften Grund nur 2,71:1 statt der 3:1, die WCAG 1.4.11 fuer
   ein grafisches Objekt verlangt. Auf Weiss sind es 3,06:1. Wer diese
   Kachel je wieder grau macht, reisst die Auflage — die Probe „das
   Diagramm steht auf Weiss" bewacht das und nennt genau diesen Grund.

   SIE BRAUCHT DANN EINE KONTUR. Eine weisse Flaeche auf einer weissen
   Seite hat keine Kante; die 40 px Radius zeigen sich erst, wenn etwas
   sie zeichnet. Der Haarrand ist dieselbe Loesung wie am Kasten der
   Seitenwahl — und dieselbe Farbe, die drinnen die Rasterlinien tragen. */
.verlauf {
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 20px;
  min-width: 0;
  padding: 50px;
  border-radius: 40px;
  border: var(--randbreite) solid var(--farbe-rand);
  background: var(--farbe-flaeche);
}

/* DAS BILD NACH OBEN, OHNE `diagramm.js` ANZUFASSEN. Das Skript
   haengt den Kasten vor die Tabelle; die Tabelle steht im Markup
   zuletzt, also stuende das Bild vor ihr und hinter dem Text. `order`
   verschiebt es, ohne dass die Ladefolge oder der Vorlesebaum sich
   aendert — und die Tabelle wird vom Skript ohnehin auf
   `nur-vorlesen` gesetzt. */
.verlauf__bild { order: -1; }

/* DER CHIP, wie an der Bento-Kachel. Er traegt die kraeftige Fuellung —
   die blasse hielt gegen `--farbe-flaeche-gedaempft` keine Kante
   (1,04:1), und ein Chip, den man nicht sieht, ist kein Chip.

   NACHGERECHNET AM 06.08.2026, weil der Grund weiss geworden ist: die
   blasse Fuellung haelt gegen Weiss 1,15:1. Etwas mehr als die 1,03
   gegen Grau, und weiter viel zu wenig. Die kraeftige bleibt. */
/* ===================================================================
   DIE KOPFZEILE DER VERLAUFSKACHEL — 08.08.2026
   ===================================================================

   Sie ist neu, weil neben dem Chip jetzt der Umschalter steht. Vorher
   stand der Chip allein und brauchte keine Zeile um sich.

   `space-between` UND NICHT `gap`: der Chip gehört an die linke Kante der
   Kachel, der Umschalter an die rechte. Eine Lücke dazwischen wäre bei
   1920 px eine andere Anordnung als bei 390.

   `flex-wrap`, WEIL BEIDE ZUSAMMEN BEI 390 PX NICHT IN EINE ZEILE PASSEN:
   der Chip ist dort 195 px breit, der Umschalter rund 150, und die Kachel
   hat 350 minus 100 Polster. Ohne Umbruch stünde eins von beiden über der
   Kante. */
.verlauf__kopf {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--abstand-3);
  min-width: 0;
}

/* ===================================================================
   DER SATZ EINES TAKTES — 08.08.2026
   ===================================================================

   Seit der Umschalter ohne Nachladen wechselt, steht jeder Takt einmal im
   Dokument: Leitzahl, Vergleich, Spanne, Tabelle. Der nicht gewählte trägt
   `hidden`.

   ER MUSS DIE LÜCKE DER FIGUR WEITERGEBEN, und das ist beim ersten Bau
   untergegangen: `.verlauf` ist eine flex-Spalte mit 20 px Lücke, und die
   galt vorher zwischen Leitzahl und Zusatz. Mit dem Wrapper dazwischen
   greift sie dort nicht mehr — im Bild klebte der Satz „Menschen
   erreicht …" an der Zahl. Gefunden beim Ansehen, nicht von einer Zahl.

   `20px` STEHT AN BEIDEN STELLEN und nicht als Token: es ist derselbe Wert
   wie an `.verlauf`, direkt darüber, und wer den einen ändert, sieht den
   anderen. Ein Token dafür wäre ein Name für eine Lücke, die es genau
   zweimal gibt. */
.verlauf__satz {
  display: flex;
  flex-direction: column;
  gap: 20px;
  min-width: 0;
}

/* ===================================================================
   DER UMSCHALTER WOCHEN / MONATE — 08.08.2026, angesagt
   ===================================================================

   „Oben hin machen, dass man Wochen und Monate separieren kann."

   ER TRÄGT DIE FORM DER SEITENWAHL IM KOPF und nicht die des Chips
   daneben: zwei Wörter nebeneinander, das eigene als dunkler Vollton, die
   anderen ruhend in Tinte. Das ist dieselbe Aussage („hier bist du") und
   deshalb dieselbe Form — eine zweite Bauart dafür wäre eine zu viel.

   DIE MASSE KOMMEN AUS DERSELBEN QUELLE. `--groesse-navi-wort` (16),
   `--polster-navi-wort` (20) und `--hoehe-navi-wort` (40) sind die der
   Kopfzeile, gemessen an `EB-Software-Website`. Es kommt keine vierte
   Zahl dazu.

   KEIN KASTEN DRUMHERUM, aus demselben Grund wie oben: die Website hat um
   ihre Wörter keinen, und ein Rahmen um zwei Wörter neben einem Chip
   wäre ein zweiter Kasten in einer Kachel, die schon einer ist. */
.verlauf__takt {
  display: flex;
  align-items: center;
  min-width: 0;
}

.verlauf__takt-wort {
  display: inline-flex;
  align-items: center;
  height: var(--hoehe-navi-wort);
  padding-inline: var(--polster-navi-wort);
  border-radius: var(--radius-navi-wort);
  color: var(--farbe-text);
  text-decoration: none;
  font-size: var(--groesse-navi-wort);
  font-weight: var(--schrift-halbfett);
  line-height: 24px;
  white-space: nowrap;
}

/* ===================================================================
   DIE TREFFERFLAECHE IST 44 PX, DAS BILD BLEIBT 40 — 11.08.2026
   ===================================================================

   GEFUNDEN VON DER SCHLUSSWACHE: `.verlauf__takt-wort` und die
   Filter-Chips im Posteingang messen 40 px. Das Haus verlangt 44 als
   Mindestmass und 48 fuer den Arbeitshandschuh; an acht anderen Stellen
   ist genau das ausdruecklich nachgezogen worden.

   DIE 40 SIND ANGESAGT UND BLEIBEN. „Filter-Optionen schwarz und kantig
   wie auf der Uebersichtsseite" — dort misst der Umschalter 40 px, und
   die Form ist der Sinn der Ansage. Eine Regel, die den Wert anhebt,
   nimmt der Ansage ihren Gegenstand.

   ALSO WAECHST NICHT DER KASTEN, SONDERN DAS ZIEL. Ein unsichtbares
   `::after` legt sich 2 px ueber und unter das Wort; damit ist die
   Trefferflaeche 44 px hoch, und kein Pixel des Bildes aendert sich.
   Das ist nachgemessen und nicht behauptet — die Wache meldet die Hoehe
   des Elements, der Finger trifft das Pseudo-Element.

   `inset: -2px 0` UND NICHT `-2px`: waagerecht ist Platz genug, und
   ueberlappende Ziele nebeneinander waeren schlimmer als knappe. Die
   Woerter stehen mit Luecke, senkrecht steht nichts daneben.

   WARUM ES BEIDE TRIFFT: es ist derselbe Token an zwei Orten. Die
   Uebersicht ist in dieser Runde die unantastbare Vorlage — diese
   Aenderung fasst ihr Aussehen nicht an, nur ihre Bedienbarkeit, und
   sie ist deshalb gemeldet und nicht verschwiegen. */
.verlauf__takt-wort {
  position: relative;
}

.verlauf__takt-wort::after {
  content: '';
  position: absolute;
  inset: -2px 0;
}

/* WIE DIE AKTIVE SEITE OBEN: dunkler Vollton, nicht lila. Dunkel heißt
   „hier bist du", lila heißt „das kannst du tun". `aria-current` steht
   daneben — Farbe allein ist keine Auskunft. */
.verlauf__takt-wort--aktiv {
  background: var(--farbe-text);
  color: var(--farbe-flaeche);
}

.verlauf__titel {
  align-self: flex-start;
  margin: 0;
  padding: 6px 21px;
  border-radius: 40px;
  background: var(--farbe-akzent-violett);
  color: var(--farbe-text);
  font-size: 18px;
  /* [gemessen] 24 px, wie am Chip der Bento-Kachel. */
  line-height: 24px;
  font-weight: var(--schrift-halbfett);
  letter-spacing: -0.02em;
}

/* Dieselbe Groesse wie der Titel der Bento-Kachel: es IST derselbe
   Rang — eine Zahl, die die Kachel traegt. Zwei Groessen fuer
   denselben Rang waeren ein Groessenzoo. */
/* DIE ZAHL UND IHR VERGLEICH STEHEN NEBENEINANDER — angesagt am
   06.08.2026 („neben die Leitzahl"). `flex-wrap` und `align-items:
   baseline`: bei 390 px passt beides nicht in eine Zeile, und dann
   gehoert der Vergleich unter die Zahl und nicht daneben abgeschnitten.
   `min-width: 0` am Vergleich, weil er ein Flex-Kind ist. */
.verlauf__leitzahl {
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  column-gap: var(--abstand-4);
  row-gap: var(--abstand-1);
}

.verlauf__zahl {
  font-size: 30px;
  font-weight: 800;
  line-height: 1;
  letter-spacing: -0.04em;
  font-variant-numeric: tabular-nums;
  color: var(--farbe-text);
}

/* ===================================================================
   MARKIERT WIE AUF DER WEBSITE — 08.08.2026, angesagt
   ===================================================================

   „,+12 % gegenüber Juni' sollte in dem Neon gehighlightet sein wie auf
   der Website."

   ÜBERNOMMEN AUS `EB-Software-Website/stile/beispielmedien.css`, wo die
   markierte Beschriftung genau einmal vorkommt: die Regel für das starke
   Wort im Worttakt setzt `background` auf ihr Gelb und `padding` auf
   `0 .6rem`, sonst nichts.

   (Der Wählername steht hier bewusst NICHT in Wählerschreibweise. Die
   Wache „kein Baustein greift in die Klassen eines anderen" liest auch
   Kommentare und hat ihn beim ersten Versuch als fremden Block gemeldet —
   dieselbe Falle, die im Übergabepunkt unter Nummer 3 steht.)

   Ihr Wurzelmaß ist 10 px, `.6rem` sind also 6 px. Kein Radius, keine
   Kontur, kein Rand oben und unten — der Kasten ist genau so breit wie
   das Wort und genau so hoch wie seine Zeile. Das ist die Form, die die
   Messung vom 04.08.2026 als „markierte Beschriftung" notiert hat:
   „Text auf durchgehendem Kasten, der nur so breit ist wie der Text."

   OHNE FARBE FÜR DIE RICHTUNG — und das bleibt. Grün für hoch und Rot für
   runter wäre die Schönfärberei, gegen die die Ansage geschrieben ist. Das
   Neongelb sagt nicht „gut", es sagt „hier steht die Veränderung": es
   liegt auf `+12 %` genauso wie auf `−8 %` und auf `unverändert`. Wer aus
   der Markierung eine Bewertung machen will, braucht dafür eine eigene
   Entscheidung und zwei Töne, und beides gibt es hier nicht.

   TINTE DARAUF HÄLT 16,40:1 — der beste Wert der ganzen Palette. Das ist
   auch der Grund, warum die Markierung keine eigene Schriftfarbe braucht.

   DAS NEONGELB STEHT DAMIT ZUM DRITTEN MAL AUF DIESER SEITE: am Knopf
   „Zum Posteingang", auf der Boost-Kachel und hier. Es gehört
   aufgeschrieben, weil es der Grund wäre, wenn eines der drei nicht mehr
   auffällt — heute tut es keins, die drei stehen in verschiedenen
   Blöcken und in verschiedenen Größen. */
.verlauf__vergleich {
  min-width: 0;
  /* [Website] `padding: 0 .6rem` bei einem Wurzelmaß von 10 px. */
  padding-inline: 6px;
  background: var(--farbe-akzent-gelb);
  font-size: 17px;
  font-weight: var(--schrift-halbfett);
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
  color: var(--farbe-text);
}

.verlauf__zusatz {
  margin: 0;
  font-size: 17px;
  font-weight: var(--schrift-halbfett);
  letter-spacing: -0.02em;
  color: var(--farbe-text);
}

@container huelle (min-width: 45rem) {
  .verlauf { padding: 50px 60px 50px 50px; }
  .verlauf__titel { padding: 5px 20px; font-size: 20px; }
  .verlauf__zahl { font-size: 36px; }
}

@container huelle (min-width: 1441px) {
  .verlauf { padding: 80px 70px 60px; }
  .verlauf__titel { padding: 6px 21px; }
  .verlauf__zahl { font-size: 60px; }
}

/* DIE HOEHE STEHT AM KASTEN, NICHT AM CANVAS. Chart.js
   ueberschreibt die Masse des canvas selbst; nimmt es dann die
   des Elternelements, und kommt dessen Hoehe vom Inhalt, ist der
   Inhalt das canvas. Gemessen beim ersten Lauf: 1132 x 2443 px
   statt 1132 x 220. */
/* 260 PX UND NICHT MEHR 220 — 06.08.2026, gerechnet und nicht gegriffen.
   Die Zeichenflaeche bleibt bei 220; dazu kommt die Legende, die es seit
   den vier Linien gibt und die Chart.js INNERHALB des canvas zeichnet.
   Gemessen an ihrer Bauart (8 px Punkt, 20 px Polster oben und unten)
   sind das rund 40 px. Ohne die Zugabe gingen sie von der Zeichenflaeche
   ab, und die Linien waeren flacher geworden, ohne dass jemand eine Zahl
   geaendert haette.

   ES IST KEIN WERT AUS DER VORLAGE. Beide Jitter-Ordner sind durchsucht:
   sie enthalten kein gerendertes Diagramm (der einzige Treffer auf
   „chart" ist ein Verweis auf `templates/charts/`, und die Seite liegt
   nicht im Abzug). */
.verlauf__bild {
  position: relative;
  width: 100%;
  height: 260px;
}

.verlauf__leinwand {
  display: block;
}

/* DER KASTEN UM DIE TABELLE — 06.08.2026, zwei Aufgaben in einem.
   ==============================================================
   1. OHNE SKRIPT ist die Tabelle sichtbar, und mit fuenf Spalten war sie
      bei 390 px gemessene 449 px breit in einer 350 px breiten Kachel.
      Statt die Spalten zu quetschen, bis „Instagram" mitten im Wort
      bricht, bekommt sie hier ihren eigenen Rollbereich.
   2. MIT SKRIPT traegt dieser Kasten `nur-vorlesen`. Ein Block-Element
      laesst sich auf 1 px klemmen und schneidet ab, eine Tabelle nicht —
      die Begruendung steht oben bei `.nur-vorlesen`.

   `min-width: 0` GEHOERT DAZU: der Kasten ist ein Flex-Kind von
   `.verlauf` und koennte sonst nicht unter seinen Inhalt schrumpfen —
   dann rollte nicht er, sondern die Seite.

   `:not(.nur-vorlesen)` IST KEINE VORSICHT, SONDERN NOTWENDIG. Ohne
   diese Einschraenkung stuenden am versteckten Kasten zwei Regeln:
   `overflow: hidden` von `.nur-vorlesen` (Zeile 307) und `overflow-x:
   auto` von hier. Gleiche Spezifitaet, und die spaetere gewinnt — also
   diese. Der Kasten haette dann einen Rollbereich, den niemand sieht
   und niemand bedienen kann. Es ist dieselbe Falle wie bei
   `.knopf--pille`, nur diesmal vorher gesehen. */
.verlauf__tabelle:not(.nur-vorlesen) {
  min-width: 0;
  overflow-x: auto;
}

/* Die Tabelle im Ruhezustand — schlicht, aber lesbar. Sie ist
   das, was ohne Skript dasteht, und keine Notloesung. */
.verlauf__zahlen {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--groesse-klein);
  text-align: left;
}

.verlauf__zahlen th,
.verlauf__zahlen td {
  padding: var(--abstand-2) var(--abstand-3);
  border-bottom: var(--randbreite) solid var(--farbe-rand);
}

.verlauf__zahlen thead th {
  color: var(--farbe-text-gedaempft);
  font-weight: var(--schrift-halbfett);
}

.verlauf__zahlen tbody th {
  font-weight: var(--schrift-normal);
}

/* Die Zahl rechts: Mengen stehen auf einer Kante, sonst
   vergleicht man Ziffernbreiten statt Zahlen. */
.verlauf__zahlen td {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

/* ============================================================
   DIE FÜNF KACHELN TRETEN EIN — Regel 12, Muster „Staffel"
   ============================================================

   40 ms Versatz, höchstens sechs bis acht Zeilen: fünf Kacheln, die
   letzte startet bei 160 ms, alles steht nach 360 ms. Kein neues
   Keyframe — `tritt-ein` und das `--staffel`-Muster gibt es seit
   Runde 22, und ein zweites Keyframe für dieselbe Bewegung wäre
   genau der Fall, den Regel 12 „nichts federt, nichts wippt" meint:
   zwei Bauten, die auseinanderlaufen.

   Der globale `*`-Block für `prefers-reduced-motion` erfasst beides. */
/* HIER STANDEN FUENF REGELN AUF `tafel__eintrag` — gefallen am 13.08.2026.
   Sie staffelten den Eintritt der Uebersichtskarten ueber `--staffel`.

   DIE KLASSE KOMMT IN KEINER MARKUP-ZEILE VOR: `tafel.ts` baut seit dem
   Umbau auf das Bento `.bentokachel` und setzt die Staffel INLINE
   (`style="--staffel: 0"`). Die Regeln hier haben seither nichts mehr
   getroffen.

   GEPRUEFT, BEVOR SIE FIELEN, und zwar genau die Frage vom 12.08.2026: setzt
   eine von ihnen etwas, das ein anderer LIEST? `--staffel` wird gesetzt und
   nicht gelesen — die einzigen Leser sind `animation-delay` in derselben
   Regel und die Inline-Werte des Bentos. Damals sind auf diesem Weg neun
   Tokens gefallen, die ueber `getComputedStyle` Leser hatten. */

/* ============================================================
   DIE BALKEN FÜLLEN SICH — das einzige neue Keyframe
   ============================================================

   Regel 12: „Erzählende Bewegung, 0,3–0,8 s, nur für Zahlen und Balken."
   Der Zahlenaufbau braucht ein Skript und ist nach §Q5.7 empfohlen
   wegzulassen; der Balken kann es OHNE, weil seine Zielbreite als
   `style="width: X%"` im Markup steht und ein Keyframe mit nur `from`
   den geschriebenen Wert als Ziel nimmt.

   `.balken__fuellung` trägt bereits `transition: width var(--dauer-mittel)`.
   Die feuert hier nie — die Breite ändert sich nach dem Aufbau nicht mehr.
   Kein Konflikt, aber auch kein Ersatz: eine Übergangsregel bewegt nichts,
   wenn niemand den Wert ändert.

   Der Beginn liegt hinter dem Eintritt der eigenen Kachel (Karte 4 bei
   120 ms, Karte 5 bei 160 ms) — ein Balken, der sich füllt, während seine
   Karte noch hereinkommt, erzählt zwei Sachen gleichzeitig. */
.tafel .balken__fuellung {
  animation: balken-fuellen var(--dauer-erzaehlen) var(--kurve) backwards;
  animation-delay: calc(var(--staffel, 3) * var(--staffel-versatz));
}

/* UND HIER ZWEI WEITERE — 13.08.2026, beim zweiten Hinsehen gefunden. Sie
   staffelten die Balkenfuellung in denselben Karten und tragen denselben
   toten Waehler. Der Vorgabewert `var(--staffel, 3)` eine Regel darueber
   bleibt: er ist der Fall „keine Staffel gesetzt", und den gibt es weiter. */

@keyframes balken-fuellen {
  from {
    width: 0;
  }
}


/* ===================================================================
   DER MONATSRUECKBLICK — 13.08.2026

   EINE EINZIGE REGEL, und das ist der Punkt. Der Rueckblick nimmt die
   Aussageflaeche, das Bento-Raster und die Verlaufsfigur der Uebersicht
   unveraendert — „Bento-Raster und Aussageflaeche wie auf der
   Uebersicht". Was er zusaetzlich hat, ist EIN Satz unter der Aussage.

   ER HEISST `.bento__beleg` UND NICHT `.rueckblick__beleg`: er steht IN
   der Aussageflaeche, also gehoert er ihr. Die Wache „kein Baustein
   greift in die Klassen eines anderen" hat den ersten Namen gemeldet —
   ein Element ohne Block ist der klassische Weg in eine Kollision.
   =================================================================== */

/* DER BELEGBARE SATZ unter der grossen Aussage.

   DIESELBEN WERTE WIE `.verlauf__zusatz`, und zwar abgeschrieben statt
   erfunden: 17 px, halbfett, `--farbe-text`. Die beiden haben dieselbe
   Aufgabe — der Satz, der die grosse Zahl darueber einordnet — und sie
   stehen auf demselben Bildschirm untereinander. Zwei Groessen dafuer
   waeren zwei Aussagen ueber denselben Rang.

   `--farbe-text` UND NICHT `--farbe-text-leise`: das Token traegt seine
   eigene Warnung („2,91:1 — Zeichen, kein Text"). Dieser Satz IST Text,
   und er ist die Einordnung eines gefallenen Monats — also gerade der,
   den niemand uebersehen soll.

   KEINE SIGNALFARBE, und das ist die Regel des ganzen Bildschirms: „Ein
   schlechter Monat wird als schlechter Monat gezeigt." Gruen fuer gute
   und rot fuer schlechte Nachrichten waere die Schoenfaerberei, gegen die
   der Auftrag geschrieben ist — und eine Auskunft allein ueber Farbe waere
   ohnehin keine.

   `max-width` IN `ch` UND NICHT IN `px`: die Zeilenlaenge haengt an der
   Schrift, nicht am Bildschirm. Die Aussage darueber hat ihr eigenes Mass
   und ist absichtlich breiter — sie ist drei Woerter, dieser Satz ist
   einer. */
.bento__beleg {
  margin: var(--abstand-4) 0 0;
  max-width: 60ch;
  font-size: 17px;
  font-weight: var(--schrift-halbfett);
  line-height: var(--zeilenhoehe-mittel);
  color: var(--farbe-text);
}

/* ===================================================================
   DAS BLAETTERN — 14.08.2026

   Alle sechs Bilder stehen im Markup; `[hidden]` blendet fuenf davon
   aus (Regel in `[hidden] { display: none !important; }` weiter oben
   im Blatt — ohne sie wuerde `display: flex` an `.rueckblickbild__pfeil`
   das Ausblenden selbst schlagen).

   EIN PFEIL JE RICHTUNG. `rueckblick.js` schreibt bei jedem Schritt nur
   `href` um; `.rueckblickbild__pfeil--weiter` traegt deshalb keine
   eigene Zeichnung, sondern dieselbe wie „zurueck", um 180 Grad gedreht
   — dieselbe Entscheidung wie an `.bentokachel__pfeil`.

   DAUMENGROSSE TREFFERFLAECHEN AN DEN PFEILEN, 44 px — dieselbe Grenze wie
   am Kontoknopf der Kopfzeile.

   DIE PUNKTE SIND KLEINER, UND DAS IST GEMESSEN, NICHT GESCHAETZT. Sechs
   Punkte zu je 40 px plus zwei Pfeile zu je 44 px passen bei 390 px nicht
   nebeneinander — gemessen 380 px Bedarf gegen 350 px Platz, 30 px zu viel,
   und zwar genau dann, wenn BEIDE Pfeile stehen (Bild 2 bis 5; an den
   Raendern, Bild 1 und 6, fehlt einer und es passt). Sie sind trotzdem eine
   Trefferflaeche und kein blosses Zeichen: 28 px liegt unter den 44 px der
   Pfeile, weil sie die zweitrangige Bedienung sind — „welches Bild" statt
   „vor/zurueck" — und weil Instagram und aehnliche Vorbilder ihre
   Story-Punkte genauso schmal halten. */

/* DER BLOCK SELBST — jedes `.rueckblickbild__…` gehoert zu einer Sektion mit
   dieser Klasse (`rueckblick.ts`, `<section class="rueckblickbild">`).
   `min-width: 0`, weil sie ein Kind von `.rueckblickbilder` ist — dieselbe
   Falle wie ueberall im Haus, wenn ein breiter Gegenstand darin steht (hier:
   die Tabelle des Diagramms in Bild 2). */
.rueckblickbild {
  min-width: 0;
}

.rueckblickbild__figur {
  display: block;
  margin: var(--abstand-6) auto 0;
  width: 180px;
  height: 180px;
}

.rueckblickbild__blaettern {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--abstand-2);
  margin-top: var(--abstand-6);
}

.rueckblickbild__pfeil {
  display: flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: var(--randbreite) solid var(--farbe-rand);
  background: var(--farbe-flaeche);
  color: var(--farbe-text);
}

.rueckblickbild__pfeil:hover {
  background: var(--farbe-flaeche-gedaempft);
}

.rueckblickbild__pfeil--weiter .symbol {
  transform: rotate(180deg);
}

.rueckblickbild__punkte {
  display: flex;
  align-items: center;
  margin: 0;
  padding: 0;
  list-style: none;
}

.rueckblickbild__punkt {
  display: flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
}

.rueckblickbild__punkt::before {
  content: '';
  display: block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--farbe-rand);
}

.rueckblickbild__punkt--aktiv::before {
  background: var(--farbe-text);
}


/* ===================================================================
   BEREICH 02 - Onboarding (Einrichten)

   Drei Bildschirme, eine Frage je Bildschirm, jederzeit
   ueberspringbar. Kein Assistent, kein Skript: jeder Schritt ist
   eine Adresse.

   VOLLBILD OHNE HUELLE. Keine Navigation, keine Kopfzeile, kein
   Konto — das ist der Unterschied zu Bereich 16, wo derselbe
   Rhythmus EINGEBETTET laeuft, weil er jemanden bei der Arbeit
   unterbricht. Hier kennen wir uns noch nicht und dahinter liegt
   noch nichts.
   =================================================================== */

/* ===================================================================
   Die Fehlerseiten — 404, 403, 500, ohne Netz

   Regel 15, zweite Kategorie: „Fehler, Offline und fehlendes Recht
   bekommen ein graues, geprueft nie heiteres Zustandsbild." Deshalb
   steht hier keine Farbe ausser der des Knopfes.

   DIE ILLUSTRATIONEN LAGEN SCHON DA. Sechzehn Dateien in
   `oeffentlich/illustrationen/`, keine davon eingebunden — hier
   werden sie zum ersten Mal benutzt.
   =================================================================== */

/* MITTIG AUF DER GANZEN HOEHE, nicht oben mit Polster. Vorher stand
   das Blatt am oberen Rand und der Rest der Seite war leer — bei
   einem Fehler ist das der Eindruck „hier ist noch mehr", und da ist
   nichts mehr.

   DIESER ABSATZ STAND HIER SEIT DEM 31.07.2026, UND ES STIMMTE NICHT.
   Gemeldet am 01.08.2026: „die 404 seite soll centered sein also hoehe
   und breite wirklich in der mitte". Zu Recht — im Bild klebte das
   Blatt oben.

   DIE URSACHE IST DIE KASKADE, nicht eine fehlende Regel. Das Element
   traegt ZWEI Klassen: `<main class="vollbild fehlerseite">`. Beide
   setzen `display`, beide haben dieselbe Spezifitaet (eine Klasse) —
   also gewinnt die, die WEITER UNTEN in der Datei steht, und das ist
   `.vollbild` mit `display: flex`. Aus dem Raster wurde eine
   Flex-Spalte, `place-items: center` verlor seine senkrechte Haelfte
   (`justify-items` gilt im Flex-Layout nicht), und `justify-content`
   stand nirgends. Waagerecht war es deshalb mittig, senkrecht nicht.
   Das ist der Unterschied, den man im Bild sieht und in keiner Zahl.

   BEHOBEN MIT `margin-block: auto` AM BLATT, nicht mit
   `justify-content: center` am Behaelter. Der Behaelter hat
   `overflow-y: auto`; bei zentriertem Inhalt, der hoeher ist als das
   Fenster, ist der obere Teil dann in mehreren Browsern NICHT
   erreichbar — der Bildlauf kann nicht ins Negative. Automatische
   Raender koennen das nicht: sie werden null, sobald kein Platz mehr
   da ist. */
.fehlerseite {
  min-height: 100dvh;
  display: grid;
  place-items: center;
  padding: var(--abstand-5);
  background: var(--farbe-hintergrund);
}

.fehlerseite__blatt {
  width: 100%;
  /* [gemessen] Jitter gibt seinem 404-Titel 720 px und haelt „Page not
     found." damit auf EINER Zeile. Bei uns standen 30 rem (480 px), und
     seit der Titel 48 px gross ist, brach „Diese Seite gibt es nicht."
     mitten im Satz um — „…gibt es" / „nicht." Der Umbruch trennte das
     Verb von seiner Verneinung.

     Die EINORDNUNG darunter bleibt schmal (34 ch an ihrer eigenen
     Regel): sie ist Fliesstext und braucht eine Lesespalte, waehrend die
     Ueberschrift eine Zeile braucht. Zwei verschiedene Aufgaben, zwei
     verschiedene Breiten. */
  max-width: 45rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--abstand-4);
  text-align: center;
  /* Siehe oben: das ist die Zeile, die wirklich zentriert. */
  margin-block: auto;
}

/* GROSS. Bei 220 px war die Zeichnung ein Beiwerk ueber dem Satz;
   auf einer Seite, die sonst nichts zeigt, ist sie das Erste, was
   man sieht, und darf entsprechend gross sein.

   DIE HOEHE IST FEST, DIE BREITE ERGIBT SICH — 02.08.2026. Hier stand
   `width: min(340px, 78%)` mit `height: auto`, also genau andersherum:
   damit war ein flaches Motiv 181 px hoch und ein hohes 333, und die
   Ueberschrift darunter sprang je nach Fehlerart um 152 px. Die Regel
   selbst steht oben bei `.leerbild`; hier steht nur, wie hoch der Rahmen
   auf DIESER Seite ist. */
/* ZUSAMMENGELEGT AM 12.08.2026. Der erste Teil stand in Bereich 15 und
   galt dort fuer `.fehlerseite__bild` UND `.wizard__bild` — eine geteilte
   Regel an einem geteilten Ort. Seit der Quartals-Wizard weg ist, trifft sie
   genau eine Klasse, und die hatte hier ihre zweite Regel. Zwei Regeln fuer
   eine Klasse in zwei Bereichen sind der Anfang einer Kollision: bei
   gleicher Spezifitaet gewinnt die spaetere, und welche das ist, sieht
   niemand, der nur eine von beiden liest.

   `object-fit: contain` ist die Auflage „unverzerrt": ohne sie haengt es
   davon ab, ob Hoehe und Breite zusammenpassen — und das weiss nur die
   Datei. Die Dateien bringen ihre eigenen Farben mit; sie sind Eigentum des
   Auftraggebers und werden nicht eingefaerbt. */
.fehlerseite__bild {
  --bildrahmen: 260px;
  display: block;
  height: var(--bildrahmen);
  width: auto;
  max-width: min(340px, 78%);
  margin: 0 auto var(--abstand-2);
  object-fit: contain;
}

/* NACH JITTERS 404 GEMESSEN — 03.08.2026, angesagt („die 404 ist falsch,
   siehe Jitter-Ordner"). Seine Werte bei 1440 px:

     h1     48 px / 800, Laufweite -1,92 px (= -.04em), Textfarbe
     p      20 px / 400, gedaempft
     Emoji  60 px
     Weg    18 px / 600, OHNE Unterstreichung

   UNSERE UEBERSCHRIFT WAR 30 PX. Das ist die Groesse einer
   Abschnittsueberschrift, und die Seite hat nur einen Satz — er darf die
   Groesse haben, die ihm zusteht. `--groesse-seitentitel` traegt genau
   Jitters 48 px und ist schon da; ein zweiter Wert dafuer waere ein
   zweiter Ort fuer dieselbe Entscheidung.

   ZWEI DINGE UEBERNEHME ICH NICHT, und beide sind benannt:

   1. SEIN EMOJI. „Emoji und Illustrationen bleiben unser" steht im
      Auftrag, und Regel 15 verlangt fuer Fehler ein graues, geprueft nie
      heiteres Bild. Ein 🧐 ist heiter. Unsere `404.svg` bleibt.

   2. SEINEN TEXTVERWEIS. Ein Verweis in Fliesstextgroesse ist fuer eine
      Hand im Arbeitshandschuh das schwerere Ziel; der Knopf bleibt. */
.fehlerseite__satz {
  margin: 0;
  font-size: var(--groesse-seitentitel);
  font-weight: 800;
  line-height: 1.04;
  letter-spacing: var(--laufweite-eng);
  hyphens: manual;
}

/* [gemessen] Jitter: 20 px / 400 in seinem gedaempften Ton — bei uns
   `--farbe-text-gedaempft`, derselbe Wert. Unsere Einordnung stand in
   Fliesstextgroesse (17) und war damit vom Satz darueber kaum
   abgesetzt. */
.fehlerseite__einordnung {
  margin: 0;
  max-width: 34ch;
  color: var(--farbe-text-gedaempft);
  font-size: var(--groesse-untertitel);
  line-height: 1.35;
}

.fehlerseite__fuss {
  display: flex;
  margin-top: var(--abstand-2);
}

/* Die Nummer klein und zuletzt: sie hilft nur beim Nachfragen. */
.fehlerseite__kode {
  margin: 0;
  font-size: var(--groesse-mikro);
  color: var(--farbe-text-leise);
  font-variant-numeric: tabular-nums;
}

.vollbild {
  /* `min-height`, nicht `height` — Baustelle 0.1, nachgezogen am
     05.08.2026 fuer Bereich 02.

     HIER STAND DAS GEGENTEIL, mit dieser Begruendung: „Mit `min-height`
     waechst das Element ueber das Fenster hinaus, der eigene Bildlauf
     kommt nie zum Zug und stattdessen scrollt der Body." Das ist
     richtig beobachtet — und beschreibt jetzt das GEWOLLTE Ergebnis.
     Der Satz war nie falsch, nur sein Vorzeichen.

     DER EINE BEFUND DARIN BLEIBT GUELTIG: bei 390 px liess sich die
     Seite wegscrollen, und der Farbverlauf endete mitten im Nichts.
     Der Verlauf haengt deshalb an `min-height`, nicht an der
     Inhaltshoehe — nachgemessen, er reicht bis zum Fuss. */
  min-height: 100dvh;
  display: flex;
  flex-direction: column;
}

/* Der Block selbst. Was allen drei Bildschirmen gemeinsam ist steht
   hier, nicht dreimal an den Abwandlungen — sonst waere jede spaetere
   Aenderung eine an drei Stellen. */
.einrichten {
  font-size: var(--groesse-text);
  line-height: 1.5;
}

/* --- Der Kopf: was beim Schrittwechsel stehenbleibt ---------------

   DER WICHTIGSTE EINZELBEFUND DES BAUAUFTRAGS, und er kommt aus dem
   Vergleich von fuenf Bildschirmen: die Wortmarke liegt auf allen
   fuenf auf EXAKT denselben vier Pixelkoordinaten. Sie ist das
   Element, das steht, waehrend der Inhalt wechselt.

   AUSGEMESSEN (768er-Raster, x1,875 auf 1440 px):
     Marke        Abstand links und oben je 38 px = 4,95 % der
                  Fensterbreite -> 72 px (--abstand-8)
     Punktreihe   Durchmesser 4,5 -> 8 px; Mittenabstand 8,5 px, also
                  1,9 x Durchmesser -> 16 px (--abstand-4);
                  rechter Rand 38 px, DERSELBE Wert wie links. Die
                  Reihe ist der Spiegel der Marke, kein eigenes
                  Element mit eigenem Rand.
     Zustaende    aktiv volles Weiss, ruhend rund 40 % davon.
                  Gemessen ist das VERHAELTNIS (0,39), nicht die
                  absolute Deckkraft — bei 4,5 px Durchmesser ist die
                  durch Kantenglaettung verfaelscht.

   KEIN NEUER FARBWERT: die 40 % sind eine Rechnung aus
   --farbe-primaer-kontrast, so wie es der Verlauf schon macht. */

.einrichten__kopf {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--abstand-4);
  padding: var(--abstand-5);
}

/* Auf dem Verlauf traegt die Marke Weiss — dort ist ihr Hausblau
   unsichtbar. Ihr Kurzzeichen dreht sich dabei um: weisse Flaeche,
   Primaerfarbe als Schrift. Das ist Regel 11, zweiter erlaubter Fall,
   und dieselbe Umkehrung wie beim gefuellten Knopf hier. */
.einrichten--farbe .einrichten__kopf .wortmarke {
  color: var(--farbe-primaer-kontrast);
}

.einrichten--farbe .einrichten__kopf .wortmarke__kurz {
  background: var(--farbe-primaer-kontrast);
  color: var(--farbe-primaer);
}

/* Der Ort: Satz und Punkte, EINE Auskunft an einer Stelle. Der Satz
   stand bis zum 01.08.2026 unten im Streifen — dort laeuft der
   Verlauf nach Weiss aus, und weisse Schrift hielt 1,52:1. Hier oben
   ist der Grund rein: 4,72:1. Begruendung ausfuehrlich in
   `einrichten.ts` bei `wegAus`. */
.einrichten__ort {
  margin: 0;
  display: flex;
  align-items: center;
  gap: var(--abstand-3);
  font-size: var(--groesse-klein);
  font-weight: var(--schrift-halbfett);
}







/* HIER STANDEN ZWEI REGELN AUF `einrichten__punkt` — gefallen am
   13.08.2026, und sie waren seit dem 31.07.2026 wirkungslos.

   Der Vermerk in `einrichten.ts` sagt es woertlich: „DIE PUNKTREIHE IST WEG —
   angesagt in BAUAUFTRAG-02-ONBOARDING-V2, 8.2." An ihre Stelle trat die
   Zaehlung „Schritt 3 von 9". Die Farbregeln fuer den hellen Hintergrund
   blieben stehen und trafen nichts mehr.

   Kein Leser: sie SETZEN einen Hintergrund, sie lesen nichts. */

/* DIE GROESSE DER PUNKTE — und hier steht die Rechnung, die im
   Bauauftrag als offene Frage stehenbleibt („bei acht Punkten stoesst
   die Reihe bei 390 px an die Wortmarke — dafuer hat die Vorlage
   keine Antwort, sie hat den Fall nicht").

   Bei 1440 px, acht Punkten und den gemessenen Werten:
     8 x 8 px + 7 x 16 px = 176 px
   dazu die Marke (rund 140 px) und zweimal 72 px Rand = 460 px.
   Passt mit grossem Abstand.

   Bei 390 px waeren allein die Raender 144 px. Der gemessene Rand ist
   aber ein ANTEIL der Fensterbreite (4,95 %), keine feste Zahl —
   4,95 % von 390 sind 19 px. Mit --abstand-5 (24), Punkten auf 6 px
   und der Marke auf ihrem Kurzzeichen:
     24 + 34 + 8 x 6 + 7 x 11 + 24 = 207 px von 390. */
.einrichten {
  --einrichten-punkt: 6px;
}

@media (min-width: 45rem) {
  .einrichten {
    --einrichten-punkt: 8px;
  }

  .einrichten__kopf {
    padding: var(--abstand-8);
    padding-bottom: 0;
  }
}

/* Am Handy wird die Marke kleiner, nicht kuerzer. Erste Fassung hatte
   das Wort ausgeblendet und nur das Kurzzeichen stehen lassen — das
   war zweimal falsch: `wortmarke()` gibt den Namen als TEXTKNOTEN
   aus, ein `+ *` haette also gar nichts getroffen (erste
   Erscheinungsform aus PRUEFUNGEN.md), und noetig ist es auch nicht.

   Nachgerechnet bei --groesse-klein (15 px): Kurzzeichen 1,9 em
   = 28,5 px + 8 px Abstand + „Software" rund 68 px = 105 px. Dazu
   24 + 16 + 125 + 24 = 294 px von 390. Es passt, also bleibt der Name
   stehen. */
@media (max-width: 45rem) {
  .einrichten__kopf .wortmarke {
    font-size: var(--groesse-klein);
  }
}

.einrichten__blatt {
  width: 100%;
  max-width: 34rem;
  margin: 0 auto;
  padding: var(--abstand-6) var(--abstand-5);
  display: flex;
  flex-direction: column;
  gap: var(--abstand-4);
  /* FUELLT DIE HOEHE, damit der Weg unten sitzen kann. Ohne das ist
     das Blatt nur so hoch wie sein Inhalt, und `margin-top: auto` am
     Weg haette nichts, wogegen es druecken koennte. */
  flex: 1 1 auto;
  min-height: 0;
}

/* --- 1 · Begruessung ---------------------------------------------

   "Auf vollflaechigem Farbverlauf, Schrift sehr gross, sonst nichts
   auf dem Bildschirm."

   ZWEI TOKEN, KEIN DRITTER WERT. Der Verlauf laeuft von der
   Primaerfarbe in ihre dunklere Stufe — beide tragen weisse Schrift
   (4,72:1 und 6,10:1). Ein aufgehellter Verlauf waere die Stelle, an
   der der Kontrast unbemerkt kippt: er kippt in der MITTE, und dort
   misst niemand. */

/* DER VERLAUF LÄUFT NACH UNTEN AUS — nachgezogen am 31.07.2026,
   gemessen an Jitters echtem Onboarding (Mobbin, „Setting up
   account", 16 Schritte).
   Vorher lief er von der Primaerfarbe in ihre dunklere Stufe: 160°,
   zwei kraeftige Toene, unten so satt wie oben. Bei Jitter ist es
   umgekehrt — kraeftiges Blau oben, nach unten in Weiss auslaufend.
   Genau das ist der „weiche weisse Verlauf, der den Inhalt auslaufen
   laesst statt ihn abzuschneiden": er ist nicht ein Streifen AM
   Rand, er ist der Hintergrund selbst.

   DIE STOPPS SIND KONTRASTRECHNUNG, NICHT GESCHMACK. Weisse Schrift
   auf der Primaerfarbe haelt 4,72:1 — auf einer Mischung mit Weiss
   haelt sie gar nichts. Deshalb bleibt die Flaeche bis 62 % REIN
   primaer; der Text der Begruessung steht mittig und endet weit
   darueber. Erst darunter beginnt der Auslauf. Wer hier den ersten
   Stopp nach oben schiebt, bricht den Kontrast in der Mitte des
   Verlaufs — und dort misst keine Wache. */
/* WEICHER — nachgezogen am 31.07.2026 auf Ansage.
   Zwei Stopps ergeben eine GERADE Mischung, und die sieht man: der
   Auslauf setzt an einer Kante an und wirkt wie eine zweite Flaeche
   statt wie ein Verschwinden. Die Zwischenstopps bilden eine weiche
   Kurve nach — dieselbe Idee wie eine Bremskurve bei einer Bewegung,
   nur ueber den Ort statt ueber die Zeit.

   `color-mix` statt neuer Token: die Mischwerte sind keine
   Entscheidungen, sondern Rechnung aus zwei vorhandenen Tokens. Ein
   Token je Zwischenstufe waere vier neue Farbwerte fuer eine einzige
   Flaeche — und die Farbwache haette recht, sie zu melden.

   DER ERSTE STOPP BLEIBT BEI 60 %. Weisse Schrift haelt auf der
   Primaerfarbe 4,72:1 und auf einer Mischung mit Weiss gar nichts;
   der Untertitel endet bei rund 57 % der Hoehe. Weicher heisst
   laenger auslaufen, nicht frueher anfangen. */
.einrichten--gruss {
  background: linear-gradient(
    180deg,
    var(--farbe-primaer) 0%,
    var(--farbe-primaer) 60%,
    color-mix(in srgb, var(--farbe-primaer) 88%, var(--farbe-primaer-kontrast)) 70%,
    color-mix(in srgb, var(--farbe-primaer) 62%, var(--farbe-primaer-kontrast)) 79%,
    color-mix(in srgb, var(--farbe-primaer) 32%, var(--farbe-primaer-kontrast)) 88%,
    color-mix(in srgb, var(--farbe-primaer) 10%, var(--farbe-primaer-kontrast)) 95%,
    var(--farbe-primaer-kontrast) 100%
  );
  color: var(--farbe-primaer-kontrast);
}

.einrichten__blatt--gruss {
  /* Die Begruessung steht in der Mitte, nicht oben: sie ist das
     einzige auf dem Bildschirm. `justify-content` statt `margin:
     auto`, seit das Blatt die Hoehe fuellt — ein automatischer Rand
     an einem Element, das ohnehin die ganze Hoehe hat, tut nichts. */
  justify-content: center;
  gap: var(--abstand-5);
  text-align: center;
}

.einrichten__gruss {
  margin: 0;
  font-size: var(--groesse-riesig);
  font-weight: 800;
  /* GEMESSEN, NICHT GEWAEHLT. Jitters Onboarding-Ueberschrift laeuft
     auf rund 120 px mit einem Zeilenabstand von rund 128 px — das
     Verhaeltnis ist 1,06. Auf der Marketing-Seite dasselbe Bild:
     72–80 px bei Zeile 0,95, Gewicht 800, Laufweite −0,033 bis
     −0,04 em. Unsere Laufweite lag bei −0,022 em und damit rund 40 %
     lockerer; bei 72 px sieht das nicht ruhig aus, sondern lose.

     WIDERSPRUCH 2 AUS DEM BAUAUFTRAG, entschieden am 01.08.2026.
     Dort steht, am Standbild nachgerechnet sei das Verhaeltnis 0,88
     und nicht 1,06, und „miss nach und entscheide". Nachgemessen im
     Browser, bei 72 px Schrift und Inters Kasten von 1,211 em
     (87,2 px):

       Zeile 0,88 -> 63,4 px, Kasten ueberlappt um 23,8 px
       Zeile 1,00 -> 72,0 px, ueberlappt um 15,2 px
       Zeile 1,06 -> 76,3 px, ueberlappt um 10,9 px
       Zeile 1,22 -> 87,8 px, ueberlappt gar nicht

     Kaesten duerfen sich beruehren — TINTE nicht. Entscheidend ist
     der Abstand zwischen der Unterlaenge einer Zeile (0,242 em unter
     der Grundlinie) und den Umlautpunkten der naechsten (rund 0,80 em
     ueber ihrer Grundlinie):

       bei 0,88  0,88 − 0,80 = 0,08 em, Unterlaenge 0,242
                 -> die Tinte KOLLIDIERT um 0,162 em = 11,7 px
       bei 1,06  1,06 − 0,80 = 0,26 em -> 0,018 em Luft = 1,3 px

     0,88 ist damit fuer deutschen Text nicht baubar: ein „Ü" ueber
     einem „g" laege ineinander. Der Bauauftrag sagt selbst, seine
     Zahlen stammen aus einer Rechnung ueber Versalhoehen an
     englischen Bildschirmen. 1,06 BLEIBT — mit der Auflage, dass die
     1,3 px Luft die ganze Reserve sind. Wer den Begruessungssatz
     aendert und dabei einen Umlaut ueber eine Unterlaenge stellt,
     geht auf 1,15 (dann 4,4 px). */
  line-height: 1.06;
  letter-spacing: var(--laufweite-sehr-eng);
  /* KEINE SILBENTRENNUNG in einem Begruessungssatz. Dieselbe
     Ueberlegung wie an der Kartenaufschrift in Bereich 18: getrennt
     sieht ein grosser Satz aus wie ein Fehler. */
  hyphens: manual;
}

.einrichten__untertitel {
  margin: 0;
  font-size: var(--groesse-text);
  /* Nicht die gedaempfte Textfarbe: die ist fuer helle Flaechen
     gerechnet. Auf dem Verlauf traegt Weiss, und leiser wird es
     ueber die Deckkraft. */
  opacity: 0.85;
}

/* DER GEFUELLTE KNOPF AUF DEM VERLAUF ist umgekehrt: weisse Flaeche,
   Primaerfarbe als Schrift. Das ist genau der zweite erlaubte Fall
   aus Regel 11 — die Primaerfarbe steht als Text auf REINEM Weiss.
   Ein gefuellter Knopf in Primaerfarbe waere hier unsichtbar, und
   ein Umriss-Knopf waere kein gefuellter: davon gibt es je
   Bildschirm genau einen, und hier ist es dieser. */
/* --- Der Eintritt: Staffel, keine Feder -------------------------

   „Alles bewegt sich beim Erscheinen: Ueberschrift, Text, Karten
   treten nacheinander ein, leicht versetzt, kurz und weich."

   GEMESSEN AN jitter.video: dort laufen die haeufigsten Uebergaenge
   ueber 0,5 s (133x), 0,3 s (129x) und 0,4 s (114x), und drei der
   vier haeufigsten Kurven UEBERSCHWINGEN — eine bis auf den Wert
   1,52. Das ist Jitters Signatur, und sie wird hier NICHT
   uebernommen: Regel 12 sagt woertlich „nichts federt, nichts
   wippt", die Ansage lautete „nicht huepfend".

   Uebernommen wird der RHYTHMUS, und der ist in Regel 12 laengst
   entschieden und heisst dort „Staffel": 40 ms Versatz, hoechstens
   sechs bis acht Elemente. Genau so viele hat hier jeder Bildschirm.
   200 ms je Element — das Grundtempo fuer einen Zustandswechsel;
   „alles ueber 300 ms ist Erzaehlung, nicht Bedienung."

   `backwards` ist Pflicht: ohne das steht das Element seine
   Verzoegerung lang sichtbar da und springt dann auf Anfang. */
.tritt-ein {
  animation: tritt-ein var(--dauer-mittel) var(--kurve) backwards;
  /* 40 ms stand hier als Zahl. Regel 12 nennt den Wert, also gehoert er
     in `tokens.css` — genau der fest verdrahtete Fall, den die Vorgabe
     verbietet. */
  animation-delay: calc(var(--staffel, 0) * var(--staffel-versatz));
}

/* HIER STAND `kopf-burger-erscheint`, eine Animation, die den Knopf aus
   dem Nichts wachsen ließ. Sie ist am 09.08.2026 gefallen, weil die
   Ansage etwas anderes beschreibt: „aus der schwarzen Pille kommt dann
   rechts diese drei Striche raus." Er wächst nicht an seiner Stelle — er
   kommt hinter der Pille hervor. Das ist keine Animation mehr, sondern
   ein Übergang auf Breite und Versatz, und der steht bei
   `.kopf__schublade`. */

@keyframes tritt-ein {
  from {
    opacity: 0;
    /* HERUNTERSKALIEREN, NICHT HOCHSCHIEBEN — nachgemessen am
       01.08.2026. Hier stand `translateY(8px)`, also „von unten".

       Der einzige messbare Eintritt der ganzen Vorlage ist ein
       Standbild MITTEN in der Bewegung (Jitters „Setting up account",
       Bild 12): die Karten stehen dort auf Deckkraft 0,79 und Massstab
       1,03 bis 1,06 gegenueber ihrer Ruhelage. Ein senkrechter Versatz
       darueber hinaus liegt bei hoechstens 3 px und ist von der
       Messungenauigkeit nicht zu trennen.

       Die Vorlage skaliert herunter, sie schiebt nicht hoch. 1,04 ist
       die Mitte der gemessenen Spanne. */
    transform: scale(1.04);
  }
}

/* JEDE KARTE EINZELN, nicht die Liste als Block — nachgezogen am
   31.07.2026. „Karten treten nacheinander ein" heisst genau das;
   vorher blendete der ganze Kasten auf einmal auf, und der Versatz
   war nur zwischen Ueberschrift, Satz und Liste zu sehen.

   Die Zaehlung steht hier und nicht im Markup: sie folgt aus der
   Reihenfolge im Raster, und `nth-child` liest genau die. Vier
   Kanaele — mit dem Vorlauf von drei Elementen darueber bleibt die
   Staffel unter den acht aus Regel 12.

   Die Zielflaechen standen hier mit: sie sind am 01.08.2026 nach
   BEREICH 16 gewandert, samt ihrer Zaehlung. */
.einrichten .kanalliste .kanalkarte {
  animation: tritt-ein var(--dauer-mittel) var(--kurve) backwards;
  animation-delay: calc(var(--staffel, 0) * var(--staffel-versatz));
}

.einrichten .kanalkarte:nth-child(1) { --staffel: 2; }
.einrichten .kanalkarte:nth-child(2) { --staffel: 3; }
.einrichten .kanalkarte:nth-child(3) { --staffel: 4; }
.einrichten .kanalkarte:nth-child(4) { --staffel: 5; }

/* BREIT AM HANDY, KNOPF AM LAPTOP — eine Regel, zwei Situationen.
   `knopf--breit` allein ergab bei 1440 px einen 496 px breiten
   Streifen fuer zwei Woerter; im Bild sah das aus wie ein Band, nicht
   wie ein Knopf. Volle Breite bleibt, wo sie hilft (Handschuh), und
   der Deckel macht daraus am Laptop wieder einen Knopf. */
.einrichten__blatt--gruss .knopf {
  align-self: center;
  width: 100%;
  max-width: 20rem;
}

.einrichten--gruss .knopf--gefuellt {
  background: var(--farbe-primaer-kontrast);
  color: var(--farbe-primaer);
  border-color: var(--farbe-primaer-kontrast);
}

.einrichten--gruss .knopf--gefuellt:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-primaer-sehr-hell);
  border-color: var(--farbe-primaer-sehr-hell);
}

/* HIER STAND EINE AUSNAHME FUER DIESEN BILDSCHIRM — gefallen am
   14.08.2026, aus demselben Grund wie die Ausnahme fuer dunklen Grund
   am 05.08.2026 (siehe Vermerk bei „--- Sprungmarke ---" weiter oben):
   ihr Grund ist weg. Sie stammte von VOR dem zweifarbigen Ring und
   verstand `--farbe-fokusring` noch als "die Primaerfarbe" — heute ist
   er `--farbe-text` (dunkel), mit einem weissen Saum aussen. Der
   weisse Ring, den diese Regel erzwang, verschmolz mit dem GLOBAL
   ohnehin weissen Saum zu einer Flaeche ohne eigene Kante — gemessen
   2,56:1 gegen den Verlauf, derselbe Wert wie beim Fund vom 05.08.2026,
   nur an einer Stelle, die die damalige Aufraeumung nicht erreicht hat.
   Der dunkle Ring aus der globalen Regel traegt auf seinem eigenen
   weissen Saum immer, unabhaengig vom Verlauf dahinter — er braucht
   diese Ausnahme nicht mehr. */

/* --- 2 und 3 · helle Flaeche -------------------------------------

   "Hier wechselt der Hintergrund von Farbe auf Hell - das
   signalisiert ohne Worte 'jetzt wird es ernst'." */

.einrichten--hell {
  background: var(--farbe-hintergrund);
  color: var(--farbe-text);
  position: relative;
  isolation: isolate;
}

/* DIE FRAGEN LIEGEN AUF DEM VERLAUF. Bis zum 31.07.2026 war nur die
   Begruessung farbig; ausgemessen an Jitters Ablauf liegt der Wechsel
   aber vor dem ersten Bildschirm, auf dem etwas PASSIERT — sechs
   Fragen davor bleiben blau. */
/* DER STOPP LIEGT BEI 72 %, NICHT BEI 60 — nachgemessen am 01.08.2026.

   Runde 18 hat den Stopp bei 60 % gesetzt und dazu gewarnt: „Wer diesen
   Stopp nach OBEN schiebt, bricht den Kontrast in der Mitte des
   Verlaufs, und dort misst keine Wache." Die Warnung war richtig, und
   sie war unvollstaendig — sie sah nur die eine Richtung.

   Jetzt gibt es die Wache (tests/messungen/lesbarkeit.spec.ts), und sie
   hat gemeldet, was unterhalb von 60 % steht:

     „Überspringen" auf ?schritt=gebiet   weiss auf rgb(160,155,249) = 2,46:1
     „Überspringen" auf ?gelesen=ja       weiss auf rgb(120,112,246) = 3,86:1
     „km" auf ?schritt=gebiet             weiss auf rgb(111,103,246) = 4,25:1

   Das sind keine Ausreisser, sondern die Bauart: der INHALT ist mittig
   und waechst nach unten, der Auslauf faengt bei 60 % an. Auf den
   laengeren Bildschirmen rutscht die letzte Zeile hinein.

   NACH UNTEN SCHIEBEN IST DIE ANDERE RICHTUNG und unbedenklich: mehr
   reine Flaeche heisst mehr Flaeche, auf der Weiss die 4,72:1 haelt.
   72 % ist die kleinste Zahl, bei der alle drei Funde in der reinen
   Flaeche liegen — der tiefste von ihnen sass bei rund 70 %.

   DER AUSLAUF BLEIBT WEICH. Runde 18: „weicher heisst laenger
   auslaufen, nicht frueher anfangen." Er hat weiter fuenf
   Zwischenstufen, nur auf 28 % der Hoehe statt auf 40 — und er deckt
   genau den Streifen ab, in dem der Weg liegt. */
.einrichten--farbe {
  background: linear-gradient(
    180deg,
    var(--farbe-primaer) 0%,
    var(--farbe-primaer) 80%,
    color-mix(in srgb, var(--farbe-primaer) 88%, var(--farbe-primaer-kontrast)) 85%,
    color-mix(in srgb, var(--farbe-primaer) 62%, var(--farbe-primaer-kontrast)) 89%,
    color-mix(in srgb, var(--farbe-primaer) 32%, var(--farbe-primaer-kontrast)) 93%,
    color-mix(in srgb, var(--farbe-primaer) 10%, var(--farbe-primaer-kontrast)) 97%,
    var(--farbe-primaer-kontrast) 100%
  );
  /* DER VERLAUF GEHOERT ZUM INHALT, NICHT ZUM FENSTER — und das ist
     die Zeile, ohne die der Rest nicht haelt.

     `.vollbild` ist sein eigener Bildlauf. Ohne diese Angabe klebt der
     Verlauf am Fenster: der Inhalt scrollt darueber hinweg, und was
     unten war, steht ploetzlich im Auslauf. Bei 390 px ist genau das
     passiert — „Überspringen" stand auf 2,36:1, obwohl es im Fluss das
     vorletzte Element ist.

     Mit `local` scrollt der Verlauf MIT. Der Auslauf sitzt damit immer
     am Ende des Inhalts, dort wo der Weg liegt, und nie mitten darin.
     Das ist auch die Aussage, die er tragen soll: die Seite laeuft
     unten aus. */
  background-attachment: local;
  color: var(--farbe-primaer-kontrast);
}

/* Auf dem Verlauf traegt alles Weiss. Die gedaempften Toene sind fuer
   helle Flaechen gerechnet und werden dort zu dunklen Flecken —
   leiser wird es ueber die Deckkraft. */
.einrichten--farbe .einrichten__satz,
.einrichten--farbe .einrichten__ueberspringen :is(a, button) {
  color: var(--farbe-primaer-kontrast);
  opacity: 0.82;
}

/* DER INHALT BLEIBT IN DER REINEN FLAECHE. Gemessen am 01.08.2026:
   „Überspringen" ist das letzte Element des Blattes, und auf den
   laengeren Bildschirmen rutschte es in den Auslauf — 2,36:1 bei
   390 px, 3,86:1 bei 1440.

   Der Stopp allein reicht dafuer nicht: der Inhalt ist mittig und
   waechst nach unten, also waechst er dem Auslauf entgegen. Das
   Polster haelt ihn davon ab. Es steht in dvh, weil der Auslauf in
   Prozent der Bildschirmhoehe steht — eine feste Zahl waere bei 844
   und bei 900 px eine andere Aussage.

   Nur auf den Verlaufsbildschirmen: die hellen brauchen es nicht,
   dort traegt jede Flaeche denselben Grund. */
.einrichten--farbe .einrichten__blatt {
  padding-bottom: 14dvh;
}

.einrichten--farbe .knopf--gefuellt {
  background: var(--farbe-primaer-kontrast);
  color: var(--farbe-primaer);
  border-color: var(--farbe-primaer-kontrast);
}

/* HIER STANDEN `.einrichten--farbe .weg__zeichen` UND
   `.einrichten--farbe .weg__strich` — geloescht am 02.08.2026, sie
   gehoeren zum `.weg*`-Satz aus Runde 22 (siehe die Streichung weiter
   unten) und stehen jetzt in `einrichten.css`.

   Die erste war der Befund F4 des Bauauftrags in einer Zeile:
   `background: transparent` auf den blauen Schritten machte die
   Stationen zu LEEREN RINGEN. Die Vorlage fuellt sie mit einem hellen
   Vollton-Derivat der Grundfarbe. Sie hier stehen zu lassen, waere ein
   Wettlauf um Spezifitaet mit der Regel gewesen, die sie behebt.

   Die zweite hielt den Strich auf Deckkraft 0,4; jetzt sind es 0,35
   ueber einem Grund, der nicht mehr nach Weiss auslaeuft. */

/* HIER STAND DIESELBE AUSNAHME WIE BEI `.einrichten--gruss` — gefallen am
   14.08.2026, aus demselben Grund (siehe Vermerk dort): sie stammte von
   VOR dem zweifarbigen Fokusring (05.08.2026) und erzwang einen weissen
   Ring, der seither mit dem global ohnehin weissen Saum verschmilzt —
   gemessen 2,56:1 gegen den Verlauf, keine eigene Kante mehr zwischen
   Ring und Saum. Der dunkle Ring der globalen Regel traegt auf seinem
   eigenen weissen Saum immer, unabhaengig vom Verlauf dahinter. */

/* --- Die Karte fuers Einzugsgebiet ------------------------------- */

.gebiet {
  display: flex;
  justify-content: center;
}

.gebiet__karte {
  width: 100%;
  max-width: 20rem;
  height: auto;
}

/* WEISSGRAU, wie angesagt. Auf dem Verlauf braucht die Flaeche eine
   eigene Deckkraft, sonst verschwindet sie darin. */
.gebiet__flaeche {
  fill: var(--farbe-flaeche-gedaempft);
  stroke: var(--farbe-rand-stark);
  stroke-width: 1;
}

.einrichten--farbe .gebiet__flaeche {
  fill: var(--farbe-primaer-kontrast);
  fill-opacity: 0.14;
  stroke: var(--farbe-primaer-kontrast);
  stroke-opacity: 0.5;
}

/* DER KREIS IST DIE RUECKMELDUNG. Er waechst mit jedem Druck auf Plus
   sichtbar — das ist genau das, was ein Schieberegler sonst leistet,
   nur mit Flaechen, die ein Arbeitshandschuh trifft. */
.gebiet__kreis {
  fill: var(--farbe-primaer);
  fill-opacity: 0.18;
  stroke: var(--farbe-primaer);
  stroke-width: 2;
  transition: r var(--dauer-mittel) var(--kurve);
}

.einrichten--farbe .gebiet__kreis {
  fill: var(--farbe-primaer-kontrast);
  fill-opacity: 0.25;
  stroke: var(--farbe-primaer-kontrast);
}

.gebiet__punkt {
  fill: var(--farbe-primaer);
}

.einrichten--farbe .gebiet__punkt {
  fill: var(--farbe-primaer-kontrast);
}

.gebiet__stellen {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--abstand-5);
}

/* PLUS UND MINUS ALS FLAECHEN, nicht als Regler — Abschnitt 6. */
.gebiet__knopf {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  height: 56px;
  border-radius: var(--radius-rund);
  border: var(--randbreite) solid currentcolor;
  color: inherit;
}

.gebiet__knopf:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-flaeche-gedaempft);
}

.einrichten--farbe .gebiet__knopf:is(:hover, .zeige-ueberfahren) {
  background: color-mix(in srgb, var(--farbe-primaer-kontrast) 18%, transparent);
}

.gebiet__zahl {
  margin: 0;
  min-width: 6rem;
  text-align: center;
  font-size: var(--groesse-h2);
  font-weight: 800;
  font-variant-numeric: tabular-nums;
}

.gebiet__einheit {
  font-size: var(--groesse-text);
  font-weight: var(--schrift-normal);
}

/* --- Was die KI aus der Website gelesen hat ---------------------- */

.fundliste {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--abstand-3);
}

.fundliste__zeile {
  display: grid;
  grid-template-columns: 9rem 1fr;
  gap: var(--abstand-1) var(--abstand-4);
  align-items: baseline;
}

.fundliste__wort {
  font-size: var(--groesse-klein);
  opacity: 0.75;
}

.fundliste__wert {
  font-weight: var(--schrift-halbfett);
}

/* DIE HERKUNFT STEHT DRAN. Ein vorausgefuellter Wert ohne sie ist
   eine Behauptung, die niemand geprueft hat. */
.fundliste__quelle {
  grid-column: 2;
  font-size: var(--groesse-mikro);
  opacity: 0.6;
}

/* FEINE LINIEN ALS RUHIGE STRUKTUR.
   Bei Jitter traegt der Onboarding-Hintergrund eine einzige feine
   geschwungene Linie mit den Stationen darauf — kein Raster. Ohne
   ihre Zeichnung bleibt davon die IDEE: eine Struktur, die da ist
   und nichts sagt. Senkrechte Linien im Abstand von 6 rem, in
   --farbe-rand, mit demselben Auslauf nach unten wie der Verlauf auf
   Bildschirm 1 — die Linien enden nicht, sie hoeren auf.

   6 rem, weil das breiter ist als jede Karte hier: die Linien stehen
   HINTER dem Inhalt und schneiden ihn nie in Spalten. `--farbe-rand`
   ist der leiseste Ton, den es gibt; bei 1 px auf dem Hintergrund
   ist er zu ahnen, nicht zu lesen.

   AUF EINEM PSEUDO-ELEMENT, nicht auf dem Bildschirm selbst: eine
   Maske am Bildschirm haette den INHALT mit ausgeblendet. Der
   erste Versuch tat genau das — unten waeren Knopf und Ausweg
   verschwunden, und zwar langsam genug, dass man es fuer Absicht
   haelt. */
.einrichten--hell::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background-image: repeating-linear-gradient(
    90deg,
    var(--farbe-rand) 0,
    var(--farbe-rand) var(--randbreite),
    transparent var(--randbreite),
    transparent 6rem
  );
  mask-image: linear-gradient(180deg, currentcolor 0%, currentcolor 55%, transparent 100%);
}

.einrichten__frage {
  margin: 0;
  font-size: var(--groesse-h2);
  font-weight: 800;
  line-height: 1.15;
  hyphens: manual;
}

.einrichten__satz {
  margin: 0;
  color: var(--farbe-text-gedaempft);
}

.einrichten__fuss {
  display: flex;
}

.einrichten__ueberspringen {
  margin: 0;
  text-align: center;
}

/* DIE TREFFERFLAECHE DES TEXTLINKS. Ein Verweis mitten im Text hat
   die Hoehe seiner Zeile — hier ist er der Ausweg des Bildschirms
   und muss mit dem Arbeitshandschuh zu treffen sein. */
/* SEIT DEM 15.08.2026 AUCH EIN `<button>`. „Ueberspringen" war ein Verweis
   auf `?schritt=`, und die Abfrage faellt aus der Adresse — ein Knopf sagt
   im Koerper, was gemeint ist. `:is(a, button)` statt einer zweiten Regel:
   zwei Regeln fuer dasselbe Aussehen laufen auseinander. Die vier
   Ruecksetzungen darunter sind noetig, weil der Ruecksetzer der Stilvorlage
   Knoepfen nur `font: inherit` gibt. */
.einrichten__ueberspringen :is(a, button) {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  padding: var(--abstand-3) var(--abstand-4);
  border: 0;
  background: none;
  cursor: pointer;
  text-decoration: underline;
  color: var(--farbe-text-gedaempft);
}

/* --- Der Weg: GELOESCHT am 02.08.2026 -----------------------------

   Hier stand der `.weg*`-Satz aus Runde 22 — 275 Zeilen: der Streifen,
   die Kurve, die drei Plaetze in Prozent, die Kreise und ihre
   Zustaende. Er ist ERSETZT, nicht ergaenzt, und steht jetzt
   vollstaendig in `oeffentlich/einrichten.css`.

   WARUM ER GANZ WEG MUSSTE UND NICHT NUR ZUR HAELFTE. Die zweite
   Fassung des Bauauftrags (BAUAUFTRAG-02-ONBOARDING-V2) hat die
   Grundlage ausgewechselt, nicht die Werte nachgezogen:

     die Kurve ist ein voller Sinus statt einer monotonen Rutsche,
     der Streifen ist fest 1520 x 144 statt fluid,
     die Stationen sitzen auf `offset-path` statt auf `left`/`top`,
     die Kreise sind gefuellt statt leer, im Verhaeltnis 2 statt 3,24.

   Zwei Saetze fuer dieselben Selektoren waeren damit kein Ergaenzen,
   sondern ein Wettlauf um Spezifitaet — und der Naechste haette beide
   fuer gueltig gehalten. Genau der Fall, den PRUEFUNGEN.md als
   „Ballast, den der Naechste fuer gueltig haelt" fuehrt.

   `.weg__strich--gekippt` faellt ersatzlos weg. Runde 22 hatte
   gemessen, dass die Nachbarn bei jedem Schritt die Seite wechseln,
   und dafuer die Kurve an der Mittelhoehe gespiegelt. Die Beobachtung
   war richtig, die Ursache nicht: mit dem vollen Sinus und drei
   Plaetzen auf FESTER Bogenlaenge (13,18 / 50 / 86,82 %) ergibt sich
   dasselbe Bild von selbst. Das Markup gibt die Klasse seit dem
   02.08.2026 nicht mehr aus.

   ACHTUNG, EINE FOLGE STEHT NOCH OFFEN: die Werkstatt laedt nur
   `werkstatt.css` (`werkstatt.ts`, `stile:`), also weder
   `einrichten.css` noch `einrichten-tokens.css`. Ihre Vorschau von
   Bereich 02 zeigt den Weg deshalb ohne Stil. Das ist gemeldet und
   gehoert der Instanz, der `werkstatt.ts` und `tokens.css` gehoeren —
   siehe ABDECKUNG.md, Runde 27. */

/* --- 3 · Die Zielwahl: GELOESCHT am 01.08.2026 ---------------------

   Hier standen `.zielwahl*` — die vier Zielflaechen als Verweise, die
   sofort weiterschalteten. Sie gehoerten zu `zielwahl()` in
   `einrichten.ts`, und der Baustein rendert seit dem Neubau des
   Quartals-Wizards nirgends mehr: dort ist die Wahl ein Radio-Knopf,
   weil sie ausdruecklich NICHT mehr sofort weiterschalten soll.

   Dieselbe Entscheidung wie beim toten Kopf-Entwurf der Tafel in
   Runde 19, und aus demselben Grund: eine Regel, die nichts mehr
   trifft, ist kein Beleg — sie ist Ballast, den der Naechste fuer
   gueltig haelt. Der Bau steht in der Versionsgeschichte, der Grund
   hier. Der Nachfolger heisst `.wahl*` und steht in BEREICH 16. */

/* ===================================================================
   DER QUARTALS-WIZARD (vormals Bereich 16) — GELOESCHT AM 12.08.2026
   ===================================================================

   Hier standen rund 841 Zeilen: `.wizard*`, `.wahl*`, `.bogen*`,
   `.anstoss__*`, `.band__feld` — die ganze Haltung „Der Bogen".

   IHR BAUSTEIN IST WEG. `src/oberflaeche/ablauf.ts` ist am 12.08.2026 auf
   Ansage geloescht worden („der aktuelle Wizard kann geloescht werden"),
   1.493 Zeilen. Die Stilvorlage ist damals stehengeblieben — gefunden hat
   es der Audit-Lauf (`npm run audit`) mit 40 toten Klassen an einem Ort.

   DAS IST DIE REGEL AUS RUNDE 19, zum dritten Mal angewandt: eine Regel,
   die nichts mehr trifft, ist kein Beleg — sie ist Ballast, den der
   Naechste fuer gueltig haelt. Der Bau steht in der Versionsgeschichte,
   der Grund hier.

   ER TRAEGT DAS WORT `BEREICH 16` NICHT MEHR IN GROSSBUCHSTABEN, und das
   ist kein Schoenheitsfehler: die Wache in `tests/huelle.test.ts` trennt
   die Datei an genau diesem Wort. Ein Grabstein mit Banner waere ein
   Bereich, der alles Nachfolgende einsammelt — sie hat daraufhin vier
   Kollisionen gemeldet, von denen eine keine war.

   WAS DIE PLANUNG HEUTE TRAEGT, steht in `einrichten.css`: der Ablauf ist
   seit dem 12.08.2026 derselbe wie das Onboarding, unter
   `/quartalplanen`. Wer den Bogen zurueckholen will, holt ihn aus
   `git show cac1b35^` — nicht aus dieser Datei. */

/* ===================================================================
   EIN ABLAUF BRAUCHT DIE 240 PX LUFT NICHT — 03.08.2026
   ===================================================================

   GEFUNDEN VON ZWEI MESSUNGEN, nicht im Bild, und beide sagen dasselbe:

     hochladen.spec  „Schritt 2 passt auf einen Bildschirm": der Knopf
                     endete bei 960 px in einem 900-px-Fenster.
     quartal.spec    „die Handlung des Bildschirms steht ohne Bildlauf
                     da": „Weiter" endete bei 1105 px.

   DIE URSACHE IST DIESELBE UND SIE IST MEINE. Jitters Luft über allem
   (240 px) ist für einen LISTENBILDSCHIRM gemessen, auf dem das Dokument
   scrollt — die 240 px scrollen dort weg. Unsere Hülle ist 100 dvh hoch,
   und ein Ablauf, der auf EINEN Bildschirm passen muss, verliert sie
   ersatzlos: 240 + 50 (Titel) + 60 (Luft) = 350 px von 900.

   Der Zuschnitt-Rahmen bemisst sich zudem an der FENSTERhöhe (48vh), und
   die ist seitdem viel größer als der Platz, den er wirklich hat. Genau
   diese Falle steht als Kommentar über `.zuschnitt__rahmen` — nur
   andersherum: dort war die Werkstattprobe größer als die echte Seite.

   WAS EIN ABLAUF IST, steht nicht in einer Liste, sondern am Markup: er
   trägt seine eigene Schrittführung und seinen eigenen Ausweg. Beide
   Kennzeichen sind schon da — `.wizardseite` und `.zuschnitt`.

   ─────────────────────────────────────────────────────────────────────
   NACHGETRAGEN AM 03.08.2026: ES SIND NICHT NUR ABLÄUFE.

   Gemeldet wurde „ich kann im Posteingang nicht runterscrollen, obwohl
   der Sendenknopf abgeschnitten ist". Nachgemessen bei 1440×760: das
   Dokument steht (`overflow: hidden`, 100 dvh — so gebaut), die Blase
   bricht bei 670 px ab, das Antwortfeld endet bei 736, und der
   Sendenknopf liegt vollständig unter der Fensterkante.

   DIE URSACHE IST DIESELBE WIE OBEN, nur an einem anderen Bildschirm:
   128 (Kopf) + 240 (Luft) + 90 (Titel) + 56 (Filterzeile) = 514 px von
   760 sind vergeben, bevor das Gespräch anfängt. Es braucht aber Kopf,
   Verlauf, Feld und Knopf — zusammen rund 290.

   Und der Fehler ist hier SCHLIMMER als bei einem Ablauf: ein Ablauf
   verliert einen Knopf, den man auch mit der Tabulatortaste erreicht.
   Hier verliert man die Handlung, um derentwillen man die Seite
   überhaupt geöffnet hat — antworten.

   DAS KENNZEICHEN STAND AUCH HIER SCHON IM MARKUP: `data-bildlauf`
   sagt, dass dieser Bildschirm seinen Bildlauf SELBST führt. Genau das
   heißt, dass das Dokument nicht scrollt — und damit, dass jede feste
   Luft davor ein ersatzloser Abzug ist. Die Regel liest also das, was
   ohnehin dasteht, statt eine zweite Liste von Seiten zu führen, die
   jemand nachpflegen müsste. */
/* DER POSTEINGANG IST HIER AUSGENOMMEN — 10.08.2026, angesagt
   ===========================================================

   „bitte noch den Abstand von Posteingang, also der Überschrift, zum Header
   erhöhen wie bei der Übersicht-Seite."

   Gemessen stand der Seitentitel des Posteingangs bei y 137, der aller
   anderen Seiten bei y 240 — 103 px Unterschied, sichtbar bei jedem Wechsel
   in der Navigation. Ursache war `[data-bildlauf='eigen']`: das steht am
   `ul` der Nachrichtenliste, und die Regel hier war nie für den Posteingang
   gemeint, sie hat ihn nur mitgefangen.

   DIE DRITTE BEDINGUNG IST GANZ GEFALLEN. Sie lautete
   `:has([data-bildlauf='eigen'])` und war nie für den Posteingang
   gedacht — sie hat ihn nur mitgefangen. Gemeint waren Wizard und
   Zuschnitt, und die stehen ausdrücklich daneben. Seit der Posteingang
   als Dokument rollt, trägt seine Liste die Marke ohnehin nicht mehr;
   was bliebe, wäre der Verlauf des Gesprächs am Handy — und dort deckt
   die Überlagerung die ganze Seite ab, der Abstand oben ist also gar
   nicht zu sehen. Eine Bedingung, die nur noch einen Fall trifft, in dem
   sie nichts bewirkt, ist keine.

   Wizard und Zuschnitt behalten die gerechnete Luft. Sie haben keinen
   Seitentitel, für den der Abstand zählt, und sie sind die Fälle, für die
   diese Regel gebaut wurde. */
body.traegt-huelle:has(.zuschnitt) .spalte__inhalt {
  /* NICHT `--abstand-5`, WIE HIER BIS ZUM 03.08.2026 STAND. Der Kopf
     haengt am FENSTER (`position: fixed`) und liegt damit nicht im Fluss:
     24 px Polster schoben den Seitentitel unter die Wortmarke, und im
     Bild las sich „Posteingang" quer durch „Engelhardt & Bauer".

     Aufgefallen ist es erst, als die Regel einen Bildschirm MIT Titel
     bekam — die Ablaeufe haben keinen. Der Fehler lag also die ganze
     Zeit hier und war nur nirgends zu sehen.

     `--kopf-luft-eng` rechnet aus, was der Kopf wirklich belegt. */
  padding-top: var(--kopf-luft-eng-schmal);
}

@container huelle (min-width: 45rem) {
  body.traegt-huelle:has(.wizardseite) .spalte__inhalt,
  body.traegt-huelle:has(.zuschnitt) .spalte__inhalt {
    padding-top: var(--kopf-luft-eng);
  }
}

/* Und der Seitentitel tritt zurück: der Ablauf sagt selbst, wo man ist.
   Er bleibt im Markup — `aria-labelledby` und die Vorlesefolge hängen
   daran —, nur ohne die 60 px Luft und in der Größe einer Zwischenzeile. */
/* DER SEITENTITEL TRITT IN ABLAEUFEN ZURUECK — und seit dem 03.08.2026
   nicht nur im Zuschnitt, sondern auch im Wizard.
   
   GEFUNDEN VON `quartal.spec`: „Weiter" endete auf Schritt „ziel" bei
   972 px in einem 900-px-Fenster. Die Ursache war meine eigene Aenderung
   von heute frueh — die Luft ueber dem Inhalt ging fuer Ablaeufe von
   24 auf 144 px, weil sie vorher den Titel unter die Wortmarke schob.
   Was oben dazukam, fiel unten heraus.
   
   Der Titel darf hier klein sein: die Schrittanzeige („Schritt 1 von 7")
   sagt genauer, wo man ist, als eine Ueberschrift es koennte. Er bleibt
   im Markup — `aria-labelledby` und die Vorlesefolge haengen daran. */
body.traegt-huelle:has(.zuschnitt) .seitentitel {
  font-size: var(--groesse-h3);
  margin-bottom: var(--abstand-4);
}

body.traegt-huelle:has(.wizardseite) .inhalt {
  padding-bottom: 0;
}

/* HIER VERSTECKTE EINE REGEL `.inhalt__titel` — gefallen am 11.08.2026.

   Die Klasse gibt es nicht mehr: der Seitentitel heißt seit dem Umbau der
   Hülle `.seitentitel` und steht außerhalb von `.inhalt`. Die Regel hat
   seither nichts mehr versteckt.

   SIE WIRD NICHT AUF DEN NEUEN NAMEN GEZOGEN, und das ist die Entscheidung
   dahinter: der Wizard hat eine eigene Seite ohne Hülle. Was er verstecken
   wollte, steht dort gar nicht erst. Eine Regel, die einen Zustand
   herstellt, den es ohnehin gibt, ist keine Abhilfe — sie ist ein zweiter
   Ort für dieselbe Aussage. */


/* HIER STAND `.mediaday__fuss` — die Pille „Termin verschieben" unter der
   Media-Day-Karte. Die Karte ist am 11.08.2026 eine Bento-Kachel geworden,
   und dort ist der Weg die Weg-Zeile der Kachel: die ganze Kachel ist der
   Verweis, und ein Verweis im Verweis gibt es im Markup nicht. */

/* ===================================================================
   QUERSCHNITT Q8 — die Schnittkante. GANZ AM ENDE, und das ist der Punkt.

   WARUM HIER UND NICHT OBEN BEI DER ERKLAERUNG. Beim ersten Lauf stand
   dieser Satz oben zwischen den Grundregeln, und P2 meldete prompt
   einen Behaelter ohne Zeichen: `section.beitragsblatt` bei 390 px,
   180 px verborgen. Die Ursache war kein Tippfehler, sondern die
   Kaskade — `.beitragsblatt` setzt weiter unten `background: …` als
   Kurzform, und eine Kurzform setzt `background-image` mit zurueck.
   Gleiche Spezifitaet, spaetere Regel: der Einzelfall gewinnt.

   Eine Regel, die fuer ALLE Behaelter gilt, muss deshalb NACH den
   Einzelfaellen stehen. Und sie fasst nur die Bild-Langformen an, nie
   die Kurzform: so behaelt jeder Behaelter seine eigene Flaechenfarbe
   und bekommt trotzdem die Kante.

   WER SEINE FLAECHE SETZT, SETZT AUCH SEINE KANTE. Das ist die
   Schwester der Regel aus Runde 23 („wer seine Flaeche setzt, setzt
   auch seine Schrift"): die deckende Lage muss die Farbe treffen, auf
   der der Behaelter wirklich liegt. `--grund-darunter` kommt vom
   Inhaltskasten — Seitengrund bei 390 px, weisse Karte ab 45 rem —,
   und ein Behaelter mit eigener Flaeche ueberschreibt sie bei sich.
   =================================================================== */

[data-bildlauf='eigen'] {
  overflow-y: auto;

  /* VIER LAGEN, ZWEI AUFGABEN. Die beiden `local`-Lagen bewegen sich
     MIT dem Inhalt und decken den Schatten ab, sobald man oben bzw.
     unten angekommen ist; die beiden `scroll`-Lagen stehen still und
     zeichnen ihn. Zusammen ergibt das ein Zeichen, das genau dann da
     ist, wenn wirklich etwas folgt — und verschwindet, wenn nicht.
     Ein Zeichen, das immer steht, sagt nichts.

     Die Reihenfolge zaehlt: die deckenden Lagen liegen VOR den
     Schattenlagen, sonst laege der Schatten ueber der Abdeckung. */
  background-image:
    linear-gradient(var(--grund-darunter, var(--farbe-flaeche)) 30%, transparent),
    linear-gradient(transparent, var(--grund-darunter, var(--farbe-flaeche)) 70%),
    radial-gradient(farthest-side at 50% 0, var(--schleier-kante), transparent),
    radial-gradient(farthest-side at 50% 100%, var(--schleier-kante), transparent);
  background-position: top, bottom, top, bottom;
  background-size:
    100% var(--ausblendkante),
    100% var(--ausblendkante),
    100% var(--kantenschatten),
    100% var(--kantenschatten);
  background-repeat: no-repeat;
  background-attachment: local, local, scroll, scroll;

  /* Ein Bildlauf, der ueber seine Grenze hinausschiebt, zieht die
     Seite darunter mit. Bei einer Huelle, die 100dvh hoch ist, ist
     das nie gewollt. */
  overscroll-behavior: contain;
}

/* Behaelter mit EIGENER Flaeche sagen, welche es ist. Ohne die Zeile
   traegt der Verlauf hier die Farbe des Inhaltskastens — bei 390 px
   also ein grauer Streifen auf weissem Blatt. */
.beitragsblatt,
.hochladen,
.konto {
  --grund-darunter: var(--farbe-flaeche);
}

/* DIE EINSTELLUNGEN LIEGEN NICHT AUF WEISS, und bis zum 04.08.2026 stand
   ihr Name in der Zeile darueber. Seit dem 03.08. traegt diese Seite als
   einzige den gedaempften Grund — Jitters `_accountBody_`, das Kennzeichen
   EINES Bereichs. Eine weisse Abdeckung darauf waere ein heller Streifen
   auf grauem Grund gewesen: das Zeichen haette nicht abgedeckt, sondern
   selbst eine Kante gezogen.

   Aufgefallen ist es erst, als die Kante ueberhaupt wieder erschien —
   solange die Kurzform oben sie ausgeschaltet hat, war auch dieser Wert
   folgenlos. Zwei Fehler, von denen der zweite den ersten verdeckt hat. */
.einstellungen {
  --grund-darunter: var(--farbe-flaeche-gedaempft);
}

/* WAS EIN VERLAUF SCHON SELBST SETZT, DARF DIE REGEL OBEN NICHT
   ERSETZEN — und der erste Anlauf hat vorgefuehrt, warum das keine
   Feinheit ist.

   `.einrichten--farbe` (Bereich 02) hat sein eigenes
   `background-image`: den violetten Verlauf mit sieben Stopps, an dem
   der ganze Bildschirm haengt. Die Regel oben ist gleich spezifisch
   und steht spaeter — also hat sie ihn ERSETZT. Der Verlauf war weg,
   und mit ihm der Grund, gegen den dort weisse Schrift gerechnet ist:
   die Lesbarkeitsmessung meldete prompt 1,06:1 an dreizehn Stellen
   und die Fokusmessung 1,06:1 am gefuellten Knopf. Kein Bild haette
   das anders gezeigt — der Bildschirm war einfach weiss.

   ZWEI LEHREN, und die zweite ist die groessere:
     · Eine Regel ueber `[data-attribut]` faellt in dieselbe
       Spezifitaetsklasse wie eine Klasse. „Am Ende der Datei" reicht
       gegen 0,1,0 nur, solange das Element die Eigenschaft nicht
       selbst setzt.
     · Auf einem VERLAUF gibt es keine abdeckende Farbe. Die deckende
       Lage muesste die Flaeche darunter treffen, und die ist an jeder
       Hoehe eine andere; jeder feste Wert waere an genau einer Stelle
       richtig. Weisse Schrift auf einem halbweissen Streifen ist
       genau der Fall, den Regel 11 rechnerisch verbietet.

   Bereich 02 bleibt in dieser Runde unangefasst (er kommt als Ganzes
   neu). Die Kante fehlt dort damit weiter — der Befund steht im
   Quelltext von `einrichten.ts`, mit der Zahl. */

/* DIE BILDLAUFLEISTE — nur dort, wo es eine gibt.

   §Q8.2 verlangt sie dauerhaft sichtbar: „Eine Leiste, die erst beim
   Ueberfahren erscheint, gibt es am Handy nicht — und am Laptop sieht
   der Meister sie nicht, weil er nicht danach sucht."

   AM HANDY IST DAS ABER DAS FALSCHE MITTEL, und das ist kein
   Geschmack: mit dem Finger gibt es keine Leiste zum Ziehen, sie
   waere reine Anzeige — und ein dauerhafter Streifen am rechten Rand
   war genau der Eindruck „hier hat jemand ein Bauteil vergessen", aus
   dem sie in Runde 19 verschwunden ist. Dort traegt der Verlauf die
   ganze Auskunft.

   `pointer: fine` trennt beides an der Ursache statt an der Breite:
   ein Zeigergeraet kann die Leiste greifen, ein Finger nicht.
   `stable` haelt die Spur frei, damit der Inhalt nicht um die
   Leistenbreite springt, sobald eine Zeile dazukommt. */
@media (pointer: fine) {
  [data-bildlauf='eigen'] {
    scrollbar-width: thin;
    scrollbar-gutter: stable;
  }
}

/* ===================================================================
   QUERSCHNITT Q4 — der Gedrueckt-Zustand, ueber alle Bedienelemente

   §Q4: „Gedrueckt fehlt im ganzen Produkt. Ohne Skript ist der Ripple
   nicht ueberall zu haben, also ist `:active` die einzige
   Rueckmeldung, die der Meister auf einen Druck bekommt."

   GEMESSEN VON P7 am 01.08.2026: von 22 Arten von Bedienelementen im
   Produkt hatten SECHS einen Gedrueckt-Zustand, sechzehn keinen.

   ZWEI BAUARTEN, UND DER UNTERSCHIED IST DIE GROESSE:

     Flaechen und Karten   `scale(.98)` und der Schatten weg. Bei
                           einer 216 x 48 px grossen Zeile sind das
                           4,3 px Bewegung — genug, um gesehen zu
                           werden, zu wenig, um zu stoeren.
     Zeilen in einer Liste `translateY(1px)`. Ein Massstab auf einer
                           Zeile, die neben ihresgleichen steht, laesst
                           die Nachbarn wackeln; ein Pixel nach unten
                           tut das nicht. So steht es auch in der
                           Bewegungstabelle von Kapitel 10.

   `.zeige-aktiv` steht ueberall daneben: die Werkstatt setzt die
   Klasse, damit der Zustand ohne Maus messbar ist. Ohne sie waere
   jede Messung darauf eine Hoffnung.
   =================================================================== */

/* NACHGEZOGEN AM 03.08.2026: `.leiste__marke` heisst jetzt `.kopf__marke`
   und steht in der Kopfzeile; `.profilzeile` ist gefallen. Zwei Waehler, die
   nichts mehr getroffen haetten. Dazugekommen sind der Ausloeser der
   Schublade und das Kontobild — beide sind anklickbare Zeilen im Sinn dieser
   Regel. */
/* NACHGEZOGEN AM 04.08.2026: das Wort der Seitenwahl. P7 hat es gemeldet,
   und es stand nicht in dieser Liste, weil es sie noch nicht gab, als die
   Seitenwahl am 03.08. in die Kopfzeile zog.

   HIER STEHT EINE BEWEGUNG UND KEINE FARBE, und das ist nicht Bequemlichkeit:
   der Ueberfahren-Zustand dieses Wortes ist am 04.08. gefallen, weil er ueber
   Deckkraft gebaut war und 1,60:1 hielt. Ein Gedrueckt-Zustand ueber die
   Flaeche haette dasselbe Problem an einer anderen Stelle — das aktive Wort
   sitzt auf dunklem Vollton und traegt helle Schrift, eine getoente Lage
   darueber wuerde genau diese Schrift angreifen. `translateY` fasst weder
   Farbe noch Deckkraft an und faellt damit unter keine der beiden Regeln.

   Der gefallene Zustand galt dem UEBERFAHREN. Gedrueckt ist eine andere
   Auskunft: „ich habe deinen Druck bekommen." Sie fehlte hier ganz. */
.kopf__navi-wort:is(:active, .zeige-aktiv),
.kopf__marke:is(:active, .zeige-aktiv),
.kopf__schublade:is(:active, .zeige-aktiv),
.kopf__konto:is(:active, .zeige-aktiv),
.kopf__knopf:is(:active, .zeige-aktiv),
.reiter__eintrag:is(:active, .zeige-aktiv),
.konto__weg:is(:active, .zeige-aktiv),
.hilfe__weg:is(:active, .zeige-aktiv),
.drive__zurueck:is(:active, .zeige-aktiv),
.sprungmarke:is(:active, .zeige-aktiv),
/* NACHGETRAGEN AM 14.08.2026: drei Woerter derselben Bauart
   (inline-flex, `--hoehe-navi-wort`/44 px, Text statt Flaeche) fehlten
   in dieser Liste — `filterzeile__weitere` und `inhaltskachel__weg`
   sind Verweise in genau dieser Form, `verlauf__takt-wort` der
   Monate/Wochen-Umschalter mit denselben Token. Dieselbe Bewegung wie
   `reiter__eintrag`, aus demselben Grund. */
/* `filterzeile__weitere` HEISST SEIT DEM 18.08.2026 `filterweg`, und der
   Filterknopf ist dazugekommen: „jede Art von Bedienelement hat einen
   Gedrueckt-Zustand" (P7) hat ihn beim ersten Lauf gemeldet — ein `<summary>`
   ist ein Bedienelement wie jedes andere. */
.filterwahl__knopf:is(:active, .zeige-aktiv),
.filterweg:is(:active, .zeige-aktiv),
.inhaltskachel__weg:is(:active, .zeige-aktiv),
.verlauf__takt-wort:is(:active, .zeige-aktiv) {
  transform: translateY(1px);
  transition: transform var(--dauer-schnell) var(--kurve);
}

.tafelkarte:is(:active, .zeige-aktiv),
.datei__flaeche:is(:active, .zeige-aktiv),
.ordner__flaeche:is(:active, .zeige-aktiv),
.galerie__flaeche:is(:active, .zeige-aktiv),
.chip:is(:active, .zeige-aktiv),
.schalter__knopf:is(:active, .zeige-aktiv) {
  transform: scale(.98);
  box-shadow: none;
  transition: transform var(--dauer-schnell) var(--kurve),
              box-shadow var(--dauer-schnell) var(--kurve);
}


/* SIE DARF UMBRECHEN — gefunden am 04.08.2026 im Abschlussdurchgang.
   Gemessen auf `/posteingang?nachricht=n-2` bei 390 px: die Leiste lief bis
   x = 456 in einem 390-px-Fenster, 66 px Querscroll auf dem Bildschirm, auf
   dem der Meister 90 % seiner Zeit verbringt.

   ER WAR VORHER VERDECKT, wie die vier anderen dieser Klasse (Frage 11 in
   `rueckfragen-an-ceo.md`): `overflow-y: auto` an `.inhalt` fing den
   waagerechten Ueberlauf mit ein. Seit Baustelle 0.1 steht er da.

   `margin-left: auto` BLEIBT und tut, was es soll — die Leiste rechts halten,
   solange Platz ist. `flex-wrap` greift erst, wenn keiner mehr da ist. */
.gespraech__handlungen {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: var(--abstand-1);
  margin-left: auto;
  /* Ohne das bleibt sie so breit wie ihr Inhalt und bricht nie um: eine
     Flex-Zeile ist von sich aus `min-width: auto`. Derselbe Fund wie an
     `.zeile__mitte` und `.ziele__raster`. */
  min-width: 0;
}

/* ===================================================================
   BEREICH 20 · IMPRESSUM UND DATENSCHUTZ — 03.08.2026
   ===================================================================

   Zwei Seiten ohne Huelle: sie muessen nach § 5 DDG „leicht erkennbar,
   unmittelbar erreichbar und staendig verfuegbar" sein, also auch ohne
   Anmeldung. Eine Navigation, die eine Anmeldung voraussetzt, waere hier
   ein Weg ins Leere.

   DER TEXT IST LESESPALTE UND SONST NICHTS. Rechtstexte werden am Stueck
   gelesen, nicht ueberflogen — hier gilt die Lesebreite strenger als
   ueberall sonst. */
.rechtstext {
  min-height: 100dvh;
  padding: var(--abstand-7) var(--abstand-5);
  background: var(--farbe-hintergrund);
}

.rechtstext__blatt {
  max-width: var(--breite-text-max);
  margin: 0 auto;
}

.rechtstext__ueberschrift {
  margin: 0 0 var(--abstand-5);
  font-size: var(--groesse-seitentitel);
  font-weight: 800;
  line-height: 1.04;
  letter-spacing: var(--laufweite-eng);
}

/* DER HINWEIS AUF DIE LUECKEN steht oben und faellt auf. Er verschwindet
   von selbst, sobald `FEHLENDE_ANGABEN` leer ist — die Bedingung steht in
   `rechtstexte.ts` und nicht hier. */
.rechtstext__warnung {
  margin: 0 0 var(--abstand-6);
  padding: var(--abstand-4);
  border-radius: var(--radius-mittel);
  background: var(--farbe-warnung-hell);
  color: var(--farbe-warnung);
  font-weight: var(--schrift-halbfett);
}

.rechtstext__teil {
  margin-bottom: var(--abstand-6);
}

.rechtstext__titel {
  margin: 0 0 var(--abstand-3);
  font-size: var(--groesse-h3);
  font-weight: var(--schrift-halbfett);
  letter-spacing: var(--laufweite-eng);
}

.rechtstext__satz {
  margin: 0 0 var(--abstand-3);
  line-height: var(--zeilenhoehe-weit);
}

/* Die Verweise im Text standen in Browser-Blau — die einzige Farbe im
   Produkt, die aus keinem Token kommt. Sie tragen jetzt die
   Primaerfarbe und behalten ihre Unterstreichung: in einem Rechtstext
   ist der Unterschied zwischen Text und Verweis wichtiger als die
   Ruhe. */
.rechtstext__satz a {
  color: var(--farbe-primaer);
}

/* AUFZAEHLUNGEN IM AVV — 18.10.2026. Art der Daten, Betroffene, Massnahmen:
   je ein Punkt, gelesen wie ein Satz, deshalb dieselbe Zeilenhoehe. */
/* `list-style` STEHT DA, weil die Grundstellung sie allen Listen nimmt —
   angesehen bei 390 px: eingerueckter Text ohne Punkt, der wie ein
   Versehen aussah. */
.rechtstext__liste {
  margin: 0 0 var(--abstand-3);
  padding-left: var(--abstand-5);
  line-height: var(--zeilenhoehe-weit);
  list-style: disc;
}

.rechtstext__liste li + li {
  margin-top: var(--abstand-2);
}

/* EINE FEHLENDE ANGABE. Sie ist absichtlich nicht zu uebersehen: ein
   Impressum mit erfundener Anschrift ist schlimmer als eines mit einer
   sichtbaren Luecke. `<mark>` traegt die Bedeutung schon mit — ein
   gefaerbter `<span>` waere Farbe ohne Auskunft. */
.luecke {
  padding: 0 var(--abstand-1);
  border-radius: var(--radius-klein);
  background: var(--farbe-warnung-hell);
  color: var(--farbe-warnung);
  font-weight: var(--schrift-halbfett);
}

.rechtstext__stand,
.rechtstext__zurueck {
  margin: var(--abstand-5) 0 0;
  color: var(--farbe-text-gedaempft);
  font-size: var(--groesse-klein);
}

/* Der Fuss der Anmeldeseite: die zwei Pflichtverweise, ausserhalb der
   Karte. Sie gehoeren nicht zum Anmelden, sondern zur Seite — deshalb
   stehen sie darunter und nicht darin. */
.anmeldung__fuss {
  display: flex;
  justify-content: center;
  gap: var(--abstand-2);
  margin-top: var(--abstand-5);
  color: var(--farbe-text-gedaempft);
  font-size: var(--groesse-klein);
}

.anmeldung__fuss a {
  color: var(--farbe-text-gedaempft);
}

/* ===================================================================
   DIE DREI HANDLUNGEN IM GESPRAECHSKOPF — 03.08.2026
   ===================================================================

   Erledigt, Archivieren, Loeschen. Sie stehen rechts im Kopf, weil dort
   Platz ist und weil sie zum GESPRAECH gehoeren und nicht zur Liste.

   `knopf--still` ist die leise Form: kein Vollton, kein Umriss, nur
   Text. Drei gefuellte Knoepfe nebeneinander waeren drei Aufforderungen
   in einem Kopf, in dem eigentlich nur eine Nachricht stehen soll. */
.gespraech__handlung {
  display: flex;
  margin: 0;
}

.knopf--still {
  min-height: var(--hoehe-knopf-leise);
  min-width: 0;
  padding-inline: var(--abstand-3);
  border-color: transparent;
  background: transparent;
  color: var(--farbe-text-gedaempft);
  font-size: var(--groesse-klein);
}

.knopf--still:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-flaeche-gedaempft);
  color: var(--farbe-text);
}

/* GESETZT: der Knopf sagt, dass sein Zustand gilt. `aria-pressed` traegt
   dasselbe fuer Vorleseprogramme — die Flaeche allein waere Farbe ohne
   Auskunft. */
.knopf--still.knopf--an {
  background: var(--farbe-navi-flaeche);
  color: var(--farbe-primaer);
}

/* LOESCHEN TRAEGT SEINEN EIGENEN TON, und zwar erst beim Ueberfahren.
   Dauerhaft rot waere eine Warnung, die immer leuchtet und deshalb
   niemanden mehr erreicht; beim Ueberfahren ist sie da, wo die Hand
   schon hinzeigt. */
.knopf--still.knopf--gefahr {
  background: transparent;
  color: var(--farbe-text-gedaempft);
}

.knopf--still.knopf--gefahr:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-fehler-hell);
  color: var(--farbe-fehler);
}

/* ===================================================================
   „ERLEDIGT" IST GRUENLICH — 18.08.2026, angesagt
   ===================================================================

   „Loeschen ist rot, das ist selten. Archivieren kann grau bleiben. Erledigt
   sollte vielleicht gruenlich sein."

   DIESELBE BAUART WIE DIE GEFAHRENVARIANTE zwei Regeln hoeher, nur mit dem
   anderen Ton: RUHEND GRAU, beim Anfassen faerbt sich die Flaeche. Das ist
   die Form, die das Haus fuer leise Knoepfe mit einer Aussage gefunden hat —
   die Farbe steht bereit, draengt sich aber nicht in eine Kopfzeile mit drei
   Knoepfen nebeneinander.

   DREI TOENE UND NICHT DREI FARBEN: Erledigt gruen, Archivieren grau,
   Loeschen rot. Grau ist dabei kein fehlender Ton, sondern die Aussage
   „nichts passiert Endgueltiges" — archivieren holt man zurueck.

   `--farbe-erfolg` HAELT 5,54:1 auf `--farbe-erfolg-hell`, gerechnet aus
   tokens.css (#127A4B auf dem hellen Erfolgston). Ueber den 4,5:1 fuer
   Schrift. */
.knopf--still.knopf--erfolg {
  background: transparent;
  color: var(--farbe-text-gedaempft);
}

.knopf--still.knopf--erfolg:is(:hover, .zeige-ueberfahren) {
  background: var(--farbe-erfolg-hell);
  color: var(--farbe-erfolg);
}

/* Die Wortmarke auf der Anmeldeseite. Sie ist dort groesser als in der
   Kopfzeile (40 px), weil sie dort das einzige Zeichen der Herkunft ist
   — in der Huelle steht die ganze Anwendung drumherum. */
.wortmarke__bild {
  display: block;
  width: auto;
  height: var(--marke-anmelden);
  margin: 0 auto;
}
