From c1a87a4f88bca02f9e23837d5607d59d279d1a5f Mon Sep 17 00:00:00 2001 From: Till JS Date: Sun, 10 May 2026 16:07:55 +0200 Subject: [PATCH] =?UTF-8?q?feat(publish):=20Deck=20direkt=20aus=20der=20De?= =?UTF-8?q?tail-Seite=20ver=C3=B6ffentlichen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PublishDeckModal: Author-Check, Slug-Eingabe mit Live-Exists-Check, Titel/Beschreibung/Lizenz (nur für neue Decks), Semver auto-gebumpt, Karten automatisch aus privatem Deck übernommen (kein JSON-Paste) - Deck-Detail-Seite: "↑ Veröffentlichen"-Button im Header, öffnet Modal, leitet nach Erfolg auf /d/:slug (Marketplace-Seite) weiter Co-Authored-By: Claude Sonnet 4.6 --- .../marketplace/PublishDeckModal.svelte | 586 ++++++++++++++++++ apps/web/src/routes/decks/[id]/+page.svelte | 19 + 2 files changed, 605 insertions(+) create mode 100644 apps/web/src/lib/components/marketplace/PublishDeckModal.svelte diff --git a/apps/web/src/lib/components/marketplace/PublishDeckModal.svelte b/apps/web/src/lib/components/marketplace/PublishDeckModal.svelte new file mode 100644 index 0000000..801c7e8 --- /dev/null +++ b/apps/web/src/lib/components/marketplace/PublishDeckModal.svelte @@ -0,0 +1,586 @@ + + + + + diff --git a/apps/web/src/routes/decks/[id]/+page.svelte b/apps/web/src/routes/decks/[id]/+page.svelte index 9af2a36..22cc2db 100644 --- a/apps/web/src/routes/decks/[id]/+page.svelte +++ b/apps/web/src/routes/decks/[id]/+page.svelte @@ -12,6 +12,7 @@ import { t, tn } from '$lib/i18n/index.svelte.ts'; import CardSurface from '$lib/components/CardSurface.svelte'; import DeckCategoryIcon from '$lib/components/DeckCategoryIcon.svelte'; + import PublishDeckModal from '$lib/components/marketplace/PublishDeckModal.svelte'; import { Image, CaretRight, DotsThree, PencilSimple, Trash } from '@mana/shared-icons'; import { marked } from 'marked'; @@ -26,6 +27,7 @@ let error = $state(null); let categoryOpen = $state(false); let openMenuId = $state(null); + let publishModalOpen = $state(false); function toggleMenu(cardId: string, e: MouseEvent) { e.preventDefault(); @@ -121,6 +123,14 @@ + {t('deck_detail.new_card')} + {#if dueCount > 0} {t('deck_detail.study_button')} ({t('study.due_count', { n: dueCount })}) @@ -265,6 +275,15 @@ {/each} {/if} + + {#if publishModalOpen && deck} + { publishModalOpen = false; }} + onPublished={(slug) => { publishModalOpen = false; goto(`/d/${slug}`); }} + /> + {/if} {/if}