Commit Graph

721 Commits

Author SHA1 Message Date
Alexander fefad983ae rosary: apply liturgical colors to season badge
Lent badge uses --purple (nord15) with white text; Eastertide badge
uses --nord6 (white) with --nord0 dark text.
2026-02-21 16:50:50 +01:00
Alexander 557d21c33a recipes: use emoji font for favorites button 2026-02-18 21:06:51 +01:00
Alexander e2e3cc4adf recipes: add shared "to try" list for external recipes
Household-shared list of external recipes to try, with name, multiple
links, and optional notes. Includes add/edit/delete with confirmation.
Linked from the favorites page via a styled pill button.
2026-02-18 21:01:24 +01:00
Alexander f7d2d993e3 recipes: hide image-wrap background color during view transition morph 2026-02-18 20:37:22 +01:00
Alexander 9d888861c6 recipes: hero image view transition, skip transitions for recipe-to-recipe 2026-02-18 10:07:42 +01:00
Alexander 912e2b3fd5 recipes: view transitions for recipe detail navigation
Image morphs between CompactCard thumbnail and hero, title block
slides up from bottom, header persists across transitions. Only
activates for recipe detail navigations, not between list pages.
2026-02-17 18:59:24 +01:00
Alexander 433ad43ead recipes: drop opacity transition from TitleImgParallax hero image
Remove the opacity 0→1 fade-in transition — it's annoying when the
image is already cached. The dominant color background handles the
loading state, so no transition needed.
2026-02-17 18:34:58 +01:00
Alexander fdfeb78a5f recipes: sharpen Gaussian kernel for dominant color extraction
Reduce sigma from 0.3 to 0.15 * dimension so edge pixels contribute
under 1% weight, heavily biasing the color toward the image center.
2026-02-17 18:25:24 +01:00
Alexander b8469d4ae2 recipes: replace placeholder images with OKLAB dominant color backgrounds
Instead of generating/serving 20px placeholder images with blur CSS, extract
a perceptually accurate dominant color (Gaussian-weighted OKLAB average) and
use it as a solid background-color while the full image loads. Removes
placeholder image generation, blur CSS/JS, and placeholder directory references
across upload flows, API routes, service worker, and all card/hero components.
Adds admin bulk tool to backfill colors for existing recipes.
2026-02-17 18:25:17 +01:00
Alexander d8f8aec282 recipes: two-column card grid on mobile, compact card sizing 2026-02-17 16:11:57 +01:00
Alexander 5d2933be98 fix: use python3 for emoji codepoint extraction in font subsetting
grep -oP '.' splits multi-byte emoji into individual bytes when the
locale is not UTF-8 (e.g. CI runners with LANG=C), causing pyftsubset
to fail on invalid codepoints.
2026-02-17 16:05:55 +01:00
Alexander 8bd04a8246 fix: emoji font on recipe hero link, orange OR toggle for better contrast 2026-02-17 16:02:22 +01:00
Alexander 66eb4a1628 fix: render desktop nav at all widths when no links, fix profile menu positioning
Skip mobile sidebar/hamburger entirely when no links snippet is provided.
The nav with .no-links class stays in desktop layout at all screen widths.
Override UserHeader mobile styles from .no-links context to keep dropdown
opening downward with tail centered below the profile picture.
2026-02-17 15:59:13 +01:00
Alexander f2d8b29fd5 fix: language selector speech bubble, profile menu on mobile, hide redundant hamburger
- LanguageSelector: add speech bubble tail, replace green active with
  nord8 blue + dark text, remove floating gap
- Header: hide hamburger menu on mobile when no links, show profile
  picture directly in top bar instead
- UserHeader: center mobile dropdown, fix tail color/position, add
  profile picture overlay to tuck tail behind, add drop shadow
- Main layout: stop passing empty links snippet
2026-02-17 13:22:20 +01:00
Alexander e1a138e4be fix: LinksGrid lock icons use muted color, shrink on mobile, keep images larger
Decouple lock-icon fill from nth-child color cycling via :not(.lock-icon),
use subtle --nord3 fill in both themes, add responsive lock sizing, and
bump mobile image heights (72→90px, 48→64px).
2026-02-17 13:06:52 +01:00
Alexander 6f28b0246b recipes: compact tag/category pills with fluid scaling, add tag search
Shrink TagBall font/padding and TagCloud gap using clamp() for
fluid sizing across viewports. Add search input on the tags page
to filter through keywords.
2026-02-17 13:01:12 +01:00
Alexander 051b1fa931 refactor: slimmer header, JS-less hamburger menu, bottom-aligned mobile nav
- Reduce header height to 3rem with CSS variable --header-h
- Scale logo via --symbol-size variable, decrease nav link font sizes
- Replace JS-driven sidebar toggle with checkbox hack (:has selector)
- Separate drop shadow into own element for correct z-index layering
  (top bar > sidebar > shadow)
