Filipe: „fuer die modis, rechte und linke hand und dogfather eine
kachel hinzufuegst, sie soll: Notizen, heissen. ich will dass du das
auch wie ein notizblock erstellst. ich will dass es uebelst geil und
einzigartig ist."
=================================================================
TEIL 1: DIE FARBE -- UND WAS DABEI AUFFIEL
=================================================================
Fuer die neue Kachel braucht es einen Ton. Beim Suchen fiel auf, dass
tools/kachelton-entzerren.mjs zwoelf der 45 Farben fuer FREI hielt.
Sie sind es nicht. bereicheFuer() gibt fuer die fuenf Rollen des
Agenturhauses null zurueck -- das heisst „nimm die Liste aus dem
Browser", und die steht in workspace/assets/js/bereiche.js. Dort
stehen die Toene 1 bis 22 und 44: Dashboard, Zahlen, Team-Lage,
Scout-Pipeline. Kacheln, die jeden Tag jemand ansieht.
pruef-kachelfarben hatte denselben blinden Fleck. Sie meldete seit
Wochen „33 benutzte Toene" und war gruen. Was sie dadurch NICHT sah:
* Der Farblauf von gestern Nacht hat zwoelf dieser Kacheln
verschoben und drei davon unter die Buntheitsgrenze gedrueckt.
Gruen geblieben.
* Ton 7, 16 und 22 lagen SEIT JEHER unter der Grenze (0,112 / 0,116
/ 0,068). Nie gemeldet.
Das ist die Sorte gruener Haken, vor der die Hausregel warnt: Er sagt
nur, dass die Bedingung erfuellt war -- nicht, dass sie das Richtige
angesehen hat.
BEHOBEN, und zwar an der Wurzel: Die REGELN (Kontrast, Buntheit)
gelten jetzt fuer jeden Ton, der irgendwo an einer Kachel steht --
gelesen aus denselben fuenf Dateien, die auch pruef-kachel-universum
liest. Dazu die Namen der Kacheln, damit „Ton 1 traegt Dashboard"
ueberhaupt pruefbar ist.
DIE PALETTE WURDE NEU GERECHNET, mit dem dritten Verfahren an einem
Tag -- die ersten zwei stehen als Fehler im Kopf des Werkzeugs:
1. Alle 45 neu verteilt. Lief ueber zwei ausdrueckliche Wuensche
hinweg (#ff1a1a, #a8d8ff).
2. Nur die Kollisionen, aber immer nur EINEN der beiden bewegt.
Ergebnis: Ton 1 sprang vom Tuerkis ins Altrosa, 0,197 weit.
3. BEIDE duerfen sich bewegen, und zwar beide nur ein bisschen.
Zwei Toene, die 0,02 auseinanderstehen und 0,09 brauchen, teilen
sich das -- jeder rueckt 0,045, und beide bleiben, was sie waren.
kleinster Abstand 0,0154 -> 0,0905
zu blass 4 -> 0
sichtbar veraendert 7 Kacheln (ueber 0,05)
kaum zu sehen 28 (13 zwischen 0,02 und 0,05, 15 darunter)
EINE AUSNAHME MIT ZAHL, keine mit Achselzucken: Ton 1 (Dashboard)
bleibt acht Tausendstel unter der Buntheitsgrenze. Gemessen ueber ALLE
16,7 Millionen sRGB-Farben ist die naechste, die alle Regeln haelt,
#7a75c8 -- ein Blauviolett, 0,113 entfernt. Tuerkis erreicht in sRGB
schlicht keine hoehere Buntheit, und das schmale Band teilen sich
schon sieben Toene. Eine Kachel, die ihre Farbfamilie behaelt, ist die
bessere Antwort auf „richtig geil und speziell" als eine, die acht
Tausendstel bunter ist und niemand wiedererkennt. blassBis sagt jetzt
bei jeder Ausnahme, WIE WEIT sie reicht -- vorher hiess blassErlaubt
schlicht „hier wird weggesehen".
DIE NEUE FARBE IST GRUEN UND WOLLTE BERNSTEIN SEIN. Gesucht war die
Farbe von Papier. Gemessen gibt es sie nicht mehr: Der beste Bernstein
im ganzen Farbraum haelt 0,0799 Abstand -- unter der Hausgrenze. Und
Platz schaffen hilft nicht: Setzt man ihn fest, muss ein warmer Ton
das Band verlassen (Ton 45 waere 0,212 weit ins Magenta gewandert).
Die groesste wirklich freie Luecke liegt im Gruen, bei 0,0917. Ein
linierter Block in Gruen ist Papier, seit es Papier gibt.
=================================================================
TEIL 2: DER BLOCK
=================================================================
DREI ENTSCHEIDUNGEN, AUS DENEN DER REST FOLGT:
1. ES GIBT KEINEN SPEICHERN-KNOPF. Nirgends. Wer einen Block
aufschlaegt und lostippt, drueckt hinterher nicht auf „sichern";
er klappt ihn zu. Gesichert wird 800 ms nach dem letzten
Tastendruck. Geht das nicht, bleibt der Text im Browser liegen und
wird nachgereicht -- und der Fuss sagt ehrlich „noch nicht
gesichert", statt einen Verlust zu melden, den man gerade nicht
verhindern kann.
2. DAS BLATT IST EIN SCHREIBFELD MIT EINER DECKSCHICHT. Das Feld
traegt Text und Cursor und ist unsichtbar; darueber zeichnet eine
zweite Schicht denselben Text noch einmal -- mit Kaestchen,
Ueberschriften, Strichen und Links.
DARAUS FOLGT EINE EISERNE REGEL, und sie steht dreimal im Code:
KEINE Auszeichnung darf die BREITE eines Zeichens aendern. Kein
Fettdruck, keine andere Groesse, keine Sperrung. Erlaubt sind nur
Farbe, Flaeche, Rahmen und Durchstreichen. Ein einziges
font-weight: 700 verschoebe den Umbruch, und ab der zweiten Zeile
stuende der sichtbare Text neben dem Cursor.
pruef-notizen misst das am echten Umbruch: eine Probe mit allen
Auszeichnungen und einer Zeile, die umbrechen MUSS. Sind beide
Schichten verschieden hoch, sitzt der Umbruch woanders. Mit
Gegenprobe -- Fettdruck auf der Deckschicht bricht die Deckung um
genau eine Zeile (30 px), und die Zeile wird rot.
3. DIE TASTATUR FUEHRT DIE LISTE FORT, NICHT EINE LEISTE. Ein
Spiegelstrich und Enter macht den naechsten Punkt, ein leeres
Kaestchen und Enter das naechste Kaestchen -- und ein GESETZTER
Haken wird dabei nicht mitgenommen, die naechste Aufgabe ist ja
noch nicht erledigt. Zweimal Enter beendet die Liste. Ein Klick
aufs Kaestchen hakt ab. Es gibt keine Werkzeugleiste, weil man beim
Schreiben nie den Stift wechselt.
UND: NIEMAND SIEHT DIE NOTIZEN EINES ANDEREN. Auch DogFather nicht.
Es gibt in workspace-notizen.js keinen siehtAlles()-Zweig, keinen
Umschalter, keine fremde Liste -- jede Abfrage hat person_id = ? fest
eingebaut. Die Kachel steht deshalb in „Fuer dich" und nicht in
„Taeglich": Die Gruppe sagt die wichtigste Eigenschaft, bevor man sie
anfasst.
NUR AUF DER TEAM-ADRESSE. Auf der Agenturadresse ist die Seite ein
404 -- auch fuer DogFather. Das ist dieselbe Trennung wie bei Chat,
Kalender und Aufgaben, und sie steht an zwei Stellen: in
GEHOERT_ZU_ADRESSE (die Datei) und in der Schnittstelle (die Daten).
Die Seite ist nur HTML; die Daten sind die Sache.
Dazu: sechs Papierfarben, Anheften, Suche mit Hervorhebung im Text,
Papierkorb mit dreissig Tagen und einem Eintrag in der
Aufbewahrungsliste (ohne den waere die Frist ein Satz in einem
Kommentar -- genau das ist dem Support am 24.09. passiert).
=================================================================
EIN FUND BEIM BAUEN, DER ALLEN GEHOERT
=================================================================
DELETE /workspace/api/notizen/:id gab es schon -- in
workspace-aufgaben.js, fuer die Notizen AN einer Aufgabe. Weil jener
Router frueher eingehaengt ist, hat er jeden Loeschversuch des Blocks
abgefangen und mit 404 beantwortet.
Von aussen sah das aus wie ein Fehler im neuen Modul: Anlegen ging,
Aendern ging, Loeschen nicht. Man sucht dann im eigenen Code, und dort
ist nichts. Express meldet so etwas nicht -- es nimmt die erste Route,
die passt, und schweigt ueber die zweite.
Der Block liegt jetzt unter /workspace/api/notizblock. Und
pruef-notizen geht seitdem den Routenbaum von express durch und meldet
jedes Paar aus Methode und Pfad, das zweimal vergeben ist. Gemessen:
307 Wege, keine Dublette. Die Pruefung gilt fuers ganze Haus, auch
wenn sie in dieser Datei steht -- hier ist sie gefunden worden.
Nebenbei berichtigt: pruef-crew-adresse verlangte von jedem Eintrag
der Haustafel HTTP 200 mit Inhalt. Das stimmte, solange dort nur
oeffentliche Dateien standen. notizen.html ist die erste Seite hinter
der Anmeldung -- sie antwortet mit 302, und das ist richtig. Gefragt
wird jetzt, was die Tafel wirklich meint: GIBT es das hier.
GEMESSEN, alles nach den Aenderungen:
pruef-notizen 76 Punkte, 0 Fehler (neu)
pruef-kachelfarben 31 Punkte, 0 Fehler (vorher 26)
pruef-kachel-universum 13 Punkte, 0 Fehler
pruef-crew-adresse 157 Punkte, 0 Fehler
pruef-buehne 230 Punkte, 0 Fehler -- notizen.html neu in
der Liste, schlechtester Kontrast 6,73:1,
also 50 % ueber der Grenze
pruef-rechtetafel, -haus-seiten, -struktur, -css-klassen,
-jeder-hat-eine-seite, -workspace-seiten, -kachelraster,
-rueckmeldung alle 0 Fehler
Co-Authored-By: Claude Opus 5 <[email protected]>
775 lines
40 KiB
HTML
775 lines
40 KiB
HTML
<!doctype html>
|
||
<html lang="de">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||
<title>Chat · Spicy & Dogi</title>
|
||
<meta name="robots" content="noindex, nofollow" />
|
||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||
eine Flaeche sind statt zweier. -->
|
||
<meta name="theme-color" content="#06090f" />
|
||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609261240" />
|
||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609261240" />
|
||
<link rel="stylesheet" href="assets/css/gate.css?v=202609261240" />
|
||
<link rel="stylesheet" href="assets/css/start.css?v=202609261240" />
|
||
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
|
||
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
|
||
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
|
||
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
|
||
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
|
||
Dialog zu sehen bekam. -->
|
||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609261240" />
|
||
<link rel="stylesheet" href="assets/css/chat.css?v=202609261240" />
|
||
<link rel="stylesheet" href="assets/css/module.css?v=202609261240" />
|
||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||
<link rel="stylesheet" href="assets/css/haus.css?v=202609261240" />
|
||
</head>
|
||
|
||
<body class="start">
|
||
|
||
<div class="schleier" aria-hidden="true"></div>
|
||
|
||
<header class="kopfleiste">
|
||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||
</svg>
|
||
<span class="zurueck-knopf__text">Zurück</span>
|
||
</button>
|
||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Chat</span></p>
|
||
<div class="kopfleiste__rechts">
|
||
<span class="wer" id="wer">…</span>
|
||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||
</div>
|
||
</header>
|
||
|
||
<main class="inhalt inhalt--breit chat-seite">
|
||
|
||
<!-- DIE GANZE SEITE IST EINE FLÄCHE, kein Dokument zum Scrollen.
|
||
|
||
Ein Chat ist kein Text, den man von oben nach unten liest --
|
||
man springt zwischen Gesprächen, und das Eingabefeld muss
|
||
immer erreichbar sein, ohne zu suchen. Deshalb: feste Höhe,
|
||
und gescrollt wird nur INNERHALB der beiden Spalten.
|
||
|
||
data-ansicht steuert am Handy, welche Spalte zu sehen ist:
|
||
"liste" oder "verlauf". Am Rechner stehen beide nebeneinander
|
||
und das Merkmal bewirkt nichts. -->
|
||
<div class="chat" id="chat" data-ansicht="liste">
|
||
|
||
<!-- ---------- Links: die Gespräche ---------- -->
|
||
<section class="chat__spalte chat__spalte--liste" aria-labelledby="liste-titel">
|
||
<div class="chat__kopf">
|
||
<h1 class="chat__titel" id="liste-titel">Gespräche</h1>
|
||
<!-- WIE VIELE WARTEN AUF MICH? (24.09.2026)
|
||
|
||
Die Zahl stand bisher nur an jeder einzelnen Zeile. Wer
|
||
morgens hereinkommt, will aber zuerst wissen, ob es
|
||
ÜBERHAUPT etwas gibt – und am Handy sieht man von der
|
||
Liste nur die ersten drei Zeilen.
|
||
|
||
Sie steht NUR da, wenn es etwas zu zählen gibt. Eine „0"
|
||
neben der Überschrift wäre jeden Tag im Weg für den einen
|
||
Tag, an dem sie etwas sagt. -->
|
||
<span class="chat__zaehler" id="liste-zaehler" hidden></span>
|
||
<!-- MEINE KACHEL (20.09.2026).
|
||
Filipe: "jeder account soll seine kachel personalisieren
|
||
koennen."
|
||
Der Knopf steht LINKS bei den Gespraechen und nicht rechts
|
||
im Verlauf: Es ist eine Einstellung ueber MICH, nicht ueber
|
||
dieses eine Gespraech. Rechts stehen ausserdem schon fuenf
|
||
Knoepfe, und ein sechster hat dort am Handy keinen Platz
|
||
mehr -- das war am 19.09. schon einmal der Fehler. -->
|
||
<button type="button" class="chat__kachelknopf" id="kachel-oeffnen"
|
||
aria-label="Meine Kachelfarbe wählen"
|
||
title="Meine Kachelfarbe">
|
||
<span class="chat__kachelknopf-probe" aria-hidden="true"></span>
|
||
</button>
|
||
<button type="button" class="knopf knopf--klein" id="neu-oeffnen">Neu</button>
|
||
</div>
|
||
|
||
<!-- Die Auswahl. Als <dialog>, wie die anderen Nachfragen im
|
||
Haus -- ein eigenes Aufklapp-Menue waere ein zweites Muster
|
||
fuer dieselbe Sache. -->
|
||
<dialog class="nachfrage chat-kachelwahl" id="kachel-wahl">
|
||
<h2 class="nachfrage__titel">Deine Kachel</h2>
|
||
<!-- DER SATZ WAR SEIT HEUTE FALSCH (25.09.2026).
|
||
|
||
„Alle Töne leuchten gleich stark" stimmte, solange es
|
||
360 Farben auf einer Leuchtdichte gab. Mit den sieben
|
||
Helligkeiten stimmt es nicht mehr – und ein Satz, der
|
||
etwas verspricht, was man daneben anders sieht, ist
|
||
schlimmer als keiner.
|
||
|
||
WAS WEITERHIN STIMMT UND WICHTIGER IST: Jede der 2520
|
||
Farben bleibt als Name auf der Blase lesbar. Das ist
|
||
nachgerechnet (pruef-chat-neu), und genau das sagt der
|
||
neue Satz. -->
|
||
<p class="nachfrage__text">
|
||
So sieht dein Name an deinen Nachrichten aus. Dreh am Ring
|
||
für den Farbton, tipp unten auf heller oder dunkler – in der
|
||
Mitte siehst du sofort, wie es aussieht. Jede der 2520
|
||
Farben bleibt lesbar, egal welche du nimmst.
|
||
</p>
|
||
|
||
<!-- ================================================================
|
||
DER FARBRING (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
|
||
auswählen kann?"
|
||
|
||
Der Ring wird aus 360 fertig gerechneten Farben gemalt, die
|
||
der Server schickt – nicht aus einem üblichen Farbkreis.
|
||
Der Unterschied ist der ganze Punkt: Ein gewöhnlicher
|
||
Farbkreis hat ein blendendes Gelb und ein fast schwarzes
|
||
Blau, und helle Schrift ist darauf mal gut und mal gar
|
||
nicht lesbar. Hier liegt jeder Winkel auf derselben
|
||
Leuchtdichte. Das sieht ruhiger aus – und es heißt, dass
|
||
man sich hier nicht unlesbar machen KANN.
|
||
|
||
role="slider" und nicht „radiogroup": Es ist ein
|
||
fortlaufender Wert mit 360 Stufen. Wer mit der Tastatur
|
||
kommt, dreht mit den Pfeiltasten. Eine Radiogruppe mit 360
|
||
Einträgen wäre für eine Sprachausgabe unbenutzbar. -->
|
||
<div class="kachelrad" id="kachelrad">
|
||
<div class="kachelrad__ring" id="kachelrad-ring" role="slider"
|
||
tabindex="0" aria-label="Farbton"
|
||
aria-valuemin="0" aria-valuemax="359" aria-valuenow="0">
|
||
<span class="kachelrad__arm" id="kachelrad-arm" aria-hidden="true">
|
||
<span class="kachelrad__griff"></span>
|
||
</span>
|
||
</div>
|
||
<!-- Die Mitte ist kein Schmuck, sondern die Antwort auf
|
||
„wie sieht das aus?" – eine echte Blase mit echter
|
||
Schrift, in der echten Farbe. -->
|
||
<div class="kachelrad__mitte" id="kachelrad-mitte" aria-hidden="true">
|
||
<span class="kachelrad__probe">Aa</span>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ================================================================
|
||
HELLER UND DUNKLER (25.09.2026)
|
||
|
||
Filipe: „dieser kreis muss viel perfekter sein. ich will
|
||
dass die leute auch heller und dunkler aussuchen koennen.
|
||
perfektionier das bitte viel krasser. viel
|
||
profissioneller. so dass die leute viel krassere
|
||
moeglichkeiten haben."
|
||
|
||
EIN ZWEITER SCHIEBER UND KEIN ZWEITER KREIS: Farbton und
|
||
Helligkeit sind zwei Achsen derselben Farbe. Ein Rad für
|
||
die eine, eine Leiste für die andere – so erkennt man auf
|
||
einen Blick, was rund läuft und was von dunkel nach hell.
|
||
|
||
`role="slider"` wie der Ring darüber: Es ist ein Wert mit
|
||
sieben Stufen, keine Auswahl aus sieben Dingen. Wer mit
|
||
der Tastatur kommt, benutzt dieselben Pfeiltasten.
|
||
|
||
DIE STUFEN BAUT DAS SKRIPT, nicht diese Datei: Wie viele
|
||
es gibt und wie stark sie mischen, steht in
|
||
chat-kreis-stufen.js und kommt vom Server. Feste Felder
|
||
hier wären eine zweite Wahrheit, die bei der nächsten
|
||
Messung falsch wird. -->
|
||
<div class="kachelhell" id="kachelhell">
|
||
<span class="kachelhell__schild" id="kachelhell-schild">Helligkeit</span>
|
||
<div class="kachelhell__leiter" id="kachelhell-leiter" role="slider"
|
||
tabindex="0" aria-labelledby="kachelhell-schild"
|
||
aria-valuemin="1" aria-valuemax="7" aria-valuenow="4"></div>
|
||
</div>
|
||
|
||
<!-- Was auf dem Ring nicht vorkommt: Grau hat keinen Farbton,
|
||
und Babyblau ist die eine helle Kachel mit eigener,
|
||
dunkler Schrift. Beide gehören weiter dazu. -->
|
||
<div class="chat-kachelwahl__gitter" id="kachel-gitter" role="group"
|
||
aria-label="Weitere Kachelfarben"></div>
|
||
<div class="nachfrage__knoepfe">
|
||
<button type="button" class="abmelden" id="kachel-zu">Fertig</button>
|
||
</div>
|
||
</dialog>
|
||
|
||
<!-- Suchen erst, wenn es etwas zu suchen gibt (chat.js blendet
|
||
es ab acht Gesprächen ein). Ein Suchfeld über drei Einträgen
|
||
ist Zierde. -->
|
||
<!-- ================================================================
|
||
DREI KATEGORIEN (25.09.2026)
|
||
|
||
Filipe: „ich will 3 kategorien haben. chats mit einzelnen
|
||
personen, gruppen chats und kanäle. ich will dass man diese
|
||
drei kategorien hat und in den jeweiligen kategorien halt
|
||
die richtigen chats."
|
||
|
||
SIE STEHEN GANZ OBEN, ueber dem Suchfeld: Man waehlt zuerst
|
||
das Fach und sucht dann darin -- nicht andersherum.
|
||
|
||
GEBAUT WIRD SIE VOM SKRIPT, nicht hier: An jeder Karte
|
||
haengt eine Zahl (wie viele Gespraeche) und ein Punkt (wie
|
||
viele ungelesen), und beides aendert sich mit jeder
|
||
Nachricht. Fest eingetragene Beschriftungen waeren beim
|
||
ersten Eintreffen falsch.
|
||
|
||
`role="tablist"` und nicht einfach drei Knoepfe: Wer mit der
|
||
Tastatur arbeitet, springt damit mit den Pfeiltasten
|
||
zwischen den Faechern statt mit sechs Tabulatorschritten. -->
|
||
<div class="chat-arten" id="chat-arten" role="tablist"
|
||
aria-label="Art der Gespräche"></div>
|
||
|
||
<div class="chat__suche" id="suche-zeile" hidden>
|
||
<input type="search" id="suche" placeholder="Name oder Gruppe …"
|
||
aria-label="Gespräche durchsuchen" autocomplete="off" />
|
||
</div>
|
||
|
||
<ul class="chat__liste" id="raeume" aria-live="polite"></ul>
|
||
|
||
<!-- ---------- Fundstellen in Nachrichten (09.09.2026, Punkt 15)
|
||
|
||
Das Suchfeld darueber durchsuchte bisher nur die NAMEN der
|
||
Gespraeche. Das ist die kleinere Haelfte: Was man wirklich
|
||
sucht, ist ein Satz, den jemand vor drei Wochen geschrieben
|
||
hat.
|
||
|
||
Die Fundstellen stehen UNTER der Gespraechsliste und nicht
|
||
an ihrer Stelle -- beides ist eine Antwort auf dieselbe
|
||
Eingabe, und wer nach "Patrick" sucht, will vielleicht das
|
||
Gespraech und vielleicht die Nachricht. Ein Umschalter
|
||
zwischen zwei Ansichten haette ihn zwingen wollen, das
|
||
vorher zu wissen. -->
|
||
<div class="chat-funde" id="funde" hidden>
|
||
<p class="chat-funde__schild" id="funde-schild">In Nachrichten</p>
|
||
<ul class="chat-funde__liste" id="funde-liste"></ul>
|
||
</div>
|
||
|
||
<p class="chat__leer" id="liste-leer" hidden>
|
||
Noch keine Gespräche. Mit <strong>Neu</strong> schreibst du der
|
||
ersten Person.
|
||
</p>
|
||
</section>
|
||
|
||
<!-- ---------- Rechts: der Verlauf ---------- -->
|
||
<section class="chat__spalte chat__spalte--verlauf" aria-labelledby="verlauf-titel">
|
||
|
||
<!-- Der Kopf trägt am Handy den Zurück-Weg zur Liste. -->
|
||
<div class="chat__kopf chat__kopf--verlauf">
|
||
<button type="button" class="chat__zurueck" id="zur-liste" aria-label="Zurück zu den Gesprächen">
|
||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M14.5 5.5 8 12l6.5 6.5" /></svg>
|
||
</button>
|
||
<!-- ================================================================
|
||
EIN GESICHT IM KOPF DES GESPRÄCHS (25.09.2026)
|
||
|
||
Filipe: „ich will dass du überhaupt die komplette kachel
|
||
veränderst, ich will dass alles anderst aussieht und
|
||
gestaltet ist … dass die ganze community und team morgen
|
||
total überrascht sind und den chat nicht wieder erkennen."
|
||
|
||
Im Kopf stand bisher nur ein Name. Links in der Liste
|
||
trägt jedes Gespräch sein Zeichen – Gesicht, Raute oder
|
||
Gruppenzahl –, und ausgerechnet beim Öffnen verschwand
|
||
es. Am Handy ist die Liste dann gar nicht mehr zu sehen:
|
||
Man sitzt in einem Gespräch und hat nur ein Wort davon.
|
||
|
||
ES IST DASSELBE ZEICHEN wie in der Liste, nicht ein
|
||
ähnliches: dieselbe Klasse, dieselben Rollenfarben,
|
||
dasselbe Profilbild – gefüllt von derselben Funktion
|
||
(`zeichenFuellen` in chat.js). Eine zweite Bauweise für
|
||
dieselbe Sache wäre die, die beim nächsten Umbau
|
||
vergessen wird.
|
||
|
||
`hidden`, solange kein Gespräch offen ist: Dann steht
|
||
rechts „Wähle ein Gespräch", und es gibt niemanden
|
||
abzubilden. -->
|
||
<span class="chat-raum__zeichen chat__kopf-zeichen" id="verlauf-zeichen"
|
||
hidden aria-hidden="true"></span>
|
||
<div class="chat__kopf-text">
|
||
<h2 class="chat__titel" id="verlauf-titel">Wähle ein Gespräch</h2>
|
||
<p class="chat__unter" id="verlauf-unter"></p>
|
||
</div>
|
||
<!-- GESPRÄCH WEGRÄUMEN (09.09.2026).
|
||
Filipe: "man muss die chats auch gelöscht bekommen!!!"
|
||
Es verschwindet nur bei DIR -- das Gegenüber behält seinen
|
||
Verlauf. Der Knopf steht erst da, wenn auch ein Gespräch
|
||
offen ist; sonst wäre er ein Angebot ohne Gegenstand. -->
|
||
<!-- WER IST IM KANAL (10.09.2026, Kapitel 7.2).
|
||
Steht nur in einem Kanal da und nur bei der Teamleitung --
|
||
der Server entscheidet das, nicht diese Datei. -->
|
||
<!-- EIN BEHAELTER STATT DREIMAL "margin-left: auto" (11.09.2026).
|
||
Jeder Knopf schob sich vorher selbst nach rechts. Bei zwei
|
||
sichtbaren teilen sich zwei auto-Raender den freien Platz
|
||
und reissen sie auseinander -- und welche sichtbar sind,
|
||
entscheidet der Server, nicht diese Datei. Der Behaelter
|
||
schiebt einmal, die Knoepfe stehen beieinander, egal wie
|
||
viele es sind. -->
|
||
<div class="chat__kopf-knoepfe">
|
||
<button type="button" class="chat__weg chat__leute" id="kanal-leute" hidden
|
||
aria-label="Wer ist in diesem Kanal?"
|
||
title="Wer ist in diesem Kanal?">
|
||
<svg viewBox="0 0 24 24" aria-hidden="true">
|
||
<circle cx="9" cy="8.5" r="3" />
|
||
<path d="M3.5 19c0-3 2.5-5 5.5-5s5.5 2 5.5 5" />
|
||
<path d="M16 6.2a3 3 0 0 1 0 5.6M17.5 14.4c2 .7 3.3 2.4 3.3 4.6" />
|
||
</svg>
|
||
</button>
|
||
<!-- AUFLOESEN — FUER ALLE (11.09.2026).
|
||
Filipe: "die person die ihn oeffnet soll auch das recht
|
||
haben das zu loeschen und so dass es dan fuer jeden
|
||
geloescht ist. aber nur die person die es gruendet."
|
||
|
||
Bewusst ein ANDERES Zeichen als der Knopf daneben und eine
|
||
eigene Warnfarbe: Zwei gleich aussehende Papierkoerbe
|
||
nebeneinander, von denen einer nur bei mir und einer bei
|
||
allen loescht, waeren eine Falle. Der Server entscheidet,
|
||
ob er ueberhaupt dasteht. -->
|
||
<button type="button" class="chat__weg chat__weg--ganz" id="raum-aufloesen" hidden
|
||
aria-label="Diese Gruppe für alle auflösen"
|
||
title="Für alle auflösen – endgültig">
|
||
<svg viewBox="0 0 24 24" aria-hidden="true">
|
||
<circle cx="12" cy="12" r="8.2" />
|
||
<path d="M7.2 7.2 16.8 16.8" />
|
||
</svg>
|
||
</button>
|
||
<button type="button" class="chat__weg" id="gespraech-weg" hidden
|
||
aria-label="Dieses Gespräch wegräumen"
|
||
title="Gespräch wegräumen – nur bei dir">
|
||
<svg viewBox="0 0 24 24" aria-hidden="true">
|
||
<path d="M5 7h14M10 7V5h4v2M6.5 7l.8 12h9.4l.8-12M10 10.5v5.5M14 10.5v5.5" />
|
||
</svg>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- aria-live="polite": Ein Vorleseprogramm sagt neue Nachrichten
|
||
an, ohne den Nutzer mitten im Satz zu unterbrechen. -->
|
||
<!-- ZUM NEUESTEN (09.09.2026). Vorher sprang der Verlauf bei jeder
|
||
neuen Nachricht ans Ende -- wer weiter oben nachlas, wurde
|
||
mitten im Satz weggerissen. Jetzt bleibt er stehen, und hier
|
||
steht, wie viel unten wartet. -->
|
||
<button type="button" class="chat__zum-neuesten" id="zum-neuesten" hidden></button>
|
||
<!-- HINEINZIEHEN (09.09.2026). Erscheint nur, solange wirklich
|
||
etwas über dem Fenster hängt. Eine dauerhaft sichtbare
|
||
Ablagefläche wäre jeden Tag im Weg für den Fall, dass man
|
||
sie vielleicht braucht. -->
|
||
<div class="chat__ablage" id="ablage" hidden aria-hidden="true">
|
||
<span>Loslassen – Foto oder PDF schicken</span>
|
||
</div>
|
||
<!-- ANGEHEFTETE ANKÜNDIGUNGEN (10.09.2026, Kapitel 7.2).
|
||
Sie stehen ÜBER dem Verlauf und rollen nicht mit: Eine
|
||
Ankündigung, die man erst suchen muss, ist keine. Leer bleibt
|
||
der Kasten verborgen – ein leerer Rahmen wäre jeden Tag im
|
||
Weg für den Fall, dass irgendwann etwas darin steht. -->
|
||
<div class="chat-pins" id="pins" hidden aria-label="Angeheftet"></div>
|
||
<div class="chat__verlauf" id="verlauf" role="log" aria-live="polite" aria-relevant="additions">
|
||
<!-- DER LEERE RAUM RECHTS (24.09.2026).
|
||
|
||
Vorher stand hier ein einzelner grauer Satz, oben links
|
||
in einer Fläche von tausend mal siebenhundert Pixeln. Das
|
||
sah nicht ruhig aus, sondern unfertig – als hätte die
|
||
Seite nicht zu Ende geladen.
|
||
|
||
Jetzt steht er in der Mitte, mit einem Zeichen darüber.
|
||
Der Satz bleibt Wort für Wort derselbe: Er sagt, was zu
|
||
tun ist, und das war nie das Problem. -->
|
||
<p class="chat__leer chat__leer--mitte" id="verlauf-leer">
|
||
<span class="chat__leer-zeichen" aria-hidden="true">
|
||
<svg viewBox="0 0 24 24">
|
||
<path d="M20 12a8 8 0 0 1-8 8H7l-3.2 2.4A.5.5 0 0 1 3 22v-4.6A8 8 0 1 1 20 12Z" />
|
||
<path d="M8.5 11.5h7M8.5 14.5h4" />
|
||
</svg>
|
||
</span>
|
||
<span class="chat__leer-text">Links ein Gespräch auswählen – oder mit <strong>Neu</strong> eines anfangen.</span>
|
||
</p>
|
||
</div>
|
||
|
||
<!-- Das Eingabefeld. Ein <form>, damit Enter abschickt, ohne
|
||
dass dafür Code nötig wäre. -->
|
||
<!-- DIE ANTWORTLEISTE (09.09.2026, Punkt 15).
|
||
|
||
Sie steht UEBER dem Eingabefeld und innerhalb desselben
|
||
<form>: So sieht man beim Tippen, worauf man antwortet, und
|
||
kann es mit einem Griff wieder loswerden. Eine Leiste
|
||
ausserhalb waere beim Tippen ausserhalb des Blickfelds.
|
||
|
||
`hidden` als Vorgabe -- sie erscheint erst, wenn wirklich
|
||
auf etwas geantwortet wird. Ein leerer Kasten ueber dem
|
||
Eingabefeld waere jeden Tag im Weg fuer den Fall, dass man
|
||
ihn vielleicht braucht. -->
|
||
<!-- ==================================================================
|
||
DIE NACHTRUHE DES TREFFS (19.09.2026)
|
||
|
||
Filipe: "nach mitternacht bis morgens 6 uhr keiner schreiben
|
||
kann damit auch die privatsphaere beruecksichtig wird ueber
|
||
nacht."
|
||
|
||
SIE STEHT UEBER DEM EINGABEFELD, nicht darunter und nicht in
|
||
einer Fusszeile: Wer schreiben will, sieht zuerst, ob er es
|
||
kann. Ein Hinweis unter dem Feld liest man erst, nachdem man
|
||
getippt hat -- und dann ist die Arbeit schon gemacht.
|
||
|
||
ZWEI ZUSTAENDE, und der zweite ist der wichtigere:
|
||
zu Der Chat schlaeft. Das Feld ist aus.
|
||
gleich Es sind noch weniger als 15 Minuten. Das Feld
|
||
bleibt an, aber man weiss Bescheid. Ohne diese
|
||
Vorwarnung waere die Nachtruhe ein Abbruch mitten
|
||
im Satz.
|
||
=============================================================== -->
|
||
<p class="chat__nachtruhe" id="nachtruhe" hidden role="status" aria-live="polite">
|
||
<span class="chat__nachtruhe-zeichen" aria-hidden="true">
|
||
<svg viewBox="0 0 24 24"><path d="M20 14.5A8.5 8.5 0 0 1 9.5 4 8.5 8.5 0 1 0 20 14.5z"/></svg>
|
||
</span>
|
||
<span class="chat__nachtruhe-text" id="nachtruhe-text"></span>
|
||
</p>
|
||
|
||
<!-- DER HOCHLADE-BALKEN (19.09.2026). Er steht UEBER der
|
||
Schreibleiste, nicht darunter: Am Handy sitzt die Leiste
|
||
direkt ueber der Tastatur, und alles darunter waere
|
||
verdeckt -- also genau dann unsichtbar, wenn man ihn
|
||
braucht. -->
|
||
<p class="hochlade" id="anhang-fortschritt" hidden></p>
|
||
<!-- DIE AUFNAHME LÄUFT (23.09.2026)
|
||
Über der Schreibzeile und nicht darunter -- aus demselben
|
||
Grund wie der Hochladebalken darüber: Am Handy sitzt die
|
||
Leiste direkt über der Tastatur, alles darunter wäre
|
||
verdeckt.
|
||
|
||
DIE ZEIT STEHT DA, GROß. Ohne sie weiß niemand, ob noch
|
||
aufgenommen wird — und man redet in eine Aufnahme, die
|
||
längst steht, oder hört auf, während sie läuft.
|
||
`aria-live` sagt sie auch dem vor, der nicht hinsieht;
|
||
bewusst nur alle fünf Sekunden (siehe chat.js), sonst
|
||
spricht das Vorleseprogramm im Sekundentakt. -->
|
||
<div class="tonleiste" id="tonleiste" hidden role="group"
|
||
aria-label="Sprachnachricht aufnehmen">
|
||
<span class="tonleiste__punkt" aria-hidden="true"></span>
|
||
<span class="tonleiste__zeit" id="ton-zeit">0:00</span>
|
||
<span class="tonleiste__wort" id="ton-wort" aria-live="polite">nimmt auf …</span>
|
||
<button type="button" class="tonleiste__weg" id="ton-weg"
|
||
aria-label="Aufnahme verwerfen" title="Verwerfen">✕</button>
|
||
<button type="button" class="tonleiste__senden" id="ton-senden"
|
||
aria-label="Sprachnachricht abschicken" title="Abschicken">✓</button>
|
||
</div>
|
||
<form class="chat__eingabe" id="schreiben" hidden>
|
||
<div class="antwort-leiste" id="antwort-leiste" hidden>
|
||
<span class="antwort-leiste__strich" aria-hidden="true"></span>
|
||
<span class="antwort-leiste__inhalt">
|
||
<span class="antwort-leiste__schild">Antwort an</span>
|
||
<span class="antwort-leiste__von" id="antwort-von"></span>
|
||
<span class="antwort-leiste__text" id="antwort-text"></span>
|
||
</span>
|
||
<button type="button" class="antwort-leiste__weg" id="antwort-weg"
|
||
aria-label="Antwort verwerfen">✕</button>
|
||
</div>
|
||
<label class="chat__eingabe-schild" for="text">Nachricht</label>
|
||
<!-- KURZER PLATZHALTER. Hier stand der Hinweis "Enter schickt,
|
||
Umschalt+Enter macht eine neue Zeile" -- zwei Fehler auf
|
||
einmal: Am Handy brach er auf zwei Zeilen um und schob das
|
||
Feld halb unter den Bildschirmrand, UND er stimmte dort
|
||
nicht: Auf Geräten ohne Tastatur schickt Enter absichtlich
|
||
nicht, sonst käme man nie zu einer zweiten Zeile.
|
||
Die Tastenbelegung steht jetzt im title -- sie ist ein
|
||
Hinweis für Wiederkehrer, keine Aufforderung. -->
|
||
<!-- ANHANG (09.09.2026): "pdfs und fotos".
|
||
Das Feld selbst bleibt unsichtbar -- ein Datei-Auswahlfeld
|
||
sieht in jedem Browser anders aus und lässt sich nicht
|
||
gestalten. Bedient wird es über die Büroklammer daneben. -->
|
||
<!-- DIE DREI WERKZEUGE SIND EINE GRUPPE (23.09.2026)
|
||
---------------------------------------------------------
|
||
Sie standen einzeln in der Zeile. Solange es zwei waren,
|
||
ging die Rechnung auf; seit heute Nacht sind es drei
|
||
(Büroklammer, Mikrofon, GIF), und gemessen auf 390 px
|
||
blieben dem Schreibfeld noch 130 Pixel — seine
|
||
Untergrenze. „Senden" rutschte allein auf eine eigene
|
||
Zeile darunter.
|
||
|
||
Das ist genau der Fehler vom 06.09.2026 in anderer
|
||
Gestalt: Damals kam ein sechstes Element in die
|
||
Kopfleiste, und ein Knopf landete über dem anderen.
|
||
|
||
ALS GRUPPE bricht die Zeile an der richtigen Stelle: Die
|
||
drei wandern GEMEINSAM nach oben, und Feld, Emoji und
|
||
Senden bleiben zusammen. Kommt morgen ein viertes
|
||
Werkzeug dazu, wächst die Gruppe — das Schreibfeld nicht
|
||
kleiner. Das ist der Unterschied zwischen einer Regel und
|
||
einer Zahl, die man beim nächsten Knopf neu suchen muss. -->
|
||
<div class="chat__werkzeuge">
|
||
<input type="file" id="anhang-feld" class="chat__anhang-feld"
|
||
accept="image/png,image/jpeg,image/webp,image/gif,application/pdf"
|
||
tabindex="-1" aria-hidden="true" />
|
||
<button type="button" class="chat__anhang" id="anhang-auf"
|
||
aria-label="Foto oder PDF anhängen" title="Foto oder PDF anhängen">
|
||
<svg viewBox="0 0 24 24" aria-hidden="true">
|
||
<path d="M20 11.5 12.3 19.2a4.4 4.4 0 0 1-6.2-6.2l7.9-7.9a2.9 2.9 0 0 1 4.1 4.1l-7.9 7.9a1.5 1.5 0 0 1-2.1-2.1l7.2-7.2" />
|
||
</svg>
|
||
</button>
|
||
<!-- SPRACHNACHRICHT (23.09.2026)
|
||
Filipe: „dan will ich auch dass man im chat auch
|
||
sprachnachrichten und gifts reinschicken kann. also nur die
|
||
modis rechte linke hand und dogfather."
|
||
|
||
ER STEHT VON HAUS AUS AUF `hidden`. Ob er erscheint, sagt
|
||
der Server mit `darf_ton` beim Öffnen eines Gesprächs --
|
||
hier steht keine Rolle. Ein Knopf, der da ist und dann
|
||
abgelehnt wird, ist schlimmer als keiner.
|
||
|
||
TIPPEN, NICHT HALTEN. Gedrückthalten ist der bekanntere
|
||
Weg, aber der schlechtere: Wer beim Sprechen den Finger
|
||
verrutscht, verliert die ganze Aufnahme, und mit einer
|
||
Hand am Lenker, am Kind oder am Kaffee hält niemand
|
||
neunzig Sekunden still. Einmal tippen startet, der
|
||
Häkchen-Knopf schickt, das Kreuz verwirft. -->
|
||
<button type="button" class="chat__ton" id="ton-auf" hidden
|
||
aria-label="Sprachnachricht aufnehmen" title="Sprachnachricht aufnehmen">
|
||
<svg viewBox="0 0 24 24" aria-hidden="true">
|
||
<path d="M12 3.5a2.6 2.6 0 0 1 2.6 2.6v5.4a2.6 2.6 0 0 1-5.2 0V6.1A2.6 2.6 0 0 1 12 3.5Z" />
|
||
<path d="M6.4 11a5.6 5.6 0 0 0 11.2 0M12 16.6V20M9.2 20h5.6" />
|
||
</svg>
|
||
</button>
|
||
<!-- DIE GIF-KISTE (23.09.2026)
|
||
Filipe: „dan will ich auch dass man im chat auch
|
||
sprachnachrichten und gifts reinschicken kann."
|
||
|
||
Ich lese „gifts" als GIFs und sage das ausdrücklich.
|
||
|
||
EIGENE KISTE STATT GIPHY: Ein fremder Anbieter bräuchte
|
||
einen Schlüssel, ein Konto und bekäme bei jedem
|
||
Tastendruck mit, wonach hier gesucht wird — aus einem
|
||
Arbeitsplatz heraus, in dem sonst nichts nach außen geht.
|
||
Was in dieser Kiste liegt, hat das Team selbst
|
||
hineingelegt.
|
||
|
||
Der Knopf steht von Haus aus auf `hidden`; ob er
|
||
erscheint, sagt der Server mit `darf_gif`. -->
|
||
<button type="button" class="chat__gif" id="gif-auf" hidden
|
||
aria-expanded="false" aria-controls="gif-tafel"
|
||
aria-label="GIF schicken" title="GIF schicken">GIF</button>
|
||
<input type="file" id="gif-feld" class="chat__anhang-feld"
|
||
accept="image/gif" tabindex="-1" aria-hidden="true" />
|
||
<!-- EMOJI-AUSWAHL (09.09.2026). Die Bildschirmtastatur am Handy
|
||
hat sie ohnehin -- am Rechner nicht, und dort schreibt die
|
||
Betreuung. Dreissig feste Zeichen statt einer nachgeladenen
|
||
Tafel: Das deckt den Alltag ab und lädt nichts.
|
||
|
||
STEHT SEIT DEM 23.09.2026 BEI DEN WERKZEUGEN. Vorher saß
|
||
er neben „Senden" — und auf dem Handy landeten damit
|
||
Emoji und Senden gemeinsam auf einer eigenen Zeile unten
|
||
links, weit weg vom Schreibfeld. Ein Emoji ist dasselbe
|
||
wie eine Büroklammer: etwas, das man in den Text
|
||
einfügt. Der Senden-Knopf ist das Gegenteil. -->
|
||
<button type="button" class="chat__emoji" id="emoji-auf"
|
||
aria-expanded="false" aria-controls="emoji-tafel"
|
||
aria-label="Emoji einfügen" title="Emoji einfügen">☺</button>
|
||
<!-- ================================================================
|
||
DIE SCHRIFTLEISTE KLAPPT AUF (25.09.2026)
|
||
|
||
Filipe: „die sachen von screen3 verbinde die mit dem auf
|
||
screen4. so dass wenn man drauf drückt man die anderen zu
|
||
sehen bekommt. damit es nicht zu viel platz nimmt."
|
||
|
||
F, K, U und S standen als eigene Zeile ÜBER dem
|
||
Schreibfeld – dauerhaft, auf jedem Gerät. Gemessen auf
|
||
412 px: Die Konsole brauchte dafür drei Reihen statt zwei,
|
||
also rund 60 px Höhe, jeden Tag, für vier Zeichen, die man
|
||
in den seltensten Nachrichten braucht.
|
||
|
||
ER STEHT ALS LETZTES WERKZEUG, direkt vor dem Schreibfeld:
|
||
Büroklammer, Mikrofon, GIF und Emoji fügen etwas EIN – das
|
||
hier verändert, was schon dasteht. Die Reihenfolge geht
|
||
damit von „dazu" nach „daran", und das Letzte ist das,
|
||
was dem Text am nächsten liegt.
|
||
|
||
„Aa" UND KEIN SYMBOL: Ein Stift heißt „bearbeiten", ein
|
||
Pinsel „malen". Für Fett und Kursiv gibt es seit jeher
|
||
genau ein Zeichen, das jeder liest, ohne es zu lernen.
|
||
|
||
`aria-expanded` UND `aria-controls` wie bei GIF und Emoji
|
||
daneben – derselbe Handgriff, dieselbe Ansage. -->
|
||
<button type="button" class="chat__schriftknopf" id="schrift-auf"
|
||
aria-expanded="false" aria-controls="schrift-leiste"
|
||
aria-label="Textgestaltung ein- und ausklappen"
|
||
title="Fett, kursiv, unterstrichen, durchgestrichen">Aa</button>
|
||
</div><!-- /chat__werkzeuge -->
|
||
<div class="gif-tafel" id="gif-tafel" hidden role="group"
|
||
aria-label="GIF aus der Kiste schicken">
|
||
<div class="gif-tafel__kopf">
|
||
<label class="gif-tafel__suchschild" for="gif-suche">Suchen</label>
|
||
<input type="search" id="gif-suche" class="gif-tafel__suche"
|
||
placeholder="Suchen …" autocomplete="off" />
|
||
<button type="button" class="gif-tafel__dazu" id="gif-dazu">
|
||
+ GIF hinzufügen
|
||
</button>
|
||
</div>
|
||
<div class="gif-tafel__gitter" id="gif-gitter"></div>
|
||
<p class="gif-tafel__leer" id="gif-leer" hidden>
|
||
Die Kiste ist noch leer. Leg das erste GIF hinein – alle aus dem
|
||
Team sehen es dann auch.
|
||
</p>
|
||
</div>
|
||
<!-- SCHREIBEN UND ABSCHICKEN GEHÖREN ZUSAMMEN (23.09.2026)
|
||
---------------------------------------------------------
|
||
Gemessen auf 390 px: Das Feld stand bei den Werkzeugen,
|
||
der Senden-Pfeil eine Zeile tiefer unten links. Man
|
||
schreibt rechts und drückt links unten — und der Knopf,
|
||
der die Nachricht wegschickt, war weiter vom Text
|
||
entfernt als die Büroklammer.
|
||
|
||
Als Gruppe bleiben Feld und Senden beieinander, egal wo
|
||
die Zeile umbricht, und das Feld bekommt die ganze
|
||
Restbreite statt eines Rests.
|
||
|
||
`flex-wrap: wrap` INNEN: Die Gestaltungsleiste (F K U S)
|
||
hängt sich beim Laden vor das Textfeld und wandert damit
|
||
in diese Gruppe. Ohne Umbruch würde sie sich hier in die
|
||
Zeile quetschen; mit ihm nimmt sie ihre eigene und alles
|
||
bleibt, wo es hingehört.
|
||
|
||
DIE TAFELN BLEIBEN DRAUSSEN (Emoji, Erwähnen, GIF): Sie
|
||
sind absolut gesetzt und brauchen `.chat__eingabe` als
|
||
Bezugspunkt. -->
|
||
<div class="chat__schreibzeile">
|
||
<textarea id="text" rows="1" maxlength="4000"
|
||
placeholder="Nachricht schreiben …"
|
||
title="Enter schickt ab, Umschalt+Enter macht eine neue Zeile, @ erwähnt jemanden"></textarea>
|
||
<!-- EMOJI-AUSWAHL (09.09.2026). Die Bildschirmtastatur am Handy
|
||
hat sie ohnehin -- am Rechner nicht, und dort schreibt die
|
||
Betreuung. Dreissig feste Zeichen statt einer nachgeladenen
|
||
Tafel: Das deckt den Alltag ab und laedt nichts. -->
|
||
<div class="emoji-tafel" id="emoji-tafel" role="group"
|
||
aria-label="Emoji auswählen" hidden></div>
|
||
<!-- WER IST GEMEINT? (20.09.2026)
|
||
Erscheint beim Tippen von "@" und zeigt die Leute DIESES
|
||
Gesprächs. Sie steht hier im Formular und nicht am
|
||
Seitenende, weil sie sich über der Schreibzeile öffnet --
|
||
ein absolut gesetzter Kasten braucht seinen Bezugspunkt in
|
||
der Nähe, sonst wandert er bei jedem Umbruch woanders hin.
|
||
`role=listbox` und `aria-activedescendant` am Textfeld:
|
||
Ein Vorleseprogramm sagt dann beim Blättern den Namen an,
|
||
statt nur "Bearbeitungsfeld". -->
|
||
<div class="erwaehn-liste" id="erwaehn-liste" role="listbox"
|
||
aria-label="Person erwähnen" hidden></div>
|
||
<!-- Erscheint erst, wenn es eng wird -- siehe chat.js. -->
|
||
<span class="chat__zeichen" id="zeichen" aria-live="polite" hidden></span>
|
||
<button type="submit" class="chat__senden" id="senden" aria-label="Abschicken">
|
||
<svg viewBox="0 0 24 24" aria-hidden="true">
|
||
<path d="M4 12l16-7-7 16-2.5-6.5z" />
|
||
</svg>
|
||
</button>
|
||
</div><!-- /chat__schreibzeile -->
|
||
</form>
|
||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||
</section>
|
||
</div>
|
||
</main>
|
||
|
||
<!-- Neues Gespräch. Beides in einem Dialog: Wer eine Person anklickt,
|
||
schreibt ihr; wer mehrere anhakt, legt eine Gruppe an. Zwei
|
||
getrennte Dialoge hätten die Frage "Einzeln oder Gruppe?" VOR die
|
||
eigentliche Absicht gestellt. -->
|
||
<dialog class="dialog" id="neu-dialog">
|
||
<form method="dialog" id="neu-form" class="neu neu--blank">
|
||
<h2 class="dialog__titel" id="neu-titel">Neues Gespräch</h2>
|
||
<p class="dialog__unter" id="neu-unter">
|
||
Eine Person antippen, um ihr zu schreiben. Mehrere auswählen ergibt
|
||
eine Gruppe.
|
||
</p>
|
||
|
||
<!-- ZWEI ARTEN, EIN DIALOG (10.09.2026, Kapitel 7.2).
|
||
Ein zweiter Dialog wäre dieselbe Personenwahl ein zweites Mal –
|
||
und die zweite Fassung wäre die, in der eine Regel fehlt.
|
||
Sichtbar nur, wenn der Server sagt, dass Kanäle erlaubt sind. -->
|
||
<div class="neu__art" id="neu-art" role="group" aria-label="Was soll es werden?" hidden>
|
||
<button type="button" data-art="gespraech" data-an="ja" aria-pressed="true">Gespräch</button>
|
||
<button type="button" data-art="kanal" aria-pressed="false">Kanal</button>
|
||
</div>
|
||
|
||
<!-- WAS IST DER UNTERSCHIED? (11.09.2026)
|
||
Filipe: "ich will eine bessere erklärung dafür bitte."
|
||
|
||
Der Umschalter stand da, und daneben stand ein Satz über das
|
||
ANTIPPEN von Personen -- also über den nächsten Schritt, nicht
|
||
über die Wahl, die gerade ansteht. Wer die beiden Wörter zum
|
||
ersten Mal sieht, erfährt nirgends, was sie bedeuten.
|
||
|
||
Der Unterschied ist nicht "wenige/viele Leute", sondern WONACH
|
||
der Raum benannt ist: ein Gespräch nach den Menschen darin, ein
|
||
Kanal nach einem Thema. Daran hängt alles Weitere -- dass es
|
||
einen Kanal je Zuständigkeit nur EINMAL gibt, dass sein Name
|
||
festliegt, und dass Leute darin wechseln können, ohne dass der
|
||
Raum ein anderer wird. Genau das steht hier.
|
||
|
||
Steht nur da, wenn auch der Umschalter dasteht. -->
|
||
<div class="neu__erklaerung" id="neu-erklaerung" hidden>
|
||
<p><strong>Gespräch</strong> – du wählst die <em>Leute</em>. Eine Person:
|
||
ihr beide. Mehrere: eine Gruppe mit eigenem Namen.</p>
|
||
<p><strong>Kanal</strong> – du wählst ein <em>Thema</em>. Eine Zuständigkeit,
|
||
ein fester Raum, den es genau einmal gibt. Sein Name kommt aus der
|
||
Zuständigkeit, die Teamleitung ist immer dabei, und wer sonst noch
|
||
dazugehört, lässt sich später ändern.</p>
|
||
</div>
|
||
|
||
<div class="neu__zeile" id="kanal-zeile" hidden>
|
||
<label class="feld-schild" for="kanal-kategorie">Zuständigkeit</label>
|
||
<select id="kanal-kategorie"></select>
|
||
<p class="neu__hinweis" id="kanal-alle" hidden>
|
||
Für jede Zuständigkeit gibt es schon einen Kanal.
|
||
</p>
|
||
</div>
|
||
|
||
<div class="chat-wahl" id="partner"></div>
|
||
|
||
<!-- Erscheint erst ab zwei Ausgewählten -- vorher wäre ein
|
||
Gruppenname eine Frage ohne Anlass. -->
|
||
<div class="neu__zeile" id="gruppenname-zeile" hidden>
|
||
<label class="feld-schild" for="gruppenname">Name der Gruppe</label>
|
||
<input id="gruppenname" maxlength="80" placeholder="z. B. Luna & Betreuung" />
|
||
</div>
|
||
|
||
<p class="fehler" id="neu-fehler" role="alert" aria-live="polite"></p>
|
||
|
||
<div class="dialog__knoepfe">
|
||
<button type="submit" class="knopf knopf--klein" id="neu-los" disabled>Schreiben</button>
|
||
<button type="button" class="abmelden" id="neu-zu">Abbrechen</button>
|
||
</div>
|
||
</form>
|
||
</dialog>
|
||
|
||
<script src="assets/js/bereiche.js?v=202609261240"></script>
|
||
<!-- TEXTFORM VOR ALLEM ANDEREN (21.09.2026): chat.js und bereich.js
|
||
fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter,
|
||
waere die erste gezeichnete Nachricht ohne Gestaltung -- und das
|
||
faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie
|
||
wirklich vor den anderen dasteht. -->
|
||
<script src="assets/js/textform.js?v=202609261240"></script>
|
||
<script src="assets/js/meldung.js?v=202609261240" defer></script>
|
||
<script src="assets/js/hochladen.js?v=202609261240" defer></script>
|
||
<script src="assets/js/nachfrage.js?v=202609261240" defer></script>
|
||
<script src="assets/js/wahl.js?v=202609261240" defer></script>
|
||
<script src="assets/js/kopf.js?v=202609261240"></script>
|
||
<script src="assets/js/glocke.js?v=202609261240"></script>
|
||
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
|
||
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
|
||
Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
|
||
die Knoepfe fehlten, und niemand wuesste warum. -->
|
||
<script src="assets/js/anruf.js?v=202609261240"></script>
|
||
<!-- DIE BILDSCHAU (25.09.2026). Eigene Datei, weil sie nichts vom
|
||
Chat weiss: Sie bekommt einen Weg und einen Namen und zeigt ein
|
||
Bild. Jede andere Seite mit Fotos kann sie ebenso benutzen, ohne
|
||
dass etwas doppelt gebaut wird.
|
||
|
||
VOR chat.js und ohne `defer`: chat.js haengt den Klick an und
|
||
fragt dabei `window.Bildschau`. Kaeme die Schau spaeter, waere
|
||
sie beim ersten Foto noch nicht da -- und der erste Klick ginge
|
||
wie frueher in den Tab. Ein Fehler, der nur beim ERSTEN Mal
|
||
auftritt, ist der, den man nie nachstellen kann. -->
|
||
<script src="assets/js/bildschau.js?v=202609261240"></script>
|
||
<script src="assets/js/chat.js?v=202609261240"></script>
|
||
<script src="assets/js/installieren.js?v=202609261240" defer></script>
|
||
</body>
|
||
</html>
|