Commit Graph

561 Commits

Author SHA1 Message Date
Alexander 56e3bd1791 cospend: filter recent activity by chart category selection
Clicking a category on the bar chart now filters the recent activity
list to show only payments in that category. Includes a clear filter
button and empty state message. Also increases recent splits from 10
to 30 for better coverage when filtering.
2026-02-04 16:57:49 +01:00
Alexander fb215156af fix: remove Svelte 4 object reassignment causing $effect infinite loop
The splitAmounts = { ...splitAmounts } pattern created a circular
dependency inside $effect blocks—reading and writing the same reactive
value—which Svelte 5 killed via loop protection, leaving the split
method selector non-reactive when selecting "50/50 + personal".
2026-02-04 16:52:12 +01:00
Alexander 9826ff8480 faith: progressive enhancement for all faith pages without JS
- Rosary: mystery selection, luminous toggle, and latin toggle fall back
  to URL params (?mystery=, ?luminous=, ?latin=) for no-JS navigation
- Prayers/Angelus: latin toggle uses URL param fallback
- Search on prayers page hidden without JS (requires DOM queries)
- Toggle component supports href prop for link-based no-JS self-submit
- LanguageSelector uses <a> links with computed paths and :focus-within
  dropdown for no-JS; displays correct language via server-provided prop
- Recipe language links use translated slugs from $page.data
- URL params cleaned via replaceState after hydration to avoid clutter
2026-02-04 14:14:13 +01:00
Alexander 9054d3935e fix: use accent-dark with nord5 light override for prayer backgrounds
var(--color-bg-secondary) from app.css is not available since app.css
is never imported. Use var(--accent-dark) from nordtheme.css with
explicit light mode overrides using var(--nord5).
2026-02-04 13:05:08 +01:00
Alexander 813c938f26 fix: use semantic color for prayer section backgrounds in light mode
Replace var(--accent-dark) with var(--color-bg-secondary) which maps
to the correct color in both modes, removing dead @media overrides
that referenced the undefined var(--accent-light). Also match rosary
cross fill to Benedictus medal color in light mode.
2026-02-04 13:01:54 +01:00
Alexander 536ae907a7 rosary: inline cross glyph as SVG path for consistent rendering
Replace <text> elements using the crosses web font with inlined SVG
paths extracted from the font file. Web fonts in SVG <text> elements
don't load reliably on Android, causing fallback rendering.
2026-02-04 12:09:00 +01:00
Alexander 8a74bda83a rosary: derive SVG bead positions from sectionPositions dictionary
Use sectionPositions as single source of truth for all bead coordinates.
Compute transition bead positions as midpoints between decades, generate
decade beads and hitboxes via loops, and adjust bead spacing.
2026-02-04 12:04:08 +01:00
Alexander c5744780f3 rosary: split final prayers into individual bead sections with scroll tracking
Map each ending bead to its corresponding prayer (Gloria/Fatima,
Salve Regina, Schlussgebet, St. Michael, Paternoster, Sign of the Cross),
add scroll-to-top button with action_button styling, and fix SVG scroll
lock to prevent snap-back when scrolling to top.
2026-02-04 11:18:54 +01:00
Alexander d098d8bf01 rosary: progressively shrink mystery selectors instead of stacking on small screens 2026-02-04 10:03:58 +01:00
Alexander 72d924cc7c rosary: reduce bundle size and improve responsive layout
Remove redundant CSS already handled by Prayer.svelte, drop unused
rosenkranz.css import, and replace inline BenedictusMedal component
(34KB, ~52 DOM elements) with a static SVG referenced via <image>.
Use fluid sidebar width (clamp) for smoother desktop/mobile transition.
2026-02-03 20:51:32 +01:00
Alexander ac4c03e5f8 rosary: fix mystery selection lost when excluding luminous
The on:change handler on the Toggle component was silently ignored
since Toggle is a Svelte 5 component that doesn't support the Svelte 4
event directive. Replace with a reactive $effect that reverts to
today's mystery when luminous is excluded while selected.
2026-02-03 15:01:53 +01:00
Alexander 480b0d687b rosary: fix today badge z-index 2026-02-03 14:48:47 +01:00
Alexander 3eccb7ca50 perf: pre-generate Bible verse data and reduce DOM via conditional rendering
- Extract Bible lookup logic into shared src/lib/server/bible.ts module
- Add build script to pre-generate all 20 mystery verse lookups as static data,
  eliminating runtime API calls on rosary page load
