Slidev Deck Builder
Build presentation decks using Slidev with a customizable brand theme, Tailwind CSS, and Vue components.
Customize for your brand: Before first use, update references/theme-guide.md with your brand colours, fonts, logos, and naming. Rename components and assets to match your organization.
Workflow
- Brainstorm first — Understand the narrative before writing code. Ask one question at a time, prefer multiple-choice. Agree on structure (slide count, arc, content per slide) before implementation.
- Scaffold the deck — Copy the brand theme from an existing deck (components, layouts, styles, assets). Create the folder, Makefile targets, and a starter
slides.md.
- Build slide by slide — Write content, source images, create components. Expect visual iteration via screenshots.
- Add flair — Animations, transitions, and visual polish come after content is solid.
- Add speaker notes — Write talking points as
<!-- --> comments after each slide's content.
Theme Setup
Every new deck MUST include the base brand theme files. Copy from an existing deck:
components/BrandFooter.vue — Footer with logo, URL, page number
components/ContentFrame.vue — Standard content frame with dot grid header, title, summary, footer
layouts/cover.vue — Dark cover slide with background image and logo
layouts/default.vue — Wraps ContentFrame
layouts/section.vue — Centered text via ContentFrame
layouts/center.vue — Centered content
layouts/two-cols.vue — Two-column grid
styles/index.css — Print media overrides
assets/title-background.png — Cover background
assets/logo.png — Brand logo (white, for dark backgrounds)
For full theme reference (frontmatter template, component props, Makefile pattern): read references/theme-guide.md.
Critical Rules
Content Overflow
Slides have a fixed viewport. Content WILL get clipped if it overflows. Design conservatively:
- Start with smaller font sizes than you think you need
- Test visually after every content change
- Use the
summary frontmatter field for bottom-of-slide text — it renders in a dedicated zone that won't clip
ContentFrame Style Overrides
ContentFrame applies :deep() styles to ul, ol, li, p, h1-h3, table, blockquote inside its content area. These override inline Tailwind classes. To force smaller sizes in child components, use :deep() with !important in the component's scoped styles.
YAML Frontmatter
- Values containing
#, :, or " MUST be wrapped in double quotes
- Escape inner quotes with
\"
- The
summary field is especially useful — it renders in a fixed position above the footer
HTML in Markdown
- NO blank lines inside HTML blocks — blank lines re-enter markdown mode and break rendering
- NO indentation of nested HTML — indented HTML renders as code blocks
- Keep HTML blocks tight and flush-left
Components & Tailwind
Always Use Components
Extract any repeated pattern into a Vue component in components/. Examples: cards, team members, visual elements, animated widgets. Pass data via props, use slots for flexible content.
Always Use Tailwind
Use Tailwind utility classes for all styling. Use arbitrary values [Xpx] for precise control. Match the existing deck patterns — the theme uses specific spacing scales and colour tokens via CSS variables.
Theme Colour Tokens
Access via CSS variables in Tailwind arbitrary values:
var(--slidev-theme-ink) — primary text
var(--slidev-theme-muted) — secondary text
var(--slidev-theme-muted-2) — tertiary text
var(--slidev-theme-rule) — divider lines
var(--slidev-theme-card-bg) — card backgrounds
var(--slidev-theme-card-border) — card borders
Stock Images
When sourcing images:
- Pexels is the most reliable free source. URL pattern:
https://images.pexels.com/photos/{id}/pexels-photo-{id}.jpeg?auto=compress&cs=tinysrgb&w=800
- Unsplash download pattern:
https://unsplash.com/photos/{id}/download?force=true&w=800 (may 403)
- Always download 3-5 candidates and verify visually before choosing
- Free stock sites lack dramatic/conceptual imagery (robot armies, abstract AI). Flag this early — the user may need to generate images with AI tools or source from paid sites
- Copy chosen images to the deck's
assets/ folder
Animations
CSS animations work well in Slidev. Keep them subtle and slow:
- Timing: 4-12 second cycles feel premium. 1-2 second cycles feel cheap.
- Stagger: Offset animation delays across elements so they don't pulse together.
- Use
scoped: Always use <style scoped> in components. For slide-level animations, use a raw <style> block in markdown.
- requestAnimationFrame: For per-element JavaScript animations (e.g. dot grids with per-dot behaviour), use a Vue component with
requestAnimationFrame for smooth 60fps.
Iteration Pattern
The user iterates visually:
- They run
make deck-name to preview
- They screenshot issues and describe what's wrong
- Fix the specific issue they pointed at — don't re-read the whole file
- Repeat until they're happy
Common iteration issues:
- Content clipped at bottom → reduce font sizes, gaps, padding
- Too much whitespace → tighten padding, reduce gaps
- Text too small/large → adjust font sizes
- Images wrong → source new ones, verify visually
- Needs more flair → add animations, gradients, glows
1---2name: deck3description: Create and iterate on Slidev presentation decks using a customizable brand theme. Use when the user asks to create a new presentation, slide deck, or slides, or wants to modify/add slides to an existing deck. Triggers on: 'new deck', 'new presentation', 'new slides', 'slide deck', 'make a presentation', or any request involving Slidev markdown slides in the presentations/ directory.4---56# Slidev Deck Builder78Build presentation decks using Slidev with a customizable brand theme, Tailwind CSS, and Vue components.910> **Customize for your brand**: Before first use, update `references/theme-guide.md` with your brand colours, fonts, logos, and naming. Rename components and assets to match your organization.1112## Workflow13141. **Brainstorm first** — Understand the narrative before writing code. Ask one question at a time, prefer multiple-choice. Agree on structure (slide count, arc, content per slide) before implementation.152. **Scaffold the deck** — Copy the brand theme from an existing deck (components, layouts, styles, assets). Create the folder, Makefile targets, and a starter `slides.md`.163. **Build slide by slide** — Write content, source images, create components. Expect visual iteration via screenshots.174. **Add flair** — Animations, transitions, and visual polish come after content is solid.185. **Add speaker notes** — Write talking points as `<!-- -->` comments after each slide's content.1920## Theme Setup2122Every new deck MUST include the base brand theme files. Copy from an existing deck:2324- `components/BrandFooter.vue` — Footer with logo, URL, page number25- `components/ContentFrame.vue` — Standard content frame with dot grid header, title, summary, footer26- `layouts/cover.vue` — Dark cover slide with background image and logo27- `layouts/default.vue` — Wraps ContentFrame28- `layouts/section.vue` — Centered text via ContentFrame29- `layouts/center.vue` — Centered content30- `layouts/two-cols.vue` — Two-column grid31- `styles/index.css` — Print media overrides32- `assets/title-background.png` — Cover background33- `assets/logo.png` — Brand logo (white, for dark backgrounds)3435For full theme reference (frontmatter template, component props, Makefile pattern): read [references/theme-guide.md](references/theme-guide.md).3637## Critical Rules3839### Content Overflow4041Slides have a fixed viewport. Content WILL get clipped if it overflows. Design conservatively:42- Start with smaller font sizes than you think you need43- Test visually after every content change44- Use the `summary` frontmatter field for bottom-of-slide text — it renders in a dedicated zone that won't clip4546### ContentFrame Style Overrides4748ContentFrame applies `:deep()` styles to `ul`, `ol`, `li`, `p`, `h1-h3`, `table`, `blockquote` inside its content area. These override inline Tailwind classes. To force smaller sizes in child components, use `:deep()` with `!important` in the component's scoped styles.4950### YAML Frontmatter5152- Values containing `#`, `:`, or `"` MUST be wrapped in double quotes53- Escape inner quotes with `\"`54- The `summary` field is especially useful — it renders in a fixed position above the footer5556### HTML in Markdown5758- NO blank lines inside HTML blocks — blank lines re-enter markdown mode and break rendering59- NO indentation of nested HTML — indented HTML renders as code blocks60- Keep HTML blocks tight and flush-left6162## Components & Tailwind6364### Always Use Components6566Extract any repeated pattern into a Vue component in `components/`. Examples: cards, team members, visual elements, animated widgets. Pass data via props, use slots for flexible content.6768### Always Use Tailwind6970Use Tailwind utility classes for all styling. Use arbitrary values `[Xpx]` for precise control. Match the existing deck patterns — the theme uses specific spacing scales and colour tokens via CSS variables.7172### Theme Colour Tokens7374Access via CSS variables in Tailwind arbitrary values:75- `var(--slidev-theme-ink)` — primary text76- `var(--slidev-theme-muted)` — secondary text77- `var(--slidev-theme-muted-2)` — tertiary text78- `var(--slidev-theme-rule)` — divider lines79- `var(--slidev-theme-card-bg)` — card backgrounds80- `var(--slidev-theme-card-border)` — card borders8182## Stock Images8384When sourcing images:85- Pexels is the most reliable free source. URL pattern: `https://images.pexels.com/photos/{id}/pexels-photo-{id}.jpeg?auto=compress&cs=tinysrgb&w=800`86- Unsplash download pattern: `https://unsplash.com/photos/{id}/download?force=true&w=800` (may 403)87- Always download 3-5 candidates and verify visually before choosing88- Free stock sites lack dramatic/conceptual imagery (robot armies, abstract AI). Flag this early — the user may need to generate images with AI tools or source from paid sites89- Copy chosen images to the deck's `assets/` folder9091## Animations9293CSS animations work well in Slidev. Keep them subtle and slow:94- **Timing**: 4-12 second cycles feel premium. 1-2 second cycles feel cheap.95- **Stagger**: Offset animation delays across elements so they don't pulse together.96- **Use `scoped`**: Always use `<style scoped>` in components. For slide-level animations, use a raw `<style>` block in markdown.97- **requestAnimationFrame**: For per-element JavaScript animations (e.g. dot grids with per-dot behaviour), use a Vue component with `requestAnimationFrame` for smooth 60fps.9899## Iteration Pattern100101The user iterates visually:1021. They run `make deck-name` to preview1032. They screenshot issues and describe what's wrong1043. Fix the specific issue they pointed at — don't re-read the whole file1054. Repeat until they're happy106107Common iteration issues:108- Content clipped at bottom → reduce font sizes, gaps, padding109- Too much whitespace → tighten padding, reduce gaps110- Text too small/large → adjust font sizes111- Images wrong → source new ones, verify visually112- Needs more flair → add animations, gradients, glows