/* ===========================================================================
   KUPA · Die Bausteine — jedes Ding genau einmal
   ===========================================================================

   Setzt `token.css` voraus. Benutzt AUSSCHLIESSLICH Token, keinen einzigen
   festen Wert — wer hier eine Zahl oder Farbe direkt hinschreibt, hebelt den
   Dunkelmodus aus und baut die Unruhe wieder auf, die gerade weggeräumt wird.

   ---------------------------------------------------------------------------
   WOFÜR ES DIESE DATEI GIBT

   Am 09.09.2026 gab es im Template acht Fassungen für „Kasten mit Inhalt"
   (.bipro-box .desc-box .hinweis-box .meldung-box .rueck-box .person-card
   .vb-karte .kpi) und vier für „Tabelle". Keine davon ist falsch; jede ist
   für ihren Fall gebaut. Zusammen ergeben sie das Unruhige, das man sieht,
   ohne es benennen zu können: Dieselbe Sache sieht an drei Stellen anders
   aus, und das Auge sucht nach einem Unterschied, den es nicht gibt.

   Sieben Bausteine ersetzen das:

     .karte    ein Kasten mit Inhalt          (ersetzt die acht Fassungen)
     .tabelle  eine Tabelle                   (ersetzt die vier)
     .marke    Etikett mit Zustand            (aus .badge weiterentwickelt)
     .chip     Filter/Umschalter zum Klicken  (aus .chip weiterentwickelt)
     .balken   Anteil oder Verlauf
     .klappe   auf- und zuklappbarer Bereich
     .leiste   Reihe von Bedienelementen

   Sie stehen NEBEN den alten Klassen, nicht an ihrer Stelle. Umgestellt wird
   Ansicht für Ansicht (Schritt 1.2 und 1.3); erst danach fallen die alten weg.
   =========================================================================== */

/* ---------------------------------------------------------------------------
   GRUNDLAGE
   --------------------------------------------------------------------------- */
.kupa {
  font-family: var(--schrift);
  font-size: var(--t3);
  line-height: var(--zh);
  color: var(--text);
}

/* ===========================================================================
   1 · KARTE — ein Kasten mit Inhalt
   ===========================================================================
   🔴 Die Trennung kommt aus dem ABSTAND, nicht aus der Linie. Das ist der
   eine Griff, der eine Oberfläche ruhig macht: Wo heute ein Rahmen steht,
   steht künftig Weißraum. Ein Rahmen ist erst nötig, wenn zwei Flächen mit
   derselben Farbe aneinanderstoßen — und dann reicht die leiseste Linie.
   =========================================================================== */
.karte {
  background: var(--flaeche);
  border-radius: var(--r3);
  padding: var(--a4);
  box-shadow: var(--h1);
  /* Kein `border`. Der Schatten trennt schon; beides zusammen ist die
     Doppelkante, die Oberflächen billig aussehen lässt. */
}
.karte + .karte { margin-top: var(--a3); }

/* Der Kopf einer Karte: Titel links, Zahl oder Knopf rechts. */
.karte-kopf {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--a3); margin-bottom: var(--a3);
}
.karte-titel { font-size: var(--t5); font-weight: var(--fett-halb); }
/* Die Unterzeile erklärt den Titel. Sie steht NICHT in Klammern hinter ihm —
   ein Titel, der eine Klammer braucht, ist zu kurz geraten. */
.karte-sub {
  font-size: var(--t2); color: var(--text-leise); line-height: var(--zh-eng);
  margin-top: var(--a1);
}

/* Anhebbar: nur für Karten, die man wirklich anklicken kann. */
.karte.klickbar { cursor: pointer; transition: box-shadow var(--anim), transform var(--anim); }
.karte.klickbar:hover { box-shadow: var(--h2); transform: translateY(-1px); }
.karte.klickbar:active { transform: none; box-shadow: var(--h1); }

/* Betont: die eine Karte, auf die es gerade ankommt. Höchstens eine je Bild. */
.karte.betont { box-shadow: var(--h2); }

