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

+16 -4
View File
@@ -1,17 +1,19 @@
# Artstr Studio
Artstr Studio is a static, browser-only design tool for printable physical media packaging — and increasingly, a general-purpose Nostr-native graphics editor. It started as a DVD/Blu-ray case wrap maker and now also covers Avery 8960/8944 disc labels, Avery 8693/8943 CD jewel-case inserts, single-disc designs, and free-form custom art canvases. Designs publish to and load from Nostr, are forkable and editable in place, and can be tipped via Lightning.
Artstr Studio is a static, browser-only design tool for printable physical media packaging — and increasingly, a general-purpose Nostr-native graphics editor. It started as a DVD/Blu-ray case wrap maker and now also covers Avery 8960/8944 disc labels, Avery 8693/8943 CD jewel-case inserts, single-disc designs, free-form custom art canvases, and 16:9 slides assembled into presentable slide decks. Designs publish to and load from Nostr, are forkable and editable in place, and can be tipped via Lightning.
## Tabs and layouts
The editor has two tabs at the top level, each with its own Layout panel:
- **Template** — designs that map to a real printed surface.
- **Template** — designs that map to a real printed surface, plus the deck container.
- **Case cover** — DVD / Blu-ray wraps with separate front / spine / back artwork or a single combined wrap image.
- **Disc labels** — Avery 8960 / 8944 sheets with two disc positions.
- **CD jewel inserts** — Avery 8693 / 8943 sheets with a front insert + tray insert (chosen via the Template preset).
- **Slide deck** — an ordered, self-contained presentation deck that embeds its slides inline (see below).
- **Designer** — free-form and reusable designs.
- **Custom art** (the Designer tab's default) — a free-form canvas with size presets (1920×1080, square sizes, etc.) or custom dimensions. Treats the project as generic art rather than packaging.
- **Slide** — a 16:9 design surface (a Custom Art canvas locked to 16:9) with a speaker-notes field. A standalone, publishable design that can be imported into a slide deck.
- **Disc design** — a reusable single-disc design you can publish on Nostr and import later into either disc position of a disc-label sheet.
Each layout keeps its own metadata (title / identifiers / category / language) so switching layouts — or loading a project — doesn't overwrite a design already in progress.
@@ -56,6 +58,16 @@ Renders consistently in the editor, the preview surfaces, and the canvas / PDF /
Cross-target and cross-tool copy/paste — Copy / Cut on a selected layer, Copy all / Paste for the whole panel. Paste retargets to the current sub-mode and clamps positions so layers copied from a wide cover don't land off-canvas on a narrow disc.
## Slide decks & presenting
Artstr Studio doubles as a Nostr-native presentation tool.
- **Slide** — a 16:9 design surface on the Designer tab. Mechanically a Custom Art canvas locked to 16:9, plus a **speaker-notes** field. A slide is a first-class design: publish it, fork it, load it.
- **Slide deck** — a Template-tab container holding an ordered, variable-length list of slides. The deck **embeds every slide's full data inline**, so a published deck is a single self-contained event — no external lookups.
- **Deck Builder** — a reorderable grid of slide thumbnails. Add a blank slide, import a slide from Nostr or a file (non-16:9 imports are scaled-to-fit and letterboxed), duplicate, delete, and drag to reorder. Click a thumbnail to edit that slide in the canvas editor; edits write back into the deck.
- **Deck theme** — a deck-level font and background that restyle every slide at render time without altering the slides themselves; any slide can opt out.
- **Presenter Mode** — a full-screen runtime that plays a deck: the themed current slide, speaker notes, a next-slide thumbnail, and a slide counter. Navigate with on-screen controls, click-to-advance, or the keyboard (arrows / space / Page keys / Home / End / Esc). A **Presenter ⇄ Audience** view toggle switches between the notes-and-thumbnail layout and a clean slide-only full-screen view. Launch it from the ▶ button in the Deck Builder tool palette, or from **Start Presentation** on a deck's preview page in the community browser.
## Editor canvas
The canvas is a unified, Illustrator-style workspace: the tool palette, the
@@ -117,14 +129,14 @@ Two flavors of Lightning are wired in:
- `src/index.html` — the complete single-file app. Open it directly in a browser, or serve it from any static host. Vercel rewrites in `vercel.json` map `/share/:id` and `/u/:npub` to the SPA entry.
- `src/vendor/qrcode.min.js` — vendored QR encoder (used for Lightning tip invoices).
- `docs/` — feature specs. `PEN_TOOL_FEATURE.md` covers the now-shipped pen / pencil / vector tooling; badges, collections, NWC zaps, and zap-gated templates are still unbuilt.
- `docs/` — feature specs. `PEN_TOOL_FEATURE.md` covers the shipped pen / pencil / vector tooling; `SLIDE_DECK_FEATURE.md` covers the shipped slide / deck / presenter system (Phases A–D; dual-window presenter is future). Badges, collections, NWC zaps, and zap-gated templates are still unbuilt.
- `TODO.md` — running list of deferred work and cleanup items.
## Schema
- Current project schema version: **5**.
- Minimum supported version: **4**. Older payloads load but won't round-trip cleanly.
- Template-mode discriminator in payloads: `cover`, `disc`, `jewel`, `customart`, `disc-design`.
- Template-mode discriminator in payloads: `cover`, `disc`, `jewel`, `customart`, `disc-design`, `slide`, `deck`. A `slide` payload carries a `slide` object (canvas dims + speaker `notes`); a `deck` payload carries a `deck` object (`theme` + an inline ordered `slides` array).
- Layer types: `image`, `text`, `color`, `shape`, `qr`. Shape kinds: `rect`, `rounded-rect`, `circle`, `ellipse`, `triangle`, `polygon`, `star`, `line`, `path`, `svg`. Any layer may carry a `clip` field for masking.
## Defaults and stack
+2 -6
View File
@@ -19,13 +19,9 @@ surface + canvas export, JSON round-trip).
## Cleanup
- **Remove the IMDb import.** The OMDb prompt-based lookup isn't pulling its
weight — rip out the `imdbImportBtn` button, its handler, and the OMDb
fetch. (The `imdbId` metadata field itself stays — only the auto-import
goes.)
- **Delete `docs/TMDB_AUTOFILL_FEATURE.md`.** TMDB auto-fill was declined —
the metadata fields work fine filled by hand and the IMDb-style import is
being removed anyway.
the metadata fields work fine filled by hand, and the IMDb-style import
has been removed.
## Profile pages — deferred polish
+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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

+1178 -98
View File
File diff suppressed because it is too large. Load diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB