From 7bc51e3a0ec5dc17ac2219830017062126f98b03 Mon Sep 17 00:00:00 2001 From: Alexander Bocken Date: Thu, 4 Sep 2025 16:08:29 +0200 Subject: [PATCH] Implement progressive enhancement for yeast swapper with state persistence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add server-side form handling for yeast swapping without JavaScript - Implement toggle-based URL parameter system (y0=1, y1=1) for clean URLs - Add server action to toggle yeast flags and preserve all URL state - Update multiplier forms to preserve yeast toggle states across submissions - Calculate yeast conversions server-side from original recipe data - Fix {{multiplier}} placeholder replacement to handle non-numeric amounts - Enable multiple independent yeast swappers with full state preservation - Maintain perfect progressive enhancement: works with and without JS 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/lib/components/HefeSwapper.svelte | 71 ++++++++++---------- src/lib/components/IngredientsPage.svelte | 72 +++++++++++++++++---- src/routes/rezepte/[name]/+page.server.ts | 29 +++++++++ src/routes/rezepte/[name]/+page.ts | 79 +++++++++++++++++++++++ 4 files changed, 201 insertions(+), 50 deletions(-) create mode 100644 src/routes/rezepte/[name]/+page.server.ts diff --git a/src/lib/components/HefeSwapper.svelte b/src/lib/components/HefeSwapper.svelte index 2df4de5..95c11c9 100644 --- a/src/lib/components/HefeSwapper.svelte +++ b/src/lib/components/HefeSwapper.svelte @@ -1,51 +1,39 @@ - +
+ + + {#each Array.from(currentParams.entries()) as [key, value]} + + {/each} + +
diff --git a/src/lib/components/IngredientsPage.svelte b/src/lib/components/IngredientsPage.svelte index a0652ab..4de5a28 100644 --- a/src/lib/components/IngredientsPage.svelte +++ b/src/lib/components/IngredientsPage.svelte @@ -2,10 +2,34 @@ import { onMount } from 'svelte'; import { onNavigate } from "$app/navigation"; import { browser } from '$app/environment'; +import { page } from '$app/stores'; import HefeSwapper from './HefeSwapper.svelte'; export let data let multiplier = data.multiplier || 1; +// Calculate yeast IDs for each yeast ingredient +let yeastIds = {}; +$: { + yeastIds = {}; + let yeastCounter = 0; + if (data.ingredients) { + for (let listIndex = 0; listIndex < data.ingredients.length; listIndex++) { + const list = data.ingredients[listIndex]; + if (list.list) { + for (let ingredientIndex = 0; ingredientIndex < list.list.length; ingredientIndex++) { + const ingredient = list.list[ingredientIndex]; + if (ingredient.name === "Frischhefe" || ingredient.name === "Trockenhefe") { + yeastIds[`${listIndex}-${ingredientIndex}`] = yeastCounter++; + } + } + } + } + } +} + +// Get all current URL parameters to preserve state in multiplier forms +$: currentParams = browser ? new URLSearchParams(window.location.search) : $page.url.searchParams; + // Progressive enhancement - use JS if available onMount(() => { if (browser) { @@ -154,14 +178,7 @@ function adjust_amount(string, multiplier){ } -function handleHefeToggle(event, item) { - item.name = event.detail.name; - item.amount = event.detail.amount; - if (event.detail.unit) { - item.unit = event.detail.unit; - } - data = data; // Trigger reactivity -} +// No need for complex yeast toggle handling - everything is calculated server-side now