Skip to content

feat(bolt-slides): remove starter layouts; free-form responsive slides - #129

Open
inkko44 wants to merge 14 commits into
mainfrom
donald/bou-2910-remove-starter-slide-layouts-from-bolt-slides-free-form
Open

inkko44 wants to merge 14 commits into
mainfrom
donald/bou-2910-remove-starter-slide-layouts-from-bolt-slides-free-form

Conversation

@inkko44

@inkko44 inkko44 commented Sep 29, 2026

Copy link
Copy Markdown
Contributor

Closes BOU-2910

What

  • Removes the 30-layout starter catalog from bolt-slides: src/layouts/, src/components/, src/data/layoutProps.ts, and ~2,400 lines of layout-only CSS in base.css.
  • Slides are now free-form React components in src/slides/, referenced from deck.json by filename. A new src/slide/registry.tsx globs that folder; SlideView renders through it, so the rail, grid, Present, speaker view and PDF export keep working unchanged. A missing file renders a clear fallback slide instead of crashing.
  • deck.json ships a single seed slide (welcome.tsx) that the agent replaces.
  • SKILL.md, .bolt/prompt and README.md rewritten: shell description, the deck.json ↔ component contract, bootstrap, optional helpers (Slide, Reveal, Build, tokens, in-place text edit). The layout menu, entry conditions, arc and typography rules are gone. The one design rule left is every slide must be responsive.

Unchanged

Studio (side panel, grid, reorder / duplicate / delete, notes), dock, Present, speaker view, PDF / JSON download, deck.json persistence, theming tokens.

Verification

  • npm run typecheck, npm run lint, npm run build pass.
  • Headless Chrome renders of studio (with rail thumbnail), Present and speaker view at 1280×720 show the component slide correctly.
  • At 390px wide the headline overflows in Present; origin/main renders identically at that size, so it is pre-existing engine behavior.

Note

deck.json's layout field keeps its name (it now means the component filename) to avoid touching the store, export and studio paths that read it.

🤖 Generated with Claude Code

…s (BOU-2910)

Slides are now React components authored per deck in src/slides/ and
referenced from deck.json by filename (import.meta.glob registry in
src/slide/registry.tsx). The 30-layout catalog (src/layouts, src/components,
src/data/layoutProps.ts) and its ~2,400 lines of layout-only CSS are gone.

The studio, dock, rail, grid, notes, Present, speaker view, PDF/JSON
download and deck.json persistence are unchanged and render component
slides through the same SlideView path.

SKILL.md, .bolt/prompt and README now describe the deck.json <-> component
contract and the shell; the layout menu and styling rules are dropped.
The single design constraint is that every slide must be responsive.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@bolt-new-by-stackblitz

Copy link
Copy Markdown

Review PR in StackBlitz Codeflow Run & review this pull request in StackBlitz Codeflow.

inkko44 and others added 13 commits September 29, 2026 11:17
The first pass removed the layout catalog but left the look behind: the
dark/blue token theme, the spotlight + grain + vignette atmosphere on every
slide, the fluid type atoms (.kicker/.headline/.accent-text), the Inter
@import, applyFont defaulting to Inter, and a skill example + seed slide
that used all of it. Bolt copied that and produced the same blue-on-black
text decks.

- base.css: atmosphere and type atoms removed; only reset, slide box,
  .cols and the ==accent== marker remain.
- tokens.css: reduced to the variables the shell reads (--bg, --fg,
  --accent, fonts, gutters) with neutral defaults.
- applyFont imposes nothing when deck.font is unset.
- Fallback slides and the seed slide use plain inline styles.
- SKILL.md: no-house-style contract, a design section (palette, type,
  imagery, composition are the agent's to decide per deck), example code
  without atoms. README and .bolt/prompt updated.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…n by default

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…creens

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…tage-centered alignment

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…; data-viz and legibility rules

SlideView measures its own box: up to 1600px wide the slide reflows; above
that the whole slide is scaled up proportionally, so ultrawide screens show
the 1600px composition larger instead of stretched thin. The scaled box is
a CSS container named 'slide', so cqw/cqh and @container queries measure
the stage (also fixing thumbnails and the PDF, which never matched vw).

Skill: design for 390->1600 and fill the stage at 1600; use cqw/cqh and
@container instead of vw/vh and media queries; a data/charts section
(the number is the hero, charts at presentation scale, labels never inside
data-sized shapes, no dashboard furniture); kicker above headline; a
legibility floor to check before finishing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…as a failure

SlideView measures every live slide after its entrance settles and logs a
console error naming the slide file and how far its content (text/media
elements only) leaves the stage. Bolt surfaces console errors to the agent,
so an overflowing slide becomes a failure to fix rather than advice to
follow. Thumbnails and export are not measured.

Skill: 'nothing out of view — ever', the error to look for, tactics in
order (cut copy, split the slide, use the width, shrink media before text),
and the shortest-stage budget; the legibility floor references the check.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Width-only scaling shrank the inner stage's height whenever a window got
wider at a fixed height (2400x900 became a 1600x600 stage), pushing content
that fit at 900 tall out of view. The scale is now min(w/1600, h/900), so
the stage is never narrower than 1600 or shorter than 900; extra width is
room, not size. Stage constants and the fallback style move to
src/slide/stage.ts (Fast Refresh lint). Skill: height is the scarce axis —
tie vertical sizes to cqh, not cqw.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…nnot push content out of view

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…not shrink

The shell never scales a slide down (upscale is clamped at 1), but the
skill's cqw-first sizing led the agent to shrink desktop compositions on
phones. SlideView now provides a StageCtx with the stage's width, height,
upscale and a narrow flag (< 700px); slide components read it with
useStage() from @/slide/stage to restack in JSX. Skill: below ~700px the
slide is a different one-column layout, clamp() minimums are real phone
reading sizes, and the narrow check must read like a phone page.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… on a narrow stage

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
useStage() now also reports compact (< 1100px, iPad portrait/landscape and
small windows) and portrait (taller than wide). Skill: phone, tablet and
portrait tiers each get a layout; the canonical text-beside-chart example
stacks on narrow or portrait stages; the self-check covers 390x844,
820x1180, 1180x820 and 1600x900.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ames a shell change

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e user names a shell change"

This reverts commit fbb640d.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant