/* Hausstil aus dem abgenommenen Mockup (01.08.2026). Farben und Masse
   uebernommen; Abweichungen nur nach Ruecksprache. */
:root{
  --surface-0:#f6f5f0; --surface-1:#efeee8; --surface-2:#ffffff;
  /* Zebra fuer die Spurzeilen (Auftrag Sven, 04.09.2026). Gemessen
     gewaehlt: der Streifen hebt sich mit 1,14 gegen Weiss ab — sichtbar
     genug, um das Auge ueber vier Spuren zu fuehren — und ein Modellwort
     (`--text-secondary`) steht darauf mit **5,68:1**, also klar ueber AA. */
  --zebra:#f1f0ea;
  --text-primary:#1a1a17; --text-secondary:#5f5e5a; --text-muted:#9a988f;
  --border:#d8d6cc; --border-strong:#b4b2a9;
  --bg-accent:#e6f1fb; --text-accent:#185fa5; --border-accent:#378add;
  --bg-warning:#faeeda; --text-warning:#854f0b;
  --text-success:#0f6e56; --gruen:#1D9E75; --radius:8px;
}
*{box-sizing:border-box}
body{font-family:system-ui,sans-serif; background:var(--surface-0);
  color:var(--text-primary); margin:0; padding:16px}
/* Volle Fensterbreite (Verhaltensregel 1) — kein max-width. */
.wrap{background:var(--surface-1); border-radius:12px; padding:14px}
/* ---------- `hidden` muss `hidden` heissen (04.09.2026) ------------------
   Das `[hidden]{display:none}` des Browsers steht in dessen eigenem
   Stylesheet und verliert deshalb gegen JEDE Autoren-Regel mit `display` —
   unabhaengig von Spezifitaet. `.zusammen-feld{display:inline-flex}` hat
   das Feld damit auf JEDER Seite sichtbar gemacht, obwohl `hidden` gesetzt
   war: zwei leere Auswahlfelder in der Tab-Reihenfolge, ohne Anlass, ohne
   Erklaerung. Von einer Abnahme-Bahn gemessen (`hidden === true`,
   `display === "flex"`, 358x36 px).

   Die eigene Pruefung im Harnisch hatte es nicht gesehen, weil sie die
   EIGENSCHAFT `.hidden` abfragte und nicht die Darstellung; sie fragt jetzt
   `getComputedStyle(...).display`. Diese Zeile schliesst die ganze Klasse,
   nicht nur den einen Fall. */
[hidden]{display:none !important}

.karte{background:var(--surface-2); border:.5px solid var(--border);
  border-radius:var(--radius); padding:10px 12px; margin-bottom:12px}
button{font-size:12px; height:28px; padding:2px 10px;
  border:.5px solid var(--border-strong); border-radius:var(--radius);
  background:transparent; cursor:pointer; color:inherit}
button:hover:not(:disabled){background:var(--surface-1)}
button:disabled{opacity:.55; cursor:not-allowed}
button.gross{height:36px; font-size:14px}
.auto{margin-left:auto}
.leg{font-size:12px; color:var(--text-secondary)}
.titel{font-size:15px; font-weight:500}
.kopfzeile{display:flex; align-items:center; justify-content:space-between;
  gap:8px; flex-wrap:wrap; margin-bottom:10px}
.kz-links,.kz-rechts{display:flex; align-items:center; gap:10px}
.pille{font-size:12px; padding:3px 10px; border-radius:12px;
  background:var(--bg-accent); color:var(--text-accent)}
