From 018fc987cdf6e33e75dfee57f3805c8c7929f0cb Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Fri, 17 Apr 2026 19:21:28 +0200 Subject: [PATCH] feat(recipe): Wake-Lock-Schalter + Profil-Chip nur Lucide + Save-Text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) ProfileSwitcher-Chip: Profil-Emoji (avatar_emoji) ist jetzt aus dem Header-Badge raus — immer CircleUser-Icon vor dem Namen. Im Profil- Auswahl-Modal bleiben die individuellen Emojis erhalten, damit User ihr Profil dort weiterhin erkennen. Unused .emoji CSS entfernt. 2) Preview-Button: "In meine Sammlung speichern" → "Rezept in Kochwas speichern". Klarer, was die App heißt. 3) Wake-Lock-Schalter: - Erklärung: navigator.wakeLock.request('screen') hindert Android/iOS daran, das Display zu dimmen/zu sperren, solange der Tab sichtbar ist. Beim Kochen sehr nützlich — Hände sind klebrig. - Neuer Toggle-Button im Rezept-Detail, zweite Aktion-Zeile zwischen "Heute gekocht" und "Löschen": Lightbulb (an, gelb-gehighlighted) oder LightbulbOff (aus). - Preference wird in localStorage persistiert (kochwas.wakeLock), Default an. Gilt für alle Rezepte. - visibilitychange-Handler re-requestet den Sentinel, wenn User den Tab wieder nach vorne holt und die Pref an ist. - release-Event räumt wakeLock-Variable sauber auf. --- src/lib/components/ProfileSwitcher.svelte | 6 +- src/routes/preview/+page.svelte | 2 +- src/routes/recipes/[id]/+page.svelte | 70 ++++++++++++++++++++--- 3 files changed, 65 insertions(+), 13 deletions(-) diff --git a/src/lib/components/ProfileSwitcher.svelte b/src/lib/components/ProfileSwitcher.svelte index acce166..a0013c5 100644 --- a/src/lib/components/ProfileSwitcher.svelte +++ b/src/lib/components/ProfileSwitcher.svelte @@ -24,11 +24,10 @@ @@ -105,9 +104,6 @@ .chip:hover { background: #f4f8f5; } - .emoji { - font-size: 1.1rem; - } .icon { display: inline-flex; align-items: center; diff --git a/src/routes/preview/+page.svelte b/src/routes/preview/+page.svelte index 47a155a..865504a 100644 --- a/src/routes/preview/+page.svelte +++ b/src/routes/preview/+page.svelte @@ -90,7 +90,7 @@ Speichern… {:else} - In meine Sammlung speichern + Rezept in Kochwas speichern {/if} diff --git a/src/routes/recipes/[id]/+page.svelte b/src/routes/recipes/[id]/+page.svelte index 83e2334..9391c55 100644 --- a/src/routes/recipes/[id]/+page.svelte +++ b/src/routes/recipes/[id]/+page.svelte @@ -9,7 +9,9 @@ Trash2, ChefHat, Check, - X + X, + Lightbulb, + LightbulbOff } from 'lucide-svelte'; import RecipeView from '$lib/components/RecipeView.svelte'; import StarRating from '$lib/components/StarRating.svelte'; @@ -225,29 +227,62 @@ void wishlistStore.refresh(); } - // Wake-Lock + // Wake-Lock — Bildschirm beim Kochen nicht dimmen lassen. + // Browser-API navigator.wakeLock.request('screen') verhindert auto-lock + // und -dimmen, solange der Tab sichtbar ist. Sobald der Tab in den + // Hintergrund geht, verliert der Sentinel seine Wirkung von selbst; wir + // re-requesten bei visibilitychange. + let wakeLockEnabled = $state(true); let wakeLock: WakeLockSentinel | null = null; - async function requestWakeLock() { + + async function acquireWakeLock() { + if (wakeLock || !wakeLockEnabled) return; try { if ('wakeLock' in navigator) { wakeLock = await navigator.wakeLock.request('screen'); + wakeLock.addEventListener('release', () => { + wakeLock = null; + }); } } catch { - // silently ignore + // User hat es gecancelt oder Browser unterstützt es nicht — ignorieren } } + async function releaseWakeLock() { + if (!wakeLock) return; + try { + await wakeLock.release(); + } catch { + // ignore + } + wakeLock = null; + } + + function toggleWakeLock() { + wakeLockEnabled = !wakeLockEnabled; + if (typeof window !== 'undefined') { + localStorage.setItem('kochwas.wakeLock', wakeLockEnabled ? '1' : '0'); + } + if (wakeLockEnabled) void acquireWakeLock(); + else void releaseWakeLock(); + } + onMount(() => { - void requestWakeLock(); + const stored = localStorage.getItem('kochwas.wakeLock'); + if (stored !== null) wakeLockEnabled = stored === '1'; + if (wakeLockEnabled) void acquireWakeLock(); const onVisibility = () => { - if (document.visibilityState === 'visible' && !wakeLock) void requestWakeLock(); + if (document.visibilityState === 'visible' && wakeLockEnabled && !wakeLock) { + void acquireWakeLock(); + } }; document.addEventListener('visibilitychange', onVisibility); return () => document.removeEventListener('visibilitychange', onVisibility); }); onDestroy(() => { - if (wakeLock) void wakeLock.release(); + void releaseWakeLock(); }); @@ -314,6 +349,22 @@ ({cookingLog.length}) {/if} +