Commit Graph

978 Commits

Author SHA1 Message Date
Alexander 2e047768da recipes: preload hero images with high priority
Add fetchpriority="high" and <link rel="preload"> hints to hero images
on both the recipe listing and detail pages. Also prefetch the full-size
hero image on card hover via new Image() to warm the cache before navigation.
2026-02-26 19:49:17 +01:00
Alexander e6396fa2dc auth: smart login/logout redirect back to original page
Login link now includes callbackUrl for the current page. Logout
redirects intelligently: stays on public pages, falls back to the
recipe detail for /edit/[name], to the recipe root for auth-only
sub-routes (add, favorites, to-try, admin), and to / for cospend.
2026-02-26 19:25:47 +01:00
Alexander c9e3308965 recipes: restrict to-try page to editors, remove addedBy
- Gate page and API on rezepte_users group instead of any logged-in user
- Remove addedBy field from schema, API POST, and ToTryCard display
2026-02-26 19:18:58 +01:00
Alexander 95300d223a rosary: move mystery title to pater noster as a separate card
Each mystery now starts with its own title + Pater Noster card, before
the Ave Maria decade card. Transition cards (Gloria Patri + Fatima Prayer)
no longer contain the Pater Noster.

Mystery image column stays on the current mystery during transition prayers
(including the final Gloria/Fatima after decade 5) and only advances to the
next mystery at the Pater Noster card.

The new secret{N}_pater section IDs are tracked and mapped to their
corresponding large bead via svgActiveSection, so both transition and
pater sections highlight the correct large bead. CSS :has rules updated
for no-JS fallback.
2026-02-26 19:18:26 +01:00
Alexander 5a6334f771 rosary: reset expired streak on client to prevent SSR microflash
When the client hydrates and finds the merged streak is still expired
(localStorage couldn't rescue it), reset to zero and push to the server.
This ensures subsequent SSR loads render the correct value from the start.
2026-02-22 21:30:46 +01:00
Alexander 87c0941d85 build: use pnpm exec instead of npx for vite-node in prebuild
Fixes build failure on server where system npm has a broken
lru-cache/Yallist dependency. Also adds vite-node as an explicit
dev dependency so it's always available via pnpm.
2026-02-22 21:24:12 +01:00
Alexander a5849292e8 rosary: recommend Glorious mysteries on Lenten Sundays
Sundays during Lent are "little Easters", so treat them like ordinary
Sundays (Glorious mysteries, no Fastenzeit badge) rather than Lent.
2026-02-22 20:54:56 +01:00
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