Commit Graph

829 Commits

Author SHA1 Message Date
8591e5cff7 feat: add Day 6 stretching template to seed defaults
Full-body stretching session (~30 min) covering all major muscle
groups with 15 bodyweight exercises: neck, shoulders, chest, back,
spine, hips, hamstrings, quads, glutes, calves, and arms.
Each exercise has 2 sets of 60-90s holds with 15s rest.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 13:17:05 +02:00
0b86f72d92 feat: project exercise kcal from next scheduled template
All checks were successful
CI / update (push) Successful in 4m2s
When no workout is logged for the day, look up the next template
in the schedule rotation and show the kcal from its most recent
session as a projection. Tappable toggle includes/excludes it
from the calorie goal, ring, and macro bars for meal planning.
2026-04-11 13:11:32 +02:00
e0b932127d fix: increase shopping icon sizes for better visibility
All checks were successful
CI / update (push) Successful in 3m51s
List icons: 44→56px desktop, 36→48px mobile.
Icon picker modal: 42→56px grid cells.
2026-04-11 10:19:17 +02:00
8cb3d3c4eb fix: sync runtime shopping catalog with source catalog
shoppingCatalog.json was missing all 22 new entries (11 icons
with aliases) added to catalog.json, so new icons like stroh80
were never matched at runtime.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 10:14:32 +02:00
3b42d6b01d fix: correct ~100 misassigned shopping icon categories
All checks were successful
CI / update (push) Successful in 3m46s
The embedding model assigned many items to wrong categories
(e.g. rum→Milchprodukte, zahnbürsten→Fleisch, pflaumen→Hygiene).
Manually reviewed and corrected all 419 entries.
2026-04-11 09:39:31 +02:00
ae33591529 feat: add 11 new shopping icons and processing script
All checks were successful
CI / update (push) Successful in 3m54s
Add processed icons for glasnudeln, grünkohl, kokosnuss, lychee,
mangold, pak choi, pastinaken, reisnudeln, rettich, stroh 80, and
topinambur. Add ImageMagick script to remove Gemini watermark and
black background from raw icons. Update catalog and re-embed.
2026-04-11 09:33:09 +02:00
77badc6a36 fix: make macro progress bar labels concise with goal context
All checks were successful
CI / update (push) Successful in 3m58s
Show remaining as "10/150g left" and over as "10g over 150g".
Remove redundant per-day goal from label. Shorten "remaining" to "left".
2026-04-11 08:44:26 +02:00
46d7833e75 fix: make custom meal logging reactive by updating entries locally
logCustomMeal and inlineLogCustomMeal relied on goto() to re-run the
page load function, but SvelteKit skips it when the URL doesn't change.
Now they update the entries array directly like the other log functions.
2026-04-11 08:43:50 +02:00
1265647963 fix: use Atwater calories for consistent macro/calorie tracking
All checks were successful
CI / update (push) Successful in 3m41s
Calorie ring and macro progress bars now both use Atwater-derived
calories (P×4 + F×9 + C×4) instead of DB calories, so hitting all
three macro goals guarantees hitting the calorie goal exactly.