- Update Prayer.svelte to pass showLatin/urlLang as snippet parameters; all 14
  prayer components now conditionally render only visible language elements
  instead of hiding via CSS
- Extract 4 inline mystery selector SVGs into MysteryIcon.svelte component
- Remove unused CSS selectors from angelus page
2026-02-03 14:28:09 +01:00
Alexander ca0f78c9ff fix: remove default figure margin shifting parallax hero image 2026-02-03 08:27:43 +01:00
Alexander c1be1c73ff fix: apply border-radius directly on card images for older WebKit 2026-02-03 08:21:55 +01:00
Alexander 191ee1f138 fix: center parallax hero image cross-browser
Replace Firefox-specific @supports hack with explicit absolute
centering (left/right/margin-inline: auto) on the image container.
2026-02-03 08:18:36 +01:00
Alexander 91686a6841 rosary: add SVG hitboxes for easier bead tapping on mobile 2026-02-03 08:14:50 +01:00
Alexander bdd68cc293 streak: replace burst flame with rising particle effect
Rework the burst mode in FireEffect to use 24 data-driven particles
instead of the old scale-and-pop flame. Each particle has unique
position, size, delay, and duration for an organic rising effect.
Latch burst state in StreakAura so the animation plays its full
duration regardless of when the parent resets the prop.
2026-02-03 08:01:00 +01:00
Alexander 8587059473 angelus: align styling with other faith routes 2026-02-02 23:13:02 +01:00
Alexander b2971dc5bc rosary: add missing saint Michael prayer 2026-02-02 23:08:20 +01:00
Alexander 68811b2abd angelus: add missing Ave Maria 2026-02-02 22:59:11 +01:00
Alexander 6ab6d3f0a5 prayers: add angelus link 2026-02-02 22:51:51 +01:00
Alexander acfbd0ed9d prayers: add search and individual prayer pages
- Add SearchInput component for reusable search UI
- Add search functionality to prayers list with two-tier results:
  - Primary matches (name/searchTerms) shown first
  - Secondary matches (text content) shown after with reduced opacity
- Add individual prayer pages with language-appropriate slugs
  (e.g., /glaube/gebete/ave-maria, /faith/prayers/hail-mary)
