diff --git a/CHANGELOG.md b/CHANGELOG.md index 8467ef8..eadec1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,53 @@ # Änderungen +## V1 — Release Candidate 7, 18. August 2026 + +Behebt einen Absturz, macht die Sitzung brauchbar und stellt das Aussehen um. + +### Behoben + +- **`/retention` zeigte einen schwarzen Bildschirm.** `GET /retention-policies` + liefert ein Objekt `{policies, predefined}` — als einziger von zehn geprüften + Listenendpunkten. Die Oberfläche behandelte es als Array; `map` gibt es auf + einem Objekt nicht, React hängte den ganzen Baum aus. Der Regressionstest + füttert jetzt die **echte** Antwortform; ein Test mit einem Array hätte den + Fehler nie gefunden, und genau das war passiert. +- **Jedes Neuladen führte zurück zur Anmeldung.** Die Tokens lagen nur im + Arbeitsspeicher. +- **Ein Fehler in einer Komponente schwärzte die ganze Konsole.** Jetzt sitzt + eine Fehlergrenze um den Seiteninhalt: Menü und Kopfzeile bleiben stehen, der + Fehlertext ist lesbar und kopierbar. + +### Sitzung + +Sie überlebt ein Neuladen und endet nach **30 Minuten** — gerechnet als frühere +von zwei Grenzen: einer harten Obergrenze ab Anmeldung, die keine Interaktion +verschiebt, und einer Untätigkeitsgrenze. Die verbleibende Zeit läuft neben +„Abmelden" und wird unter fünf Minuten auffällig. + +Sechs Tests halten die Grenzen fest, zwei davon durch Mutation als fangend +bestätigt: Wer beim Vermerken einer Interaktion die Obergrenze mitverschiebt, +macht aus „30 Minuten" ein „unbegrenzt, solange die Maus wackelt". + +### Aussehen + +Farben, Radien, Schatten und Schrift aus dem Preset `b5vnF8SMi`: violett als +Handlungsfarbe, Radius 0, schattenlos, durchgehend Geist Mono. Die +**Statusfarben bleiben** — das Preset kennt keine, und ohne sie ließe sich ein +Teilfehler nicht von einem Erfolg unterscheiden. + +Dazu **Umlaute auf allen Seiten** (vorher durchgehend ae/oe/ue/ss), **33 +Erläuterungen von Absätzen auf einen Satz gekürzt** und neue Module: acht +Schnellzugriffe auf der Übersicht sowie sechs mitgelieferte +Aufbewahrungsvorlagen als Kacheln — die lieferte der Server schon immer mit, +die Oberfläche warf sie bisher weg. + +### Unverändert offen + +Windows-Dienst, systemd-Einheit des Agenten und der Proxmox-Bootmeilenstein sind +gebaut, aber nie auf echter Hardware gefahren. Geist Mono wird nicht +mitgeliefert; ohne die Schrift auf dem Gerät greift die System-Monospace. + ## V1 — Release Candidate 6, 18. August 2026 **Die Weboberfläche ist eine vollständige Verwaltungskonsole geworden.** diff --git a/docs/web-ui.md b/docs/web-ui.md index 2869399..d879f57 100644 --- a/docs/web-ui.md +++ b/docs/web-ui.md @@ -117,12 +117,42 @@ API-Token eines Proxmox-Verbunds wird nach dem Anlegen nie wieder ausgeliefert das ist kein Mangel, sondern der Grund, warum ein Lesezugriff auf die Konfiguration ungefährlich ist. +## Aussehen + +Farben, Radien, Schatten und Schrift stammen aus dem Preset `b5vnF8SMi` +(tweakcn): violett als Handlungsfarbe, **Radius 0**, schattenlos, durchgehend +Geist Mono. Kantig und ruhig. + +Drei Abweichungen, begründet in `styles/theme.css`: + +- **Die Statusfarben bleiben.** Das Preset kennt nur `destructive` und fünf + Diagrammfarben; §106 verlangt fünf Bedeutungen. Ohne sie ließe sich ein + Teilfehler nicht von einem Erfolg unterscheiden. +- **Das dunkle Thema hängt an `[data-theme='dark']`**, nicht an `.dark` — der + Umschalter setzt dieses Attribut. `.dark` funktioniert zusätzlich. +- **Geist Mono lädt nicht nach.** Sie steht zuerst im Stapel; liegt sie nicht + auf dem Gerät, greift die System-Monospace. Eine Schrift von einem fremden + Host zu holen verbietet die CSP — und ein Backup-Server, der für seine + Oberfläche ins Internet greift, wäre auch ohne CSP falsch. + +Eine Zuordnung ist die Stolperstelle: In shadcn ist `accent` die dezente +Hover-Fläche und `primary` die Farbe der Handlung. Sie zu verwechseln macht jede +Schaltfläche grau. + +Die Benennung bleibt semantisch (`--surface-card`, `--text-primary`) statt +shadcn-typisch: Die Zuordnung steht an genau einer Stelle, und ein Wechsel des +Presets fasst keine einzige Komponente an. + ## Technik - **Tailwind v4 und Radix-Primitive** nach shadcn-Muster. Alles gebündelt; die CSP der Auslieferung lässt externe Ressourcen ohnehin nicht zu. - **Farben als CSS-Variablen**, damit dieselbe Komponente in beiden Themen funktioniert, ohne dass jede Klasse eine `dark:`-Variante braucht. +- **Fehlergrenze um den Seiteninhalt.** Ohne sie reißt ein Fehler in einer + Komponente den gesamten Baum ab; übrig bleibt eine leere Seite — im dunklen + Thema ein schwarzer Bildschirm ohne Hinweis. Menü und Kopfzeile bleiben + stehen, der Fehlertext ist lesbar. - **Dark Mode über ein Attribut am Wurzelelement**, nicht allein über die Medienabfrage: Eine Konsole, die nachts während einer Störung von selbst umschaltet, ist lästig. Das Attribut sitzt am Wurzelelement, weil ein Dialog im @@ -138,6 +168,27 @@ Konfiguration ungefährlich ist. Fehlercode. Sie kennt den Einzelfall, und diese Genauigkeit ist mehr wert. - **Berechtigungen im Menü sind Anzeige, keine Sicherung.** Sie verhindern Sackgassen; geprüft wird auf dem Server. + +### Sitzung + +Sie überlebt ein Neuladen. Die Tokens liegen im `sessionStorage` des Tabs — +nicht im `localStorage`, der ein Schließen des Browsers überstünde. Begrenzt +wird sie durch zwei Uhren: + +| | | +| --- | --- | +| **Harte Obergrenze** | 30 Minuten ab Anmeldung, durch keine Interaktion verschiebbar | +| **Untätigkeitsgrenze** | 30 Minuten ohne Eingabe | + +Maßgeblich ist die frühere der beiden. Die verbleibende Zeit steht neben +„Abmelden" und wird unter fünf Minuten auffällig. + +Dass die Tokens überhaupt abgelegt werden, kehrt eine frühere Entscheidung um: +Vorher lagen sie nur im Arbeitsspeicher, und jedes Neuladen warf den Betreiber +auf die Anmeldemaske. Mitten in einer Störung ist das kein Sicherheitsgewinn, +sondern ein Hindernis. Was den Rest trägt, ist nicht der Speicherort, sondern +der **sofortige serverseitige Widerruf**: Die Tokens sind opak, kein JWT, und +genau dafür wurden sie gewählt. - **Jede Fehleranzeige nennt `request_id`**, kopierbar. Ohne sie bleibt „es hat nicht funktioniert". @@ -171,6 +222,8 @@ Konsole macht: Listen. - **Die Suche im Ereignisprotokoll filtert im Browser** über die letzten 100 Einträge. Bei größeren Beständen gehört sie auf den Server. +- **Geist Mono wird nicht mitgeliefert.** Ohne die Schrift auf dem Gerät sieht + die Oberfläche in der System-Monospace anders aus als im Preset. - **Kein Live-Fortschritt.** `/api/v1/events/stream` steht in `SYNCOVA_API.md`, ist aber **auch serverseitig nicht umgesetzt** — es fehlt nicht nur die Anbindung. Laufende Sicherungen und Wiederherstellungen aktualisieren sich