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
|
|
b44b0a3 to
0411df4
Compare
Review follow-ups (five commits on top of
|
Author decks in deck.json with a studio, present tab, presenter console, and Bolt DS chrome. BOU-2538 / BOU-2539.
6104652 to
f23c164
Compare
Give the skill a typed per-layout contract instead of restating keys, so chart and insight no longer share an explained `points` shape.
…are UI The studio no longer mounts those surfaces; the leftover rules were unused.
… setters Studio no longer has inspector or add-slide UI. Keep SlideStatus and animation unions for deck.json; drop the unused picker arrays and dead APIs.
Add-slide and the side inspector are gone. Keep defaults for kind-switch and example copy; authoring contracts stay in layoutProps.ts.
…senter icons One e() helper, one highlight splitter, and one icon set instead of copies in each file.
Presenter notes were stale because a new tab booted from Vite's cached deck.json import while persist skipped HMR. GET /__deck then a request-deck handshake so in-memory studio notes win if disk is still behind the debounce.
Insight points, logos items, and other homonym keys crash Present when copied from the wrong layout. Guard .map/.split, name the collisions in the skill, and drop the accordion Postgres leftover.
Strip leftover narrative comments and match the EditorApp blank-line rhythm so the rest of the starter is as readable as the first pass.
Keep photo overlays readable without an agent pass, capture fully painted slides in PDF export, and let wide bento columns use the slide width.
alexpate
left a comment
There was a problem hiding this comment.
Nice job! Nothing blocking. One thing that came out of review was just a reminder:
templates.json:5(in stackblitz/bolt) - the new SHA is the head of an unmerged starters feature branch, and all ten starters from that repo now point at it. Re-pin to main after the starters PR lands
Keep the layout viewport at 1280×720 so clamp() and .container match the studio, then raster onto 2560×1440 pages.
Stamp authored fields with data-deck-path and write inspector DOM edits through setProp so copy survives Present and reload without relying on the agent.
Keep setProp off while the inspector contenteditable is focused so the caret does not jump, then write deck.json on focusout.
Tables, comparison text, logos, code, and chart figures were preview-only strings, so Select edits never flushed. Stamp those fields (including pipe slices) so blur persist covers the rest of authored copy.
…r edits The contentEditable path was never mounted, and CountUp ticks were written back as visual edits. Split remaining chrome and persist into studio/ and copy/.
12-col spans left agent tiles cramped on the left; equal N-up (max 6) fills the row, and old 8+4 mosaics scale onto the new grid.
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 live in repo-rootdeck.json. The agent writes that file (andsrc/styles/tokens.csswhen theming). The studio runs in the Bolt preview iframe or local Vite. Present and Presenter open new tabs on the current origin. The published origin is the audience deck (notes stripped). Collaborate by sharing the Bolt project.Paired Bolt pin: stackblitz/bolt#7075. Closes BOU-2538. Part of BOU-2539.
Implementation
@/kept. Skeleton chrome uses a Bolt DS token snapshot (BOU-2539) without depending on@blitz/design-system./in the Bolt iframe or local Vite): thumbnail rail, grid, notes, Download as PDF/JSON, Present, Presenter. Reorder, duplicate, and delete live here. No inspector or add-slide UI./, and/?present=1from the studio): speaker notes stripped on the published origin.?presenter=1on a published top-level visit does not leak notes./?presenter=1or/present): on-screen now, up next, notes (read-only), timer, note text size. Dock P opens this in a new tab.DEV, not an injected host identity. Postgres,deck-api, share tokens, owner-proof HMAC, and in-slides sharing are not in this PR.deck.json. Layoutpropscontracts live insrc/data/layoutProps.ts. Homonym keys (points,items) follow that layout's type.GET/POST /__deckplus a BroadcastChannel handshake so new presenter tabs hydrate from disk and live studio peers.Test plan
/?present=1in a new tab; the studio stays put/?presenter=1in a new tab (works unpublished)/is the audience deck;?presenter=1there does not show notesdeck.json(andtokens.csswhen theming)