feat: Dokumenten-Menü neu — Brotkrume im App-Kopf, Stand-Knöpfe im Editor-Kopf (D81)
Der Dokument-Wähler steht jetzt als gerahmter Chip "Werkbaum › Name" im App-Kopf und ist damit auch auf dem Telefon aus beiden Bereichen erreichbar; sein Name übernimmt dort die Untertitel-Zeile. Das Menü gruppiert nach Dokumentart (docKind, headless getestet), trägt Umbenennen/Löschen/ Wiederherstellen als Symbole je Zeile und scrollt als Ganzes, statt auf kleinen Bildschirmen abgeschnitten zu werden. Die Editor-Titelzeile heißt wieder "Text-Editor" und trägt die Stand-Funktionen des aktiven Dokuments: Speichern (Strg+S), Stand sichern, frühere Stände, Neu laden (Original/URL/ Datei) und den neuen kurzen Teilen-Knopf (vorher "Auf den Server legen" im Menü). subtitleShort ist ersatzlos ausgebaut. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
fdca934cf0
commit
4be6ecb984
@@ -19,6 +19,9 @@ reverse.
|
||||
|
||||
## 2026-08-26
|
||||
|
||||
- The document picker moved into the app header: `Werkbaum › name` opens the menu — on the phone it is reachable from both panes, and the name takes over the subtitle line
|
||||
- The document menu groups by kind — included, yours, sources — carries rename, delete and restore on each row, and scrolls instead of being cut off on small screens
|
||||
- The editor title bar is labelled `Text editor` again and holds the document's own buttons: save, snapshot, history, reload from the source, and a short `Share` button that puts the plan on a server
|
||||
- The address bar follows the document you switch to: `?live=` and `?sourceUrl=` name what is in front of you, so a reload brings back the same plan
|
||||
- Switching to a server document in the picker now really opens it live — before it only showed its last state
|
||||
- Fix: a foreign change to a server document could land in the text of a local document you had switched to
|
||||
|
||||
@@ -6901,3 +6901,108 @@ getippt und umgeschaltet, kommt beim Server an. 514 Tests, davon 13 neue in
|
||||
`tests/docurl.test.js`; Gegenproben: fremde Parameter mitwerfen → genau die
|
||||
zwei danach benannten Zusicherungen fallen, `encodeURIComponent` statt der
|
||||
sparsamen Maskierung → genau die sieben, die die Lesbarkeit festhalten.
|
||||
|
||||
## D81 — Dokumenten-Menü neu: Brotkrume im App-Kopf, Stand-Knöpfe in der Editor-Titelzeile
|
||||
Das Dokumenten-Menü war gewachsen, ohne je gestaltet zu sein: Der Dokumentname
|
||||
in der Editor-Titelzeile war Auslöser eines Dropdowns, sah aber nicht nach
|
||||
Menü aus, und das Menü mischte Dokumentwahl, Dateifunktionen und Verwaltung in
|
||||
einem Knopf-Wust am Fuß. Auf dem Telefon (Brave) war es zudem **unten
|
||||
abgeschnitten** — sieben Aktions-Knöpfe unter einer Liste, verankert in einer
|
||||
Titelzeile in der unteren Bildschirmhälfte. Einer Design-Runde mit vier
|
||||
Mockup-Richtungen (Knopf & Menü am Ort, Schublade, Dokument im App-Kopf,
|
||||
Palette) folgte die Entscheidung des Nutzers für **C — Dokument im App-Kopf**.
|
||||
|
||||
**Der Name gehört über beide Bereiche, nicht in eine Panel-Zeile.** Das
|
||||
Dokument bestimmt Text UND Diagramm; im App-Kopf steht es als Brotkrume
|
||||
**„Werkbaum › Name"** — ein gerahmter Chip mit Pfeil, der endlich nach Menü
|
||||
aussieht und lange URL-Namen mit Ellipse kürzt (voller Name im Tooltip, wie
|
||||
gehabt). Nebengewinn auf dem Telefon: Der Kopf ist in beiden Bereichen
|
||||
sichtbar, die Dokumentwahl ist also auch bei Diagramm-vorn erreichbar — vorher
|
||||
musste man erst in den Textbereich wechseln (D17). Der Name übernimmt dort die
|
||||
Zeile des Untertitels; es kommt keine Fläche hinzu (die harte Randbedingung
|
||||
der Design-Runde: größerer App-Header und ständige Werkzeugleiste waren in
|
||||
einer früheren Runde genau daran gescheitert).
|
||||
|
||||
**Die Editor-Titelzeile bekommt ihre Beschriftung zurück — „Text-Editor"**
|
||||
(Nutzer-Vorgabe; vorher „Struktur (Text)", zuletzt ganz vom Wähler verdrängt,
|
||||
D22) — **und trägt die Stand-Funktionen des aktiven Dokuments** als Knöpfe:
|
||||
|
||||
- **Speichern** (Als Datei speichern, Strg+S — der Blitz samt Haken von D74
|
||||
sitzt jetzt hier statt am Dokumentnamen: der Knopf ist die Geste);
|
||||
- **Stand jetzt sichern** und **Frühere Stände** (unverändert, D54);
|
||||
- **Neu laden** — kontextabhängig: bei mitgelieferten Dokumenten „Original
|
||||
wiederherstellen" (ausgegraut, solange unverändert), bei URL-Dokumenten
|
||||
frisch holen (die URL ist die Quelle der Wahrheit, D23), bei Dateien mit
|
||||
gemerktem Handle neu aus der Datei lesen (D72); sonst verborgen. Die
|
||||
Abweichungs-Prüfung hängt am **input-Ereignis**, nicht nur am
|
||||
Dokumentwechsel — beim Bauen gefunden: Nach dem ersten Tippen blieb der
|
||||
Knopf ausgegraut, weil die Abweichung beim Tippen entsteht;
|
||||
- **Teilen** — der neue, kurze Name für „Auf den Server legen"
|
||||
(D76-Nachtrag 8, Nutzer: „prägnanter und kurzer"): legt das Dokument auf
|
||||
einen Werkbaum-Server und startet die gemeinsame Bearbeitung; entfällt, wo
|
||||
es schon liegt (id `live:…`). Aus dem Menü heraus, in die Titelzeile hinein
|
||||
— es ist eine Funktion des aktiven Dokuments, keine Dokumentverwaltung.
|
||||
|
||||
**Das Menü selbst: Gruppen nach Dokumentart, Aktionen an der Zeile.** Drei
|
||||
Gruppen — **Mitgeliefert · Eigene · Quellen** (Server- und URL-Dokumente);
|
||||
die Art steckt in der id und ist als `docKind()` headless in docurl.js
|
||||
(Hausregel D54-Nachtrag 3, getestet). Umbenennen, Löschen und — bei
|
||||
abweichenden mitgelieferten — Wiederherstellen hängen als **Symbole an der
|
||||
Zeile des jeweiligen Dokuments**, immer sichtbar (Touch kennt kein Hover; die
|
||||
Hover-only-Variante des Mockups hätte dort versagt). Damit wirken sie auf
|
||||
**jedes** Dokument, nicht mehr nur auf das aktive, und das Menü bleibt nach
|
||||
einer Verwaltungs-Aktion **offen** — wer aufräumt, räumt meist weiter. Kein
|
||||
Knopf im Knopf: Die Zeile ist ein `div`, Wählen-Knopf und Aktions-Knöpfe sind
|
||||
Geschwister (verschachtelte interaktive Elemente sind ungültiges HTML). Unten
|
||||
bleiben zwei Befehle als gewöhnliche Menüzeilen: „+ Neues Dokument" und
|
||||
„Datei öffnen…".
|
||||
|
||||
**Gegen das Abschneiden auf dem Telefon: scrollen, nicht klappen.** Das Menü
|
||||
bekommt `max-height` und scrollt **als Ganzes**; die vom Nutzer alternativ
|
||||
vorgeschlagenen auf-/zuklappbaren Gruppen sind verworfen — sie brauchten
|
||||
einen gemerkten Klapp-Zustand und versteckten Dokumente hinter einem zweiten
|
||||
Klick, während das Scrollen zustandslos ist und nichts versteckt. Dazu kommt,
|
||||
dass das Menü jetzt **oben** hängt statt in der Mitte des Bildschirms — der
|
||||
Platz darunter ist das Mehrfache des alten.
|
||||
|
||||
**Drei Messbefunde beim Bauen, alle in derselben Sitzung behoben:**
|
||||
|
||||
- **Das Menü spannte auf Mobil nur 155 px** statt der vollen Breite: Bezug
|
||||
war die Marken-Gruppe, und die ist nur so breit, wie die Werkzeuge rechts
|
||||
ihr lassen. Dieselbe Verlegung wie beim Neuigkeiten-Popup (D58): Bezug ist
|
||||
die ganze Kopfzeile; die Marken-Gruppe löst sich auf Mobil per
|
||||
`display:contents` auf, damit die Chip-Zeile per `order` unter Marke und
|
||||
Werkzeuge umbricht — gemessen danach 335 px, `elementFromPoint` trifft
|
||||
(die D50-Prüfung).
|
||||
- **Marke und Werkzeuge brachen in zwei Zeilen** (Kopf: drei Zeilen = neue
|
||||
Fläche): 164 + 164 px bei 335 px Breite. Wie in D17-Nachtrag 5 weichen die
|
||||
**Lücken, nicht die Knöpfe** — nachgemessen mit eingeblendetem
|
||||
Neuigkeiten-Zähler UND Build-Hinweis (die D17-Lektion, mit dem versteckten
|
||||
Element zu messen): Worst Case 325 von 335 px, eine Zeile, Kopf 63 px.
|
||||
Bei 320 px bricht es ehrlich um (Marke und Werkzeuge passen physisch nicht
|
||||
nebeneinander) — dieselbe Philosophie wie die 440-px-Schwelle (D50).
|
||||
- **Der Neu-laden-Knopf blieb nach dem Tippen ausgegraut** (siehe oben).
|
||||
|
||||
**Was mitgeht:** Der Collapsed-Editor zeigt jetzt „TEXT-EDITOR" (senkrecht im
|
||||
Seitenmodus) statt des Dokumentnamens; der Klick-Wächter am alten Auslöser
|
||||
(minimierter Editor) entfällt — im App-Kopf gibt es nichts wiederherzustellen.
|
||||
Ein offenes Menü wechselt die Sprache mit (wie das Neuigkeiten-Popup). Der
|
||||
Untertitel-Kurztext (`subtitleShort`, 9 Sprachen) ist ersatzlos ausgebaut —
|
||||
seine Zeile gehört jetzt dem Dokumentnamen.
|
||||
|
||||
**Werkzeuggrenzen, wieder dieselbe Sorte wie D25/D17-Nachtrag 4:** Nach einem
|
||||
programmatischen Resize lieferte das Browser-Pane Miniatur-Screenshots einer
|
||||
Seite, die sich selbst nachweislich korrekt maß (1280 × 860), und die
|
||||
`matchMedia`-Umschaltung von `body.mobile` feuerte nicht — beides
|
||||
Umgebungs-Artefakte, kein Befund; entschieden haben die Messwerte im
|
||||
Dokument, nicht die Bilder.
|
||||
|
||||
**Nachgemessen** (518 Tests, davon 4 neue für `docKind`; Browser Desktop und
|
||||
375/320 px): Chip im Kopf öffnet das gruppierte Menü, `elementFromPoint`
|
||||
trifft es auf allen Breiten; Neues Dokument geht in die Inline-Benennung mit
|
||||
markiertem Vorschlag und landet unter „Eigene"; ein bearbeitetes Beispiel
|
||||
zeigt das Zeilen-Restore-Symbol und aktiviert Neu laden, Wiederherstellen
|
||||
stellt Text und Knopfzustände zurück, ohne das Menü zu schließen; Löschen
|
||||
eines nicht-aktiven Dokuments lässt den Editor unangetastet; auf dem Telefon
|
||||
ist der Wähler aus dem Diagramm-Bereich erreichbar und der Wechsel rendert
|
||||
183 Knoten, langer Name füllt die 335-px-Chipzeile mit Ellipse.
|
||||
|
||||
+6
-4
@@ -561,10 +561,12 @@ Ab schmaler Breite (≤ 640 px, z. B. Smartphone) ist **immer genau ein Bereich*
|
||||
zu sehen — Diagramm **oder** Text, jeweils über die ganze Fläche. Oben links in
|
||||
der Titelzeile schaltet ein **Knopf** auf den anderen um; er zeigt das Ziel
|
||||
(Textzeilen bzw. Baum), denn den Zustand hat man ohnehin vor sich. Es gibt hier
|
||||
weder Splitter noch Min/Normal/Max-Buttons — es ist nichts zu teilen. Der
|
||||
Bereichstitel „DIAGRAMM" entfällt; die Zeile wird für Umschalter und Aktionen
|
||||
gebraucht. Der **Dokumenten-Wähler** steht direkt neben dem Umschalter und ist
|
||||
damit genau dann zu sehen, wenn der Text vorn ist. Die übrigen
|
||||
weder Splitter noch Min/Normal/Max-Buttons — es ist nichts zu teilen. Die
|
||||
Bereichstitel („DIAGRAMM", „TEXT-EDITOR") entfallen; die Zeile wird für
|
||||
Umschalter und Aktionen gebraucht. Der **Dokumenten-Wähler** steht als
|
||||
Brotkrume im App-Kopf („Werkbaum › Name", D81) und ist damit aus **beiden**
|
||||
Bereichen erreichbar; sein Name übernimmt hier die Zeile des Untertitels —
|
||||
es kommt keine Fläche hinzu. Die übrigen
|
||||
**Aktions-Knöpfe** bleiben rechts in der Titelzeile und werden mit
|
||||
umgeschaltet — jeder Bereich zeigt seine eigenen, in der unten beschriebenen
|
||||
komprimierten Form. Der sichtbare Bereich wird gemerkt; ein Sprung zwischen
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
- [^] #ed.mobile.tip: A tap on a node opens its tooltip as a window (XS) %% no pointer, no tooltip
|
||||
- [^] #ed.tipwindow: The same window at the pointer and on keyboard focus (XS) %% a title has no paragraphs and never shows on focus
|
||||
- [^] #ed.docs: Several documents in one editor (M)
|
||||
- [^] #ed.docs.picker: Switcher in the editor title bar (S)
|
||||
- [x] #ed.docs.picker: Breadcrumb picker in the app header (S) %% Werkbaum › name, see D81
|
||||
- [^] #ed.docs.url: Load a document from ?sourceUrl= (S)
|
||||
- [^] #ed.docs.restore: Restore a shipped document from the menu (XS)
|
||||
- [^] #ed.jump: Jump between diagram and text (S)
|
||||
@@ -151,7 +151,7 @@
|
||||
| [?] #col.live.crdt: Text CRDT — the plan is plain text, so it fits (L)
|
||||
| [?] #col.live.ot: Operational transformation (XL)
|
||||
- [^] #col.live.ask: On a real overlap, ask whose version wins (S)
|
||||
- [^] #col.live.upload: Put a local plan on the server, from the menu (S)
|
||||
- [x] #col.live.upload: Share: put a local plan on the server (S) %% a button in the editor title bar, see D81
|
||||
- [?] #col.live.cursors: Cursors and who else is here (S)
|
||||
- [-] #col.live.ws: Transport over a websocket (S) %% plain HTTP turned out to be enough
|
||||
- [-] #col.live.own: A merge algorithm of our own (XL) %% solved problem, do not reinvent
|
||||
@@ -531,8 +531,10 @@
|
||||
without changing anything.
|
||||
|
||||
#ed.docs.picker
|
||||
The name of the active document replaces the panel title and opens the menu
|
||||
for switching, creating, renaming and deleting.
|
||||
The app header reads "Werkbaum > name": the chip opens the menu, grouped by
|
||||
kind (shipped, yours, sources), with rename, delete and restore on each row.
|
||||
It scrolls as a whole instead of being cut off on small screens, and on the
|
||||
phone it is reachable from both panes.
|
||||
|
||||
#ed.docs.url
|
||||
A link can carry the address of a text file, which is then fetched on every
|
||||
@@ -901,10 +903,10 @@
|
||||
for the same result.
|
||||
|
||||
#col.live.upload
|
||||
Without it the only way onto the server was a curl command. The local plan
|
||||
stays where it is: whoever entrusts their only copy to a server should not
|
||||
lose it in the act. The picker names the host beside a server document, so
|
||||
the two entries are told apart.
|
||||
Without it the only way onto the server was a curl command. A share button
|
||||
in the editor title bar; the local plan stays where it is: whoever entrusts
|
||||
their only copy to a server should not lose it in the act. The picker names
|
||||
the host beside a server document, so the two entries are told apart.
|
||||
|
||||
#col.live.cursors
|
||||
Seeing where the others are. A by-product of the merge layer rather than a
|
||||
|
||||
Reference in New Issue
Block a user