|
@@ -19,12 +19,14 @@ Create zero-dependency, animation-rich HTML presentations that run entirely in t
|
|
|
You tend to converge toward generic, "on distribution" outputs. In frontend design, this creates what users call the "AI slop" aesthetic. Avoid this: make creative, distinctive frontends that surprise and delight.
|
|
You tend to converge toward generic, "on distribution" outputs. In frontend design, this creates what users call the "AI slop" aesthetic. Avoid this: make creative, distinctive frontends that surprise and delight.
|
|
|
|
|
|
|
|
Focus on:
|
|
Focus on:
|
|
|
|
|
+
|
|
|
- Typography: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics.
|
|
- Typography: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics.
|
|
|
- Color & Theme: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. Draw from IDE themes and cultural aesthetics for inspiration.
|
|
- Color & Theme: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. Draw from IDE themes and cultural aesthetics for inspiration.
|
|
|
- Motion: Use animations for effects and micro-interactions. Prioritize CSS-only solutions for HTML. Use Motion library for React when available. Focus on high-impact moments: one well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions.
|
|
- Motion: Use animations for effects and micro-interactions. Prioritize CSS-only solutions for HTML. Use Motion library for React when available. Focus on high-impact moments: one well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions.
|
|
|
- Backgrounds: Create atmosphere and depth rather than defaulting to solid colors. Layer CSS gradients, use geometric patterns, or add contextual effects that match the overall aesthetic.
|
|
- Backgrounds: Create atmosphere and depth rather than defaulting to solid colors. Layer CSS gradients, use geometric patterns, or add contextual effects that match the overall aesthetic.
|
|
|
|
|
|
|
|
Avoid generic AI-generated aesthetics:
|
|
Avoid generic AI-generated aesthetics:
|
|
|
|
|
+
|
|
|
- Overused font families (Inter, Roboto, Arial, system fonts)
|
|
- Overused font families (Inter, Roboto, Arial, system fonts)
|
|
|
- Cliched color schemes (particularly purple gradients on white backgrounds)
|
|
- Cliched color schemes (particularly purple gradients on white backgrounds)
|
|
|
- Predictable layouts and component patterns
|
|
- Predictable layouts and component patterns
|
|
@@ -48,14 +50,14 @@ These invariants apply to EVERY slide in EVERY presentation:
|
|
|
|
|
|
|
|
### Content Density Limits Per Slide
|
|
### Content Density Limits Per Slide
|
|
|
|
|
|
|
|
-| Slide Type | Maximum Content |
|
|
|
|
|
-|------------|-----------------|
|
|
|
|
|
-| Title slide | 1 heading + 1 subtitle + optional tagline |
|
|
|
|
|
|
|
+| Slide Type | Maximum Content |
|
|
|
|
|
+| ------------- | --------------------------------------------------------- |
|
|
|
|
|
+| Title slide | 1 heading + 1 subtitle + optional tagline |
|
|
|
| Content slide | 1 heading + 4-6 bullet points OR 1 heading + 2 paragraphs |
|
|
| Content slide | 1 heading + 4-6 bullet points OR 1 heading + 2 paragraphs |
|
|
|
-| Feature grid | 1 heading + 6 cards maximum (2x3 or 3x2) |
|
|
|
|
|
-| Code slide | 1 heading + 8-10 lines of code |
|
|
|
|
|
-| Quote slide | 1 quote (max 3 lines) + attribution |
|
|
|
|
|
-| Image slide | 1 heading + 1 image (max 60vh height) |
|
|
|
|
|
|
|
+| Feature grid | 1 heading + 6 cards maximum (2x3 or 3x2) |
|
|
|
|
|
+| Code slide | 1 heading + 8-10 lines of code |
|
|
|
|
|
+| Quote slide | 1 quote (max 3 lines) + attribution |
|
|
|
|
|
+| Image slide | 1 heading + 1 image (max 60vh height) |
|
|
|
|
|
|
|
|
**Content exceeds limits? Split into multiple slides. Never cram, never scroll.**
|
|
**Content exceeds limits? Split into multiple slides. Never cram, never scroll.**
|
|
|
|
|
|
|
@@ -98,6 +100,7 @@ Do you have content ready? Options: All content ready / Rough notes / Topic only
|
|
|
|
|
|
|
|
**Question 4 — Inline Editing** (header: "Editing"):
|
|
**Question 4 — Inline Editing** (header: "Editing"):
|
|
|
Do you need to edit text directly in the browser after generation? Options:
|
|
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
|
|
- "Yes (Recommended)" — Can edit text in-browser, auto-save to localStorage, export file
|
|
|
- "No" — Presentation only, keeps file smaller
|
|
- "No" — Presentation only, keeps file smaller
|
|
|
|
|
|
|
@@ -110,6 +113,7 @@ If user has content, ask them to share it.
|
|
|
If user selected "No images" → skip to Phase 2.
|
|
If user selected "No images" → skip to Phase 2.
|
|
|
|
|
|
|
|
If user provides an image folder:
|
|
If user provides an image folder:
|
|
|
|
|
+
|
|
|
1. **Scan** — List all image files (.png, .jpg, .svg, .webp, etc.)
|
|
1. **Scan** — List all image files (.png, .jpg, .svg, .webp, etc.)
|
|
|
2. **View each image** — Use the Read tool (Claude is multimodal)
|
|
2. **View each image** — Use the Read tool (Claude is multimodal)
|
|
|
3. **Evaluate** — For each: what it shows, USABLE or NOT USABLE (with reason), what concept it represents, dominant colors
|
|
3. **Evaluate** — For each: what it shows, USABLE or NOT USABLE (with reason), what concept it represents, dominant colors
|
|
@@ -127,6 +131,7 @@ If user provides an image folder:
|
|
|
### Step 2.0: Style Path
|
|
### Step 2.0: Style Path
|
|
|
|
|
|
|
|
Ask how they want to choose (header: "Style"):
|
|
Ask how they want to choose (header: "Style"):
|
|
|
|
|
+
|
|
|
- "Show me options" (recommended) — Generate 3 previews based on mood
|
|
- "Show me options" (recommended) — Generate 3 previews based on mood
|
|
|
- "I know what I want" — Pick from preset list directly
|
|
- "I know what I want" — Pick from preset list directly
|
|
|
|
|
|
|
@@ -136,6 +141,7 @@ Ask how they want to choose (header: "Style"):
|
|
|
|
|
|
|
|
Ask (header: "Vibe", multiSelect: true, max 2):
|
|
Ask (header: "Vibe", multiSelect: true, max 2):
|
|
|
What feeling should the audience have? Options:
|
|
What feeling should the audience have? Options:
|
|
|
|
|
+
|
|
|
- Impressed/Confident — Professional, trustworthy
|
|
- Impressed/Confident — Professional, trustworthy
|
|
|
- Excited/Energized — Innovative, bold
|
|
- Excited/Energized — Innovative, bold
|
|
|
- Calm/Focused — Clear, thoughtful
|
|
- Calm/Focused — Clear, thoughtful
|
|
@@ -145,12 +151,12 @@ What feeling should the audience have? Options:
|
|
|
|
|
|
|
|
Based on mood, generate 3 distinct single-slide HTML previews showing typography, colors, animation, and overall aesthetic. Read [STYLE_PRESETS.md](STYLE_PRESETS.md) for available presets and their specifications.
|
|
Based on mood, generate 3 distinct single-slide HTML previews showing typography, colors, animation, and overall aesthetic. Read [STYLE_PRESETS.md](STYLE_PRESETS.md) for available presets and their specifications.
|
|
|
|
|
|
|
|
-| Mood | Suggested Presets |
|
|
|
|
|
-|------|-------------------|
|
|
|
|
|
-| Impressed/Confident | Bold Signal, Electric Studio, Dark Botanical |
|
|
|
|
|
-| Excited/Energized | Creative Voltage, Neon Cyber, Split Pastel |
|
|
|
|
|
-| Calm/Focused | Notebook Tabs, Paper & Ink, Swiss Modern |
|
|
|
|
|
-| Inspired/Moved | Dark Botanical, Vintage Editorial, Pastel Geometry |
|
|
|
|
|
|
|
+| Mood | Suggested Presets |
|
|
|
|
|
+| ------------------- | -------------------------------------------------- |
|
|
|
|
|
+| Impressed/Confident | Bold Signal, Electric Studio, Dark Botanical |
|
|
|
|
|
+| Excited/Energized | Creative Voltage, Neon Cyber, Split Pastel |
|
|
|
|
|
+| Calm/Focused | Notebook Tabs, Paper & Ink, Swiss Modern |
|
|
|
|
|
+| Inspired/Moved | Dark Botanical, Vintage Editorial, Pastel Geometry |
|
|
|
|
|
|
|
|
Save previews to `.claude-design/slide-previews/` (style-a.html, style-b.html, style-c.html). Each should be self-contained, ~50-100 lines, showing one animated title slide.
|
|
Save previews to `.claude-design/slide-previews/` (style-a.html, style-b.html, style-c.html). Each should be self-contained, ~50-100 lines, showing one animated title slide.
|
|
|
|
|
|
|
@@ -172,11 +178,13 @@ Generate the full presentation using content from Phase 1 (text, or text + curat
|
|
|
If images were provided, the slide outline already incorporates them from Step 1.2. If not, CSS-generated visuals (gradients, shapes, patterns) provide visual interest — this is a fully supported first-class path.
|
|
If images were provided, the slide outline already incorporates them from Step 1.2. If not, CSS-generated visuals (gradients, shapes, patterns) provide visual interest — this is a fully supported first-class path.
|
|
|
|
|
|
|
|
**Before generating, read these supporting files:**
|
|
**Before generating, read these supporting files:**
|
|
|
|
|
+
|
|
|
- [html-template.md](html-template.md) — HTML architecture and JS features
|
|
- [html-template.md](html-template.md) — HTML architecture and JS features
|
|
|
- [viewport-base.css](viewport-base.css) — Mandatory CSS (include in full)
|
|
- [viewport-base.css](viewport-base.css) — Mandatory CSS (include in full)
|
|
|
- [animation-patterns.md](animation-patterns.md) — Animation reference for the chosen feeling
|
|
- [animation-patterns.md](animation-patterns.md) — Animation reference for the chosen feeling
|
|
|
|
|
|
|
|
**Key requirements:**
|
|
**Key requirements:**
|
|
|
|
|
+
|
|
|
- Single self-contained HTML file, all CSS/JS inline
|
|
- Single self-contained HTML file, all CSS/JS inline
|
|
|
- Include the FULL contents of viewport-base.css in the `<style>` block
|
|
- Include the FULL contents of viewport-base.css in the `<style>` block
|
|
|
- Use fonts from Fontshare or Google Fonts — never system fonts
|
|
- Use fonts from Fontshare or Google Fonts — never system fonts
|
|
@@ -208,12 +216,107 @@ When converting PowerPoint files:
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
|
|
+## Phase 6: Share & Export (Optional)
|
|
|
|
|
+
|
|
|
|
|
+After delivery, **ask the user:** _"Would you like to share this presentation? I can deploy it to a live URL (works on any device including phones) or export it as a PDF."_
|
|
|
|
|
+
|
|
|
|
|
+Options:
|
|
|
|
|
+
|
|
|
|
|
+- **Deploy to URL** — Shareable link that works on any device
|
|
|
|
|
+- **Export to PDF** — Universal file for email, Slack, print
|
|
|
|
|
+- **Both**
|
|
|
|
|
+- **No thanks**
|
|
|
|
|
+
|
|
|
|
|
+If the user declines, stop here. If they choose one or both, proceed below.
|
|
|
|
|
+
|
|
|
|
|
+### 6A: Deploy to a Live URL (Vercel)
|
|
|
|
|
+
|
|
|
|
|
+This deploys the presentation to Vercel — a free hosting platform. The link works on any device (phones, tablets, laptops) and stays live until the user takes it down.
|
|
|
|
|
+
|
|
|
|
|
+**If the user has never deployed before, guide them step by step:**
|
|
|
|
|
+
|
|
|
|
|
+1. **Check if Vercel CLI is installed** — Run `npx vercel --version`. If not found, install Node.js first (`brew install node` on macOS, or download from https://nodejs.org).
|
|
|
|
|
+
|
|
|
|
|
+2. **Check if user is logged in** — Run `npx vercel whoami`.
|
|
|
|
|
+ - If NOT logged in, explain: _"Vercel is a free hosting service. You need an account to deploy. Let me walk you through it:"_
|
|
|
|
|
+ - Step 1: Ask user to go to https://vercel.com/signup in their browser
|
|
|
|
|
+ - Step 2: They can sign up with GitHub, Google, email — whatever is easiest
|
|
|
|
|
+ - Step 3: Once signed up, run `vercel login` and follow the prompts (it opens a browser window to authorize)
|
|
|
|
|
+ - Step 4: Confirm login with `vercel whoami`
|
|
|
|
|
+ - Wait for the user to confirm they're logged in before proceeding.
|
|
|
|
|
+
|
|
|
|
|
+3. **Deploy** — Run the deploy script:
|
|
|
|
|
+
|
|
|
|
|
+ ```bash
|
|
|
|
|
+ bash scripts/deploy.sh <path-to-presentation>
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+ The script accepts either a folder (with index.html) or a single HTML file.
|
|
|
|
|
+
|
|
|
|
|
+4. **Share the URL** — Tell the user:
|
|
|
|
|
+ - The live URL (from the script output)
|
|
|
|
|
+ - That it works on any device — they can text it, Slack it, email it
|
|
|
|
|
+ - To take it down later: visit https://vercel.com/dashboard and delete the project
|
|
|
|
|
+ - The Vercel free tier is generous — they won't be charged
|
|
|
|
|
+
|
|
|
|
|
+**⚠ Deployment gotchas:**
|
|
|
|
|
+
|
|
|
|
|
+- **Local images/videos must travel with the HTML.** The deploy script auto-detects files referenced via `src="..."` in the HTML and bundles them. But if the presentation references files via CSS `background-image` or unusual paths, those may be missed. **Before deploying, verify:** open the deployed URL and check that all images load. If any are broken, the safest fix is to put the HTML and all its assets into a single folder and deploy the folder instead of a standalone HTML file.
|
|
|
|
|
+- **Prefer folder deployments when the presentation has many assets.** If the presentation lives in a folder with images alongside it (e.g., `my-deck/index.html` + `my-deck/logo.png`), deploy the folder directly: `bash scripts/deploy.sh ./my-deck/`. This is more reliable than deploying a single HTML file because the entire folder contents are uploaded as-is.
|
|
|
|
|
+- **Filenames with spaces work but can cause issues.** The script handles spaces in filenames, but Vercel URLs encode spaces as `%20`. If possible, avoid spaces in image filenames. If the user's images have spaces, the script handles it — but if images still break, renaming files to use hyphens instead of spaces is the fix.
|
|
|
|
|
+- **Redeploying updates the same URL.** Running the deploy script again on the same presentation overwrites the previous deployment. The URL stays the same — no need to share a new link.
|
|
|
|
|
+
|
|
|
|
|
+### 6B: Export to PDF
|
|
|
|
|
+
|
|
|
|
|
+This captures each slide as a screenshot and combines them into a PDF. Perfect for email attachments, embedding in documents, or printing.
|
|
|
|
|
+
|
|
|
|
|
+**Note:** Animations and interactivity are not preserved — the PDF is a static snapshot. This is normal and expected; mention it to the user so they're not surprised.
|
|
|
|
|
+
|
|
|
|
|
+1. **Run the export script:**
|
|
|
|
|
+
|
|
|
|
|
+ ```bash
|
|
|
|
|
+ bash scripts/export-pdf.sh <path-to-html> [output.pdf]
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+ If no output path is given, the PDF is saved next to the HTML file.
|
|
|
|
|
+
|
|
|
|
|
+2. **What happens behind the scenes** (explain briefly to the user):
|
|
|
|
|
+ - A headless browser opens the presentation at 1920×1080 (standard widescreen)
|
|
|
|
|
+ - It screenshots each slide one by one
|
|
|
|
|
+ - All screenshots are combined into a single PDF
|
|
|
|
|
+ - The script needs Playwright (a browser automation tool) — it will install automatically if missing
|
|
|
|
|
+
|
|
|
|
|
+3. **If Playwright installation fails:**
|
|
|
|
|
+ - The most common issue is Chromium not downloading. Run: `npx playwright install chromium`
|
|
|
|
|
+ - If that fails too, it may be a network/firewall issue. Ask the user to try on a different network.
|
|
|
|
|
+
|
|
|
|
|
+4. **Deliver the PDF** — The script auto-opens it. Tell the user:
|
|
|
|
|
+ - The file location and size
|
|
|
|
|
+ - That it works everywhere — email, Slack, Notion, Google Docs, print
|
|
|
|
|
+ - Animations are replaced by their final visual state (still looks great, just static)
|
|
|
|
|
+
|
|
|
|
|
+**⚠ PDF export gotchas:**
|
|
|
|
|
+
|
|
|
|
|
+- **First run is slow.** The script installs Playwright and downloads a Chromium browser (~150MB) into a temp directory. This happens once per run. Warn the user it may take 30-60 seconds the first time — subsequent exports within the same session are faster.
|
|
|
|
|
+- **Slides must use `class="slide"`.** The export script finds slides by querying `.slide` elements. If the presentation uses a different class name, the script will report "0 slides found" and fail. All presentations generated by this skill use `.slide`, so this only matters for externally-created HTML.
|
|
|
|
|
+- **Local images must be loadable via HTTP.** The script starts a local server and loads the HTML through it (so Google Fonts and relative image paths work). If images use absolute filesystem paths (e.g., `src="/Users/name/photo.png"`) instead of relative paths (e.g., `src="photo.png"`), they won't load. Generated presentations always use relative paths, but converted or user-provided decks might not — check and fix if needed.
|
|
|
|
|
+- **Local images appear in the PDF** as long as they are in the same directory as (or relative to) the HTML file. The export script serves the HTML's parent directory over HTTP, so relative paths like `src="photo.png"` resolve correctly — including filenames with spaces. If images still don't appear, check: (1) the image files actually exist at the referenced path, (2) the paths are relative, not absolute filesystem paths like `/Users/name/photo.png`.
|
|
|
|
|
+- **Large presentations produce large PDFs.** Each slide is captured as a full 1920×1080 PNG screenshot. An 18-slide deck can produce a ~20MB PDF. If the PDF exceeds 10MB, ask the user: _"The PDF is [size]. Would you like me to compress it? It'll look slightly less sharp but the file will be much smaller."_ If yes, re-run the export with the `--compact` flag:
|
|
|
|
|
+ ```bash
|
|
|
|
|
+ bash scripts/export-pdf.sh <path-to-html> [output.pdf] --compact
|
|
|
|
|
+ ```
|
|
|
|
|
+ This renders at 1280×720 instead of 1920×1080, typically cutting file size by 50-70% with minimal visual difference.
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
## Supporting Files
|
|
## Supporting Files
|
|
|
|
|
|
|
|
-| File | Purpose | When to Read |
|
|
|
|
|
-|------|---------|-------------|
|
|
|
|
|
-| [STYLE_PRESETS.md](STYLE_PRESETS.md) | 12 curated visual presets with colors, fonts, and signature elements | Phase 2 (style selection) |
|
|
|
|
|
-| [viewport-base.css](viewport-base.css) | Mandatory responsive CSS — copy into every presentation | Phase 3 (generation) |
|
|
|
|
|
-| [html-template.md](html-template.md) | HTML structure, JS features, code quality standards | Phase 3 (generation) |
|
|
|
|
|
-| [animation-patterns.md](animation-patterns.md) | CSS/JS animation snippets and effect-to-feeling guide | Phase 3 (generation) |
|
|
|
|
|
-| [scripts/extract-pptx.py](scripts/extract-pptx.py) | Python script for PPT content extraction | Phase 4 (conversion) |
|
|
|
|
|
|
|
+| File | Purpose | When to Read |
|
|
|
|
|
+| -------------------------------------------------- | -------------------------------------------------------------------- | ------------------------- |
|
|
|
|
|
+| [STYLE_PRESETS.md](STYLE_PRESETS.md) | 12 curated visual presets with colors, fonts, and signature elements | Phase 2 (style selection) |
|
|
|
|
|
+| [viewport-base.css](viewport-base.css) | Mandatory responsive CSS — copy into every presentation | Phase 3 (generation) |
|
|
|
|
|
+| [html-template.md](html-template.md) | HTML structure, JS features, code quality standards | Phase 3 (generation) |
|
|
|
|
|
+| [animation-patterns.md](animation-patterns.md) | CSS/JS animation snippets and effect-to-feeling guide | Phase 3 (generation) |
|
|
|
|
|
+| [scripts/extract-pptx.py](scripts/extract-pptx.py) | Python script for PPT content extraction | Phase 4 (conversion) |
|
|
|
|
|
+| [scripts/deploy.sh](scripts/deploy.sh) | Deploy slides to Vercel for instant sharing | Phase 6 (sharing) |
|
|
|
|
|
+| [scripts/export-pdf.sh](scripts/export-pdf.sh) | Export slides to PDF | Phase 6 (sharing) |
|