Neuer Stil "Nachtprisma", Gespraeche anheften, und unten wieder Luft

Drei Sachen aus einem Bildschirmfoto-Satz.

=== 1. EIN ANDERER STIL, NICHT DIESELBE SPRACHE MIT NEUEN DETAILS ===

Filipe, zum dritten Mal an derselben Stelle: "du verstehst es wirklich
nicht ... ich will eine komplette aenderung vom aussehen. vom
hintergrund und von der grossen kachel. ich will einen ganz anderen
stil ... die leute sollen morgen nichts mehr wieder erkennen vom
aussehen her."

WARUM MEINE ZWEI ANLAEUFE DAVOR NICHT GEREICHT HABEN -- und das ist
kein Geschmacksstreit, sondern ein Fund:

Der Umriss des Chats kommt gar nicht aus chat.css. Er steht in
module.css, in einer Liste von 50 Klassen, und `.chat` ist eine davon:
Fase oben links, Kantenlicht, Punktraster, drei goldene Eckwinkel.
module.css wird NACH chat.css geladen -- und die Staerke des `:is(...)`
dort ist (0,2,0), weil `.gruppe[data-gruppe]` mit in der Liste steht.
Jede meiner Regeln war gleich stark und kam frueher. Deshalb stimmte
beides: "ich habe den Rand geaendert" und "der Rand ist derselbe". Ich
habe zweimal Details INNERHALB eines Rahmens geaendert, den ich nicht
angefasst hatte -- und den erkennt man zuerst.

Der neue Block steht als eine klar benannte Schicht am Ende von
chat.css, mit `.inhalt.chat-seite` -- eine Klasse mehr als module.css,
kein `!important` (das waere eine Tuer, die man nie wieder zubekommt).

  ALT                        NEU
  Fase oben links            rundum 26 px weich
  drei goldene Eckwinkel     keine -- der Koerper traegt sich selbst
  Punktraster                drei weiche Lichter im Hintergrund
  1-px-Rahmen ueberall       kein Rahmen, Lichtkante innen
  Gold als Leitfarbe         Lavendel/Violett, Blasen wie gehabt
  Kaesten nebeneinander      Koerper mit Tiefe und farbigem Schatten

DIE LEITFARBE WIRD AN EINER STELLE GETAUSCHT, nicht an zwanzig. Im
ersten Anlauf habe ich zehn Regeln einzeln umgefaerbt und danach im
Bild gesehen, dass Suchfeld, "Neu", Zaehler und Fokusrahmen weiter
golden waren -- sie nehmen alle `--akzent` und `--rand`. Jetzt stehen
beide am `<main>` der Chatseite. Uebersicht, Kalender und Aufgaben
behalten ihr Gold; nur der Chat soll nicht wiederzuerkennen sein.

#b9a7ff UND NICHT #7a5cff, und das ist gerechnet, nicht gewaehlt: Die
Akzentfarbe ist hier auch FLAECHE unter dunkler Schrift (die
Ungelesen-Marke). Das satte Violett kommt dort auf 3,7:1 -- zu wenig.
Das helle auf 8,9:1, und als Schrift auf dunklem Grund genauso.

WAS UNANGETASTET BLEIBT: `--blasengrund`, `--blase-text`,
`--blase-leise`, `--namen-anteil`. An ihnen haengen die Messungen von
pruef-chatkachel (12 Kacheln) und pruef-chat-neu (360 Ringtoene). Ein
Stilwechsel darf eine Zusage nicht nebenbei aufheben.

