From bff7c6ce144f44520795f616b50eee85103c302a Mon Sep 17 00:00:00 2001 From: Dogfather Date: Wed, 23 Sep 2026 12:00:32 +0200 Subject: [PATCH] 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 --- server/pruef-chat-optik.mjs | 147 +++++++++++++++++++++++++++++++- workspace/anruf-probe.html | 10 +-- workspace/app.webmanifest | 8 +- workspace/assets/css/chat.css | 58 ++++++++++++- workspace/aufgaben.html | 36 ++++---- workspace/automation.html | 32 +++---- workspace/befinden.html | 32 +++---- workspace/bereich.html | 44 +++++----- workspace/bewerben.html | 36 ++++---- workspace/bewerbungen.html | 34 ++++---- workspace/calls.html | 34 ++++---- workspace/chat.html | 99 ++++++++++++++++----- workspace/content.html | 34 ++++---- workspace/crew-index.html | 12 +-- workspace/crew.webmanifest | 8 +- workspace/dateien.html | 34 ++++---- workspace/entwicklung.html | 32 +++---- workspace/hilfe.html | 28 +++--- workspace/index.html | 10 +-- workspace/kalender.html | 34 ++++---- workspace/leistung.html | 32 +++---- workspace/material.html | 32 +++---- workspace/personen.html | 32 +++---- workspace/profil.html | 36 ++++---- workspace/rechte.html | 32 +++---- workspace/report.html | 36 ++++---- workspace/scouting.html | 32 +++---- workspace/start.html | 32 +++---- workspace/startcheck.html | 34 ++++---- workspace/steckbrief.html | 36 ++++---- workspace/talente.html | 34 ++++---- workspace/team.html | 32 +++---- workspace/teamlage.html | 32 +++---- workspace/teilen.html | 28 +++--- workspace/treff-moderation.html | 30 +++---- workspace/treff-regeln.html | 30 +++---- workspace/uebersicht.html | 32 +++---- workspace/unsere-seiten.html | 28 +++--- workspace/werdegang.html | 30 +++---- workspace/willkommen.html | 30 +++---- workspace/wissen.html | 34 ++++---- 41 files changed, 843 insertions(+), 593 deletions(-) diff --git a/server/pruef-chat-optik.mjs b/server/pruef-chat-optik.mjs index d8e015ca..95e4249f 100644 --- a/server/pruef-chat-optik.mjs +++ b/server/pruef-chat-optik.mjs @@ -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 */ } diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index 8ba25171..9e6fa05d 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`. --> - - + + - +