Also: show full daily TDEE (not time-based), show BMR/NEAT multiplier
breakdown in info tooltip, display macro goal grams on progress bars,
fix TDEE tooltip z-index on desktop.
2026-04-10 21:22:24 +02:00
ee4eda7a32 feat: restyle recipe info cards with grid layout and lucide icons
All checks were successful
CI / update (push) Successful in 3m42s
Align recipe metadata cards with site-wide design language using
surface colors, borders, and rounded corners. Add distinct lucide
icons per card type (Timer, Wheat, Croissant, Flame, CookingPot,
UtensilsCrossed) and switch from flex-wrap to CSS grid for uniform
card widths.
2026-04-10 20:55:48 +02:00
72a77b9dc3 feat: path-based month URLs for workout history with month navigation
All checks were successful
CI / update (push) Successful in 3m37s
Add ?month=YYYY-MM filter to sessions API. Migrate history page to
/fitness/history/[[month]] optional param route. Default view shows last
2 months; specific month view via /fitness/history/2026-04. Replace
load-more button with prev/next month anchor navigation.
2026-04-10 08:57:13 +02:00
b7444e8bc7 feat: use path-based date URLs for nutrition page
All checks were successful
CI / update (push) Successful in 3m25s
Migrate /fitness/nutrition?date=YYYY-MM-DD to /fitness/nutrition/YYYY-MM-DD
using SvelteKit optional param [[date=fitnessDate]]. Replace date nav
buttons with anchor tags for native browser navigation. Today resolves to
the clean /fitness/nutrition path without a date segment.
2026-04-10 08:47:48 +02:00
637a918dd8 feat: replace all native date inputs with custom DatePicker component
All checks were successful
CI / update (push) Successful in 3m36s
Add theme-aware DatePicker with pill display, calendar dropdown, prev/next
day arrows, bilingual month/weekday names, and min/max support. Replace all
15 native <input type="date"> elements across fitness, tasks, and cospend.
2026-04-10 08:36:33 +02:00
82a27c3f51 feat: inline measurement form on /fitness/measure, remove /add route
All checks were successful
CI / update (push) Successful in 3m49s
Move weight hero card, body fat and body parts accordions directly
onto the main measure page. SaveFab only appears when a field has
been changed. After saving, form resets and history updates in place.
Fix response unwrapping (created.measurement) that caused Invalid Date.
2026-04-10 08:22:23 +02:00
b7c66b6f07 feat: redesign measurement add page with weight-focused layout
Replace flat form with hero weight card (±0.1 stepper, last-weight
placeholder, clear button) and collapsible accordion sections for
body fat and body part measurements. Body parts grouped by region.
2026-04-10 08:12:18 +02:00
0ad72ddf24 fix: compute macro targets dynamically from protein goal and body weight
All checks were successful
CI / update (push) Successful in 4m3s
Fat/carb percentages were stored as absolute values that didn't account
for protein g/kg varying with body weight. Now protein calories are
computed first, and remaining calories are split between fat and carbs
by their stored ratio — guaranteeing all macros sum to the calorie goal.

Exercise burned calories also flow into fat/carb targets via a new
effectiveCalorieGoal derived. Goal editor ring preview and labels
updated to show computed actual percentages.
2026-04-10 08:01:08 +02:00
89b3202dc5 fix: include exercise calories in diet adherence calculation
All checks were successful
CI / update (push) Successful in 3m55s
Adherence was comparing intake against the flat calorie goal, ignoring
burned workout calories. Now the per-day target is goal + exercise kcal.
Also expanded workout query from 7 to 30 days to cover the full
adherence window.
2026-04-10 07:53:19 +02:00
0ae16ddd6d fix: correct week count in period tracker relative dates
All checks were successful
CI / update (push) Successful in 3m44s
Math.floor(days/7) was off by one — e.g. 12 days away showed "in 1 week"
instead of "in 2 weeks". Using Math.ceil matches colloquial usage.
2026-04-09 23:51:07 +02:00
fd137bc519 fix: show round-off suggestions on future days, not just today
Allow meal prep planning by relaxing the isToday check to isTodayOrFuture
in both SSR and client-side rendering of the round-off card.
2026-04-09 23:51:00 +02:00
1472451ac4 feat: SSR shopping list by fetching initial data server-side
All checks were successful
CI / update (push) Successful in 3m33s
Server load now fetches the shopping list from the DB and passes it as
initialList. The sync layer seeds state immediately in the script block
(not onMount) so SSR renders the full list. SSE connects client-side
in onMount for real-time updates.
2026-04-09 23:20:12 +02:00
2dfed11fd6 feat: add 7 new shopping icons and deploy hook
All checks were successful
CI / update (push) Successful in 3m36s
Add Gemini-generated icons: aperol, bulgur, emmentaler, magerquark,
quinoa, raeucherlachs, tortilla_wraps. Update catalog with 11 new
entries (including aliases), regenerate embeddings and categories.
Add post-commit hook to rsync shopping icons to bocken.org.
2026-04-09 23:09:09 +02:00
68349fbf46 fix: align MysterySelector buttons with site-wide design language
All checks were successful
CI / update (push) Successful in 3m50s
Replace hardcoded Nord values and manual dark/light overrides with
semantic CSS variables (--color-surface, --color-primary, --shadow-sm,
--radius-card, etc.). Use scale:1.02 hover pattern and remove all
@media(prefers-color-scheme) and :global(:root[data-theme]) blocks.
2026-04-09 22:08:14 +02:00
b5cbc3f74b feat: redesign LinksGrid with semantic theming, rounded corners, and new layout
Some checks failed
CI / update (push) Has been cancelled
- Use semantic CSS variables (--color-surface, --shadow-sm, etc.) instead
  of hardcoded Nord values and manual dark mode overrides
