diff --git a/src/lib/components/FireEffect.svelte b/src/lib/components/FireEffect.svelte
new file mode 100644
index 0000000..481dd1f
--- /dev/null
+++ b/src/lib/components/FireEffect.svelte
@@ -0,0 +1,376 @@
+
+
+
+
+
+
diff --git a/src/lib/components/StreakAura.svelte b/src/lib/components/StreakAura.svelte
index c888a9e..d09d9cd 100644
--- a/src/lib/components/StreakAura.svelte
+++ b/src/lib/components/StreakAura.svelte
@@ -1,13 +1,21 @@
=4}>
@@ -33,36 +41,13 @@
{/if}
-{#if phase >= 2}
-
-
- {#if phase >= 3}
-
- {/if}
-
-
+ {#if phase >= 2}
+
=4} />
+ {/if}
-
- {#if phase >= 3}
-
- {/if}
-
-
-
-
- {#if phase >= 3}
-
- {/if}
-
-
-
-
- {#if phase >= 3}
-
- {/if}
-
-
-{/if}
+ {#if burst}
+
=4} burst />
+ {/if}
{value}
diff --git a/src/lib/components/StreakCounter.svelte b/src/lib/components/StreakCounter.svelte
index 8a99435..391b889 100644
--- a/src/lib/components/StreakCounter.svelte
+++ b/src/lib/components/StreakCounter.svelte
@@ -2,37 +2,47 @@
import { browser } from '$app/environment';
import { getRosaryStreak } from '$lib/stores/rosaryStreak.svelte';
import StreakAura from '$lib/components/StreakAura.svelte';
+import { tick, onMount } from 'svelte';
+let burst = $state(false);
+let streak = $state | null>(null);
interface Props {
- user?: { nickname?: string } | null;
+ streakData?: { length: number; lastPrayed: string | null } | null;
}
-let { user = null }: Props = $props();
+let { streakData = null }: Props = $props();
-const streak = browser ? getRosaryStreak() : null;
+// Derive display values: use store when available, fall back to server data for SSR
+let displayLength = $derived(streak?.length ?? streakData?.length ?? 0);
+let prayedToday = $derived(streak?.prayedToday ?? (streakData?.lastPrayed === new Date().toISOString().split('T')[0]));
-
-// Sync with server when user is logged in
-$effect(() => {
- if (browser && streak) {
- streak.setLoggedIn(!!user?.nickname);
- }
+// Initialize store on mount (client-side only)
+onMount(() => {
+ streak = getRosaryStreak();
+ streak.initWithServerData(streakData, streakData !== null);
});
+
+async function pray() {
+ burst = true;
+ await tick();
+ setTimeout(() => burst = false, 700);
+ streak?.recordPrayer();
+}
-
- Tag{#if streak?.length !== 1}e{/if}
+
+ Tag{#if displayLength !== 1}e{/if}