Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
0411df4
feat(bolt-slides): replace the JSX starter with the slides v2 studio
geotrev Aug 24, 2026
1d41faf
fix(bolt-slides): treat presenter as a capability, not a query string
geotrev Aug 24, 2026
b670e57
fix(bolt-slides): keep store refreshes from clobbering in-flight edits
geotrev Aug 24, 2026
7f0d093
fix(bolt-slides): align deck-api throttle and schema notes with access()
geotrev Aug 24, 2026
88ac3ed
fix(bolt-slides): sanitize notes paste and drop canvas drag listeners
geotrev Aug 24, 2026
86fc0c5
docs(bolt-slides): match cloud-setup permissions to deck-api
geotrev Aug 24, 2026
6ba1d7f
fix(bolt-slides): keep structural slide writes in the refresh in-flig…
geotrev Aug 24, 2026
1012cf8
fix(bolt-slides): apply prettier to files failing format:check
geotrev Aug 24, 2026
063bbf4
fix(bolt-slides): close editor modals with Esc and per-card share status
geotrev Aug 24, 2026
dad970b
feat(bolt-slides): restyle skeleton chrome to Bolt DS tokens BOU-2539
geotrev Aug 24, 2026
2be547a
fix(bolt-slides): make size percent editable and toast PDF status
geotrev Aug 25, 2026
ff8a84c
fix(bolt-slides): stop size edits from nesting {s:} markers
geotrev Aug 25, 2026
ea687a7
fix(bolt-slides): unregister Freeform from the starter layout set
geotrev Aug 25, 2026
be90db5
fix(bolt-slides): trap editor dialogs and keep text styles in PDF export
geotrev Aug 25, 2026
cd5e817
fix(bolt-slides): keep PDF export in the iframe and only flatten clip…
geotrev Aug 25, 2026
020b389
fix(bolt-slides): yield to the UI between PDF slide rasters
geotrev Aug 25, 2026
c5f81ea
feat(bolt-slides): treat the published origin as the audience deck
geotrev Aug 25, 2026
6a3a001
fix(bolt-slides): hide disabled tooltips, raise the dock on focus, an…
geotrev Aug 25, 2026
ac00644
fix(bolt-slides): theme New slide thumbs from tokens, insert none bac…
geotrev Aug 26, 2026
700dad7
fix(bolt-slides): derive atmosphere and glow from the deck accent
geotrev Aug 26, 2026
a5e0585
fix(bolt-slides): show visual text size in pixels, keep em on the slide
geotrev Aug 26, 2026
4cac08b
fix(bolt-slides): copy live theme tokens into the PDF export iframe
geotrev Aug 26, 2026
0e1a072
fix(bolt-slides): apply format-bar px steps immediately
geotrev Aug 26, 2026
26ad2da
fix(bolt-slides): yield during PDF raster so the preview can stay alive
geotrev Aug 27, 2026
df2f220
feat(bolt-slides): author decks in deck.json instead of Postgres
geotrev Aug 27, 2026
391a033
fix(bolt-slides): edit notes in the studio and make Download as a key…
geotrev Aug 27, 2026
4256859
fix(bolt-slides): resolve kebab layout names and treat studio notes a…
geotrev Aug 27, 2026
0974923
fix(bolt-slides): embed PDF fonts and keep focus in the notes popover
geotrev Aug 27, 2026
810ebb1
fix(bolt-slides): open dock P on the published bolt.host URL
geotrev Aug 27, 2026
2f59350
fix(bolt-slides): open dock P on the current origin
geotrev Aug 27, 2026
746f70e
fix(bolt-slides): raster PDF at 1x and embed JPEG so the preview can …
geotrev Aug 28, 2026
3b1955b
fix(bolt-slides): give every slide an opaque theme background
geotrev Aug 28, 2026
52031d6
chore(bolt-slides): add ESLint aligned with the Vite React starters
geotrev Aug 28, 2026
669eb59
refactor(bolt-slides): rename opaque identifiers on the present/studi…
geotrev Aug 28, 2026
4323ff6
refactor(bolt-slides): extract Deck hooks and take slides as data
geotrev Aug 28, 2026
fad8f91
refactor(bolt-slides): split Annotator ink and notes format modules
geotrev Aug 28, 2026
bc735e2
chore(bolt-slides): tighten exports and clear ESLint warnings
geotrev Aug 28, 2026
b031b62
feat(bolt-slides): share one dock across editor, present, and published
geotrev Aug 28, 2026
5e52fcc
fix(bolt-slides): keep thumb 16:9 and ease stage size between views
geotrev Aug 28, 2026
706eb56
fix(bolt-slides): lighten dock chrome and match rail timing to the stage
geotrev Aug 28, 2026
8bd6377
fix(bolt-slides): spring stage layout and anchor annotate above the dock
geotrev Aug 28, 2026
788c3fb
chore(bolt-slides): drop unused layouts, chrome, and freeform
geotrev Aug 28, 2026
a2427c7
fix(bolt-slides): keep rail thumbs mounted until the close spring fin…
geotrev Aug 28, 2026
7fb28a6
fix(bolt-slides): double-click grid thumbs and restyle present close
geotrev Aug 31, 2026
3753b0d
fix(bolt-slides): keep grid arrows on the focus ring, not the live slide
geotrev Aug 31, 2026
4555bf7
fix(bolt-slides): outline thumb frames so 16:9 thumbs don't letterbox
geotrev Aug 31, 2026
aa66fce
fix(bolt-slides): dock export, grid delete, and presenter page sync
geotrev Sep 1, 2026
a3648b1
fix(bolt-slides): fullscreen on Play and quiet present/grid chrome
geotrev Sep 1, 2026
6ca8e69
fix(bolt-slides): overflow menus on thumbs and a true grid tab order
geotrev Sep 1, 2026
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
2 changes: 2 additions & 0 deletions bolt-slides/.bolt/prompt
Original file line number Diff line number Diff line change
@@ -1,3 +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`.

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`.
562 changes: 251 additions & 311 deletions bolt-slides/.bolt/skills/slides/SKILL.md

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions bolt-slides/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ lerna-debug.log*
node_modules
dist
dist-ssr
.vite
*.local

