Files
dogfather-universe/workspace/chat.html
T
DogFatherGitandClaude Opus 5 b1810ddbc5 screen6: Die beiden Bestaetigungen werden zu Unterschriften
Filipe, mit Bildschirmfoto der beiden Felder: "die sollen geiler sein."

WAS SIE WIRKLICH SIND, stand nur im Klassennamen. Auf einer
Unterweisung bestaetigen ZWEI Personen, dass sie sie durchgegangen
sind -- der Creator und seine Betreuung. Das ist kein Statusfeld, das
ist eine Gegenzeichnung. Gezeichnet waren sie als zwei graue Kaesten
mit runden Ecken, die man auf dem dunklen Grund kaum sah. Zwei
Rechtecke sagen "hier steht etwas". Eine Unterschriftszeile sagt "hier
fehlt jemand".

ZWEI ZUSTAENDE, ZWEI BILDER -- und beide gab es im Code laengst als
`data-da="ja"/"nein"`, nur unterschieden sie sich um einen Hauch Gruen:

  OFFEN   eine gestrichelte Linie mit einem leeren Platz darauf. Sie
          WARTET sichtbar. Der Federstrich links deutet an, wo man
          ansetzt.
  DA      eine durchgezogene gruene Linie, der Name darueber, und ein
          gepraegtes Siegel mit Haken -- wie ein abgestempeltes
          Formular.

GLEICHE HOEHE IN BEIDEN ZUSTAENDEN, und das ist keine Kosmetik: Die
Felder stehen nebeneinander in einem Raster. Waere das unterschriebene
hoeher, spraenge die Karte in dem Moment, in dem jemand unterschreibt
-- unter dem Finger dessen, der gerade gedrueckt hat.

KEINE ZWEITE FASE. Die Karte drumherum steht schon in der Modulliste.
Eine abgeschraegte Ecke IN einer abgeschraegten Ecke liest sich als
Fehler, nicht als Absicht. Das Feld traegt deshalb die andere
Formensprache des Hauses: die Linie.

DER HAKEN IST EINE MASKE, kein Zeichensatz-Haken (der sieht in jeder
Schrift anders aus und faellt weg, wenn eine fehlt) und kein Bild
(eine Datei mehr fuer fuenfzehn Pixel). Erst stand er nur im
Kommentar, waehrend im Code eine leere Muenze lag -- nachgebaut, bevor
es committet wurde. Ein Kommentar, der mehr behauptet als der Code
tut, ist schlimmer als keiner.

ZWEI ANSICHTEN NACHGEMESSEN: Auf 1400 px nebeneinander, auf 390 px
untereinander. Das Siegel sass im ersten Anlauf mit
`translate(100%)` AUSSERHALB des Feldes -- breit sah das gut aus,
schmal waere es aus der Karte gelaufen. Jetzt sitzt es innen; die
Seite laesst sich bei 390 px nicht seitlich schieben.

(Fuer die Ansicht musste ich Testdaten anlegen -- ohne Unterweisung
gibt es keine Unterschriften, und ein Bildschirmfoto von einem leeren
Bereich beweist nichts. Die Daten liegen in der Wegwerf-Datenbank der
Pruefung, nicht im echten System.)

Geprueft: pruef-schulung, pruef-css-klassen -- beide in Ordnung.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-09 01:01:13 +02:00

170 lines
7.6 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" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609090101" />
<link rel="stylesheet" href="assets/css/start.css?v=202609090101" />
<!-- 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=202609090101" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609090101" />
<link rel="stylesheet" href="assets/css/module.css?v=202609090101" />
</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&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>
<button type="button" class="knopf knopf--klein" id="neu-oeffnen">Neu</button>
</div>
<!-- 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. -->
<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>
<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>
<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>
</div>
<!-- aria-live="polite": Ein Vorleseprogramm sagt neue Nachrichten
an, ohne den Nutzer mitten im Satz zu unterbrechen. -->
<div class="chat__verlauf" id="verlauf" role="log" aria-live="polite" aria-relevant="additions">
<p class="chat__leer" id="verlauf-leer">
Links ein Gespräch auswählen – oder mit <strong>Neu</strong> eines anfangen.
</p>
</div>
<!-- Das Eingabefeld. Ein <form>, damit Enter abschickt, ohne
dass dafür Code nötig wäre. -->
<form class="chat__eingabe" id="schreiben" hidden>
<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. -->
<textarea id="text" rows="1" maxlength="4000"
placeholder="Nachricht schreiben …"
title="Enter schickt ab, Umschalt+Enter macht eine neue Zeile"></textarea>
<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>
</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">Neues Gespräch</h2>
<p class="dialog__unter">
Eine Person antippen, um ihr zu schreiben. Mehrere auswählen ergibt
eine Gruppe.
</p>
<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=202609090101"></script>
<script src="assets/js/wahl.js?v=202609090101" defer></script>
<script src="assets/js/kopf.js?v=202609090101"></script>
<script src="assets/js/glocke.js?v=202609090101"></script>
<script src="assets/js/chat.js?v=202609090101"></script>
</body>
</html>