fitView() maß nur nodeBoxes(). Jetzt rechnet es Gruppen und Kommentare mit ein — inklusive des Falls, den das vorher gar nicht kannte: ein Graph, der nur einen Kommentar enthält, rahmte bisher den leeren Ursprung, weil die Abbruchbedingung nodes.length === 0 hieß.
Eine Grenze, die bleibt und die ich im Wiki vermerkt habe: der Zoom hört bei 0.25 auf. Eine Box weit genug draußen liegt danach immer noch außerhalb — kein Fit kann das lösen.
Selection Rect
Das Band fängt Boxen jetzt mit, und zwar in dieselbe Auswahl wie die Nodes: die Node-Selektion trägt zusätzlich annotationIds. Ein Zug bewegt alles, ein Delete löscht alles, ein Undo nimmt alles zurück.
Zwei Entscheidungen, die im Issue nicht standen:
Eine Box zählt nur, wenn das Band sie ganz umschließt — ein Node zählt weiterhin bei Berührung. Das ist keine Geschmacksfrage: eine Gruppe umschließt die Nodes, die sie hält, überlappt also jedes Band, das einen davon fängt. Und weil eine Gruppe ihre Nodes beim Ziehen mitnimmt, wäre das versehentliche Mitfangen sofort spürbar.
Gemischte Auswahl statt Rückfall. Das kostete Mitzieharbeit an Delete, Drag, Inspector, Undo-Bereinigung und dem Selektionsvergleich — aber alles andere hätte bedeutet, dass man Node und Box nie zusammen anfassen kann.
Die Falle dabei: ein Node innerhalb einer selektierten Gruppe gehört zu beiden. Ein naiver Aufbau versetzt ihn doppelt. travellers() sammelt deshalb, was eine Geste trägt, und lässt jedes Ding darin genau einmal vorkommen.
Belegt
npm run check → 89 Files, 1138 Tests, grün (vorher 1124)
npm run build → ok
GM_STEPS=36 node tools/e2e.mjs → ALL PASSED – 18 checks (vorher 13)
14 neue Unit-Tests (tests/editor/graph-band-selection.test.ts) und fünf neue e2e-Checks in Schritt 36, darunter der, auf den es ankommt: nach einem Band über den ganzen Graphen wird ein Node gezogen, und Notiz, Gruppe und alle Nodes bewegen sich um exakt denselben Betrag — {"far":{"x":244,"y":175},"start":{"x":244,"y":175},"group":{"x":244,"y":175},"note":{"x":244,"y":175}}. Ein doppelter Versatz stünde da als 488.
Zwei Dinge, die der Umbau aufgedeckt hat: die Kurzform, die die Testhooks für eine Selektion übergeben, konnte nodeIds ohne annotationIds liefern und ließ validateSelection() auflaufen — beide Listen werden jetzt an einer Stelle aufgefüllt. Und der Rechtsklick auf eine Box warf vorher die übrige Auswahl weg, bevor man sie ziehen konnte.
Zahl
Die Gesamtzahl im Wiki steht jetzt auf 958 = 953 (gemessen in CI-56 auf be8f233) + 5. Bestätigt ist sie erst, wenn der Container sie liefert; fällt der Lauf anders aus, mache ich das Issue wieder auf.
**Beides gebaut, gepusht als `36ccc76`.**
## Fit
`fitView()` maß nur `nodeBoxes()`. Jetzt rechnet es Gruppen und Kommentare mit ein — inklusive des Falls, den das vorher gar nicht kannte: ein Graph, der *nur* einen Kommentar enthält, rahmte bisher den leeren Ursprung, weil die Abbruchbedingung `nodes.length === 0` hieß.
Eine Grenze, die bleibt und die ich im Wiki vermerkt habe: der Zoom hört bei 0.25 auf. Eine Box weit genug draußen liegt danach immer noch außerhalb — kein Fit kann das lösen.
## Selection Rect
Das Band fängt Boxen jetzt mit, und zwar in **dieselbe** Auswahl wie die Nodes: die Node-Selektion trägt zusätzlich `annotationIds`. Ein Zug bewegt alles, ein `Delete` löscht alles, ein Undo nimmt alles zurück.
Zwei Entscheidungen, die im Issue nicht standen:
1. **Eine Box zählt nur, wenn das Band sie ganz umschließt** — ein Node zählt weiterhin bei Berührung. Das ist keine Geschmacksfrage: eine Gruppe umschließt die Nodes, die sie hält, überlappt also jedes Band, das einen davon fängt. Und weil eine Gruppe ihre Nodes beim Ziehen mitnimmt, wäre das versehentliche Mitfangen sofort spürbar.
2. **Gemischte Auswahl statt Rückfall.** Das kostete Mitzieharbeit an Delete, Drag, Inspector, Undo-Bereinigung und dem Selektionsvergleich — aber alles andere hätte bedeutet, dass man Node und Box nie zusammen anfassen kann.
Die Falle dabei: ein Node *innerhalb* einer selektierten Gruppe gehört zu beiden. Ein naiver Aufbau versetzt ihn doppelt. `travellers()` sammelt deshalb, was eine Geste trägt, und lässt jedes Ding darin genau einmal vorkommen.
## Belegt
```
npm run check → 89 Files, 1138 Tests, grün (vorher 1124)
npm run build → ok
GM_STEPS=36 node tools/e2e.mjs → ALL PASSED – 18 checks (vorher 13)
```
14 neue Unit-Tests (`tests/editor/graph-band-selection.test.ts`) und fünf neue e2e-Checks in Schritt 36, darunter der, auf den es ankommt: nach einem Band über den ganzen Graphen wird **ein** Node gezogen, und Notiz, Gruppe und alle Nodes bewegen sich um exakt denselben Betrag — `{"far":{"x":244,"y":175},"start":{"x":244,"y":175},"group":{"x":244,"y":175},"note":{"x":244,"y":175}}`. Ein doppelter Versatz stünde da als 488.
Zwei Dinge, die der Umbau aufgedeckt hat: die Kurzform, die die Testhooks für eine Selektion übergeben, konnte `nodeIds` ohne `annotationIds` liefern und ließ `validateSelection()` auflaufen — beide Listen werden jetzt an einer Stelle aufgefüllt. Und der Rechtsklick auf eine Box warf vorher die übrige Auswahl weg, bevor man sie ziehen konnte.
## Zahl
Die Gesamtzahl im Wiki steht jetzt auf **958** = 953 (gemessen in CI-56 auf `be8f233`) + 5. Bestätigt ist sie erst, wenn der Container sie liefert; fällt der Lauf anders aus, mache ich das Issue wieder auf.
Wiki: `426dbe7` (`Behaviors.md`, `Keyboard.md`, `Development.md`).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Kommentar- bzw. Group Nodes im Graph:
Beides gebaut, gepusht als
36ccc76.Fit
fitView()maß nurnodeBoxes(). Jetzt rechnet es Gruppen und Kommentare mit ein — inklusive des Falls, den das vorher gar nicht kannte: ein Graph, der nur einen Kommentar enthält, rahmte bisher den leeren Ursprung, weil die Abbruchbedingungnodes.length === 0hieß.Eine Grenze, die bleibt und die ich im Wiki vermerkt habe: der Zoom hört bei 0.25 auf. Eine Box weit genug draußen liegt danach immer noch außerhalb — kein Fit kann das lösen.
Selection Rect
Das Band fängt Boxen jetzt mit, und zwar in dieselbe Auswahl wie die Nodes: die Node-Selektion trägt zusätzlich
annotationIds. Ein Zug bewegt alles, einDeletelöscht alles, ein Undo nimmt alles zurück.Zwei Entscheidungen, die im Issue nicht standen:
Die Falle dabei: ein Node innerhalb einer selektierten Gruppe gehört zu beiden. Ein naiver Aufbau versetzt ihn doppelt.
travellers()sammelt deshalb, was eine Geste trägt, und lässt jedes Ding darin genau einmal vorkommen.Belegt
14 neue Unit-Tests (
tests/editor/graph-band-selection.test.ts) und fünf neue e2e-Checks in Schritt 36, darunter der, auf den es ankommt: nach einem Band über den ganzen Graphen wird ein Node gezogen, und Notiz, Gruppe und alle Nodes bewegen sich um exakt denselben Betrag —{"far":{"x":244,"y":175},"start":{"x":244,"y":175},"group":{"x":244,"y":175},"note":{"x":244,"y":175}}. Ein doppelter Versatz stünde da als 488.Zwei Dinge, die der Umbau aufgedeckt hat: die Kurzform, die die Testhooks für eine Selektion übergeben, konnte
nodeIdsohneannotationIdsliefern und ließvalidateSelection()auflaufen — beide Listen werden jetzt an einer Stelle aufgefüllt. Und der Rechtsklick auf eine Box warf vorher die übrige Auswahl weg, bevor man sie ziehen konnte.Zahl
Die Gesamtzahl im Wiki steht jetzt auf 958 = 953 (gemessen in CI-56 auf
be8f233) + 5. Bestätigt ist sie erst, wenn der Container sie liefert; fällt der Lauf anders aus, mache ich das Issue wieder auf.Wiki:
426dbe7(Behaviors.md,Keyboard.md,Development.md).