diff --git a/server/pruef-workspace-seiten.mjs b/server/pruef-workspace-seiten.mjs index b9d95f0f..7039e619 100644 --- a/server/pruef-workspace-seiten.mjs +++ b/server/pruef-workspace-seiten.mjs @@ -52,10 +52,42 @@ const browser = await chromium.launch(); wird auf beiden Groessen, weil die geteilten Klassen (.kopf-zeile, .inhalt--breit, .leise) am 31.08.2026 von aufgaben.css nach start.css gewandert sind -- faellt dabei etwas herunter, sieht man es hier. */ +/** Stimmt die Buehne dieser Seite? + * + * HERAUSGELOEST, DAMIT SIE EINE GEGENPROBE BEKOMMEN KANN. Als Zeile + * mitten in der Schleife liess sie sich nur pruefen, indem man den + * Fehler in der Anwendung wieder einbaut. Als Funktion beantwortet sie + * die Frage in einer Zeile -- und die Gegenprobe unten beweist, dass + * sie auch NEIN sagen kann. + * + * @param istStart Die Startseite hat ihre feste Grundszene aus + * `body.start::before` und traegt kein `data-buehne`. + * @param gewollt Was `data-buehne` sagt (oder null). + * @param geladen Welches Motiv das CSS tatsaechlich laedt (oder null). + */ +export function buehneRichtig(istStart, gewollt, geladen) { + if (istStart) return !!geladen; + return !!gewollt && geladen === gewollt; +} + +/* chat.html UND leistung.html KAMEN AM 09.09.2026 DAZU -- und der Chat + nicht aus Ordnungsliebe. + + Er fehlte in dieser Liste, und genau auf ihm steckte ein Fehler, den + diese Pruefung haette finden muessen: `chat.html` hat weder + `.kopf-zeile` noch `.k-kopf`, und `kopf.js` stieg deshalb aus, BEVOR + es Ton und Buehne setzte. Die Seite lief seit jeher ohne ihr + Hintergrundbild, obwohl in bereiche.js `szene: 'lounge'` fuer sie + steht. Gefunden hat das keine Pruefung, sondern eine Messung der + Hintergrundhelligkeit aller 18 Seiten -- chat.html meldete als eine + von dreien "keine Buehne". + + Eine Pruefung, die eine Seite nicht kennt, kann auf ihr nichts + finden. */ const SEITEN = ["start.html", "uebersicht.html", "aufgaben.html", "kalender.html", "personen.html", "profil.html", "steckbrief.html", "wissen.html", "dateien.html", - "calls.html", "startcheck.html", "report.html", "scouting.html", - "automation.html", "content.html", "bereich.html?b=live"]; + "calls.html", "chat.html", "leistung.html", "startcheck.html", "report.html", + "scouting.html", "automation.html", "content.html", "bereich.html?b=live"]; let fehler = 0; for (const [breite, hoehe, wie] of [[1440, 1000, "Computer"], [390, 844, "Handy"]]) { @@ -127,8 +159,33 @@ for (const [breite, hoehe, wie] of [[1440, 1000, "Computer"], [390, 844, "Handy" && (istStart || r.rueckweg === "start.html"); /* Auf der Startseite gibt es keinen Seitenkopf -- dort sind die Kacheln selbst der Kopf. Überall sonst ist er Pflicht. */ - const kopfGut = istStart - || (r.ton !== null && r.kopfZeichen > 0 && r.wasserzeichen > 0); + /* ZWEI SEITEN HABEN KEINE KOPFZEILE, UND DAS IST ABSICHT. + + Die Startseite ist ihre eigene Uebersicht. Der Chat fuellt den + Bildschirm mit zwei Spalten (Gespraechsliste und Verlauf) und + traegt seinen Titel in `.chat__kopf` -- eine zusaetzliche + Seitenkopfzeile darueber wuerde ihm eine Zeile Hoehe nehmen, die + er fuer den Verlauf braucht. + + DIE AUSNAHME STEHT HIER MIT NAMEN, statt dass die Seite aus der + Liste faellt. Genau das war vorher der Fall: chat.html wurde + nicht geprueft, und deshalb blieb unbemerkt, dass sie auch ihr + Hintergrundbild verloren hatte. Eine Seite, die man aus der + Liste nimmt, damit die Liste gruen bleibt, ist eine Seite ohne + Pruefung. + + WAS FUER DEN CHAT TROTZDEM GILT: Ton und Buehne. Die haengen am + Bereich, nicht an der Kopfzeile -- sie muessen ankommen. Nur + Plakette und Wasserzeichen entfallen, weil es den Ort dafuer + nicht gibt. + + OFFEN FUER FILIPE: Ob der Chat eine Plakette bekommen soll, ist + eine Gestaltungsfrage, keine Fehlerfrage -- sie braucht seinen + Blick, nicht meine Entscheidung um zwei Uhr nachts. */ + const ohneKopfzeile = istStart || s === "chat.html"; + const kopfGut = ohneKopfzeile + ? (istStart || r.ton !== null) + : (r.ton !== null && r.kopfZeichen > 0 && r.wasserzeichen > 0); /* AM 03.09.2026 UMGESTELLT. Hier stand: "jede Seite hat ihre EIGENE Bühne" -- geprüft wurde, @@ -159,11 +216,23 @@ for (const [breite, hoehe, wie] of [[1440, 1000, "Computer"], [390, 844, "Handy" trägt. Ein `data-buehne="garage"` ohne passende CSS-Regel fiele damit auf -- bei "überall dasselbe Bild" wäre es nie aufgefallen, und bei "irgendein Motiv" auch nicht. */ - /* Die Startseite trägt KEIN data-buehne -- sie hat ihre feste - Grundszene aus `body.start::before`. Für sie zählt deshalb nur, - dass überhaupt ein Motiv ankommt; für alle anderen, dass das - ankommende Motiv das ist, das sie sich aussuchen. */ - const buehneGut = r.buehne ? r.buehneBild === r.buehne : !!r.buehneBild; + /* "KEIN data-buehne" IST NUR AUF DER STARTSEITE IN ORDNUNG. + + Hier stand `r.buehne ? r.buehneBild === r.buehne : !!r.buehneBild` + -- also: fehlt das Merkmal, reicht IRGENDEIN Bild. Gedacht war + das fuer die Startseite, die ihre feste Grundszene aus + `body.start::before` bezieht. Geschrieben war es fuer JEDE Seite. + + Damit war der Chat-Fehler unsichtbar: Die Seite verlor ihr + `data-buehne`, fiel auf die Grundszene zurueck, und die Pruefung + sagte "ein Motiv ist da, alles gut". Eine Bedingung, die bei + fehlender Angabe milder wird statt strenger, kann den Verlust + dieser Angabe nicht melden -- sie belohnt ihn. + + Jetzt ist die Ausnahme an die Startseite GEBUNDEN, nicht an das + Fehlen des Merkmals. Auf jeder anderen Seite ist "keine Buehne" + ein Fehler. */ + const buehneGut = buehneRichtig(istStart, r.buehne, r.buehneBild); /* JEDE BEDINGUNG EINZELN, MIT NAMEN. Vorher war das ein einziges langes UND -- fiel es, stand da nur "FEHL" und eine Zeile, in der alles in Ordnung aussah. Man musste die Prüfung aufmachen @@ -174,7 +243,11 @@ for (const [breite, hoehe, wie] of [[1440, 1000, "Computer"], [390, 844, "Handy" if (r.abmelden === false) gruende.push("Abmelden-Knopf ausserhalb"); if (!markeGut) gruende.push("Schriftzug/Rückweg"); if (!kopfGut) gruende.push("Seitenkopf (Ton/Zeichen/Wasserzeichen)"); - if (!buehneGut) gruende.push(`Bühne: ${r.buehneBild} statt ${r.buehne}`); + if (!buehneGut) { + gruende.push(r.buehne + ? `Bühne: ${r.buehneBild} statt ${r.buehne}` + : `Bühne: die Seite trägt gar kein data-buehne (geladen: ${r.buehneBild || "nichts"})`); + } if (!(r.breit === null || r.breit === "1240px")) gruende.push(`Breite ${r.breit}`); if (!(r.kopfzeile === null || r.kopfzeile === "flex")) gruende.push(`Kopfzeile ${r.kopfzeile}`); const gut = gruende.length === 0; @@ -192,6 +265,33 @@ for (const [breite, hoehe, wie] of [[1440, 1000, "Computer"], [390, 844, "Handy" } await kontext.close(); } +/* ---- GEGENPROBE: kann die Buehnenregel auch NEIN sagen? ------------ + Ohne das waere "alles in Ordnung" nur die Aussage, dass die Regel + nichts gemeldet hat -- nicht, dass sie etwas melden koennte. Genau + dieser Fall ist am 09.09.2026 eingetreten: Die alte Regel wurde bei + fehlendem `data-buehne` MILDER statt strenger und hat den Verlust + der Angabe belohnt statt gemeldet. */ +{ + const faelle = [ + [false, "lounge", "lounge", true, "Seite will lounge und bekommt lounge"], + [false, "lounge", "garage", false, "Seite will lounge, bekommt garage"], + [false, null, "studio", false, "Seite hat gar kein data-buehne (der Chat-Fehler)"], + [false, null, null, false, "weder gewollt noch geladen"], + [false, "lounge", null, false, "gewollt, aber nichts geladen"], + [true, null, "studio", true, "Startseite mit ihrer Grundszene"], + [true, null, null, false, "Startseite ganz ohne Motiv"], + ]; + let schief = 0; + for (const [start, gewollt, geladen, soll, was] of faelle) { + const ist = buehneRichtig(start, gewollt, geladen); + if (ist !== soll) { schief++; console.log(` FEHL Gegenprobe "${was}": ${ist} statt ${soll}`); } + } + console.log(schief === 0 + ? ` ok die Bühnenregel erkennt alle ${faelle.length} Fälle richtig (Gegenprobe)` + : ` FEHL ${schief} Fälle der Bühnenregel stimmen nicht`); + if (schief) fehler += schief; +} + await browser.close(); console.log(`\n${fehler === 0 ? "Alles in Ordnung." : fehler + " Seite(n) fehlerhaft."}`); try { rmSync(ordner, { recursive: true, force: true }); } catch {} diff --git a/tools/gate-bauen.mjs b/tools/gate-bauen.mjs index 5da5f2a3..bea3c590 100644 --- a/tools/gate-bauen.mjs +++ b/tools/gate-bauen.mjs @@ -594,9 +594,16 @@ for (const b of [440, 580, 900]) { Werkstatt, dort wird gearbeitet arena Dateien, Wissen die Medaillon-Sammlung -- ein Archiv sieht so aus - halle Profile, Steckbrief, dieselbe Sammlung, gespiegelt: - Schutz es geht um Personen und Regeln, - nicht um Betrieb + halle Profile, Steckbrief, DIESELBE Sammlung, Bild fuer Bild + Schutz gleich (nachgemessen: gleiche + Pruefsumme). Hier stand bis zum + 09.09.2026 "gespiegelt" -- das war + nie so, es gibt in diesem Werkzeug + keine Spiegelung. Ein Kommentar, + der mehr behauptet als der Code + tut, ist schlimmer als keiner: + Man sucht den Unterschied und + findet ihn nicht. wald Start-Check, Scout roter Ahorn am Wasser -- etwas, das waechst skyline Kalender Podest unter dem Mond, Nacht @@ -634,8 +641,13 @@ const SZENEN = { nichts mehr). Zu wenig, und pruef-buehne meldet zu Recht schlechten Kontrast an echten Bildpunkten. - 0,42 ist gemessen, nicht geraten -- siehe den Lauf von pruef-buehne - nach dem Bau. */ + 0,26 ist gemessen, nicht geraten -- siehe den Lauf von pruef-buehne + nach dem Bau. (Hier stand "0,42" und darunter 0.26: Der Wert wurde + gesenkt -- die Begruendung dafuer steht oben bei "Damit sinkt der + flache Schleier von 0,42 auf 0,26" --, und diese Zeile ist nicht + mitgegangen. Zwei Zahlen fuer dieselbe Sache, und nur eine + geaendert; genau das Muster, das mich in dieser Nacht schon + viermal aufgehalten hat.) */ const DUNKEL = 0.26; console.log("\n--- Die neun Buehnen ---"); diff --git a/workspace/assets/js/kopf.js b/workspace/assets/js/kopf.js index c738eb99..198f5a43 100644 --- a/workspace/assets/js/kopf.js +++ b/workspace/assets/js/kopf.js @@ -437,12 +437,40 @@ Zeitraum die Überschrift ist. Er soll sein Zeichen trotzdem bekommen -- sonst wäre ausgerechnet die aufwendigste Seite die einzige ohne. */ - const kopf = document.querySelector('.kopf-zeile, .k-kopf'); - if (!B || !kopf) return; + if (!B) return; const bereich = B.zuSeite(location.pathname, location.search); if (!bereich) return; + /* ==== ERST DIE SEITE, DANN DIE PLAKETTE ========================== + + DIE REIHENFOLGE WAR DER FEHLER (behoben 09.09.2026, screen11). + + Hier stand ganz oben: + + const kopf = document.querySelector('.kopf-zeile, .k-kopf'); + if (!B || !kopf) return; + + Damit hing ALLES an der Frage, ob es eine Kopfzeile gibt, an die + man eine Plakette haengen kann -- auch der Farbton der Seite und + ihr Hintergrundbild, die damit nichts zu tun haben. + + `chat.html` hat weder `.kopf-zeile` noch `.k-kopf` (es hat einen + eigenen Chat-Kopf). Die Seite ist damit an dieser Zeile + ausgestiegen und hat WEDER ihren Ton NOCH ihre Buehne bekommen -- + obwohl in bereiche.js seit jeher `szene: 'lounge'` fuer sie + steht. Eine Zuordnung, die es gibt und die nie ankam. + + Aufgefallen ist es beim Nachmessen der Hintergrundhelligkeit + aller 18 Seiten: chat.html meldete als eine von dreien + `data-buehne` = nichts. Im Quelltext sieht die Zeile richtig aus, + und auf der Seite sieht ein fehlender Hintergrund nach Absicht + aus -- deshalb hat es Jahre keiner gesehen. + + Jetzt stehen Ton und Buehne VOR der Plakette. Sie brauchen nur + den Bereich; die Plakette braucht zusaetzlich einen Kopf, und + wenn es den nicht gibt, faellt eben nur sie aus. */ + /* Der Ton hängt am body: Damit erreicht er auch Bauteile, die weit unten auf der Seite stehen (Karten, Knöpfe, Zähler) -- nicht nur den Kopf. Die 17 Töne selbst stehen in start.css und hängen nur am @@ -460,6 +488,8 @@ Plakette mit dem Zeichen -- eingefügt VOR dem vorhandenen Text, ohne ihn anzufassen. Dadurch funktioniert das auf allen dreizehn Seiten, ohne dreizehn HTML-Dateien zu ändern. */ + const kopf = document.querySelector('.kopf-zeile, .k-kopf'); + if (!kopf) return; const erstes = kopf.firstElementChild; if (!erstes) return; diff --git a/workspace/aufgaben.html b/workspace/aufgaben.html index 73610f10..b3395964 100644 --- a/workspace/aufgaben.html +++ b/workspace/aufgaben.html @@ -14,10 +14,10 @@ - - - - + + + +
@@ -217,10 +217,10 @@ - - - - - + + + + +