feat(visibility): embed resolvers for habits/quiz/social-events + inspector refresh

Closes the loop on the M5-Rest visibility rollout — flipping a habit,
quiz, or social-event to 'public' now actually surfaces it on the
owner's website embed.

EmbedSourceSchema gains three new sources:
- habits.habits — build-in-public widget. Title + "🔥 N Tage Streak ·
  gesamt M ×". Per-log timestamps + notes stay private (sleep/intake
  patterns are not for public consumption).
- quiz.quizzes — shareable-quiz teaser. Title + "N Fragen · {category}".
  Questions, options, explanations, attempts/scores all stay private —
  the actual play-experience is reserved for a future unlisted-share
  flow.
- events.socialEvents — RSVP-event teaser. Title + formatted start
  date + location + cover image. Hard-gated on the unified `visibility`
  only; the legacy `isPublished` flag is intentionally bypassed so the
  new Picker is the single source of truth (M6 will drop isPublished).

ModuleEmbedInspectorFallback now lists all 12 sources — was only
exposing 2 of the 9 already-wired ones (latent debt unblocking the
new sources from being addable in the editor).

Note: 7 unrelated svelte-check errors exist in
data/scope/dedup-workbench-scenes.test.ts from a parallel session
(spaceId not on LocalWorkbenchScene). Not introduced here.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-04-25 13:58:43 +02:00
parent 21dbce6631
commit 59b147f5ee
3 changed files with 216 additions and 0 deletions

View file

@ -18,6 +18,16 @@
>
<option value="picture.board">Picture-Board</option>
<option value="library.entries">Bibliothek</option>
<option value="calendar.events">Kalender (Termine)</option>
<option value="todo.tasks">Todos</option>
<option value="goals.goals">Ziele</option>
<option value="places.places">Orte</option>
<option value="recipes.recipes">Rezepte</option>
<option value="wardrobe.outfits">Wardrobe (Outfits)</option>
<option value="comic.stories">Comics</option>
<option value="habits.habits">Habits</option>
<option value="quiz.quizzes">Quizze</option>
<option value="events.socialEvents">Events (RSVP)</option>
</select>
</label>

View file

@ -36,6 +36,9 @@ export const EmbedSourceSchema = z.enum([
'recipes.recipes',
'wardrobe.outfits',
'comic.stories',
'habits.habits',
'quiz.quizzes',
'events.socialEvents',
]);
export type EmbedSource = z.infer<typeof EmbedSourceSchema>;