From b534cd1ddc147fc6394cce3dff42a14422a73d4a Mon Sep 17 00:00:00 2001 From: Alexander Bocken Date: Mon, 1 Sep 2025 20:45:28 +0200 Subject: [PATCH] Add favorite indicators to recipe cards and improve favorites UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add heart emoji indicators to recipe cards (top-left positioning) - Show favorites across all recipe list pages (season, category, icon, tag) - Create favorites utility functions for server-side data merging - Convert client-side load files to server-side for session access - Redesign favorite button with emoji hearts (🖤/❤️) and bottom-right positioning - Fix randomizer array mutation issue causing card display glitches - Implement consistent favorite indicators with drop shadows for visibility 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/lib/components/Card.svelte | 13 ++++ src/lib/components/FavoriteButton.svelte | 60 ++++--------------- src/lib/js/randomize.js | 4 +- src/lib/server/favorites.ts | 48 +++++++++++++++ src/routes/rezepte/+page.server.ts | 15 ++++- src/routes/rezepte/+page.svelte | 4 +- src/routes/rezepte/[name]/+page.svelte | 12 ++-- .../category/[category]/+page.server.ts | 19 ++++++ .../rezepte/category/[category]/+page.svelte | 2 +- .../rezepte/category/[category]/+page.ts | 10 ---- src/routes/rezepte/favorites/+page.svelte | 2 +- .../rezepte/icon/[icon]/+page.server.ts | 22 +++++++ src/routes/rezepte/icon/[icon]/+page.svelte | 2 +- src/routes/rezepte/icon/[icon]/+page.ts | 13 ---- src/routes/rezepte/season/+page.server.ts | 19 ++++++ src/routes/rezepte/season/+page.svelte | 2 +- src/routes/rezepte/season/+page.ts | 10 ---- .../rezepte/season/[month]/+page.server.ts | 19 ++++++ .../rezepte/season/[month]/+page.svelte | 2 +- src/routes/rezepte/season/[month]/+page.ts | 12 ---- src/routes/rezepte/tag/[tag]/+page.server.ts | 19 ++++++ src/routes/rezepte/tag/[tag]/+page.svelte | 2 +- src/routes/rezepte/tag/[tag]/+page.ts | 10 ---- 23 files changed, 198 insertions(+), 123 deletions(-) create mode 100644 src/lib/server/favorites.ts create mode 100644 src/routes/rezepte/category/[category]/+page.server.ts delete mode 100644 src/routes/rezepte/category/[category]/+page.ts create mode 100644 src/routes/rezepte/icon/[icon]/+page.server.ts delete mode 100644 src/routes/rezepte/icon/[icon]/+page.ts create mode 100644 src/routes/rezepte/season/+page.server.ts delete mode 100644 src/routes/rezepte/season/+page.ts create mode 100644 src/routes/rezepte/season/[month]/+page.server.ts delete mode 100644 src/routes/rezepte/season/[month]/+page.ts create mode 100644 src/routes/rezepte/tag/[tag]/+page.server.ts delete mode 100644 src/routes/rezepte/tag/[tag]/+page.ts diff --git a/src/lib/components/Card.svelte b/src/lib/components/Card.svelte index a65c034..8a22ccc 100644 --- a/src/lib/components/Card.svelte +++ b/src/lib/components/Card.svelte @@ -7,6 +7,8 @@ import "$lib/css/nordtheme.css"; import "$lib/css/shake.css"; import "$lib/css/icon.css"; export let do_margin_right = false; +export let isFavorite = false; +export let showFavoriteIndicator = false; // to manually override lazy loading for top cards export let loading_strat : "lazy" | "eager" | undefined; if(loading_strat === undefined){ @@ -192,6 +194,14 @@ const img_name=recipe.short_name + ".webp?v=" + recipe.dateModified scale: 0.9 0.9; } +.favorite-indicator{ + position: absolute; + font-size: 2rem; + top: -0.5em; + left: -0.5em; + filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.8)); +} + .icon:hover, .icon:focus-visible { @@ -224,6 +234,9 @@ const img_name=recipe.short_name + ".webp?v=" + recipe.dateModified {recipe.alt} isloaded=true}/> + {#if showFavoriteIndicator && isFavorite} +
❤️
+ {/if} {#if icon_override || recipe.season.includes(current_month)} {/if} diff --git a/src/lib/components/FavoriteButton.svelte b/src/lib/components/FavoriteButton.svelte index 9ed997d..ce3831d 100644 --- a/src/lib/components/FavoriteButton.svelte +++ b/src/lib/components/FavoriteButton.svelte @@ -1,6 +1,4 @@