From 9d1d58016649d9fec7eb7f2e89a4f80216edb1e6 Mon Sep 17 00:00:00 2001 From: mhoennig Date: Thu, 27 Aug 2026 09:54:55 +0200 Subject: [PATCH] =?UTF-8?q?fix(diagram):=20Cursor-Zeile=20l=C3=A4sst=20zur?= =?UTF-8?q?=C3=BCckgetretene=20Knoten=20blass=20(D25-Nachtrag=204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- docs/CHANGELOG.md | 1 + docs/DECISIONS.md | 41 +++++++++++++++++++++++++++++++++++++++++ frontend/src/style.css | 36 ++++++++++++++++++++++++++---------- 3 files changed, 68 insertions(+), 10 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c7cc72a..285d33b 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -19,6 +19,7 @@ reverse. ## 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 - 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 diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 16cfbc9..efec505 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -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 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 `
`, plus Splitter Die Legende („Agenda") im Editor-Panel war zu hoch für ihren Platz und wurde **abgeschnitten** statt scrollbar zu sein — obwohl `.hint` seit jeher diff --git a/frontend/src/style.css b/frontend/src/style.css index 25a637c..2aa3afd 100644 --- a/frontend/src/style.css +++ b/frontend/src/style.css @@ -911,16 +911,32 @@ der wahrscheinlichsten Gründe, überhaupt zu zeigen. Anders als beim optionalen Knoten (D29), wo das Zurücktreten die Aussage IST. */ .cheap-on .node:not(.cheap).focusmark{opacity:1;filter:none} - /* Und dasselbe für die Cursor-Zeile (D25-Nachtrag) — die Ausnahme fehlte hier - als einzige, obwohl der Fall der häufigste ist: Der Umschalter ist - voreingestellt an, und jeder optionale Knoten und jede nicht gewählte - Alternative ist „nicht auf dem Pfad" (im mitgelieferten Beispiel 7 von 18 - Knoten). Gemessen auf `+ [?] Dark mode`: Deckkraft 0,32 — der Ring war dort - praktisch unsichtbar. Wo der Cursor steht, muss sichtbar bleiben, egal wie - der Pfad entschieden hat; anders als beim optionalen Knoten (D29), wo das - Zurücktreten die Aussage IST, ist hier gar keine Aussage über den Plan - gemeint — es ist eine Editierhilfe. */ - .cheap-on .node:not(.cheap).current{opacity:1;filter:none} + /* Die Cursor-Zeile auf einem zurückgetretenen Knoten (D25-Nachtrag 4): Nur + der RING wird hervorgehoben, die Füllung bleibt blass. Die erste Fassung + stellte den ganzen Knoten auf volle Stärke — dann verlor er beim bloßen + Hineinsetzen des Cursors seine Pfad-Aussage („nicht nötig"). Ganz gedimmt + lassen geht aber auch nicht: opacity/filter am Element treffen den + box-shadow mit, der Ring wäre unsichtbar (der ursprüngliche D25-Befund). + Deshalb bleibt der Knoten voll deckend, und die Blässe wird NACHGEBILDET: + - background-image legt einen Papier-Wasch (68 %) ÜBER die Statusfarbe — + rechnerisch dasselbe wie 0,32 Deckkraft über dem hellen Grund; + - 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 — „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