Files
dogfather-universe/workspace/chat.html
T
DogFatherGitandClaude Opus 5 0d52c4dc05 Das Regie-Tor: jeder sieht es, nur die zwei kommen rein -- und Farbe für die Reihen
Filipe, zum Bildschirmfoto des Foyers: „unter den [Reihen] fehlt eine
kachel, die viel kraesser und spezieller aussehen soll, wo nur
dogfather oder vanvan reinkommen. mit ihren zugangscodes für die seite.
und das soll die regie kachel sein. die muss wirklich ultra krass sein.
komplett crazy. die anderen kacheln aber auch gerne farbiger machen und
nicht so kaal und dunkel."

Auf die Rückfrage, wie fest das Schloss sein soll: „punkt 2 aber die
soll jeder sehen aber nur vanvan und dogfather sollen da rein kommen
bitte."

Haus: Team Dogi (crew.dogfather-universe.com). Die Agentur ist nicht
berührt -- pruef-haus-trennung 107/0.

DAS TOR

Eine vierte Kachel über die GANZE BREITE unter den drei Reihen. Das ist
die stärkste Aussage, die ein Raster treffen kann, und sie kostet keine
einzige Farbe. Ein Licht läuft in sieben Sekunden darüber -- flach und
schmal, wie der Schein einer Lampe über einem Mischpult. Kein Blinken:
dasselbe Signal mit doppelter Belastung für die Augen, und diese Seite
steht manchmal eine Stunde offen. prefers-reduced-motion bekommt den
Schein stehend, nicht gar keinen -- der Zustand muss auch dann zu
erkennen sein.

Drei Zustände, und jeder sieht anders aus: verschlossen rot mit
geschlossenem Bügel, aufgeschlossen grün mit aufspringendem Bügel, und
für alle anderen gedämpftes Grau ohne Lauflicht, mit „nicht erlaubt"
schon am Mauszeiger.

ZWEI SCHLÖSSER HINTEREINANDER, UND NUR EINES IST GEHEIM

(1) DIE ROLLE, und zwar VOR dem Code -- ohne ihn anzusehen. Das ist
    wichtiger, als es aussieht: Sonst könnte irgendwer im Haus mit
    Rateversuchen die `versuche`-Bremse für seine eigene IP vollaufen
    lassen und sich damit von der ANMELDUNG aussperren; beide zählen in
    derselben Tabelle. Geprüft mit Gegenprobe: Ein Gast schickt den
    RICHTIGEN Admin-Code, kommt nicht durch, und die Versuchszahl
    bleibt bei 0.
(2) DER CODE, geprüft mit `codeGeprueft()` -- neu in workspace.js,
    neben der Anmeldung und mit deren Rechenvorschrift, deren Vergleich
    in konstanter Zeit und deren Bremse. Ein zweiter Codevergleich in
    einem anderen Modul wäre der, der beim nächsten Umbau der
    scrypt-Parameter stehen bleibt.

Und er prüft GENAU DIESE PERSON. Die Anmeldung geht alle Personen einer
Rolle durch -- dort ist der Code die Kennung. Hier wäre das falsch:
VanVans Code öffnete DogFathers Tür, und im Protokoll stünde, ER sei
hineingegangen.

WAS DIE TÜR LEISTET UND WAS NICHT -- UND DASS ES DASTEHT

Filipes „Punkt 2" heißt: Der Code öffnet die Tür, danach ist die Regie
offen wie bisher. Die Routen der Sendung prüfen weiterhin nur die Rolle.
Das ist die bewusste Wahl und keine vergessene Stelle -- eine Sperre,
die mitten in einer Übertragung zuschnappen kann, richtet mehr Schaden
an, als sie verhindert.

Damit das niemand überschätzt, steht es als Satz IM FENSTER, nicht nur
im Quelltext: „Das hält einen neugierigen Blick auf, nicht jemanden, der
an deinem offenen Rechner sitzt." Eine Sicherung, die stärker aussieht,
als sie ist, ist schlechter als gar keine.

FARBE -- ABER NICHT AUF DER FLÄCHE

Filipe hatte recht, und der Grund war meiner: Beim Umbau auf das
Hausmaterial heute Vormittag habe ich die Farbe mit herausgenommen, weil
die alte Fassung sie auf der FLÄCHE trug -- und genau das machte den
Text schlecht lesbar. Richtig ist nicht „keine Farbe", sondern Farbe,
wo kein Text steht:

  * Jede Reihe hat ihren Ton (`--ton`, derselbe Griff, über den
    module.css das Kantenlicht legt): Bernstein für das, was ansteht
    -- dieselbe Farbe wie „überfällig" --, Blau für die Sendung, rot
    sobald sie läuft, Grün für das, was hereinkommt: dieselbe Farbe,
    die ein angenommener Vorschlag trägt. Die Farben SAGEN etwas.
  * Ein Band im Kopf jeder Tafel, die Überschrift in ihrem Ton, die
    Schilder passend. Vorher war jedes Schild blau, egal in welcher
    Reihe es stand -- zwei Farben nebeneinander, die nichts
    voneinander wussten.
  * Ein Streifen am Zeilenanfang statt eines eingefärbten Kastens.
    Drei Pixel an der Kante sagen dasselbe, und der Text steht
    weiterhin auf dem Grund, auf dem er gemessen wurde.

Die Kachel selbst trägt dieselbe Silhouette und dasselbe deckende
Material wie jede Karte im Haus (`.regie-tor` steht in der Modulliste in
module.css und in der Materialliste in start.css). „Krass" heißt hier
nicht „anders als das Haus" -- genau das stand heute Vormittag schon
einmal in foyer.css und war ein Fehler.

PROTOKOLLWÖRTER, DIE MAN LESEN KANN

