feat(diagram): Personen-Leiste mit Personen-Linse und Belastungsanzeige (D87)

Je @Person eine Pille mit Anteil an der offenen Pfad-Arbeit (D71-Maß),
dazu ein Eintrag für Unzugewiesenes — die Anteile summieren auf 100 %.
Ein Tipp filtert das Diagramm auf die Knoten der Person: alles andere
faltet, ihre Pakete stehen als ▸ n, die Pillen färben petrol. Die Linse
ist rein Ansicht und Sitzungssache — in den Text wird nichts geschrieben,
in geteilten Dokumenten ginge der persönliche Filter sonst an alle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-27 10:38:53 +02:00
co-authored by Claude Fable 5
parent 1e1a00f794
commit deec39e82a
10 changed files with 439 additions and 7 deletions
+6 -1
View File
@@ -208,8 +208,13 @@ function nodeHtml(n, extra, opts, fold){
Nur direkte Tags haben eine Pille; geerbte Zuständigkeit (die in die
Rechnung eingeht) hat nichts, das sich färben ließe. */
const hot = tag => opts.overloadTag === tag && opts.cheapSet.has(n) && !isDone(n);
/* Personen-Linse (SPEC §9/D87): die Pille der gewählten Person hebt sich in
Petrol — sie sagt, WELCHE der sichtbaren Knoten gemeint sind (nicht
faltbare Geschwister bleiben ja stehen). Die Warnfarbe des Engpasses
gewinnt: eine Warnung wiegt schwerer als eine Auswahl. */
const pillCls = tag => hot(tag) ? ' overload' : (opts.lensTag === tag ? ' lens' : '');
const tagsHtml = n.tags && n.tags.length
? `<span class="tags" aria-hidden="true">${n.tags.map(tag => `<span class="tag${hot(tag) ? ' overload' : ''}">${esc(tag)}</span>`).join('')}</span>`
? `<span class="tags" aria-hidden="true">${n.tags.map(tag => `<span class="tag${pillCls(tag)}">${esc(tag)}</span>`).join('')}</span>`
: '';
/* Das implizite Größen-Badge macht eine KOSTENANNAHME sichtbar (D18) —
seit D66 die aus den Teilpaketen geschätzte Größe statt pauschal M. An