Commit Graph

598 Commits

Author SHA1 Message Date
Alexander 87d78ffdf3 gitea: floating glass pill header, black background, custom navbar
- Floating glass pill navbar matching homepage/jellyfin header style
- Full black page background
- Custom head_navbar template: logo links to bocken.org, home button
  for logged-in users, icons on all nav items, remove Help/Explore
- Icon-only nav on mobile, hide dropdown triangles, round avatar
- Deploy script to rsync theme + template to server
2026-03-03 18:55:28 +01:00
Alexander 5e1e2fb969 jellyfin: copy logo link to clipboard on mobile app with toast
WebView doesn't allow opening external browser, so on mobile app
the logo link copies URL to clipboard and shows a toast notification.
2026-03-03 18:02:15 +01:00
Alexander d10931ff32 jellyfin: link Bocken logo to bocken.org with Nord lightblue hover 2026-03-03 17:46:08 +01:00
Alexander 3722a41d44 jellyfin: floating glass pill header, nav icons, click-to-play cards
- Restyle header as floating glassmorphism pill matching bocken.org
- Replace Home/Favorites tab bar with icon buttons (house + heart) in header right
- Add play triangle overlay on card thumbnails with click-to-play
- Black backgrounds for detail page containers
- Always show detail logo regardless of screen width
- Mobile adjustments for pill header
2026-03-02 20:59:57 +01:00
Alexander 19e46b2b3a fix: replace any types with proper types across codebase
Replace ~100 `any` usages with proper types: use existing interfaces
(RecipeModelType, BriefRecipeType, IPayment, etc.), Record<string, unknown>
for dynamic objects, unknown for catch clauses with proper narrowing,
and inline types for callbacks. Remaining `any` types are in Svelte
components and cases where mongoose document mutation requires casts.
2026-03-02 20:15:08 +01:00
Alexander b83d793f61 jellyfin: blackout mode 2026-03-02 17:48:03 +01:00
Alexander 9f18cafe73 fix: language switching now works on all pages, not just root
LanguageSelector and language store previously only dispatched
languagechange events on '/'. Now any page that isn't a recipe or
faith route gets inline language switching via the custom event.
2026-03-02 13:37:31 +01:00
Alexander 116b2d8761 fix: disable default view transition crossfade on page content
Only named elements (header, logo, etc.) should animate during
navigation; the root crossfade caused a flash on every page change.
2026-03-02 13:37:10 +01:00
Alexander d2ac67fb44 fix: resolve all 1008 svelte-check type errors across codebase
Add type annotations, JSDoc types, null checks, and proper generics
to eliminate all svelte-check errors. Key changes include:
- Type $state(null) variables to avoid 'never' inference
- Add JSDoc typedefs for plain <script> components
- Fix mongoose model typing with Model<any> to avoid union complexity
- Add App.Error/App.PageState interfaces in app.d.ts
- Fix tuple types to array types in types.ts
- Type catch block errors and API handler params
- Add null safety for DOM queries and optional chaining
- Add standard line-clamp property alongside -webkit- prefix
2026-03-02 08:40:18 +01:00
Alexander 9c50133dfe fix: type errors in UserHeader querySelector calls 2026-03-01 21:12:47 +01:00
Alexander 11e94ca980 fix: silence state_referenced_locally warning in theme store 2026-03-01 21:07:26 +01:00
Alexander ff7a86e922 deps: add lucide-svelte 2026-03-01 21:02:50 +01:00
Alexander 2faed678ec header: unify dropdown menus, nav text colors, minor fixes
Rework UserHeader and LanguageSelector dropdowns to use wrapper +
triangle pattern with theme-aware backgrounds. Use solid grey for
inactive nav text instead of semi-transparent. Reduce instruction
info box shadow. Add emoji font to CompactCard favorites.
2026-03-01 21:00:21 +01:00
Alexander e8cb8f8232 header: add colored icon fills for active nav links, cospend icons
Active nav icons now fill with per-link colors (recipes, faith, cospend).
Cospend gets Lucide icons with background shape fills for Wallet and
RefreshCw. Shrink profile picture and use solid grey for inactive nav text.
2026-03-01 20:41:38 +01:00
Alexander fdbbca3942 feat: add light/dark mode toggle with header view transitions
Add theme cycling (system/light/dark) with localStorage persistence
and FOUC prevention. Restructure CSS color tokens to respond to
data-theme attribute across all components. Redesign header as a
floating glass pill bar with smooth view transitions including
clip-reveal logo animation.
2026-03-01 16:15:49 +01:00
Alexander 3942a18b2b fix: show positive amount for "gets" in recurring payment splits 2026-02-28 21:11:08 +01:00
Alexander ef98cccee9 fix: correct formatCurrency calls defaulting to EUR on payments page
Fix misplaced parenthesis in Math.abs() call that caused formatCurrency
to receive no currency arg (defaulting to EUR), and remove extra arg
in foreign currency formatting.
2026-02-28 21:09:28 +01:00
Alexander 12c64bd6ef header: thinner active page underline, closer to text 2026-02-27 20:14:43 +01:00
Alexander f82ef5bebc recipes: add defaultForm cake pan selector to add page 2026-02-27 20:11:45 +01:00
Alexander 12f45c5cbb recipes: add cake form size scaling for ingredient multiplier
Allow recipes to specify a default pan shape (round, rectangular, gugelhupf)
with dimensions. On the recipe page, users can enter their own pan size to
auto-calculate an ingredient multiplier based on the 2D area ratio.
2026-02-27 20:10:21 +01:00
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