Commit Graph

684 Commits

Author SHA1 Message Date
2bede967c2 fitness: rename to "Fitness" on homepage
All checks were successful
CI / update (push) Successful in 2m3s
2026-03-21 10:40:32 +01:00
17c7cd2cce fitness: offer to update template with new weights/reps on workout completion
All checks were successful
CI / update (push) Successful in 2m4s
When finishing a template-based workout, compares completed sets against
the source template. If weights, reps, or set counts differ, shows a
visual diff with old→new values and a button to update the template,
letting templates grow with the user's strength progression.
2026-03-21 09:44:44 +01:00
529d004516 fitness: fix template edit validation and allow empty sets
All checks were successful
CI / update (push) Successful in 2m6s
- Validate exerciseId instead of name (templates use exerciseId, not name)
- Remove mandatory reps minimum from template sets
- Allow exercises with empty sets in schema and API validation
2026-03-21 09:39:32 +01:00
81711f1f09 fix: cache auth session on locals to prevent cookies.set after response
All checks were successful
CI / update (push) Successful in 2m19s
The authorization hook already calls locals.auth() which can set cookies.
Layout server loads calling auth() again caused a race where cookies.set()
fired after the response started streaming. Now the hook stashes the session
on locals.session and all layouts reuse it.
2026-03-20 16:28:31 +01:00
82c4c39462 fitness: fix workout name input losing characters during sync
All checks were successful
CI / update (push) Successful in 2m12s
Decouple name input from live sync by using a local variable that only
commits to workout state on blur/Enter. Remote name updates are applied
only when the input is not focused, preventing the sync layer from
overwriting in-progress edits.
2026-03-20 16:21:08 +01:00
bdf2932bf3 fitness: theme-reactive chart colors, bar outline fix, and stats label polish
All checks were successful
CI / update (push) Successful in 2m17s
- Stats and exercise pages: chart colors adapt to light/dark theme reactively
- FitnessChart: remove bar outline (borderWidth 0 for bar type)
- Stats: workouts icon/card use --color-primary, plural-aware label, rename labels
2026-03-20 15:46:08 +01:00
2ba08c51c0 fitness: fix GPS preview aspect ratio, theme-reactive colors, and UI polish
All checks were successful
CI / update (push) Successful in 2m17s
- SessionCard SVG: cosine-corrected coordinates with proper aspect ratio (xMidYMid meet)
- SessionCard: use --color-primary for track/distance/pace, add Gauge icon for pace
- History detail: theme-reactive pace chart colors via MutationObserver + matchMedia
- History detail: add Gauge icon, accent color for distance/pace stats, remove "avg" label
- Move GPS remove button from info view to edit screen
- Add Leaflet map preview to edit screen
- Remove data points count from GPS indicators
2026-03-20 14:59:31 +01:00
fe7c9ab2fe fitness: disable chart grow-in animation, add trendlines to exercise charts
All checks were successful
CI / update (push) Successful in 2m16s
Disable initial animation on all Chart.js charts (FitnessChart and
cospend BarChart) while keeping transition animations for interactions.
Add linear regression trendline with ±1σ uncertainty bands to exercise
charts (Est. 1RM, Max Weight, Total Volume).
2026-03-20 13:44:04 +01:00
6835f5479e fitness: add GPX upload with map, pace chart, and km splits
All checks were successful
CI / update (push) Successful in 2m18s
Add GPX file upload for cardio exercises in workout history. Parses
GPX track points and stores them in the session. Shows route map
(Leaflet), pace-over-distance chart (Chart.js), and per-km splits
table with color-coded fast/slow pacing. Auto-fills distance and
duration on single-set exercises. Disables Chart.js animations.
2026-03-20 13:30:52 +01:00
0e5d6dceb9 fitness: add workout completion summary with PR detection
All checks were successful
CI / update (push) Successful in 2m6s
Show summary screen after finishing a workout instead of immediately
redirecting. Displays duration, tonnage, distance, per-exercise stats
(pace, e1RM, top weight), and detected PRs compared to previous session.
2026-03-20 07:14:24 +01:00
8522d5a444 fitness: make recorded measurements editable with history list
All checks were successful
CI / update (push) Successful in 2m16s
Show measurement history with edit/delete per entry. Editing reuses the
add form pre-filled with existing values and saves via PUT.
2026-03-20 07:00:57 +01:00
f57e5a19a5 fitness: require authentication for all fitness routes 2026-03-20 06:53:06 +01:00
bbe60c82a9 fitness: add inline rest timer, set removal, previous set improvements, and session editing
Redesign rest timer as inline bar with linear decay placed after completed set.
Add set removal (X button), @ separator column for RPE, and N/A for missing
previous values. Enable editing past workouts (date, duration, exercises, sets)
from the history detail page.
2026-03-20 06:50:23 +01:00
828d4a83b0 fitness: add per-exercise metrics, cardio support, and stats page
All checks were successful
CI / update (push) Successful in 2m0s
- Add metrics system (weight/reps/rpe/distance/duration) per exercise type
  so cardio exercises show distance+duration instead of weight+reps
