Chat: die Schreibzeile auf dem Handy -- Feld 130 -> 278 px
Filipe schreibt vom Handy. In der Schreibzeile stehen seit heute Nacht
SECHS Dinge: Bueroklammer, Mikrofon, GIF, Emoji, Schreibfeld, Senden --
das Mikrofon und das GIF habe ich selbst dazugestellt.
GEMESSEN, BEVOR ICH ETWAS ANGEFASST HABE (mit echtem Finger, weil
`pointer: coarse` sonst gar nicht greift):
320 px Feld 164
390 px Feld 130 -- und "Senden" ALLEIN auf einer eigenen Zeile
412 px Feld 151 -- dito
Das Feld lag auf seiner Untergrenze von 8 rem. Kaputt war nichts --
nichts ueberlappte, nichts war zu klein --, aber man sah beim Tippen
etwa zwoelf Zeichen, und der Knopf, der die Nachricht wegschickt, war
weiter vom Text entfernt als die Bueroklammer.
Das ist derselbe Fehler wie am 06.09.2026 in anderer Gestalt: Damals
kam ein sechstes Element in die Kopfleiste, und bei 412 px lag ein
Knopf ueber dem anderen.
ZWEI GRUPPEN STATT SECHS EINZELTEILE
------------------------------------
chat__werkzeuge Bueroklammer, Mikrofon, GIF, Emoji
chat__schreibzeile Feld und Senden
Damit bricht die Zeile an der richtigen Stelle: Die Werkzeuge wandern
GEMEINSAM nach oben, Feld und Senden bleiben zusammen. Und ein siebtes
Werkzeug laesst kuenftig die Gruppe wachsen, nicht das Feld schrumpfen
-- das ist der Unterschied zwischen einer Regel und einer Zahl, die man
beim naechsten Knopf neu suchen muss.
DER EMOJI-KNOPF IST ZU DEN WERKZEUGEN GEWANDERT. Er sass neben
"Senden", und auf dem Handy landeten damit Emoji und Senden gemeinsam
unten links. Ein Emoji ist dasselbe wie eine Bueroklammer: etwas, das
man in den Text einfuegt. Senden ist das Gegenteil.
NACHHER:
320 px Feld 214 390 px Feld 278
412 px Feld 299 1280 px Feld 560
Auf dem Handy drei Zeilen (Werkzeuge / F K U S / Feld+Senden), am
Rechner alles nebeneinander.
DIE 10 rem SIND GEMESSEN, NICHT GESCHAETZT
------------------------------------------
Durchgespielt wurden 8, 10, 11, 12 und 13 rem auf 320, 390 und 412 px.
Ab 11 rem kommt auf 320 px eine VIERTE Zeile dazu -- also schlechter
dort, wo der Platz ohnehin am knappsten ist. 10 rem verbessert 390 und
412 deutlich, ohne 320 zu verschlechtern. Die Messreihe steht im
Kommentar; wer daran dreht, misst bitte wieder nach.
EIN ZWISCHENSTAND, DEN ICH VERWORFEN HABE
-----------------------------------------
Der erste Versuch gruppierte nur Feld+Senden und liess Emoji stehen.
Gemessen: Feld 160 statt 180 -- schlechter als der Zustand davor. Ich
habe ihn zurueckgenommen, statt ihn schoenzureden. Was ich nicht
messen kann, liefere ich nicht aus.
GEPRUEFT
--------
pruef-chat-optik: die Schreibzeile ist jetzt Teil der Pruefung.
Breite des Feldes, Senden neben dem Feld, nichts ueberlappt, alles am
Daumen treffbar, kein Querscrollen -- und am Rechner das Gegenteil:
Dort MUESSEN die Werkzeuge daneben stehen, sonst waere die Zeile
unnoetig hoch.
GEGENPROBE mit der alten Fassung: 5 Zeilen werden rot, darunter genau
die beiden Symptome von oben (Feld 130, Senden eine Zeile tiefer).
UND ZWEI EIGENE FEHLER IN DER PRUEFUNG, BEIDE VON DER GEGENPROBE
GEFUNDEN:
* Sie mass mit einem SCOUT -- und der bekommt Mikrofon und GIF gar
nicht zu sehen. Gemessen wurde eine Zeile mit zwei Dingen darin,
waehrend der gefaehrliche Fall der mit vier ist. Aufgefallen, weil
die Gegenprobe 178 px meldete und meine Handmessung 130: zwei
Zahlen fuer dieselbe Sache.
* Eine Zeile war gruen mit `undefined`: Es gab die Gruppe nicht,
`y` war undefiniert, und `(undefined || 0) < 834` ist wahr. Ein
gruener Haken, der nichts angesehen hat -- genau die Sorte, vor
der die Hausregeln warnen.
pruef-chat, pruef-erwaehnung (119), pruef-chat-anhaenge (109):
unveraendert gruen.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
+146
-1
@@ -92,7 +92,13 @@ const pw = await import("file:///C:/Users/qciga/Documents/Obelix/Analyse/node_mo
|
||||
const browser = await pw.chromium.launch();
|
||||
|
||||
async function alsRolle(rolle, code, wohin = "chat.html", breite = 1280) {
|
||||
const ctx = await browser.newContext({ viewport: { width: breite, height: 900 } });
|
||||
/* MIT FINGER, WENN ES SCHMAL IST. Playwright schaltet
|
||||
`pointer: coarse` nur ein, wenn der Zusammenhang Beruehrung kennt
|
||||
-- ohne das misst man den Rechner und glaubt, es sei das Handy.
|
||||
Genau daran ist mir am 23.09. eine Messung danebengegangen. */
|
||||
const ctx = await browser.newContext({
|
||||
viewport: { width: breite, height: 900 },
|
||||
hasTouch: breite < 900, isMobile: breite < 900 });
|
||||
const seite = await ctx.newPage();
|
||||
await seite.goto(BASIS + "/workspace/", { waitUntil: "networkidle" });
|
||||
await seite.click(`.rolle[data-rolle="${rolle}"]`);
|
||||
@@ -671,6 +677,145 @@ melde("\n=== Antworten quetscht das Schreibfeld nicht ===");
|
||||
}
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
DIE SCHREIBZEILE AUF DEM HANDY (23.09.2026)
|
||||
|
||||
Filipe schreibt vom Handy. In dieser einen Zeile stehen inzwischen
|
||||
SECHS Dinge: Bueroklammer, Mikrofon, GIF, Emoji, Schreibfeld,
|
||||
Senden -- die letzten drei sind in der Nacht zum 23.09. dazu-
|
||||
bzw. umgekommen.
|
||||
|
||||
WARUM DAS GEFAEHRLICH IST, steht in den Hausregeln: Am 06.09.2026
|
||||
kam ein sechstes Element in die Kopfleiste, und bei 412 px lag ein
|
||||
Knopf ueber dem anderen -- wer auf "Meine Sicht" tippte, landete im
|
||||
Chat, auf zwoelf Seiten.
|
||||
|
||||
GEMESSEN AM 23.09., VOR DEM UMBAU:
|
||||
320 px Feld 164
|
||||
390 px Feld 130 -- und "Senden" ALLEIN auf einer eigenen Zeile
|
||||
412 px Feld 151 -- dito
|
||||
|
||||
Das Feld lag auf seiner Untergrenze, und der Knopf, der die
|
||||
Nachricht wegschickt, war weiter vom Text entfernt als die
|
||||
Bueroklammer. Kaputt war nichts; benutzbar war es auch nicht.
|
||||
|
||||
NACH DEM UMBAU (zwei Gruppen: Werkzeuge / Schreiben):
|
||||
320 px Feld 214 390 px Feld 278
|
||||
412 px Feld 299 1280 px Feld 560
|
||||
|
||||
Diese Pruefung haelt beides fest: dass das Feld breit genug bleibt,
|
||||
und dass Senden dabei steht.
|
||||
======================================================================= */
|
||||
melde("\n=== Die Schreibzeile auf dem Handy ===");
|
||||
{
|
||||
/* ==== MIT JEMANDEM, DER ALLE VIER WERKZEUGE HAT =================
|
||||
|
||||
Der erste Anlauf mass mit einem Scout -- und der bekommt Mikrofon
|
||||
und GIF gar nicht zu sehen (nur Team Dogi und DogFather duerfen
|
||||
Sprachnachrichten und GIFs schicken). Gemessen wurde damit eine
|
||||
Zeile mit ZWEI Dingen darin, waehrend der gefaehrliche Fall der
|
||||
mit VIER ist.
|
||||
|
||||
Aufgefallen ist es erst in der Gegenprobe: Mit der alten Fassung
|
||||
kam das Feld auf 178 px statt der 130, die ich am selben Tag von
|
||||
Hand gemessen hatte. Zwei verschiedene Zahlen fuer dieselbe
|
||||
Sache -- das war der Hinweis.
|
||||
|
||||
Jetzt DogFather im Treff: vier Werkzeuge, und der Raum ist
|
||||
sicher da. */
|
||||
const handy = await alsRolle("admin", "CODE-DOGI-0001", "chat.html?raum=treff", 390);
|
||||
try {
|
||||
await handy.seite.waitForSelector("#schreiben:not([hidden])", { timeout: 8000 });
|
||||
await handy.seite.waitForTimeout(900);
|
||||
const zeile = await handy.seite.evaluate(() => {
|
||||
const f = document.getElementById("text");
|
||||
const senden = document.getElementById("senden");
|
||||
const werk = document.querySelector(".chat__werkzeuge");
|
||||
const r = (e) => { const x = e?.getBoundingClientRect();
|
||||
return x ? { b: Math.round(x.width), h: Math.round(x.height),
|
||||
y: Math.round(x.top), x: Math.round(x.left), re: Math.round(x.right) } : null; };
|
||||
/* Ueberlappt irgendetwas in der Zeile? Genau das ist am 06.09.
|
||||
passiert -- und man merkt es erst, wenn man danebentippt. */
|
||||
const stuecke = [...document.querySelectorAll(
|
||||
"#schreiben button, #schreiben textarea")]
|
||||
.filter((e) => { const x = e.getBoundingClientRect(); return x.width > 1 && x.height > 1; })
|
||||
.map((e) => ({ was: e.id || e.className.toString().split(" ")[0], ...r(e) }));
|
||||
const drueber = [];
|
||||
for (let i = 0; i < stuecke.length; i++) {
|
||||
for (let j = i + 1; j < stuecke.length; j++) {
|
||||
const a2 = stuecke[i], b2 = stuecke[j];
|
||||
const ux = Math.min(a2.re, b2.re) - Math.max(a2.x, b2.x);
|
||||
const uy = Math.min(a2.y + a2.h, b2.y + b2.h) - Math.max(a2.y, b2.y);
|
||||
if (ux > 2 && uy > 2) drueber.push(`${a2.was} / ${b2.was}`);
|
||||
}
|
||||
}
|
||||
return {
|
||||
feld: r(f), senden: r(senden), werkzeuge: r(werk),
|
||||
klein: stuecke.filter((t) => t.b < 38 || t.h < 38).map((t) => `${t.was} ${t.b}x${t.h}`),
|
||||
drueber,
|
||||
quer: document.documentElement.scrollWidth - window.innerWidth,
|
||||
werkzeugZahl: werk ? werk.querySelectorAll("button").length : 0,
|
||||
};
|
||||
});
|
||||
|
||||
/* DIE ZAHL GEHOERT IN DIE BEDINGUNG -- ohne Feld waere alles
|
||||
darunter gruen, ohne etwas angesehen zu haben. */
|
||||
ok(!!zeile.feld && !!zeile.senden, "Schreibfeld und Senden sind da");
|
||||
/* 220 px, und die Zahl ist der gemessene Ist-Wert minus Luft:
|
||||
Gemessen sind 278. Vor dem Umbau waren es 130 -- die Pruefung
|
||||
waere damals rot geworden, und genau das soll sie wieder, wenn
|
||||
jemand einen siebten Knopf dazustellt. */
|
||||
ok((zeile.feld?.b || 0) >= 220,
|
||||
`das Schreibfeld ist ${zeile.feld?.b} px breit (mindestens 220)`);
|
||||
/* SENDEN STEHT BEIM FELD. Vorher lag es eine Zeile tiefer, unten
|
||||
links -- weiter vom Text entfernt als die Bueroklammer. */
|
||||
ok(Math.abs((zeile.senden?.y || 0) - (zeile.feld?.y || 0)) <= 6,
|
||||
`und "Senden" steht daneben, nicht darunter (y ${zeile.senden?.y} zu ${zeile.feld?.y})`);
|
||||
ok(zeile.drueber.length === 0,
|
||||
`nichts liegt uebereinander (${zeile.drueber.join(", ") || "nichts"})`);
|
||||
ok(zeile.klein.length === 0,
|
||||
`alle Bedienelemente sind am Daumen treffbar (${zeile.klein.join(", ") || "alle gross genug"})`);
|
||||
ok(zeile.quer <= 1, `die Seite scrollt nicht waagerecht (${zeile.quer})`);
|
||||
|
||||
/* GEGENPROBE ZUR MESSUNG: Die Werkzeuge muessen auf einem 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})`);
|
||||
/* `!!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
|
||||
stand gruen da, ohne etwas angesehen zu haben. Genau die Sorte
|
||||
gruener Haken, vor der die Hausregeln warnen, und sie ist mir
|
||||
hier selbst passiert. */
|
||||
ok(!!zeile.werkzeuge && !!zeile.feld
|
||||
&& zeile.werkzeuge.y < zeile.feld.y - 10,
|
||||
`und auf dem Handy in einer eigenen Zeile darueber (y ${zeile.werkzeuge?.y} zu ${zeile.feld?.y})`);
|
||||
} finally { await handy.ctx.close(); }
|
||||
|
||||
/* UND AM RECHNER PASST ALLES IN EINE ZEILE. Ohne diese Zeile waere
|
||||
"die Werkzeuge stehen darueber" eine Regel, die auch dort gaelte,
|
||||
wo reichlich Platz ist -- und die Zeile waere unnoetig hoch. */
|
||||
const laptop = await alsRolle("admin", "CODE-DOGI-0001", "chat.html?raum=treff", 1280);
|
||||
try {
|
||||
await laptop.seite.waitForSelector("#schreiben:not([hidden])", { timeout: 8000 });
|
||||
await laptop.seite.waitForTimeout(800);
|
||||
const weit = await laptop.seite.evaluate(() => {
|
||||
const f = document.getElementById("text")?.getBoundingClientRect();
|
||||
const w = document.querySelector(".chat__werkzeuge")?.getBoundingClientRect();
|
||||
const se = document.getElementById("senden")?.getBoundingClientRect();
|
||||
return { feld: Math.round(f?.width || 0),
|
||||
gleicheZeile: !!f && !!w && Math.abs(f.top - w.top) <= 12,
|
||||
sendenDaneben: !!f && !!se && Math.abs(f.top - se.top) <= 6 };
|
||||
});
|
||||
ok(weit.feld >= 400, `am Rechner ist das Feld ${weit.feld} px breit`);
|
||||
ok(weit.gleicheZeile,
|
||||
"und die Werkzeuge stehen daneben statt darueber — dort ist Platz");
|
||||
ok(weit.sendenDaneben, "Senden steht auch dort beim Feld");
|
||||
} finally { await laptop.ctx.close(); }
|
||||
}
|
||||
|
||||
await browser.close();
|
||||
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user