Commit Graph

501 Commits

Author SHA1 Message Date
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
Alexander 0d5eb577df feat: auto-sync recipes and show sync button only in PWA mode
- Auto-sync recipes every 30 minutes when online in PWA mode
- Only show offline sync button when running as installed PWA
- Detect standalone mode via display-mode media query and iOS check
- Trigger initial sync on PWA install (appinstalled event)
- Listen for online event to sync when coming back online
- Store last sync time in localStorage to track sync intervals
2026-01-29 09:58:03 +01:00
Alexander 374bb6dcc4 feat: extend PWA offline support to all recipe routes and glaube pages
- Add offline support for category, tag, icon list pages
- Add offline support for favorites page (stores locally for offline)
- Add offline support for season list page
- Cache root page and glaube pages for offline access
- Dynamically discover glaube routes at build time using Vite glob
- Add db functions for getAllCategories, getAllTags, getAllIcons
- Pre-cache __data.json for all category, tag, icon, season subroutes
- Update service worker to cache glaube and root page responses
2026-01-29 09:57:58 +01:00
Alexander be9a8dad16 feat: add PWA offline support for recipe pages
- Add service worker with caching for build assets, static files, images, and pages
- Add IndexedDB storage for recipes (brief and full data)
- Add offline-db API endpoint for bulk recipe download
- Add offline sync button component in header
- Add offline-shell page for direct navigation fallback
- Pre-cache __data.json for client-side navigation
- Add +page.ts universal load functions with IndexedDB fallback
- Add PWA manifest and icons for installability
- Update recipe page to handle missing data gracefully
2026-01-28 21:38:33 +01:00
Alexander 14d217720a fix: update DeepL API to header-based authentication
DeepL deprecated form-body authentication (auth_key in request body).
Now using Authorization header as required by the API.
2026-01-28 15:09:54 +01:00
Alexander ff7ecb1d64 fix latin Fatima to P. Ramm's Ordo Missæ 2026-01-26 21:40:25 +01:00
Alexander 97a0c9d8a9 perf: preload crosses font on glaube pages
Add preload hint to fetch the crosses.woff2 font early,
improving First Contentful Paint on /glaube routes.
2026-01-26 10:35:04 +01:00
Alexander 2d3ce6986a refactor: remove duplicate crosses font-face declaration
The crosses font is already defined in app.css which loads globally,
so the duplicate in rosenkranz.css is unnecessary.
2026-01-26 10:32:33 +01:00
Alexander 356890420a refactor: replace shadow span with box-shadow on button_wrapper
Remove separate .button_wrapper_shadow element and apply box-shadow
directly to .button_wrapper in mobile view. Reduces DOM by 1 node.
2026-01-25 20:50:43 +01:00
Alexander e9f18d40a2 refactor: reduce DOM nesting and simplify templates
- Remove nested .wrapper div in recipe page using CSS Grid with full-bleed background
- Consolidate multiplier forms in IngredientsPage into single form
- Simplify fermentation conditionals in InstructionsPage with optional chaining
- Use conditional rendering instead of visibility wrapper in Search
- Remove unnecessary dialog wrapper in TitleImgParallax
2026-01-25 20:24:48 +01:00
Alexander baaaa630d5 refactor: simplify Card HTML and extract search filter composable
- Remove unnecessary wrapper divs in Card component (.card_anchor, .div_div_image)
- Flatten Card HTML from 4 levels to 2 levels of nesting
- Create reusable createSearchFilter composable in $lib/js/searchFilter.svelte.ts
- Apply search filter composable to category, tag, and favorites pages
2026-01-25 14:48:55 +01:00