Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions bolt-slides/.bolt/prompt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Import project modules with the `@/` path alias, which maps to `src/` (e.g. `@/components/Foo` == `src/components/Foo`), instead of deep relative paths like `../../components/Foo`.
Import project modules with the `@/` path alias, which maps to `src/` (e.g. `@/deck/Slide` == `src/deck/Slide`), instead of deep relative paths like `../../deck/Slide`.

This template uses Vite 8. `resolve.tsconfigPaths: true` is a valid built-in Vite option. Preserve it for the `@/` alias; do not claim it is invalid or add the `vite-tsconfig-paths` plugin.

Author decks by writing `deck.json` and `src/styles/tokens.css`. Follow `.bolt/skills/slides/SKILL.md`. Layout `props` match `src/data/layoutProps.ts`.
Author decks by writing one React component per slide in `src/slides/` and listing them in `deck.json` (theme in `src/styles/tokens.css`). Follow `.bolt/skills/slides/SKILL.md`. There is no house style: design each deck's palette, type, imagery and composition for its subject. Every slide must be responsive.
488 changes: 331 additions & 157 deletions bolt-slides/.bolt/skills/slides/SKILL.md

Large diffs are not rendered by default.

64 changes: 41 additions & 23 deletions bolt-slides/README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
# Bolt Slides

