Create stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to build a presentation, convert a PPT/PPTX to web, or create slides for a talk/pitch. Helps non-designers discover their aesthetic through visual exploration rather than abstract choices.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
A direct command skips the review prompt. Inspect the source before running it.
Create stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to build a presentation, convert a PPT/PPTX to web, or create slides for a talk/pitch. Helps non-designers discover their aesthetic through visual exploration rather than abstract choices.
Frontend Slides Skill
Create zero-dependency, animation-rich HTML presentations that run entirely in the browser. This skill helps non-designers discover their preferred aesthetic through visual exploration ("show, don't tell"), then generates production-quality slide decks.
Core Philosophy
Zero Dependencies — Single HTML files with inline CSS/JS. No npm, no build tools.
Show, Don't Tell — People don't know what they want until they see it. Generate visual previews, not abstract choices.
Distinctive Design — Avoid generic "AI slop" aesthetics. Every presentation should feel custom-crafted.
Production Quality — Code should be well-commented, accessible, and performant.
Viewport Fitting (CRITICAL) — Every slide MUST fit exactly within the viewport. No scrolling within slides, ever. This is non-negotiable.
CRITICAL: Viewport Fitting Requirements
This section is mandatory for ALL presentations. Every slide must be fully visible without scrolling on any screen size.
The Golden Rule
Each slide = exactly one viewport height (100vh/100dvh)
Content overflows? → Split into multiple slides or reduce content
Never scroll within a slide.
Content Density Limits
To guarantee viewport fitting, enforce these limits per slide:
If content exceeds these limits → Split into multiple slides
Required CSS Architecture
Every presentation MUST include this base CSS for viewport fitting:
/* ===========================================
VIEWPORT FITTING: MANDATORY BASE STYLES
These styles MUST be included in every presentation.
They ensure slides fit exactly in the viewport.
=========================================== *//* 1. Lock html/body to viewport */html, body {
height: 100%;
overflow-x: hidden;
}
html {
scroll-snap-type: y mandatory;
scroll-behavior: smooth;
}
/* 2. Each slide = exact viewport height */.slide {
width: 100vw;
height: 100vh;
height: 100dvh; /* Dynamic viewport height for mobile browsers */overflow: hidden; /* CRITICAL: Prevent ANY overflow */scroll-snap-align: start;
display: flex;
flex-direction: column;
position: relative;
}
/* 3. Content container with flex for centering */.slide-content {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
max-height: 100%;
overflow: hidden; /* Double-protection against overflow */padding: var(--slide-padding);
}
/* 4. ALL typography uses clamp() for responsive scaling */:root {
/* Titles scale from mobile to desktop */--title-size: clamp(1.5rem, 5vw, 4rem);
--h2-size: clamp(1.25rem, 3.5vw, 2.5rem);
--h3-size: clamp(1rem, 2.5vw, 1.75rem);
/* Body text */--body-size: clamp(0.75rem, 1.5vw, 1.125rem);
--small-size: clamp(0.65rem, 1vw, 0.875rem);
/* Spacing scales with viewport */--slide-padding: clamp(1rem, 4vw, 4rem);
--content-gap: clamp(0.5rem, 2vw, 2rem);
--element-gap: clamp(0.25rem, 1vw, 1rem);
}
/* 5. Cards/containers use viewport-relative max sizes */.card, .container, .content-box {
max-width: min(90vw, 1000px);
max-height: min(80vh, 700px);
}
/* 6. Lists auto-scale with viewport */.feature-list, .bullet-list {
gap: clamp(0.4rem, 1vh, 1rem);
}
.feature-listli, .bullet-listli {
font-size: var(--body-size);
line-height: 1.4;
}
/* 7. Grids adapt to available space */.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 250px), 1fr));
gap: clamp(0.5rem, 1.5vw, 1rem);
}
/* 8. Images constrained to viewport */img, .image-container {
max-width: 100%;
max-height: min(50vh, 400px);
object-fit: contain;
}
/* ===========================================
RESPONSIVE BREAKPOINTS
Aggressive scaling for smaller viewports
=========================================== *//* Short viewports (< 700px height) */@media (max-height: 700px) {
:root {
--slide-padding: clamp(0.75rem, 3vw, 2rem);
--content-gap: clamp(0.4rem, 1.5vw, 1rem);
--title-size: clamp(1.25rem, 4.5vw, 2.5rem);
--h2-size: clamp(1rem, 3vw, 1.75rem);
}
}
/* Very short viewports (< 600px height) */@media (max-height: 600px) {
:root {
--slide-padding: clamp(0.5rem, 2.5vw, 1.5rem);
--content-gap: clamp(0.3rem, 1vw, 0.75rem);
--title-size: clamp(1.1rem, 4vw, 2rem);
--body-size: clamp(0.7rem, 1.2vw, 0.95rem);
}
/* Hide non-essential elements */.nav-dots, .keyboard-hint, .decorative {
display: none;
}
}
/* Extremely short (landscape phones, < 500px height) */@media (max-height: 500px) {
:root {
--slide-padding: clamp(0.4rem, 2vw, 1rem);
--title-size: clamp(1rem, 3.5vw, 1.5rem);
--h2-size: clamp(0.9rem, 2.5vw, 1.25rem);
--body-size: clamp(0.65rem, 1vw, 0.85rem);
}
}
/* Narrow viewports (< 600px width) */@media (max-width: 600px) {
:root {
--title-size: clamp(1.25rem, 7vw, 2.5rem);
}
/* Stack grids vertically */.grid {
grid-template-columns: 1fr;
}
}
/* ===========================================
REDUCED MOTION
Respect user preferences
=========================================== */@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms!important;
transition-duration: 0.2s!important;
}
html {
scroll-behavior: auto;
}
}
Overflow Prevention Checklist
Before generating any presentation, mentally verify:
✅ Every .slide has height: 100vh; height: 100dvh; overflow: hidden;
✅ All font sizes use clamp(min, preferred, max)
✅ All spacing uses clamp() or viewport units
✅ Content containers have max-height constraints
✅ Images have max-height: min(50vh, 400px) or similar
✅ Grids use auto-fit with minmax() for responsive columns
✅ Breakpoints exist for heights: 700px, 600px, 500px
✅ No fixed pixel heights on content elements
✅ Content per slide respects density limits
When Content Doesn't Fit
If you find yourself with too much content:
DO:
Split into multiple slides
Reduce bullet points (max 5-6 per slide)
Shorten text (aim for 1-2 lines per bullet)
Use smaller code snippets
Create a "continued" slide
When adding images to existing slides: Move image to new slide or reduce other content first
DON'T:
Reduce font size below readable limits
Remove padding/spacing entirely
Allow any scrolling
Cram content to fit
Add images without checking if existing content already fills the viewport
Testing Viewport Fit
After generating, recommend the user test at these sizes:
Desktop: 1920×1080, 1440×900, 1280×720
Tablet: 1024×768, 768×1024 (portrait)
Mobile: 375×667, 414×896
Landscape phone: 667×375, 896×414
Phase 0: Detect Mode
First, determine what the user wants:
Mode A: New Presentation
User wants to create slides from scratch
Proceed to Phase 1 (Content Discovery)
Mode B: PPT Conversion
User has a PowerPoint file (.ppt, .pptx) to convert
Proceed to Phase 4 (PPT Extraction)
Mode C: Existing Presentation Enhancement
User has an HTML presentation and wants to improve it
Read the existing file, understand the structure, then enhance
CRITICAL: When modifying existing slides, ALWAYS ensure viewport fitting is maintained
Mode C: Critical Modification Rules
When enhancing existing presentations, follow these mandatory rules:
1. Before Adding Any Content:
Read the current slide structure and count existing elements
Check against content density limits (see table above)
Calculate if the new content will fit within viewport constraints
2. When Adding Images (MOST COMMON ISSUE):
Images must have max-height: min(50vh, 400px) or similar viewport constraint
Check if current slide already has maximum content (1 heading + 1 image)
If adding an image to a slide with existing content → Split into two slides
Example: If slide has heading + 4 bullets, and user wants to add an image:
DON'T: Cram image onto same slide
DO: Create new slide with heading + image, keep bullets on original slide
OR: Reduce bullets to 2-3 and add image with proper constraints
3. When Adding Text Content:
Max 4-6 bullet points per slide
Max 2 paragraphs per slide
If adding content exceeds limits → Split into multiple slides or create a continuation slide
4. Required Checks After ANY Modification:
✅ Does the slide have `overflow: hidden` on `.slide` class?
✅ Are all new elements using `clamp()` for font sizes?
✅ Do new images have viewport-relative max-height?
✅ Does total content respect density limits?
✅ Will this fit on a 1280×720 screen? On mobile portrait?
5. Proactive Reorganization (NOT Optional):
When you detect that modifications will cause overflow:
Automatically split content across slides — Don't wait for user to ask
Inform user: "I've reorganized the content across 2 slides to ensure proper viewport fitting"
Use "continued" pattern for split content (e.g., "Key Features" → "Key Features (Continued)")
6. Testing After Modifications:
Mentally verify the modified slide at these viewport sizes:
Desktop: 1280×720 (smallest common)
Tablet portrait: 768×1024
Mobile: 375×667
If in doubt → Split the content. Never allow scrolling within a slide.
Phase 1: Content Discovery (New Presentations)
Before designing, understand the content. Ask via AskUserQuestion:
"Conference talk" — Speaking at an event, tech talk, keynote
"Internal presentation" — Team updates, strategy meetings, company updates
Question 2: Slide Count
Header: "Length"
Question: "Approximately how many slides?"
Options:
"Short (5-10)" — Quick pitch, lightning talk
"Medium (10-20)" — Standard presentation
"Long (20+)" — Deep dive, comprehensive talk
Question 3: Content
Header: "Content"
Question: "Do you have the content ready, or do you need help structuring it?"
Options:
"I have all content ready" — Just need to design the presentation
"I have rough notes" — Need help organizing into slides
"I have a topic only" — Need help creating the full outline
Question 4: Images
Header: "Images"
Question: "Do you have images to include? Select 'No images' or select Other and type/paste your image folder path."
Options:
"No images" — Text-only presentation (use CSS-generated visuals instead)
"./assets" — Use the assets/ folder in the current project
The user can select "Other" to type or paste any custom folder path (e.g. ~/Desktop/screenshots). This way the image folder path is collected in the same form — no extra round-trip.
Question 5: Inline Editing
Header: "Editing"
Question: "Do you need to edit text directly in the browser after generation?"
Options:
"Yes (Recommended)" — Can edit text in-browser, auto-save to localStorage, export file
"No" — Presentation only, keeps file smaller
Remember the user's choice — it determines whether edit-related HTML/CSS/JS is included in Phase 3.
If user has content, ask them to share it (text, bullet points, images, etc.).
Step 1.2: Image Evaluation
User-provided assets are important visual anchors — but not every asset is necessarily usable. The first step is always to evaluate. After evaluation, the curated assets become additional context that shapes how the presentation is built. This is a co-design process: text content + curated visuals together inform the slide structure from the start, not a post-hoc "fit images in after the fact."
If user selected "No images" → Skip the entire image pipeline. Proceed directly to Phase 2 (Style Discovery) and Phase 3 (Generate Presentation) using text content only. The presentation will use CSS-generated visuals (gradients, shapes, patterns, typography) for visual interest — this is the original behavior and produces fully polished results without any images.
If user provides an image folder:
Scan the folder — Use ls to list all image files (.png, .jpg, .jpeg, .gif, .svg, .webp)
View each image — Use the Read tool to see what each image contains (Claude is multimodal)
Evaluate each image — For each image, assess:
Filename and dimensions
What it shows (screenshot, logo, chart, diagram, photo)
Usability: Is the image clear, relevant to the presentation topic, and high enough quality? Mark as USABLE or NOT USABLE (with reason: blurry, irrelevant, broken, etc.)
Content signal: What feature or concept does this image represent? (e.g., "chat_ui.png" → "conversational interface feature")
Shape: square, landscape, portrait, circular
Dominant colors (important for style compatibility later)
Present the evaluation and proposed slide outline to the user — Show which images are usable and which are not, with reasons. Then show the proposed slide outline with image assignments.
Co-design: curated assets inform the outline
After evaluation, the usable images become context for planning the slide structure alongside text content. This is not "plan slides then add images" — it's designing the presentation around both text and visuals from the start:
3 usable product screenshots → plan 3 feature slides, each anchored by one screenshot
1 usable logo → title slide and/or closing slide
1 usable architecture diagram → dedicated "How It Works" slide
1 blurry/irrelevant image → excluded, with explanation to user
This means curated images are factored in before style selection (Phase 2) and before HTML generation (Phase 3). They are co-equal context in the design process.
Confirm outline via AskUserQuestion — Do NOT break the flow by asking the user to type free text. Use AskUserQuestion to confirm:
Question: Outline Confirmation
Header: "Outline"
Question: "Does this slide outline and image selection look right?"
Options:
"Looks good, proceed" — Move on to style selection
"Adjust images" — I want to change which images go where
"Adjust outline" — I want to change the slide structure
This keeps the entire flow in the AskUserQuestion format without dropping to free-text chat.
Phase 2: Style Discovery (Visual Exploration)
CRITICAL: This is the "show, don't tell" phase.
Most people can't articulate design preferences in words. Instead of asking "do you want minimalist or bold?", we generate mini-previews and let them react.
How Users Choose Presets
Users can select a style in two ways:
Option A: Guided Discovery (Default)
User answers mood questions
Skill generates 3 preview files based on their answers
User views previews in browser and picks their favorite
This is best for users who don't have a specific style in mind
Option B: Direct Selection
If user already knows what they want, they can request a preset by name
Example: "Use the Bold Signal style" or "I want something like Dark Botanical"
Skip to Phase 3 immediately
Available Presets:
Preset
Vibe
Best For
Bold Signal
Confident, high-impact
Pitch decks, keynotes
Electric Studio
Clean, professional
Agency presentations
Creative Voltage
Energetic, retro-modern
Creative pitches
Dark Botanical
Elegant, sophisticated
Premium brands
Notebook Tabs
Editorial, organized
Reports, reviews
Pastel Geometry
Friendly, approachable
Product overviews
Split Pastel
Playful, modern
Creative agencies
Vintage Editorial
Witty, personality-driven
Personal brands
Neon Cyber
Futuristic, techy
Tech startups
Terminal Green
Developer-focused
Dev tools, APIs
Swiss Modern
Minimal, precise
Corporate, data
Paper & Ink
Literary, thoughtful
Storytelling
Step 2.0: Style Path Selection
First, ask how the user wants to choose their style:
Question: Style Selection Method
Header: "Style"
Question: "How would you like to choose your presentation style?"
Options:
"Show me options" — Generate 3 previews based on my needs (recommended for most users)
"I know what I want" — Let me pick from the preset list directly
If "Show me options" → Continue to Step 2.1 (Mood Selection)
If "I know what I want" → Show preset picker:
Question: Pick a Preset
Header: "Preset"
Question: "Which style would you like to use?"
Options:
"Bold Signal" — Vibrant card on dark, confident and high-impact
"Dark Botanical" — Elegant dark with soft abstract shapes
"Notebook Tabs" — Editorial paper look with colorful section tabs
"Pastel Geometry" — Friendly pastels with decorative pills
(If user picks one, skip to Phase 3. If they want to see more options, show additional presets or proceed to guided discovery.)
Step 2.1: Mood Selection (Guided Discovery)
Question 1: Feeling
Header: "Vibe"
Question: "What feeling should the audience have when viewing your slides?"
Options:
"Impressed/Confident" — Professional, trustworthy, this team knows what they're doing
"Excited/Energized" — Innovative, bold, this is the future
"Calm/Focused" — Clear, thoughtful, easy to follow
Based on their mood selection, generate 3 distinct style previews as mini HTML files in a temporary directory. Each preview should be a single title slide showing:
Typography (font choices, heading/body hierarchy)
Color palette (background, accent, text colors)
Animation style (how elements enter)
Overall aesthetic feel
Preview Styles to Consider (pick 3 based on mood):
Create the previews in: .claude-design/slide-previews/
.claude-design/slide-previews/
├── style-a.html # First style option
├── style-b.html # Second style option
├── style-c.html # Third style option
└── assets/ # Any shared assets
Each preview file should be:
Self-contained (inline CSS/JS)
A single "title slide" showing the aesthetic
Animated to demonstrate motion style
~50-100 lines, not a full presentation
Logo in previews (if available): If the user provided images in Step 1.2 and a logo was identified as USABLE, embed it (base64) into each of the 3 style previews. This creates a "wow moment" — the user sees their own brand identity styled three different ways, making the choice feel personal rather than abstract. Apply any necessary processing (e.g., circular crop) per-style so each preview shows the logo as it would actually appear in the final presentation. If no logo was provided, generate previews without one — this is fine.
Present to user:
I've created 3 style previews for you to compare:
**Style A: [Name]** — [1 sentence description]
**Style B: [Name]** — [1 sentence description]
**Style C: [Name]** — [1 sentence description]
Open each file to see them in action:
- .claude-design/slide-previews/style-a.html
- .claude-design/slide-previews/style-b.html
- .claude-design/slide-previews/style-c.html
Take a look and tell me:
1. Which style resonates most?
2. What do you like about it?
3. Anything you'd change?
Then use AskUserQuestion:
Question: Pick Your Style
Header: "Style"
Question: "Which style preview do you prefer?"
Options:
"Style A: [Name]" — [Brief description]
"Style B: [Name]" — [Brief description]
"Style C: [Name]" — [Brief description]
"Mix elements" — Combine aspects from different styles
If "Mix elements", ask for specifics.
Phase 3: Generate Presentation
Now generate the full presentation based on:
Content from Phase 1 (text only, or text + curated images)
Style from Phase 2
If the user provided images, the slide outline already incorporates them as visual anchors from Step 1.2. If not, proceed with text-only content — CSS-generated visuals (gradients, shapes, patterns) provide visual interest.
Image Pipeline (skip if no images)
If the user chose "No images" in Step 1.2, skip this entire section and go straight to generating HTML. The presentation will be text-only with CSS-generated visuals — this is a fully supported, first-class path.
If the user provided images, execute these steps before generating HTML.
Key principle: Co-design, not post-hoc. The curated images from Step 1.2 (those marked USABLE) are already part of the slide outline. The pipeline's job here is to process images for the chosen style and place them in the HTML.
Step 3.1: Image Processing (Pillow)
For each curated image, determine what processing it needs based on the chosen style (e.g., circular crop for logos, resize for large files) and what CSS framing will bridge any color gaps between the image and the style's palette. Then process accordingly.
Rules:
Never repeat the same image on multiple slides (except logos which may bookend title + closing)
Always add CSS framing (border, glow, shadow) for images whose colors clash with the style's palette
Dependency: Python Pillow library (the standard image processing library for Python).
# Install if not available (portable across macOS/Linux/Windows)
pip install Pillow
This is analogous to how python-pptx is used in Phase 4 (PPT Conversion) — a standard, well-maintained Python package that any user can install.
Common processing operations:
from PIL import Image, ImageDraw
# ─── Circular Crop (for logos on modern/clean styles) ───defcrop_circle(input_path, output_path):
"""Crop a square image to a circle with transparent background."""
img = Image.open(input_path).convert('RGBA')
w, h = img.size
# Make square if not already
size = min(w, h)
left = (w - size) // 2
top = (h - size) // 2
img = img.crop((left, top, left + size, top + size))
# Create circular mask
mask = Image.new('L', (size, size), 0)
draw = ImageDraw.Draw(mask)
draw.ellipse([0, 0, size, size], fill=255)
img.putalpha(mask)
img.save(output_path, 'PNG')
# ─── Resize (for oversized images that inflate the HTML) ───defresize_max(input_path, output_path, max_dim=1200):
"""Resize image so largest dimension <= max_dim. Preserves aspect ratio."""
img = Image.open(input_path)
img.thumbnail((max_dim, max_dim), Image.LANCZOS)
img.save(output_path, quality=85)
# ─── Add Padding / Background (for images that need breathing room) ───defadd_padding(input_path, output_path, padding=40, bg_color=(0, 0, 0, 0)):
"""Add transparent padding around an image."""
img = Image.open(input_path).convert('RGBA')
w, h = img.size
new = Image.new('RGBA', (w + 2*padding, h + 2*padding), bg_color)
new.paste(img, (padding, padding), img)
new.save(output_path, 'PNG')
When to apply each operation:
Situation
Operation
Square logo on a style with rounded aesthetics
crop_circle()
Image > 1MB (slow to load)
resize_max(max_dim=1200)
Screenshot needs breathing room in layout
add_padding()
Image has wrong aspect ratio for its slide slot
Manual crop with img.crop((left, top, right, bottom))
Save processed images alongside originals with a _processed suffix (e.g., logo_round.png). Never overwrite the user's original files.
Step 3.2: Place Images
Use direct file paths — do NOT convert images to base64 data URIs. Since presentations are viewed locally, reference images with relative paths from the HTML file:
This keeps the HTML file small and images easy to swap. Only use base64 encoding if the user explicitly requests a fully self-contained single-file presentation.
Image CSS classes (adapt border/glow colors to match the chosen style):
/* Base image constraint — CRITICAL for viewport fitting */.slide-image {
max-width: 100%;
max-height: min(50vh, 400px);
object-fit: contain;
border-radius: 8px;
}
/* Screenshots: add framing to bridge color gaps with the style */.slide-image.screenshot {
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
box-shadow: 08px32pxrgba(0, 0, 0, 0.3);
}
/* Logos: smaller, no frame */.slide-image.logo {
max-height: min(30vh, 200px);
}
IMPORTANT: Adapt the .screenshot border and shadow colors to match the chosen style's accent color. For example:
Dark Botanical (gold accent): border: 1px solid rgba(197, 160, 89, 0.2); box-shadow: 0 0 20px rgba(197, 160, 89, 0.08);
Creative Voltage (neon yellow): border: 2px solid rgba(212, 255, 0, 0.25); box-shadow: 0 0 20px rgba(212, 255, 0, 0.08);
Placement patterns:
Title slide: Logo centered above or beside the title
Feature slides: Screenshot on one side, text on the other (two-column layout)
Full-bleed: Image as slide background with text overlay (use with caution)
Inline: Image within content flow, centered, with caption below
Note: Processed images (e.g. logo_round.png) are saved alongside originals in the assets folder. Reference them with relative paths in the HTML.
File Structure
For single presentations:
presentation.html # Self-contained presentation
assets/ # Images, if any
<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Presentation Title</title><!-- Fonts (use Fontshare or Google Fonts) --><linkrel="stylesheet"href="https://api.fontshare.com/v2/css?f[]=..."><style>/* ===========================================
CSS CUSTOM PROPERTIES (THEME)
Easy to modify: change these to change the whole look
=========================================== */:root {
/* Colors */--bg-primary: #0a0f1c;
--bg-secondary: #111827;
--text-primary: #ffffff;
--text-secondary: #9ca3af;
--accent: #00ffcc;
--accent-glow: rgba(0, 255, 204, 0.3);
/* Typography - MUST use clamp() for responsive scaling */--font-display: 'Clash Display', sans-serif;
--font-body: 'Satoshi', sans-serif;
--title-size: clamp(2rem, 6vw, 5rem);
--subtitle-size: clamp(0.875rem, 2vw, 1.25rem);
--body-size: clamp(0.75rem, 1.2vw, 1rem);
/* Spacing - MUST use clamp() for responsive scaling */--slide-padding: clamp(1.5rem, 4vw, 4rem);
--content-gap: clamp(1rem, 2vw, 2rem);
/* Animation */--ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
--duration-normal: 0.6s;
}
/* ===========================================
BASE STYLES
=========================================== */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
scroll-snap-type: y mandatory;
height: 100%;
}
body {
font-family: var(--font-body);
background: var(--bg-primary);
color: var(--text-primary);
overflow-x: hidden;
height: 100%;
}
/* ===========================================
SLIDE CONTAINER
CRITICAL: Each slide MUST fit exactly in viewport
- Use height: 100vh (NOT min-height)
- Use overflow: hidden to prevent scroll
- Content must scale with clamp() values
=========================================== */.slide {
width: 100vw;
height: 100vh; /* EXACT viewport height - no scrolling */height: 100dvh; /* Dynamic viewport height for mobile */padding: var(--slide-padding);
scroll-snap-align: start;
display: flex;
flex-direction: column;
justify-content: center;
position: relative;
overflow: hidden; /* Prevent any content overflow */
}
/* Content wrapper that prevents overflow */.slide-content {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
max-height: 100%;
overflow: hidden;
}
/* ===========================================
RESPONSIVE BREAKPOINTS
Adjust content for different screen sizes
=========================================== */@media (max-height: 600px) {
:root {
--slide-padding: clamp(1rem, 3vw, 2rem);
--content-gap: clamp(0.5rem, 1.5vw, 1rem);
}
}
@media (max-width: 768px) {
:root {
--title-size: clamp(1.5rem, 8vw, 3rem);
}
}
@media (max-height: 500px) and (orientation: landscape) {
/* Extra compact for landscape phones */:root {
--title-size: clamp(1.25rem, 5vw, 2rem);
--slide-padding: clamp(0.75rem, 2vw, 1.5rem);
}
}
/* ===========================================
ANIMATIONS
Trigger via .visible class (added by JS on scroll)
=========================================== */.reveal {
opacity: 0;
transform: translateY(30px);
transition: opacity var(--duration-normal) var(--ease-out-expo),
transform var(--duration-normal) var(--ease-out-expo);
}
.slide.visible.reveal {
opacity: 1;
transform: translateY(0);
}
/* Stagger children */.reveal:nth-child(1) { transition-delay: 0.1s; }
.reveal:nth-child(2) { transition-delay: 0.2s; }
.reveal:nth-child(3) { transition-delay: 0.3s; }
.reveal:nth-child(4) { transition-delay: 0.4s; }
/* ... more styles ... */</style></head><body><!-- Progress bar (optional) --><divclass="progress-bar"></div><!-- Navigation dots (optional) --><navclass="nav-dots"><!-- Generated by JS --></nav><!-- Slides --><sectionclass="slide title-slide"><h1class="reveal">Presentation Title</h1><pclass="reveal">Subtitle or author</p></section><sectionclass="slide"><h2class="reveal">Slide Title</h2><pclass="reveal">Content...</p></section><!-- More slides... --><script>/* ===========================================
SLIDE PRESENTATION CONTROLLER
Handles navigation, animations, and interactions
=========================================== */classSlidePresentation {
constructor() {
// ... initialization
}
// ... methods
}
// InitializenewSlidePresentation();
</script></body></html>
Required JavaScript Features
Every presentation should include:
SlidePresentation Class — Main controller
Keyboard navigation (arrows, space)
Touch/swipe support
Mouse wheel navigation
Progress bar updates
Navigation dots
Intersection Observer — For scroll-triggered animations
Add .visible class when slides enter viewport
Trigger CSS animations efficiently
Optional Enhancements (based on style):
Custom cursor with trail
Particle system background (canvas)
Parallax effects
3D tilt on hover
Magnetic buttons
Counter animations
Inline editing (only if user opted in during content discovery):
Edit toggle button (hidden by default, revealed via hover hotzone or E key)
Auto-save to localStorage
Export/save file functionality
See "Edit Button Implementation" section below for required code patterns
Edit Button Implementation (When User Opts In)
If the user chose "No" for inline editing in Phase 1, skip this entirely — do not generate any edit-related HTML, CSS, or JS.
⚠️ Critical: Do NOT use CSS ~ sibling selector for hover-based show/hide.
The CSS-only approach (edit-hotzone:hover ~ .edit-toggle) fails because pointer-events: none on the toggle button causes the hover chain to break: user hovers hotzone → button becomes visible → mouse moves toward button → leaves hotzone → button disappears before click reaches it.
Required approach: JS-based hover with delay timeout.
Comments:
Every section should have clear comments explaining:
What it does
Why it exists
How to modify it
/* ===========================================
CUSTOM CURSOR
Creates a stylized cursor that follows mouse with a trail effect.
- Uses lerp (linear interpolation) for smooth movement
- Grows larger when hovering over interactive elements
=========================================== */classCustomCursor {
constructor() {
// ...
}
}
I've extracted the following from your PowerPoint:
**Slide 1: [Title]**
- [Content summary]
- Images: [count]
**Slide 2: [Title]**
- [Content summary]
- Images: [count]
...
All images have been saved to the assets folder.
Does this look correct? Should I proceed with style selection?
Step 4.3: Style Selection
Proceed to Phase 2 (Style Discovery) with the extracted content in mind.
Step 4.4: Generate HTML
Convert the extracted content into the chosen style, preserving:
All text content
All images (referenced from assets folder)
Slide order
Any speaker notes (as HTML comments or separate file)
Phase 5: Delivery
Final Output
When the presentation is complete:
Clean up temporary files
Delete .claude-design/slide-previews/ if it exists
Open the presentation
Use open [filename].html to launch in browser
Provide summary
Your presentation is ready!
📁 File: [filename].html
🎨 Style: [Style Name]
📊 Slides: [count]
**Navigation:**
- Arrow keys (← →) or Space to navigate
- Scroll/swipe also works
- Click the dots on the right to jump to a slide
**To customize:**
- Colors: Look for `:root` CSS variables at the top
- Fonts: Change the Fontshare/Google Fonts link
- Animations: Modify `.reveal` class timings
Would you like me to make any adjustments?
If the user opted in to inline editing, also include:
**Editing:**
- Hover over top-left corner or press E to enter edit mode
- Click any text to edit directly
- Ctrl+S or click "Save file" to save changes
Style Reference: Effect → Feeling Mapping
Use this guide to match animations to intended feelings: