From f7d963809a55442b6d2d0ee1533d52ddb5cd84df Mon Sep 17 00:00:00 2001 From: mhoennig Date: Mon, 24 Aug 2026 11:21:06 +0200 Subject: [PATCH] feat(editor): Knopf, der einen Stand von Hand sichert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zehn Minuten sind der falsche Takt für den einen Moment, in dem man einen Stand wirklich will: unmittelbar vor einer größeren Änderung. Dann ist der letzte selbsttätige Stand im Zweifel neun Minuten alt. - Kamera statt Plus: Ein `+` neben dem Dokument-Namen läse sich als „neues Dokument“, ein Lesezeichen als „Favorit“. Gegen Uhr (Verlauf) und Caret (Dokumentwahl) ist die Kamera eindeutig. - Die Rückmeldung kommt IMMER, auch wenn nichts angelegt wurde: Der Knopf verspricht „dein Stand ist gesichert“, nicht „ein Eintrag wurde erzeugt“. Bei unverändertem Text steht er schon oben in der Liste — einen doppelten Eintrag zu erzwingen kostete nur einen der 20 Plätze. - Gezeigt per vorhandenem Haus-Idiom (`flashBtn`, 1,5 s Haken); dafür nur `.copybtn.done .ic-copy` um `.ic-main` erweitert. - Pad-Fall folgt von selbst: beide Knöpfe in EINER Zuweisung versteckt. - i18n `snapAddTooltip` in 9 Sprachen; der Leer-Text des Menüs nennt jetzt beide Wege. Nachgemessen: 0 -> Klick -> 1 (Haken sichtbar, nach 1,7 s wieder Kamera); zweiter Klick ohne Änderung -> weiterhin 1, Rückmeldung trotzdem; nach einer Änderung -> 2. Im schmalen Layout kostet der Knopf nichts (Kopfhöhe 44 px und Zeilenzahl mit und ohne ihn identisch). D54-Nachtrag; Plan: #ed.snaps.manual [x] (158 Knoten, 0 Warnungen). 243 Tests grün. Co-Authored-By: Claude Opus 5 --- docs/DECISIONS.md | 48 +++++++++++++++++++++++++++++++++ docs/examples/werkbaum.werkbaum | 7 +++++ frontend/index.html | 7 +++++ frontend/src/app.js | 45 ++++++++++++++++++++++++------- frontend/src/style.css | 4 ++- 5 files changed, 100 insertions(+), 11 deletions(-) diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 5cf726c..f143592 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -3690,3 +3690,51 @@ schließt das Menü, das Diagramm zeichnet neu (30 Knoten) — und ein `undo` ho den vorherigen Stand zeichengenau zurück. Der **Pad-Fall** ist durch die `readOnly`-Wächter im Code abgedeckt, aber nicht live durchgespielt (er bräuchte ein echtes Pad). + +**Nachtrag — ein Knopf, der von Hand sichert.** Zehn Minuten sind der falsche +Takt für den einen Moment, in dem man einen Stand wirklich will: unmittelbar +**vor** einer größeren Änderung. Genau dann ist der letzte selbsttätige Stand +im Zweifel neun Minuten alt und enthält die Arbeit nicht, die man gleich +aufs Spiel setzt. Der Knopf steht rechts neben dem Verlaufs-Knopf, in +derselben Gruppe wie der Dokument-Wähler. + +**Kamera, nicht Plus.** Ein `+` unmittelbar neben dem Dokument-Namen liest +sich als „neues Dokument" — das gibt es schon, im Menü daneben. Ein +Lesezeichen läse sich als „Favorit". Die Kamera ist gegen beide Nachbarn +eindeutig (Uhr mit Pfeil = Verlauf, Caret = Dokumentwahl) und trifft die +Vorstellung, die der Nutzer selbst benannt hat („einen Snapshot manuell +anfertigen"). Die UI-Texte bleiben bei „Stand", weil das Menü daneben so +heißt. + +**Die Rückmeldung kommt immer — auch wenn nichts angelegt wurde.** Ein Knopf, +der bei unverändertem Text stumm bleibt, wirkt kaputt; genau das passiert, +denn `snapshotNow()` legt keinen doppelten Eintrag an. Der Ausweg ist keine +zweite Meldung, sondern eine genauere Zusage: Der Knopf verspricht **„dein +aktueller Stand ist gesichert"**, nicht „ein Eintrag wurde erzeugt". Bei +unverändertem Text steht er bereits oben in der Liste — die Zusage stimmt +also in beiden Fällen, und es braucht weder eine Fallunterscheidung noch +einen zehnten i18n-Text. Einen Eintrag zu erzwingen wäre die schlechtere +Wahl: Er kostete einen der zwanzig Plätze für Text, der schon da ist. + +Gezeigt wird das mit dem **vorhandenen** Haus-Idiom: `flashBtn()` setzt für +1,5 s die Klasse `done`, die Petrol färbt und das Icon gegen einen Haken +tauscht — dieselbe Rückmeldung wie bei „kopieren" und „herunterladen". Dafür +musste nur die CSS-Regel `.copybtn.done .ic-copy` um `.ic-main` erweitert +werden: die neutrale Form desselben Platzes für Knöpfe, die nichts kopieren. + +Ein **offenes Menü bleibt offen** und zeichnet neu — dort sieht man den +Eintrag entstehen. Der Pad-Fall folgt von selbst: Beide Knöpfe werden in +**einer** Zuweisung versteckt (`snapBtn.hidden = snapAddBtn.hidden = +src.readOnly`), sie können also nicht auseinanderlaufen. + +Der Leer-Text des Menüs nennt jetzt beide Wege („auf Knopfdruck und alle 10 +Minuten") — er ist die Stelle, an der jemand fragt, wie man überhaupt zu +einem Stand kommt. + +**Nachgemessen** (Werkbaum-Plan, Stände zuvor leer): 0 → Klick → **1**, +Haken sichtbar (`ic-done` block, `ic-main` none), nach 1,7 s wieder das +Kamera-Icon. Zweiter Klick **ohne** Änderung → weiterhin 1, Rückmeldung +trotzdem. Text geändert, Klick → **2**; Menü zeigt beide, neueste zuoberst, +und liegt vollständig im Panel. Im schmalen Layout kostet der Knopf nichts: +Kopfhöhe 44 px und Zeilenzahl sind mit und ohne ihn identisch, die Breite des +Dokument-Namens bleibt bei 54 px. diff --git a/docs/examples/werkbaum.werkbaum b/docs/examples/werkbaum.werkbaum index c8091af..81085b3 100644 --- a/docs/examples/werkbaum.werkbaum +++ b/docs/examples/werkbaum.werkbaum @@ -74,6 +74,7 @@ - [^] #ed.fold.write: Folding writes the mark back into the text (S) %% one undo step - [^] #ed.fold.preset: One switch folds everything from size M downward (S) %% see D44 - [^] #ed.snaps: Earlier states of a document, every ten minutes (S) %% only when something changed + - [x] #ed.snaps.manual: Save a state by hand, before a larger change (XS) %% ten minutes is the wrong beat for that moment - [ ] #ed.files: Open and save .werkbaum files (S) + [^] #ed.fresh: Show what is new since your last visit (S) + [?] #ed.percolor: A pastel colour per person (S) @@ -521,6 +522,12 @@ beside the document picker. Loading one is a single undo step, so a wrong pick costs nothing. +#ed.snaps.manual + Ten minutes is the wrong beat for the one moment a state is really wanted: + right before a larger change. The button promises that the current state is + kept, not that an entry was added, so it confirms even when the text is + unchanged and already at the top of the list. + #ed.files Open a .werkbaum file and save one. Today the leading data format is the one thing that cannot leave the browser as a file, while the diagram can. diff --git a/frontend/index.html b/frontend/index.html index 21cf51f..ee54918 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -74,6 +74,13 @@ + +