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
+215 -29
View File
@@ -56,12 +56,97 @@
.saal {
position: relative;
display: grid;
/* ==== DREI ZEILEN, UND NUR DIE MITTLERE DEHNT SICH ===============
Vorher standen hier nur zwei Kinder und gar keine Zeilenangabe --
der Browser verteilte den Platz zwischen Saal und Regie, wie er
wollte. Mit der Regieleiste oben wären es drei, und das Bild
hätte gegen zwei Leisten um Platz gekämpft.
`minmax(0, 1fr)` und nicht `1fr`: Ein Raster-Kind mit `1fr` hat
eine Mindestgröße von `auto` — es kann also größer werden als
sein Anteil, wenn sein Inhalt das verlangt, und schiebt dann
alles darunter aus dem Fenster. Genau das ist am 28.09. mit der
Regie passiert (197 px Überlauf). Die Null nimmt ihm das Recht.
DIESE ANGABE STEHT NUR HIER — und das ist der eigentliche
Punkt. Bis zum 28.09.2026 gab es 900 Zeilen weiter unten eine
ZWEITE (`minmax(0, 1fr) auto`, aus der Zeit, als der Saal zwei
Zeilen hatte). Sie stand später in der Datei und gewann: Die
Regieleiste landete in der `1fr`-Zeile, bekam null Pixel, und
ihre Register ragten über das Video.
WIE MICH DAS FAST IN DIE FALSCHE REPARATUR GEFÜHRT HÄTTE: Ich
habe im Browser vier Möglichkeiten durchprobiert und dabei
`style.gridTemplateRows` gesetzt — ein Stilattribut am Element
schlägt JEDE Regel im Stilblatt. Damit sah es so aus, als läge
es an `auto` gegen `min-content`; beide „funktionierten", weil
beide die zweite Regel aushebelten. Erst nachdem die Doppelung
weg war, hat die Gegenprobe gezeigt: `auto` tut es genauso.
Eine Probe, die mehr ändert als das, wonach man sucht,
beantwortet eine andere Frage. */
grid-template-rows: auto minmax(0, 1fr) auto;
/* Die Kopfleiste ist 69 px hoch (gemessen, nicht geschätzt -- siehe
pruef-handy, das sie über alle Breiten abmisst). */
height: calc(100dvh - 69px);
padding: 0;
max-width: none;
}
.regieleiste { grid-row: 1; }
#teil-zu, #teil-warte, #teil-live { grid-row: 2; }
.pult { grid-row: 3; }
/* =====================================================================
DIE REGIELEISTE — über dem Saal (28.09.2026)
Filipe: „ich hätte das gerne oben also nicht in dieser kachel
sondern über der kachel wo die videos laufen werden."
SIE IST FLACH UND DUNKEL. Eine Leiste am oberen Rand steht neben
dem Video und über allem, was im Saal passiert — alles, was dort
selbst leuchtet, zieht den Blick vom Bild weg. Sie bekommt deshalb
keine Farbe, nur eine Kante nach unten und einen Hauch Licht
darüber, damit sie als Körper lesbar bleibt und nicht als Strich.
===================================================================== */
.regieleiste {
position: relative;
z-index: 50;
min-width: 0;
/* Schild und Register nebeneinander. Das Schild steht AUSSERHALB
des rollenden Teils -- es soll stehenbleiben, wenn die Register
unter dem Finger wandern. */
display: flex; align-items: stretch;
padding: 0;
background:
linear-gradient(180deg, rgba(255, 255, 255, .05), transparent 60%),
rgba(7, 6, 13, .96);
border-bottom: 1px solid var(--rand-hell);
box-shadow: 0 10px 26px -20px #000;
backdrop-filter: blur(16px) saturate(1.15);
-webkit-backdrop-filter: blur(16px) saturate(1.15);
}
.regieleiste[hidden] { display: none; }
/* Das Schild. Klein, gesperrt, leise -- es soll benennen, nicht
rufen. Rechts eine haarfeine Kante als Trennung; ein Abstand
allein liest sich bei sieben Wörtern daneben nicht als Grenze. */
.regieleiste__schild {
flex: none;
display: flex; align-items: center;
padding: 0 14px 0 16px;
margin-right: 4px;
border-right: 1px solid var(--rand);
font-size: .68rem; font-weight: 800;
letter-spacing: .22em; text-transform: uppercase;
color: color-mix(in srgb, var(--schrift-leise) 72%, transparent);
user-select: none;
}
/* AM HANDY WEG. Dort zählt jeder Millimeter für die Register
selbst -- und wer die Regie auf dem Handy öffnet, weiß, was er
geöffnet hat. */
@media (max-width: 560px) {
.regieleiste__schild { display: none; }
}
/* ---------------------------------------------------------------------
DAS SCHILD
@@ -896,19 +981,17 @@
mit `1fr auto`; klappt das Pult auf, wird der Kinosaal darueber
von selbst kleiner. Nichts wird verdeckt, und niemand muss eine
Hoehe ausrechnen, die spaeter nicht mehr stimmt. */
/* 197 PIXEL ZUM SCROLLEN -- gemessen am 28.09.2026, sobald die Regie
aufgeklappt war.
/* DIE ZEILEN DES SAALS STEHEN GANZ OBEN, BEI `.saal` -- und nur
dort. Hier stand bis zum 28.09.2026 eine zweite Angabe
(`minmax(0, 1fr) auto`), aus der Zeit, als der Saal zwei Zeilen
hatte. Sie stand SPAETER in der Datei und gewann damit gegen die
dreizeilige oben: Die Regieleiste landete in der `1fr`-Zeile,
bekam null Pixel, und ihre Register ragten ueber das Video.
`1fr` heisst nicht „nimm, was uebrig ist", sondern
`minmax(auto, 1fr)`: Die Zeile darf nie kleiner werden als ihr
Inhalt. Der Kinosaal hat aber einen Mindestinhalt, und mit
aufgeklapptem Pult passte beides nicht mehr in die Hoehe -- also
wuchs die Seite nach unten. Wer sendet, scrollte dann mitten in
der Sendung, um an das Bild oder an die Knoepfe zu kommen.
`minmax(0, 1fr)` erlaubt der Zeile zu schrumpfen. Der Kinosaal
wird kleiner, der Chat rollt in sich -- was er ohnehin tut. */
.saal { grid-template-rows: minmax(0, 1fr) auto; }
Gemessen war das `0px 491px 340px` -- und im Quelltext oben stand
die ganze Zeit die richtige Angabe. Zwei Regeln, die dieselbe
Frage beantworten, sind keine Sicherheit, sondern die Garantie,
dass eine davon irgendwann falsch ist. */
.pult {
z-index: 60;
@@ -1071,33 +1154,119 @@
Regie 459 -- die Knoepfe waren groesser als das, worum es geht.
Mit 19rem bleibt das Bild der groessere Teil, und die
Sendungs-Tafel (264 Pixel) passt trotzdem ohne Rollen hinein. */
max-height: min(40dvh, 19rem);
/* 17rem SEIT DEM 28.09., VORHER 19. Die Register sind aus diesem
Teil heraus nach oben gewandert; sie waren hier rund 47 Pixel
hoch. Die Sendungs-Tafel misst 264 Pixel und passt damit
weiterhin ohne Rollen hinein — die 32 Pixel Unterschied gehen
an das Bild zurück. */
max-height: min(40dvh, 17rem);
overflow-y: auto;
}
.pult[data-auf="ja"] .pult__innen { display: grid; }
/* ---- Die Register ----------------------------------------------------- */
/* ---- Die Register -----------------------------------------------------
SIE BRECHEN NICHT UM, SIE ROLLEN. Sieben Register in zwei Zeilen
kosten am oberen Rand rund 90 Pixel — und zwar dem Video, um das
es geht. Waagerecht rollen kostet null.
`scroll-snap` rastet das angefasste Register mittig ein; ohne das
bleibt auf dem Handy regelmäßig eines halb angeschnitten stehen,
und ein halber Knopf sieht aus wie ein Fehler. */
.reiter {
display: flex; gap: 4px; flex-wrap: wrap;
padding: 4px;
border-radius: 13px;
background: rgba(0, 0, 0, .35);
border: 1px solid var(--rand);
position: relative;
display: flex; gap: 4px; flex-wrap: nowrap;
padding: 5px 10px 6px;
overflow-x: auto;
overscroll-behavior-x: contain;
scroll-snap-type: x proximity;
scrollbar-width: none;
/* AN DEN RAENDERN VERLAEUFT SIE. Das ist die einzige Auskunft
darüber, dass rechts noch etwas kommt — eine Rollleiste zeigen
Mac und Handy von sich aus nicht an. */
mask-image: linear-gradient(90deg, transparent, #000 14px,
#000 calc(100% - 14px), transparent);
}
.reiter::-webkit-scrollbar { display: none; }
.reiter__knopf {
appearance: none; cursor: pointer;
position: relative;
display: inline-flex; align-items: center; gap: 7px;
min-height: 38px; padding: 0 14px;
border: 0; border-radius: 10px;
/* 44 PX UND NICHT MEHR 38. In der Schublade war das ein Reiter
unter vielen; oben am Rand ist es das Erste, wonach ein Daumen
greift. Die Hausgröße für Fingerziele ist 44. */
min-height: 44px; padding: 0 15px;
flex: none;
scroll-snap-align: center;
border: 0; border-radius: 11px;
background: none;
color: var(--schrift-leise);
font-size: .82rem; font-weight: 700;
white-space: nowrap;
transition: color .16s ease, background-color .16s ease;
}
.reiter__knopf:hover { color: var(--schrift); }
/* DIE FLAECHE MACHT DIE MARKE, DIE FARBE MACHT DER KNOPF.
Zwei Anzeigen für dieselbe Sache -- aber nur eine davon rechnet.
Vorher trugen beide eine Füllung, und die feste verdeckte die
gleitende. */
.reiter__knopf[aria-selected="true"] {
background: rgba(255, 255, 255, .08);
color: var(--schrift);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
color: #fff;
letter-spacing: .01em;
}
/* ---- Die gleitende Marke ----------------------------------------------
Sie liegt IN der rollenden Leiste, nicht darüber — dadurch wandert
sie beim Rollen von selbst mit, ohne dass jemand nachrechnen muss.
Ihre Lage setzt das Skript aus dem gemessenen Rechteck des
gewählten Knopfes.
UND SIE IST NICHT DIE EINZIGE ANZEIGE. Die Pille darunter bleibt
gefüllt. Sollte die Marke je aus dem Tritt geraten — Schrift lädt
nach, jemand zieht das Fenster —, ist die Auswahl trotzdem zu
sehen. Eine Anzeige, die rechnet, braucht eine daneben, die es
nicht tut. */
.reiter__marke {
position: absolute;
left: 0; top: 0;
width: 0; height: 0;
z-index: 0;
border-radius: 11px;
/* Glas mit Lichtkante oben und Tiefe unten -- dieselbe Sprache
wie überall im Haus: Was obenauf liegt, bekommt oben Licht. */
background:
linear-gradient(180deg, rgba(255, 255, 255, .11), rgba(255, 255, 255, .045));
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, .16),
inset 0 -1px 0 rgba(0, 0, 0, .3),
0 6px 16px -10px #000;
transform: translate(0, 0);
transition:
transform .3s cubic-bezier(.22, 1, .3, 1),
width .3s cubic-bezier(.22, 1, .3, 1);
pointer-events: none;
}
/* Der Streifen darunter führt zur Tafel, die gerade offen ist --
das ist die einzige Farbe in der ganzen Leiste. */
.reiter__marke::after {
content: '';
position: absolute;
left: 12px; right: 12px; bottom: -5px;
height: 2px;
border-radius: 2px;
background: linear-gradient(90deg,
transparent,
var(--an-hell) 25%, var(--an-hell) 75%,
transparent);
box-shadow: 0 0 10px -1px var(--an-hell);
}
/* IST DIE REGIE ZUGEKLAPPT, IST DIE TAFEL NICHT DA -- dann führt
der Streifen nirgendwohin und wird leise. Eine Auskunft, die
nichts kostet: Man sieht am Rand, ob unten etwas offen ist. */
.saal:has(.pult[data-auf="nein"]) .reiter__marke::after { opacity: .28; }
/* Solange nichts gemessen ist, gibt es sie nicht — eine Marke, die
bei null anfängt und dann springt, sieht nach Fehler aus. */
.reiter__marke[hidden] { display: none; }
.reiter__zahl {
min-width: 20px; padding: 1px 6px;
border-radius: 999px;
@@ -1644,7 +1813,22 @@
}
.warte__buehne { gap: 18px; }
.pult__innen { max-height: 62dvh; }
/* 52dvh SEIT DEM 28.09., VORHER 62. Die Register sind nach oben
gewandert, und auf 844 Pixel Höhe blieben mit 62 nur 131 Pixel
für das Bild übrig -- ein Streifen, kein Video. Gemessen mit
52: 215 Pixel. Die Tafeln rollen ohnehin in sich; was hier
kleiner wird, ist die Höhe der Schublade, nicht ihr Inhalt. */
/* GEMESSEN UND NICHT GESCHAETZT. Vorher 62dvh -- damit blieben auf
844 Pixel Höhe 131 Pixel für das Bild übrig, ein Streifen. Mit
52dvh wurden es 75: schlechter, nicht besser. Der Grund stand
woanders — die Leiste des Pults bricht am Handy in vier Zeilen
um und ist dort rund 200 Pixel hoch, nicht 67. Ein Anteil der
Fensterhöhe kann davon nichts wissen.
Also eine feste Obergrenze daneben: 19rem sind 304 Pixel, und
200 + 304 lassen dem Video 217 — genug für ein 16:9-Bild auf
390 Pixel Breite (219). Die Tafeln rollen in sich; kleiner wird
die Schublade, nicht ihr Inhalt. */
.pult__innen { max-height: min(52dvh, 19rem); }
/* ==== DIE REGIE AM HANDY ======================================
Die Leiste bleibt -- sie ist der Teil, den man im Notfall
@@ -1657,10 +1841,10 @@
.laufzeit__zahl { font-size: .98rem; }
.tun { padding: 0 13px; font-size: .8rem; }
.pult__innen { padding: 11px 12px 14px; }
/* Die Register rollen waagerecht statt umzubrechen: Fünf Reiter in
zwei Zeilen sehen aus wie zehn Knöpfe. */
.reiter { flex-wrap: nowrap; overflow-x: auto; }
.reiter__knopf { white-space: nowrap; }
/* Die Register rollen auf JEDER Breite waagerecht -- das steht
jetzt in der Grundregel. Am Handy wird nur enger gefasst. */
.reiter { padding: 4px 8px 5px; gap: 3px; }
.reiter__knopf { padding: 0 12px; font-size: .8rem; }
.regler-reihe { gap: 8px; }
.regler { padding: 9px 9px 8px; }
.regler input[type="range"], .pegel { height: 76px; }
@@ -1673,6 +1857,7 @@
.buehne-schild__punkt,
.lampe__punkt { animation: none !important; }
.pult__klapp svg,
.reiter__marke,
.pegel i { transition: none !important; }
}
@@ -1902,6 +2087,7 @@
===================================================================== */
body[data-nur="buehne"] .kopfleiste,
body[data-nur="buehne"] .schiene,
body[data-nur="buehne"] .regieleiste,
body[data-nur="buehne"] .pult,
body[data-nur="buehne"] .buehne-schild,
body[data-nur="buehne"] .senderleiste,