`personen.js` baut den Anzeigetext aus dem Schlüssel: Unterstriche
werden Leerzeichen, nur der erste Buchstabe wird groß. Aus
`regie_code_falsch` wäre auf dem Bildschirm „Regie code falsch"
geworden. Die Regel, die daraus folgt: Hauptwort plus Mittelwort, nie
zwei Hauptwörter. Jetzt `regie_aufgeschlossen`, `regie_abgeschlossen`,
`regie_verweigert`, `regie_unbefugt`. Und das Detail war ein
ISO-Zeitstempel mitten in einer Zeile, die ein Mensch überfliegt --
jetzt steht dort „12 Stunden".

GEMESSEN

  pruef-reaktion          571, 0 Fehler (vorher 538) -- Abschnitt 21
  mess-foyer               96, 0 Fehler (vorher 70), 12 Bildschirmfotos
  pruef-handy-teamdogi    263 Seitenaufrufe, 0 Befunde
  pruef-breiten            23 auf 45 Seiten und fünf Breiten
  pruef-struktur          102 · pruef-css-klassen 37 · pruef-lesbarkeit 14
  pruef-bewegung            9 · pruef-tippziele 13 · pruef-deutsche-texte 12
  pruef-crew-adresse      173 · pruef-haus-trennung 107
  pruef-community-sicht    10 · pruef-sackgassen 14
  alle 0 Fehler

UND EINE LÜCKE, DIE DIE EIGENE MESSUNG GEFUNDEN HAT

Der Vorhang mit dem Codefeld schließt auf Esc und auf einen Druck
daneben, und der Finger steht im Feld -- für jemanden ohne Maus war er
trotzdem eine Falle: Die Tabulatortaste lief durch die Knöpfe DAHINTER
weiter, sichtbar war aber das Codefeld. Man tippt auf A und bekommt B,
nur eben mit der Tastatur.

Der erste Riegel legte `#foyer` still -- und die neue Messung fiel
sofort darüber: Die KOPFLEISTE steht außerhalb davon, der Fokus lief
weiter nach „Abmelden". Jetzt wird alles neben dem Vorhang stillgelegt,
ABGELEITET statt aufgezählt (`body.children`), und beim Schließen genau
das wieder freigegeben, was ich selbst gesetzt habe.

Und die Messung selbst war beim ersten Entwurf zu streng: Sie verlangte
„der Fokus bleibt IMMER im Fenster" und wurde rot, obwohl die Sperre
tadellos arbeitete -- am Ende des Tabulatorkreises gibt der Browser den
Fokus an seine eigene Leiste ab, im Dokument steht dann `body`. `body`
ist kein Bedienelement. Gefragt ist jetzt das Richtige: Wird je ein
BEDIENELEMENT außerhalb erreicht? Die Gegenprobe nennt es beim Namen
(`DRAUSSEN:zurueck`).

mess-foyer misst beide Hälften von Filipes Satz: dass ein Gast das Tor
SIEHT (und ein Druck ihm trotzdem kein Codefeld öffnet) und dass nur die
zwei HINEINKOMMEN. Dazu der ganze Weg im Browser: falscher Code
abgewiesen und Feld geleert, richtiger Code führt in den Saal, die
Freigabe gilt in einem neuen Fenster -- und VanVans Tür ist trotzdem
noch zu.

EIN FEHLALARM IN DER EIGENEN MESSUNG, BEHOBEN

mess-foyer suchte zuerst das WORT „Warteschlange" im Dokument eines
Gastes und fand es -- im unsichtbaren Gerüst der linken Reihe, wo es als
Überschrift steht. Zwei Gründe, warum das falsch war: Eine Beschriftung
ist keine Auskunft, und dass es eine Warteschlange GIBT, steht seit
heute im Regie-Tor, das jeder sieht. Eine Messung, die genau das als
Leck zählt, widerspricht dem Entwurf -- und sie hätte bei jedem Lauf
angeschlagen. Gefragt ist das Schärfere: Kommen DATEN an? Jetzt werden
Titel und Videokennungen geprüft, und dass keine einzige Planzeile
gebaut wurde.

NICHT BEHOBEN, WEIL NICHT MEINS: pruef-meldungen bleibt rot (28
Kennungen ohne Satz, 3 Rohanzeigen) -- gemessen im worktree auf dem
letzten Commit schon vorher, Zeichen für Zeichen dieselbe Liste. Meine
Arbeit hat 2 Kennungen und 2 Sätze ergänzt (174 -> 176, 155 -> 157), die
Zahlen gehen genau gleich hoch. Die Dateien gehören überwiegend der
Agentur; das gehört in einen eigenen Durchgang.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-10-08 12:13:22 +02:00

780 lines
41 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/chat.css?v=202610081212" />
<!-- Die Bildschau stand bis zum 07.10.2026 in chat.css. Sie wird jetzt
auch vom Event-Banner benutzt (bereich.html) und hat deshalb eine
eigene Datei. Sie steht GENAU HIER -- direkt hinter chat.css, also
an derselben Stelle im Ladeweg wie der Block vorher. -->
<link rel="stylesheet" href="assets/css/bildschau.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<!-- 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=202610081212" />
</head>
<body class="start" data-buehne="lounge">
<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&nbsp;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">&#10005;</button>
<button type="button" class="tonleiste__senden" id="ton-senden"
aria-label="Sprachnachricht abschicken" title="Abschicken">&#10003;</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">&#10005;</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 &amp; 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=202610081212"></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=202610081212"></script>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/hochladen.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212"></script>
<script src="assets/js/glocke.js?v=202610081212"></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=202610081212"></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=202610081212"></script>
<script src="assets/js/chat.js?v=202610081212"></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
</body>
</html>