- Add border-radius and overflow:hidden for rounded card corners
- Move icon fill variables (--grid-fill-*) into app.css theme system:
  colorful (red/orange/green) in light, cool blues in dark
- Mottled fill distribution via prime-offset nth-child selectors
- Reorder homepage links: Recipes, Shopping, Fitness, Faith, Tasks first
- Add Nutrition direct link with heart-pulse icon
- Document site-wide design language in CLAUDE.md
2026-04-09 22:05:09 +02:00
62515b95f0 fix: extend recipe hero images into status bar safe area
All checks were successful
CI / update (push) Successful in 3m30s
Account for env(safe-area-inset-top) in the hero negative margin-top
so images fill the status bar area on edge-to-edge Android instead of
leaving empty space.
2026-04-09 21:33:53 +02:00
830a1f98a9 fix: use gradient overlay instead of box-shadow for status bar shadow
The box-shadow rendered outside the pseudo-element, placing the shadow
below the status bar boundary. Switch to a multi-stop linear gradient
inside the element so the shadow fades smoothly through the status bar
area (+20% overshoot for softer transition).
2026-04-09 21:31:26 +02:00
396174fd34 fix: compute round-off card visibility server-side to prevent flicker
All checks were successful
CI / update (push) Successful in 3m37s
Server pre-computes initialShowRoundOff from food log totals and goals.
SSR uses this value; client $effect sets hasHydrated=true after mount,
switching to the reactive $derived for live updates.
2026-04-09 21:13:08 +02:00
6e2fdce7f3 feat: include custom meals in round-off combinatorial food pool
Custom meals are now resolved to per100g nutrition data and added
to the base food pool, allowing them to appear in 1-3 food combo
suggestions alongside pantry items and favorites.
2026-04-09 21:06:31 +02:00
6c44758e55 feat: replace P/F/C text labels with Lucide macro icons across fitness routes
All checks were successful
CI / update (push) Successful in 3m53s
Use Beef (protein), Droplet (fat), Wheat (carbs) icons consistently in
ring graphs, macro bars, food cards, detail rows, ingredient lists, and
stats page. Add labelIcon snippet prop to RingGraph/StatsRingGraph. Show
macro split legend always (was hidden on mobile) and group it with the
title in horizontal layout.
2026-04-09 21:00:46 +02:00
a1b80862f5 feat: add "round off this day" nutrition suggestions
Suggest optimal 1-3 food combinations to fill remaining macro budget using
weighted least-squares solver over a curated pantry (~55 foods) plus user
favorites/recents. Recipes scored individually (no combining). Features:

- Combinatorial solver (singles, pairs, triples) with macro-weighted scoring
- MealTypePicker component (extracted from quick-log, shared)
- Hero card with fit%, macro delta icons (Beef/Droplet/Wheat), ingredient
  cards, animated +/X toggle for logging
- Responsive layout: sidebar on mobile, center column on desktop
- MongoDB cache with ±5% tolerance, SSR on cache hit, TTL auto-expiry
- Cache invalidation on food-log/favorites/custom-meals CRUD
- Recipe per100g backfill admin endpoint
2026-04-09 20:47:32 +02:00
385e21b109 feat: add food detail pages for OFF and custom meal sources
All checks were successful
CI / update (push) Successful in 3m40s
Extend the nutrition detail page to support OpenFoodFacts items (looked up
by barcode) and custom meals (with ingredient breakdown). All food diary
cards and search results now link to detail pages regardless of source.
2026-04-09 18:17:43 +02:00
72b49baeab feat: add muscle visualization to exercise detail page
All checks were successful
CI / update (push) Successful in 3m42s
New MuscleMap component highlights primary muscles at full opacity and
secondary muscles at 40% using the existing body SVG diagrams. Only
renders front/back views that have active muscles.

Responsive layout: centered inline on mobile, sticky sidebar on desktop.
2026-04-09 00:27:05 +02:00
04284a7238 feat: add concise bilingual overviews for all 254 exercises
All checks were successful
CI / update (push) Successful in 3m34s
- Fix ExerciseDB data quality (remove empty calf raise, fix Wall Sit,
  correct muscles, typos)
- Rewrite verbose AI-generated English overviews to concise one-sentence
  descriptions
- Add German translations for all 199 EDB exercises (name, instructions,
  overview)
- Add English and German overviews for 55 static-only exercises
- Display overview above instructions on exercise detail page
2026-04-09 00:21:10 +02:00
133d121f84 feat: add recipe food detail route with hero image, favorites, and logged nutrition
All checks were successful
CI / update (push) Successful in 3m37s
Recipes logged in the food diary now link to a dedicated detail page at
/fitness/nutrition/food/recipe/{id} showing full nutritional breakdown,
hero image, and a link back to the recipe page. When opened from the
diary, the logged per100g snapshot is used; otherwise current recipe
nutrition is computed. Recipe favorites are now supported across the
favorite-ingredients API, nutrition lookup, and search endpoints.
2026-04-08 23:08:52 +02:00
9d8d1ec41f refactor: extract RingGraph, StatsRingGraph, MacroBreakdown components
All checks were successful
CI / update (push) Successful in 3m28s
Consolidate 6 duplicated instances of the SVG arc ring pattern into a
composable component hierarchy: RingGraph (base ring), StatsRingGraph
(ring with target markers), and MacroBreakdown (3 rings + kcal + detail
table). Removes ~400 lines of duplicated SVG/CSS from FoodSearch,
nutrition page, meals page, stats page, food detail page, and recipe
NutritionSummary.
2026-04-08 22:21:24 +02:00
dff8bccae1 fix: use --color-text-on-primary for all primary button text
All checks were successful
CI / update (push) Successful in 3m38s
Replace hardcoded white/#fff text on --color-primary buttons with
var(--color-text-on-primary) for proper theme contrast across:
- nutrition meals page (create btn + modal buttons)
- history detail page (save btn + start workout btn)
- recipe page (active filter chips)
- nutrition quick-log confirm button
2026-04-08 21:44:36 +02:00
48e277cf19 feat: custom meal detail screen, favorites tab, enhanced food search detail
All checks were successful
CI / update (push) Successful in 3m36s
- Replace inline amount row with full detail screen for custom meals
  showing calorie headline, macro rings, macro breakdown, and ingredients
