Phase 12 R5: Marketplace-Frontend — /explore + /d + /u + /me/{published,subscribed,forks}
Routes:
- /explore — Featured + Trending side-by-side, Browse mit Suche
(Title/Description ILIKE), Sprachfilter, Sort (recent/popular/
trending), load-more-Pagination
- /d/[slug] — Public-Deck-Detail mit Star/Subscribe/Fork-Buttons
(Star + Subscribe sind toggle, Fork erstellt private cards.decks-
Kopie und navigiert dorthin), Karten-Liste mit Discussion-Counts +
Click-to-expand-Thread + Suggest-Edit-Modal, PR-Liste mit
Owner-Merge/Reject + PR-Author-Close, Publish-Modal für Owner
- /u/[slug] — Author-Profil mit Verified-Badges (Mana/Community),
Follow-Button, Decks-Liste
- /me/published — Author-Profil-CRUD (Slug + Display-Name + Bio +
Pseudonym-Toggle), Liste eigener veröffentlichter Decks
- /me/subscribed — Abos mit prominentem update_available-Banner
- /me/forks — Geforkte Decks mit „Update ziehen"-Button →
Smart-Merge-Pull (FSRS-State unveränderter Karten bleibt erhalten)
Components (apps/web/src/lib/components/marketplace/, eigener
Namespace ohne Konflikt zu Tills WIP-DeckGrid.svelte/DeckFan/
DeckStack):
- AuthorBadge — Display-Name + Verified-Symbole + Link aufs Profil
- DeckListGrid — 3-spalt Grid mit Author-Badge, Karten-/Star-/
Subscriber-Counts, Sprache, Featured-Tag
- PublishVersionModal — SemVer-Eingabe (Default-Bump 1.0.0→1.1.0),
Changelog, Karten als JSON-Array
- SuggestEditModal — Modify- oder Remove-Mode pro Karte, ergibt
einen Pull-Request via /api/v1/marketplace/.../pull-requests
- DiscussionThread — Liste sichtbarer Comments inkl. Reply-Threading
(parent_id), Hide-Button für Author oder Deck-Owner, Post-Form
- PullRequestList — Status-Filter, Diff-Summary +N ~M −R, per-PR
Merge/Reject/Close-Buttons je nach Owner/Author-Permission
API-Client (apps/web/src/lib/api/marketplace.ts, ~440 Z.):
- Authors (CRUD + public lookup)
- Discovery (explore + browse + tags)
- Public Deck-Read + Init/Publish/Patch
- Engagement (Stars + Follows mit own-state-Endpoints)
- Subscribe + Fork + Pull-Update
- Pull-Requests (Lifecycle + List + Detail)
- Card-Discussions (Post + List + Counts + Hide)
Verifikation:
- svelte-check: 4017 Files, 0 errors, 5 Svelte-5-rune-Warnings
(benigne — Modals capturen Init-Values von Props bewusst, weil sie
pro Klick frisch gemountet werden; nicht-reactive ist gewollt)
- SSR-Smoke: /explore, /d/r5-stoa-grundlagen, /u/cardecky,
/me/published liefern alle 200 — Routes mounten, Pages rendern
initial mit Titles + Containern; API-Calls laufen client-side
beim Mount
- Live-Daten: Test-Decks r5-stoa-grundlagen (Stoische Grundbegriffe,
4 Karten v1.0.0) + r5-deutsche-historie (2 Karten) bewusst in
lokaler cards-DB liegen gelassen, damit Browser sofort Inhalt hat
Bewusst nicht angefasst:
- Header.svelte ist in Tills uncommitted WIP — Header-Nav-Link auf
/explore wird beim Theming-WIP-Commit nachgezogen. Marketplace-
URLs sind aktuell direkt erreichbar via URL-Bar.
- type-check-Warnings nicht silencet — die 5 sind benign und das
Refactoren auf $derived würde keine Verhaltens-Änderung bringen.
Verbleibend: R6 voller UI-E2E gegen das ganze System (Cardecky-
Deck-Publish + Till-Subscribe + Till-Fork + Till-Suggest-PR +
Cardecky-Merge + Till-Pull-Update — alles im Browser, manuell oder
Playwright). Polish (Empty-States, Loading-Skeletons, Pagination-
Edge-Cases) sammelt sich auf für eine separate Welle.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>