A data-driven presentation framework built with React + Vite. Design your slide layouts once as React components, then generate presentations by editing a single data file (src/slides.js).
Built to be driven by an AI agent — give it context about a customer/prospect and it generates slides.js with tailored content.
npm install
npm run devOpen the URL shown in terminal. Navigate with arrow keys or click (left third = back, right two-thirds = forward).
src/slides.js ← THE ONLY FILE YOU EDIT PER PRESENTATION
src/slides/*.jsx ← Slide layout components (edit once, reuse forever)
src/theme.js ← Colors and fonts (your brand)
src/DeckApp.jsx ← Navigation, scaling, keyboard/click handlers
src/SlideRenderer.jsx ← Maps slide type → component
All slides render at 1920×1080 and scale to fit any viewport.
Full-screen headline with subtitle.
{
type: 'title',
headline: 'Line One\nLine Two', // \n for line breaks
subtitle: 'Optional subtitle',
}Accent-colored divider slide.
{
type: 'section',
headline: 'Section Title',
subtitle: 'Optional subtitle',
}Headline with two side-by-side columns.
{
type: 'twoColumn',
headline: 'Comparison',
left: { title: 'Column A', body: 'Left column content.' },
right: { title: 'Column B', body: 'Right column content.' },
}Headline with a grid of cards (auto-sizes 1-3 columns).
{
type: 'cardGrid',
headline: 'Key Points',
body: 'Optional intro text.',
cards: [
{ label: '01', title: 'Card Title', description: 'Card body.' },
// ... up to 6 cards
],
footnote: 'Optional footnote.',
}Numbered list. Items can be strings or { title, description } objects.
{
type: 'bullets',
headline: 'Steps',
items: [
'Simple string item',
{ title: 'Rich item', description: 'With a description.' },
],
}Pill/chip seeds for brainstorming or Q&A.
{
type: 'discussion',
headline: 'Discussion',
seeds: ['Topic one', 'Topic two', 'Topic three'],
}Centered image with optional headline and caption. Place images in public/.
{
type: 'image',
headline: 'Architecture',
src: '/diagram.png',
alt: 'System architecture',
caption: 'Optional caption text.',
}Large pull quote with attribution.
{
type: 'quote',
quote: 'The quote text.',
attribution: 'Person Name',
role: 'Title, Company',
}Edit src/theme.js to set your colors and fonts:
const theme = {
colors: {
bg: '#FFFFFF',
text: '#1a1a1a',
textMuted: '#666666',
textLight: '#999999',
accent: '#2563eb', // your brand color
accentLight: '#dbeafe', // light variant for pills/badges
border: '#e5e5e5',
cardBg: '#f9f9f9',
},
fonts: {
heading: "Georgia, serif",
body: "system-ui, sans-serif",
mono: "ui-monospace, monospace",
},
};- Add
.woff2files topublic/fonts/ - Add
@font-facedeclarations inindex.html - Reference them in
theme.js
- Create
src/slides/MySlide.jsx— receives{ slide }prop - Register it in
src/SlideRenderer.jsx:import MySlide from './slides/MySlide'; const RENDERERS = { ..., myType: MySlide };
- Use
{ type: 'myType', ... }inslides.js
The design separates data from presentation so an AI agent can generate slides programmatically:
- Agent gathers context (CRM data, call transcripts, account info)
- Agent writes
src/slides.jswith tailored content npm run devserves the deck- User iterates with the agent ("change the title", "add a use case")
The agent only needs to know the slide type schemas above — it never touches the React components.
react+react-dom— UI renderingvite+@vitejs/plugin-react— dev server and build
No slide framework (no reveal.js, no slidev). Pure React.