Die Regieleiste steht jetzt über dem Saal

Filipe: „ich hätte das gerne oben also nicht in dieser kachel sondern
über der kachel wo die videos laufen werden und das soll extrem
perfektioniert werden."

WARUM DAS MEHR IST ALS EIN UMHÄNGEN
Die Register standen INNERHALB des einklappbaren Teils. Wer die Regie
zuklappte, um mehr Bild zu haben, hatte sie nicht mehr — und genau
dann braucht man sie. Oben ändert sich ihre Aufgabe: aus dem
Inhaltsverzeichnis einer Schublade wird eine Steuerleiste über der
Sendung. Daraus folgen vier Dinge, die vorher nicht nötig waren:

1. EIN REGISTER MACHT DIE ZUGEKLAPPTE REGIE AUF. Vorher wechselte nur
   der Reiter, die Tafel lag im zugeklappten Teil — sichtbar passierte
   nichts. Nur auf, nie zu: Zugemacht wird mit dem Griff. Ein Knopf,
   der beim zweiten Druck das Gegenteil tut, versteckt irgendwann
   etwas, das jemand gerade liest.

2. SIE BRICHT NICHT UM, SIE ROLLT. Sieben Register in zwei Zeilen
   kosten am oberen Rand rund 90 px — und zwar dem Video. Gemessen:
   eine Zeile auf 1440 px wie auf 390 px, dort mit Einrasten und
   weichen Rändern als Auskunft, dass es weitergeht.

3. SIE LÖST EIN, WAS `role="tablist"` VERSPRICHT. Pfeiltasten wandern,
   Pos1/Ende springen, genau ein Register liegt in der Tabulatorfolge.
   Steht die Rolle im Markup und tut das Programm es nicht, sagt ein
   Vorleser etwas an, was nicht stimmt — schlimmer als keine Rolle.
   Gemessen wird das gedrückt, nicht gelesen: fünf Tastendrücke, und
   Fokus, Auswahl und offene Tafel müssen jedes Mal dasselbe sagen.

4. EINE GLEITENDE MARKE zeigt, wo man steht — Glas mit Lichtkante,
   darunter ein roter Streifen zur offenen Tafel. Ist die Regie
   zugeklappt, wird er leise: Der Streifen führt dann nirgendwohin.
   Dazu ein Schild „Regie" links (am Handy weg), damit die sieben
   Wörter am oberen Rand nicht wie eine zweite Navigation aussehen.

DER FEHLER, DER MICH ZWEI ANLÄUFE GEKOSTET HAT
Die Leiste war im Browser 1 px hoch, ihre Register standen 55 px hoch
daneben und ragten über das Video. Ursache: 900 Zeilen weiter unten
stand eine ZWEITE `grid-template-rows` für `.saal` (aus der Zeit, als
der Saal zwei Zeilen hatte). Sie stand später und gewann — die Leiste
landete in der `1fr`-Zeile und bekam null Pixel.

Und fast hätte ich das Falsche repariert: Beim Durchprobieren habe ich
`style.gridTemplateRows` gesetzt — ein Stilattribut schlägt jede Regel
im Stilblatt. Damit „funktionierten" `auto` und `min-content` gleich
gut, weil beide die zweite Regel aushebelten, und es sah nach einem
Unterschied zwischen den beiden aus. Erst nach dem Entfernen der
Doppelung hat die Gegenprobe gezeigt: `auto` tut es genauso. Eine
Probe, die mehr ändert als das, wonach man sucht, beantwortet eine
andere Frage. Es gibt jetzt eine Prüfung, dass genau EINE Regel die
Zeilen des Saals bestimmt.

ZWEI WEITERE FUNDE AUS DER MESSUNG
Am Handy blieben bei offener Regie 131 px für das Bild — ein Streifen.
Mein erster Versuch (62dvh → 52dvh) machte es auf 75 px SCHLECHTER:
Die Ursache lag woanders, die Leiste des Pults bricht dort in vier
Zeilen um und ist rund 200 px hoch, wovon ein Anteil der Fensterhöhe
nichts wissen kann. Mit `min(52dvh, 19rem)` sind es 210 px.

