Slide Deck Builder — Technical Instructions
You are building a browser-based presentation slide deck as a React + Vite app. Your job is to produce slides that feel handcrafted and intentional — never generic or AI-generated looking.
Before you begin coding any slides, you MUST ask the user for the presentation content/topic if it has not been provided. Do not invent content. You may scaffold the app shell and styling system first, but all actual slide content must come from the user or from slide-guidelines.md in this directory.
1. Tech Stack
| Layer |
Choice |
| Build |
Vite |
| Framework |
React 18+ with TypeScript |
| Animation |
Framer Motion (motion/react) |
| Styling |
Tailwind CSS v4 |
| Charts |
Recharts |
| Icons |
Lucide React |
| Routing |
Keyboard/click navigation (no router needed) |
| Code highlighting |
(only if needed) Prism React Renderer |
Install only what you need. Do not add libraries speculatively.
2. Project Structure
slides/
├── index.html
├── package.json
├── vite.config.ts
├── tailwind.config.ts
├── tsconfig.json
├── public/
│ └── images/ # All slide images go here
├── src/
│ ├── main.tsx
│ ├── App.tsx # Slide deck shell, navigation, keyboard controls
│ ├── index.css # Tailwind imports + custom fonts + base styles
│ ├── slides/
│ │ ├── index.ts # Export ordered array of all slides
│ │ ├── 01-intro.tsx
│ │ ├── 02-problem.tsx
│ │ └── ... # One file per slide or small group of related slides
│ ├── components/
│ │ ├── SlideLayout.tsx # Shared slide wrapper (scaling, padding, background)
│ │ ├── AnimatedText.tsx # Reusable text entrance animations
│ │ ├── Chart.tsx # Recharts wrapper
│ │ ├── ImageSlide.tsx # Image display component
│ │ ├── InteractiveBlock.tsx # For custom interactive UI per slide
│ │ └── ...
│ └── lib/
│ ├── animations.ts # Shared Framer Motion variants and transitions
│ ├── theme.ts # Color palette, font sizes, spacing tokens
│ └── useSlideScale.ts # Hook for viewport-fitting scale
3. Style Discovery — Mood & Presets
Step 1: Ask the User for Mood
Before choosing colors and fonts, ask the user what feeling the audience should have:
| Mood |
Description |
| Impressed / Confident |
Professional, trustworthy, bold |
| Excited / Energized |
Innovative, bold, creative |
| Calm / Focused |
Clear, thoughtful, minimal |
| Inspired / Moved |
Emotional, memorable, elegant |
Step 2: Pick a Style Preset
Based on mood, suggest 2-3 presets from the table below. Each preset defines fonts, colors, and signature visual elements. Do NOT mix and match randomly — commit to one preset fully.
Dark Presets
| Preset |
Mood |
Display Font |
Body Font |
Colors |
Signature |
| Bold Signal |
Confident |
Archivo Black (900) |
Space Grotesk (400) |
#1a1a1a bg, #FF5722 accent card, white text |
Colored card as focal, large section numbers, grid layout |
| Electric Studio |
Confident |
Manrope (800) |
Manrope (400) |
#0a0a0a bg, #4361ee accent blue, white text |
Two-panel vertical split, accent bar on edge |
| Creative Voltage |
Energized |
Syne (700) |
Space Mono (400) |
#0066ff primary, #1a1a2e dark, #d4ff00 neon |
Electric blue + neon yellow, halftone textures |
| Dark Botanical |
Inspired |
Cormorant (400) serif |
IBM Plex Sans (300) |
#0f0f0f bg, #d4a574 warm accent, #e8b4b8 pink |
Abstract blurred gradient circles, thin accent lines |
Light Presets
| Preset |
Mood |
Display Font |
Body Font |
Colors |
Signature |
| Notebook Tabs |
Organized |
Bodoni Moda (700) serif |
DM Sans (400) |
#f8f6f1 page, #2d2d2d outer, colorful tabs |
Paper card on dark bg, colored section tabs |
| Pastel Geometry |
Friendly |
Plus Jakarta Sans (700) |
Plus Jakarta Sans (400) |
#c8d9e6 bg, #faf9f7 card, pastel pills |
Rounded card, vertical pills, soft shadow |
| Vintage Editorial |
Inspired |
Fraunces (700) serif |
Work Sans (400) |
#f5f3ee cream, #1a1a1a text, #e8d4c0 warm |
Geometric shapes (circle + line + dot), bold borders |
| Swiss Modern |
Focused |
Archivo (800) |
Nunito (400) |
Pure white, pure black, #ff3300 red accent |
Visible grid, asymmetric layouts, geometric shapes |
Specialty Presets
| Preset |
Mood |
Font |
Colors |
Signature |
| Neon Cyber |
Techy |
Clash Display + Satoshi |
#0a0f1c navy, #00ffcc cyan, #ff00aa magenta |
Neon glow, grid patterns, particle-like effects |
| Terminal Green |
Hacker |
JetBrains Mono |
#0d1117 dark, #39d353 green |
Scan lines, blinking cursor, code aesthetic |
| Paper & Ink |
Editorial |
Cormorant Garamond + Source Serif 4 |
#faf9f7 cream, #1a1a1a charcoal, #c41e3a crimson |
Drop caps, pull quotes, elegant horizontal rules |
Step 3: Apply the Preset
Once chosen, define the full theme in src/lib/theme.ts and as CSS custom properties in src/index.css:
- All colors from the preset
- Font families loaded from Google Fonts or Fontshare
- CSS variables for backgrounds, accents, text colors
- Use the preset's signature elements in at least the title slide and section transitions
4. Design System — Anti AI-Slop Rules
Typography
- Use the font pairing from your chosen preset. Load from Google Fonts or Fontshare via
@import in CSS.
- No more than 2 font families.
- Headlines: large and bold. Body text: scarce.
- Never center-align body paragraphs. Left-align or use deliberate layout.
- ALL font sizes must use
clamp(min, preferred, max) — never fixed px/rem for text. This ensures readability across viewport sizes.
/* Example clamp values */
--title-size: clamp(2rem, 6vw, 5rem);
--subtitle-size: clamp(0.875rem, 2vw, 1.25rem);
--body-size: clamp(0.75rem, 1.2vw, 1rem);
Color & Backgrounds
- Commit fully to your preset's palette. Define as CSS custom properties.
- Create atmosphere, not flat colors. Layer CSS gradients for depth instead of a single solid background color:
/* Layered gradient for depth */
background:
radial-gradient(ellipse at 20% 80%, rgba(120, 0, 255, 0.15) 0%, transparent 50%),
radial-gradient(ellipse at 80% 20%, rgba(0, 255, 200, 0.1) 0%, transparent 50%),
var(--bg-primary);
/* Subtle grid pattern for structure */
background-image:
linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px);
background-size: 50px 50px;
- Dominant colors with sharp accents outperform timid, evenly-distributed palettes.
Layout — Scaled Slide Container
- The slide is a fixed 1280×720px container scaled via CSS
transform: scale() to fit the viewport (like reveal.js). All content is authored at 1280×720 and uniformly scaled.
- Because of transform scaling, Tailwind's rem-based spacing appears smaller on screen. For any element that needs visible padding (cards, chips, buttons with backgrounds), use inline
style={{}} with px values instead of Tailwind padding classes.
- Minimum padding for elements with a background:
style={{ padding: '20px 48px' }} for horizontal chips, style={{ padding: '24px 32px' }} for content cards, style={{ padding: '16px 32px' }} for buttons.
- Generous whitespace. Content should breathe.
- Max 60% of the slide area should contain content. The rest is intentional empty space.
- Use CSS Grid or Flexbox. Avoid absolute positioning unless for decorative elements.
- The
SlideLayout component handles the scaling + centering.
Content Density Limits (NON-NEGOTIABLE)
Every slide MUST fit within the 1280×720 container. Content overflows? Split into multiple slides. Never cram, never scroll.
| Slide Type |
Maximum Content |
| Title slide |
1 heading + 1 subtitle + optional tagline |
| Content slide |
1 heading + 4-6 bullet points OR 1 heading + 2 short paragraphs |
| Feature grid |
1 heading + 6 cards maximum (2×3 or 3×2) |
| Chart slide |
1 heading + 1 chart |
| Quote slide |
1 quote (max 3 lines) + attribution |
| Image slide |
1 heading + 1 image (max 60% slide height) |
| Interactive slide |
1 heading + interactive element (keep controls minimal) |
Visual Rules — Backgrounds & Borders
- Do NOT wrap text content in background cards. Let text sit directly on the slide background. Use spacing and typography for hierarchy, not boxes.
- No nested backgrounds. Never put one colored box inside another.
- When an element MUST have a background (interactive buttons, chips, tags): use
bg-white/5 with border border-white/10 — never solid surface colors.
- Borders must be subtle. Use
border-l border-muted/20 for left accents, never border-l-2. Use border border-white/10 for containers.
- No drop shadows unless it's a hard shadow (offset, no blur) as a specific design choice.
- No rounded-full badges with gradient backgrounds.
- No decorative blobs, waves, or mesh gradients.
- Geometric accents are OK: lines, dots, simple shapes.
DO NOT USE — Banned AI Patterns
| Category |
Banned |
| Fonts |
Inter, Roboto, Arial, system fonts as display. Also avoid converging on Space Grotesk for every deck — vary your choices. |
| Colors |
#6366f1 (generic indigo), purple-on-white gradients, pastel rainbow, evenly-distributed "safe" palettes |
| Layouts |
Everything centered in a vertical stack, identical card grids, generic hero sections |
| Decorations |
Realistic illustrations, gratuitous glassmorphism, drop shadows without purpose, gradient mesh backgrounds |
What Makes It NOT Feel AI-Slop
- Asymmetric layouts (not everything centered in a stack)
- Oversized typography for emphasis
- Deliberate use of negative space
- Content that has opinion and edge, not generic filler
- Consistent but not monotonous — vary slide layouts across the deck
- Real images and data, not placeholder illustrations
- Surprise the viewer — make at least 1-2 unexpected layout choices per deck
5. Animation — Feeling-Driven Motion
Match Animation to Mood
| Feeling |
Animation Style |
Visual Cues |
| Dramatic / Cinematic |
Slow fade-ins (0.8-1.2s), large scale transitions (0.9→1) |
Dark backgrounds, spotlight effects |
| Techy / Futuristic |
Neon glow, text scramble/reveal effects |
Grid patterns, monospace accents, cyan/magenta |
| Playful / Friendly |
Bouncy easing (gentle spring), floating motion |
Rounded corners, bright colors |
| Professional |
Subtle fast animations (200-300ms), clean slides |
Precise spacing, data visualization focus |
| Calm / Minimal |
Very slow subtle motion, gentle fades |
High whitespace, muted palette, serif type |
| Editorial |
Staggered text reveals, image-text interplay |
Strong type hierarchy, pull quotes, grid-breaking |
Framer Motion Defaults
- Default duration: 0.4–0.6s. Avoid animations longer than 0.8s (unless cinematic mood).
- Default easing:
[0.25, 0.1, 0.25, 1] (smooth deceleration, equivalent to ease-out-expo)
- Stagger children by 0.08–0.12s, not more
Slide Transitions
- Use
AnimatePresence with mode="wait" for slide changes
- Slide enter: fade in + subtle translateY (20px) or translateX (30px)
- Slide exit: fade out quickly (0.2s)
- Do not use 3D transforms, rotations, or scale bounces for slide transitions
Content Animations (within a slide)
- Headline: fade in + translateY, arrives first
- Supporting content: staggered fade in after headline
- Charts/images: fade in + subtle scale from 0.95 to 1
- Use
variants pattern for orchestrated animations:
const container = {
hidden: { opacity: 0 },
show: {
opacity: 1,
transition: { staggerChildren: 0.1 }
}
};
const item = {
hidden: { opacity: 0, y: 20 },
show: { opacity: 1, y: 0, transition: { duration: 0.5, ease: [0.25, 0.1, 0.25, 1] } }
};
Progressive Reveal
- Some slides should reveal content in steps (click to advance within a slide)
- Track a
step state per slide when needed
- Animate items in/out based on current step
- Show a subtle progress indicator (dots or a thin bar) when a slide has multiple steps
What NOT to Do
- No
spring with high bounce (underdamped springs look toyish)
- No
rotate animations on text
- No continuous looping animations (except very subtle pulsing on interactive elements)
- No parallax scrolling within slides
- No animation on every single element — some things should just be there
- One well-orchestrated entrance per slide beats scattered micro-interactions
prefers-reduced-motion Support
Always include reduced-motion support. Wrap animation variants:
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
const item = prefersReducedMotion
? { hidden: { opacity: 0 }, show: { opacity: 1 } }
: { hidden: { opacity: 0, y: 20 }, show: { opacity: 1, y: 0, transition: { duration: 0.5 } } };
6. Slide Types & Components
Title Slide
- Oversized headline using
clamp(2.5rem, 6vw, 5rem)
- Optional subtitle
- Optional date or presenter name
- Minimal, dramatic layout
- Use preset's signature element (colored card, split panel, geometric shape, etc.)
Content Slide (Text)
- Headline + 2–5 short bullet points or a short paragraph
- Bullets should animate in with stagger
- Left-aligned text, right side can have supporting visual
- Max 4-6 bullets. Exceeds? Split into two slides.
Image Slide
- Full-bleed or large contained image
- Images are placed in
public/images/ by the user
- Reference as
/images/filename.ext
- Image max-height: 60% of slide height (432px at 720px)
- Support caption text below or overlaid with semi-transparent background
- Lazy load images
Chart Slide
- Use Recharts (BarChart, LineChart, PieChart, AreaChart)
- Style charts to match the deck theme — custom colors from preset, no default Recharts styling
- Animate chart entrance with Framer Motion wrapper
- Include clear labels and a headline
Comparison Slide
- Side-by-side or before/after layout
- Use a clear visual separator (accent line, not a heavy border)
- Animate left then right panel
Quote / Callout Slide
- Large text using
clamp(1.5rem, 3vw, 2.5rem), centered or left-aligned
- Accent color or background
- Attribution below in smaller text
- Max 3 lines for the quote.
Interactive Slide
- For slides that need custom UI (polls, toggles, demos, games)
- Build as self-contained components with local state
- Add
data-interactive attribute to prevent accidental slide navigation on click
- Add clear visual affordance that something is interactive (hover states, cursor)
Link References
- External URLs: render as styled links that open in new tab (
target="_blank")
- Local folder links: render as
file:/// protocol links with a folder icon
- Style links distinctly — underline + accent color, not default blue
7. Navigation & Controls
- Keyboard: Right arrow / Space / Enter = next, Left arrow = previous
- Click/Tap: Click right half = next, click left half = previous (skip elements with
data-interactive, button, input)
- Progress bar: Thin bar at bottom showing position in deck
- Slide counter: Small "3 / 28" indicator in bottom-right corner
- Support
step sub-navigation within slides before advancing to next slide
- Escape key: Toggle overview mode (grid of slide thumbnails) — nice to have, not required for v1
8. Content Guidelines
Refer to slide-guidelines.md in this directory for the pedagogical structure:
- Problem → Discussion → Concept → Example → Takeaway cycle
- One idea per slide
- Visual-first, minimal text
- Short headlines (6–8 words)
- Progressive reveal for complex information
- 60-70% visual slides, 10-15% charts/diagrams, 15-20% text explanation
You MUST ask the user for the actual content/topic before creating slides. The content guidelines above describe structure, not what goes in the slides.
9. Build & Run
npm create vite@latest . -- --template react-ts # Only if starting fresh
npm install
npm run dev
The app should run with npm run dev and be viewable at localhost. No build errors. No TypeScript errors.
10. Quality Checklist
Before delivering any batch of slides, verify:
11. Workflow
- Ask the user for mood and content — what feeling? What topic? How many modules?
- Pick a style preset — suggest 2-3 based on mood, let user choose
- Scaffold the app — set up Vite, Tailwind, Framer Motion, project structure, theme from preset, shared components
- Build slides in batches — implement 5–10 slides at a time, then ask for review
- Iterate — adjust based on feedback
- Images — when a slide needs an image, tell the user what image is needed and where to place it (
public/images/). Use a visible placeholder with the filename so they know what's missing.
Always keep the app in a runnable state. Never leave broken imports or missing files.
1---2name: slide-deck3description: Use when building browser-based presentation slide decks, creating training presentations, generating React+Vite slide decks with animations, or making professional slides. Triggers on slide deck, presentation, training slides, Vite slides, Framer Motion slides, animated presentations.4---56# Slide Deck Builder — Technical Instructions78You are building a browser-based presentation slide deck as a React + Vite app. Your job is to produce slides that feel handcrafted and intentional — never generic or AI-generated looking.910**Before you begin coding any slides, you MUST ask the user for the presentation content/topic if it has not been provided.** Do not invent content. You may scaffold the app shell and styling system first, but all actual slide content must come from the user or from `slide-guidelines.md` in this directory.1112---1314## 1. Tech Stack1516| Layer | Choice |17|-------|--------|18| Build | Vite |19| Framework | React 18+ with TypeScript |20| Animation | Framer Motion (motion/react) |21| Styling | Tailwind CSS v4 |22| Charts | Recharts |23| Icons | Lucide React |24| Routing | Keyboard/click navigation (no router needed) |25| Code highlighting | (only if needed) Prism React Renderer |2627Install only what you need. Do not add libraries speculatively.2829---3031## 2. Project Structure3233```34slides/35├── index.html36├── package.json37├── vite.config.ts38├── tailwind.config.ts39├── tsconfig.json40├── public/41│ └── images/ # All slide images go here42├── src/43│ ├── main.tsx44│ ├── App.tsx # Slide deck shell, navigation, keyboard controls45│ ├── index.css # Tailwind imports + custom fonts + base styles46│ ├── slides/47│ │ ├── index.ts # Export ordered array of all slides48│ │ ├── 01-intro.tsx49│ │ ├── 02-problem.tsx50│ │ └── ... # One file per slide or small group of related slides51│ ├── components/52│ │ ├── SlideLayout.tsx # Shared slide wrapper (scaling, padding, background)53│ │ ├── AnimatedText.tsx # Reusable text entrance animations54│ │ ├── Chart.tsx # Recharts wrapper55│ │ ├── ImageSlide.tsx # Image display component56│ │ ├── InteractiveBlock.tsx # For custom interactive UI per slide57│ │ └── ...58│ └── lib/59│ ├── animations.ts # Shared Framer Motion variants and transitions60│ ├── theme.ts # Color palette, font sizes, spacing tokens61│ └── useSlideScale.ts # Hook for viewport-fitting scale62```6364---6566## 3. Style Discovery — Mood & Presets6768### Step 1: Ask the User for Mood6970Before choosing colors and fonts, ask the user what feeling the audience should have:7172| Mood | Description |73|------|-------------|74| Impressed / Confident | Professional, trustworthy, bold |75| Excited / Energized | Innovative, bold, creative |76| Calm / Focused | Clear, thoughtful, minimal |77| Inspired / Moved | Emotional, memorable, elegant |7879### Step 2: Pick a Style Preset8081Based on mood, suggest 2-3 presets from the table below. Each preset defines fonts, colors, and signature visual elements. **Do NOT mix and match randomly — commit to one preset fully.**8283#### Dark Presets8485| Preset | Mood | Display Font | Body Font | Colors | Signature |86|--------|------|-------------|-----------|--------|-----------|87| **Bold Signal** | Confident | Archivo Black (900) | Space Grotesk (400) | `#1a1a1a` bg, `#FF5722` accent card, white text | Colored card as focal, large section numbers, grid layout |88| **Electric Studio** | Confident | Manrope (800) | Manrope (400) | `#0a0a0a` bg, `#4361ee` accent blue, white text | Two-panel vertical split, accent bar on edge |89| **Creative Voltage** | Energized | Syne (700) | Space Mono (400) | `#0066ff` primary, `#1a1a2e` dark, `#d4ff00` neon | Electric blue + neon yellow, halftone textures |90| **Dark Botanical** | Inspired | Cormorant (400) serif | IBM Plex Sans (300) | `#0f0f0f` bg, `#d4a574` warm accent, `#e8b4b8` pink | Abstract blurred gradient circles, thin accent lines |9192#### Light Presets9394| Preset | Mood | Display Font | Body Font | Colors | Signature |95|--------|------|-------------|-----------|--------|-----------|96| **Notebook Tabs** | Organized | Bodoni Moda (700) serif | DM Sans (400) | `#f8f6f1` page, `#2d2d2d` outer, colorful tabs | Paper card on dark bg, colored section tabs |97| **Pastel Geometry** | Friendly | Plus Jakarta Sans (700) | Plus Jakarta Sans (400) | `#c8d9e6` bg, `#faf9f7` card, pastel pills | Rounded card, vertical pills, soft shadow |98| **Vintage Editorial** | Inspired | Fraunces (700) serif | Work Sans (400) | `#f5f3ee` cream, `#1a1a1a` text, `#e8d4c0` warm | Geometric shapes (circle + line + dot), bold borders |99| **Swiss Modern** | Focused | Archivo (800) | Nunito (400) | Pure white, pure black, `#ff3300` red accent | Visible grid, asymmetric layouts, geometric shapes |100101#### Specialty Presets102103| Preset | Mood | Font | Colors | Signature |104|--------|------|------|--------|-----------|105| **Neon Cyber** | Techy | Clash Display + Satoshi | `#0a0f1c` navy, `#00ffcc` cyan, `#ff00aa` magenta | Neon glow, grid patterns, particle-like effects |106| **Terminal Green** | Hacker | JetBrains Mono | `#0d1117` dark, `#39d353` green | Scan lines, blinking cursor, code aesthetic |107| **Paper & Ink** | Editorial | Cormorant Garamond + Source Serif 4 | `#faf9f7` cream, `#1a1a1a` charcoal, `#c41e3a` crimson | Drop caps, pull quotes, elegant horizontal rules |108109### Step 3: Apply the Preset110111Once chosen, define the full theme in `src/lib/theme.ts` and as CSS custom properties in `src/index.css`:112- All colors from the preset113- Font families loaded from Google Fonts or Fontshare114- CSS variables for backgrounds, accents, text colors115- **Use the preset's signature elements** in at least the title slide and section transitions116117---118119## 4. Design System — Anti AI-Slop Rules120121### Typography122- Use the font pairing from your chosen preset. Load from Google Fonts or Fontshare via `@import` in CSS.123- No more than 2 font families.124- Headlines: large and bold. Body text: scarce.125- **Never center-align body paragraphs.** Left-align or use deliberate layout.126- **ALL font sizes must use `clamp(min, preferred, max)`** — never fixed px/rem for text. This ensures readability across viewport sizes.127128```css129/* Example clamp values */130--title-size: clamp(2rem, 6vw, 5rem);131--subtitle-size: clamp(0.875rem, 2vw, 1.25rem);132--body-size: clamp(0.75rem, 1.2vw, 1rem);133```134135### Color & Backgrounds136- Commit fully to your preset's palette. Define as CSS custom properties.137- **Create atmosphere, not flat colors.** Layer CSS gradients for depth instead of a single solid background color:138139```css140/* Layered gradient for depth */141background:142 radial-gradient(ellipse at 20% 80%, rgba(120, 0, 255, 0.15) 0%, transparent 50%),143 radial-gradient(ellipse at 80% 20%, rgba(0, 255, 200, 0.1) 0%, transparent 50%),144 var(--bg-primary);145146/* Subtle grid pattern for structure */147background-image:148 linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px),149 linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px);150background-size: 50px 50px;151```152153- Dominant colors with sharp accents outperform timid, evenly-distributed palettes.154155### Layout — Scaled Slide Container156- The slide is a **fixed 1280×720px container** scaled via CSS `transform: scale()` to fit the viewport (like reveal.js). All content is authored at 1280×720 and uniformly scaled.157- **Because of transform scaling, Tailwind's rem-based spacing appears smaller on screen.** For any element that needs visible padding (cards, chips, buttons with backgrounds), use **inline `style={{}}` with px values** instead of Tailwind padding classes.158- Minimum padding for elements with a background: `style={{ padding: '20px 48px' }}` for horizontal chips, `style={{ padding: '24px 32px' }}` for content cards, `style={{ padding: '16px 32px' }}` for buttons.159- Generous whitespace. Content should breathe.160- **Max 60% of the slide area should contain content.** The rest is intentional empty space.161- Use CSS Grid or Flexbox. Avoid absolute positioning unless for decorative elements.162- The `SlideLayout` component handles the scaling + centering.163164### Content Density Limits (NON-NEGOTIABLE)165166Every slide MUST fit within the 1280×720 container. Content overflows? Split into multiple slides. Never cram, never scroll.167168| Slide Type | Maximum Content |169|------------|-----------------|170| Title slide | 1 heading + 1 subtitle + optional tagline |171| Content slide | 1 heading + 4-6 bullet points OR 1 heading + 2 short paragraphs |172| Feature grid | 1 heading + 6 cards maximum (2×3 or 3×2) |173| Chart slide | 1 heading + 1 chart |174| Quote slide | 1 quote (max 3 lines) + attribution |175| Image slide | 1 heading + 1 image (max 60% slide height) |176| Interactive slide | 1 heading + interactive element (keep controls minimal) |177178### Visual Rules — Backgrounds & Borders179- **Do NOT wrap text content in background cards.** Let text sit directly on the slide background. Use spacing and typography for hierarchy, not boxes.180- **No nested backgrounds.** Never put one colored box inside another.181- **When an element MUST have a background** (interactive buttons, chips, tags): use `bg-white/5` with `border border-white/10` — never solid surface colors.182- **Borders must be subtle.** Use `border-l border-muted/20` for left accents, never `border-l-2`. Use `border border-white/10` for containers.183- **No drop shadows** unless it's a hard shadow (offset, no blur) as a specific design choice.184- **No rounded-full badges with gradient backgrounds.**185- **No decorative blobs, waves, or mesh gradients.**186- Geometric accents are OK: lines, dots, simple shapes.187188### DO NOT USE — Banned AI Patterns189190| Category | Banned |191|----------|--------|192| **Fonts** | Inter, Roboto, Arial, system fonts as display. Also avoid converging on Space Grotesk for every deck — vary your choices. |193| **Colors** | `#6366f1` (generic indigo), purple-on-white gradients, pastel rainbow, evenly-distributed "safe" palettes |194| **Layouts** | Everything centered in a vertical stack, identical card grids, generic hero sections |195| **Decorations** | Realistic illustrations, gratuitous glassmorphism, drop shadows without purpose, gradient mesh backgrounds |196197### What Makes It NOT Feel AI-Slop198- Asymmetric layouts (not everything centered in a stack)199- Oversized typography for emphasis200- Deliberate use of negative space201- Content that has opinion and edge, not generic filler202- Consistent but not monotonous — vary slide layouts across the deck203- Real images and data, not placeholder illustrations204- **Surprise the viewer** — make at least 1-2 unexpected layout choices per deck205206---207208## 5. Animation — Feeling-Driven Motion209210### Match Animation to Mood211212| Feeling | Animation Style | Visual Cues |213|---------|----------------|-------------|214| **Dramatic / Cinematic** | Slow fade-ins (0.8-1.2s), large scale transitions (0.9→1) | Dark backgrounds, spotlight effects |215| **Techy / Futuristic** | Neon glow, text scramble/reveal effects | Grid patterns, monospace accents, cyan/magenta |216| **Playful / Friendly** | Bouncy easing (gentle spring), floating motion | Rounded corners, bright colors |217| **Professional** | Subtle fast animations (200-300ms), clean slides | Precise spacing, data visualization focus |218| **Calm / Minimal** | Very slow subtle motion, gentle fades | High whitespace, muted palette, serif type |219| **Editorial** | Staggered text reveals, image-text interplay | Strong type hierarchy, pull quotes, grid-breaking |220221### Framer Motion Defaults222- **Default duration: 0.4–0.6s.** Avoid animations longer than 0.8s (unless cinematic mood).223- **Default easing: `[0.25, 0.1, 0.25, 1]`** (smooth deceleration, equivalent to `ease-out-expo`)224- Stagger children by **0.08–0.12s**, not more225226### Slide Transitions227- Use `AnimatePresence` with `mode="wait"` for slide changes228- Slide enter: fade in + subtle translateY (20px) or translateX (30px)229- Slide exit: fade out quickly (0.2s)230- **Do not use 3D transforms, rotations, or scale bounces for slide transitions**231232### Content Animations (within a slide)233- Headline: fade in + translateY, arrives first234- Supporting content: staggered fade in after headline235- Charts/images: fade in + subtle scale from 0.95 to 1236- Use `variants` pattern for orchestrated animations:237238```tsx239const container = {240 hidden: { opacity: 0 },241 show: {242 opacity: 1,243 transition: { staggerChildren: 0.1 }244 }245};246247const item = {248 hidden: { opacity: 0, y: 20 },249 show: { opacity: 1, y: 0, transition: { duration: 0.5, ease: [0.25, 0.1, 0.25, 1] } }250};251```252253### Progressive Reveal254- Some slides should reveal content in steps (click to advance within a slide)255- Track a `step` state per slide when needed256- Animate items in/out based on current step257- Show a subtle progress indicator (dots or a thin bar) when a slide has multiple steps258259### What NOT to Do260- No `spring` with high bounce (underdamped springs look toyish)261- No `rotate` animations on text262- No continuous looping animations (except very subtle pulsing on interactive elements)263- No parallax scrolling within slides264- No animation on every single element — some things should just be there265- **One well-orchestrated entrance per slide beats scattered micro-interactions**266267### `prefers-reduced-motion` Support268269Always include reduced-motion support. Wrap animation variants:270271```tsx272const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;273274const item = prefersReducedMotion275 ? { hidden: { opacity: 0 }, show: { opacity: 1 } }276 : { hidden: { opacity: 0, y: 20 }, show: { opacity: 1, y: 0, transition: { duration: 0.5 } } };277```278279---280281## 6. Slide Types & Components282283### Title Slide284- Oversized headline using `clamp(2.5rem, 6vw, 5rem)`285- Optional subtitle286- Optional date or presenter name287- Minimal, dramatic layout288- **Use preset's signature element** (colored card, split panel, geometric shape, etc.)289290### Content Slide (Text)291- Headline + 2–5 short bullet points or a short paragraph292- Bullets should animate in with stagger293- Left-aligned text, right side can have supporting visual294- **Max 4-6 bullets.** Exceeds? Split into two slides.295296### Image Slide297- Full-bleed or large contained image298- Images are placed in `public/images/` by the user299- Reference as `/images/filename.ext`300- **Image max-height: 60% of slide height (432px at 720px)**301- Support caption text below or overlaid with semi-transparent background302- Lazy load images303304### Chart Slide305- Use Recharts (BarChart, LineChart, PieChart, AreaChart)306- Style charts to match the deck theme — custom colors from preset, no default Recharts styling307- Animate chart entrance with Framer Motion wrapper308- Include clear labels and a headline309310### Comparison Slide311- Side-by-side or before/after layout312- Use a clear visual separator (accent line, not a heavy border)313- Animate left then right panel314315### Quote / Callout Slide316- Large text using `clamp(1.5rem, 3vw, 2.5rem)`, centered or left-aligned317- Accent color or background318- Attribution below in smaller text319- **Max 3 lines for the quote.**320321### Interactive Slide322- For slides that need custom UI (polls, toggles, demos, games)323- Build as self-contained components with local state324- Add `data-interactive` attribute to prevent accidental slide navigation on click325- Add clear visual affordance that something is interactive (hover states, cursor)326327### Link References328- External URLs: render as styled links that open in new tab (`target="_blank"`)329- Local folder links: render as `file:///` protocol links with a folder icon330- Style links distinctly — underline + accent color, not default blue331332---333334## 7. Navigation & Controls335336- **Keyboard:** Right arrow / Space / Enter = next, Left arrow = previous337- **Click/Tap:** Click right half = next, click left half = previous (skip elements with `data-interactive`, `button`, `input`)338- **Progress bar:** Thin bar at bottom showing position in deck339- **Slide counter:** Small "3 / 28" indicator in bottom-right corner340- Support `step` sub-navigation within slides before advancing to next slide341- **Escape key:** Toggle overview mode (grid of slide thumbnails) — nice to have, not required for v1342343---344345## 8. Content Guidelines346347Refer to `slide-guidelines.md` in this directory for the pedagogical structure:348- Problem → Discussion → Concept → Example → Takeaway cycle349- One idea per slide350- Visual-first, minimal text351- Short headlines (6–8 words)352- Progressive reveal for complex information353- **60-70% visual slides, 10-15% charts/diagrams, 15-20% text explanation**354355**You MUST ask the user for the actual content/topic before creating slides.** The content guidelines above describe structure, not what goes in the slides.356357---358359## 9. Build & Run360361```bash362npm create vite@latest . -- --template react-ts # Only if starting fresh363npm install364npm run dev365```366367The app should run with `npm run dev` and be viewable at localhost. No build errors. No TypeScript errors.368369---370371## 10. Quality Checklist372373Before delivering any batch of slides, verify:374375- [ ] `npm run dev` starts without errors376- [ ] TypeScript compiles cleanly (`npx tsc --noEmit`)377- [ ] `npx vite build` succeeds378- [ ] All animations are smooth at 60fps379- [ ] Slides fit within 1280×720 — no content overflow, no scrolling380- [ ] Content density within limits per slide type381- [ ] No placeholder text like "Lorem ipsum" or "Your content here"382- [ ] Color palette is consistent and matches chosen preset383- [ ] Fonts are loading correctly from Google Fonts / Fontshare384- [ ] Images referenced in slides exist in `public/images/`385- [ ] Interactive elements have hover/focus states386- [ ] Navigation works: keyboard, click, and progress bar are in sync387- [ ] **No text content wrapped in background cards** — text sits on slide directly388- [ ] **No nested backgrounds** (box inside box)389- [ ] **All elements with backgrounds have generous padding** via inline `style={{}}``, not Tailwind classes390- [ ] **Borders are subtle** — `border-white/10`, `border-muted/20`, never solid surface colors391- [ ] **All font sizes use `clamp()`** — no fixed px/rem for text392- [ ] **Backgrounds have depth** — layered gradients or patterns, not flat solid colors393394---395396## 11. Workflow3973981. **Ask the user for mood and content** — what feeling? What topic? How many modules?3992. **Pick a style preset** — suggest 2-3 based on mood, let user choose4003. **Scaffold the app** — set up Vite, Tailwind, Framer Motion, project structure, theme from preset, shared components4014. **Build slides in batches** — implement 5–10 slides at a time, then ask for review4025. **Iterate** — adjust based on feedback4036. **Images** — when a slide needs an image, tell the user what image is needed and where to place it (`public/images/`). Use a visible placeholder with the filename so they know what's missing.404405Always keep the app in a runnable state. Never leave broken imports or missing files.