From 96a91ed8dd31d6928c42cf7540365264cdbfb18f Mon Sep 17 00:00:00 2001 From: Alexander Bocken Date: Fri, 13 Feb 2026 12:56:33 +0100 Subject: [PATCH] rosary: progressive enhancement for no-JS browsers SVG beads are now anchor links to prayer sections, with CSS :has(:target) highlighting the active bead. Inline mystery images render in each decade by default and hide when JS takes over. StreakCounter uses a form action fallback for logged-in users and hides entirely for anonymous no-JS users. Show images toggle now works via ?images= URL param like the other toggles. --- src/lib/components/faith/StreakCounter.svelte | 40 ++++--- .../[rosary=rosaryLang]/+page.server.ts | 41 ++++++- .../[rosary=rosaryLang]/+page.svelte | 102 ++++++++++++++++-- .../[rosary=rosaryLang]/RosarySvg.svelte | 30 +++--- .../[rosary=rosaryLang]/rosaryScrollSync.js | 2 + 5 files changed, 177 insertions(+), 38 deletions(-) diff --git a/src/lib/components/faith/StreakCounter.svelte b/src/lib/components/faith/StreakCounter.svelte index 2a1443a..34f01e1 100644 --- a/src/lib/components/faith/StreakCounter.svelte +++ b/src/lib/components/faith/StreakCounter.svelte @@ -10,9 +10,10 @@ let streak = $state | null>(null); interface Props { streakData?: { length: number; lastPrayed: string | null } | null; lang?: 'de' | 'en'; + isLoggedIn?: boolean; } -let { streakData = null, lang = 'de' }: Props = $props(); +let { streakData = null, lang = 'de', isLoggedIn = false }: Props = $props(); const isEnglish = $derived(lang === 'en'); @@ -42,23 +43,25 @@ async function pray() { } -
+
{labels.days}
- +
{ e.preventDefault(); pray(); }}> + +