From a6d55d939a0a37e0a503d47b0da5d549341b4f96 Mon Sep 17 00:00:00 2001 From: Dogfather Date: Mon, 28 Sep 2026 20:45:34 +0200 Subject: [PATCH] Die Regie steht links neben dem Video, nicht nur unten Filipe, 28.09.2026: "anstatt alles nur unten zu haben wieso nicht rechts und links noch ausnutzen um mehr ueberblick zu haben." ICH HATTE IHN ZWEIMAL FALSCH VERSTANDEN. Beim ersten Mal baute ich zwei Spalten INNERHALB der unteren Leiste, beim zweiten Mal Kacheln darin. Gemeint war der BILDSCHIRM: Die Regie klebte als 272 Pixel hoher Streifen unten, waehrend darueber das ganze Bild frei war. Man sah entweder das Video oder die Bedienung. AUFGEKLAPPT steht sie jetzt LINKS neben dem Video, ueber die volle Hoehe. Rechts der Chat, unten die Senderleiste und der Transport -- die Anordnung jedes Sendepults: Was man bedient, liegt neben dem, was man dabei ansieht. ZUGEKLAPPT bleibt alles wie vorher, eine schmale Leiste unten. Wer die Regie zumacht, will das Bild gross; eine leere Spalte daneben waere das Gegenteil. WAS DAS NEBENBEI LOEST: Die Kacheln hatten unten 272 Pixel fuer sich -- drei Felder untereinander passten nicht hinein, und die Transportleiste verdeckte den Rest. In einer Spalte stehen rund 700 Pixel zur Verfuegung. Die Enge war nie eine Frage der Gestaltung, sondern des Platzes. DER TRANSPORT VERLAESST DAS REGISTER. Er lag in "Sendung" und war damit weg, sobald jemand auf "Ton" oder "Spenden" ging. Jetzt ist er eine eigene Zeile unter dem Saal -- und damit auch bei zugeklappter Regie da. Der Play-Knopf ist der eine, den man mitten in einer Sendung blind treffen muss. `:has(.pult[data-auf="ja"])` UND KEINE KLASSE AM KOERPER: Der Zustand steht schon am Pult; ein zweiter Merker waere die zweite Antwort auf dieselbe Frage. Erst ab 1100 px -- darunter bleibt fuer das Video keine Breite: 26rem Regie plus 23rem Chat sind 784 Pixel. Gerechnet, nicht geraten. ======================================================================= DREI BEFUNDE GEGEN DIE EIGENEN PRUEFUNGEN -- UND EINER IST ERNST 1. "GENAU EINE REGEL DARF DIE ZEILEN DES SAALS SETZEN" war die Faustregel zum Befund vom Nachmittag, aber nicht die Frage, um die es geht. Eine zweite FASSUNG (Handy, aufgeklappte Regie) ist richtig und noetig -- sie setzt die Zeilen neu UND verteilt die Kinder neu. Der Fehler war eine zweite ANGABE, die die Zeilenzahl VERKLEINERT und die Kinder stehen laesst. Geprueft wird jetzt genau das: Jede Fassung, deren Gegenstand der Saal IST, muss gleich viele Zeilen haben. 2. DER ERNSTE: Dieselbe Pruefung hatte einen BLINDFLECK. Ihr Muster liess den Regelrumpf ueber eine oeffnende Klammer hinweg laufen (`[^}]*` statt `[^{}]*`) -- damit fiel jede Regel INNERHALB eines `@media` heraus. Gemessen: Sie meldete "alle 1 Fassungen", obwohl zwei dastanden. Ein Fehler im Medienblock -- und genau dort steht die ganze Handyansicht -- waere unbemerkt durchgegangen. Die Gegenprobe beweist jetzt, dass eine Fassung mit weniger Zeilen wirklich auffaellt. 3. Auch beim Regieplatz zaehlte sie Fassungen statt Wirkung und schlug an, sobald eine dritte dazukam. Jetzt prueft sie, ob eine Fassung eine KACHEL VERGISST -- dann verschwindet die in genau dieser Ansicht, und gemerkt haette es niemand. pruef-reaktion 374/0 - pruef-css-klassen ok - pruef-tippziele 11/0 Co-Authored-By: Claude Opus 5 --- server/pruef-reaktion.mjs | 121 +++++++++++++++++++++-------- workspace/anruf-probe.html | 10 +-- workspace/app.webmanifest | 8 +- workspace/assets/css/reaktion.css | 94 +++++++++++++++++++++-- workspace/assets/js/reaktion.js | 8 ++ workspace/aufgaben.html | 38 ++++----- workspace/automation.html | 32 ++++---- workspace/befinden.html | 34 ++++----- workspace/bereich.html | 44 +++++------ workspace/bewerben.html | 38 ++++----- workspace/bewerbungen.html | 36 ++++----- workspace/buehne.html | 2 +- workspace/calls.html | 34 ++++----- workspace/chat.html | 40 +++++----- workspace/content.html | 34 ++++----- workspace/crew-index.html | 12 +-- workspace/crew.webmanifest | 8 +- workspace/dateien.html | 34 ++++----- workspace/entwicklung.html | 36 ++++----- workspace/hilfe.html | 30 ++++---- workspace/index.html | 10 +-- workspace/kalender.html | 34 ++++----- workspace/leistung.html | 32 ++++---- workspace/material.html | 32 ++++---- workspace/notizen.html | 28 +++---- workspace/personen.html | 32 ++++---- workspace/profil.html | 36 ++++----- workspace/reaktion.html | 123 +++++++++++++++--------------- workspace/rechte.html | 34 ++++----- workspace/report.html | 36 ++++----- workspace/scouting.html | 32 ++++---- workspace/start.html | 32 ++++---- workspace/startcheck.html | 34 ++++----- workspace/steckbrief.html | 36 ++++----- workspace/support.html | 28 +++---- workspace/tafel.html | 6 +- workspace/talente.html | 36 ++++----- workspace/team.html | 32 ++++---- workspace/teamlage.html | 34 ++++----- workspace/teilen.html | 30 ++++---- workspace/treff-moderation.html | 32 ++++---- workspace/treff-regeln.html | 32 ++++---- workspace/uebersicht.html | 32 ++++---- workspace/unsere-seiten.html | 30 ++++---- workspace/unterstuetzen.html | 32 ++++---- workspace/werdegang.html | 32 ++++---- workspace/willkommen.html | 30 ++++---- workspace/wissen.html | 34 ++++----- 48 files changed, 895 insertions(+), 749 deletions(-) diff --git a/server/pruef-reaktion.mjs b/server/pruef-reaktion.mjs index f60d70d9..c411803e 100644 --- a/server/pruef-reaktion.mjs +++ b/server/pruef-reaktion.mjs @@ -1651,27 +1651,61 @@ melde("=== 18. Die Regieleiste ==="); diese Pruefung -- sie war gruen und wertlos. Jetzt zaehlt JEDE Regel, in deren Auswahl `.saal` vorkommt. */ - const zeilen = [...css.matchAll(/\{|\}/g)].length >= 0 - ? [...css.replace(/\/\*[\s\S]*?\*\//g, " ") - .matchAll(/([^{}]*\.saal[^{}]*)\{([^}]*)\}/g)] - .filter((m) => /grid-template-rows/.test(m[2])) - : []; - ok(zeilen.length === 1, - zeilen.length === 1 - ? `genau eine Regel bestimmt die Zeilen des Saals (${zeilen[0][1].trim()})` - : `${zeilen.length} Regeln bestimmen die Zeilen des Saals -- ` - + `eine davon wird irgendwo ignoriert: ` - + zeilen.map((m) => m[1].trim()).join(" / ")); - /* GEGENPROBE: Die Pruefung muss eine zweite Regel auch dann - finden, wenn sie nicht am Zeilenanfang steht -- genau daran ist - sie gescheitert. */ + /* ==== NICHT „WIE VIELE", SONDERN „WIE VIELE ZEILEN" ========== + + Diese Pruefung zaehlte Regeln: „genau eine darf die Zeilen des + Saals setzen." Das war die Faustregel zum Befund -- aber nicht + die Frage, um die es geht. Eine zweite FASSUNG (Handy, + aufgeklappte Regie) ist richtig und noetig; sie setzt die + Zeilen neu UND verteilt die Kinder neu. Der Fehler war eine + zweite ANGABE, die die Zeilenzahl VERKLEINERT und die Kinder + stehen laesst: Der Buehnenmodus gab dem Saal eine Zeile, + waehrend `#teil-live` auf Zeile 2 genagelt war -- Leinwand null + Pixel hoch. + + Also: Jede Regel, deren Gegenstand der Saal IST, muss gleich + viele Zeilen setzen. Regeln, die nur zufaellig `.saal` im + Vorfahrenpfad haben (`.saal … .pult { … }`), zaehlen nicht -- + sie beantworten eine andere Frage. */ + /* `[^{}]*` FUER DEN RUMPF UND NICHT `[^}]*` -- der Unterschied + ist ein Blindfleck: Mit `[^}]*` verschluckt der Rumpf die + oeffnende Klammer eines `@media`, und jede Regel INNERHALB + eines Medienblocks faellt aus der Pruefung. Gemessen: Sie + meldete „alle 1 Fassungen", obwohl zwei dastanden. Ein Fehler + im Medienblock -- und genau dort steht die Handyansicht -- + waere unbemerkt durchgegangen. */ + const saalRegeln = (text) => [...text.replace(/\/\*[\s\S]*?\*\//g, " ") + .matchAll(/([^{}]+)\{([^{}]*)\}/g)] + .filter((m) => /grid-template-rows/.test(m[2])) + /* Der GEGENSTAND einer Auswahl ist ihr letzter Teil. Bei + `.saal .pult` ist das `.pult` -- und dessen Zeilen gehen den + Saal nichts an. */ + .filter((m) => { + const teile = m[1].trim().split(/\s+|>/).filter(Boolean); + return /\.saal/.test(teile[teile.length - 1] || ""); + }) + .map((m) => ({ + wahl: m[1].trim(), + zeilen: (m[2].match(/grid-template-rows:\s*([^;]+)/) || [, ""])[1] + .trim().split(/\s+(?![^(]*\))/).filter(Boolean).length, + })); + + const saal = saalRegeln(css); + const zahlen = [...new Set(saal.map((x) => x.zeilen))]; + ok(saal.length >= 1 && zahlen.length === 1, + zahlen.length === 1 + ? `alle ${saal.length} Fassungen des Saals haben ${zahlen[0]} Zeilen` + : `UNGLEICH VIELE ZEILEN: ` + saal.map((x) => `${x.wahl} → ${x.zeilen}`).join(" / ")); + + /* GEGENPROBE: Eine eingeschobene Fassung mit WENIGER Zeilen muss + auffallen -- genau die war der Buehnenmodus, und genau die hat + die alte Pruefung nicht gesehen. */ { - const erfunden = 'body[data-nur="probe"] .saal { grid-template-rows: 1fr; }'; - const mit = [...(css + erfunden).replace(/\/\*[\s\S]*?\*\//g, " ") - .matchAll(/([^{}]*\.saal[^{}]*)\{([^}]*)\}/g)] - .filter((m) => /grid-template-rows/.test(m[2])); - ok(mit.length === 2, - `Gegenprobe: eine eingeschobene zweite Regel faellt auf (${mit.length})`); + const erfunden = 'body[data-nur="probe"] .saal { grid-template-rows: minmax(0, 1fr); }'; + const mit = saalRegeln(css + erfunden); + ok([...new Set(mit.map((x) => x.zeilen))].length === 2, + `Gegenprobe: eine Fassung mit weniger Zeilen faellt auf ` + + `(${[...new Set(mit.map((x) => x.zeilen))].join(" und ")})`); } /* ---- UND SIE GEHOERT NUR DENEN, DIE SENDEN ---- */ @@ -1946,15 +1980,22 @@ melde("=== 20. Regieplatz und Bildschirm ==="); } /* ---- LINKS, RECHTS UND EINE LEISTE UNTEN ---- */ - ok(/laeuft sendung[\s\S]{0,60}laeuft bereit[\s\S]{0,60}leiste leiste/.test(regeln), - "der Regieplatz hat links, rechts und eine Leiste unten"); + ok(/laeuft sendung[\s\S]{0,60}laeuft bereit/.test(regeln), + "der Regieplatz hat links und rechts eine Kachel"); + /* ==== UND DIE REGIE STEHT LINKS NEBEN DEM VIDEO ============== + Filipe: „anstatt alles nur unten zu haben wieso nicht rechts + und links noch ausnutzen um mehr ueberblick zu haben." */ + ok(/"pult kino"/.test(regeln) && /"transport transport"/.test(regeln), + "aufgeklappt steht die Regie links, das Video daneben, der Transport unten"); + ok(/:has\(\.pult\[data-auf="ja"\]\)/.test(regeln), + "und zugeklappt bleibt sie die schmale Leiste von vorher"); /* ==== ES MUESSEN KACHELN SEIN UND KEINE SPALTEN ============== Filipe hat die erste Fassung zerrissen: „ich wollte was hoch professionelles wo rechts links und unten kacheln sind wo alles drin ist." Zwei Spalten mit einer Trennlinie sind eine Teilung, keine Gliederung -- und das sieht man einer CSS-Regel an: Rahmen, eigener Grund, ein Kopf. */ - const kachel = regeln.match(/\.regiekachel \{[^}]*\}/); + const kachel = regeln.match(/\.regiekachel \{[^{}]*\}/); ok(!!kachel && /border:/.test(kachel[0]) && /background:/.test(kachel[0]), "eine Regiekachel hat Rahmen und eigenen Grund"); ok((html.match(/class="regiekachel/g) || []).length >= 3, @@ -1967,17 +2008,35 @@ melde("=== 20. Regieplatz und Bildschirm ==="); "die linke Kachel hat ein Vorschaubild"); ok(/laufbild-leer/.test(js) && /trag rechts eine YouTube-Adresse ein/.test(html), "und ohne Video sagt sie, was zu tun ist"); - const platz = [...regeln.matchAll(/([^{}]*\.regieplatz[^{}]*)\{([^}]*)\}/g)] + /* ==== JEDE FASSUNG BRAUCHT ALLE DREI KACHELN ================ + Auch hier zaehlte die Pruefung Regeln -- und meldete einen + Fehler, sobald eine dritte Fassung dazukam (schmale Spalte + neben dem Video). Die Zahl der Fassungen ist aber nicht die + Frage. Die Frage ist, ob eine davon eine Kachel VERGISST: Dann + verschwindet sie in genau dieser Ansicht, und gemerkt haette + es niemand. */ + const platz = [...regeln.matchAll(/([^{}]*\.regieplatz[^{}]*)\{([^{}]*)\}/g)] .filter((m) => /grid-template-areas/.test(m[2])); - /* ZWEI REGELN FUER DIESELBE FRAGE SIND DIE GARANTIE, DASS EINE - FALSCH GEWINNT -- heute schon viermal passiert. Die Handyansicht - darf die Bereiche neu setzen; deshalb zwei, nicht eine. */ - ok(platz.length === 2, - `${platz.length} Regeln ordnen den Regieplatz (Rechner und Handy)`); + ok(platz.length >= 2, `${platz.length} Fassungen ordnen den Regieplatz`); + const ohneKachel = platz.filter((m) => !["laeuft", "sendung", "bereit"] + .every((x) => m[2].includes(x))); + ok(ohneKachel.length === 0, + ohneKachel.length + ? `EINE FASSUNG VERGISST EINE KACHEL: ${ohneKachel.map((m) => m[1].trim()).join(" / ")}` + : "und jede davon nennt alle drei Kacheln"); /* Die Leiste traegt den ganzen Transport -- und zwar in EINER. */ - const iLeiste = html.indexOf('class="transport"'); - const iEnde = html.indexOf("", iLeiste); + /* ==== DER TRANSPORT LIEGT UNTER DEM SAAL, NICHT IM REGISTER + Er lag im Register „Sendung" und war damit weg, sobald jemand + auf „Ton" oder „Spenden" ging. Der Play-Knopf ist aber der + eine, den man mitten in einer Sendung blind treffen muss. */ + const iPultEnde = html.indexOf('id="transport"'); + ok(iPultEnde > html.indexOf('id="pult"'), + "der Transport steht hinter dem Pult"); + ok(iPultEnde < html.indexOf(""), + "und noch im Saal -- nicht in einem Register"); + const iLeiste = html.indexOf('id="transport"'); + const iEnde = html.indexOf("", iLeiste); const inLeiste = html.slice(iLeiste, iEnde); for (const k of ["v-band", "v-zeit", "v-zurueck", "v-spiel", "v-vor", "v-naechstes", "tempo"]) { ok(inLeiste.includes(`id="${k}"`), `„${k}" liegt in der Transportleiste`); diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index 315f1cda..5db7bc16 100644 --- a/workspace/anruf-probe.html +++ b/workspace/anruf-probe.html @@ -16,8 +16,8 @@ verdeckt. Gefunden hat es pruef-struktur. Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. --> - - + + - +