Commit Graph

472 Commits

Author SHA1 Message Date
ac4c00a082 refactor: merge api/recipes and api/rezepte into unified recipeLang route
Consolidate duplicate recipe API routes into a single
api/[recipeLang=recipeLang]/ structure. Both /api/recipes/ and
/api/rezepte/ URLs continue to work via the param matcher. Shared
read endpoints now serve both languages with caching for both.

Also: remove dead code (5 unused components, cookie.js) and the
redundant cron-execute recurring payment route.
2026-02-11 09:49:50 +01:00
8560077759 refactor: reorganize components into domain subfolders and replace relative imports
Move components from flat src/lib/components/ into recipes/, faith/, and
cospend/ subdirectories. Replace ~144 relative imports across API routes
and lib files with $models, $utils, $types, and $lib aliases. Add $types
alias to svelte.config.js. Remove unused EditRecipe.svelte.
2026-02-11 09:49:11 +01:00
b3c3f34e50 refactor: extract PipImage component from inline PiP markup
Deduplicates mobile PiP image code shared between the rosary page and
StickyImage. Adds fullscreen support to StickyImage and fixes hidden PiP
elements capturing pointer events via pointer-events: none default.
2026-02-10 21:16:05 +01:00
6eaf0bb4f4 rosary: add mystery images for all four mystery types with PiP fullscreen
All checks were successful
CI / update (push) Successful in 1m29s
Generalize mystery images from sorrowful-only to all mystery types (joyful,
sorrowful, glorious, luminous). Add PiP fullscreen mode with tap-to-show
controls and double-tap to toggle enlarged/fullscreen.
2026-02-09 23:02:34 +01:00
07554f16df rosary: fix mystery image column clipping at edges
All checks were successful
CI / update (push) Successful in 1m26s
Use taller edge pads (100vh) for before/after targets so images don't
peek at viewport top or bottom. Scroll to edge pads with zero offset
so previous/next images hide fully behind the sticky header.
2026-02-09 15:18:14 +01:00
bf3014337e fix: PiP show/hide on resize and skip observer at page top
All checks were successful
CI / update (push) Successful in 1m28s
- Resize handler calls pip.show()/hide() instead of just reposition(),
  fixing PiP not appearing when resizing from desktop to mobile
- IntersectionObserver skips all updates when scrollY < 50, preventing
  stale activeSection from re-scrolling SVG after jump-to-top
2026-02-09 14:32:39 +01:00
6182b8f943 rosary: add all 5 sorrowful mystery images with artist captions
- One image per mystery (garden, flagellation, mocking, carry, crucifixion)
- Desktop: figcaption with artist, title (translated DE/EN), and year
- Fix Map.has vs `in` operator bug preventing PiP from showing
- Reposition PiP on image load to prevent off-screen positioning
- Mystery image column clips behind header (top: 0 + padding-top: 6rem)
- Snap SVG and images instantly to top; reset activeSection to cross
2026-02-09 14:16:28 +01:00
8246906a76 fix: make hasLoadedFromStorage reactive so localStorage saves trigger
All checks were successful
CI / update (push) Successful in 1m28s
2026-02-09 09:18:17 +01:00
a5e119f976 rosary: add show/hide images toggle, fix PiP timing and breakpoint
- Add "Bilder anzeigen" / "Show Images" toggle persisted to localStorage
- Bump mystery image column/PiP breakpoint from 900px to 1200px so
  prayers keep full width on medium screens
- Fix PiP not appearing on page load by splitting $effect and using
  tick() to wait for DOM before measuring element dimensions