/* Ein Hinweis IN einer Karte — getönt, nicht umrandet. */
.karte-hinweis {
  background: var(--gelb-flaeche); color: var(--gelb);
  border-radius: var(--r2); padding: var(--a3);
  font-size: var(--t2); line-height: var(--zh-weit);
  margin-bottom: var(--a3);
}

/* Ein Raster aus Karten. `auto-fit` statt `auto-fill`: Bei nur einer Karte
   nimmt sie die volle Breite, statt in einer Spalte von 300 px zu stehen.
   Genau daran ist am 09.09.2026 ein 79-zeiliges Blatt zerbrochen. */
.karten { display: grid; gap: var(--a3);
          grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
.karten.breit { grid-template-columns: repeat(auto-fit, minmax(440px, 1fr)); }
/* Eine Karte, die aus der Reihe tanzen darf, weil ihr Inhalt breit ist. */
.karte.voll { grid-column: 1 / -1; }

/* ===========================================================================
   2 · ZAHL — eine Kennzahl, die allein steht
   ===========================================================================
   🔴 Eine Zahl erscheint nie allein (Regel aus dem brain\). Deshalb hat
   dieser Baustein drei Teile, und zwei davon sind Pflicht: was sie zählt,
   und woran man sie einordnet.
   =========================================================================== */
.zahl { display: flex; flex-direction: column; gap: var(--a1); }
.zahl-wert {
  font-size: var(--t7); font-weight: var(--fett);
  line-height: 1.05; font-variant-numeric: tabular-nums;
  letter-spacing: -.02em;   /* große Zahlen wirken sonst auseinandergezogen */
}
.zahl-was { font-size: var(--t2); color: var(--text-leise); }
.zahl-bezug { font-size: var(--t1); color: var(--text-still); }
.zahl.rot   .zahl-wert { color: var(--rot); }
.zahl.gelb  .zahl-wert { color: var(--gelb); }
.zahl.gruen .zahl-wert { color: var(--gruen); }

/* ===========================================================================
   3 · MARKE — Etikett mit Zustand
   ===========================================================================
   Trägt einen Zustand, ist nicht klickbar. Wer klicken können soll, nimmt
   `.chip`. Der Unterschied muss sichtbar sein, sonst klickt man ins Leere —
   der Fehler, der am 09.09.2026 dreimal gemeldet wurde.
   =========================================================================== */
.marke {
  display: inline-flex; align-items: center; gap: var(--a1);
  padding: 2px var(--a2); border-radius: var(--r1);
  font-size: var(--t1); font-weight: var(--fett);
  line-height: 1.45; white-space: nowrap;
  background: var(--grau-flaeche); color: var(--grau);
}
.marke.rot   { background: var(--rot-flaeche);   color: var(--rot); }
.marke.gelb  { background: var(--gelb-flaeche);  color: var(--gelb); }
.marke.gruen { background: var(--gruen-flaeche); color: var(--gruen); }
.marke.blau  { background: var(--blau-flaeche);  color: var(--blau); }
.marke.ruhe  { background: var(--ruhe-flaeche);  color: var(--ruhe); }
.marke.park  { background: var(--park-flaeche);  color: var(--park); }
/* Mit Kante nur dort, wo die Marke auf einer getönten Fläche sitzt und
   sonst darin verschwände. */
.marke.kante { border: 1px solid var(--grau-kante); }
.marke.rot.kante   { border-color: var(--rot-kante); }
.marke.gelb.kante  { border-color: var(--gelb-kante); }
.marke.gruen.kante { border-color: var(--gruen-kante); }
.marke.blau.kante  { border-color: var(--blau-kante); }
/* 🆕 06.10.2026 · Voll gefüllt - wo eine Marke auffallen soll („Rückmeldung
   liegt vor"). --auf-signal ist für genau diese Paare gemessen (token.css). */
.marke.blau.voll   { background: var(--blau); color: var(--auf-signal); }
/* In einer Kompass-Kachel erbt jede span die Größe der Überschrift - eine
   Marke bleibt klein und links. */
.kompass .metric .marke { font-size: var(--t1); align-self: flex-start; }

/* 🆕 05.10.2026 · „Automatisierung" - eine Marke mit Blitz an jeder Stelle,
   an der ein Programm oder die KI Arbeit vorbereitet, die ein Mensch
   freigibt. Makro `automatisierung()` in plattform/vorlagen/_format.html.
   Nur Tokens: dieselben Paare wie die KI-Marke am Vorgang, in Hell und Dunkel. */
.auto-marke {
  display: inline-flex; align-items: center; gap: var(--a1);
  padding: 2px var(--a2) 2px 3px; border-radius: var(--rund);
  font-size: var(--t1); font-weight: var(--fett); letter-spacing: .04em;
  text-transform: uppercase; line-height: 1.45; white-space: nowrap; vertical-align: middle;
  color: var(--akzent-text); background: var(--akzent-leise);
  border: 1px solid color-mix(in srgb, var(--akzent) 35%, transparent);
}
.auto-marke svg {
  width: 1.25em; height: 1.25em; padding: 3px; border-radius: 50%; box-sizing: border-box;
  fill: var(--flaeche); background: var(--akzent); flex: none;
}

/* ===========================================================================
   4 · CHIP — zum Klicken
   ===========================================================================
   Immer ein <button>. Ein <span> mit onclick ist für die Tastatur nicht
   erreichbar und für Vorleseprogramme unsichtbar.
   =========================================================================== */
.chip-reihe { display: flex; flex-wrap: wrap; gap: var(--a2); }
.chip2 {
  font: inherit; font-size: var(--t2); font-weight: var(--fett-halb);
  padding: 6px var(--a3); border-radius: var(--rund);
  border: 1px solid var(--linie); background: var(--flaeche);
  color: var(--text-leise); cursor: pointer; white-space: nowrap;
  transition: border-color var(--anim), background var(--anim), color var(--anim);
}
.chip2:hover { border-color: var(--linie-stark); color: var(--text); }
/* 🔴 Ausgewählt wird über die EINE Akzentfarbe angezeigt, nie über eine
   zweite Farbe je Ansicht. Vorher gab es dafür sechs verschiedene. */
.chip2.an {
  background: var(--akzent-leise); border-color: var(--akzent);
  color: var(--akzent-tief);
}
/* 🔴 20.09.2026: `opacity: .45` ersetzt. Gesperrt heißt zurückgenommen, nicht
   unlesbar — --text-leise bei 45 % maß 1,95:1 hell und 2,56:1 dunkel. Jetzt
   über Fläche und Schriftfarbe: --text-still auf --flaeche-leise, 4,92 / 4,90.
   Eine gesperrte Schaltfläche muss lesbar bleiben: Wer nicht lesen kann, was
   gesperrt ist, weiß nicht, was ihm fehlt. */
.chip2:disabled { color: var(--text-still); background: var(--flaeche-leise);
                  cursor: default; }
.chip2:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
/* Die Zahl auf dem Chip — die Gegenprobe zum Filter: Steht dort „(306)",
   müssen danach 306 Zeilen sichtbar sein. */
/* 🔴 20.09.2026: `opacity: .7` ersetzt — und diese Stelle wiegt schwerer als
   ihre Größe vermuten lässt. Der Kommentar darüber sagt, wozu die Zahl da ist:
   Sie ist die GEGENPROBE zum Filter. Eine Zahl, die ein Mensch lesen soll, um
   einer anderen Zahl zu misstrauen — und sie stand bei 3,07:1 hell / 4,25:1
   dunkel. Eine Gegenprobe, die niemand lesen kann, ist keine.

   🔴 Und sie trug den Fall, der sich MULTIPLIZIERT: In einem gesperrten Chip
   lag 0,45 × 0,7 = 0,315 wirksame Deckkraft an, gemessen 1,57:1 hell und
   1,90:1 dunkel. Das ist derselbe Defekt 3, der im Prüfer selbst steckte —
   Deckkraft vererbt sich über die Vorfahrenkette. Erst repariert, dann im
   eigenen Bestand wiedergefunden.

   Jetzt --text-still bei voller Deckung: 5,14 / 5,27 im normalen Chip und
   4,92 / 4,90 im gesperrten. Die Rangfolge bleibt: die Beschriftung trägt
   --text-leise (5,85), die Zahl daneben das leisere --text-still. */
.chip2 .n { font-variant-numeric: tabular-nums; color: var(--text-still);
            margin-left: 2px; }
/* 🔴 14.10.2026: Im AUSGEWÄHLTEN Chip stand --text-still auf der Auswahlfläche
   bei 4,46:1 (hell) - knapp unter der Schwelle, gefunden auf der Reifegrad-Seite.
   Die Zahl nimmt dort die Schriftfarbe des Chips; ausgewählt ist ohnehin laut. */
.chip2.an .n { color: inherit; }

/* ===========================================================================
   5 · TABELLE
   ===========================================================================
   Der meistgelesene Baustein des ganzen Werkzeugs. Deshalb hier die meiste
   Ruhe: keine senkrechten Linien, keine Zebrastreifen, kein Rahmen. Getrennt
   wird durch eine sehr leise Waagerechte und durch Weißraum.
   =========================================================================== */
.tabelle-kasten {
  background: var(--flaeche); border-radius: var(--r3);
  box-shadow: var(--h1); overflow: hidden;
}
/* Breite Tabellen scrollen IN ihrem Kasten, nie die ganze Seite. */
.tabelle-kasten.scrollt { overflow-x: auto; }
.tabelle { width: 100%; border-collapse: collapse; font-size: var(--t3); }

.tabelle thead th {
  position: sticky; top: 0; z-index: 5;
  background: var(--marke); color: var(--auf-marke);
  font-size: var(--t1); font-weight: var(--fett-halb);
  letter-spacing: .04em; text-transform: uppercase;
  text-align: left; padding: var(--a3) var(--a3);
  white-space: nowrap;
}
/* 🛑 20.09.2026 · DIESE `opacity: .78` BLEIBT — nachgerechnet, sie trägt.
   Beim Aufräumen der Deckkraft-Fehler stand sie auf der Liste. Gemessen:
   --auf-marke bei 78 % auf --marke ergibt **7,21:1 hell und 5,50:1 dunkel** —
   beides deutlich über 4,5. Der Grund ist --marke: Er ist in beiden Modi dunkel
   genug, dass auch ausgedünntes Weiß darauf trägt.

   🔴 Eine „Reparatur" würde hier SCHADEN: --marke-leise statt der Deckkraft
   ergäbe 5,00 / 4,94 — schlechter als der Ist-Zustand. Nicht jede Deckkraft
   ist ein Fehler; sie ist einer, wo der Grund zu hell ist, um sie zu tragen.
   Wer hier etwas ändert, misst vorher nach. */
.tabelle thead th .sub {
  display: block; font-size: var(--t1); font-weight: 400;
  text-transform: none; letter-spacing: 0; opacity: .78; margin-top: 1px;
}
.tabelle thead th.sortierbar { cursor: pointer; user-select: none; }
.tabelle thead th.sortierbar:hover { background: var(--marke-tief); }

.tabelle tbody td {
  padding: var(--a3); border-bottom: 1px solid var(--linie);
  vertical-align: top; line-height: var(--zh-eng);
}
.tabelle tbody tr:last-child td { border-bottom: 0; }
.tabelle tbody tr.klickbar { cursor: pointer; }
.tabelle tbody tr.klickbar:hover td { background: var(--flaeche-leise); }
/* Eine Zeile, die NICHT klickbar ist, darf auch nicht so aussehen. */
.tabelle tbody tr.stumm { cursor: default; }
.tabelle tbody tr.stumm td { color: var(--text-leise); }

/* Zahlen rechtsbündig und mit gleich breiten Ziffern — sonst tanzen sie beim
   Sortieren. */
.tabelle .num { text-align: right; font-variant-numeric: tabular-nums;
                white-space: nowrap; }
/* Kennungen brechen nie um: „2747" über „6" ist nicht 27476, sondern zwei
   Zahlen. Im Bild am 09.09.2026 genau so passiert. */
.tabelle .kennung { font-variant-numeric: tabular-nums; white-space: nowrap;
                    overflow-wrap: normal; }
.tabelle .leise { color: var(--text-leise); font-size: var(--t2); }
.tabelle .still { color: var(--text-still); }

/* Die eine Zeile, auf die gerade gesprungen wurde. Leuchtet auf und geht aus. */
.tabelle tr.treffer > td {
  background: var(--gelb-flaeche); transition: background var(--anim-lang);
}

/* Eine Spalte, die beim Querscrollen stehen bleibt — z. B. die Hakenspalte.
   🔴 Braucht IMMER einen eigenen Hintergrund, sonst scrollen die Nachbarn
   sichtbar darunter durch. */
.tabelle .haftet {
  position: sticky; left: 0; z-index: 3; background: var(--flaeche);
  border-right: 1px solid var(--linie);
}
.tabelle thead th.haftet { z-index: 7; background: var(--marke); }
.tabelle tbody tr.klickbar:hover td.haftet { background: var(--flaeche-leise); }

/* ===========================================================================
   6 · BALKEN — ein Anteil
   =========================================================================== */
.balken { display: flex; align-items: center; gap: var(--a2); font-size: var(--t2); }
.balken-bahn {
  flex: 1; height: 6px; border-radius: var(--rund);
  background: var(--grau-flaeche); overflow: hidden; min-width: 60px;
}
.balken-fuell {
  height: 100%; border-radius: var(--rund); background: var(--gruen);
  transition: width var(--anim-lang);
}
.balken.rot  .balken-fuell { background: var(--rot); }
.balken.gelb .balken-fuell { background: var(--gelb); }
/* 🔴 Grau heißt: Diese Zahl ist nicht mit den anderen vergleichbar. Sie steht
   da, aber sie wird nicht bewertet — dasselbe Muster wie bei der
   Bestandsaufnahme im Reiter „Rücksprache". */
.balken.ohne-urteil .balken-fuell { background: var(--grau); }
.balken-wert { font-variant-numeric: tabular-nums; font-weight: var(--fett);
               min-width: 42px; text-align: right; }

/* Ein gestapelter Balken für Etappen. */
.balken-stapel { display: flex; height: 18px; border-radius: var(--r1);
                 overflow: hidden; background: var(--grau-flaeche); gap: 2px; }
/* Der Grund kommt von außen (style="background:var(--gruen)" o. ä.), deshalb
   trägt hier --auf-signal: weiß im Hellmodus, fast schwarz im Dunkelmodus.
   Vorher stand `color:#fff` fest — gemessen 1,94:1 bis 2,48:1 im Dunkeln. */
.balken-teil { display: flex; align-items: center; justify-content: center;
               color: var(--auf-signal); font-size: var(--t1);
               font-weight: var(--fett); min-width: 2px; }

/* ===========================================================================
   7 · KLAPPE — auf- und zuklappbar
   =========================================================================== */
.klappe { background: var(--flaeche); border-radius: var(--r3);
          box-shadow: var(--h1); overflow: hidden; }
.klappe + .klappe { margin-top: var(--a2); }
.klappe > summary {
  cursor: pointer; padding: var(--a3) var(--a4);
  display: flex; align-items: center; gap: var(--a3); flex-wrap: wrap;
  list-style: none; transition: background var(--anim);
}
.klappe > summary::-webkit-details-marker { display: none; }
.klappe > summary:hover { background: var(--flaeche-leise); }
.klappe > summary:focus-visible { outline: 2px solid var(--akzent);
                                  outline-offset: -2px; }
.klappe > summary::before {
  content: '›'; font-size: var(--t5); line-height: 1; color: var(--text-still);
  transition: transform var(--anim); display: inline-block;
}
.klappe[open] > summary::before { transform: rotate(90deg); }
.klappe[open] > summary { border-bottom: 1px solid var(--linie); }
.klappe-name { font-weight: var(--fett-halb); font-size: var(--t4); }
.klappe-kpi { font-size: var(--t2); color: var(--text-leise);
              display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--a1); }