pruef-chat-optik hat sofort einen echten Schaden gemeldet: Der neue
Stil nahm allen Blasen den Rahmen -- und damit auch den, mit dem eine
NICHT ABGESCHICKTE Nachricht markiert ist ("der Unterschied ist auch zu
SEHEN, nicht nur im Merkmal (Rand 0px)"). Genau dafuer steht die Zeile
dort. Der Warnton sitzt jetzt zusaetzlich im inneren Saum.

=== 2. GESPRAECHE ANHEFTEN ===

Filipe: "ich will dass man auch individuel jeder fuer sich auch in der
liste chats fixieren kann. auch mehrere nicht nur eins."

Drei Aussagen, und jede wird einzeln geprueft:

  "fixieren"     -> `fixiert_am` an der TEILNEHMER-Zeile; Angeheftetes
                    steht oben, darunter geht die gewohnte Reihenfolge
                    weiter.
  "individuell"  -> die Spalte haengt an der Person, nicht am Raum. Eine
                    Spalte an `chat_raeume` haette alles andere genauso
                    erfuellt und jedem im Raum das Gespraech oben
                    hingeklebt -- gemerkt haette man es erst, wenn sich
                    jemand beschwert. Die Gegenprobe prueft deshalb
                    ausdruecklich, dass es bei Luna weder markiert ist
                    noch nach oben rutscht.
  "auch mehrere" -> keine Obergrenze. Ein Zeitstempel statt Ja/Nein
                    kostet dasselbe und beantwortet die Frage mit,
                    in welcher Reihenfolge mehrere stehen: zuletzt
                    angeheftet oben.

Die Nadel steht IMMER an der Zeile, nicht erst beim Ueberfahren -- am
Handy gibt es kein Ueberfahren (dieselbe Entscheidung wie am 23.09. bei
den Handgriffen), und eine Spalte, die mal da ist und mal nicht, laesst
die Namen daneben wandern. Sie liegt schraeg, solange nichts
angeheftet ist, und steht aufrecht, wenn doch -- das sieht man auch
ohne Farbe.

Der Zustand wird GESCHICKT, nicht errechnet (`an: true/false`): Ein
Schalter, der den Gegenwert selbst ausrechnet, kippt bei zwei schnellen
Klicks oder zwei offenen Fenstern in den falschen Zustand.

Die Karte ist seit heute die ZEILE und nicht mehr der Knopf darin --
im ersten Anlauf sass die Nadel sichtbar ausserhalb der Flaeche, wie
ein Knopf, der danebengefallen ist.

=== 3. UNTEN WIEDER LUFT ===

"schieb das bisschen hoeher bitte, weil das ist unten zu nah am rand."
14 px Polsterung. Sie geht nach INNEN (`border-box`), macht die Seite
also nicht laenger -- sonst waere das Schreibfeld wieder unter den
Bildrand gerutscht, und genau darum ging es am 09.09. schon einmal.

Geprueft: pruef-chat (neuer Abschnitt Anheften, 14 Punkte, alle gruen),
pruef-chat-optik, pruef-chatkachel (40), pruef-chat-neu (32),
pruef-chat-ausbau (64), pruef-chat-kanaele (81), pruef-chat-aufloesen
(126), pruef-chat-anhaenge (109), pruef-erwaehnung (129),
pruef-css-klassen, pruef-tippziele (11), pruef-lesbarkeit.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-25 03:07:05 +02:00
co-authored by Claude Opus 5
parent 63a3fb4af8
commit c64732b16d
46 changed files with 1366 additions and 632 deletions
+104
View File
@@ -402,6 +402,110 @@ console.log("\n=== Ohne Anmeldung ===");
d.close();
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
/* =====================================================================
GESPRAECHE OBEN ANHEFTEN (25.09.2026)
=====================================================================
Filipe: „ich will dass man auch individuel jeder fuer sich auch in
der liste chats fixieren kann. auch mehrere nicht nur eins."
DREI AUSSAGEN STECKEN IN DIESEM SATZ, und jede wird einzeln
geprueft:
„fixieren" -> das Angeheftete steht OBEN, nicht irgendwo
„individuell" -> beim anderen aendert sich NICHTS
„auch mehrere" -> zwei gleichzeitig, und die Reihenfolge stimmt
DIE ZWEITE IST DIE WICHTIGSTE und die, die am leichtesten kaputt
geht: Eine Spalte an `chat_raeume` haette alles andere genauso
erfuellt -- und jedem im Raum das Gespraech oben hingeklebt. Man
haette es erst gemerkt, wenn sich jemand beschwert.
GEGENPROBEN: fremder Raum (404) und das Loesen (steht wieder
unten). Ohne sie waere „steht oben" ein Haken, der auch gruen
waere, wenn die Liste immer dieselbe Reihenfolge haette.
===================================================================== */
console.log("\n=== Anheften: oben, einzeln, mehrere ===");
{
/* Zwei eigene Raeume anlegen -- so haengt die Pruefung nicht davon
ab, wie viele Gespraeche zufaellig schon dastehen. Mit Luna
zusammen, denn an ihr wird gleich gezeigt, dass sich bei ihr
nichts aendert. */
const machGruppe = async (name) => {
const a = await rufe(dogi.keks, "/workspace/api/chat/gruppe",
{ name, mit: [idLuna, idPat] }, "POST");
const j = await a.json().catch(() => ({}));
return j.raum_id;
};
const raumA = await machGruppe("Anheft-Probe A");
const raumB = await machGruppe("Anheft-Probe B");
ok(Number.isInteger(raumA) && Number.isInteger(raumB) && raumA !== raumB,
`zwei Raeume zum Anheften (${raumA}, ${raumB})`);
const liste = async (keks) => (await holen(keks, "/workspace/api/chat/raeume")).raeume || [];
const anheften = (keks, raum, an) =>
rufe(keks, `/workspace/api/chat/raeume/${raum}/fixieren`, { an }, "PUT");
/* VORHER: nichts ist angeheftet. Ohne diese Zeile koennte alles
Folgende auch dann gruen sein, wenn die Spalte von sich aus
gefuellt waere. */
const vorher = await liste(dogi.keks);
ok(vorher.length >= 2 && vorher.every((r) => r.fixiert === false),
`vorher ist nichts angeheftet (${vorher.length} Gespraeche)`);
/* ---- 1. „fixieren": oben ---------------------------------------- */
const wo = vorher.findIndex((r) => r.id === raumA);
const a1 = await anheften(dogi.keks, raumA, true);
const j1 = await a1.json().catch(() => ({}));
ok(a1.status === 200 && j1.fixiert === true,
`Raum A laesst sich anheften (HTTP ${a1.status}, fixiert ${j1.fixiert})`);
const nachA = await liste(dogi.keks);
ok(nachA[0]?.id === raumA,
`und steht danach ganz oben (vorher an Stelle ${wo + 1}, jetzt an 1)`);
ok(nachA[0]?.fixiert === true, " und traegt die Marke dafuer");
/* ---- 2. „individuell": bei Luna aendert sich nichts -------------- */
const beiLuna = await liste(luna.keks);
const lunaA = beiLuna.find((r) => r.id === raumA);
ok(!!lunaA && lunaA.fixiert === false,
`Gegenprobe: bei Luna ist derselbe Raum NICHT angeheftet (${lunaA?.fixiert})`);
/* UND ER STEHT BEI IHR AUCH NICHT OBEN. Die Marke allein wuerde
nicht reichen: Sortiert der Server nach einer Spalte am RAUM,
stuende er bei ihr oben, obwohl `fixiert` false meldet. */
ok(beiLuna.length < 2 || beiLuna[0].id !== raumA
|| beiLuna.filter((r) => r.fixiert).length > 0,
` und rutscht bei ihr auch nicht nach oben (oben steht ${beiLuna[0]?.id})`);
/* ---- 3. „auch mehrere" ------------------------------------------ */
await anheften(dogi.keks, raumB, true);
const nachB = await liste(dogi.keks);
ok(nachB.filter((r) => r.fixiert).length === 2,
`zwei gleichzeitig angeheftet (${nachB.filter((r) => r.fixiert).length})`);
ok(nachB[0]?.id === raumB && nachB[1]?.id === raumA,
`und das zuletzt angeheftete steht oben (${nachB[0]?.id}, dann ${nachB[1]?.id})`);
ok(nachB.slice(2).every((r) => r.fixiert === false),
" darunter geht die gewohnte Reihenfolge weiter");
/* ---- 4. Loesen --------------------------------------------------- */
const a2 = await anheften(dogi.keks, raumB, false);
ok(a2.status === 200, `es laesst sich wieder loesen (HTTP ${a2.status})`);
const nachLos = await liste(dogi.keks);
ok(nachLos[0]?.id === raumA && nachLos.filter((r) => r.fixiert).length === 1,
`danach haengt nur noch A oben (oben ${nachLos[0]?.id}, `
+ `${nachLos.filter((r) => r.fixiert).length} angeheftet)`);
/* ---- 5. Ein fremder Raum ---------------------------------------- */
/* Nora sitzt in keinem der beiden. Kaeme hier etwas anderes als 404
zurueck, liesse sich aus der Antwort ablesen, welche Raumnummern
es ueberhaupt gibt. */
const fremd = await anheften(nora.keks, raumA, true);
ok(fremd.status === 404,
`Gegenprobe: ein fremder Raum laesst sich nicht anheften (${fremd.status})`);
const beiNora = await liste(nora.keks);
ok(beiNora.every((r) => r.fixiert === false),
" und bei ihr haengt danach auch nichts");
}
console.log(`\n${fehler === 0 ? "ALLES IN ORDNUNG" : `${fehler} FEHLER`}`);
/* HIER IST process.exit() RICHTIG -- anders als in pruef-push-weg.