fix(diagram): Cursor-Zeile lässt zurückgetretene Knoten blass (D25-Nachtrag 4)

Die Ausnahme von der Pfad-Inversion stellte den ganzen Knoten auf volle
Stärke, weil opacity/filter den Ring mitträfen. Jetzt bleibt der Knoten
deckend und die Blässe wird nachgebildet: Papier-Wasch über der Füllung,
gefadete Text-/Rahmenfarbe, Kinder einzeln gedimmt — der Ring steht voll.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-27 09:54:55 +02:00
co-authored by Claude Fable 5
parent f6c7eff490
commit 9d1d580166
3 changed files with 68 additions and 10 deletions
+1
View File
@@ -19,6 +19,7 @@ reverse.
## 2026-08-27 ## 2026-08-27
- The caret on a node off the cheapest path now highlights only the ring — the fill stays pale instead of jumping back to full colour
- On shared documents the history button shows the server's milestones — loading one is a rollback for everyone, as a new version, nothing lost - On shared documents the history button shows the server's milestones — loading one is a rollback for everyone, as a new version, nothing lost
- The camera button turns the current state of a shared document into a server milestone instead of a local snapshot - The camera button turns the current state of a shared document into a server milestone instead of a local snapshot
- Joining or sharing a document asks once for a display name — it fills the history's "changed by" and stays a claim, not a proof - Joining or sharing a document asks once for a display name — it fills the history's "changed by" and stays a claim, not a proof
+41
View File
@@ -975,6 +975,47 @@ Export und Druck waren nie betroffen — dort zeichnet `diagramToSvg()` die
Punkte nach den Knoten (Reihenfolge statt Stapelung), und die Cursor-Zeile Punkte nach den Knoten (Reihenfolge statt Stapelung), und die Cursor-Zeile
erscheint ohnehin nicht (D25 oben). erscheint ohnehin nicht (D25 oben).
**Nachtrag 4 — auf einem zurückgetretenen Knoten hebt die Cursor-Zeile nur
noch den Ring hervor, die Füllung bleibt blass.** Gemeldet: Steht der Cursor
auf der Zeile eines Knotens, der nicht auf dem günstigsten Pfad liegt, ging
das Ausgrauen durch die Hervorhebung verloren — der Knoten stand plötzlich in
voller Statusfarbe da. Das war der Preis der Ausnahme aus dem Nachtrag oben
(`.cheap-on .node:not(.cheap).current{opacity:1;filter:none}`): Sie stellte
den **ganzen** Knoten wieder her, weil `opacity`/`filter` am Element auch den
`box-shadow` treffen — ein Ring auf einem 0,32-gedimmten Element ist
unsichtbar, das war ja der ursprüngliche Befund. Die Ausnahme war damit
richtig begründet und trotzdem zu grob: Sie kostete die Pfad-Aussage („hier
wird nichts getan") für die Dauer des bloßen Hinsehens.
**Jetzt bleibt der Knoten voll deckend, und die Blässe wird nachgebildet** —
so bekommt der Ring die volle Stärke, ohne dass die Füllung sie bekommt:
- Ein **Papier-Wasch** als `background-image` (68 % `--paper` über der
Statusfarbe) ergibt rechnerisch dasselbe wie 0,32 Deckkraft über dem hellen
Grund.
- **Text- und Rahmenfarbe** wechseln auf das gedimmte Grau. Dass dabei die
acht Status-Rahmenfarben auf ein einheitliches Grau fallen, ist kein
Verlust: Bei 0,32 Deckkraft waren sie ohnehin nicht mehr zu unterscheiden.
- Die **Kinder** (Größen-Badge, Pillen, Chips, Falt-Chip) dimmen einzeln per
`opacity:.32` — genau das, was vorher die Element-Deckkraft mit ihnen tat.
`.ext` ist ausgenommen: Es erbt die schon gefadete Textfarbe und wäre sonst
doppelt gedimmt.
`fresh`, `focusmark` und `done` sind per `:not()` ausgeschlossen — deren
Volle-Stärke-Ausnahmen (D28, D32, D46-Nachtrag) haben eigene Gründe und
gelten unverändert. Puls-Ring (`::after`), Schlagschatten und `scale(1.04)`
bleiben in voller Stärke: Die Tiefe ist der Hervorhebungs-Kanal, die Füllung
gehört dem Pfad. Export und Druck sind unberührt — `diagramToSvg()` liest
`backgroundColor`, nicht `background-image`, und die Cursor-Zeile erscheint
dort ohnehin nicht.
**Nachgemessen** im Browser: Cursor auf einem gedimmten Knoten → `opacity 1`,
Ring vollständig im `box-shadow`, Wasch-Gradient gesetzt, Text
`rgba(36,52,71,.35)`, Kind-Badge 0,32; der gedimmte Nachbarknoten unverändert
(0,32, kein Wasch); Cursor auf einem Pfad-Knoten → kein Wasch, volle Farbe,
Ring wie immer. Reine CSS-Änderung, keine testbare Regel (dieselbe Grenze wie
bei aller Knoten-Optik).
## D26 — Legende scrollbar: eigener Container statt `<details>`, plus Splitter ## D26 — Legende scrollbar: eigener Container statt `<details>`, plus Splitter
Die Legende („Agenda") im Editor-Panel war zu hoch für ihren Platz und wurde Die Legende („Agenda") im Editor-Panel war zu hoch für ihren Platz und wurde
**abgeschnitten** statt scrollbar zu sein — obwohl `.hint` seit jeher **abgeschnitten** statt scrollbar zu sein — obwohl `.hint` seit jeher
+26 -10
View File
@@ -911,16 +911,32 @@
der wahrscheinlichsten Gründe, überhaupt zu zeigen. Anders als beim der wahrscheinlichsten Gründe, überhaupt zu zeigen. Anders als beim
optionalen Knoten (D29), wo das Zurücktreten die Aussage IST. */ optionalen Knoten (D29), wo das Zurücktreten die Aussage IST. */
.cheap-on .node:not(.cheap).focusmark{opacity:1;filter:none} .cheap-on .node:not(.cheap).focusmark{opacity:1;filter:none}
/* Und dasselbe für die Cursor-Zeile (D25-Nachtrag) — die Ausnahme fehlte hier /* Die Cursor-Zeile auf einem zurückgetretenen Knoten (D25-Nachtrag 4): Nur
als einzige, obwohl der Fall der häufigste ist: Der Umschalter ist der RING wird hervorgehoben, die Füllung bleibt blass. Die erste Fassung
voreingestellt an, und jeder optionale Knoten und jede nicht gewählte stellte den ganzen Knoten auf volle Stärke — dann verlor er beim bloßen
Alternative ist „nicht auf dem Pfad" (im mitgelieferten Beispiel 7 von 18 Hineinsetzen des Cursors seine Pfad-Aussage („nicht nötig"). Ganz gedimmt
Knoten). Gemessen auf `+ [?] Dark mode`: Deckkraft 0,32 — der Ring war dort lassen geht aber auch nicht: opacity/filter am Element treffen den
praktisch unsichtbar. Wo der Cursor steht, muss sichtbar bleiben, egal wie box-shadow mit, der Ring wäre unsichtbar (der ursprüngliche D25-Befund).
der Pfad entschieden hat; anders als beim optionalen Knoten (D29), wo das Deshalb bleibt der Knoten voll deckend, und die Blässe wird NACHGEBILDET:
Zurücktreten die Aussage IST, ist hier gar keine Aussage über den Plan - background-image legt einen Papier-Wasch (68 %) ÜBER die Statusfarbe —
gemeint — es ist eine Editierhilfe. */ rechnerisch dasselbe wie 0,32 Deckkraft über dem hellen Grund;
.cheap-on .node:not(.cheap).current{opacity:1;filter:none} - Text- und Rahmenfarbe wechseln auf das gedimmte Grau (der Unterschied
der acht Status-Rahmenfarben ist bei 0,32 ohnehin nicht mehr zu sehen);
- die Kinder (Badges, Pillen, Chips) dimmen einzeln per opacity — genau
so, wie es vorher die Element-Deckkraft tat. `.ext` ist ausgenommen:
es erbt die schon gefadete Textfarbe und wäre sonst doppelt gedimmt.
fresh/focusmark/done sind ausgeschlossen — deren Ausnahmen (volle Stärke)
haben je eigene Gründe und gelten weiter. Der Puls-Ring (::after) und der
Schlagschatten bleiben unberührt in voller Stärke. */
.cheap-on .node:not(.cheap):not(.fresh):not(.focusmark):not(.done).current{
opacity:1;filter:none;
background-image:linear-gradient(rgba(243,246,249,.68),rgba(243,246,249,.68));
border-color:rgba(107,122,140,.4);
color:rgba(36,52,71,.35);
}
.cheap-on .node:not(.cheap):not(.fresh):not(.focusmark):not(.done).current > :not(.ext){
opacity:.32;filter:saturate(.4);
}
/* Erledigtes tritt NIE zurück (D46-Nachtrag). D46 hatte das schon entschieden /* Erledigtes tritt NIE zurück (D46-Nachtrag). D46 hatte das schon entschieden
— „sie auszublassen hieße, sie sähen aus wie eine verworfene Alternative" —, — „sie auszublassen hieße, sie sähen aus wie eine verworfene Alternative" —,
die Regel griff aber nur für erledigte Knoten AUF dem Pfad. Ein fertiger die Regel griff aber nur für erledigte Knoten AUF dem Pfad. Ein fertiger