.klappe-kpi strong { color: var(--text); }
.klappe-rechts { margin-left: auto; font-size: var(--t2);
                 color: var(--text-leise); white-space: nowrap; }
.klappe-inhalt { padding: var(--a4); }

/* ===========================================================================
   8 · LEISTE — eine Reihe Bedienelemente
   =========================================================================== */
.leiste { display: flex; align-items: center; gap: var(--a3); flex-wrap: wrap; }
.leiste-label { font-size: var(--t2); color: var(--text-leise);
                font-weight: var(--fett-halb); }
.leiste-rechts { margin-left: auto; }

.knopf {
  font: inherit; font-size: var(--t2); font-weight: var(--fett-halb);
  padding: 8px var(--a4); border-radius: var(--r2);
  border: 1px solid var(--linie); background: var(--flaeche);
  color: var(--text); cursor: pointer; white-space: nowrap;
  transition: border-color var(--anim), background var(--anim);
}
.knopf:hover:not(:disabled) { border-color: var(--linie-stark);
                              background: var(--flaeche-leise); }
.knopf:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
/* 🔴 20.09.2026: `opacity: .45` ersetzt — dieselbe Reparatur wie bei
   `.chip2:disabled`. --text bei 45 % maß 2,76:1 hell und 3,84:1 dunkel; der
   alte Prüfer meldete 15,78 bzw. 13,56, weil er die Deckkraft nicht
   einrechnete. Faktor 5,7 — der größte Einzelfehler der Messung.
   Jetzt --text-still auf --flaeche-leise: 4,92 / 4,90. */