Und die Spendenkarte wurde als „steht aus dem Bild heraus" gemeldet:
413 statt 430 px, links −1. 413 ist genau das 0,96-fache — die Messung
hatte die Karte im Ausblenden erwischt. Sie wartet jetzt auf
`data-da="ja"` und misst nur, was ganz da ist.

GEPRUEFT
pruef-reaktion 280 (vorher 260), 0 Fehler — Abschnitt 18 neu.
mess-reaktion: Rückgabewert 0, kein ACHTUNG; misst die Leiste jetzt
auf 1440 und auf 390 px, samt Tastatur und Aufklappen.
Dazu grün: handy, buehne, struktur, css-klassen, tippziele.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-28 14:13:07 +02:00
co-authored by Claude Opus 5
parent d2f02ba84e
commit 2b02d88767
49 changed files with 1917 additions and 1255 deletions
+100
View File
@@ -1552,6 +1552,106 @@ melde("=== 17. Tempo, Anordnung und das zweite Video ===");
}
}
/* =======================================================================
18. DIE REGIELEISTE UEBER DEM SAAL
Filipe, 28.09.2026: „ich haette das gerne oben also nicht in dieser
kachel sondern ueber der kachel wo die videos laufen werden."
Geprueft wird hier, was sich aus dem Quelltext beweisen laesst --
Lage, Verdrahtung, Versprechen. Wie hoch sie ist und ob die Marke
sitzt, misst `mess-reaktion` im Browser; das kann kein Quelltext.
======================================================================= */
melde("");
melde("=== 18. Die Regieleiste ===");
{
const html = readFileSync(join(HIER, "..", "workspace", "reaktion.html"), "utf8");
const css = readFileSync(join(HIER, "..", "workspace", "assets", "css", "reaktion.css"), "utf8");
const js = readFileSync(join(HIER, "..", "workspace", "assets", "js", "reaktion.js"), "utf8");
/* ---- SIE STEHT UEBER DEM SAAL, NICHT DARIN ----
Die Reihenfolge im Dokument ist die Aussage. Waere sie wieder im
Pult, stuende sie weiter unten -- und niemandem fiele es auf,
solange sie „irgendwo" da ist. */
const iLeiste = html.indexOf('id="regieleiste"');
const iKino = html.indexOf('id="teil-live"');
const iPult = html.indexOf('id="pult"');
ok(iLeiste > 0, "es gibt die Regieleiste");
ok(iLeiste < iKino, `sie steht vor dem Kino (${iLeiste} < ${iKino})`);
ok(iLeiste < iPult, "und vor dem Pult");
ok(html.indexOf('id="reiter"') < iPult,
"die Register stehen nicht mehr im Pult");
/* ---- JEDES REGISTER ZEIGT AUF EINE TAFEL, DIE ES GIBT ----
`aria-controls` ist ein Versprechen an Hilfsmittel. Zeigt es ins
Leere, sagt der Vorleser eine Tafel an, die niemand oeffnen
kann -- und gemerkt haette es nie jemand. */
const reiter = [...html.matchAll(/data-tafel="([a-z]+)"[^>]*aria-controls="([^"]+)"/g)]
.concat([...html.matchAll(/aria-controls="([^"]+)"[^>]*data-tafel="([a-z]+)"/g)]
.map((m) => [m[0], m[2], m[1]]));
ok(reiter.length >= 7, `${reiter.length} Register gefunden`);
const ohneTafel = reiter.filter(([, , ziel]) => !html.includes(`id="${ziel}"`));
ok(ohneTafel.length === 0,
ohneTafel.length
? `ZEIGT INS LEERE: ${ohneTafel.map((x) => x[2]).join(", ")}`
: "jedes Register zeigt auf eine Tafel, die es gibt");
ok(!html.includes('id="tafel-gibtesnicht"'),
"Gegenprobe: eine erfundene Tafel gibt es nicht");
/* ---- DAS VERSPRECHEN VON `role=tablist` ----
Steht die Rolle im Markup und loest das Programm sie nicht ein,
sagt ein Vorleser etwas an, was nicht stimmt. Das ist schlimmer
als gar keine Rolle. */
ok(/id="reiter"[^>]*role="tablist"/.test(html), "die Leiste ist eine Registerleiste");
/* Die Anfuehrungszeichen bleiben draussen -- im Quelltext steht
`'Home'`, in dieser Pruefung stand zuerst `"Home"`, und daran
ist sie gescheitert. Eine Pruefung, die die Schreibweise der
Anfuehrungszeichen mitprueft, prueft die falsche Sache. */
for (const taste of ["ArrowRight", "ArrowLeft", "Home", "End"]) {
ok(js.includes(taste), `das Programm kennt „${taste}"`);
}
ok(/tabIndex\s*=\s*gewaehlt \? 0 : -1/.test(js),
"genau ein Register liegt in der Tabulatorfolge");
/* ---- EIN REGISTER MACHT DIE ZUGEKLAPPTE REGIE AUF ----
Seit die Leiste oben steht, kann das Pult zu sein. Ohne diese
Zeile waere jedes Register bei zugeklappter Regie ein Knopf,
bei dem sichtbar nichts passiert. */
ok(/pult\.dataset\.auf = 'ja'/.test(js) && /reiterWechseln/.test(js),
"ein Register klappt die Regie auf");
/* ---- DIE MARKE UND IHRE ZWEITE ANZEIGE ----
Was gerechnet wird, braucht etwas daneben, das nicht rechnet. */
ok(html.includes('id="reiter-marke"'), "es gibt die gleitende Marke");
ok(/offsetLeft/.test(js) && /offsetWidth/.test(js) && /offsetHeight/.test(js),
"sie wird aus gemessenen Werten gesetzt, nicht gerechnet");
const knopfRegel = css.match(/\.reiter__knopf\[aria-selected="true"\] \{[^}]*\}/);
ok(!!knopfRegel && /color:/.test(knopfRegel[0]),
"das gewaehlte Register traegt ausserdem eine eigene Farbe");
/* ---- SIE GEHOERT NICHT IN DEN STREAM ----
Der Buehnenmodus zeigt nur, was Zuschauer sehen sollen. Eine
Regieleiste im Stream waere die Bedienung im Bild. */
ok(/body\[data-nur="buehne"\][^{]*\.regieleiste/.test(css.replace(/\s+/g, " ")),
"im Buehnenmodus ist sie weg");
/* ---- NUR EINE STELLE SAGT, WIE HOCH DIE ZEILEN SIND ----
Bis zum 28.09. standen zwei Angaben in derselben Datei; die
spaetere gewann und gab der Leiste null Pixel. Zwei Regeln fuer
dieselbe Frage sind keine Sicherheit. */
const zeilen = [...css.matchAll(/^\s*\.saal[^{]*\{[^}]*grid-template-rows/gm)]
.concat([...css.matchAll(/^\.saal \{ grid-template-rows/gm)]);
ok(zeilen.length === 1,
zeilen.length === 1
? "genau eine Regel bestimmt die Zeilen des Saals"
: `${zeilen.length} Regeln bestimmen die Zeilen -- eine davon wird ignoriert`);
/* ---- UND SIE GEHOERT NUR DENEN, DIE SENDEN ---- */
ok(/leiste\.hidden = !lage\.ich\.host/.test(js),
"nur wer die Sendung fuehrt, sieht sie");
}
melde("");
melde(`${geprueft} Pruefungen, ${fehler} Fehler`);
melde(fehler === 0 ? "ALLES IN ORDNUNG" : "NICHT IN ORDNUNG");