- Bottom-align mobile nav links via ::before flex spacer
- Slide-in transition scoped to :has(:checked) to prevent resize artifacts
2026-02-17 10:32:02 +01:00
Alexander bb87e29065 fix: footer hidden behind recipe hero parallax section
The hero-section's scaleY transform created a stacking context that
painted over the footer, and margin-bottom: -20vh over-compensated
for the parallax gap, pulling the footer into the recipe cards.
Derive margin-bottom from actual parallax parameters and make the
footer position: relative so it paints above the transform layer.
2026-02-17 09:03:15 +01:00
Alexander b7a4d6ca9e fix: LinksGrid shows 2 columns on mobile, scale down icons/text
Use CSS min() in grid minmax to guarantee 2 tiles side-by-side at
any viewport width. Add responsive breakpoints (560px, 410px) to
progressively shrink SVG height, font size, and spacing.
2026-02-17 08:44:04 +01:00
Alexander 068434fb7c fonts: consolidate font-family to global stack, self-host subset emoji font
Remove redundant `font-family: sans-serif` from 18 component-level
declarations — they now inherit the Helvetica/Arial/Noto Sans stack
from the global `*` selector in app.css.

Add self-hosted NotoColorEmoji subset (56 KB, down from 11 MB) as
fallback for systems without the Noto Color Emoji font installed.
The subset is generated at prebuild time via pyftsubset with a fixed
list of the ~32 emojis actually used on the site.
2026-02-16 21:34:12 +01:00
Alexander 44f34606d3 fix: remove build warnings (unused CSS, a11y labels, npmrc)
- settings: remove unused form p/h4 CSS selectors
- prayers: remove unused .postcommunio-section/links CSS selectors
- RosarySvg: add aria-label to all bead hitbox anchors
- .npmrc: remove pnpm-only resolution-mode setting
2026-02-16 18:54:10 +01:00
Alexander 999e724de5 recipes: replace Card with CompactCard + CSS grid on all sub-pages
Migrate all recipe sub-pages from the old fixed-size Card component
inside flex-wrap Recipes wrapper to CompactCard with responsive CSS
grid for visual consistency with the main recipes page.
2026-02-16 18:47:12 +01:00
Alexander a58eabd51e recipes: CompactCard with larger icon and anchor 2026-02-16 17:51:31 +01:00
Alexander 4891c0c529 recipes: filter panel does not create page overflow 2026-02-16 15:23:02 +01:00
Alexander 37d7f28a72 fix: prevent hero image flash by aligning server/client random seed
Generate heroIndex on the server and pass it to the client so SSR and
hydration pick the same hero recipe, eliminating the image swap on
first interaction.
2026-02-16 14:43:37 +01:00
Alexander c21dcaa7ef recipes: fix compact card tag styling and add filter placeholder for CLS
- Fix g-tag dark mode hover text disappearing (explicit background-color)
- Scope compact card tag styles to avoid global/scoped CSS flash on load
- Add placeholder div to prevent layout shift when FilterPanel hydrates
- Improve LogicModeToggle contrast in light mode (nord4 → nord3/nord1)
- Bump compact card recipe name font-size to 1.1rem
2026-02-16 14:30:32 +01:00
Alexander 747e4b5cc6 recipes: Swissmilk-inspired hero redesign with parallax and card refresh
- Full-bleed hero image with CSS parallax (scaleY technique matching TitleImgParallax)
- Hero picks random seasonal recipe with hashed image on each visit
- Left-aligned title, subheading, and featured recipe link over the hero
- Category chips with ellipsis collapse on small screens (<600px)
- Search bar anchored to hero/grid boundary regardless of chip count
- CompactCard redesign: 3/2 aspect ratio, rounded corners, subtle hover zoom
- Search component margin adjusted to sit flush at hero boundary
2026-02-16 13:53:52 +01:00
Alexander c5e33d5573 css: replace hardcoded values with design tokens
Replace 30 border-radius: 1000px → var(--radius-pill), 6 border-radius:
20px → var(--radius-card), 21 transition: 100ms → var(--transition-fast),
and 32 transition: 200ms → var(--transition-normal) across the codebase.
2026-02-16 09:45:56 +01:00
Alexander e38879d8be css: consolidate stylesheets into single source of truth
Merge nordtheme.css tokens and utility classes into app.css, import
app.css once in root layout, delete redundant files (nordtheme.css,
form.css, rosenkranz.css), move domain CSS to layouts, fix broken
shake keyframe in action_button.css, and scope form styles to the
two pages that need them. 10 CSS files → 6, 41 redundant imports removed.
2026-02-15 22:26:27 +01:00
Alexander 0a13df19f5 fix: streak counter showing zero on second device due to stale localStorage
The RosaryStreakStore singleton survives client-side navigation but
the first mount. Also reorder onMount to merge server data before
assigning to streak, preventing a frame of stale localStorage values.
2026-02-15 22:06:36 +01:00
Alexander bc5dc5da05 rosary: update flagellation mystery image to rubens 2026-02-14 21:30:45 +01:00
Alexander 08848411e8 faith: remove angelus from header 2026-02-14 11:55:15 +01:00
Alexander 5d7460d8b8 rosenkranz: von "Heute" -> "Wochentag" gewechselt 2026-02-13 19:24:03 +01:00
Alexander c305785ee7 prayers: add plenary indulgence explanation to postcommunio 2026-02-13 15:34:20 +01:00
Alexander 0b64cb7a3f prayers: add 5 new prayers, move Angelus route, liturgical seasons
Add Guardian Angel, Apostles' Creed, Tantum Ergo, Angelus, and Regina
Caeli to the prayers collection. Move standalone Angelus route into the
prayers system with a 301 redirect from the old path. Extract Easter
computation into shared utility ($lib/js/easter.svelte.ts) and use it
for liturgical season awareness: during Eastertide the rosary defaults
to Glorious mysteries and swaps Salve Regina for Regina Caeli; during
Lent it defaults to Sorrowful mysteries. Seasonal badges shown on both
the mystery selector and prayer sections.
2026-02-13 14:56:12 +01:00
Alexander bcc4d761b7 rosary: make scroll-to-top button work without JS
Replace <button> with <a href="#top"> anchor link. JS intercepts for
smooth scrolling, no-JS falls back to hash navigation.
2026-02-13 13:18:38 +01:00
Alexander cd99631ed5 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.
2026-02-13 13:04:11 +01:00
Alexander 4caed69b24 prayers: fix minor issues 2026-02-12 21:17:07 +01:00
Alexander 6d9b5eb668 fix: sync payments page state on URL param changes
$state() only captured initial data prop values, so navigating to
different offset/limit params always showed the first page results.
2026-02-12 17:44:58 +01:00
Alexander 5e11fa0899 rosary: snap mystery images instantly at edges
When jumping to the top or bottom of the rosary, snap the mystery
image column instantly instead of smooth scrolling.
2026-02-12 17:37:30 +01:00
Alexander ca27c25809 rosary: prevent manual scrolling on mystery image column
Change overflow-y from auto to hidden so the image column only
scrolls programmatically in sync with prayers, not via user input.
2026-02-12 16:48:34 +01:00
Alexander 67a74a70a0 rosary: remove scroll polyfill and optimize SVGs
Drop the smooth-scroll polyfill (now universally supported) and run
SVGO on benedictus.svg (35KB→19KB) and the cross glyph path.
2026-02-12 08:32:03 +01:00
Alexander ee61ed8bb3 rosary: only show embers after 14 days, not flame 2026-02-11 20:43:12 +01:00
Alexander f8842c857c refactor: extract sub-components and modules from rosary +page.svelte
Break the 1889-line rosary page into focused modules:
- rosaryData.js: mystery data, labels, weekday schedule, SVG positions
- rosaryScrollSync.js: bidirectional scroll sync (prayers ↔ SVG ↔ images)
- RosarySvg.svelte: SVG bead visualization
- MysterySelector.svelte: mystery picker grid
- MysteryImageColumn.svelte: desktop image column
2026-02-11 14:33:37 +01:00
Alexander 6aaee4c8f1 add forgotten routes in to build 2026-02-11 10:19:11 +01:00
Alexander 134b3deaa4 add Douay-Rheims Bible to the project for english bible references 2026-02-11 10:15:54 +01:00
Alexander 84033ef8c0 refactor: replace all any types in translation.ts with proper interfaces 2026-02-11 09:55:07 +01:00
Alexander 1a7e41f18b 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
Alexander 9e7ab0b16f 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
Alexander 896a99382d 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