A Pitch-style slide studio for [Bolt](https://bolt.new): prompt a deck into
`deck.json`, refine it in the studio, present in a new tab, and
download PDF or JSON.
A Pitch-style slide studio for [Bolt](https://bolt.new): prompt a deck,
refine it in the studio, present in a new tab, and download PDF or JSON.

The prompt skill (`.bolt/skills/slides/SKILL.md`) covers bootstrap
(mint `boltSlidesId` on first write) and authoring. Layout `props`
shapes live in `src/data/layoutProps.ts`.
Each slide is a React component in `src/slides/`, listed in `deck.json`.
There is no layout catalog and no house style — no theme, type scale,
palette or imagery is imposed; the agent designs every slide for the deck
at hand. The one rule is that every slide is responsive — it renders at
phone width, in the thumbnail rail, on a projector and at 1280×720 in the
PDF.

The prompt skill (`.bolt/skills/slides/SKILL.md`) covers bootstrap (mint
`boltSlidesId` on first write), the slide component contract, the
`deck.json` shape and the responsiveness rule.

## Quick start

Expand All @@ -17,10 +23,10 @@ npm run lint # ESLint (same kit as bolt-vite-react-ts)
npm run typecheck
```

Prompt a deck with the `slides` skill, or edit `deck.json` directly.
In the studio, drag to reorder, use a thumbnail’s ••• menu (or
right-click) to duplicate or delete, edit speaker notes, then Present
or Download as PDF / JSON.
Prompt a deck with the `slides` skill, or write `src/slides/*.tsx` and
`deck.json` directly. In the studio, drag to reorder, use a thumbnail’s
••• menu (or right-click) to duplicate or delete, edit speaker notes, then
Present or Download as PDF / JSON.

## What's inside

Expand All @@ -34,26 +40,38 @@ or Download as PDF / JSON.

Collaborate by sharing the Bolt project.

## The skill
## Authoring

`.bolt/skills/slides/SKILL.md` covers bootstrap (mint `boltSlidesId` on
first write) and authoring `deck.json` plus `src/styles/tokens.css`.
Layout `props` shapes live in `src/data/layoutProps.ts`.
- `src/slides/<name>.tsx` — a slide: default-export a component typed
`SlideComponent` (from `@/slide/registry`). It receives the deck.json
entry as `slide`; `slide.props` is free-form data it may read.
`@/deck/Slide`, `@/deck/Reveal`, `@/deck/Build` and
`@/deck/useInView` are optional helpers.
- `deck.json` — the ordered slides. `layout` is the component filename
(without `.tsx`); `background`, `animation`, `transition`, `nav`,
`notes` and `status` are read by the studio, presenter and export.
- `src/styles/tokens.css` — the few CSS variables the shell reads
(`--bg`, `--fg`, `--accent`, fonts, gutters). Neutral fallbacks; set
them per deck or ignore them.

## Architecture

```
deck.json canonical deck (envelope + slides)
src/data/ types, layout props contract, zustand store
src/layouts/ layout registry
src/components/ section components
src/deck/ presentation engine
deck.json canonical deck (envelope + slide entries)
src/slides/ the deck's slide components (authored per deck)
src/slide/ SlideView + the src/slides registry (import.meta.glob)
src/data/ types, zustand store, deck.json persistence
src/deck/ presentation engine + chrome (dock, rail, grid, presenter)
src/studio/ studio chrome
src/copy/ stamped deck text + visual-edit persist
src/styles/tokens.css theme: edit :root values only
src/present/ audience / speaker routes
src/export/ PDF export
src/copy/ rich text + in-place text edit persist
src/styles/tokens.css shell fallbacks (--bg, --fg, --accent, fonts, gutters)
```

## Theming

Everything visual derives from the `:root` tokens in `src/styles/tokens.css`.
`--accent` must stay a solid color.
There is none built in. Slide components carry their own design. The
`:root` variables in `src/styles/tokens.css` are only the fallbacks the
shell reads (slide surface, inherited text color, the `==accent==` marker
color, deck-level font pairing, `<Slide>` gutters).
113 changes: 4 additions & 109 deletions bolt-slides/deck.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,122 +8,17 @@
{
"id": "s1",
"position": 0,
"layout": "cover",
"props": {
"kicker": "Company · 2026",
"title": "A ==bold== opening.",
"subtitle": "One sharp sentence on what this deck argues.",
"foot": "August 2026 · Your name"
},
"background": {
"type": "color",
"color": "var(--bg)"
},
"animation": "cascade",
"transition": null,
"nav": null,
"notes": "# This is test text.\n\n# Test text line two.\n\n# Another line, oh no.",
"status": "none"
},
{
"id": "s2",
"position": 1,
"layout": "statement",
"props": {
"kicker": "",
"title": "Say the ==one thing== this slide exists to say.",
"body": ""
},
"background": {
"type": "color",
"color": "var(--bg)"
},
"animation": "cascade",
"transition": null,
"nav": null,
"notes": "Land the thesis. Pause before you click on. hello!",
"status": "none"
},
{
"id": "s3",
"position": 2,
"layout": "bigNumber",
"props": {
"kicker": "The market",
"value": "$3T",
"caption": "moves through this problem every year",
"foot": "Source: —"
},
"background": {
"type": "color",
"color": "var(--bg)"
},
"animation": "cascade",
"transition": null,
"nav": null,
"notes": "Give the figure a beat, then say what it means for us.",
"status": "none"
},
{
"id": "s4",
"position": 3,
"layout": "agenda",
"props": {
"kicker": "Agenda",
"title": "What we'll cover.",
"items": [
{
"title": "The problem",
"hint": "5 min"
},
{
"title": "The product"
},
{
"title": "The ask"
}
]
},
"background": {
"type": "color",
"color": "var(--bg)"
},
"animation": "cascade",
"transition": null,
"nav": null,
"notes": "Preview the arc so they know where this is going.",
"status": "none"
},
{
"id": "a0706894",
"position": 4,
"layout": "agenda",
"props": {
"kicker": "Agenda",
"title": "What we'll cover.",
"items": [
{
"title": "The problem",
"hint": "5 min"
},
{
"title": "The product"
},
{
"title": "The ask"
}
]
},
"layout": "welcome",
"props": {},
"background": {
"type": "color",
"color": "var(--bg)"
},
"animation": "cascade",
"transition": null,
"nav": null,
"notes": "Preview the arc so they know where this is going.",
"notes": "",
"status": "none"
}
],
"boltSlidesId": "11011050-f9d6-4d43-8a9e-3e43af51bbaf"
]
}
6 changes: 3 additions & 3 deletions bolt-slides/eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ export default tseslint.config(
],
},
},
/* Layout catalogs export schema + Render functions, not Fast Refresh
boundaries. Same kit as bolt-vite-react-ts otherwise. */
/* The slide registry exports the component map next to its renderer,
not a Fast Refresh boundary. Same kit as bolt-vite-react-ts otherwise. */
{
files: ['src/layouts/**/*.{ts,tsx}'],
files: ['src/slide/registry.tsx'],
rules: { 'react-refresh/only-export-components': 'off' },
}
);
2 changes: 1 addition & 1 deletion bolt-slides/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Slides</title>
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 178 227'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M103.267 198.762C87.1743 198.762 71.3565 192.914 62.2897 180.315L59.0909 195.151L0 226.551L6.37813 195.151L49.3961 0H102.089L86.8603 68.7856C99.1455 55.3229 110.567 50.3381 125.208 50.3381C156.823 50.3381 177.901 71.121 177.901 109.174C177.901 147.227 153.605 198.742 103.247 198.742L103.267 198.762ZM123.461 120.321C123.461 138.474 110.587 152.231 93.9056 152.231C84.5445 152.231 76.0469 148.718 70.493 142.576L78.6963 106.564C84.8389 100.421 91.8646 96.9083 100.068 96.9083C112.647 96.9083 123.48 106.269 123.48 120.321H123.461Z' fill='%231688FC'/%3E%3C/svg%3E" />
<meta name="theme-color" content="#05070a" />
<meta name="theme-color" content="#ffffff" />
<!-- OpenGraph — og.png is generated from slide 1 -->
<meta property="og:title" content="Slides" />
<meta property="og:description" content="A deck built with Bolt Slides." />
Expand Down
63 changes: 0 additions & 63 deletions bolt-slides/src/components/Accordion.tsx

This file was deleted.

73 changes: 0 additions & 73 deletions bolt-slides/src/components/Agenda.tsx

This file was deleted.

Loading
Loading