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:
mhoennig
2026-08-26 22:21:11 +02:00
co-authored by Claude Fable 5
parent fdca934cf0
commit 4be6ecb984
12 changed files with 620 additions and 236 deletions
+25 -1
View File
@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
import { docParam, docSearch, LIVE_PARAM, SOURCE_PARAM } from '../src/docurl.js';
import { docParam, docSearch, docKind, LIVE_PARAM, SOURCE_PARAM } from '../src/docurl.js';
const LIVE = 'live:https://werkbaum.example/api/v1/documents/44753df1';
const URLDOC = 'url:https://example.org/plan.werkbaum';
@@ -80,3 +80,27 @@ describe('docSearch — die Adresszeile folgt dem aktiven Dokument', () => {
expect(docSearch('', 'example')).toBe('');
});
});
describe('docKind — welche Gruppe des Dokumenten-Menüs? (D81)', () => {
const SHIPPED = ['example', 'werkbaum'];
it('mitgelieferte Dokumente erkennt die feste id', () => {
expect(docKind('example', SHIPPED)).toBe('shipped');
expect(docKind('werkbaum', SHIPPED)).toBe('shipped');
});
it('Server- und URL-Dokumente sind Quellen von außen', () => {
expect(docKind(LIVE, SHIPPED)).toBe('server');
expect(docKind(URLDOC, SHIPPED)).toBe('url');
});
it('alles andere ist ein eigenes Dokument — auch aus Dateien geöffnete', () => {
expect(docKind('k3f9x1', SHIPPED)).toBe('own');
expect(docKind('Unbenannt', SHIPPED)).toBe('own');
});
it('verträgt fehlende Argumente, ohne zu werfen', () => {
expect(docKind(null, SHIPPED)).toBe('own');
expect(docKind('example')).toBe('own'); /* ohne Liste ist nichts mitgeliefert */
});
});