feat: Auf Touch öffnet der einfache Tipp das Knoten-Fenster (D52)

Ein `title` braucht einen Zeiger — auf dem Telefon war die Beschreibung
(D40) damit gar nicht zu sehen, und seit D48 hängt an jedem der 172
Plan-Knoten eine. Der einfache Tipp zeigt jetzt denselben Inhalt als
Fenster.

Die eine echte Frage war der Link: Ein Knoten mit URL belegt den
einfachen Klick vollständig (SPEC §6), ein Tipp kann nicht beides tun.
Entschieden: Auf Touch öffnet der Tipp immer das Fenster, der Link steht
darin als Knopf. Damit hat die Geste dort eine Bedeutung, und die
Tooltips sind auf allen Knoten erreichbar. SPEC §6 bekommt dafür eine
Touch-Ausnahme.

Es hängt an den Touch-Ereignissen, nicht an einer Media Query — ein
Gerät mit beidem verhält sich dadurch ohne Sonderfall richtig: Finger
öffnet das Fenster, Maus öffnet den Link und zeigt den Tooltip.

Die drei Touch-Gesten unterscheiden sich am vorhandenen Zustand, ohne
neues Merkerfeld (armedEl gesetzt ⇒ Sprung, Timer läuft ⇒ Tipp, beides
weg ⇒ gescrollt). Ausgenommen ist das Falt-Zeichen: Das Fenster braucht
preventDefault(), das sonst den Falt-Klick verschluckt.

Das Fenster nutzt, was ein `title` nicht kann: echte Trennlinie statt 24
`─` (der title wird an genau diesem Strich zerlegt, TIP_RULE exportiert
— ein zweites data-Attribut hätte 20 kB DOM-Text verdoppelt), Absätze
aus Leerzeilen statt harter Quell-Umbrüche, Knöpfe. Der Sprung-Hinweis
nennt hier den langen Druck (neuer i18n-Schlüssel jumpHintTouch, plus
tipClose und tipOpenLink, je 9 Sprachen).

position:fixed auf <body>: in #out erbte es dessen zoom und würde von
dessen overflow beschnitten (D50). Zu macht es alles, was seine Aussage
hinfällig macht — Tipp daneben, zweiter Tipp, Esc, ×, Diagramm-Scroll,
Bereichswechsel, Sprung in den Text, render().

Nachgemessen (375x812): Wurzelknoten 336x220 px ganz im Bild, ein Absatz
ohne harte Umbrüche, Fakten mit Langdruck-Hinweis, Link-Knopf, Ring am
Knoten, URL nicht geöffnet; Knoten ohne Beschreibung 39 px ohne
Trennstrich; Spitze 0 px von der Knotenmitte. Echte Wischgeste
(scrollLeft 0 -> 300) schließt. Schreibtisch unverändert: Klick öffnet
den Link, Fenster bleibt zu. Plan: 150 Knoten, 0 Warnungen, 24
Stationen. 240 Tests grün.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-24 07:37:49 +02:00
co-authored by Claude Opus 5
parent b6e83b4f2a
commit b2248c45bc
8 changed files with 358 additions and 8 deletions
+13
View File
@@ -532,3 +532,16 @@ verworfene Elemente. Quelle sind ES-Module unter `src/`; `index.html` ist der
(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.
- **Die drei Touch-Gesten am Knoten (D25, D38, D52)** teilen sich `touchstart`/
`touchend` und werden am vorhandenen Zustand unterschieden: `armedEl` gesetzt
(500 ms um) ⇒ Sprung, Timer läuft noch ⇒ kurzer Tipp ⇒ Knoten-Fenster, beides
weg (jedes `touchmove` räumt auf) ⇒ es wurde gescrollt ⇒ nichts. Kein eigenes
Merkerfeld nötig. Wer hier eine vierte Geste einhängt, denkt an das
**Falt-Zeichen**: Es ist ausgenommen, weil das Fenster `preventDefault()`
braucht (sonst öffnet ein Link-Knoten zusätzlich seine URL) — und das
verschluckt den Klick, mit dem gefaltet wird.
- **Das Knoten-Fenster liegt auf `<body>`, nicht in `#out` (D52):** In `#out`
erbte es dessen CSS-`zoom` und würde von dessen `overflow` beschnitten (D50).
Es schließt bei allem, was seine Aussage hinfällig macht — Tipp daneben,
zweiter Tipp, Esc, ×, Diagramm-Scroll, Bereichswechsel, Sprung in den Text,
`render()`. Die letzten drei sind beim Bauen zuerst vergessen worden.