From 95bedf4625f28ff8e7915edb168dc795bbdc5f26 Mon Sep 17 00:00:00 2001 From: Till JS Date: Sat, 25 Apr 2026 13:51:05 +0200 Subject: [PATCH] fix(comic): proper input focus + sichtbare Entfern-Affordance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drei Tweaks an der Create-Seite, ausgelöst von User-Feedback nach dem ersten Story-Anlegen: 1. **Inputs/Textarea ohne Focus-Ring.** Title-Input und Story-Kontext-Textarea hatten nur `focus:border-primary` und sahen im aktiven Zustand fast nicht anders aus als inaktiv. Wardrobe's GarmentForm nutzt `focus:ring-1 focus:ring-primary` plus `disabled:opacity-50` — übernommen. Textarea zusätzlich `resize-none` (vertikales Resize von Hand ist nett, aber kollidiert mit Padding bei kleiner Karten-Breite). 2. **Face-Tile war ein nackter ``.** Kein border-2, kein "Pflicht"-Hinweis — User dachte er könnte's entfernen und suchte nach dem X. Jetzt: border-2 border-primary/40 wie Body-Tile, plus ein "PFLICHT"-Badge mit Gradient-Overlay am unteren Rand. Title="Face-Ref ist Pflicht — kann nicht entfernt werden". Damit ist klar: Face = locked. 3. **Body und Garments waren entfernbar, aber das war unsichtbar.** - Body-Toggle: bisher gar kein Hover-Feedback im aktiven Zustand (Plus-Overlay nur bei inactive). Jetzt im aktiven Zustand auf Hover ein rotes X-Overlay über dem Bild (group-hover-Pattern, error/60-bg, opacity 0→100). Title-Tooltips nochmal verschärft: "Klick zum Entfernen" vs. "Klick zum Hinzufügen". - Garment-Tiles: das X-Button war 5x5 (20px), abgerundet, bg-background/80 — verschwand visuell auf manchen Garment-Fotos. Jetzt: • Die ganze Tile ist klickbar (Touch-friendly), mit hover:border-error/60 (visueller "achtung, klicken entfernt das") • X-Badge h-6 w-6 (24px) mit Border-Ring, weißer bg-Pille, wechselt bei group-hover auf error-bg + weiß. Immer sichtbar, nicht erst auf Hover. - Heading-Subline ergänzt um "klicke ein Bild oder das ✕, um es wieder zu entfernen" — explizite Anleitung. Comic-Files type-checken sauber. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../comic/components/CharacterPicker.svelte | 78 +++++++++++++------ .../modules/comic/components/StoryForm.svelte | 4 +- 2 files changed, 56 insertions(+), 26 deletions(-) diff --git a/apps/mana/apps/web/src/lib/modules/comic/components/CharacterPicker.svelte b/apps/mana/apps/web/src/lib/modules/comic/components/CharacterPicker.svelte index 2ae71ef6f..e128b9462 100644 --- a/apps/mana/apps/web/src/lib/modules/comic/components/CharacterPicker.svelte +++ b/apps/mana/apps/web/src/lib/modules/comic/components/CharacterPicker.svelte @@ -111,19 +111,32 @@ Protagonist

- Dein Gesicht ist Pflicht. Body-Ref und bis zu {MAX_GARMENTS} Kostüm-Fotos sind optional. + Dein Gesicht ist Pflicht. Body-Ref und bis zu {MAX_GARMENTS} Kostüm-Fotos sind optional — klicke + ein Bild oder das ✕, um es wieder zu entfernen.

- +
{#if face?.publicUrl} - Face-Ref +
+ Face-Ref + + Pflicht + +
{:else}
Face
- +
{#if body?.publicUrl} @@ -174,11 +198,21 @@ Body
- + {#each garmentPicks as g (g.id)} {@const mediaId = g.mediaIds[0]}
-
+ -
+ + + {g.name} diff --git a/apps/mana/apps/web/src/lib/modules/comic/components/StoryForm.svelte b/apps/mana/apps/web/src/lib/modules/comic/components/StoryForm.svelte index d7b80cbff..f23e1fea2 100644 --- a/apps/mana/apps/web/src/lib/modules/comic/components/StoryForm.svelte +++ b/apps/mana/apps/web/src/lib/modules/comic/components/StoryForm.svelte @@ -65,7 +65,7 @@ placeholder="Bug-Hunt-Frust, Urlaubs-Abenteuer, …" maxlength={120} autocomplete="off" - class="block w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-primary focus:outline-none" + class="block w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary disabled:opacity-50" disabled={submitting} required /> @@ -102,7 +102,7 @@ rows={3} maxlength={800} placeholder="Kurze Zusammenfassung, Ton, Ziel der Geschichte. Wird im AI-Storyboard-Flow (M4) als Briefing genutzt." - class="block w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-primary focus:outline-none" + class="block w-full resize-none rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary disabled:opacity-50" disabled={submitting} >