From ecc1b632f671fa24491129b22e25c5a2bf11adcb Mon Sep 17 00:00:00 2001 From: mhoennig Date: Sun, 23 Aug 2026 13:22:52 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20von=20Station=20zu=20Station=20des=20g?= =?UTF-8?q?=C3=BCnstigsten=20Pfads=20(D47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mit dem status-bewussten Pfad (D46) zeigt das Diagramm die offene Front — im mitgelieferten Plan 24 Stationen, verteilt über einen Baum von über 20 000 px Breite. Sie zu sehen war damit gelöst, sie abzugehen nicht. Der neue Knopf im Diagramm-Kopf holt sie der Reihe nach in die Mitte: erster Druck die erste (was als Nächstes dran ist), jeder weitere die nächste, nach der letzten wieder die erste. Der Sprung fasst nur das Diagramm an — zentrieren, hervorheben, Tastaturfokus, also buchstäblich die Behandlung des ausdrücklichen Alt+Klicks (D25) samt Puls und hervorgehobenen Abhängigkeits-Kanten. In den Text führt von dort Alt+Enter, dieselbe Geste wie überall. Ohne eigenen Zustand: Fortgesetzt wird am gerade hervorgehobenen Knoten. Ein gemerkter Index wäre schlechter — der Baum wird bei jedem Tastendruck neu gebaut, die Stationsliste ändert sich unter ihm. Verborgen, solange es keine Station gibt (Pfad aus, oder alles erledigt); der Tooltip nennt die Anzahl. i18n `leanNextTooltip` in neun Sprachen. Die Mobil-Kopfzeile trug den neunten Knopf nicht mehr — D17-Nachtrag 5 hatte sie gerade erst auf acht zurechtgemessen. Nachgemessen: bei 375 px reicht es nach Lücke 8->6 px und Innenabstand 10->8 px weiterhin (345 px Inhalt, 359 px Platz, 14 px Luft); bei 320 px passen neun Fingerziele arithmetisch nicht, und unter 29 px zu gehen hat D17-Nachtrag 5 abgelehnt. Die Zeile schiebt dort deshalb (`overflow-x:auto`, Balken ausgeblendet) — 41 px Schiebeweg, Kopfhöhe unverändert 49 px, alle neun Elemente in voller Größe erreichbar. Dabei ein älterer, stiller Fehler gefunden: Bei Platzmangel schrumpfte der Modus-Wähler — das einzige Element ohne feste Größe — auf einen 2-px-Strich zusammen, während sein Icon 38 px breit darüber hinausragte; er sah aus wie ein Trennstrich und war unbenutzbar. `flex:0 0 auto` an allen Kindern der Zeile stellt das ab. 236 Tests grün. SPEC §9 und D47 halten es fest; der Plan bekommt den Knoten als `[x]` (noch nicht deployt), frontend/CLAUDE.md die Kopfzeilen-Stolperfalle. Co-Authored-By: Claude Fable 5 --- docs/DECISIONS.md | 74 +++++++++++++++++++++++++++++++++ docs/SPEC.md | 13 ++++++ docs/TASKS.md | 7 ++++ docs/examples/werkbaum.werkbaum | 1 + frontend/CLAUDE.md | 10 +++++ frontend/index.html | 7 ++++ frontend/src/app.js | 51 +++++++++++++++++++++++ frontend/src/style.css | 18 +++++++- 8 files changed, 179 insertions(+), 2 deletions(-) diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 836977b..11d113e 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -2997,3 +2997,77 @@ um genau zwei Knoten (`[x] Zielgruppenanalyse`, `[x] Sitemap` verlieren Status-Hälfte ist damit gebaut. Offen bleibt die **Nutzen-Achse** (Ausbaustufen: ist eine Gruppe komplett realisiert, zur nächsten per Nutzen gewählten Stufe weiterspringen) — die braucht erst ein Nutzen-Attribut und den Aufwands-Rollup. + +## D47 — Von Station zu Station: ein Knopf, der geht, statt zu schalten +Mit dem status-bewussten Pfad (D46) zeigt das Diagramm die offene Front — im +mitgelieferten Plan 24 Stationen, verteilt über einen Baum von über 20 000 px +Breite. Sie **zu sehen** ist damit gelöst, sie **abzugehen** nicht: Man müsste +jede von Hand suchen. Der Knopf im Diagramm-Kopf holt sie der Reihe nach in die +Mitte. + +**Der einzige Knopf im Diagramm-Kopf, der kein Umschalter ist.** „Verworfene +einblenden" (D4), „günstigster Pfad" (D18) und die Falt-Voreinstellung (D44) +beschreiben je einen Zustand; dieser löst eine **Bewegung** aus. Deshalb kein +`aria-pressed` und keine gedrückte Optik — er sieht aus wie „kopieren" und +„herunterladen", die ebenfalls etwas *tun*. + +**Der Sprung fasst nur das Diagramm an** (Nutzer): zentrieren, hervorheben, +Tastaturfokus — buchstäblich die Behandlung des ausdrücklichen Alt+Klicks +(D25-Nachtrag 1), inklusive Puls und der Hervorhebung der +Abhängigkeits-Kanten (D41). Erwogen war, zusätzlich die Schreibmarke auf die +Zeile zu setzen; das kostete aber den Fokus im Baum (der nächste Druck müsste +ihn zurückholen) und wäre auf dem Telefon bei jedem Sprung ein Bereichswechsel +weg vom Diagramm. Der Weg in den Text steht direkt daneben offen: **Alt+Enter** +am fokussierten Knoten, dieselbe Geste wie überall. + +**Nach der letzten wieder die erste** (Nutzer). Ein Knopf, der am Ende +aufhört, wirkt kaputt und bräuchte eine eigene Rückstell-Geste; dass man wieder +oben ist, sieht man am Baum. + +**Kein Zähler am Knopf** (Nutzer). Der „Was ist neu?"-Knopf trägt einen, hier +wäre er ein zehntes Element in einer Zeile, die schon knapp ist — die Zahl der +offenen Stationen steht stattdessen im **Tooltip** („… (24 offen)"), wo sie +nichts kostet. + +**Kein eigener Zustand: fortgesetzt wird am hervorgehobenen Knoten.** Ein +gemerkter Index wäre die naheliegende Lösung und die schlechtere: Der Baum wird +bei **jedem Tastendruck** neu gebaut, die Stationsliste ändert sich unter dem +Index, und er zeigte danach auf etwas anderes. `currentNodeEl` (D25) überlebt +den Neubau dagegen von selbst, weil es aus der Cursor-Zeile neu abgeleitet +wird. Liegt der hervorgehobene Knoten nicht auf einer Station — etwa weil +jemand zwischendurch im Text getippt hat —, beginnt der Gang wieder vorn. Das +ist kein Notbehelf, sondern die richtige Antwort auf „zeig mir, was als +Nächstes dran ist". + +**Verborgen, solange es nichts anzuspringen gibt** — bei ausgeschaltetem Pfad +(dann gibt es keine Stationen) ebenso wie bei einem durchweg erledigten Plan. +Dieselbe Zurückhaltung wie beim „Was ist neu?"-Knopf (D28). + +**Die Kopfzeile hat das nicht mehr getragen — und das war kein Fehler des +Knopfes.** D17-Nachtrag 5 hatte die Zeile gerade erst auf acht Elemente +zurechtgemessen und dabei `flex-wrap:nowrap` als Riegel gesetzt, damit aus +einem stillen Umbruch ein sichtbarer Überlauf wird. Der neunte Knopf hat den +Riegel prompt ausgelöst — nachgemessen aber anders als erwartet: + +- Bei **375 px** passte es weiterhin, nachdem die Lücke von 8 auf 6 px und der + Innenabstand von 10 auf 8 px ging: 345 px Inhalt, 359 px Platz, **14 px + Luft**, eine Reihe. +- Bei **320 px** ist es Arithmetik: 345 px Inhalt gegen 304 px Platz. Neun + fingergroße Ziele passen dort nicht, und unter 29 px zu gehen hat + D17-Nachtrag 5 ausdrücklich abgelehnt. + +**Dabei ein älterer, stiller Fehler gefunden:** Bei Platzmangel schrumpfte +nicht etwa irgendetwas gleichmäßig — der **Modus-Wähler** ist das einzige +Element ohne feste Größe und wurde auf einen **2-px-Strich** zusammengedrückt, +während sein Icon 38 px breit darüber hinausragte. Das Bedienelement war +unbenutzbar und sah aus wie ein Trennstrich. `flex:0 0 auto` an allen Kindern +der Zeile stellt das ab: Niemand wird mehr zerdrückt. + +**Darum schiebt die Zeile jetzt, statt zu zerdrücken oder abzuschneiden:** +`overflow-x:auto` auf dem Kopf (Scrollbalken ausgeblendet — auf Touch-Geräten +sind sie ohnehin Overlay). Bei 375 px ändert die Regel nichts, weil nichts +überläuft; bei 320 px bleiben alle neun Elemente in voller Größe erreichbar +(nachgemessen: 41 px Schiebeweg, Kopfhöhe unverändert 49 px, Modus-Wähler +wieder 40 px breit). Das ist die ehrliche Fortschreibung der D17-Regel: Der +Riegel sollte einen unbemerkten Layout-Wechsel verhindern, nicht ein +Bedienelement opfern. diff --git a/docs/SPEC.md b/docs/SPEC.md index 4c05524..4033571 100644 --- a/docs/SPEC.md +++ b/docs/SPEC.md @@ -529,6 +529,19 @@ Restarbeit ist dann seine); ist ein ganzer Zweig erledigt, hat er keine. Linie, abgetönte Kopie und Punkte erscheinen bei aktivem Umschalter auch im Grafikexport. Siehe D18, D46. +**Von Station zu Station.** Neben dem Umschalter steht ein **Knopf**, der die +Stationen der Reihe nach anspringt: Der erste Druck holt die **erste** — das, +was als Nächstes dran ist —, jeder weitere die nächste, nach der letzten wieder +die erste. Gegangen wird die Dokument-Reihenfolge, also dieselbe, in der die +Linie durch die Stationen fädelt. Der Knoten wird **zentriert, hervorgehoben +und bekommt den Tastaturfokus** — dieselbe Behandlung wie beim ausdrücklichen +Alt+Klick (§9, Sprung zwischen Diagramm und Text); von dort führt **Alt+Enter** +in die zugehörige Textzeile. Fortgesetzt wird am gerade hervorgehobenen Knoten: +Steht der auf einer Station, geht es bei der nächsten weiter, sonst wieder +vorn. Der Knopf ist **verborgen**, solange es keine Station gibt — bei +ausgeschaltetem Pfad ebenso wie bei einem durchweg erledigten Plan; sein +Tooltip nennt die Zahl der offenen Stationen. Siehe D47. + ### Diagramm aus einer URL laden (`?sourceUrl=`) Der Editor kann den Notationstext aus einer externen Textdatei beziehen: `…?sourceUrl=https://example.org/plan.txt` (relative Angaben werden gegen die diff --git a/docs/TASKS.md b/docs/TASKS.md index 2e9d126..c28cb4e 100644 --- a/docs/TASKS.md +++ b/docs/TASKS.md @@ -136,6 +136,13 @@ entscheiden, **bevor** Code entsteht. M-Badge. Angefangenes (`[~]`/`[/]`) zählt weiter voll, maßgeblich ist der intrinsische Status. Kein neuer Umschalter — der vorhandene ändert seine Bedeutung. `tests/frontier.test.js`. +- [x] Von Station zu Station springen (Knopf im Diagramm-Kopf). + → Umgesetzt (D47): `jumpToLeanStation()` holt die nächste offene Station + in die Mitte (Behandlung wie Alt+Klick, D25), nach der letzten wieder die + erste; ohne eigenen Zustand — fortgesetzt wird am hervorgehobenen Knoten. + Verborgen, solange es keine Station gibt; i18n `leanNextTooltip` in neun + Sprachen. Die Mobil-Kopfzeile musste dafür enger und darf unter 360 px + schieben. - [ ] Nutzen je Knoten (Gegenstück zur Kosten-Größe) — Schreibweise offen, SPEC-first (siehe ROADMAP „Kleinere Ideen"). - [ ] Aufwands-Rollup (Größen der Kinder aggregieren) — braucht erst eine diff --git a/docs/examples/werkbaum.werkbaum b/docs/examples/werkbaum.werkbaum index 58ac0f1..f41b2a7 100644 --- a/docs/examples/werkbaum.werkbaum +++ b/docs/examples/werkbaum.werkbaum @@ -41,6 +41,7 @@ - [^] Cost model, missing size counts as M (S) - [x] Only the open front: what is done costs nothing (S) %% see D46 - [^] Metro-map line through the leaves (S) + - [x] Step from station to station, one button (S) %% see D47 - [^] #closure: Count the whole dependency closure (M) - [^] Shared dependencies counted only once (S) - [^] The cheapest alternative is no longer the local one (M) %% see D34, D42 diff --git a/frontend/CLAUDE.md b/frontend/CLAUDE.md index 2c1cfef..40499f9 100644 --- a/frontend/CLAUDE.md +++ b/frontend/CLAUDE.md @@ -504,3 +504,13 @@ verworfene Elemente. Quelle sind ES-Module unter `src/`; `index.html` ist der Hash-Rückfall, der Marker-Pfad ist nur zu prüfen, wenn man einen echten `commit/` in `index.html` einspritzt (danach zurücknehmen!) und `window.fetch` überschreibt. +- **Diagramm-Kopfzeile auf Mobil (D17-Nachtrag 5, D47):** Die Zeile ist voll — + bei 375 px bleiben mit neun Bedienelementen noch 14 px Luft, bei 320 px passt + es arithmetisch nicht mehr und die Zeile **schiebt** (`overflow-x:auto`). + Wer ein zehntes Element hinzufügt, misst nach (`scrollWidth - clientWidth` + am `.panel-head`) und rechnet damit, dass auf 375 px etwas weichen muss. + Nicht anfassen: die 29 px Knopfgröße (Fingerziel) und `flex:0 0 auto` an den + Kindern — ohne das schrumpft bei Platzmangel ausgerechnet der Modus-Wähler + (das einzige Element ohne feste Größe) auf einen 2-px-Strich, während sein + Icon darüber hinausragt. Das sieht aus wie ein Trennstrich und ist + unbenutzbar. diff --git a/frontend/index.html b/frontend/index.html index a4e0f7c..28d3bef 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -155,6 +155,13 @@ + +