- Make prayer cards clickable to navigate to individual pages
- Fix language visibility for prayers without Latin (BruderKlaus, Joseph)
- Add Prayer wrapper to MichaelGebet for consistent styling
- Use CSS columns for masonry layout with dynamic reordering
2026-02-02 22:22:56 +01:00
Alexander 32d68fbbe7 move glaube higher up in main LinksGrid 2026-02-02 20:47:10 +01:00
Alexander 7412bf3bdc prayers: bow-emphasis only for main language 2026-02-02 20:39:11 +01:00
Alexander 19757f3561 angelus: cleaner and now in Header 2026-02-02 16:59:25 +01:00
Alexander ce4c9cf71e prayers: add English translations for all prayer components
Add official Catholic English translations to all prayer components
for /faith/* routes. Prayer names on /faith/prayers are now displayed
in English. Remove unused Angelus.svelte component.
2026-02-02 16:39:40 +01:00
Alexander 4b9dff2f25 faith: add bilingual routes /glaube ↔ /faith
Add language toggle support for faith pages similar to recipes.
Routes now work in both German and English:
- /glaube ↔ /faith
- /glaube/gebete ↔ /faith/prayers
- /glaube/rosenkranz ↔ /faith/rosary
- /glaube/angelus ↔ /faith/angelus
2026-02-02 16:15:51 +01:00
Alexander 911948ba20 rosary: clean up unused CSS, fix unclosed tag
- FireEffect now only contains fire-related styles
- StreakAura now only contains aura, number, halo, wing styles
- Fix unclosed <i> tags in JosephGebet.svelte
2026-02-01 14:12:18 +01:00
Alexander 5d7d86bff9 rosary: server-side streak fetch, remove aggressive polling
- Fetch streak data in +page.server.ts for logged-in users via API
- Initialize store once with server data, sync only runs once
- Only poll for reconnection in PWA mode when offline with pending changes
- Extract FireEffect to separate component with burst animation
- Convert StreakAura/StreakCounter to Svelte 5 runes ($props, $state, $derived)
- Fix SSR flash by using server data for initial render
2026-02-01 13:50:33 +01:00
Alexander 8976940537 rosary: cleaner light mode 2026-01-31 16:12:18 +01:00
Alexander 89d1872ae3 rosary: light/dark mode benedicturs medal 2026-01-31 16:09:21 +01:00
Alexander 64dbce1d45 rosary: fade-in shadow removed 2026-01-31 15:53:59 +01:00
Alexander eee2e051cc glaube: add ⚬ to mary and jesus in prayers 2026-01-31 15:15:49 +01:00
Alexander f6383837a7 glaube: gone woke 2026-01-31 14:59:07 +01:00
Alexander 55406e5d21 rosary: glow animation earlier, embers before full fire 2026-01-31 12:20:35 +01:00
Alexander fa254da440 rosary: stylized StreakCounter dependant on length 2026-01-31 10:56:29 +01:00
Alexander 7824c97e0e remove jukit garbage 2026-01-31 10:12:45 +01:00
Alexander 9e68f6d6d7 rosary: less colourful mystery selector 2026-01-30 15:47:58 +01:00
Alexander f7b84f076f rosary: StreakCounter singular Tag for length==1 2026-01-30 15:41:20 +01:00
Alexander 55630589e5 rosary: cleanup 2026-01-30 15:36:13 +01:00
Alexander 156f20bc3b fix logged in state broken on rosary due to prerendering 2026-01-30 12:47:28 +01:00
Alexander 8a56661d31 feat: add server persistence for rosary streak
- Add RosaryStreak MongoDB model for logged-in users
- Add /api/glaube/rosary-streak GET/POST endpoints
- Sync streak to server when logged in, merge local/server data
- Auto-sync when coming back online (PWA offline support)
- Falls back to localStorage for guests
2026-01-30 12:37:01 +01:00
Alexander 1b73032305 feat: add streak counter to rosary page
Track daily rosary prayer streaks using localStorage. Shows consecutive
days prayed and disables button if already prayed today.
2026-01-30 12:36:55 +01:00
Alexander 6c45aa8438 prayers: add Confiteor 2026-01-30 08:40:29 +01:00
Alexander fc8b2c1204 refactor: reduce all_brief payload to first image's alt and mediapath
Only include the necessary image fields for Card.svelte instead of
the entire images array to reduce API response size.
2026-01-29 14:22:57 +01:00
Alexander ec02e8873e ci: clear Redis recipe cache on deploy
Ensures fresh data is fetched after deployments when API projections
or data structures change.
2026-01-29 14:04:36 +01:00
Alexander f501d0c7eb fix: include images in all_brief API endpoints
Card.svelte uses recipe.images[0].mediapath for the hashed image path,
but the all_brief endpoints weren't fetching the images field, causing
new recipes to fall back to short_name.webp instead of the correct path.
2026-01-29 13:40:33 +01:00
Alexander 5e7f441e3b fix: include images and translations in offline-db brief recipes
The offline sync wasn't caching thumbnails because the images field
was missing from the MongoDB projection. Also add translations for
caching English recipe __data.json URLs.
2026-01-29 10:18:23 +01:00
Alexander 82732521b6 feat: add sync progress tracking with image download status
- Service worker reports image caching progress back to main thread
- Sync progress shows current phase (recipes, pages, data, images)
- Display progress bar for image downloads in sync tooltip
- Use mediapath for thumbnail URLs (with hash for cache busting)
- Serve cached thumbnails as fallback for full/placeholder when offline
2026-01-29 10:18:02 +01:00