diff --git a/server/pruef-chat-optik.mjs b/server/pruef-chat-optik.mjs
index 717be9e7..9f4f2e40 100644
--- a/server/pruef-chat-optik.mjs
+++ b/server/pruef-chat-optik.mjs
@@ -755,6 +755,15 @@ melde("\n=== Die Schreibzeile auf dem Handy ===");
drueber,
quer: document.documentElement.scrollWidth - window.innerWidth,
werkzeugZahl: werk ? werk.querySelectorAll("button").length : 0,
+ /* WIE VIELE WERKZEUGE GIBT ES UEBERHAUPT -- unabhaengig davon,
+ wo sie stehen. Die Zahl daneben sagt, wie viele IN der
+ Gruppe sitzen; erst der Vergleich beider sagt, ob eines
+ danebenliegt. Eine feste Zahl kann das nicht: Sie wird
+ falsch, sobald ein Werkzeug dazukommt -- und genau das ist
+ am 25.09.2026 passiert (der Schriftknopf „Aa"). */
+ werkzeugAlle: document.querySelectorAll(
+ "#schreiben :is(.chat__anhang, .chat__ton, .chat__gif,"
+ + " .chat__emoji, .chat__schriftknopf)").length,
};
});
@@ -809,8 +818,112 @@ melde("\n=== Die Schreibzeile auf dem Handy ===");
in einer ANDEREN Zeile stehen als das Feld -- sonst hiesse
"Senden steht daneben" nur, dass alles in einer Zeile liegt
und die Messung gar nicht unterscheiden kann. */
- ok(zeile.werkzeugZahl === 4,
- `die vier Werkzeuge stehen in einer Gruppe (${zeile.werkzeugZahl})`);
+ /* HIER STAND EINE 4 (nachgebessert 25.09.2026).
+
+ Sie war vom ersten Tag an eine Rechnung von gestern: Kommt ein
+ Werkzeug dazu, wird die Zeile rot, obwohl nichts kaputt ist --
+ und wer sie dann einfach auf 5 hochsetzt, macht denselben Fehler
+ mit einer anderen Zahl. Dieses Haus ist an festen Zahlen schon
+ dreimal hereingefallen (Kopfleiste 06.09., Schriftgroessen
+ 14.09., Tippziele 20.09.).
+
+ GEFRAGT WIRD JETZT, WAS GEMEINT IST: Liegt KEINES der Werkzeuge
+ ausserhalb der Gruppe? Das ist die Sache -- sie sollen als Block
+ umbrechen, damit nicht eines allein auf einer Zeile landet. Die
+ Regel misst damit, statt zu rechnen, und der naechste Knopf
+ bringt sie nicht zu Fall.
+
+ DIE ANZAHL STEHT TROTZDEM IN DER BEDINGUNG: Waere die Gruppe
+ leer, weil jemand die Klasse umbenennt, waeren „0 von 0" sonst
+ gruen -- ein Haken ohne Gegenstand. */
+ ok(zeile.werkzeugAlle >= 4 && zeile.werkzeugZahl === zeile.werkzeugAlle,
+ `alle ${zeile.werkzeugAlle} Werkzeuge stehen in EINER Gruppe `
+ + `(${zeile.werkzeugZahl} davon drin)`);
+
+ /* ==== DIE SCHRIFTLEISTE KLAPPT AUF UND ZU (25.09.2026) =========
+
+ Filipe: „die sachen von screen3 verbinde die mit dem auf
+ screen4. so dass wenn man drauf drückt man die anderen zu sehen
+ bekommt. damit es nicht zu viel platz nimmt."
+
+ GEMESSEN WIRD DER PLATZ, nicht nur der Zustand: Die Konsole muss
+ zugeklappt SPUERBAR niedriger sein. Ein Knopf, der ein Merkmal
+ umstellt, ohne dass Platz frei wird, haette den Auftrag nicht
+ erfuellt -- und ein `aria-expanded`, das sich aendert, waere
+ trotzdem gruen.
+
+ UND DIE TASTENKUERZEL: Sie haengen am Schreibfeld, nicht an der
+ Leiste. Waere das anders, haette das Zuklappen Strg+B
+ mitgenommen -- eine Funktion, die verschwindet, weil man Platz
+ sparen wollte. */
+ const vorher = await handy.seite.evaluate(() => ({
+ hoehe: Math.round(document.getElementById("schreiben").getBoundingClientRect().height),
+ leiste: !!document.querySelector(".textform")?.getBoundingClientRect().height,
+ auf: document.getElementById("schrift-auf")?.getAttribute("aria-expanded"),
+ }));
+ ok(vorher.auf === "false" && vorher.leiste === false,
+ `die Schriftleiste ist von sich aus zu (aria-expanded=${vorher.auf})`);
+
+ await handy.seite.click("#schrift-auf");
+ await handy.seite.waitForTimeout(350);
+ const offen = await handy.seite.evaluate(() => ({
+ hoehe: Math.round(document.getElementById("schreiben").getBoundingClientRect().height),
+ knoepfe: [...document.querySelectorAll(".textform__knopf")]
+ .filter((e) => e.getBoundingClientRect().height > 1).length,
+ auf: document.getElementById("schrift-auf")?.getAttribute("aria-expanded"),
+ }));
+ ok(offen.auf === "true" && offen.knoepfe === 4,
+ `ein Druck macht sie auf -- vier Zeichen (${offen.knoepfe})`);
+ ok(offen.hoehe > vorher.hoehe + 20,
+ `und zugeklappt spart das wirklich Platz `
+ + `(${vorher.hoehe} px zu ${offen.hoehe} px, ${offen.hoehe - vorher.hoehe} px)`);
+
+ /* DIE WAHL UEBERLEBT DAS NEULADEN -- wer viel gestaltet, gestaltet
+ weiter. Ohne diese Zeile waere „sie klappt auf" ein Zustand, den
+ man bei jeder Nachricht neu herstellen muesste. */
+ await handy.seite.reload({ waitUntil: "networkidle" });
+ await handy.seite.waitForSelector("#schreiben:not([hidden])", { timeout: 8000 });
+ await handy.seite.waitForTimeout(700);
+ const danach = await handy.seite.evaluate(() => ({
+ auf: document.getElementById("schrift-auf")?.getAttribute("aria-expanded"),
+ knoepfe: [...document.querySelectorAll(".textform__knopf")]
+ .filter((e) => e.getBoundingClientRect().height > 1).length,
+ }));
+ ok(danach.auf === "true" && danach.knoepfe === 4,
+ `und bleibt nach dem Neuladen offen (${danach.auf}, ${danach.knoepfe} Zeichen)`);
+
+ /* GEGENPROBE: ZUGEKLAPPT IST NICHT ABGEBAUT.
+
+ Der erste Anlauf wollte hier Strg+B tippen und pruefen, ob "**"
+ im Feld landet. Das lief in eine Zeitbombe: Der Treff hat eine
+ NACHTRUHE, und zwischen 22 und 6 Uhr ist das Schreibfeld
+ `disabled`. Die Pruefung waere sechs Stunden am Tag rot gewesen,
+ ohne dass an der Sache etwas ist -- genau die Sorte Fehlalarm,
+ die dieses Haus am 06.09.2026 schon einmal notiert hat („ein
+ Test, der die Wanduhr als Annahme benutzt").
+
+ GEMESSEN WIRD STATTDESSEN DIE SACHE SELBST: Die vier Knoepfe
+ sind weiterhin IM DOKUMENT, sie haben nur keine Flaeche mehr.
+ Das ist der Unterschied zwischen „versteckt" und „abgebaut" --
+ und daran haengt, dass die Tastenkuerzel weiterlaufen: Sie
+ haengen am Schreibfeld (textform.js), und die Leiste wird nicht
+ neu gebaut, wenn man sie wieder aufmacht. Waere sie beim
+ Zuklappen entfernt worden, waere der naechste Aufbau ein zweiter
+ Satz Zuhoerer -- und Strg+B haette doppelt zugeschlagen. */
+ await handy.seite.click("#schrift-auf");
+ await handy.seite.waitForTimeout(300);
+ const zu = await handy.seite.evaluate(() => ({
+ imDokument: document.querySelectorAll(".textform__knopf").length,
+ sichtbar: [...document.querySelectorAll(".textform__knopf")]
+ .filter((e) => e.getBoundingClientRect().height > 1).length,
+ hoehe: Math.round(document.getElementById("schreiben").getBoundingClientRect().height),
+ merker: document.getElementById("text")?.dataset.textform,
+ }));
+ ok(zu.imDokument === 4 && zu.sichtbar === 0,
+ `Gegenprobe: zugeklappt sind sie versteckt, nicht abgebaut `
+ + `(${zu.imDokument} im Dokument, ${zu.sichtbar} sichtbar)`);
+ ok(zu.merker === "ja" && zu.hoehe === vorher.hoehe,
+ `und die Konsole ist wieder so hoch wie am Anfang (${zu.hoehe} px)`);
/* `!!zeile.werkzeuge` GEHOERT IN DIE BEDINGUNG, und das ist kein
Zierrat: In der Gegenprobe gab es die Gruppe nicht, `y` war
`undefined`, und `(undefined || 0) < 834` ist wahr -- die Zeile
diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html
index 9e64136a..e656858e 100644
--- a/workspace/anruf-probe.html
+++ b/workspace/anruf-probe.html
@@ -16,15 +16,15 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
-
-
+
+
-
+