diff --git a/server/pruef-reaktion-schmal.mjs b/server/pruef-reaktion-schmal.mjs
index 82360333..86c809ef 100644
--- a/server/pruef-reaktion-schmal.mjs
+++ b/server/pruef-reaktion-schmal.mjs
@@ -19,30 +19,42 @@
Eine Bestandsliste ist ein Wegweiser, keine Wahrheit. Auch meine
eigene.
- WAS HIER BEWACHT WIRD UND WAS NICHT
+ UND WAS SEITDEM PASSIERT IST
- Dass bei OFFENER Regie auf 320 px das Bild verschwindet, ist ein
- BEKANNTER Mangel. In reaktion.css steht die Begruendung samt sechs
- gescheiterten Versuchen, und dort steht auch, dass es ein eigenes
- Nachdenken braucht (etwa: die Regie wird dort ein eigener
- Bildschirm statt einer Schublade). Diese Pruefung macht daraus
- KEINEN gruenen Haken -- sonst wuerde eine spaetere Reparatur hier
- rot, und das waere die Welt verkehrt herum.
+ Filipe: „auf so apps wie youtube und so geht es doch auch auf dem
+ handy also perfektionier es endlich."
- Bewacht wird die GRENZE darum herum, und zwar dreierlei:
+ Er hatte recht. Bei offener Regie stand auf 320 px das Pult IM
+ RASTER statt darueber -- Bild 0 px, Transportleiste 1017 Pixel
+ unter dem Fensterrand. Ab 360 px war genau das laengst geloest;
+ es war dieselbe Seite, nur schmaler. Die 360-Pixel-Sperre ist am
+ 02.10.2026 gefallen (Begruendung und Messreihe in reaktion.css).
- 1. Mit GESCHLOSSENER Regie muss das Bild auch auf 320 px eine
- brauchbare Hoehe haben. Faellt es dort je auf 0, ist das
- etwas Neues und kein Bestand.
- 2. Ab 360 px -- der Breite, ab der die Regie aus dem Fluss
- genommen wird -- muss das Bild seine Hoehe auch bei OFFENER
- Regie behalten. Genau dort verlaeuft die Zeile
- `@media (pointer: coarse) and (min-width: 360px)`.
- 3. IN JEDEM ZUSTAND muss der Knopf, der die Regie wieder
- zumacht, im Fenster stehen UND obenauf liegen. Das ist der
- Unterschied zwischen „haesslich" und „Falle": Solange er da
- ist, kommt man immer wieder zum Bild zurueck. Gemessen ist
- er es heute ueberall -- diese Zeile haelt das fest.
+ Gemessen danach, Regie offen:
+
+ 320x568 Bild 180 px · Kopf 147 · Schublade 280 · Inhalt 132
+ 360x640 Bild 203 px (unveraendert)
+ 390x844 Bild 219 px (unveraendert)
+
+ WAS HIER BEWACHT WIRD -- auf JEDER Breite, ohne Ausnahme:
+
+ 1. Das Bild behaelt seine Hoehe, zu UND auf.
+ 2. Die Transportleiste bleibt im Fenster.
+ 3. Der Inhalt der Schublade ist erreichbar -- er passt hinein
+ oder er rollt. Eine Schublade, deren Inhalt man nicht
+ erreicht, verdeckt nur eleganter als vorher.
+ 4. Die drei grossen Knoepfe behalten ihre 44 Pixel, keiner ist
+ abgeschnitten, alle liegen obenauf. Schmaler ja, beschnitten
+ nein.
+ 5. In JEDEM Zustand steht der Knopf, der die Regie wieder
+ zumacht, im Fenster UND obenauf.
+
+ Punkt 2 ist die eigentliche Lehre aus dem Tag: Die alte Fassung
+ dieser Datei hat den Mangel unter 360 px nur PROTOKOLLIERT statt
+ behauptet, damit eine spaetere Reparatur hier nicht rot wird. Das
+ war richtig, solange es keine Reparatur gab -- und ist falsch,
+ sobald es eine gibt. Eine Pruefung, die eine Reparatur nicht
+ bemerkt, hat sie nie abgesichert.
DREI AUSGAENGE: 0 in Ordnung · 1 Befunde · 2 konnte nicht arbeiten.
===================================================================== */
@@ -96,12 +108,15 @@ d.close();
const { chromium } = await import("playwright");
const browser = await chromium.launch();
-/* Die Grenze, ab der reaktion.css die Regie aus dem Fluss nimmt.
- Sie steht dort als `and (min-width: 360px)` -- hier als Zahl, weil
- diese Pruefung genau an ihr entlangmisst. */
-const AUS_DEM_FLUSS_AB = 360;
-/* So hoch muss ein Bild mindestens sein, um ein Bild zu sein. 127 px
- sind heute auf 320 gemessen; 100 laesst Luft, ohne 0 zu decken. */
+/* So hoch muss ein Bild mindestens sein, um ein Bild zu sein.
+ Gemessen am 02.10.2026 mit offener Regie: 180 px auf 320,
+ 203 auf 360, 219 auf 390. 100 laesst Luft nach unten, ohne 0 zu
+ decken.
+
+ (Hier stand bis heute `AUS_DEM_FLUSS_AB = 360` -- die Breite, ab
+ der die Regie aus dem Fluss genommen wurde. Die Grenze gibt es
+ nicht mehr, also auch die Zahl nicht. Eine Konstante, die nichts
+ mehr trennt, ist der Anfang einer Erklaerung, die nicht stimmt.) */
const BILD_MIN = 100;
const GERAETE = [[320, 568, "Handy klein"], [390, 844, "Handy"], [430, 932, "Handy gross"]];
@@ -244,23 +259,64 @@ for (const [breite, hoehe, wie] of GERAETE) {
console.log(` Regie auf: Bild ${auf.bild} px · Transport endet bei `
+ `${auf.transportUnten} von ${auf.fenster}`);
- if (breite >= AUS_DEM_FLUSS_AB) {
- /* AB 360 px wird die Regie aus dem Fluss genommen und liegt ueber
- dem Bild. Dann darf das Bild nichts verlieren. */
- ok(auf.bild >= BILD_MIN,
- `auch mit offener Regie bleibt das Bild ${auf.bild} px hoch`);
- ok(auf.transportUnten !== null && auf.transportUnten <= auf.fenster + 1,
- ` und die Transportleiste bleibt im Fenster (${auf.transportUnten})`);
- } else {
- /* UNTER 360 px GILT DIESE ZUSAGE NICHT -- und das wird hier NICHT
- als „in Ordnung" abgehakt. Behauptet wird nur, was auch nach
- einer Reparatur noch wahr ist: dass man wieder herauskommt.
- Ein gruener Haken auf „das Bild ist 0" wuerde bei der
- Reparatur rot. */
- console.log(` (unter ${AUS_DEM_FLUSS_AB} px bleibt die Regie im Fluss — `
- + "bekannter Mangel, siehe reaktion.css. Hier wird nur geprueft, "
- + "dass man wieder herauskommt.)");
- }
+ /* DIE ZUSAGE GILT SEIT DEM 02.10.2026 AUF JEDER BREITE.
+
+ Bis dahin stand hier eine Ausnahme fuer alles unter 360 px:
+ Dort blieb die Regie im Raster, das Bild fiel auf 0 und die
+ Transportleiste rutschte 1017 Pixel unter den Fensterrand. Die
+ Ausnahme ist weg, weil der Mangel weg ist -- und genau deshalb
+ wird hier jetzt BEHAUPTET statt protokolliert. Eine Pruefung,
+ die eine Reparatur nicht bemerkt, hat die Reparatur nie
+ abgesichert. */
+ ok(auf.bild >= BILD_MIN,
+ `auch mit offener Regie bleibt das Bild ${auf.bild} px hoch`);
+ ok(auf.transportUnten !== null && auf.transportUnten <= auf.fenster + 1,
+ ` und die Transportleiste bleibt im Fenster (${auf.transportUnten})`);
+
+ /* DER INHALT DER SCHUBLADE MUSS ERREICHBAR SEIN.
+
+ Eine Schublade, die ueber dem Bild liegt und deren Inhalt man
+ nicht erreicht, ist kein Fortschritt gegenueber der alten --
+ sie verdeckt dann nur eleganter. Gemessen wird deshalb, dass
+ der Inhalt entweder vollstaendig hineinpasst ODER rollt, und
+ dass die drei grossen Knoepfe ihre 44 Pixel behalten und
+ obenauf liegen. */
+ const innen = await seite.evaluate(() => {
+ const i = document.getElementById("pult-innen");
+ const p = document.getElementById("pult");
+ const rollt = (e) => !!e && e.scrollHeight > e.clientHeight + 2;
+ const knoepfe = [...document.querySelectorAll(".pult__tun .tun")].map((b) => {
+ const r = b.getBoundingClientRect();
+ const oben = document.elementFromPoint(
+ Math.min(innerWidth - 1, Math.max(0, r.left + r.width / 2)),
+ Math.min(innerHeight - 1, Math.max(0, r.top + r.height / 2)));
+ return {
+ wort: (b.textContent || "").trim().slice(0, 14),
+ hoch: Math.round(r.height),
+ /* `scrollWidth <= clientWidth` heisst: der Text ist ganz da.
+ Knoepfe schmaler zu machen ist erlaubt, sie abzuschneiden
+ nicht. */
+ ganz: b.scrollWidth <= b.clientWidth + 1,
+ erreichbar: r.top >= 0 && r.bottom <= innerHeight
+ && !!oben && (oben === b || b.contains(oben) || !!oben.closest(".pult__tun")),
+ };
+ });
+ return {
+ passtOderRollt: !!i && (i.scrollHeight <= i.clientHeight + 2 || rollt(i) || rollt(p)),
+ sichtbar: i ? Math.round(i.getBoundingClientRect().height) : 0,
+ knoepfe,
+ };
+ });
+ ok(innen.passtOderRollt,
+ ` der Inhalt der Schublade ist erreichbar (${innen.sichtbar} px sichtbar, Rest rollt)`);
+ ok(innen.knoepfe.length === 3 && innen.knoepfe.every((k) => k.hoch >= 44),
+ ` die drei grossen Knoepfe behalten ihre 44 Pixel `
+ + `(${innen.knoepfe.map((k) => k.hoch).join("/")})`);
+ ok(innen.knoepfe.every((k) => k.ganz),
+ " und keiner ist abgeschnitten — schmaler ja, beschnitten nein");
+ ok(innen.knoepfe.every((k) => k.erreichbar),
+ ` alle drei sind im Fenster und liegen obenauf `
+ + `(${innen.knoepfe.map((k) => k.wort).join(", ")})`);
ok(auf.zuImFenster && auf.zuObenauf,
" und der Knopf zum Zumachen ist auch jetzt da und anklickbar — "
diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html
index 3526aa71..79472dd4 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`. -->
-
-
+
+
-
+