From c43b1dca87f3f2576d46c6dab993157c35b1f836 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Sun, 19 Apr 2026 13:33:26 +0200 Subject: [PATCH] refactor(editor): ImageUploadBox als eigenstaendige Component Isoliert den Bild-Upload-Flow (File-Input, Preview, Entfernen-Dialog) aus dem RecipeEditor. Parent haelt nur noch den
-Wrapper und reicht recipe.id + image_path rein, kriegt Aenderungen per onchange callback zurueck. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/lib/components/ImageUploadBox.svelte | 190 +++++++++++++++++++++++ src/lib/components/RecipeEditor.svelte | 177 +-------------------- 2 files changed, 198 insertions(+), 169 deletions(-) create mode 100644 src/lib/components/ImageUploadBox.svelte diff --git a/src/lib/components/ImageUploadBox.svelte b/src/lib/components/ImageUploadBox.svelte new file mode 100644 index 0000000..3e66872 --- /dev/null +++ b/src/lib/components/ImageUploadBox.svelte @@ -0,0 +1,190 @@ + + +
+
+ {#if imageSrc} + + {:else} + Kein Bild + {/if} +
+
+ + {#if imagePath} + + {/if} + {#if uploading} + Lade … + {/if} +
+ +
+

Max. 10 MB. JPG, PNG, WebP, GIF oder AVIF.

+ + diff --git a/src/lib/components/RecipeEditor.svelte b/src/lib/components/RecipeEditor.svelte index cc12717..7fa9977 100644 --- a/src/lib/components/RecipeEditor.svelte +++ b/src/lib/components/RecipeEditor.svelte @@ -1,10 +1,8 @@
-
+

Bild

-
-
- {#if imageSrc} - - {:else} - Kein Bild - {/if} -
-
- - {#if imagePath} - - {/if} - {#if uploading} - Lade … - {/if} -
- -
-

Max. 10 MB. JPG, PNG, WebP, GIF oder AVIF.

+ onimagechange?.(p)} + />
@@ -396,67 +296,6 @@ border-radius: 12px; padding: 1rem; } - .image-row { - display: flex; - gap: 1rem; - align-items: flex-start; - flex-wrap: wrap; - } - .image-preview { - width: 160px; - aspect-ratio: 16 / 10; - border-radius: 10px; - overflow: hidden; - background: #eef3ef; - border: 1px solid #e4eae7; - flex-shrink: 0; - } - .image-preview img { - width: 100%; - height: 100%; - object-fit: cover; - display: block; - } - .image-preview.empty { - display: grid; - place-items: center; - color: #999; - font-size: 0.85rem; - } - .image-preview .placeholder { - padding: 0 0.5rem; - text-align: center; - } - .image-actions { - display: flex; - flex-wrap: wrap; - gap: 0.5rem; - align-items: center; - } - .image-actions .btn { - display: inline-flex; - align-items: center; - gap: 0.4rem; - padding: 0.55rem 0.85rem; - min-height: 40px; - font-size: 0.9rem; - } - .upload-status { - color: #666; - font-size: 0.9rem; - } - .file-input { - position: absolute; - width: 1px; - height: 1px; - opacity: 0; - pointer-events: none; - } - .image-hint { - margin: 0.6rem 0 0; - color: #888; - font-size: 0.8rem; - } .block h2 { font-size: 1.05rem; margin: 0 0 0.75rem;