Interaktive Bubble-/Cluster-Visualisierung (Svelte + D3) für mentale Aufgaben („Mental Load“) mit Main-Nodes (Aufgaben) und Sub-Nodes (Teilaufgaben/Steps).
Optimiert für den Einsatz im News-Umfeld: schnell, robust, responsive (width: 100% + feste Höhe) und mit dezenten Animationen (CSS-Intro + optionaler Wiggle).
IntersectionObserver)prefers-reduced-motion@faz/dv-globals^7.9.0@faz/dv-globalsnpm install
Startet den lokalen Dev-Server (Vite):
npm run dev
Standard Build:
npm run build
Preview des Build-Outputs:
npm run preview
Builds für verschiedene Umgebungen/Modes:
npm run test
npm run stage
npm run production
npm run release
Hinweis:
production/releasesind aktuell Aliase fürvite buildbzw.vite build --mode ….
lib/
MentalBubbles.svelte
viz/
types.ts
utils.ts
forces.ts
intro.ts
wiggle.ts
chain.ts
Die
lib/viz/*-Module kapseln die Logik (Forces, Intro-Delays, Wiggle), die Svelte-Komponente bleibt der Orchestrator (Mount/Resize/Render).
Die wichtigsten Stellschrauben liegen in MentalBubbles.svelte (oder in einem zentralen Config-Objekt, falls ihr das so organisiert):
CLUSTER_BASE_RADIUS, CLUSTER_STEP_RADIUSCLUSTER_FORCE_STRENGTHforceCollide().radius(...), .iterations(...)MIN_MAIN_SUB_DISTANCEINTRO_NODE_DURATION, Stagger/Jitter (in viz/intro.ts)FLOAT_FPS_BASE, FLOAT_AMP_MAIN, FLOAT_AMP_SUBviz/wiggle.ts)viz/chain.ts)Die Komponente erwartet tasks als Array:
type Task = {
id: number;
label: string;
subs: (string | string[])[];
};
subs: string → einzelner Subnodesubs: string[] → Kette (Sub → Sub → Sub …)Beispiel:
const tasks = [
{
id: 1,
label: "Familienkalender: Geburtstag",
subs: ["Einladungen", ["Termin finden", "Ort klären", "Eintragen"], "Geschenk"],
},
];
prefers-reduced-motion: reduce deaktiviert Intro-Animation und Wiggle (oder reduziert sie, je nach Implementierung).pointer-events: none) und folgt der Maus; optional kann man ARIA ergänzen, falls erforderlich.