- Add 8 new cardio exercises: swimming, hiking, rowing outdoor, cycling
  outdoor, elliptical, stair climber, jump rope, walking
- Add bilateral flag to dumbbell exercises for accurate tonnage calculation
- Make SetTable, SessionCard, history detail, template editor, and exercise
  stats API all render/compute dynamically based on exercise metrics
- Rename Profile to Stats with lifetime cards: workouts, tonnage, cardio km
- Move route /fitness/profile -> /fitness/stats, API /stats/profile -> /stats/overview
2026-03-19 18:57:52 +01:00
14da4064a5 add fzf-style fuzzy search to exercises, recipes, and prayers
All checks were successful
CI / update (push) Successful in 2m1s
Replace substring matching with a shared fuzzy scorer that matches
characters in order (non-contiguous) with bonuses for consecutive
and word-boundary hits. Results are ranked by match quality.
2026-03-19 10:10:38 +01:00
640a986763 fitness: fix duration display treating minutes as seconds
All checks were successful
CI / update (push) Successful in 1m58s
The DB stores duration in minutes but formatDuration was dividing
by 3600/60 as if receiving seconds, always showing 0m.
2026-03-19 09:46:25 +01:00
c9e8e9919c fitness: add multi-device workout sync via SSE and rest timer improvements
Enables real-time workout synchronization across devices using
Server-Sent Events and an ephemeral MongoDB document (24h TTL).
Rest timers now use absolute timestamps instead of interval-based
countdown for accurate cross-device sync. Adds +/-30s rest timer
adjust buttons.
2026-03-19 09:44:24 +01:00
292ec20320 fitness: limit workouts-per-week chart to 10 weeks and trim empty leading weeks
Reduce the chart window from 12 to 10 weeks and trim leading weeks
with zero workouts so the chart starts from the first week with data.
2026-03-19 09:14:47 +01:00
6c6abe9f6c fitness: fix light/dark theme with semantic CSS variables
All checks were successful
CI / update (push) Successful in 1m57s
Replace hardcoded Nord color references with semantic CSS variables
across all fitness components and pages. Use --color-primary instead
of --nord8 for interactive elements (auto-switches between --nord10
in light mode and --nord8 in dark mode). Change RPE color from
--nord13 (yellow) to --nord12 (orange) for better light mode contrast.
Fix mobile responsiveness on measure page form inputs.
2026-03-19 09:08:30 +01:00
48f381e215 fitness: fix type errors, hydration warning, and add gym link
All checks were successful
CI / update (push) Successful in 2m0s
- Add exerciseId to WorkoutSession model (interface + schema)
- Fix button-in-button hydration warning in TemplateCard (use div)
- Expand FitnessChart dataset type to include all Chart.js properties
- Fix getTime type error in session update with proper cast
- Fix weight nullable type in profile stats with non-null assertion
- Fix $or query typing in templates list endpoint
- Re-add gym link on homepage pointing to /fitness
2026-03-19 08:42:51 +01:00
5890d3f3db homepage: re-add gym link pointing to /fitness
Re-introduce the dumbbell SVG icon and "Gym" link that previously
pointed to health.bocken.org, now linking to the internal /fitness route.
2026-03-19 08:35:46 +01:00
5198340c49 fitness: add 5 default workout templates and new exercises
Add all 5 PPL+Upper/Lower templates matching the target split,
with Day 3 (Legs) adjusted to include Bulgarian split squats and
standing calf raises, and Day 5 (Lower) reworked with front squats,
hip thrusts, and goblet squats — all equipment-free of machines.

Also adds incline row, decline crunch, flat leg raise, and nordic
hamstring curl to the exercise list, and updates the WorkoutTemplate
model to use exerciseId instead of name for exercise references.
2026-03-19 08:32:41 +01:00
1c62819d18 fitness: add complete fitness tracker frontend
- 5-tab layout (Profile, History, Workout, Exercises, Measure) with shared header nav
- Workout system: template CRUD, active workout on /fitness/workout/active with localStorage persistence, pause/resume timer, rest timer, RPE input
- Shared workout singleton (getWorkout) so active workout state is accessible across all fitness routes
- Floating workout FAB indicator on all /fitness routes when workout is active
- AddActionButton component for button-based FABs (measure + template creation)
- Profile page with workouts-per-week bar chart and weight line chart with SMA trend line + ±1σ confidence band
- Exercise detail with history, charts, and records tabs using static exercise data
- Session history with grouped-by-month list, session detail with stats/PRs
- Body measurements with latest values, body part display, add form
- Card styling matching rosary/prayer route patterns (accent-dark, nord5 light, box-shadow, hover lift)
- FitnessChart: fix SSR hang by moving Chart.register to client-side, remove redundant $effect
- Exercise API: use static in-repo data instead of empty MongoDB collection
- Workout finish: include exercise name for WorkoutSession model validation
2026-03-19 08:17:55 +01:00
e427dc2d25 recipes: fix filter panel on category, tag, and favorites pages
All checks were successful
CI / update (push) Successful in 1m55s
Search component needs access to all recipes to filter across
categories/tags/etc. Previously these pages only passed their
pre-filtered subset, so selecting additional filters yielded
no results. Now each page fetches allRecipes in parallel and
passes it to Search, falling back to the route-specific subset
when no filters are active.
2026-03-10 10:36:24 +01:00
03fb0dde95 readme: add features overview and clean up completed TODOs 2026-03-10 10:29:54 +01:00
5f08661507 recipes: pass lang prop to LanguageSelector for no-JS support 2026-03-10 10:27:02 +01:00
32b704135f rosary: fix missing space after comma in painting caption 2026-03-10 10:26:49 +01:00
eafa2caa27 pwa: fix offline caching for prayer/faith routes
All checks were successful
CI / update (push) Successful in 1m53s
The glob in sync.ts targeted a nonexistent /src/routes/glaube/ directory
instead of the actual [faithLang=faithLang] parameterized route. This meant
zero prayer pages were ever precached for offline use.

