Das Rudel meint den ganzen Raum -- und die Kachelfarbe wird ein Ring
Zwei Auftraege vom 23.09.2026.
SCREEN 1: "da steht links immer noch der treff anstatt das rudel"
Und er hatte recht, auf eine Art, die niemand sehen konnte:
TREFF_NAME stand schon seit der Umbenennung auf "Das Rudel". Nur
setzt treffRaumId() den Namen ausschliesslich BEIM ANLEGEN -- der
Raum existierte laengst, also blieb die Zeile in der Datenbank auf
"Der Treff" stehen. Im Code das eine, auf dem Bildschirm das andere.
Dieselbe Falle stand direkt nebenan schon beschrieben ("drei Stellen,
von denen die dritte vergessen wird") -- die Vorsorge galt aber nur
fuer die Teilnehmer, nicht fuer den Namen. Eine halbe Selbstheilung
heilt die andere Haelfte nicht. Jetzt gleicht treffAngleichen() auch
den Namen ab; eine kuenftige Umbenennung ist wieder eine Zeile.
(IS NOT statt !=: Bei NULL ergaebe != in SQLite NULL, und die Zeile
bliebe unveraendert liegen.)
"und wenn wir da im chat @rudel machen will ich dass jeder in dem
chat markiert wird. nicht nur team ... und sehr wichtig ich rede nur
von dem chat wo die ganze community auch drin ist."
Bis heute erreichte der Ruf ueberall nur Team Dogi. Die Begruendung
stand im Code und war nicht falsch -- im Rudel-Raum sitzt die
Community. Genau das will Filipe jetzt, und zwar nur dort:
im Rudel-Raum -> alle, die drin sind
ueberall sonst -> Team Dogi, unveraendert
Was die alte Sorge entschaerft: RUFEN darf weiterhin nur Team Dogi --
kein Zuschauer kann alle wecken. Und die Nachtruhe gilt dort ohnehin.
darf_rudel folgt derselben Frage. Sonst entstuende ein stiller
Widerspruch: Ein Modi mit neun Zuschauern und ohne zweites
Teammitglied traefe mit @rudel neun Leute -- der Vorschlag beim
Tippen waere aber ausgeblendet. Die Funktion gaebe es, und niemand
faende sie.
Das Schild sagt jetzt die Wahrheit: "alle in diesem Chat" statt
"alle im Team". Stuende dort weiter das alte, waere es im Rudel-Raum
gelogen -- und zwar nach unten, also in die Richtung, in der man
leichtfertig drueckt.
Gegenprobe in pruef-erwaehnung: In der Testgruppe sitzen DogFather
und zwei Scouts; ein @rudel dort ruft NIEMANDEN. Waere die Regel
versehentlich im ganzen Haus aktiv, waeren die Scouts markiert.
"sonst nichts anfassen" ist damit gemessen, nicht versprochen.
SCREEN 2: "so eine art diagramm, wo man mit einem kreis herum gehen
kann und die farbe ganz genau selber auswaehlen kann"
Der Haken daran ist nicht die Optik. Die zwoelf Kacheln waren
GERECHNET, damit niemand sich unlesbar machen kann -- alle auf
derselben Leuchtdichte. Ein Farbkreis, der einfach den Farbton dreht,
wirft das weg: Ein gesaettigtes Gelb ist um ein Vielfaches heller als
ein gesaettigtes Blau, und helle Schrift ist darauf nicht mehr zu
lesen.
Der Ring ist deshalb KEINE neue Rechnung, sondern dieselbe in 360
Schritten statt in zwoelf. tools/chat-kacheln-rechnen.mjs --kreis
schreibt server/chat-kreis.js; buntest() und die Kontrastpruefung
darin gelten unveraendert. Ergebnis: ein Ring gleicher Helligkeit --
kein blendendes Gelb, kein abgesoffenes Blau. Das sieht ruhiger aus
als der uebliche Farbkreis, und genau das ist der Punkt.
Der Browser rechnet nichts. Er bekommt die 360 fertigen Farben und
legt sie in dieselbe Tabelle wie die Kacheln -- ab da ist "ton-214"
ein Schluessel wie "veilchen", und jede Stelle, die eine Farbe
nachschlaegt, funktioniert unveraendert.
Welche Kacheln neben dem Ring bleiben, wird ABGELEITET statt
aufgezaehlt: Grau hat keinen Farbton, Babyblau ist die eine helle mit
eigener Schrift. Nachgemessen liegen die elf bunten zwischen 0,0 und
2,4 von ihrer Ringfarbe entfernt, Grau bei 75,4 und Babyblau bei
192,9 -- zwischen 2,4 und 75 ist so viel Luft, dass die Schwelle
nicht knapp ist.
Gespeichert wird erst beim Loslassen. Wer einmal um den Ring fuehrt,
erzeugte sonst dreihundert Anfragen.
Gemessen (pruef-chat-neu, jetzt 32 Pruefungen, als Modi auf crew. mit
dem Finger): 265 px gross, aus 361 Farben gemalt, touch-action none
(sonst schiebt das Handy die Seite weg statt zu drehen), Drehen auf
drei Uhr ergibt genau Winkel 90, die Mitte zeigt exakt #675102,
vorgelesen als "Goldbraun, 90 Grad", in der Datenbank steht ton-90,
Pfeiltaste dreht ein Grad weiter. Und das eigentliche Versprechen:
alle 360 Toene tragen die Schrift der Blase, knappster Faktor 1,000.
Dabei zwei eigene Fehler, beide aufgeschrieben: Der erste Anlauf
wartete 30 Sekunden auf den Farbknopf -- am Handy weicht die Spalte
mit den Gespraechen zur Seite, sobald ein Chat offen ist. "Ist im
HTML" und "ist erreichbar" sind zwei Aussagen. Und die Schriftfarben
wurden an der falschen Klasse gemessen, was einen roten Haken an
einer heilen Stelle ergab.
Ausserdem: Das native confirm() beim Herausnehmen eines GIFs ist
weg -- meine eigene Abkuerzung vom Morgen. Gemeldet hat es
pruef-nachfrage, allerdings erst, nachdem der verlorene Backslash in
derselben Datei repariert war.
Zahlen: pruef-erwaehnung 122 (vorher 119), pruef-chat-neu 32
(vorher 19), pruef-nachfrage 46 bestanden.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -241,6 +241,125 @@ function buntest(hGrad) {
|
||||
return besteRgb ? { c: besteC, rgb: besteRgb } : null;
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
DER GANZE KREIS (23.09.2026)
|
||||
|
||||
Filipe: "anstatt sowas um die farben auszusuchen, kannst du nicht so
|
||||
eine art diagramm machen wo man mit einem kreis herum gehen kann und
|
||||
sie die farbe ganz genau selber auswaehlen kann?"
|
||||
|
||||
---------------------------------------------------------------------
|
||||
WARUM DAS HIER STEHT UND NICHT IM BROWSER
|
||||
|
||||
Die zwoelf Kacheln sind nicht ausgesucht, sondern GERECHNET: Jede
|
||||
liegt auf derselben Leuchtdichte, damit die Schrift ueberall gleich
|
||||
gut lesbar ist und niemand sich durch seine Wahl unlesbar machen
|
||||
kann. Ein Farbkreis, der einfach den Farbton dreht, wirft genau das
|
||||
weg -- ein gesaettigtes Gelb ist um ein Vielfaches heller als ein
|
||||
gesaettigtes Blau, und helle Schrift darauf ist nicht mehr zu lesen.
|
||||
|
||||
Der Kreis ist deshalb KEINE neue Rechnung, sondern dieselbe in 360
|
||||
Schritten statt in zwoelf. buntest() entscheidet fuer jeden Winkel,
|
||||
und die Kontrastpruefung darin gilt unveraendert. Was dabei
|
||||
herauskommt, ist ein Ring gleicher Helligkeit: Er sieht ruhiger aus
|
||||
als ein ueblicher Farbkreis -- kein blendendes Gelb, kein
|
||||
abgesoffenes Blau -- und genau das ist der Punkt.
|
||||
|
||||
DER BROWSER RECHNET NICHTS. Er bekommt die 360 fertigen Farben. Wer
|
||||
die Formel in JavaScript nachbaut, hat zwei Rechnungen, und die
|
||||
zweite ist ab dem naechsten Schriftwechsel falsch -- ohne dass es
|
||||
jemand merkt, weil beide "irgendeine Farbe" liefern.
|
||||
===================================================================== */
|
||||
if (process.argv.includes("--kreis")) {
|
||||
const SCHRITTE = 360;
|
||||
const toene = [];
|
||||
/* DIE ZAHLEN BLEIBEN LIEGEN, nicht nur das Hex. kontrast() und
|
||||
helligkeit() erwarten [r,g,b] -- gaebe man ihnen die
|
||||
Zeichenkette "#aabbcc", zerlegt die Destrukturierung sie in
|
||||
"#", "a", "a" und rechnet ab da mit NaN. Der Vergleich
|
||||
"NaN < 1" ist immer falsch, die Pruefung waere also gruen und
|
||||
haette nichts gemessen. */
|
||||
const rgbs = [];
|
||||
const schwach = [];
|
||||
let fehlend = 0;
|
||||
|
||||
for (let h = 0; h < SCHRITTE; h++) {
|
||||
const b = buntest(h);
|
||||
if (!b) { fehlend++; toene.push(null); rgbs.push(null); continue; }
|
||||
toene.push(hex(b.rgb));
|
||||
rgbs.push(b.rgb);
|
||||
if (b.c < MINDEST_BUNTHEIT) schwach.push(h);
|
||||
}
|
||||
|
||||
/* DRITTER AUSGANG. Findet sich fuer einen Winkel ueberhaupt keine
|
||||
Farbe, die den Kontrast haelt, ist der Ring unterbrochen -- dann
|
||||
wird NICHT stillschweigend etwas Naheliegendes eingesetzt,
|
||||
sondern gesagt, dass es nicht geht. Eine Luecke, die als Farbe
|
||||
getarnt ist, faellt niemandem auf. */
|
||||
if (fehlend) {
|
||||
console.error("\nKONNTE NICHT NACHSEHEN: " + fehlend + " von " + SCHRITTE
|
||||
+ " Winkeln halten den Kontrast nicht."
|
||||
+ "\n Heisst: die Schrift auf der Blase ist zu dunkel."
|
||||
+ "\n Erst --blase-leise in chat.css aufhellen, dann erneut rechnen.");
|
||||
process.exit(2);
|
||||
}
|
||||
|
||||
/* DIE NACHPRUEFUNG AM AUSGELIEFERTEN WERT, nicht am gerechneten.
|
||||
Ausgeliefert wird das gerundete Hex -- und gerundet wird nach der
|
||||
Kontrastpruefung. Das ist die Stelle, an der am 22.09. schon
|
||||
einmal drei Hundertstel gefehlt haben. */
|
||||
let schlechtester = Infinity, schlechtesterWinkel = -1;
|
||||
for (let h = 0; h < SCHRITTE; h++) {
|
||||
for (const sf of pruefFarben) {
|
||||
const k = kontrast(rgbs[h], sf.farbe);
|
||||
if (k / sf.noetig < schlechtester) { schlechtester = k / sf.noetig; schlechtesterWinkel = h; }
|
||||
}
|
||||
}
|
||||
if (schlechtester < 1) {
|
||||
console.error("\nNICHT IN ORDNUNG: Winkel " + schlechtesterWinkel
|
||||
+ " verfehlt seine Schwelle (Faktor " + schlechtester.toFixed(3) + ").");
|
||||
process.exit(2);
|
||||
}
|
||||
|
||||
console.log("Kreis gerechnet: " + SCHRITTE + " Winkel, alle ueber ihrer Schwelle"
|
||||
+ " (knappster: Winkel " + schlechtesterWinkel + ", Faktor "
|
||||
+ schlechtester.toFixed(3) + ").");
|
||||
if (schwach.length) {
|
||||
console.log(" Unter Buntheit " + MINDEST_BUNTHEIT + ": " + schwach.length
|
||||
+ " Winkel. Das ist im Kreis in Ordnung -- dort darf es blasse"
|
||||
+ " Stellen geben, bei den zwoelf Kacheln nicht.");
|
||||
}
|
||||
|
||||
const ziel = new URL("../server/chat-kreis.js", import.meta.url);
|
||||
const zeilen = [];
|
||||
for (let i = 0; i < SCHRITTE; i += 6) {
|
||||
zeilen.push(" " + toene.slice(i, i + 6).map((t) => '"' + t + '"').join(", ") + ",");
|
||||
}
|
||||
writeFileSync(ziel, [
|
||||
"/* ERZEUGT von tools/chat-kacheln-rechnen.mjs --kreis.",
|
||||
" NICHT VON HAND AENDERN -- wer hier eine Farbe eintippt, umgeht",
|
||||
" genau die Kontrastrechnung, die die Lesbarkeit garantiert.",
|
||||
"",
|
||||
" 360 Farbtoene, Schritt 1 Grad, alle auf derselben Leuchtdichte",
|
||||
" wie die zwoelf Kacheln. Der Index IST der Winkel: KREIS[214] ist",
|
||||
" 214 Grad. */",
|
||||
"export const KREIS = [",
|
||||
...zeilen,
|
||||
"];",
|
||||
"",
|
||||
"/** Der Winkel zu einem Schluessel der Form \"ton-214\", sonst null. */",
|
||||
"export function winkelAus(wert) {",
|
||||
" const t = /^ton-(\\d{1,3})$/.exec(String(wert ?? \"\"));",
|
||||
" if (!t) return null;",
|
||||
" const n = Number(t[1]);",
|
||||
" return n >= 0 && n < KREIS.length ? n : null;",
|
||||
"}",
|
||||
"",
|
||||
].join("\n"), "utf8");
|
||||
console.log("Geschrieben: server/chat-kreis.js");
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
const bunte = HUES.map((h) => ({ h, ...(buntest(h) || {}) }));
|
||||
const fehlen = bunte.filter((b) => !b.rgb || b.c < MINDEST_BUNTHEIT);
|
||||
if (fehlen.length) {
|
||||
|
||||
Reference in New Issue
Block a user