.knopf:disabled { color: var(--text-still); background: var(--flaeche-leise);
                  cursor: default; }
/* Genau EIN Hauptknopf je Bild. Zwei gleich starke Knöpfe nebeneinander
   heißen: Ich weiß auch nicht, was du tun sollst. */
.knopf.haupt { background: var(--akzent); border-color: var(--akzent);
               color: var(--auf-akzent); }
.knopf.haupt:hover:not(:disabled) { background: var(--akzent-tief);
                                    border-color: var(--akzent-tief); }
.knopf.leise { border-style: dashed; color: var(--text-leise); }
.knopf.klein { font-size: var(--t1); padding: 4px var(--a3); }
/* Ein Verweis, der wie ein Knopf aussieht, braucht diese zwei Zeilen: Ohne
   `inline-block` greift die senkrechte Polsterung nicht, und die Unterstreichung
   des Browsers bleibt sonst quer durch den Knopf stehen. Betrifft heute nur die
   Plattform (`/anmelden`); im Cockpit gibt es keinen einzigen solchen Verweis. */
a.knopf { display: inline-block; text-decoration: none; }

/* 🔺 22.09.2026 · ZWEI REPARATUREN AN DIESER EINEN REGEL.
   Gefunden beim Bau der Kundenseite, gemeldet statt still umgangen — sie
   betreffen JEDES Eingabefeld im Haus, nicht nur die neue Seite.

   1. `box-sizing: border-box`. Die Regel setzt `width: 100%` und legt
      Innenabstand und Rahmen OBENDRAUF — im Projekt setzt niemand
      `box-sizing`, also gilt `content-box`. Gemessen bei 400 px Breite:
      Die rechte Kante des Feldes stand **9 px außerhalb seiner Karte**.
      Auf breiten Bildschirmen fällt das nie auf; auf einem Telefon ist es
      der Unterschied zwischen einer Seite und einer kaputten Seite.
      🔴 Bewusst NUR hier und nicht global (`*, *::before …`): Eine globale
         Umstellung wäre ein anderer Eingriff mit anderem Risiko — und sie
         war nicht der Befund.
      ⚠️ Zur Reichweite, nachgezählt am 22.09.2026: Die Änderung betrifft
         **17 Stellen, alle in `plattform\vorlagen\`** (ruecksprache_neu 9,
         kunde 4, rechte 3, ruecksprache_eine 1). Das **Cockpit benutzt
         `.feld` nicht** — sein einziger Treffer heißt `hinweis-feld` und
         ist eine andere Klasse. Die Vermutung „43 Cockpit-Stellen hängen
         daran" hat sich beim Nachzählen nicht bestätigt.

   2. `--linie-bedien` statt `--linie`. Eine Trennlinie darf leise sein,
      die Umrandung eines Bedienelements nicht: WCAG verlangt dafür 3:1.
      Gemessen trug `--linie` 1,24:1 (hell) und 1,27:1 (dunkel) — das Feld
      war praktisch randlos, man sah nur den Platz, nicht das Feld.
      Der neue Token trägt 3,65:1 hell und 3,64:1 dunkel; die Begründung
      und die Werte auf allen drei Untergründen stehen in `token.css`. */
