B4 + B5: Loeschen heisst Loeschen, die Schrift wechselt mit, und Blau wird Babyblau
Die beiden Auftraege gehoeren zusammen, und zwar in dieser Reihenfolge:
Eine babyblaue Kachel ist HELL. Ohne mitwechselnde Schrift waere sie
unlesbar (1,63:1 gemessen). Erst B4 macht B5 moeglich.
B4a -- LOESCHEN HEISST LOESCHEN
"Geloeschte Nachrichten verschwinden vollstaendig - keine Spur, kein
'wurde geloescht'-Hinweis, bei niemandem, auch nicht bei DogFather."
Bis heute blieb die Zeile stehen: Text geleert, weg_am gesetzt, und im
Chat stand "Nachricht zurueckgenommen". Das war ausdruecklich so
begruendet ("ein Loch im Verlauf wirft mehr Fragen auf"). Das Argument
beantwortet aber eine andere Frage: Ein Hinweis "hier stand etwas"
MARKIERT die Stelle. Wer etwas aus Versehen schreibt, will es weg
haben und nicht unterstrichen.
Jetzt ein echtes DELETE. Vier Raender, an denen eine Spur bleiben
koennte, alle gemessen:
1. die Zeile selbst
2. chat_reaktionen (ON DELETE CASCADE - nachgesehen, nicht angenommen)
3. chat_erwaehnungen (ebenso)
4. letzte_am am Raum - wird neu gerechnet, sonst stuende er oben in
der Liste mit einem Zeitpunkt, zu dem es
nichts mehr gibt
Dazu: ein Zitat auf eine geloeschte Nachricht wird weggelassen; in der
Gespraechsliste steht kein Hinweis mehr; der Knopf heisst "loeschen".
Die 5 alten zurueckgenommenen Zeilen (Text bereits leer) raeumt eine
einmalige, wiederholbare Umstellung ab - mit Sicherung davor, und nur
wenn es wirklich etwas zu tun gibt.
B4b -- WER DARF WAS
"jeder nur seine eigenen - ausser DogFather und rechte Hand"
`darfJedeNachrichtLoeschen` = admin oder hand. NICHT fuehrtTeamDogi
(das schloesse die linke Hand ein) und nicht istLeitung (das schloesse
Spicy Media ein, die private Chats nicht einmal sehen darf). Das Recht
kommt vom Server ins Skript, nicht aus einer Rolle im Browser: chat.js
bekommt jeder, der die Seite oeffnet.
B4c -- DIE SCHRIFT WECHSELT MIT
"am besten schwarz auf hellen Kacheln - und weiss, wenn jemand eine
schwarze Kachel waehlt"
`schriftFuer(farbe)` waehlt zwischen zwei Paaren, gerechnet aus der
Leuchtdichte, mit denselben Schwellen wie das Rechenwerkzeug (7:1 fuer
den Text, 4,5:1 fuer die Fusszeile). Keine dritte Spalte in
CHAT_KACHELN, die jemand pflegen muesste. Flaeche und Schrift werden
im Browser in EINEM Griff gesetzt (blaseFaerben) - zwei Stellen waeren
irgendwann eine helle Kachel mit heller Schrift.
B4d -- DIE NAMEN
Der Name ist jetzt ein eigener Streifen mit Kante darunter, .84rem,
und der Rollenpunkt wird ein 3x14-Balken. Vorher stand er als erste
ZEILE in der Blase und las sich wie der Anfang des Satzes.
B5 -- BABYBLAU
"jedes normales blaues herz durch babyblaues herz ersetzen ... jeder
normale blaue farbe, sei es die kachel im chat oder emojis, nur
babyblau bitte."
* Herz: U+1F499 -> U+1FA75. Nicht geglaubt, sondern gemessen: 43,9 px
breit wie die anderen Herzen, ein Ersatzkaestchen waere 20,7. Die
vier vorhandenen blauen Herzen in der Datenbank wandern mit - sonst
waeren es vier Reaktionen, die ERLAUBT nicht mehr kennt: still weg.
* Kachel: neue, HELLE Kachel "Babyblau" mit dem Wert von --akzent.
Gemessen: Text 10,78:1, Fusszeile 4,87:1. Sie steht bewusst nicht in
der Rechnung des Werkzeugs (das rechnet elf Toene auf EINE
Leuchtdichte) - sie hat eine andere Leuchtdichte und dafuer ihre
eigene Schrift. Dasselbe Versprechen, anderer Weg.
PRUEFUNGEN
pruef-loeschen.mjs (NEU, 20/0): alle vier Raender, die vier Faelle
der Rechtegrenze (auch: die linke Hand darf NICHT), das babyblaue
Herz am laufenden Server, und dass der Satz "Nachricht
zurueckgenommen" nur noch in Kommentaren steht - mit Gegenprobe,
dass die Suche diesen Unterschied wirklich macht.
pruef-chatkachel.mjs (33/0): misst jede Kachel mit IHRER Schrift und
fragt dafuer dieselbe Funktion wie der Server. Neu: dass die
Schrift ueberhaupt wechselt. Die Leuchtdichte-Regel gilt jetzt fuer
die gerechneten Toene - das Versprechen dahinter loest die
Kontrastzeile darueber direkt ein.
Vier alte Pruefungen umgedreht, die den alten Zustand festgeschrieben
hatten: pruef-chat, pruef-chat-ausbau, pruef-chat-aufloesen,
pruef-chat-optik. Alle mit scharferer Messung als vorher (Zahl
davor/danach statt "ein Hinweis ist da").
Mitgelaufen und gruen: pruef-alle-sehen-es, pruef-treffchat (110/0).
Gesichert: workspace-vor-loeschumbau-20260922-233313.db
(946 KB, integrity_check ok, 111 Nachrichten, 49 Reaktionen).
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
+65
-17
@@ -53,7 +53,7 @@ const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t);
|
||||
console.log("\n=== Chat: Bild dahinter, Kachel davor ===\n");
|
||||
|
||||
/* ---- 1. Die Töne, ohne Browser ----------------------------------- */
|
||||
const { CHAT_KACHELN, kachelPruefen } = await import("./workspace-chat.js");
|
||||
const { CHAT_KACHELN, kachelPruefen, schriftFuer } = await import("./workspace-chat.js");
|
||||
ok(CHAT_KACHELN.length >= 8, `es gibt genug Töne zur Auswahl (${CHAT_KACHELN.length})`);
|
||||
|
||||
/* ALLE GLEICH DUNKEL. Nur dann ist der Kontrast zur Schrift bei jedem
|
||||
@@ -100,26 +100,55 @@ const BLASEN_SCHRIFT = [
|
||||
["blase-text", ".chat-nachricht__text", 7],
|
||||
["blase-leise", ".chat-nachricht__fuss", 4.5],
|
||||
];
|
||||
for (const [name, wo, noetig] of BLASEN_SCHRIFT) {
|
||||
const farbe = ausCss(name);
|
||||
if (!farbe) {
|
||||
ok(false, `KONNTE NICHT NACHSEHEN: --${name} steht nicht in chat.css`
|
||||
+ " — ohne sie lässt sich der Kontrast der Kacheln nicht prüfen");
|
||||
continue;
|
||||
}
|
||||
let schlecht = Infinity, wer = "";
|
||||
/* JEDE KACHEL MIT IHRER EIGENEN SCHRIFT (22.09.2026 abends).
|
||||
---------------------------------------------------------------------
|
||||
Hier stand eine feste Schriftfarbe aus chat.css, gegen ALLE Töne
|
||||
gemessen. Das galt, solange alle Töne dunkel waren.
|
||||
|
||||
Filipe: „Textfarbe soll mitwechseln, am besten schwarz auf hellen
|
||||
Kacheln – und weiß, wenn jemand eine schwarze Kachel wählt."
|
||||
|
||||
Seither entscheidet `schriftFuer()` im Server, welches Paar eine
|
||||
Fläche trägt. Die Prüfung fragt jetzt dieselbe Funktion -- nicht,
|
||||
weil das bequem ist, sondern weil alles andere eine zweite Wahrheit
|
||||
wäre: Eine Prüfung mit eigener Rechnung könnte grün sein, während
|
||||
der Chat etwas anderes anzeigt.
|
||||
|
||||
WAS SIE DAMIT NOCH PRÜFT: Dass das Ergebnis von `schriftFuer` die
|
||||
Schwellen wirklich schafft. Die Funktion darf im Notfall auch das
|
||||
schlechtere Paar zurückgeben (sie MUSS etwas liefern) -- genau dann
|
||||
schlägt diese Zeile an, und das ist ihr Zweck. */
|
||||
for (const [feld, wo, noetig] of [["text", ".chat-nachricht__text", 7],
|
||||
["leise", ".chat-nachricht__fuss", 4.5]]) {
|
||||
let schlecht = Infinity, wer = "", gemessen = 0;
|
||||
for (const k of CHAT_KACHELN) {
|
||||
const c = kontrast(farbe, k.farbe);
|
||||
const paar = schriftFuer(k.farbe);
|
||||
if (!paar || !paar[feld]) continue;
|
||||
gemessen++;
|
||||
const c = kontrast(paar[feld], k.farbe);
|
||||
if (c < schlecht) { schlecht = c; wer = k.name; }
|
||||
}
|
||||
/* Die ANZAHL gehört in die Bedingung. Wäre CHAT_KACHELN je leer,
|
||||
bliebe `schlecht` auf Infinity und die Zeile wäre grün, ohne einen
|
||||
einzigen Ton angesehen zu haben. */
|
||||
ok(CHAT_KACHELN.length >= 8 && schlecht >= noetig,
|
||||
`${wo} trägt auf allen ${CHAT_KACHELN.length} Tönen `
|
||||
ok(gemessen === CHAT_KACHELN.length && gemessen >= 8 && schlecht >= noetig,
|
||||
`${wo} trägt auf allen ${gemessen} Tönen `
|
||||
+ `(schlechtester ${wer}: ${schlecht.toFixed(2)}:1, nötig ${noetig})`);
|
||||
}
|
||||
|
||||
/* UND DIE SCHRIFT WECHSELT WIRKLICH. Ohne diese Zeile wäre nicht
|
||||
bewiesen, dass `schriftFuer` mehr tut, als immer dasselbe Paar
|
||||
zurückzugeben -- dann wäre die Schleife oben nur die alte Prüfung
|
||||
mit mehr Umweg. */
|
||||
{
|
||||
const hell = CHAT_KACHELN.filter((k) => helligkeit(k.farbe) > 0.3);
|
||||
const dunkel = CHAT_KACHELN.filter((k) => helligkeit(k.farbe) <= 0.3);
|
||||
const hellDunkleSchrift = hell.every((k) => helligkeit(schriftFuer(k.farbe).text) < 0.2);
|
||||
const dunkelHelleSchrift = dunkel.every((k) => helligkeit(schriftFuer(k.farbe).text) > 0.6);
|
||||
ok(hell.length >= 1 && dunkel.length >= 1 && hellDunkleSchrift && dunkelHelleSchrift,
|
||||
`${hell.length} helle Kacheln tragen dunkle Schrift, ${dunkel.length} dunkle tragen helle`);
|
||||
}
|
||||
|
||||
/* GEGENPROBE: Eine Prüfung, die nur bestätigen kann, bestätigt nichts.
|
||||
Ein absichtlich zu heller Ton MUSS durchfallen — sonst wäre das
|
||||
Grün oben nur die Abwesenheit einer Messung. */
|
||||
@@ -136,11 +165,30 @@ for (const [name, wo, noetig] of BLASEN_SCHRIFT) {
|
||||
werden, liegen sie auf einem Wert, und der Rest ist Rundung auf
|
||||
ganze Bildpunkte. Ein Faktor über 1,1 hieße: jemand hat eine Farbe
|
||||
von Hand eingetragen und damit die Rechnung umgangen. */
|
||||
const spanne = Math.max(...CHAT_KACHELN.map((k) => helligkeit(k.farbe)))
|
||||
/ Math.max(1e-6, Math.min(...CHAT_KACHELN.map((k) => helligkeit(k.farbe))));
|
||||
ok(spanne < 1.1,
|
||||
`alle Töne liegen auf derselben Leuchtdichte (Faktor ${spanne.toFixed(3)}) `
|
||||
+ "— keiner ist heller oder dunkler als die anderen");
|
||||
/* SIE GILT FÜR DIE GERECHNETEN -- und nur für die (22.09.2026 abends).
|
||||
|
||||
Der Zweck dieser Zeile ist: „Niemand kann sich durch seine Wahl
|
||||
schlechter lesbar machen als die anderen." Solange alle Töne
|
||||
dieselbe feste Schrift trugen, war gleiche Leuchtdichte der einzige
|
||||
Weg dorthin.
|
||||
|
||||
Seit die Schrift mitwechselt, gibt es einen zweiten -- und die
|
||||
Prüfung darüber löst das Versprechen direkt ein: JEDE Kachel
|
||||
erreicht mit IHRER Schrift 7:1 und 4,5:1. Das ist die Aussage, um
|
||||
die es ging; die gleiche Leuchtdichte war nur ihr Mittel.
|
||||
|
||||
Für die elf gerechneten Töne bleibt das Mittel trotzdem stehen:
|
||||
Sie kommen aus tools/chat-kacheln-rechnen.mjs, und ein Faktor über
|
||||
1,1 hieße dort weiterhin, dass jemand eine Farbe von Hand
|
||||
eingetragen und damit die Rechnung umgangen hat. Ausgenommen sind
|
||||
die, die nachweislich eine andere Schrift tragen. */
|
||||
const gerechnet = CHAT_KACHELN.filter(
|
||||
(k) => helligkeit(schriftFuer(k.farbe).text) > 0.6);
|
||||
const spanne = Math.max(...gerechnet.map((k) => helligkeit(k.farbe)))
|
||||
/ Math.max(1e-6, Math.min(...gerechnet.map((k) => helligkeit(k.farbe))));
|
||||
ok(gerechnet.length >= 8 && spanne < 1.1,
|
||||
`die ${gerechnet.length} gerechneten Töne liegen auf derselben Leuchtdichte `
|
||||
+ `(Faktor ${spanne.toFixed(3)}) — keiner ist heller oder dunkler als die anderen`);
|
||||
|
||||
/* UND SIE MÜSSEN BUNT SEIN. Gemessen an dem, was vor dem 22.09.2026
|
||||
drinstand: Buntheit 0,002 bis 0,048, im Mittel 0,028 — zwölf
|
||||
|
||||
Reference in New Issue
Block a user