- Fix Toggle checkbox default margin causing misalignment
2026-02-09 09:12:34 +01:00
a4738134fe extract PiP drag/snap/enlarge logic into shared createPip() utility
All checks were successful
CI / update (push) Successful in 1m32s
Both StickyImage and rosary page now use the same pip.svelte.ts factory
for mobile drag-to-corner, snap, and double-tap enlarge behavior.
2026-02-09 08:48:20 +01:00
6433576b28 rosary: add mystery images with scrollable sticky column and mobile PiP
Add a third grid column for sorrowful mystery images (mocking for
mysteries 2-3, crucifixion for mystery 5). Desktop uses a scrollable
sticky sidebar synced to prayer scroll position. Mobile shows a
floating PiP thumbnail. Extract prayer page PiP logic into reusable
StickyImage component.
2026-02-09 08:47:53 +01:00
ea6d2cab5c ablassgebete: add prayer page with sticky crucifix and draggable PiP
All checks were successful
CI / update (push) Successful in 1m31s
- Add AblassGebete component and crucifix images
- Desktop: sticky crucifix on right, centered prayer with balanced spacing
- Mobile: draggable picture-in-picture thumbnail that snaps to corners
- Double-tap to enlarge/shrink with directional animation
- Monolingual sections override bilingual grey styling
- 404 for English route /faith/prayers/ablassgebete (German only)
- Reposition on window resize including desktop/mobile breakpoint crossing
2026-02-08 22:13:23 +01:00
83de5fed34 cospend: filter recent activity by chart category selection
All checks were successful
CI / update (push) Successful in 1m27s
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
7d6a80442a faith: progressive enhancement for all faith pages without JS
All checks were successful
CI / update (push) Successful in 1m29s
- 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
1c100a4534 fix: use accent-dark with nord5 light override for prayer backgrounds
All checks were successful
CI / update (push) Successful in 1m32s
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
d65886b4e7 fix: use semantic color for prayer section backgrounds in light mode
All checks were successful
CI / update (push) Successful in 1m27s
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
9da0a2740d rosary: inline cross glyph as SVG path for consistent rendering
All checks were successful
CI / update (push) Successful in 1m27s
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
7411160a23 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
767b43e2ff rosary: split final prayers into individual bead sections with scroll tracking
All checks were successful
CI / update (push) Successful in 1m27s
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
3831cd17de rosary: progressively shrink mystery selectors instead of stacking on small screens
All checks were successful
CI / update (push) Successful in 1m32s
2026-02-04 10:03:58 +01:00
7954d57cf1 rosary: reduce bundle size and improve responsive layout
All checks were successful
CI / update (push) Successful in 1m28s
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
14f54e6623 rosary: fix mystery selection lost when excluding luminous
All checks were successful
CI / update (push) Successful in 1m32s
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
e8b0fb7d9d rosary: fix today badge z-index
All checks were successful
CI / update (push) Successful in 1m27s
2026-02-03 14:48:47 +01:00
b28154564f perf: pre-generate Bible verse data and reduce DOM via conditional rendering
All checks were successful
CI / update (push) Successful in 1m34s
- 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
650c061137 rosary: add SVG hitboxes for easier bead tapping on mobile 2026-02-03 08:14:50 +01:00
52ae9659b8 angelus: align styling with other faith routes
All checks were successful
CI / update (push) Successful in 1m22s
2026-02-02 23:13:02 +01:00
58a0496ff3 rosary: add missing saint Michael prayer
All checks were successful
CI / update (push) Successful in 1m22s
2026-02-02 23:08:20 +01:00
0d2e33d84d angelus: add missing Ave Maria
All checks were successful
CI / update (push) Successful in 1m23s
2026-02-02 22:59:11 +01:00
b94a6bbb87 prayers: add angelus link
All checks were successful
CI / update (push) Successful in 1m22s
2026-02-02 22:51:51 +01:00
660a1b0539 prayers: add search and individual prayer pages
All checks were successful
CI / update (push) Successful in 1m22s
- 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
8699bef209 move glaube higher up in main LinksGrid
All checks were successful
CI / update (push) Successful in 1m21s
2026-02-02 20:47:10 +01:00
95d3be8b82 prayers: bow-emphasis only for main language 2026-02-02 20:39:11 +01:00
82db2c9e50 angelus: cleaner and now in Header
All checks were successful
CI / update (push) Successful in 1m25s
2026-02-02 16:59:25 +01:00
69293c39f9 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
1a5117e8d0 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
924ce386d5 rosary: server-side streak fetch, remove aggressive polling
All checks were successful
CI / update (push) Successful in 1m29s
- 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
01fd067eda rosary: cleaner light mode
All checks were successful
CI / update (push) Successful in 1m20s
2026-01-31 16:12:18 +01:00
58fd2b89d2 rosary: fade-in shadow removed
All checks were successful
CI / update (push) Successful in 1m21s
2026-01-31 15:53:59 +01:00
17b0fb9275 remove jukit garbage 2026-01-31 10:12:45 +01:00
45b0f5f2a6 rosary: less colourful mystery selector
All checks were successful
CI / update (push) Successful in 1m28s
2026-01-30 15:47:58 +01:00
7f4a8eec8b rosary: cleanup
All checks were successful
CI / update (push) Successful in 1m28s
2026-01-30 15:36:13 +01:00
daa801e14a fix logged in state broken on rosary due to prerendering
All checks were successful
CI / update (push) Successful in 1m21s
2026-01-30 12:47:28 +01:00
a58e52c891 feat: add server persistence for rosary streak
All checks were successful
CI / update (push) Successful in 1m21s
- 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
06477d656a 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
bff86041fd prayers: add Confiteor
All checks were successful
CI / update (push) Successful in 1m24s
2026-01-30 08:40:29 +01:00
53ad393541 refactor: reduce all_brief payload to first image's alt and mediapath
All checks were successful
CI / update (push) Successful in 1m20s
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
308d9c6dac fix: include images in all_brief API endpoints
All checks were successful
CI / update (push) Successful in 1m23s
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
763edb35c3 fix: include images and translations in offline-db brief recipes
All checks were successful
CI / update (push) Successful in 1m26s
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
c86a734da0 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
9ff30b28cd 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