- Fix glob to match [faithLang=faithLang] and expand param segments to
  both language variants (glaube/faith, gebete/prayers, rosenkranz/rosary)
- Extract validPrayerSlugs to shared module for build-time route enumeration
- Add faith to service worker cacheable route regex
2026-03-09 17:49:32 +01:00
75401784ba rosary: fix mystery image timing and SVG container clipping
All checks were successful
CI / update (push) Successful in 1m51s
Show first mystery image at the Pater Noster instead of the Gloria Patri
by removing the early lbead2 trigger. Fix IntersectionObserver to prefer
the topmost intersecting entry so short _pater sections aren't skipped.
Use full viewport height (100dvh) for the SVG container to prevent
clipping at edges.
2026-03-08 20:46:07 +01:00
f76b647918 searxng: add Nord theme and deploy script
All checks were successful
CI / update (push) Successful in 3m25s
Override SearXNG's native CSS variables with Nord palette (cream white
light mode, true black dark mode). Replace SearXNG logo with Bocken
logo. Custom base.html template injects the CSS. Deploy script supports
reset to restore original state.
2026-03-08 20:33:26 +01:00
42754204b2 gitea: directly link to OIDC login via Header link 2026-03-05 08:06:31 +01:00
cb52897d50 prayers: remove redundant "in" typo
All checks were successful
CI / update (push) Successful in 1m52s
2026-03-04 21:31:07 +01:00
7751c84c89 gitea: make all avatars fully round circles
Some checks failed
CI / update (push) Failing after 1s
2026-03-04 19:12:41 +01:00
754c4216ab gitea: theme toggle improvements and header height increase
- Move theme toggle to right side of header (before notifications)
- Remove border from toggle, style consistently with other nav icons
- Fix dark mode hover background on toggle button
- Use exact Lucide SunMoon icon for system theme
- Dark logo filter in light mode
- Increase header height to 3.5rem
- Light mode with homepage warm beige palette (no pure white)
2026-03-04 19:12:19 +01:00
914b204b88 gitea: use homepage dark grey scale for backgrounds
All checks were successful
CI / update (push) Successful in 1m50s
Match the homepage dark mode surface colors (#000/#111/#1a1a1a/#222)
for boxes, code, inputs, cards, and menus instead of Nord greys.
Keeps Nord only for accent colors and text.
2026-03-03 19:04:20 +01:00
6f15faee8f gitea: apply Nord color scheme to theme
All checks were successful
CI / update (push) Successful in 1m51s
Remap all accent, status, badge, diff, text, and background colors
to the Nord palette matching the homepage and jellyfin themes.
2026-03-03 19:00:14 +01:00
2df6595520 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
28d840636c jellyfin: copy logo link to clipboard on mobile app with toast
Some checks failed
CI / update (push) Failing after 0s
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
b035abb061 jellyfin: link Bocken logo to bocken.org with Nord lightblue hover
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 17:46:08 +01:00
74c43b1181 jellyfin: floating glass pill header, nav icons, click-to-play cards
All checks were successful
CI / update (push) Successful in 1m50s
- 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
92460486de 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
66ce624cd5 jellyfin: blackout mode
All checks were successful
CI / update (push) Successful in 1m51s
2026-03-02 17:48:03 +01:00
e1b76b947c fix: language switching now works on all pages, not just root
All checks were successful
CI / update (push) Successful in 1m48s
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
9cf7913f13 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
4a931c7e30 fix: resolve all 1008 svelte-check type errors across codebase
All checks were successful
CI / update (push) Successful in 1m54s
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
9e5fef1463 fix: type errors in UserHeader querySelector calls 2026-03-01 21:12:47 +01:00
a4f48ec322 fix: silence state_referenced_locally warning in theme store 2026-03-01 21:07:26 +01:00
87cf51fcda deps: add lucide-svelte
All checks were successful
CI / update (push) Successful in 1m52s
2026-03-01 21:02:50 +01:00
96fe5e96be header: unify dropdown menus, nav text colors, minor fixes
All checks were successful
CI / update (push) Successful in 13s
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
d9ab4ee151 header: add colored icon fills for active nav links, cospend icons
All checks were successful
CI / update (push) Successful in 1m32s
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