.vscode/*
Expand All @@ -21,3 +22,5 @@ dist-ssr
*.sln
*.sw?
.env

public/og.png
75 changes: 48 additions & 27 deletions bolt-slides/README.md
Original file line number Diff line number Diff line change
@@ -1,36 +1,57 @@
# Bolt slides skill
# Bolt Slides

A Bolt skill that builds a premium, **responsive React presentation deck** — classic
paged slides you present one at a time, with a Slidev-style floating dock + thumbnail
rail, grid overview, click-builds, annotation, and presenter mode — but each slide is a
responsive web layout (no fixed canvas, no clipping) built from a rich component
library.
A Pitch-style slide studio for [Bolt](https://bolt.new): prompt a deck into
`deck.json`, refine it in the studio rail, present full-screen, and
download PDF or JSON.

## The skill
The prompt skill writes `deck.json` (and `src/styles/tokens.css` for
theme). The studio and the published audience deck both read that file.

This repo **is** the running app. The authoring guide lives at
[`.bolt/skills/slides/SKILL.md`](./.bolt/skills/slides/SKILL.md); the app itself sits
at the repo root — a complete Vite + React deck: the paged engine + chrome
(`src/deck/`), fourteen slide layouts (`src/components/`: Cover, BigNumber,
Contrast, Chat, Globe, Bento, Split, StatGrid, Section, Quote, Pricing, Steps,
Agenda, Team) plus a dozen building blocks (Table, Comparison, Tabs, Accordion, Timeline,
CodeWindow, BrowserFrame, SpotlightCard, charts, CountUp, TiltCard, Marquee, …),
and the token-driven theme (`src/styles/`). The engine is left as-is; only the
`:root` token block and the slides in `src/App.tsx` are authored per deck.
## Quick start

## Add it in Bolt
```bash
npm install
npm run dev # studio at http://localhost:5173 — Present swaps this view
npm run lint # ESLint (same kit as bolt-vite-react-ts)
npm run typecheck
```

1. In Bolt's **Add skill from GitHub**, paste this repo's URL —
`https://github.com/inkko44/bolt-slides-skill`.
2. The `slides` skill auto-discovers at `.bolt/skills/slides.md`.
3. Tell Bolt to use the `slides` skill and build a deck about your topic/brand.
Prompt a deck with the `slides` skill, or edit `deck.json` directly.
In the studio, drag to reorder, right-click a thumbnail to
duplicate or delete, edit speaker notes, then Present or Download
as PDF / JSON.

## Run it locally
## What's inside

```bash
npm install
npm run dev
- `/` — In Bolt this is the studio: slide management, canvas, and
speaker notes. The bottom bar pages the deck and holds notes,
Download as (PDF, JSON), and Present. Present replaces the studio
in place (Esc or the dock close control returns). The published
origin is the audience deck. **P** on the dock opens the presenter
console in a second window.
- `/present?presenter=1` — Presenter console: notes (read-only),
next-up, timer, highlight, note text size.

Collaborate by sharing the Bolt project.

## The skill

`.bolt/skills/slides/SKILL.md` covers bootstrap (mint `boltSlidesId` on
first write) and authoring `deck.json` plus `src/styles/tokens.css`.

## Architecture

```
deck.json canonical deck (envelope + slides)
src/data/ types + zustand store (Vite DEV persists via POST /__deck)
src/layouts/ layout registry
src/components/ section components
src/deck/ presentation engine
src/edit/ studio chrome
src/styles/tokens.css theme: edit :root values only
```

`npm run dev` opens the deck at `/`. Re-theme everything by editing one `:root` block
in `src/styles/tokens.css`.
## Theming

Everything visual derives from the `:root` tokens in `src/styles/tokens.css`.
`--accent` must stay a solid color.
79 changes: 79 additions & 0 deletions bolt-slides/deck.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
{
"boltSlidesVersion": 1,
"deck": {
"title": "Slides",
"transition": "fade"
},
"slides": [
{
"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": "Open with the one-line promise of the deck.",
"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.",
"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"
}
]
}
34 changes: 34 additions & 0 deletions bolt-slides/eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import js from '@eslint/js';
import globals from 'globals';
import reactHooks from 'eslint-plugin-react-hooks';
import reactRefresh from 'eslint-plugin-react-refresh';
import tseslint from 'typescript-eslint';

export default tseslint.config(
{ ignores: ['dist'] },
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ['**/*.{ts,tsx}'],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
plugins: {
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
},
rules: {
...reactHooks.configs.recommended.rules,
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
},
/* Layout catalogs export schema + Render functions, not Fast Refresh
boundaries. Same kit as bolt-vite-react-ts otherwise. */
{
files: ['src/layouts/**/*.{ts,tsx}'],
rules: { 'react-refresh/only-export-components': 'off' },
}
);
17 changes: 11 additions & 6 deletions bolt-slides/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,18 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- Always replace the title + favicon emoji to match the deck topic -->
<title>Replace — your deck title</title>
<link
rel="icon"
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🎞️</text></svg>"
/>
<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" />
<!-- 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." />
<meta property="og:type" content="website" />
<meta property="og:image" content="/og.png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="/og.png" />
</head>
<body>
<div id="root"></div>
Expand Down
Loading
Loading