.warnbox{background:var(--bg-warning); color:var(--text-warning);
  border-color:#e4c99a; font-size:13px}

.spielleiste{display:flex; align-items:center; gap:8px; margin-bottom:8px;
  flex-wrap:wrap}
.rund{width:34px; height:34px; border-radius:50%; padding:0}
.uhr{font-size:13px; font-family:monospace}
.tempo{display:inline-flex; border:.5px solid var(--border-strong);
  border-radius:var(--radius); overflow:hidden}
.tempo button{border:none; border-radius:0}
.tempo button+button{border-left:.5px solid var(--border)}
.tempo button.an{background:var(--bg-accent); color:var(--text-accent)}
/* Die Leiste ist EINE Flaeche mit Farbverlauf, nicht eine Reihe von Divs —
   sonst wandert die Klickflaeche bei jedem Neuzeichnen unter der Maus weg.
   14 statt 10 px: bei 10 px trifft man sie im Betrieb schlecht. */
.cov{position:relative; height:14px; border-radius:7px; overflow:hidden;
  cursor:pointer; background:var(--border-strong)}
.cov:focus-visible{outline:2px solid var(--border-accent); outline-offset:1px}
.cov-marke{position:absolute; top:0; bottom:0; width:2px; margin-left:-1px;
  background:var(--text-primary); pointer-events:none}
.covzeile{display:flex; justify-content:space-between; margin-top:5px}

table.pult{border-collapse:collapse; width:100%; margin-bottom:14px}
table.pult td{padding:2px 4px; font-size:13px; color:var(--text-secondary)}
/* SPEZIFITAET NACHGEZOGEN (04.09.2026). `td.gold` ist (0,1,1) und verlor
   gegen `table.pult td` (0,1,2) — die Gold-Zeile trug also dieselbe
   Textfarbe wie die Modellspuren, obwohl seit jeher etwas anderes
   dasteht. Gemessen im Harnisch: alle Zellen `rgb(95,94,90)`. Mit dem
   Zebra faellt es erst richtig auf, weil die Zeilen jetzt sonst
   unterscheidbar sind. `--text-primary` auf dem Gold-Ton #fffdf5 misst
   **17,13:1** — im Harnisch gerechnet, nicht geschaetzt. */
table.pult td.gold{font-size:14px; color:var(--text-primary)}
/* SPEZIFITAET NACHGEZOGEN (04.09.2026, in der Abnahme gemessen). `td.hdr`
   ist (0,1,1) und verlor gegen `table.pult td` (0,1,2): das Polster war in
   Wahrheit 2px 4px statt 3px 10px 3px 6px, die Schrift 13px statt 12px.
   Die Spaltenbeschriftung stand also enger am Text als vorgesehen. */
table.pult td.hdr{padding:3px 10px 3px 6px; font-size:12px; white-space:nowrap;
  border-right:.5px solid var(--border); width:1%}
table.pult td.goldhdr{font-weight:500; color:var(--text-primary)}
.stift{color:var(--text-accent)}
.badge{color:var(--text-accent)}
td.diff{background:var(--bg-accent); border-radius:3px; cursor:pointer}
td.diff:hover{outline:1.5px solid var(--border-accent); outline-offset:-1px;
  color:var(--text-accent); font-weight:500}
/* ---------- Zebra: das Auge ueber die Zeile fuehren (04.09.2026) --------
   Auftrag Sven: „abwechselnd hell grauen und weißen Hintergrund, damit die
   Augen besser geführt werden" — mit der Auflage, „dass das grau nicht mit
   Schriften kollidiert, die unlesbar werden".

   DESHALB AUF DEM `tr` UND NICHT AUF DEM `td`. Jede Zelle, die etwas zu
   SAGEN hat, traegt ihren eigenen Hintergrund — die Gold-Zeile (#fffdf5),
   eine Abweichung (`td.diff`), die Hoerposition (`td.ph`), die
   Sprecherfarben. Ein `td`-Hintergrund uebermalt den der Zeile ohne jede
   Spezifitaets-Rangelei; ein Streifen auf den Zellen haette dagegen
   `td.diff` (0,1,1) geschlagen und die Bedeutung zugedeckt. Genau der
   Fehler, den ich am 03.09. mit einem `:not()`-Selektor schon einmal
   gemacht habe.

   Die Zeilen im Block sind: 1 Gold, 2 Trenner, 3..n Modellspuren. `odd`
   trifft also Gold (dort unsichtbar, weil uebermalt) und dann jede zweite
   Modellzeile — was genau den Wechsel ergibt. */
table.pult tr:nth-child(odd){background:var(--zebra)}
/* Die Gold-Spur muss auf einen Blick von den Fassungen zu unterscheiden sein —
   im Ausschnitt sieht man sonst vier aehnliche Zeilen und weiss nicht, welche
   die eigene ist. */
tr.goldzeile td{background:#fffdf5}
/* Spurwahl: bleibt sichtbar, auch wenn alles ausgeblendet ist — sonst kommt
   man an eine versteckte Spur nicht mehr heran. */
.spurwahl{display:flex; gap:6px; align-items:center; flex-wrap:wrap;
  margin-top:8px; padding:0 6px}
button.spurknopf{height:24px; font-size:12px}
button.spurknopf.aus{color:var(--text-muted); border-style:dashed;
  text-decoration:line-through}
.legende{display:flex; gap:14px; margin-top:8px; padding:0 6px; flex-wrap:wrap}
.sw{display:inline-block; width:10px; height:10px; border-radius:2px;
  vertical-align:-1px; margin-right:3px}
.sw-ph{background:var(--bg-warning)} .sw-diff{background:var(--bg-accent)}
td.ph{background:var(--bg-warning); border-radius:3px}
/* Luecken in den Modellzeilen springen an die Stelle — das muss man
   auch sehen. Die Gold-Luecke bekommt weiter den Textcursor. */
/* OHNE `color` — und das ist ein Befund, kein Versehen (04.09.2026, im
   Harnisch `zebra.html` GEMESSEN). Hier stand `color:var(--text-muted)`
   (#9a988f) und hat NIE gewirkt: `table.pult td` weiter oben ist (0,1,2),
   `td.gap` nur (0,1,1) — die Zelle traegt in Wahrheit `--text-secondary`.
   Die Deklaration wieder wirksam zu machen waere der falsche Schluss: auf
   dem Zebra-Streifen kaeme `--text-muted` auf **2,53:1** und damit genau
   auf die Kollision, vor der Sven gewarnt hat. Der tatsaechliche Wert
   misst **5,68:1**. Also faellt die tote Zeile, nicht der Kontrast. */
td.gap{text-align:center; cursor:pointer}
/* Leerstelle in der Gold-Spur: beschreibbar, und das soll man sehen. */
td.goldluecke{cursor:text}
tr.goldzeile td.goldluecke:hover{background:var(--bg-accent);
  color:var(--text-accent); outline:1px dashed var(--border-accent);
  outline-offset:-1px}
tr.goldzeile td.goldluecke:hover::after{content:"＋"; font-size:11px}
/* Ebenso: `padding:0` verlor gegen `table.pult td`, der Trenner war
   dadurch 4,5px hoch statt der deklarierten 3px — 50 Prozent mehr, in
   jeder der rund 200 Tabellen. */
table.pult td.trenner{border-bottom:.5px solid var(--border); padding:0;
  height:3px}
input.edit{font:inherit; width:100%; border:1px solid var(--border-accent);
  border-radius:3px; padding:0 2px}

.einfuegen{display:flex; gap:6px; margin-bottom:12px; flex-wrap:wrap;
  align-items:center}
.quittung{display:flex; align-items:center; gap:8px; margin-top:6px;
  font-size:13px}
.quittung .ok{color:var(--text-success)} .quittung .warn{color:var(--text-warning)}
.quittung button{margin-left:auto}
.quittung button+button{margin-left:0}
.fusszeile{display:flex; align-items:center; gap:10px}

.anmelden{max-width:22rem; margin:8vh auto; background:var(--surface-2);
  padding:24px; border-radius:12px; border:.5px solid var(--border);
  display:flex; flex-direction:column; gap:12px}
.anmelden label{display:flex; flex-direction:column; gap:4px; font-size:13px}
.anmelden input{font:inherit; padding:6px; border:.5px solid var(--border-strong);
  border-radius:var(--radius)}
.fehler{color:#a22; font-size:13px}
table.dash{border-collapse:collapse; width:100%; font-size:13px}
table.dash th{text-align:left; font-weight:500; color:var(--text-secondary);
  font-size:12px; padding:2px 6px}
table.dash td{padding:3px 6px} td.z{text-align:right; font-variant-numeric:tabular-nums}
td.balken{width:40%} td.balken span{display:block; height:8px;
  background:var(--gruen); border-radius:4px}
ul.claims{list-style:none; padding:0; margin:6px 0 0}
ul.claims li{padding:3px 0; font-size:13px}
.warnmark{color:var(--text-warning)}

/* ---------- Sprecherspannen (Plan B1, geaendert durch Variante C) ----------
   Die Marke `[S1]` ist ein Token im Wortstrom, aber kein Wort. Hier stand,
   sie werde "als farbiger Trenner gezeichnet" — seit Variante C stimmt das
   NICHT MEHR: in einem `.sprecherblock` ist ihre Zelle 0 px breit und
   unsichtbar, die Zuordnung steht als TEXT im Blockkopf. Die Regeln
   `td.marke-*` unten sind damit WIRKUNGSLOS.

   BERICHTIGT AM 04.09.2026 (Abnahme). Hier stand, sie wirkten "nur noch
   ausserhalb eines Blocks", und ein spaeterer Umbau koenne sie wieder
   sichtbar machen. Beides ist falsch:

   * Es gibt kein "ausserhalb eines Blocks". `pruefen.js` baut jede Tabelle
     an EINER Stelle und immer als `pult sprecherblock`.
   * Und selbst nach einem solchen Umbau blieben `color`, `padding` und
     `font-size` wirkungslos: sie stehen als `td.marke…` (0,1,1) gegen
     `table.pult td` (0,1,2). Nur die `background`-Angaben kaemen an.

   Die Regeln bleiben trotzdem stehen — die Zelle bleibt im DOM (zwei
   Vertragsproben adressieren ueber `data-spalte`), und sie schaden nicht.
   Sie sind BEWUSST wirkungslos; `tests/test_gold_css.py` fuehrt sie
   namentlich, damit niemand sie fuer versehentlich haelt. */
td.marke{padding:3px 2px; font-size:11px; text-align:center;
         border-radius:3px; white-space:nowrap; user-select:none}
td.markenspur{color:transparent}
td.marke-s1{background:var(--bg-accent); color:var(--text-primary)}
td.marke-s2{background:var(--bg-warning); color:var(--text-primary)}
/* Die Spanne selbst: ein Strich unter den Woertern, kein Hintergrund — der
   gehoert `td.diff` und `td.ph`, und zwei Faerbungen um dieselbe Zelle
   ergaeben eine, die niemand mehr lesen kann. */
/* ---------- Sprecherfarben, entflochten (03.09.2026) ----------
   DER BEFUND, DER DAS AUSGELOEST HAT: `td.sp-s1` trug `--bg-accent` — genau
   die Farbe, die `td.diff` als Hintergrund fuer "weicht ab, Klick
   uebernimmt" benutzt. Und `td.sp-s2` trug `--bg-warning`, die Farbe des
   Playheads `td.ph`. ZWEI FARBEN, VIER BEDEUTUNGEN: "blau" hiess
   gleichzeitig "Sprecher 1" und "hier klicken". Fuer jemanden ohne
   Einarbeitung ist das nicht lesbar. Von Fable in der Abnahme gefunden.

   DIE PALETTE IST GESUCHT, NICHT GEWAEHLT. Alles in CIEDE2000 (nicht CIE76
   — eine frueher hier genannte Zahl stammte aus der groberen Formel und
   hielt der genaueren nicht stand). Nachgerechnet in der Abnahme, und drei
   Angaben mussten dabei berichtigt werden:

     * untereinander, normalsichtig:            20,2  (kleinstes Paar
                                                 s1/ohne; s1/s2 = 24,5)
     * gegen --bg-accent und --bg-warning:      16,1
     * untereinander unter Farbsehschwaeche:    14,6  (Machado-Modell,
                                                 Schweregrad 1,0; Brettel
                                                 18,6). HIER STAND 16,5 —
                                                 das war das Paar s1/ohne
                                                 unter einem anderen Modell,
                                                 nicht das kleinste.

   UND DIE EHRLICHE GRENZE, die vorher nicht dastand: gegen die belegten
   Bedeutungen faellt der Abstand unter Farbsehschwaeche auf **8,7**
   (s1 gegen --bg-warning, Machado). Die Entflechtung haelt also fuer
   Normalsichtige sicher; darunter traegt sie die FORM — der Sprecher ist
   eine Kante links am Block, `diff` und Playhead sind Zellflaechen.

   C=14 bei L*=80 ist NICHT die kleinste tragende Buntheit: C=12 traegt
   auch (C=10 nicht). Der Suchlauf begann bei 14; "die kleinste" stand hier
   und war falsch. Die 14 bleibt, weil sie mit mehr Abstand traegt.

   UND EIN ERGEBNIS, DAS GEGEN DIE URSPRUENGLICHE IDEE SPRICHT: fuer SECHS
   Sprecher gibt es keine solche Palette. Die Suche ueber Helligkeit,
   Buntheit und Farbtonabstand findet keine sechs Toene, die untereinander,
   gegen die belegten Bedeutungen UND unter Farbsehschwaeche auseinander
   liegen. Deshalb traegt die Farbe nur den haeufigen Fall, und die
   Zuordnung steht als TEXT im Blockkopf (Variante C). Ab `[S3]` ist die
   Farbe bewusst neutral: eine dritte Farbe, die man nicht sicher
   unterscheidet, waere eine Behauptung. */
:root{
  --spr-1:#b8ccb5; --spr-2:#cec2da; --spr-ohne:#8f8d86; --spr-weitere:#b6b3ab;
}
td.sp-s1{box-shadow:inset 0 -2px 0 var(--spr-1)}
td.sp-s2{box-shadow:inset 0 -2px 0 var(--spr-2)}
/* AB HIER NEU (03.09.2026). Vorher endete die Palette bei S2, und der
   Kommentar an dieser Stelle sagte das auch — nur war es seit dem Tag
   falsch, an dem die Slot-Liste dem TEXT folgt statt fest `['1','2']` zu
   sein: seitdem kann ein Mensch `[S3]` setzen, und der Server bietet ihm
   dafuer ein Rollenurteil an. Eine Marke, die man vergeben kann, aber nicht
   sieht, ist die stille Wirkungslosigkeit, gegen die das ganze
   Marken-Vokabular gebaut wurde. */
/* Ab dem dritten Sprecher EINE gemeinsame, neutrale Farbe. Hier standen
   vier verschiedene Toene, und die Aussage darueber ("alle Paare dE >= 8")
   galt nur in CIE76; in CIEDE2000 lagen zwei Paare darunter, und unter
   Farbsehschwaeche mehrere. Vier Farben, die man nicht auseinanderhalten
   kann, sind schlechter als eine, die nichts behauptet — WER spricht, sagt
   der Blockkopf.

   ZWEI EINSCHRAENKUNGEN, in der Abnahme nachgerechnet und hier ergaenzt:
   (1) Es war EIN Paar unter der Schwelle, nicht zwei — hier stand "zwei".
   (2) "Fuer sechs Sprecher gibt es keine Palette" gilt nur unter den
       Bedingungen, unter denen gesucht wurde: gleiche Helligkeit und
       Buntheit fuer alle sechs und sehr helle Toene. Laesst man Helligkeit
       und Buntheit je Farbe frei und geht dunkler, FINDET man sechs. Drei
       oder vier gehen sogar in hellen Toenen. Die Entscheidung fuer eine
       neutrale Farbe ab `[S3]` bleibt richtig — sie folgt aber aus dem
       Hausstil und daraus, dass der Blockkopf die Zuordnung ohnehin traegt,
       NICHT aus einer Unmoeglichkeit. */
/* SPEZIFITAET BEACHTEN: der Sammelselektor unten hat (0,4,1) und schlug
   damit `td.sp-sAnsage,td.sp-sunklar` (0,1,1) — unabhaengig von der
   Reihenfolge. Gemessen trug die Ansage-Spanne `--spr-weitere` statt
   ihrer eigenen Farbe; die "bewusst andere Farbfamilie" der
   Sonderrollen war damit weg. Sie werden jetzt ausdruecklich
   ausgenommen. In der Abnahme gefunden. */
td.sp-s3, td.sp-s4, td.sp-s5, td.sp-s6,
td[class*="sp-s"]:not(.sp-s1):not(.sp-s2):not(.sp-ohne):not(.sp-sAnsage):not(.sp-sunklar){
  box-shadow:inset 0 -2px 0 var(--spr-weitere)}
/* KEIN SPRECHER ist auch eine Aussage. Woerter vor der ersten Marke gehoeren
   niemandem — ohne eigene Zeichnung sahen sie aus wie zugeordnet, weil das
   FEHLEN einer Farbe nicht auffaellt. Auftrag Sven: "wenn es keinen gibt
   halt grau oder so".

   BERICHTIGT 04.09.2026 (Abnahme): hier stand "Gepunktet statt
   durchgezogen: die Form trennt sie auch dann von den Sprechern, wenn die
   Farbe nicht ankommt." Die Zeile ist ein `box-shadow` und damit
   DURCHGEZOGEN — ein Schatten kann gar nicht gepunktet sein. Das Argument
   stammt aus der Zeit vor Variante C. Seitdem traegt der BLOCKKOPF die
   Aussage im Klartext ("ohne Sprecher"), und das ist der Kanal, der in
   Graustufen und bei Farbsehschwaeche gleich funktioniert; die Kante ist
   nur noch Beiwerk. Punkte nachzuruesten waere hier teuer (der
   `background`-Kurzform der Gold-Zeile schluckt ein Hintergrundbild) und
   brauchte niemand. */
td.sp-ohne{box-shadow:inset 0 -2px 0 var(--spr-ohne)}
/* Die gewaehlte Gold-Zelle. Ein Rahmen, kein Hintergrund — der ist bei
   td.diff und td.ph schon vergeben, und drei Faerbungen um dieselbe Zelle
   liest niemand mehr. */
td.gewaehlt{outline:1.5px solid var(--border-accent); outline-offset:-1px}
.sprecher{margin:0 0 8px 6px; display:flex; gap:6px; align-items:center;
          flex-wrap:wrap}
.sprecher button{font-size:12px; padding:3px 8px}

/* ---------- Marken aufraeumen / Sprecher zusammenlegen (04.09.2026) ------
   Eigene Zeile und nicht in `.sprecher`: der Aufraeum-Knopf braucht KEINE
   gewaehlte Zelle, und `zuordnungstastenStand` sperrt alles unter
   `.sprecher button`, sobald keine Auswahl da ist. Stuende er dort, waere
   er genau dann gesperrt, wenn man ihn braucht — nach einem Neuladen. */
.marken{margin:0 0 8px 6px; display:flex; gap:6px; align-items:center;
        flex-wrap:wrap}
.marken button{font-size:12px; padding:3px 8px}
/* Der Stand steht VOR den Knoepfen und traegt die Warnfarbe der Ansicht:
   er ist der Grund, aus dem der Knopf ueberhaupt sichtbar wird. */
.marken .marken-stand{color:var(--text-warning); font-weight:600}
/* Die Doppellese (09.09.2026): sie sieht sonst aus wie ein gewoehnlicher
   Anruf, weil der Text schon dasteht. Warnfarbe waere falsch — es ist kein
   Fehler, sondern ein anderer Auftrag. */
.pille-zweit{background:var(--bg-accent); color:var(--text-accent)}
.zweit-stand{display:block; margin-top:2px}
/* DER TITEL SAGT ES SELBST (Sven, 10.09.2026: "muss ersichtlich werden,
   dass wir doppelpruefen, in header und button"). Die Pille rechts oben
   gab es schon — sie stand neben "Dein Claim" und ging unter. Diese Marke
   steht VOR dem Calltitel, in derselben Schriftgroesse, und traegt einen
   eigenen Grund statt nur einer Randfarbe. Warnfarbe waere falsch: es ist
   kein Fehler, sondern ein anderer Auftrag. */
/* Der Testmodus-Kasten: gedaempft und klein, damit er nicht wie der
   normale Weg aussieht. Kein Warngelb — es ist kein Fehler, nur nichts
   fuer den Alltag. */
/* Eine Null in der Platin-Spalte ist heute der Normalfall und soll nicht
   wie ein Fehler aussehen — gedaempft statt rot. */
.dash td.null{color:var(--text-muted)}
.suche{display:flex; align-items:center; gap:10px; flex-wrap:wrap}
.suche input{font-size:15px; padding:6px 10px; border:1px solid var(--border-strong);
  border-radius:6px; width:11em}
.testmodus{border:1px dashed var(--border-strong); background:transparent}
.testmodus button{font-size:13px; padding:5px 12px; margin-right:8px}
.testmodus form{display:inline}
/* „Korrektur" ist kein Fehler und kein anderer Auftrag, sondern ein
   Zustand: die Einheit ist fertig. Deshalb gedaempft und nicht in der
   Akzentfarbe der Doppelpruefung — sonst sehen zwei verschiedene Dinge
   gleich aus. Gemessen: #5f5e5a auf #efeee8 = 5,58:1, ueber AA. */
.titel-korr{font-size:15px; font-weight:700; letter-spacing:.02em;
  padding:2px 10px; border-radius:6px; margin-right:2px;
  border:1px solid var(--border-strong); color:var(--text-secondary)}
.titel-zweit{font-size:15px; font-weight:700; letter-spacing:.02em;
  padding:2px 10px; border-radius:6px; margin-right:2px;
  background:var(--text-accent); color:var(--surface-2)}
/* Gemessen, nicht geschaetzt: #ffffff auf #185fa5 = 6,52:1, also ueber AA
   (4,5:1) und knapp unter AAA. Nachgerechnet am 10.09.2026 — in diesem
   Haus sind schon mehrfach geschaetzte Kontrastzahlen falsch gewesen. */
/* Der volle Zwischenspeicher ist kein Formhinweis, sondern eine Warnung
   ueber DROHENDEN Verlust — deshalb der Warnkasten und nicht nur Farbe. */
.marken .speicher-warnung{background:var(--bg-warning); color:var(--text-warning);
  font-weight:600; padding:2px 8px; border-radius:4px}
.zusammen-feld{display:inline-flex; gap:6px; align-items:center;
               flex-wrap:wrap; padding:3px 6px;
               border:1px solid var(--border); border-radius:4px}
.zusammen-feld select{font-size:12px}
/* Die zwei Sonderrollen aus Entscheid 2. Bewusst andere Farbfamilie als S1/S2:
   sie sind keine Sprecher, sondern Aussagen ueber die Stelle. */
/* KONTRAST REPARIERT (03.09.2026). Hier stand `color:var(--text-muted)`
   (#9a988f) auf #e8e8e8 — gerechnet **2,36:1**, also weit unter der
   AA-Schwelle von 4,5:1. Die Zelle trug eine Aussage, die man LESEN muss
   ("Ansage", "unklar") — seit Variante C ist sie im Block unsichtbar und der
   Blockkopf sagt es; die Reparatur bleibt trotzdem richtig, weil die Zelle
   ausserhalb eines Blocks weiter gezeichnet wird.
   Mit --text-secondary sind es **5,30:1**, also ueber AA. Diese Zahl
   stand hier zuerst als 6,4:1 — geschaetzt statt gerechnet, und damit
   genau der Fehler, den der Kommentar auszuschliessen behauptet.

   NACHTRAG 04.09.2026: die `color`-Angabe dieser Regel WIRKT NICHT — sie
   ist (0,1,1) und verliert gegen `table.pult td` (0,1,2). Dass die Zelle
   trotzdem `--text-secondary` traegt, ist Zufall: `table.pult td` setzt
   denselben Wert. Der gerechnete Kontrast stimmt also, die Behauptung
   „hier repariert" nicht. Sichtbar ist die Zelle ohnehin nicht. */
td.marke-sAnsage,td.marke-sunklar{background:var(--bg-muted,#e8e8e8);
  color:var(--text-secondary)}
td.sp-sAnsage,td.sp-sunklar{box-shadow:inset 0 -2px 0 var(--text-muted)}
/* Das Rollenurteil je Slot (Plan B5). Eigene Zeile, nicht in der
   Markenleiste: es gilt dem ANRUF und nicht der Stelle im Text. */
.rollen{margin:0 0 10px 6px; display:flex; gap:10px; align-items:center;
        flex-wrap:wrap}
.rollen select{font-size:12px; padding:2px 4px}
.rolle-slot{font-size:12px; color:var(--text-secondary)}


/* ---------- Feste Leisten (03.09.2026) ----------
   Der Befund dahinter: `bauen()` stapelt die Spalten in Tabellen je
   Fensterbreite — bei 4.000 Woertern rund 200 davon. Alles, was man WAEHREND
   der Arbeit braucht, lag darunter oder darueber und war beim Arbeiten in
   der Mitte unsichtbar: Uhr, Abdeckung, Sprecherknoepfe, Einfuegetasten,
   die Meldung `#fehlt` und der Speichern-Knopf mit dem Gate-Stand.

   Zwei Leisten, nicht eine: oben gehoert das Hoeren (Uhr, Abdeckung), unten
   das Schreiben. Dazwischen bleibt das Mischpult. */
.karte.klebt-oben{position:sticky; top:0; z-index:6;
  background:var(--surface-2); margin-bottom:10px}
.werkzeugleiste{position:sticky; bottom:0; z-index:5;
  background:var(--surface-1); border-top:.5px solid var(--border-strong);
  /* Negative Raender: die `.wrap` hat 14 px Polster, die Leiste soll ueber
     die volle Breite kleben und nicht in einer Rinne sitzen. */
  margin:10px -14px -14px; padding:8px 14px 10px;
  box-shadow:0 -8px 16px -12px rgba(0,0,0,.4)}
/* In der Leiste sitzen drei Zeilen dicht untereinander; ohne das haetten sie
   die Aussenabstaende aus dem Fluss und die Leiste waere unnoetig hoch. */
/* `.marken` gehoert dazu (04.09.2026). Ohne sie behielt die neue Zeile
   ihren eigenen Rand `0 0 8px 6px` und stand um 6 px eingerueckt neben
   zwei buendigen Nachbarn — in der Abnahme gemessen. */
.werkzeugleiste .sprecher,
.werkzeugleiste .marken,
.werkzeugleiste .einfuegen{margin:0 0 6px 0}
.werkzeugleiste .fusszeile{margin:0}
/* Die langen Erklaertexte kosten in der Leiste Hoehe. Auf niedrigen Fenstern
   fallen sie weg — die Knoepfe tragen ihre Taste ohnehin im Text
   (`1 · äh`), und die volle Auskunft steht weiter im `title`. */
@media (max-height: 800px){
  .werkzeugleiste .sprecher > .leg:not(.stand),
  .werkzeugleiste .einfuegen > .leg{display:none}
}

/* Die Markenspalte im Sprecherblock: NICHT gezeichnet, aber vorhanden.
   Variante C zeigt die Zuordnung als Blockkopf; das Token `[S1]` mitten im
   Wortfluss faellt damit weg. Die ZELLE bleibt trotzdem stehen — `norm3` und
   `test_browser_und_server_normalisieren_gleich` pruefen die Faerbung Spalte
   fuer Spalte gegen das `diff` des Servers und adressieren ueber
   `data-spalte`. Wer die Spalte entfernt, entfernt die Zusicherung mit.
   `padding:0` und `border:0`, damit die Zelle wirklich keine Breite kostet;
   `display:none` waere falsch, weil der Tabellen-Spaltenzaehler dann in
   Gold- und Modellzeile auseinanderliefe. */
.sprecherblock td.marke{width:0; padding:0; border:0; font-size:0;
  color:transparent; background:none; overflow:hidden}

/* ---------- Der Sprecherblock (Variante C) ----------
   Die Zuordnung steht als TEXT im Kopf der Gold-Zeile und als farbige Kante
   links am Block. POSITION ist der Kanal, der in Graustufen, bei
   Farbsehschwaeche und ohne Einarbeitung gleich funktioniert — die Farbe
   verstaerkt, sie traegt nicht. */
table.sprecherblock{border-left:3px solid var(--spr-weitere); padding-left:3px}
table.block-s1{border-left-color:var(--spr-1)}
table.block-s2{border-left-color:var(--spr-2)}
table.block-ohne{border-left-color:var(--spr-ohne)}
.goldhdr .blockname{font-weight:600}
/* Die Fortsetzung desselben Sprechers ist gedaempft: sie sagt "hier faengt
   nichts an, das laeuft weiter". Ohne den Unterschied waere jede zweite
   Zeile eine Scheingrenze. */
table.fortsetzung .goldhdr .blockname{font-weight:400; opacity:.65}

/* Der Blockkopf ist Klickziel (er waehlt das erste Wort seines Blocks) —
   dann muss der Zeiger das auch sagen. */
td.goldhdr{cursor:pointer}
/* Die Sonderrollen bekommen ihre eigene Kante, sonst faellt der Block auf
   `--spr-weitere` zurueck und sieht aus wie ein dritter Sprecher. */
table.block-sAnsage, table.block-sunklar{border-left-color:var(--text-muted)}
/* Der Editor darf die Schriftgroesse der Markenzelle NICHT erben. `td.marke`
   im Block hat `font-size:0`, und `input.edit{font:inherit}` machte daraus
   ein 0 px hohes Feld. Die Tab-Kette springt Markenzellen inzwischen an
   (`bearbeiten`), aber ein Doppelklick kann sie weiter treffen — zwei
   Schloesser an derselben Tuer sind hier billiger als eines. */
#mischpult input.edit{font-size:14px}
