Add Slide Decks & Presenter Mode (v1: Phases A–D)

Build a Nostr-native presentation system on top of the existing canvas
editor:

- Slide (templateMode 'slide') — a 16:9 Custom Art canvas with speaker
  notes; publishes/forks/loads as casewrap-slide.
- Deck Builder (templateMode 'deck') — a Template-tab container with an
  inline ordered slide list. Slide-sorter view: add blank, import from
  Nostr or file (non-16:9 imports letterboxed), duplicate, delete,
  drag-reorder, inline-rename; edit a slide in the canvas editor with
  write-back. Self-contained save/load/publish/fork as casewrap-deck;
  deck feed-card and publish previews show the first slide + count badge.
- Deck theme — deck-level font + background, render-time composition,
  per-slide ignoreDeckTheme opt-out.
- Presenter Mode — full-screen runtime: themed slide, notes, next
  thumbnail, counter; keyboard/click/on-screen nav; Presenter ⇄ Audience
  view toggle (slide-only full-screen with auto-hiding chrome). Launches
  from the deck tool palette and a deck's community-browser preview.

Supporting changes:
- New categories: slide ("Slide design") and slide-deck ("Slide deck");
  both use the free-form Custom tag field, not media identifiers.
- Swap the Template/Designer tab icons; 50% larger.
- Remove the IMDb/OMDb metadata import (button, handler, omdbApiKey);
  the imdbId field stays.
- Update README, SLIDE_DECK_FEATURE.md status, and TODO.md.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
This commit is contained in:
thePR0M3TH3ANandClaude Opus 4.7 committed 2026-05-21 22:10:06 -04:00
1 parent 06c5ab6768
commit 9bf99f1abb
6 files changed
+1246 -108

No files matched your search

+50
View File
@@ -36,6 +36,56 @@ the deck — all Nostr-native, forkable, and driven entirely off JSON data.
- A per-property theme matrix — v1 theme overrides a small fixed set
(font family, background); per-property locking is future polish.
### Implementation status
- **Phase A — Slide format: done.** `templateMode: 'slide'` (a thin alias
of the Custom Art canvas engine via `isCanvasMode()`), Slide Designer
layout on the Designer tab, 16:9-locked Canvas panel + Speaker notes
textarea (`state.customArt.notes`), and `slide` save / load / publish /
fork as `casewrap-slide`. Slides appear in the community browser.
- **Phase B — Deck Builder: done.** `templateMode: 'deck'` with the
embedded-slide `deck` data model; Deck Builder layout on the Template
tab; the slide-sorter view (thumbnail grid with add-blank / import from
Nostr / import from file / duplicate / delete / drag-reorder); open a
slide in the canvas editor
and write back via `persistEditingDeckSlide()`; deck save / load /
publish / fork as `casewrap-deck`, self-contained; deck feed-card and
publish-confirm previews show the first slide with a slide-count badge.
Import letterboxes non-16:9 sources onto the slide.
- **Phase C — Deck theme: done.** `deck.theme` (font family + optional
background-color override) with controls in the Deck Builder sidebar;
per-slide `ignoreDeckTheme` opt-out in the slide editor; render-time
theme composition (`composeSlideForDeck`) applied non-destructively to
deck thumbnails and the community-browser preview.
- **Phase D — Presenter Mode (single-window): done.** Full-screen runtime
(`#presenterMode`): the themed current slide, speaker notes, a next-slide
thumbnail, and a `n / total` counter. On-screen prev/next, click-to-
advance, and keyboard nav (arrows / space / PageUp-Down / Home / End /
Esc); a Presenter-view ⇄ Audience-view toggle (Audience view shows the
slide alone, full-screen, with auto-hiding chrome — for single-screen
use). Presenter owns the keyboard via a
capture-phase handler, so editor shortcuts are suppressed while it runs.
Launches from a ▶ button in the Deck Builder tool palette and a
"▶ Start Presentation" button on a deck's community-browser preview.
- **Phase E (dual-window presenter):** not started — explicit future work.
**The v1 plan (Phases A–D) is complete and shipping.** Two new categories —
`slide` ("Slide design") and `slide-deck` ("Slide deck") — were added so
slides and decks classify on their own terms, and both use the free-form
"Custom tag" field rather than the media-identifier panel.
### Remaining work
- **Phase E — dual-window presenter** (audience window + a separate
presenter window with notes/timer on a second screen).
- v1 non-goals still deferred: slide transitions/animations, a presenter
timer / rehearsal stats / laser pointer, rich-text speaker notes,
PowerPoint/Keynote/PDF import, deck → PDF/video export, per-property
theme locking, and a Keynote-style always-on filmstrip.
- Minor polish: the "Back to deck" bar is absolutely positioned (scrolls
away if the slide-edit canvas overflows); deck theme background is
color-only (an image-URL background was floated as future).
---
## Why this fits the repo