From 23dac3272e96ace8c838e85e2d8ade6514b6879d Mon Sep 17 00:00:00 2001 From: Till JS Date: Tue, 24 Mar 2026 22:21:04 +0100 Subject: [PATCH] feat(observatory): add tooltips, detail panel, radar chart, and atmosphere Phase 5 - Interactivity: - Hover tooltip with score, status, category bars on every plant - Click opens slide-in detail panel with 8-axis radar chart - Panel shows all category scores, app links, ManaScore link - Escape key and backdrop click close the panel - Pan vs click distinction (no panel on drag) Phase 6 - Atmosphere: - Dynamic sky that follows real time of day (sunrise/noon/sunset/night) - Stars with twinkling animation at night - Sun glow during golden hour - Birds flying across the scene (daytime) - Dragonflies circling over lakes - Butterflies near plants - Fireflies at night (glowing, drifting) - Time updates every minute Co-Authored-By: Claude Opus 4.6 (1M context) --- .../observatory/SeenplatteScene.svelte | 88 +++-- .../observatory/atmosphere/Ambient.svelte | 126 +++++++ .../observatory/atmosphere/Sky.svelte | 83 +++++ .../observatory/terrain/Background.svelte | 15 +- .../observatory/ui/DetailPanel.svelte | 332 ++++++++++++++++++ .../observatory/ui/PlantTooltip.svelte | 176 ++++++++++ .../observatory/ui/RadarChart.svelte | 120 +++++++ .../src/routes/(app)/observatory/+page.svelte | 16 +- 8 files changed, 906 insertions(+), 50 deletions(-) create mode 100644 apps/manacore/apps/web/src/lib/components/observatory/atmosphere/Ambient.svelte create mode 100644 apps/manacore/apps/web/src/lib/components/observatory/atmosphere/Sky.svelte create mode 100644 apps/manacore/apps/web/src/lib/components/observatory/ui/DetailPanel.svelte create mode 100644 apps/manacore/apps/web/src/lib/components/observatory/ui/PlantTooltip.svelte create mode 100644 apps/manacore/apps/web/src/lib/components/observatory/ui/RadarChart.svelte diff --git a/apps/manacore/apps/web/src/lib/components/observatory/SeenplatteScene.svelte b/apps/manacore/apps/web/src/lib/components/observatory/SeenplatteScene.svelte index 226d8b22b..e694446b2 100644 --- a/apps/manacore/apps/web/src/lib/components/observatory/SeenplatteScene.svelte +++ b/apps/manacore/apps/web/src/lib/components/observatory/SeenplatteScene.svelte @@ -1,21 +1,36 @@ + + +{#if !isNight} + {#each birds as bird} + + + + + + + + {/each} + + + {#each dragonflies as df} + + + + + + + {/each} +{/if} + + +{#if isNight} + {#each fireflies as ff} + + + + + + {/each} +{/if} + + +{#if !isNight} + + + + + + + + + + +{/if} diff --git a/apps/manacore/apps/web/src/lib/components/observatory/atmosphere/Sky.svelte b/apps/manacore/apps/web/src/lib/components/observatory/atmosphere/Sky.svelte new file mode 100644 index 000000000..545aeea90 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/components/observatory/atmosphere/Sky.svelte @@ -0,0 +1,83 @@ + + + + + + + + + + + + +{#if isNight} + + {#each Array(35) as _, i} + {@const sx = (i * 137 + 42) % SCENE.width} + {@const sy = (i * 89 + 17) % 250} + {@const sr = 0.5 + (i % 3) * 0.4} + + + + {/each} + +{/if} + + +{#if isDusk} + + + + +{/if} diff --git a/apps/manacore/apps/web/src/lib/components/observatory/terrain/Background.svelte b/apps/manacore/apps/web/src/lib/components/observatory/terrain/Background.svelte index 4744cb934..45c4f2167 100644 --- a/apps/manacore/apps/web/src/lib/components/observatory/terrain/Background.svelte +++ b/apps/manacore/apps/web/src/lib/components/observatory/terrain/Background.svelte @@ -1,15 +1,12 @@ - - - - - - @@ -19,8 +16,8 @@ - - + + diff --git a/apps/manacore/apps/web/src/lib/components/observatory/ui/DetailPanel.svelte b/apps/manacore/apps/web/src/lib/components/observatory/ui/DetailPanel.svelte new file mode 100644 index 000000000..a588baa02 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/components/observatory/ui/DetailPanel.svelte @@ -0,0 +1,332 @@ + + + + +{#if app} + + + +
+ +
+
+

{app.displayName}

+ + {statusLabels[app.status]} + +
+
+ {app.score} +
+
+ + +
+
+
+ + +
+ +
+ +
+
+ + +
+
+ {#each Object.entries(app.categories) as [key, value]} +
+ {key} +
+
+
+ {value} +
+ {/each} +
+
+ + +
+ +
+ + + +
+{/if} + + diff --git a/apps/manacore/apps/web/src/lib/components/observatory/ui/PlantTooltip.svelte b/apps/manacore/apps/web/src/lib/components/observatory/ui/PlantTooltip.svelte new file mode 100644 index 000000000..b3e8c91af --- /dev/null +++ b/apps/manacore/apps/web/src/lib/components/observatory/ui/PlantTooltip.svelte @@ -0,0 +1,176 @@ + + +
+
+ {app.displayName} + {app.score} +
+
+ + {statusLabels[app.status]} + + + {healthIcons[app.health]} + + {#if app.trend !== 0} + 0} class:negative={app.trend < 0}> + {app.trend > 0 ? '+' : ''}{app.trend} + + {/if} +
+
+ {#each Object.entries(app.categories) as [key, value]} +
+ {key} +
+
+
+ {value} +
+ {/each} +
+
+ + diff --git a/apps/manacore/apps/web/src/lib/components/observatory/ui/RadarChart.svelte b/apps/manacore/apps/web/src/lib/components/observatory/ui/RadarChart.svelte new file mode 100644 index 000000000..725377545 --- /dev/null +++ b/apps/manacore/apps/web/src/lib/components/observatory/ui/RadarChart.svelte @@ -0,0 +1,120 @@ + + + + + {#each rings as ring} + + {/each} + + + {#each axes as axis} + + {/each} + + + + + + {#each dataPoints as point} + + {/each} + + + {#each labelPositions as lp} + + {lp.label} + + {/each} + diff --git a/apps/manacore/apps/web/src/routes/(app)/observatory/+page.svelte b/apps/manacore/apps/web/src/routes/(app)/observatory/+page.svelte index f9bd616c9..0c82e6a73 100644 --- a/apps/manacore/apps/web/src/routes/(app)/observatory/+page.svelte +++ b/apps/manacore/apps/web/src/routes/(app)/observatory/+page.svelte @@ -1,23 +1,9 @@
- +
- - {#if selectedApp} -
-

- Selected: {selectedApp} — Detail panel coming in Phase 5 -

-
- {/if}