mirror of
https://github.com/PR0M3TH3AN/Artstr-Studio.git
synced 2026-11-07 14:10:08 +00:00
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:
1 parent
06c5ab6768
commit
9bf99f1abb
6 files changed
+1246
-108
No files matched your search
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
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 |
Reference in new issue
Block a user