-
520dae5adf
feat(recipes): add image upload, fix save 500, seed HelloFresh data
Marcel Raddatz
2026-04-09 20:23:28 +02:00
-
f139dce82c
docs(specs): add planner desktop redesign spec — flip tiles
Marcel Raddatz
2026-04-09 18:19:57 +02:00
-
0596fddcd3
refactor(planning): extract applyPenalties helper to unify score formula
Marcel Raddatz
2026-04-09 15:08:49 +02:00
-
008c725813
test(planner): verify mobile swap sheet triggers suggestion fetch
Marcel Raddatz
2026-04-09 15:04:20 +02:00
-
1739b70d54
feat(planner): change neutral badge copy to Kein Einfluss
Marcel Raddatz
2026-04-09 15:03:39 +02:00
-
3b829325f2
feat(planner): hide RecipePicker inner header in swap context
Marcel Raddatz
2026-04-09 15:02:56 +02:00
-
d139e5e28c
refactor(planner): delete orphaned SwapSuggestionList component and tests
Marcel Raddatz
2026-04-09 15:02:07 +02:00
-
c9d6564fbe
refactor(planner): remove dead SwapSuggestionList import and sortedRecipes derived
Marcel Raddatz
2026-04-09 15:01:37 +02:00
-
ba79cff4e7
feat(planner): show variety score in swap menu via RecipePicker
Marcel Raddatz
2026-04-09 13:40:17 +02:00
-
55285e7d5d
feat(planner): show score badges for all recipes in RecipePicker
Marcel Raddatz
2026-04-09 13:03:10 +02:00
-
055ae11fa3
feat(planner): show yellow neutral badge for scoreDelta = 0 in RecipePicker
Marcel Raddatz
2026-04-09 12:54:31 +02:00
-
bf18f2bd84
fix(planner): format variety score to one decimal place
Marcel Raddatz
2026-04-09 12:52:56 +02:00
-
da21a12222
feat(planner): replace Variationskonflikt with red delta badge
Marcel Raddatz
2026-04-09 12:50:03 +02:00
-
e9dc04b2a5
feat(planner): add remove meal with undo; fix RecipePicker badge for neutral delta
Marcel Raddatz
2026-04-09 12:47:53 +02:00
-
8dfc3df06b
fix(planning): hasConflict only when scoreDelta strictly negative
Marcel Raddatz
2026-04-09 12:47:41 +02:00
-
ea070b4760
fix(planning): replace existing slot in simulation instead of appending
Marcel Raddatz
2026-04-09 12:31:24 +02:00
-
aecdf249d6
feat(planner): add onremove prop and Entfernen button to MealActionSheet
Marcel Raddatz
2026-04-09 12:25:22 +02:00
-
e4345350ad
fix(planner): RecipePicker UI polish from review
Marcel Raddatz
2026-04-09 12:17:09 +02:00
-
56decf155d
test(planner): clarify server.test.ts error-branch test name
Marcel Raddatz
2026-04-09 12:16:29 +02:00
-
1de4b15e34
refactor(planner): extract Suggestion type to $lib/planner/types.ts
Marcel Raddatz
2026-04-09 12:16:02 +02:00
-
ccec0baa99
feat(planner): add AbortController to suggestion fetch $effect
Marcel Raddatz
2026-04-09 12:15:17 +02:00
-
9928591b48
refactor(planner): extract computeCurrentScore helper in PlanningService
Marcel Raddatz
2026-04-09 12:11:44 +02:00
-
89a549a1c8
test(planner): assert hasConflict=true for neutral scoreDelta on empty plan
Marcel Raddatz
2026-04-09 12:11:00 +02:00
-
c24281dd4c
test(planner): cover topN=0 and topN=-1 boundary in SuggestionsTest
Marcel Raddatz
2026-04-09 12:10:33 +02:00
-
8051fcbe22
refactor(planner): extract MAX_VARIETY_SCORE constant in PlanningService
Marcel Raddatz
2026-04-09 12:09:08 +02:00
-
b45ab0fd46
fix(planner): guard scoreDelta against undefined in RecipePicker badge
Marcel Raddatz
2026-04-09 12:00:37 +02:00
-
2bbc3762e2
feat(planner): lazy-fetch variety suggestions in RecipePicker for empty slots
Marcel Raddatz
2026-04-09 11:46:25 +02:00
-
a751b0758a
feat(planner): add server.test.ts for GET /planner, fix sort + add error handling
Marcel Raddatz
2026-04-09 11:39:50 +02:00
-
8234c2f162
feat(planner): RecipePicker uses scoreDelta/hasConflict, drop currentVarietyScore, add isLoading
Marcel Raddatz
2026-04-09 11:38:47 +02:00
-
257808016d
chore(api): update SuggestionItem schema — scoreDelta + hasConflict replace simulatedScore
Marcel Raddatz
2026-04-09 11:35:57 +02:00
-
cd7f4a1ea0
chore(planner): delete orphaned SuggestionCard component and test
Marcel Raddatz
2026-04-09 11:35:33 +02:00
-
b673a466e9
feat(planner): replace simulatedScore with scoreDelta + hasConflict in SuggestionItem
Marcel Raddatz
2026-04-09 11:33:52 +02:00
-
e3066ec3e5
docs(specs): add C3 variety page rework mockups and V1 implementation spec
Marcel Raddatz
2026-04-09 16:31:14 +02:00
-
bd1604fc1d
docs(specs): add detailed implementation spec for E4 variety settings (V2 Kontext-Preset)
Marcel Raddatz
2026-04-09 16:13:17 +02:00
-
c297403506
docs(specs): add 3 mockup variations for E4 variety settings screen
Marcel Raddatz
2026-04-09 16:00:02 +02:00
-
fa4a4c9ef7
docs(specs): add J9 variety score config user journey and variety page rework spec
Marcel Raddatz
2026-04-09 15:51:26 +02:00
-
116e400a91
refactor(planning): extract applyPenalties helper to unify score formula
Marcel Raddatz
2026-04-09 15:08:49 +02:00
-
6dd0b7ac93
docs(specs): add final frontend specs for members and settings Kachel views
Marcel Raddatz
2026-04-09 15:06:11 +02:00
-
49ed75a989
test(planner): verify mobile swap sheet triggers suggestion fetch
Marcel Raddatz
2026-04-09 15:04:20 +02:00
-
813ddf8214
feat(planner): change neutral badge copy to Kein Einfluss
Marcel Raddatz
2026-04-09 15:03:39 +02:00
-
7359eba946
feat(planner): hide RecipePicker inner header in swap context
Marcel Raddatz
2026-04-09 15:02:56 +02:00
-
16162d80f4
refactor(planner): delete orphaned SwapSuggestionList component and tests
Marcel Raddatz
2026-04-09 15:02:07 +02:00
-
148f6a7b5b
refactor(planner): remove dead SwapSuggestionList import and sortedRecipes derived
Marcel Raddatz
2026-04-09 15:01:37 +02:00
-
f4503b0220
feat(planner): show variety score in swap menu via RecipePicker
Marcel Raddatz
2026-04-09 13:40:17 +02:00
-
f4648cc382
feat(planner): show score badges for all recipes in RecipePicker
Marcel Raddatz
2026-04-09 13:03:10 +02:00
-
081b8dcaf0
feat(planner): show yellow neutral badge for scoreDelta = 0 in RecipePicker
Marcel Raddatz
2026-04-09 12:54:31 +02:00
-
f33302e012
fix(planner): format variety score to one decimal place
Marcel Raddatz
2026-04-09 12:52:56 +02:00
-
06bf567b90
feat(planner): replace Variationskonflikt with red delta badge
Marcel Raddatz
2026-04-09 12:50:03 +02:00
-
1de9dfc314
feat(planner): add remove meal with undo; fix RecipePicker badge for neutral delta
Marcel Raddatz
2026-04-09 12:47:53 +02:00
-
77cdccb26c
fix(planning): hasConflict only when scoreDelta strictly negative
Marcel Raddatz
2026-04-09 12:47:41 +02:00
-
1611ddabf6
fix(planning): replace existing slot in simulation instead of appending
Marcel Raddatz
2026-04-09 12:31:24 +02:00
-
f55d938b32
feat(planner): add onremove prop and Entfernen button to MealActionSheet
Marcel Raddatz
2026-04-09 12:25:22 +02:00
-
cb921b3c0f
fix(planner): RecipePicker UI polish from review
Marcel Raddatz
2026-04-09 12:17:09 +02:00
-
8686f9eb9f
test(planner): clarify server.test.ts error-branch test name
Marcel Raddatz
2026-04-09 12:16:29 +02:00
-
f7a239655a
refactor(planner): extract Suggestion type to $lib/planner/types.ts
Marcel Raddatz
2026-04-09 12:16:02 +02:00
-
539ca5d231
feat(planner): add AbortController to suggestion fetch $effect
Marcel Raddatz
2026-04-09 12:15:17 +02:00
-
0a9e8032cf
refactor(planner): extract computeCurrentScore helper in PlanningService
Marcel Raddatz
2026-04-09 12:11:44 +02:00
-
f84a647b8d
test(planner): assert hasConflict=true for neutral scoreDelta on empty plan
Marcel Raddatz
2026-04-09 12:11:00 +02:00
-
e17e8d4630
test(planner): cover topN=0 and topN=-1 boundary in SuggestionsTest
Marcel Raddatz
2026-04-09 12:10:33 +02:00
-
482597bb6a
refactor(planner): extract MAX_VARIETY_SCORE constant in PlanningService
Marcel Raddatz
2026-04-09 12:09:08 +02:00
-
387d0705a4
fix(planner): guard scoreDelta against undefined in RecipePicker badge
Marcel Raddatz
2026-04-09 12:00:37 +02:00
-
ab66269131
feat(planner): lazy-fetch variety suggestions in RecipePicker for empty slots
Marcel Raddatz
2026-04-09 11:46:25 +02:00
-
59366b6e9c
feat(planner): add server.test.ts for GET /planner, fix sort + add error handling
Marcel Raddatz
2026-04-09 11:39:50 +02:00
-
4549e9a7fd
feat(planner): RecipePicker uses scoreDelta/hasConflict, drop currentVarietyScore, add isLoading
Marcel Raddatz
2026-04-09 11:38:47 +02:00
-
b6ad64ea53
chore(api): update SuggestionItem schema — scoreDelta + hasConflict replace simulatedScore
Marcel Raddatz
2026-04-09 11:35:57 +02:00
-
7e97d2dc58
chore(planner): delete orphaned SuggestionCard component and test
Marcel Raddatz
2026-04-09 11:35:33 +02:00
-
d008a17735
feat(planner): replace simulatedScore with scoreDelta + hasConflict in SuggestionItem
Marcel Raddatz
2026-04-09 11:33:52 +02:00
-
-
f0bbb3b009
fix(planner): exclude current recipe from swap suggestions
Marcel Raddatz
2026-04-09 10:38:30 +02:00
-
b4fa3ca23e
feat(planner): add isLoading prop to SwapSuggestionList — disables Pick buttons during PATCH
Marcel Raddatz
2026-04-09 10:32:59 +02:00
-
9482ecbf36
fix(planner): add truncation and title attribute to replacing-name span
Marcel Raddatz
2026-04-09 10:31:13 +02:00
-
278fda7d90
fix(planner): translate MealActionSheet button labels to German
Marcel Raddatz
2026-04-09 10:30:39 +02:00
-
8e3256d960
fix(planner): translate SwapSuggestionList copy to German
Marcel Raddatz
2026-04-09 10:29:54 +02:00
-
30722d9bcc
refactor(planner): extract shared recipe info markup into DayMealCard snippet
Marcel Raddatz
2026-04-09 10:28:56 +02:00
-
dd9a86d4e9
feat(planner): wire J4 swap flow — mobile action sheet + desktop inline panel
Marcel Raddatz
2026-04-09 10:13:45 +02:00
-
c8c2605f31
feat(planner): add SwapSuggestionList component for J4 swap context
Marcel Raddatz
2026-04-09 10:10:44 +02:00
-
1b2a02881d
feat(planner): add MealActionSheet component for mobile swap trigger
Marcel Raddatz
2026-04-09 10:07:46 +02:00
-
8756bf93d9
feat(planner): add sortEasiestFirst utility for J4 swap context
Marcel Raddatz
2026-04-09 10:03:47 +02:00
-
dac83c70ea
feat(planner): DayMealCard gains onactionsheet prop for full-card mobile tap target
Marcel Raddatz
2026-04-09 10:02:47 +02:00
-
5b8d336d21
fix(planner): map backend role 'planner' to 'planer' and enlarge nav buttons to 40px touch targets
Marcel Raddatz
2026-04-09 09:51:32 +02:00
-
e5d96cd85a
fix(frontend): address all PR review concerns
Marcel Raddatz
2026-04-09 08:19:37 +02:00
-
ea7113ec53
fix(backend): add role guard to variety-preview and extract shared scoring method
Marcel Raddatz
2026-04-09 08:11:45 +02:00
-
4333dc0d84
refactor(planner): remove C2 suggestions route, replace with callback-based DayMealCard
Marcel Raddatz
2026-04-08 23:25:35 +02:00
-
cbafe783e9
feat(planner): integrate C4 RecipePicker with PanelState machine + slot actions
Marcel Raddatz
2026-04-08 23:23:26 +02:00
-
178c888635
feat(recipes): add C6 day-picker flow — week plan load + slot actions + DayPicker sheet
Marcel Raddatz
2026-04-08 23:09:40 +02:00
-
f5adc051e8
feat(recipes): add C5 quick action buttons to RecipeCard
Marcel Raddatz
2026-04-08 22:58:50 +02:00
-
90c9ea1894
feat(planner): add UndoBar component with 4s auto-dismiss
Marcel Raddatz
2026-04-08 22:57:05 +02:00
-
ba41f6984b
feat(planner): add DayPicker component (C6)
Marcel Raddatz
2026-04-08 22:44:29 +02:00
-
25c575c167
feat(planner): add RecipePicker component (C4) and suggestions API endpoint
Marcel Raddatz
2026-04-08 22:42:10 +02:00
-
36ae82af5d
feat(ui): add BottomSheet.svelte shared wrapper component
Marcel Raddatz
2026-04-08 22:38:59 +02:00
-
7175b56833
feat(planning): add GET /v1/week-plans/{planId}/variety-preview endpoint
Marcel Raddatz
2026-04-08 22:36:03 +02:00
-
a52b0a9d24
feat(planning): enforce planner role on slot mutation endpoints
Marcel Raddatz
2026-04-08 22:34:28 +02:00
-
f6265efa92
test(shopping): add component tests for ShoppingHeader, ChecklistItem, AddCustomItem
Marcel Raddatz
2026-04-06 19:58:28 +02:00
-
3cd9154550
refactor(shopping): extract ShoppingChecklist.svelte to eliminate mobile/desktop duplication
Marcel Raddatz
2026-04-06 19:55:54 +02:00
-
be43fe94b6
fix(shopping): address frontend review concerns
Marcel Raddatz
2026-04-06 19:54:25 +02:00
-
e3afe1b4f2
test(shopping): add HTTP-level role guard test and blank customName validation test
Marcel Raddatz
2026-04-06 19:52:09 +02:00
-
eb5ee1ab5a
test(shopping): add missing service tests for stale items, dedup, and household isolation
Marcel Raddatz
2026-04-06 19:50:27 +02:00
-
9d210befa1
fix(security): add @Valid constraints on AddItemRequest to prevent oversized input
Marcel Raddatz
2026-04-06 19:49:06 +02:00
-
40a6a0e92d
fix(security): use generic forbidden message to avoid leaking required role
Marcel Raddatz
2026-04-06 19:46:24 +02:00
-
40ee4dad53
refactor(shopping): extract mergeKey helper to eliminate duplicate key construction
Marcel Raddatz
2026-04-06 19:44:44 +02:00
-
741141168b
feat(shopping): build main +page.svelte with responsive layout and empty states
Marcel Raddatz
2026-04-04 18:56:42 +02:00