- Add Favorites tab (with filter) between Search and Custom Meals tabs
- Search tab no longer prepends unmatched favorites
- Enhance FoodSearch selected view with macro rings and nutrient breakdown
- Add filter input to custom meals tab
- Document --color-primary/--color-text-on-primary in CLAUDE.md
2026-04-08 21:38:49 +02:00
b287affeb2 feat: add Today quick-navigate button to nutrition and period tracker
All checks were successful
CI / update (push) Successful in 3m36s
Shows a Today button when not viewing current date/month. Nutrition
page button appears right-aligned in the date nav. Period tracker
button appears top-right of the calendar header with centered
month title and chevrons.
2026-04-08 20:46:58 +02:00
aaeb0d1083 fix: SSR improvements for nutrition desktop layout
All checks were successful
CI / update (push) Successful in 3m38s
Move favorites and recent foods fetching to server load (parallel with
existing queries). Replace client-side $effect DOM manipulation for
fitness-content max-width with reactive CSS variable in layout via
route detection. Removes client-side fetch-on-mount pattern.
2026-04-08 20:42:46 +02:00
38860df660 feat: add favorite toggle to food detail page
Heart button in food header to add/remove favorites via the
existing favorite-ingredients API. Checks status on load, toggles
optimistically with error handling.
2026-04-08 20:38:18 +02:00
62b5c4c240 fix: remove tap highlight on interactive mobile elements
All checks were successful
CI / update (push) Successful in 3m46s
Add -webkit-tap-highlight-color: transparent to muscle heatmap,
water cups, exercise filter pills, and flip stats legend target
triangle 180 degrees.
2026-04-08 20:34:10 +02:00
54baf9eddb feat: quick-log sidebar with favorites and recent foods
Desktop sidebar (1600px+) for one-click food logging with inline amount
input. Favorites and recent items (last 3 days) shown with meal type
auto-selected by time of day. New /api/nutrition/lookup endpoint for
exact source+id food data retrieval. Parent container width override
via JS class toggle for reliable SvelteKit client-side navigation.
2026-04-08 20:30:13 +02:00
54b3bc6309 feat: desktop micronutrient card below water tracker
Micros use a snippet to render in two locations: inline inside the
daily-summary card on mobile (toggle accordion, unchanged), and as a
standalone always-visible card below the water tracker on desktop.
Also bumps desktop max-width to 1400px.
2026-04-08 20:13:08 +02:00
9150d1b8da feat: two-column desktop layout for nutrition page
All checks were successful
CI / update (push) Successful in 3m26s
At 1024px+, nutrition page switches from single-column (600px max) to a
two-column grid: sticky sidebar (summary, goals, water) + scrollable
meals column. Mobile layout unchanged via display:contents fallback.
2026-04-08 17:22:16 +02:00
6e161dc677 fix: remove redundant back links from nutrition sub-pages
All checks were successful
CI / update (push) Successful in 3m39s
Header navigation and browser history already provide this
functionality — the inline back links were unnecessary clutter.
2026-04-08 16:58:37 +02:00
340b4f6023 fix: calorie balance uses per-day TDEE from SMA trend weight + workout kcal
Balance is now intake minus estimated expenditure rather than intake
minus calorie goal. TDEE computed per day using that day's SMA trend
weight (Mifflin-St Jeor BMR × NEAT multiplier) plus tracked workout
calories, so a -500 kcal cut shows ~-500 on the balance card.
2026-04-08 16:58:15 +02:00
111fa91427 feat: replace browser confirm() with reusable ConfirmDialog component
Promise-based modal dialog with backdrop, keyboard support, and animations,
replacing all 18 native confirm() call sites across fitness, cospend, recipes,
and tasks pages.
2026-04-08 16:47:22 +02:00
a54c11145d fix: macro split sidebar breakpoint to 750px, polish legend icons
All checks were successful
CI / update (push) Successful in 3m40s
Lower desktop breakpoint from 1024px to 750px so the macro column
appears on more screens. Legend now uses horseshoe arc for actual
and rounded triangle for target.
2026-04-08 16:34:24 +02:00
6ad394d3a5 fix: invert shopping list icons to black in light mode
White PNG icons were invisible on light backgrounds. Added semantic
--shopping-icon-filter variable (invert(1) in light, none in dark)
applied to card and picker icons.
2026-04-08 16:30:06 +02:00
74d5562fed feat: desktop layout — macro split sidebar next to muscle heatmap
On desktop (≥1024px), protein/balance/adherence cards sit in a row above
the muscle heatmap, with the macro split card as a vertical sidebar on the
right spanning the full height. Includes ring/triangle legend for
actual vs target. Mobile layout unchanged.
2026-04-08 16:26:02 +02:00
61d80fe0bc feat: add info popover tooltips to calorie balance and adherence cards
Clicking the (i) icon on the calorie balance or adherence card now shows
a floating popover explaining how each metric is calculated, with EN/DE
translations.
2026-04-08 16:14:58 +02:00