.feld {
  font: inherit; font-size: var(--t3); padding: 8px var(--a3);
  border-radius: var(--r2); border: 1px solid var(--linie-bedien);
  background: var(--flaeche); color: var(--text); width: 100%;
  box-sizing: border-box;
  transition: border-color var(--anim), box-shadow var(--anim);
}
.feld:focus { outline: none; border-color: var(--akzent);
              box-shadow: 0 0 0 3px var(--akzent-leise); }
.feld::placeholder { color: var(--text-still); }

/* ===========================================================================
   HILFSKLASSEN — die wenigen, die sich lohnen
   =========================================================================== */
.leise-text { color: var(--text-leise); font-size: var(--t2); }
/* 🆕 20.09.2026 · Für Zusätze, die noch leiser stehen sollen als `.leise-text`
   — Klammerzusätze, Legenden, Hinweise hinter einer Zahl.
   🔴 WOFÜR SIE GEBRAUCHT WIRD: An fünf Stellen im Template stand dafür
   `style="opacity:…"` direkt im Markup, mit sechs verschiedenen Werten
   (.75 · .75 · .7 · .6 · .6). Gemessen ergab das 3,40:1 und 2,54:1 —
   28 unlesbare Stellen.
   Eine Deckkraft im style-Attribut ist ein EIGENER Fall, nicht bloß eine
   weitere Regel: Sie steht außerhalb des Farbsystems, und keine Tokenänderung
   erreicht sie je. Wer die Palette umstellt, stellt diese Stellen nicht mit
   um — genau deshalb sind sie fünfmal unbemerkt geblieben. Als Klasse ziehen
   sie ab jetzt mit. Anders als eine Deckkraft setzt sie keine Größe: Diese
   Zusätze stehen mitten im Fließtext und sollen ihn nicht umbrechen. */
.still-text { color: var(--text-still); }
.still-text { color: var(--text-still); }
.nowrap { white-space: nowrap; }
/* Für Vorleseprogramme sichtbar, für das Auge nicht. Ersetzt title-Attribute
   dort, wo der Hinweis wirklich gebraucht wird. */
.nur-vorlesen {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap;
}
/* Leerer Bereich — sagt, was fehlt, statt nichts zu zeigen. */
.leer { padding: var(--a6) var(--a4); text-align: center; color: var(--text-leise); }
.leer .gross { font-size: var(--t5); font-weight: var(--fett-halb);
               color: var(--text); margin-bottom: var(--a2); }
