feat(bolt-slides): replace the slides starter with slides v2 BOU-2538 - #126
feat(bolt-slides): replace the slides starter with slides v2 BOU-2538#126geotrev wants to merge 18 commits into
Conversation
|
|
Decks live in Postgres. The editor uses deck-api; the agent writes deck and slides rows. Owner Present is in-place. Share waits for a published origin. BOU-2538.
b44b0a3 to
0411df4
Compare
Present-share ?presenter=1 no longer opens the speaker console. P popups read the hash and close on Esc instead of becoming the editor or yanking the live deck to slide 1.
Refresh now waits for debounce timers and in-flight PUTs, and drops a stale /state snapshot if a write started after the GET. Share lookup failure no longer defaults a ?k= tab to editor; deck patches coalesce.
Unlock rate-limit keys on a platform client IP (or the last X-Forwarded-For hop), not the first. 500s no longer echo exception text. The migration comment no longer teaches "no token = owner".
Notes now paste as plain text (matching EditableText) and wrap code with escaped text. Freeform canvas drags abort on unmount and pointercancel so a mid-drag slide change cannot keep writing.
Export is any reader (notes stripped unless edit); share minting is owner-only. canEdit is documented as advisory — the API is the gate.
Review follow-ups (five commits on top of
|
…ht set add/duplicate/delete/import bumped writeGen but never tracked the POST, so a focus or realtime refresh could apply a pre-write snapshot after the local set.
Port dark-theme text, border, background, and shadow onto editor and present controls without adding the design-system package, so slide content stays on deck tokens.
Keep the canvas files and CSS for a later rework, but drop them from the registry, add-slide picker, and skill catalog so new decks cannot choose that layout.
Share and New slide share one focus trap so paging keys cannot fire while a modal is open, and the picker stays at max height. PDF/OG rasterization inlines iframe styles so accent, weight, and size survive the snapshot.
…ped text Inlining every computed style and cloning into the parent produced empty black pages. Snapshot the iframe mount as before, and turn background-clip:text into a solid color so accent and figures still paint.
html-to-image and jsPDF have to run on the window thread. Painting after each progress update lets the busy toast show instead of freezing through the whole deck.
…d lock New slide thumbs
Stable squash (2026-08-24):
0411df4b77467c6381efe1f59f85d13a0c47bbd1. Pair with boltf1e9b32a9d(#7075), which pins this SHA.Problem
The bolt-slides starter was JSX the agent rewrote on disk. Sharing and presenting also minted WebContainer URLs, which fail as visitor links and leak the preview origin.
Solution
Replace
bolt-slideswith a Pitch-style studio: decks are Postgres rows. The editor talks todeck-api; the agent writesdeck/slidesrows directly. Owner Present is in-place. The published origin is the audience deck (notes stripped). Share mints presenter-console and editor links on that origin. Host identity and published origin are injected by Bolt — stackblitz/bolt#7075.Implementation Details
@/kept. Skeleton chrome uses a Bolt DS token snapshot (BOU-2539) without depending on@blitz/design-system./), audience present (published/, notes stripped; leftover/present?k=still works), presenter console (share or/present?presenter=1). Audience present has no presenter control.X-Deck-OwnermatchingDECK_OWNER_SECRET→ no token ispresentonce the secret is set (local Vite with the secret unset stays owner). Opt-in via.bolt/config.jsonpreviewOwnerSecret. Owner proof is not stored inlocalStorage.BroadcastChannelis same-origin).deck-apicurls). Comments/profiles removed.