diff --git a/apps/web/src/lib/components/NewDeckCard.svelte b/apps/web/src/lib/components/NewDeckCard.svelte index 62e19f8..079136b 100644 --- a/apps/web/src/lib/components/NewDeckCard.svelte +++ b/apps/web/src/lib/components/NewDeckCard.svelte @@ -25,6 +25,7 @@ let imageFiles = $state([]); let imagePreviews = $state([]); + let imageUrl = $state(''); let imageGenerating = $state(false); let imageError = $state(null); let fileInput = $state(null); @@ -76,16 +77,21 @@ for (const url of imagePreviews) URL.revokeObjectURL(url); imageFiles = []; imagePreviews = []; + imageUrl = ''; imageGenerating = false; imageError = null; } async function onFromImage() { - if (imageFiles.length === 0 || !devUser.id || imageGenerating) return; + if ((imageFiles.length === 0 && !imageUrl.trim()) || !devUser.id || imageGenerating) return; imageError = null; imageGenerating = true; try { - const result = await generateDeckFromImage(imageFiles, { count, language }); + const result = await generateDeckFromImage(imageFiles, { + count, + language, + url: imageUrl.trim() || undefined, + }); toasts.success(`🖼 "${result.deck.name}" mit ${result.cards_created} Karten erstellt`); goto(`/decks/${result.deck.id}`); } catch (err) { @@ -173,11 +179,12 @@
{#each DECK_CATEGORY_IDS as id} {/each}
@@ -248,6 +255,16 @@ + + {#if aiError} {/if} @@ -268,8 +285,16 @@ - {/if} @@ -117,156 +134,484 @@ {#if deck.description} -

{deck.description}

+

{deck.description}

{/if} -
+
{tn('decks.card_count', cards.length)} · {t('study.due_count', { n: dueCount })}
-
- {#each DECK_CATEGORY_IDS as id} - - {/each} + {DECK_CATEGORY_LABELS[deck.category]} + {:else} + Fach wählen + {/if} + + + + + + {#if categoryOpen} +
+ {#each DECK_CATEGORY_IDS as id} + + {/each} +
+ {/if}
{#if cards.length === 0} -
+ {:else} - -
- goto(`/cards/${card.id}/edit`)} - /> -
- - -
- {t('deck_detail.new_card')} · alle Karten -
{/if} {/if}