
Frontend Slides
- 778 installs
- 26.4k repo stars
- Updated June 23, 2026
- zarazhangrui/frontend-slides
frontend-slides is a Claude Code skill that generates beautiful, animation-rich HTML slide decks from scratch or by converting existing PowerPoint files for developers who need zero-dependency presentations.
About
frontend-slides is a Claude Code marketplace skill that creates zero-dependency HTML presentations with 12 curated visual themes, PowerPoint conversion, and an anti-AI-slop design philosophy. Developers can generate animation-rich slide decks from scratch or import existing PPT files into standalone HTML suitable for browser playback. The plugin ships as a productivity-tagged frontend-slides package under MIT license from zarazhangrui. Teams reach for frontend-slides when they need polished talk or demo decks fast inside the IDE without Keynote, Google Slides, or React slide frameworks. The workflow emphasizes curated themes and motion-rich HTML output rather than generic template filler.
- Zero-dependency HTML presentation generator
- 12 curated visual themes with anti-AI-slop design philosophy
- Direct PowerPoint to HTML conversion capability
- Built-in animations and modern slide transitions
- Ready for embedding in docs, landing pages, or agent deliverables
Frontend Slides by the numbers
- 778 all-time installs (skills.sh)
- +23 installs in the week ending Jul 28, 2026 (Skillselion tracking)
- Ranked #483 of 1,896 Design & UI/UX skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Jul 28, 2026 (Skillselion catalog sync)
npx skills add https://github.com/zarazhangrui/frontend-slides --skill frontend-slidesAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 778 |
|---|---|
| repo stars | ★ 26.4k |
| Security audit | 1 / 3 scanners passed |
| Last updated | June 23, 2026 |
| Repository | zarazhangrui/frontend-slides ↗ |
How do you convert PowerPoint to animated HTML slides?
Instantly generate beautiful, animation-rich HTML slide decks either from scratch or by converting existing PowerPoint files.
Who is it for?
Frontend developers who need fast, theme-consistent HTML presentations or PPT-to-HTML conversion inside Claude Code.
Skip if: Teams requiring collaborative cloud slide editing, speaker-notes CRM integrations, or heavy data-driven chart authoring in PowerPoint.
When should I use this skill?
The user asks to create HTML slides, convert PowerPoint to web presentations, or build an animation-rich talk deck without slide frameworks.
What you get
Standalone HTML presentation files with curated themes, CSS animations, and optional converted PowerPoint slide content.
- Standalone HTML slide deck files
- Converted HTML from PowerPoint source
By the numbers
- Includes 12 curated visual themes
- Zero-dependency HTML presentation generator
Files
Frontend Slides
Create zero-dependency, animation-rich HTML presentations that run entirely in the browser.
Core Principles
1. Zero Dependencies — Single HTML files with inline CSS/JS. No npm, no build tools. 2. Show, Don't Tell — Generate visual previews, not abstract choices. People discover what they want by seeing it. 3. Distinctive Design — No generic "AI slop." Every presentation must feel custom-crafted. 4. Progressive Disclosure — Read lightweight style indexes first. For bold templates, use small preview cards for style previews and load the full design.md only after the user picks that template. 5. Fixed 16:9 Stage (NON-NEGOTIABLE) — Every deck uses a 1920×1080 slide canvas scaled as a whole to the viewport. Slides must stay 16:9 on every screen, including phones. Do not reflow slide content to fit the device.
Design Aesthetics
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:
- 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.
- 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.
Avoid generic AI-generated aesthetics:
- Overused font families (Inter, Roboto, Arial, system fonts)
- Cliched color schemes (particularly purple gradients on white backgrounds)
- Predictable layouts and component patterns
- Cookie-cutter design that lacks context-specific character
Interpret creatively and make unexpected choices that feel genuinely designed for the context. Vary between light and dark themes, different fonts, different aesthetics. You still tend to converge on common choices (Space Grotesk, for example) across generations. Avoid this: it is critical that you think outside the box!
Fixed Stage Rules
These invariants apply to EVERY slide in EVERY presentation:
- Every deck has a viewport wrapper that fills the browser window.
- Every slide is authored inside a fixed 1920×1080 stage.
- The stage scales uniformly to fit the viewport. It may letterbox/pillarbox; it must not re-layout content.
- Do not use responsive breakpoints to rearrange slide content for phones.
- Use fixed internal slide measurements at the 1920×1080 design size.
- Slide visibility must be controlled by
.active/.visibleusingvisibility,opacity, andpointer-eventsfromviewport-base.css. Do not usedisplay: none/display: blockfor slide switching; later layout classes such as.slide-content { display: flex; }can override them and make every slide visible at once. - Use
clamp()only for non-slide UI outside the stage, or for small fallback previews where a full stage is impractical. - Include
prefers-reduced-motionsupport - Never negate CSS functions directly (
-clamp(),-min(),-max()are silently ignored) — usecalc(-1 * clamp(...))instead
When generating, read `viewport-base.css` and include its full contents in every presentation.
Content Density Modes
Ask the user whether this is primarily a reading deck or a speaking deck, then design around that answer:
| Density mode | Best for | Design behavior |
|---|---|---|
| Low density / speaker-led | Public talks, keynote-style sharing, live explanation | One idea per slide, large type, strong visual hierarchy, generous negative space, 1-3 bullets max, more slides if needed |
| High density / reading-first | Reports, handouts, async review, detailed internal docs | More self-contained slides, structured grids/tables/annotations, 4-8 bullets or 4-6 cards when readable, tighter but still intentional spacing |
Baseline limits still apply: no scrolling, no overflow, no overlapping panels, and no text below comfortable reading size. If content exceeds the selected density mode, split it into more slides instead of shrinking until it becomes cramped.
---
Phase 0: Detect Mode
Determine what the user wants:
- Mode A: New Presentation — Create from scratch. Go to Phase 1.
- Mode B: PPT Conversion — Convert a .pptx file. Go to Phase 4.
- Mode C: Enhancement — Improve an existing HTML presentation. Read it, understand it, enhance. Follow Mode C modification rules below.
Mode C: Modification Rules
When enhancing existing presentations, fixed-stage fitting is the biggest risk:
1. Before adding content: Count existing elements, check against density limits 2. Adding images: Fit them inside the 1920×1080 slide canvas. If slide already has max content, split into two slides 3. Adding text: Max 4-6 bullets per slide. Exceeds limits? Split into continuation slides 4. After ANY modification, verify: the slide stage remains 16:9, no text overflows its card, no panels overlap, and screenshots look correct at 1280×720 plus one phone viewport 5. Proactively reorganize: If modifications will cause overflow, automatically split content and inform the user. Don't wait to be asked
When adding images to existing slides: Move image to a new slide or reduce other content first. Never add images without checking if existing content already fills the 1920×1080 slide stage.
---
Phase 1: Content Discovery (New Presentations)
Ask ALL questions together so the user fills everything out at once. If the current environment provides a native structured-question UI, use it; otherwise ask in one concise message with clearly numbered choices:
Question 1 — Purpose (header: "Purpose"): What is this presentation for? Options: Pitch deck / Teaching-Tutorial / Conference talk / Internal presentation
Question 2 — Length (header: "Length"): Approximately how many slides? Options: Short 5-10 / Medium 10-20 / Long 20+
Question 3 — Content (header: "Content"): Do you have content ready? Options: All content ready / Rough notes / Topic only
Question 4 — Density (header: "Density"): How dense should the deck feel? Options:
- "Low density / speaker-led" — Big ideas, fewer words, more visual breathing room
- "High density / reading-first" — More self-contained detail for async reading
Do not ask about inline editing during Phase 1. Users should not have to choose editing behavior before seeing a draft. Inline editing is a post-draft affordance: include it by default unless the user explicitly asks for a locked/export-only file.
Remember the user's density choice. It affects slide count, typography scale, amount of text per slide, layout density, and whether to favor cinematic presenter slides or self-contained reading slides.
If user has content, ask them to share it.
Step 1.2: Image Evaluation (if images provided)
If user selected "No images" → skip to Phase 2.
If user provides an image folder:
1. Scan — List all image files (.png, .jpg, .svg, .webp, etc.) 2. Inspect each image — Use the agent's available image-understanding capability. If image reading is unavailable, use filenames/metadata and ask the user to clarify only when needed 3. Evaluate — For each: what it shows, USABLE or NOT USABLE (with reason), what concept it represents, dominant colors 4. Co-design the outline — Curated images inform slide structure alongside text. This is NOT "plan slides then add images" — design around both from the start (e.g., 3 screenshots → 3 feature slides, 1 logo → title/closing slide) 5. Confirm the outline using the same structured-question mechanism when available: "Does this slide outline and image selection look right?" Options: Looks good / Adjust images / Adjust outline
Logo in previews: If a usable logo was identified, embed it (base64) into each style preview in Phase 2 — the user sees their brand styled three different ways.
---
Phase 2: Style Discovery
This is the "show, don't tell" phase. Most people can't articulate design preferences in words.
Step 2.0: Generate 3 Style Previews Directly
Based on purpose, audience, mood, and content density, generate 3 distinct single-slide HTML previews showing typography, colors, animation, and overall aesthetic.
Do not ask the user whether they want options or a preset picker. The default discovery experience is always visual comparison.
If the user already gave a vibe, use it. If they did not, infer the likely mood from the occasion, audience, content, and stakes. Keep the options diverse enough that the user can react visually instead of needing to articulate taste up front.
If the user explicitly names a preset or bold template, honor that as one option and generate the remaining preview slots around it.
Read STYLE_PRESETS.md for safe preset candidates. If bold-template-pack/selection-index.json exists, read that compact index too, but do not read any design.md files yet.
| 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 |
Preview mix rules:
- Generate 3 previews by default: 1 safe preset from
STYLE_PRESETS.md, at least 1 bold template frombold-template-pack/selection-index.json, and 1 wildcard. - The wildcard may be either a second bold template or a self-generated custom design. Choose whichever creates the strongest, most useful contrast for the user's occasion, audience, mood, and content.
- Do not force every expressive option to come from the template library. If the brief has a sharper, more specific design opportunity than the available templates, use the wildcard slot to design freely.
- For conservative or high-stakes decks, make the safe preset especially restrained; choose a calm, higher-formality bold template; make the wildcard either another restrained template or a custom design that feels authoritative rather than decorative.
- For expressive decks, keep the safe preset as a readable fallback; choose one strong bold template; make the wildcard adventurous, context-specific, and clearly different from both other previews.
- If bold template matches feel weak, use the wildcard as a custom design or fall back to another safe preset instead of forcing a template.
Custom wildcard design rules:
- Follow the Design Aesthetics section above: no generic "AI slop", no default font/color/layout choices, no purple-gradient-on-white clichés, no cookie-cutter dashboard/card look.
- Match the user's stated occasion, audience, mood/vibe, and content density. The custom design should feel authored for this deck, not merely "stylish."
- Make a deliberate visual thesis: distinctive typography, a committed palette, a recognizable layout system, and one strong atmospheric or graphic device.
- Keep it feasible for a full deck. The preview must imply a design system that can expand into section, content, quote, comparison, and closing slides.
- Use fixed 1920×1080 stage rules and pass the same preview authenticity checks as every other option.
- Never render "custom", "wildcard", "AI-generated", or design-process labels on the slide itself.
Bold template selection rules:
- Match user purpose and mood against
mood,tone,best_for,avoid_for,formality,density, andscheme. - Treat
best_forexamples as soft signals, not strict industry filters. - Keep the three previews genuinely different from each other.
- After choosing bold template candidate(s), read only those candidate(s)'
preview.mdfiles from thepreview_mdpaths in the selection index. - Use
preview.mdonly for title-slide previews. Do not read fulldesign.mdfiles until the user picks the final template. - Do not read or copy
template.htmlunless the selected finaldesign.mdis missing a critical implementation detail.
Preview authenticity rules (NON-NEGOTIABLE):
- Every style preview must look like a real first slide from the user's deck, not a diagnostic card.
- Never render internal workflow text on a slide: no
preview,generated from,preview.md,template,preset,style option,Option A/B/C, file names, paths, or source-doc labels. - Never render template names or slug names on the slide itself. Template/style names belong only in the message to the user.
- Never render user requirement notes as slide content, such as "sharp and provocative", "safe option", "bold option", "for internal sharing", or "audience: ...", unless the user explicitly wants that exact phrase to appear in the deck.
- If the slide needs chrome, use real deck chrome only: the deck title, section title, date, author, company, page number, or a genuine content phrase from the user's material.
- Before opening previews, inspect the visible text and revise if any internal metadata appears.
Save previews to .frontend-slides/slide-previews/ (style-a.html, style-b.html, style-c.html). Each should be self-contained and compact, showing one animated title slide.
Open each preview automatically for the user.
Step 2.1: User Picks
Ask (header: "Style"): Which style preview do you prefer? Options: Style A: [Name] / Style B: [Name] / Style C: [Name] / Mix elements
If "Mix elements", ask for specifics.
---
Phase 3: Generate Presentation
Generate the full presentation using content from Phase 1 (text, or text + curated images) and style from Phase 2.
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.
Apply the user's density choice throughout the deck:
- Low density / speaker-led: Use more slides with fewer ideas per slide. Favor large headings, short phrases, visual metaphors, section beats, quote/statement slides, and presenter-friendly pacing.
- High density / reading-first: Make slides more self-contained. Use structured grids, comparison tables, annotated diagrams, captions, and concise explanatory copy. Keep hierarchy strong so it feels designed, not like a document pasted onto slides.
If the user's stated needs are mixed, choose the closer of the two modes instead of inventing a middle option: live audience persuasion defaults low-density; async circulation or detailed review defaults high-density.
Never let high density become visual clutter. If a high-density slide starts to overflow, split it or redesign it into a clearer structure.
If the user selected a bold template from bold-template-pack, read that one template's full design.md before generating. Do not read the other bold templates. Treat design.md as the design recipe:
- Preserve its fonts, palette, decorative vocabulary, spacing rhythm, and component grammar.
- Generate the final deck as a fixed 1920×1080 stage scaled uniformly to the viewport, regardless of whether the source template originally used
deck-stage.jsor viewport-fluid CSS. - Treat viewport-fluid values in
design.mdas design proportions to translate into 1920×1080 stage coordinates. Do not keep them as live viewport reflow rules in the final deck. - Keep the output as a single self-contained Frontend Slides HTML file.
- Do not copy demo slide content or mimic the source template too literally.
- Use
template.htmlonly as a last-resort implementation reference for the selected template. - After generating, verify both content overflow and panel overlap in rendered browser screenshots.
scrollHeightchecks alone are not enough because grid panels can visually cover each other.
If the user selected a self-generated custom wildcard, treat that preview's CSS and layout as the design recipe:
- Preserve its fonts, palette, decorative vocabulary, spacing rhythm, grid logic, and component grammar.
- Expand the same visual system across the full deck. Do not switch to a preset or bold template after the user has chosen the custom direction.
- Design any missing slide layouts from that system rather than importing patterns from another style.
- Keep the output fixed-stage, single-file, and visually verified like every other deck.
Before generating, read these supporting files:
- html-template.md — HTML architecture and JS features
- viewport-base.css — Mandatory CSS (include in full)
- animation-patterns.md — Animation reference for the chosen feeling
Key requirements:
- Single self-contained HTML file, all CSS/JS inline
- Include the FULL contents of viewport-base.css in the
<style>block - Use fonts from Fontshare or Google Fonts — never system fonts
- Add detailed comments explaining each section
- Every section needs a clear
/* === SECTION NAME === */comment block
---
Phase 4: PPT Conversion
When converting PowerPoint files:
1. Extract content — Run python scripts/extract-pptx.py <input.pptx> <output_dir> (install python-pptx if needed: pip install python-pptx) 2. Confirm with user — Present extracted slide titles, content summaries, and image counts 3. Style selection — Proceed to Phase 2 for style discovery 4. Generate HTML — Convert to chosen style, preserving all text, images (from assets/), slide order, and speaker notes (as HTML comments)
---
Phase 5: Delivery
1. Clean up — Delete .frontend-slides/slide-previews/ if it exists 2. Open — Use open [filename].html to launch in browser 3. Summarize — Tell the user:
- File location, style name, slide count
- Navigation: Arrow keys, Space, swipe/tap if enabled
- How to customize:
:rootCSS variables for colors, font link for typography,.revealclass for animations - Inline text editing is available: Hover top-left corner or press E to enter edit mode, click any text to edit, Ctrl+S to save
- Offer the natural post-draft actions: ask for revisions, edit text directly in the browser, or export/share
---
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 loginand 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 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 CSSbackground-imageor 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 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
.slideelements. 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
--compactflag:
bash scripts/export-pdf.sh <path-to-html> [output.pdf] --compactThis renders at 1280×720 instead of 1920×1080, typically cutting file size by 50-70% with minimal visual difference.
---
Supporting Files
| File | Purpose | When to Read |
|---|---|---|
| STYLE_PRESETS.md | 12 curated visual presets with colors, fonts, and signature elements | Phase 2 (style selection) |
| bold-template-pack/selection-index.json | Compact bold template metadata for candidate selection | Phase 2 (style selection) |
| bold-template-pack/templates/*/preview.md | Lightweight style cards for shortlisted bold title previews | Phase 2 after shortlisting |
| bold-template-pack/templates/*/design.md | Detailed design-system docs for the selected bold template only | Phase 3 after user selection |
| viewport-base.css | Mandatory fixed-stage CSS — copy into every presentation | Phase 3 (generation) |
| html-template.md | HTML structure, JS features, code quality standards | Phase 3 (generation) |
| animation-patterns.md | CSS/JS animation snippets and effect-to-feeling guide | Phase 3 (generation) |
| scripts/extract-pptx.py | Python script for PPT content extraction | Phase 4 (conversion) |
| scripts/deploy.sh | Deploy slides to Vercel for instant sharing | Phase 6 (sharing) |
| scripts/export-pdf.sh | Export slides to PDF | Phase 6 (sharing) |
{
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
"name": "frontend-slides",
"description": "Create stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files.",
"owner": {
"name": "zarazhangrui",
"url": "https://github.com/zarazhangrui"
},
"plugins": [
{
"name": "frontend-slides",
"description": "Zero-dependency HTML presentation generator with safe presets, bold template-library styles, PPT conversion, and anti-AI-slop design philosophy.",
"source": "./plugins/frontend-slides",
"category": "productivity",
"tags": ["presentations", "slides", "html", "design", "powerpoint", "templates"]
}
]
}
.DS_Store
.claude-design/
node_modules/
.vercel/
*.log
Animation Patterns Reference
Use this reference when generating presentations. Match animations to the intended feeling.
Effect-to-Feeling Guide
| Feeling | Animations | Visual Cues |
|---|---|---|
| Dramatic / Cinematic | Slow fade-ins (1-1.5s), large scale transitions (0.9 to 1), parallax scrolling | Dark backgrounds, spotlight effects, full-bleed images |
| Techy / Futuristic | Neon glow (box-shadow), glitch/scramble text, grid reveals | Particle systems (canvas), grid patterns, monospace accents, cyan/magenta/electric blue |
| Playful / Friendly | Bouncy easing (spring physics), floating/bobbing | Rounded corners, pastel/bright colors, hand-drawn elements |
| Professional / Corporate | Subtle fast animations (200-300ms), clean slides | Navy/slate/charcoal, precise spacing, data visualization focus |
| Calm / Minimal | Very slow subtle motion, gentle fades | High whitespace, muted palette, serif typography, generous padding |
| Editorial / Magazine | Staggered text reveals, image-text interplay | Strong type hierarchy, pull quotes, grid-breaking layouts, serif headlines + sans body |
Entrance Animations
/* Fade + Slide Up (most versatile) */
.reveal {
opacity: 0;
transform: translateY(30px);
transition: opacity 0.6s var(--ease-out-expo),
transform 0.6s var(--ease-out-expo);
}
.visible .reveal {
opacity: 1;
transform: translateY(0);
}
/* Scale In */
.reveal-scale {
opacity: 0;
transform: scale(0.9);
transition: opacity 0.6s, transform 0.6s var(--ease-out-expo);
}
/* Slide from Left */
.reveal-left {
opacity: 0;
transform: translateX(-50px);
transition: opacity 0.6s, transform 0.6s var(--ease-out-expo);
}
/* Blur In */
.reveal-blur {
opacity: 0;
filter: blur(10px);
transition: opacity 0.8s, filter 0.8s var(--ease-out-expo);
}Background Effects
/* Gradient Mesh — layered radial gradients for depth */
.gradient-bg {
background:
radial-gradient(ellipse at 20% 80%, rgba(120, 0, 255, 0.3) 0%, transparent 50%),
radial-gradient(ellipse at 80% 20%, rgba(0, 255, 200, 0.2) 0%, transparent 50%),
var(--bg-primary);
}
/* Noise Texture — inline SVG for grain */
.noise-bg {
background-image: url("data:image/svg+xml,..."); /* Inline SVG noise */
}
/* Grid Pattern — subtle structural lines */
.grid-bg {
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;
}Interactive Effects
/* 3D Tilt on Hover — adds depth to cards/panels */
class TiltEffect {
constructor(element) {
this.element = element;
this.element.style.transformStyle = 'preserve-3d';
this.element.style.perspective = '1000px';
this.element.addEventListener('mousemove', (e) => {
const rect = this.element.getBoundingClientRect();
const x = (e.clientX - rect.left) / rect.width - 0.5;
const y = (e.clientY - rect.top) / rect.height - 0.5;
this.element.style.transform = `rotateY(${x * 10}deg) rotateX(${-y * 10}deg)`;
});
this.element.addEventListener('mouseleave', () => {
this.element.style.transform = 'rotateY(0) rotateX(0)';
});
}
}Troubleshooting
| Problem | Fix |
|---|---|
| Fonts not loading | Check Fontshare/Google Fonts URL; ensure font names match in CSS |
| Animations not triggering | Verify Intersection Observer is running; check .visible class is being added |
| Scroll snap not working | Ensure scroll-snap-type: y mandatory on html; each slide needs scroll-snap-align: start |
| Mobile issues | Disable heavy effects at 768px breakpoint; test touch events; reduce particle count |
| Performance issues | Use will-change sparingly; prefer transform/opacity animations; throttle scroll handlers |
/**
* <deck-stage> — reusable web component for HTML decks.
*
* Handles:
* (a) speaker notes — reads <script type="application/json" id="speaker-notes">
* and posts {slideIndexChanged: N} to the parent window on nav.
* (b) keyboard navigation — ←/→, PgUp/PgDn, Space, Home/End, number keys.
* (c) press R to reset to slide 0 (with a tasteful keyboard hint).
* (d) bottom-center overlay showing slide count + hints, fades out on idle.
* (e) auto-scaling — inner canvas is a fixed design size (default 1920×1080)
* scaled with `transform: scale()` to fit the viewport, letterboxed.
* Set the `noscale` attribute to render at authored size (1:1) — the
* PPTX exporter sets this so its DOM capture sees unscaled geometry.
* (f) print — `@media print` lays every slide out as its own page at the
* design size, so the browser's Print → Save as PDF produces a clean
* one-page-per-slide PDF with no extra setup.
*
* Slides are HIDDEN, not unmounted. Non-active slides stay in the DOM with
* `visibility: hidden` + `opacity: 0`, so their state (videos, iframes,
* form inputs, React trees) is preserved across navigation.
*
* Lifecycle event — the component dispatches a `slidechange` CustomEvent on
* itself whenever the active slide changes (including the initial mount).
* The event bubbles and composes out of shadow DOM, so you can listen on
* the <deck-stage> element or on document:
*
* document.querySelector('deck-stage').addEventListener('slidechange', (e) => {
* e.detail.index // new 0-based index
* e.detail.previousIndex // previous index, or -1 on init
* e.detail.total // total slide count
* e.detail.slide // the new active slide element
* e.detail.previousSlide // the prior slide element, or null on init
* e.detail.reason // 'init' | 'keyboard' | 'click' | 'tap' | 'api'
* });
*
* Persistence: none at the deck level. The host app keeps the current slide
* in its own URL (?slide=) and re-delivers it via location.hash on load, so a
* bare load with no hash always starts at slide 1.
*
* Usage:
* <deck-stage width="1920" height="1080">
* <section data-label="Title">...</section>
* <section data-label="Agenda">...</section>
* </deck-stage>
*
* Slides are the direct element children of <deck-stage>. Each slide is
* automatically tagged with:
* - data-screen-label="NN Label" (1-indexed, for comment flow)
* - data-om-validate="no_overflowing_text,no_overlapping_text,slide_sized_text"
*/
(() => {
const DESIGN_W_DEFAULT = 1920;
const DESIGN_H_DEFAULT = 1080;
const OVERLAY_HIDE_MS = 1800;
const VALIDATE_ATTR = 'no_overflowing_text,no_overlapping_text,slide_sized_text';
const pad2 = (n) => String(n).padStart(2, '0');
const stylesheet = `
:host {
position: fixed;
inset: 0;
display: block;
background: #000;
color: #fff;
font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, Arial, sans-serif;
overflow: hidden;
}
.stage {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
}
.canvas {
position: relative;
transform-origin: center center;
flex-shrink: 0;
background: #fff;
will-change: transform;
}
/* Slides live in light DOM (via <slot>) so authored CSS still applies.
We absolutely position each slotted child to stack them. */
::slotted(*) {
position: absolute !important;
inset: 0 !important;
width: 100% !important;
height: 100% !important;
box-sizing: border-box !important;
overflow: hidden;
opacity: 0;
pointer-events: none;
visibility: hidden;
}
::slotted([data-deck-active]) {
opacity: 1;
pointer-events: auto;
visibility: visible;
}
/* Tap zones for mobile — back/forward thirds like Stories.
Transparent, no visible UI, don't block the overlay. */
.tapzones {
position: fixed;
inset: 0;
display: flex;
z-index: 2147482000;
pointer-events: none;
}
.tapzone {
flex: 1;
pointer-events: auto;
-webkit-tap-highlight-color: transparent;
}
/* Only activate tap zones on coarse pointers (touch devices). */
@media (hover: hover) and (pointer: fine) {
.tapzones { display: none; }
}
.overlay {
position: fixed;
left: 50%;
bottom: 22px;
transform: translate(-50%, 6px) scale(0.92);
filter: blur(6px);
display: flex;
align-items: center;
gap: 4px;
padding: 4px;
background: #000;
color: #fff;
border-radius: 999px;
font-size: 12px;
font-feature-settings: "tnum" 1;
letter-spacing: 0.01em;
opacity: 0;
pointer-events: none;
transition: opacity 260ms ease, transform 260ms cubic-bezier(.2,.8,.2,1), filter 260ms ease;
transform-origin: center bottom;
z-index: 2147483000;
user-select: none;
}
.overlay[data-visible] {
opacity: 1;
pointer-events: auto;
transform: translate(-50%, 0) scale(1);
filter: blur(0);
}
.btn {
appearance: none;
-webkit-appearance: none;
background: transparent;
border: 0;
margin: 0;
padding: 0;
color: inherit;
font: inherit;
cursor: default;
display: inline-flex;
align-items: center;
justify-content: center;
height: 28px;
min-width: 28px;
border-radius: 999px;
color: rgba(255,255,255,0.72);
transition: background 140ms ease, color 140ms ease;
-webkit-tap-highlight-color: transparent;
}
.btn:hover { background: rgba(255,255,255,0.12); color: #fff; }
.btn:active { background: rgba(255,255,255,0.18); }
.btn:focus { outline: none; }
.btn:focus-visible { outline: none; }
.btn::-moz-focus-inner { border: 0; }
.btn svg { width: 14px; height: 14px; display: block; }
.btn.reset {
font-size: 11px;
font-weight: 500;
letter-spacing: 0.02em;
padding: 0 10px 0 12px;
gap: 6px;
color: rgba(255,255,255,0.72);
}
.btn.reset .kbd {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 16px;
height: 16px;
padding: 0 4px;
font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
font-size: 10px;
line-height: 1;
color: rgba(255,255,255,0.88);
background: rgba(255,255,255,0.12);
border-radius: 4px;
}
.count {
font-variant-numeric: tabular-nums;
color: #fff;
font-weight: 500;
padding: 0 8px;
min-width: 42px;
text-align: center;
font-size: 12px;
}
.count .sep { color: rgba(255,255,255,0.45); margin: 0 3px; font-weight: 400; }
.count .total { color: rgba(255,255,255,0.55); }
.divider {
width: 1px;
height: 14px;
background: rgba(255,255,255,0.18);
margin: 0 2px;
}
/* ── Print: one page per slide, no chrome ────────────────────────────
The screen layout stacks every slide at inset:0 inside a scaled
canvas; for print we want them in document flow at the authored
design size so the browser paginates one slide per sheet. The
@page size is set from the width/height attributes via the inline
<style id="deck-stage-print-page"> that connectedCallback injects
into <head> (the @page at-rule has no effect inside shadow DOM). */
@media print {
:host {
position: static;
inset: auto;
background: none;
overflow: visible;
color: inherit;
}
.stage { position: static; display: block; }
.canvas {
transform: none !important;
width: auto !important;
height: auto !important;
background: none;
will-change: auto;
}
::slotted(*) {
position: relative !important;
inset: auto !important;
width: var(--deck-design-w) !important;
height: var(--deck-design-h) !important;
box-sizing: border-box !important;
opacity: 1 !important;
visibility: visible !important;
pointer-events: auto;
break-after: page;
page-break-after: always;
break-inside: avoid;
overflow: hidden;
}
::slotted(*:last-child) {
break-after: auto;
page-break-after: auto;
}
.overlay, .tapzones { display: none !important; }
}
`;
class DeckStage extends HTMLElement {
static get observedAttributes() { return ['width', 'height', 'noscale']; }
constructor() {
super();
this._root = this.attachShadow({ mode: 'open' });
this._index = 0;
this._slides = [];
this._notes = [];
this._hideTimer = null;
this._mouseIdleTimer = null;
this._onKey = this._onKey.bind(this);
this._onResize = this._onResize.bind(this);
this._onSlotChange = this._onSlotChange.bind(this);
this._onMouseMove = this._onMouseMove.bind(this);
this._onTapBack = this._onTapBack.bind(this);
this._onTapForward = this._onTapForward.bind(this);
}
get designWidth() {
return parseInt(this.getAttribute('width'), 10) || DESIGN_W_DEFAULT;
}
get designHeight() {
return parseInt(this.getAttribute('height'), 10) || DESIGN_H_DEFAULT;
}
connectedCallback() {
this._render();
this._loadNotes();
this._syncPrintPageRule();
window.addEventListener('keydown', this._onKey);
window.addEventListener('resize', this._onResize);
window.addEventListener('mousemove', this._onMouseMove, { passive: true });
// Initial collection + layout happens via slotchange, which fires on mount.
}
disconnectedCallback() {
window.removeEventListener('keydown', this._onKey);
window.removeEventListener('resize', this._onResize);
window.removeEventListener('mousemove', this._onMouseMove);
if (this._hideTimer) clearTimeout(this._hideTimer);
if (this._mouseIdleTimer) clearTimeout(this._mouseIdleTimer);
}
attributeChangedCallback() {
if (this._canvas) {
this._canvas.style.width = this.designWidth + 'px';
this._canvas.style.height = this.designHeight + 'px';
this._canvas.style.setProperty('--deck-design-w', this.designWidth + 'px');
this._canvas.style.setProperty('--deck-design-h', this.designHeight + 'px');
this._fit();
this._syncPrintPageRule();
}
}
_render() {
const style = document.createElement('style');
style.textContent = stylesheet;
const stage = document.createElement('div');
stage.className = 'stage';
const canvas = document.createElement('div');
canvas.className = 'canvas';
canvas.style.width = this.designWidth + 'px';
canvas.style.height = this.designHeight + 'px';
canvas.style.setProperty('--deck-design-w', this.designWidth + 'px');
canvas.style.setProperty('--deck-design-h', this.designHeight + 'px');
const slot = document.createElement('slot');
slot.addEventListener('slotchange', this._onSlotChange);
canvas.appendChild(slot);
stage.appendChild(canvas);
// Tap zones (mobile): left third = back, right third = forward.
const tapzones = document.createElement('div');
tapzones.className = 'tapzones export-hidden';
tapzones.setAttribute('aria-hidden', 'true');
tapzones.setAttribute('data-noncommentable', '');
const tzBack = document.createElement('div');
tzBack.className = 'tapzone tapzone--back';
const tzMid = document.createElement('div');
tzMid.className = 'tapzone tapzone--mid';
tzMid.style.pointerEvents = 'none';
const tzFwd = document.createElement('div');
tzFwd.className = 'tapzone tapzone--fwd';
tzBack.addEventListener('click', this._onTapBack);
tzFwd.addEventListener('click', this._onTapForward);
tapzones.append(tzBack, tzMid, tzFwd);
// Overlay: compact, solid black, with clickable controls.
const overlay = document.createElement('div');
overlay.className = 'overlay export-hidden';
overlay.setAttribute('role', 'toolbar');
overlay.setAttribute('aria-label', 'Deck controls');
overlay.setAttribute('data-noncommentable', '');
overlay.innerHTML = `
<button class="btn prev" type="button" aria-label="Previous slide" title="Previous (←)">
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 3L5 8l5 5"/></svg>
</button>
<span class="count" aria-live="polite"><span class="current">1</span><span class="sep">/</span><span class="total">1</span></span>
<button class="btn next" type="button" aria-label="Next slide" title="Next (→)">
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 3l5 5-5 5"/></svg>
</button>
<span class="divider"></span>
<button class="btn reset" type="button" aria-label="Reset to first slide" title="Reset (R)">Reset<span class="kbd">R</span></button>
`;
overlay.querySelector('.prev').addEventListener('click', () => this._go(this._index - 1, 'click'));
overlay.querySelector('.next').addEventListener('click', () => this._go(this._index + 1, 'click'));
overlay.querySelector('.reset').addEventListener('click', () => this._go(0, 'click'));
this._root.append(style, stage, tapzones, overlay);
this._canvas = canvas;
this._slot = slot;
this._overlay = overlay;
this._countEl = overlay.querySelector('.current');
this._totalEl = overlay.querySelector('.total');
}
/** @page must live in the document stylesheet — it's a no-op inside
* shadow DOM. Inject/update a single <head> style tag so the print
* sheet matches the design size and Save-as-PDF yields one slide per
* page with no margins. */
_syncPrintPageRule() {
const id = 'deck-stage-print-page';
let tag = document.getElementById(id);
if (!tag) {
tag = document.createElement('style');
tag.id = id;
document.head.appendChild(tag);
}
tag.textContent =
'@page { size: ' + this.designWidth + 'px ' + this.designHeight + 'px; margin: 0; } ' +
'@media print { html, body { margin: 0 !important; padding: 0 !important; background: none !important; overflow: visible !important; height: auto !important; } ' +
'* { -webkit-print-color-adjust: exact; print-color-adjust: exact; } }';
}
_onSlotChange() {
this._collectSlides();
this._restoreIndex();
this._applyIndex({ showOverlay: false, broadcast: true, reason: 'init' });
this._fit();
}
_collectSlides() {
const assigned = this._slot.assignedElements({ flatten: true });
this._slides = assigned.filter((el) => {
// Skip template/style/script nodes even if someone slots them.
const tag = el.tagName;
return tag !== 'TEMPLATE' && tag !== 'SCRIPT' && tag !== 'STYLE';
});
this._slides.forEach((slide, i) => {
const n = i + 1;
// Determine a label for comment flow: prefer explicit data-label,
// then an existing data-screen-label, then first heading, else "Slide".
let label = slide.getAttribute('data-label');
if (!label) {
const existing = slide.getAttribute('data-screen-label');
if (existing) {
// Strip any leading number the author may have included.
label = existing.replace(/^\s*\d+\s*/, '').trim() || existing;
}
}
if (!label) {
const h = slide.querySelector('h1, h2, h3, [data-title]');
if (h) label = (h.textContent || '').trim().slice(0, 40);
}
if (!label) label = 'Slide';
slide.setAttribute('data-screen-label', `${pad2(n)} ${label}`);
// Validation attribute for comment flow / auto-checks.
if (!slide.hasAttribute('data-om-validate')) {
slide.setAttribute('data-om-validate', VALIDATE_ATTR);
}
slide.setAttribute('data-deck-slide', String(i));
});
if (this._totalEl) this._totalEl.textContent = String(this._slides.length || 1);
if (this._index >= this._slides.length) this._index = Math.max(0, this._slides.length - 1);
}
_loadNotes() {
const tag = document.getElementById('speaker-notes');
if (!tag) { this._notes = []; return; }
try {
const parsed = JSON.parse(tag.textContent || '[]');
if (Array.isArray(parsed)) this._notes = parsed;
} catch (e) {
console.warn('[deck-stage] Failed to parse #speaker-notes JSON:', e);
this._notes = [];
}
}
_restoreIndex() {
// The host's ?slide= param is delivered as a #<int> hash (1-indexed) on
// the iframe src. No hash → slide 1; the deck itself keeps no position
// state across loads.
const h = (location.hash || '').match(/^#(\d+)$/);
if (h) {
const n = parseInt(h[1], 10) - 1;
if (n >= 0 && n < this._slides.length) this._index = n;
}
}
_applyIndex({ showOverlay = true, broadcast = true, reason = 'init' } = {}) {
if (!this._slides.length) return;
const prev = this._prevIndex == null ? -1 : this._prevIndex;
const curr = this._index;
// Keep the iframe's own hash in sync so an in-iframe location.reload()
// (reload banner path in viewer-handle.ts) lands on the current slide,
// not the stale deep-link hash from initial load.
try { history.replaceState(null, '', '#' + (curr + 1)); } catch (e) {}
this._slides.forEach((s, i) => {
if (i === curr) s.setAttribute('data-deck-active', '');
else s.removeAttribute('data-deck-active');
});
if (this._countEl) this._countEl.textContent = String(curr + 1);
if (broadcast) {
// (1) Legacy: host-window postMessage for speaker-notes renderers.
try { window.postMessage({ slideIndexChanged: curr }, '*'); } catch (e) {}
// (2) In-page CustomEvent on the <deck-stage> element itself.
// Bubbles and composes out of shadow DOM so slide code can listen:
// document.querySelector('deck-stage').addEventListener('slidechange', e => {
// e.detail.index, e.detail.previousIndex, e.detail.total, e.detail.slide, e.detail.reason
// });
const detail = {
index: curr,
previousIndex: prev,
total: this._slides.length,
slide: this._slides[curr] || null,
previousSlide: prev >= 0 ? (this._slides[prev] || null) : null,
reason: reason, // 'init' | 'keyboard' | 'click' | 'tap' | 'api'
};
this.dispatchEvent(new CustomEvent('slidechange', {
detail,
bubbles: true,
composed: true,
}));
}
this._prevIndex = curr;
if (showOverlay) this._flashOverlay();
}
_flashOverlay() {
if (!this._overlay) return;
this._overlay.setAttribute('data-visible', '');
if (this._hideTimer) clearTimeout(this._hideTimer);
this._hideTimer = setTimeout(() => {
this._overlay.removeAttribute('data-visible');
}, OVERLAY_HIDE_MS);
}
_fit() {
if (!this._canvas) return;
// PPTX export sets noscale so the DOM capture sees authored-size
// geometry — the scaled canvas is in shadow DOM, so the exporter's
// resetTransformSelector can't reach .canvas.style.transform directly.
if (this.hasAttribute('noscale')) {
this._canvas.style.transform = 'none';
return;
}
const vw = window.innerWidth;
const vh = window.innerHeight;
const s = Math.min(vw / this.designWidth, vh / this.designHeight);
this._canvas.style.transform = `scale(${s})`;
}
_onResize() { this._fit(); }
_onMouseMove() {
// Keep overlay visible while mouse moves; hide after idle.
this._flashOverlay();
}
_onTapBack(e) {
e.preventDefault();
this._go(this._index - 1, 'tap');
}
_onTapForward(e) {
e.preventDefault();
this._go(this._index + 1, 'tap');
}
_onKey(e) {
// Ignore when the user is typing.
const t = e.target;
if (t && (t.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName))) return;
if (e.metaKey || e.ctrlKey || e.altKey) return;
const key = e.key;
let handled = true;
if (key === 'ArrowRight' || key === 'PageDown' || key === ' ' || key === 'Spacebar') {
this._go(this._index + 1, 'keyboard');
} else if (key === 'ArrowLeft' || key === 'PageUp') {
this._go(this._index - 1, 'keyboard');
} else if (key === 'Home') {
this._go(0, 'keyboard');
} else if (key === 'End') {
this._go(this._slides.length - 1, 'keyboard');
} else if (key === 'r' || key === 'R') {
this._go(0, 'keyboard');
} else if (/^[0-9]$/.test(key)) {
// 1..9 jump to that slide; 0 jumps to 10.
const n = key === '0' ? 9 : parseInt(key, 10) - 1;
if (n < this._slides.length) this._go(n, 'keyboard');
} else {
handled = false;
}
if (handled) {
e.preventDefault();
this._flashOverlay();
}
}
_go(i, reason = 'api') {
if (!this._slides.length) return;
const clamped = Math.max(0, Math.min(this._slides.length - 1, i));
if (clamped === this._index) {
this._flashOverlay();
return;
}
this._index = clamped;
this._applyIndex({ showOverlay: true, broadcast: true, reason });
}
// Public API ------------------------------------------------------------
/** Current slide index (0-based). */
get index() { return this._index; }
/** Total slide count. */
get length() { return this._slides.length; }
/** Programmatically navigate. */
goTo(i) { this._go(i, 'api'); }
next() { this._go(this._index + 1, 'api'); }
prev() { this._go(this._index - 1, 'api'); }
reset() { this._go(0, 'api'); }
}
if (!customElements.get('deck-stage')) {
customElements.define('deck-stage', DeckStage);
}
})();
Bold Template Pack
This pack brings the beautiful-html-templates design systems into the frontend-slides skill without making them the default for every deck.
What To Read
1. Read bold-template-pack/selection-index.json first. 2. Shortlist candidates from metadata only:
moodtonebest_foravoid_forformalitydensityscheme
3. For title-slide previews, read only the relevant candidate preview.md files. 4. After the user chooses a bold template, read exactly that one template's full design.md. 5. Do not read every design.md in the pack. 6. Do not read or copy template.html from the source template library unless a selected design.md is missing a critical implementation detail.
The full source metadata index is not bundled in the user-facing skill. Normal generation should use selection-index.json only.
How To Use In Frontend Slides
Preview mix:
- 1 safe option from
STYLE_PRESETS.md - at least 1 bold option from this pack
- 1 wildcard option, which may be another bold template from this pack or a
self-generated custom design
Adjust the tone inside that default mix:
- For board, legal, regulatory, healthcare, investor-update, or highly formal
internal decks, make the safe option very restrained and choose calmer, higher-formality bold templates. The wildcard should feel authoritative and specific, not merely decorative.
- For bold, editorial, expressive, experimental, or highly designed decks, keep
the safe option as a readable fallback, choose one strong bold template, and use the wildcard for either a second adventurous template or a custom design that better matches the user's occasion and vibe.
If the wildcard is custom, it must follow Frontend Slides' no-slop aesthetics: distinctive typography, a committed palette, a recognizable layout system, a context-specific visual idea, fixed 16:9 stage behavior, and no visible process labels such as "custom", "wildcard", "template", or "preview".
Implementation Contract
design.md is the design-system reference. Treat it as a style recipe, not as content to copy. preview.md is only a lightweight style card for generating the three title-slide options.
Preview slides must be real title slides for the user's deck. Do not render template names, option labels, file names, paths, preview.md, "generated from", or user requirement notes on the slide itself.
When generating final slides:
- Keep
frontend-slidesoutput as one self-contained HTML file. - Include the full contents of
viewport-base.css. - Generate every deck as a fixed 1920×1080 stage scaled uniformly to the
viewport. This applies even if the source template was originally viewport-fluid.
- Treat
vw,vh, andclamp()values in a sourcedesign.mdas design
proportions to translate into fixed 1920×1080 stage coordinates.
- Preserve the selected template's fonts, palette, decorative vocabulary,
spacing rhythm, and component grammar.
- Keep the user's actual slide content primary. The template style should shape
presentation, not override message or structure.
- Verify rendered output for both text overflow and panel overlap. A card can
pass scrollHeight checks while still being covered by another grid panel.
{
"schema_version": 1,
"pack_name": "Beautiful HTML Templates - Bold Design Pack",
"source_repo": "zarazhangrui/beautiful-html-templates",
"template_count": 34,
"usage": {
"selection": "Read this compact index first to shortlist bold templates from metadata.",
"previews": "For title-slide previews, read only the preview_md files for the shortlisted bold candidates.",
"final_generation": "After the user chooses a bold template, read exactly that template design_md before generating the full deck.",
"never": "Do not bulk-read templates/*/design.md and do not read template.html unless the selected design.md is missing a critical implementation detail."
},
"frontend_slides_policy": {
"layout_model": "fixed-stage",
"canvas_width": 1920,
"canvas_height": 1080,
"scaling": "scale-stage-to-viewport",
"mobile_behavior": "preserve 16:9 stage; letterbox or pillarbox instead of reflowing slide content"
},
"templates": [
{
"slug": "8-bit-orbit",
"name": "8-Bit Orbit",
"tagline": "Pixel-art neon arcade aesthetic on a deep navy void.",
"mood": [
"retro-tech",
"playful",
"cyberpunk",
"energetic"
],
"tone": [
"geeky",
"neon",
"rebellious",
"sci-fi"
],
"formality": "low",
"density": "medium",
"scheme": "dark",
"best_for": "Anything that should feel like a CRT screen at 2am: cyberpunk, gaming, web3, indie dev tools, hackathon demos. Just as good for a tech talk that wants to lean into nostalgic-digital craft, a synthwave brand deck, or a creative review that wants to feel like a console.",
"avoid_for": "Contexts where the dark neon palette would actively work against the message — quiet institutional finance disclosures, healthcare patient-facing materials, traditional luxury.",
"preview_md": "bold-template-pack/templates/8-bit-orbit/preview.md",
"design_md": "bold-template-pack/templates/8-bit-orbit/design.md"
},
{
"slug": "biennale-yellow",
"name": "Biennale Yellow",
"tagline": "Solar yellow on warm parchment with deep indigo serif and atmospheric sun-glow gradients.",
"mood": [
"editorial",
"atmospheric",
"warm",
"cultural-institution",
"poster-like"
],
"tone": [
"literary",
"considered",
"contemplative",
"warm-modern",
"Dutch-editorial"
],
"formality": "high",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel like an art-biennale poster or a museum's annual programme: exhibition decks, arts-institution announcements, design conference brochures, curatorial pitches, literary publications, studio retrospectives. Equally good for any deck wanting Dutch-editorial atmosphere with an unmistakable single-color signature.",
"avoid_for": "Decks that need visual punch or saturated multi-color energy — the warm-paper canvas and one-yellow palette are intentionally quiet and atmospheric.",
"preview_md": "bold-template-pack/templates/biennale-yellow/preview.md",
"design_md": "bold-template-pack/templates/biennale-yellow/design.md"
},
{
"slug": "block-frame",
"name": "BlockFrame",
"tagline": "Neobrutalist deck with pastel-neon color blocks and chunky black borders.",
"mood": [
"bold",
"playful",
"graphic",
"fresh"
],
"tone": [
"confident",
"graphic",
"pop",
"design-led"
],
"formality": "medium-low",
"density": "high",
"scheme": "light",
"best_for": "Anything that should feel pop-graphic and design-led: indie SaaS launches, agency credentials, creative reviews, brand redesigns. Also a strong unexpected pick for tech, finance, or research when the speaker wants to land as confident and contemporary rather than buttoned-up.",
"avoid_for": "Contexts that require quiet institutional restraint or traditional weight (regulated disclosures, formal legal briefs).",
"preview_md": "bold-template-pack/templates/block-frame/preview.md",
"design_md": "bold-template-pack/templates/block-frame/design.md"
},
{
"slug": "blue-professional",
"name": "Blue Professional",
"tagline": "Cream paper background with electric cobalt blue accents; clean modern professional.",
"mood": [
"professional",
"modern",
"calm",
"trustworthy"
],
"tone": [
"clean",
"considered",
"polished",
"neutral"
],
"formality": "medium-high",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel modern-considered and lightly authoritative: B2B SaaS pitches, consulting deliverables, advisory updates, investor reports. Also a clean, tasteful choice whenever you want to read as professional without going stiff — research synthesis, internal reviews, brand work for service businesses.",
"avoid_for": "Contexts where the deck should feel hot, playful, or intentionally informal — the cool electric-blue restraint will read as overly polished.",
"preview_md": "bold-template-pack/templates/blue-professional/preview.md",
"design_md": "bold-template-pack/templates/blue-professional/design.md"
},
{
"slug": "bold-poster",
"name": "Bold Poster",
"tagline": "Editorial poster aesthetic with massive Shrikhand display and a single fire-engine red accent.",
"mood": [
"bold",
"editorial",
"loud",
"confident"
],
"tone": [
"dramatic",
"graphic",
"sharp",
"intentional"
],
"formality": "medium",
"density": "low",
"scheme": "light",
"best_for": "Anything that should land like a magazine cover: brand manifestos, founder vision decks, editorial / cultural pitches, creative reviews. Excellent any time you want a few words to feel like a poster — including unexpected fits like a tech keynote or a finance manifesto that wants to be quotable.",
"avoid_for": "Decks that need to communicate dense information per slide — the layout is built around a few large statements, not paragraphs of detail.",
"preview_md": "bold-template-pack/templates/bold-poster/preview.md",
"design_md": "bold-template-pack/templates/bold-poster/design.md"
},
{
"slug": "broadside",
"name": "Broadside",
"tagline": "Dark editorial canvas with a single fire orange accent and bilingual Latin/Chinese type stack.",
"mood": [
"editorial",
"dramatic",
"loud",
"newspaper"
],
"tone": [
"graphic",
"punchy",
"literary",
"considered"
],
"formality": "medium-high",
"density": "medium",
"scheme": "dark",
"best_for": "Anything that should land like a broadside newspaper headline: brand manifestos, magazine and cultural pitches, design talks, bilingual EN/CN decks, founder vision statements. Also a striking pick for tech, research, or business decks that want a dramatic single-accent editorial feel.",
"avoid_for": "Decks that need to feel quiet, warm, or institutionally traditional — the dark canvas with fire-orange accent commits to drama.",
"preview_md": "bold-template-pack/templates/broadside/preview.md",
"design_md": "bold-template-pack/templates/broadside/design.md"
},
{
"slug": "capsule",
"name": "Capsule",
"tagline": "Modular pill-shaped cards on warm bone with a full pastel-pop palette.",
"mood": [
"playful",
"modern",
"warm",
"fresh",
"fun"
],
"tone": [
"upbeat",
"graphic",
"approachable",
"cool"
],
"formality": "medium-low",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel modular, modern, and a little Y2K: lifestyle brands, creator portfolios, DTC launches, beauty / wellness, agency credentials. Also fun for a playful tech demo or a research deck that wants pop-art clarity instead of gravitas.",
"avoid_for": "Contexts that require traditional institutional weight — the capsule shapes and pastel pops actively soften authority.",
"preview_md": "bold-template-pack/templates/capsule/preview.md",
"design_md": "bold-template-pack/templates/capsule/design.md"
},
{
"slug": "cartesian",
"name": "Cartesian",
"tagline": "Quiet warm-neutral palette with classical Playfair serifs; tasteful and unhurried.",
"mood": [
"quiet",
"considered",
"elegant",
"warm-minimal"
],
"tone": [
"classical",
"literary",
"restrained",
"confident-quiet"
],
"formality": "high",
"density": "low",
"scheme": "light",
"best_for": "Anything that should feel quiet, considered, and grown-up: investment theses, white papers, advisory work, longform research, gallery / cultural decks. Also a strong choice for editorial features, founder reflections, or any deck where restraint is the message — including across tech and finance.",
"avoid_for": "Decks that need visual heat, multiple accents, or a sense of urgency — the warm-neutral palette is intentionally low-energy.",
"preview_md": "bold-template-pack/templates/cartesian/preview.md",
"design_md": "bold-template-pack/templates/cartesian/design.md"
},
{
"slug": "cobalt-grid",
"name": "Cobalt Grid",
"tagline": "Electric cobalt serifs on a graph-paper canvas, anchored by stair-stepped pixel-glitch decorations and slim hairline rules.",
"mood": [
"editorial",
"design-research",
"studious",
"modernist",
"tech-print",
"monochrome"
],
"tone": [
"considered",
"literary",
"studious",
"quietly-modern",
"editorial"
],
"formality": "high",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel like a quietly serious design / research bulletin, art publication, or curated trend report. Strong for studio annuals, agency capabilities decks, design-research publications, architecture / art / academic decks, and any deck wanting one strict accent colour and a printed-ledger calmness rather than corporate polish.",
"avoid_for": "Decks that need warmth, multi-colour energy, or a casual / playful voice — the strict cobalt + cream + grid palette is intentionally austere.",
"preview_md": "bold-template-pack/templates/cobalt-grid/preview.md",
"design_md": "bold-template-pack/templates/cobalt-grid/design.md"
},
{
"slug": "coral",
"name": "Coral",
"tagline": "Cream and coral on near-black, set in oversized Bebas Neue.",
"mood": [
"bold",
"warm",
"modern",
"confident"
],
"tone": [
"graphic",
"punchy",
"magazine"
],
"formality": "medium",
"density": "medium",
"scheme": "mixed",
"best_for": "Anything that should feel warm-graphic and editorial: fashion, beauty, fitness, F&B, lifestyle brands, agency credentials. Just as strong for a creator portfolio, a manifesto, or a tech / research deck that wants warmth and a single bold accent instead of corporate cool.",
"avoid_for": "Contexts that should feel quiet or institutional — the coral accent and oversized Bebas Neue commit hard to a confident magazine voice.",
"preview_md": "bold-template-pack/templates/coral/preview.md",
"design_md": "bold-template-pack/templates/coral/design.md"
},
{
"slug": "creative-mode",
"name": "Creative Mode",
"tagline": "Cream paper canvas with confident multi-color (green, pink, orange, yellow) accents and Archivo Black display.",
"mood": [
"creative",
"confident",
"playful",
"design-led"
],
"tone": [
"graphic",
"expressive",
"modern"
],
"formality": "medium",
"density": "medium-high",
"scheme": "light",
"best_for": "Anything that should feel design-led and confident: creative agency pitches, design studio decks, ad shop credentials, brand creative reviews, art-direction reviews. Also a great unexpected pick for a tech talk, research findings, or finance review when the speaker wants to lead with taste rather than convention.",
"avoid_for": "Contexts that demand institutional restraint and a quiet authority — the saturated multi-accent palette will read as expressive, not formal.",
"preview_md": "bold-template-pack/templates/creative-mode/preview.md",
"design_md": "bold-template-pack/templates/creative-mode/design.md"
},
{
"slug": "daisy-days",
"name": "Daisy Days",
"tagline": "Cheerful pastel deck with hand-drawn daisies, stars, and rainbows. Friendly, soft, and warm.",
"mood": [
"cheerful",
"playful",
"warm",
"sunny",
"wholesome"
],
"tone": [
"friendly",
"soft",
"encouraging",
"approachable",
"lighthearted"
],
"formality": "low",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel friendly, soft, and joyful: educational content, kids and family, wellness programs, community workshops, creator portfolios for craft / illustration. Also lovely for an unexpected playful internal kickoff, a wedding planning deck, or any moment where warmth is the message — including across tech or business contexts.",
"avoid_for": "Contexts where the audience explicitly expects authority and precision — the hand-drawn pastel SVG decorations are the opposite of buttoned-up.",
"preview_md": "bold-template-pack/templates/daisy-days/preview.md",
"design_md": "bold-template-pack/templates/daisy-days/design.md"
},
{
"slug": "editorial-forest",
"name": "Editorial Forest",
"tagline": "Forest green, dusty pink, and warm cream meet Source Serif 4 in a quiet, intentional quarterly-review deck.",
"mood": [
"editorial",
"quiet",
"considered",
"warm",
"intentional"
],
"tone": [
"literary",
"thoughtful",
"warm",
"low-pressure"
],
"formality": "medium",
"density": "medium",
"scheme": "mixed",
"best_for": "Anything that should feel like a considered editorial — quarterly reviews, internal readouts, studio updates, creative-agency presentations. Equally good for any deck that wants to feel warm and unhurried rather than corporate, including research recaps, book or program announcements, and team retrospectives.",
"avoid_for": "Contexts that need to feel urgent, punchy, or sales-driven — the palette and rhythm are intentionally quiet.",
"preview_md": "bold-template-pack/templates/editorial-forest/preview.md",
"design_md": "bold-template-pack/templates/editorial-forest/design.md"
},
{
"slug": "editorial-tri-tone",
"name": "Editorial Tri-Tone",
"tagline": "Three-color editorial system: dusty pink, mustard cream, and deep burgundy, set in Bricolage + Instrument Serif.",
"mood": [
"editorial",
"warm",
"intentional",
"moody"
],
"tone": [
"literary",
"warm",
"considered",
"stylish"
],
"formality": "medium-high",
"density": "medium",
"scheme": "mixed",
"best_for": "Anything that should feel like a fashion-magazine spread: editorial pitches, fashion brand decks, lifestyle media, art direction reviews. Equally good for any deck — including tech, research, or business — that wants tri-tone discipline and serif/sans contrast instead of the usual neutrals.",
"avoid_for": "Decks that need to read as soft or comforting — the burgundy/pink/cream tri-tone is intentionally high-contrast and styled.",
"preview_md": "bold-template-pack/templates/editorial-tri-tone/preview.md",
"design_md": "bold-template-pack/templates/editorial-tri-tone/design.md"
},
{
"slug": "emerald-editorial",
"name": "Emerald Editorial",
"tagline": "A magazine-cover business deck: emerald + navy + paper, double-rule masthead ornaments, and a bold Bodoni-style display serif.",
"mood": [
"editorial",
"considered",
"confident",
"magazine-cover"
],
"tone": [
"literary",
"authoritative",
"warm",
"designed"
],
"formality": "medium-high",
"density": "medium",
"scheme": "mixed",
"best_for": "Anything that should feel like the front of a serious magazine, including but not limited to leadership readouts, planning-office reviews, and strategy briefings. The double-rule masthead ornament gives it editorial gravitas without making it stiff — also a great unexpected pick for product launches or research recaps that want to feel considered rather than corporate.",
"avoid_for": "Contexts that need to read as quiet, neutral, or institutionally restrained — the emerald field is too saturated to disappear into the background.",
"preview_md": "bold-template-pack/templates/emerald-editorial/preview.md",
"design_md": "bold-template-pack/templates/emerald-editorial/design.md"
},
{
"slug": "grove",
"name": "Grove",
"tagline": "Forest-green canvas with cream type, classical Playfair serifs, and a single rust accent.",
"mood": [
"organic",
"considered",
"warm",
"literary",
"natural"
],
"tone": [
"classical",
"warm",
"considered",
"patient"
],
"formality": "medium-high",
"density": "medium",
"scheme": "mixed",
"best_for": "Anything that should feel organic, considered, and grown-up: sustainability and wellness brands, outdoor / nature products, wineries and restaurants, literary or arts decks, advisory deliverables, bilingual EN/CN reports. Also a calm, distinctive choice for tech, research, or business decks that want patience over urgency.",
"avoid_for": "Decks that need neon energy or rapid-fire pop — the forest-green canvas and Playfair serif commit to a slow, classical voice.",
"preview_md": "bold-template-pack/templates/grove/preview.md",
"design_md": "bold-template-pack/templates/grove/design.md"
},
{
"slug": "long-table",
"name": "Long Table",
"tagline": "Warm cream and rust-red supper-club aesthetic with bold uppercase grotesk headlines, Fraunces serifs, and pill-shaped outlined buttons.",
"mood": [
"warm",
"intimate",
"modern",
"friendly",
"small-batch",
"social",
"hospitality"
],
"tone": [
"warm",
"playful",
"considered",
"social",
"magazine-friendly",
"modern-editorial"
],
"formality": "medium",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel like a warm, intimate, modern hospitality / community brand: supper clubs, dinner series, small restaurants, creative-studio events, membership pitches, lifestyle and wine brands. Equally good for any deck wanting a single warm accent colour, mixed-weight typography, and a social-media-aware modern-editorial voice.",
"avoid_for": "Decks that need corporate polish, technical density, or a cold / minimalist register — the rust-red palette and bold serif mix are intentionally warm and people-facing.",
"preview_md": "bold-template-pack/templates/long-table/preview.md",
"design_md": "bold-template-pack/templates/long-table/design.md"
},
{
"slug": "mat",
"name": "Mat",
"tagline": "Dark sage canvas with bone paper and burnt-orange accent; mid-century modern with wood undertones.",
"mood": [
"warm-modern",
"considered",
"tactile",
"mid-century"
],
"tone": [
"warm",
"design-led",
"intentional",
"considered"
],
"formality": "medium",
"density": "medium",
"scheme": "mixed",
"best_for": "Anything that should feel mid-century, tactile, and intentional: design studio credentials, architecture / interior brands, ceramics / craft / furniture, advisory decks. Also a warm, distinctive choice for tech, research, or business decks that want a considered analog feel instead of digital-cool.",
"avoid_for": "Contexts that need fast tech energy or institutional restraint — the muted sage and burnt-orange palette is intentionally warm and slow.",
"preview_md": "bold-template-pack/templates/mat/preview.md",
"design_md": "bold-template-pack/templates/mat/design.md"
},
{
"slug": "monochrome",
"name": "Monochrome",
"tagline": "Ivory ledger paper with all-black type; Lora serif headlines, Jost body, no color at all.",
"mood": [
"restrained",
"literary",
"archival",
"ledger"
],
"tone": [
"literary",
"considered",
"neutral",
"honest"
],
"formality": "high",
"density": "high",
"scheme": "light",
"best_for": "Anything that should feel like a hand-typeset ledger: user research synthesis, white papers, longform reports, academic and policy briefs, advisory deliverables, bilingual EN/CN reports. Equally good for tech, design, or brand decks that want their words to be the only thing on the page.",
"avoid_for": "Decks that need visual personality or color-led storytelling — the all-ink palette is intentionally austere.",
"preview_md": "bold-template-pack/templates/monochrome/preview.md",
"design_md": "bold-template-pack/templates/monochrome/design.md"
},
{
"slug": "neo-grid-bold",
"name": "Neo-Grid Bold",
"tagline": "Editorial neo-brutalism with a single neon yellow accent on off-white paper.",
"mood": [
"confident",
"punchy",
"editorial",
"modern"
],
"tone": [
"bold",
"minimal",
"design-led",
"graphic"
],
"formality": "medium",
"density": "high",
"scheme": "light",
"best_for": "Anything that should feel confident and editorial-graphic: design-led pitches, brand work, founder talks, conference keynotes. Excellent for stat-heavy slides, comparisons, and process flows. Just as strong for tech, research, or finance when the speaker wants to read as design-led rather than corporate.",
"avoid_for": "Contexts that need to feel quiet, traditional, or warm — the neon-yellow accent and uppercase display commit to a confident editorial voice.",
"preview_md": "bold-template-pack/templates/neo-grid-bold/preview.md",
"design_md": "bold-template-pack/templates/neo-grid-bold/design.md"
},
{
"slug": "peoples-platform",
"name": "People's Platform (Block & Bold)",
"tagline": "Activist poster energy: blue, orange, red on cream, with Alfa Slab + Caveat Brush.",
"mood": [
"activist",
"loud",
"graphic",
"honest"
],
"tone": [
"punchy",
"direct",
"expressive",
"warm-bold"
],
"formality": "medium-low",
"density": "medium-high",
"scheme": "light",
"best_for": "Anything that should feel honest, loud, and graphic: cultural commentary, manifestos, civic and community decks, design talks, campaign pitches. Excellent for founder-vision moments, mission statements, or any deck — including across industries — that wants protest-poster energy instead of corporate polish.",
"avoid_for": "Contexts where institutional restraint is the actual goal — the saturated political-poster palette commits hard to expressive energy.",
"preview_md": "bold-template-pack/templates/peoples-platform/preview.md",
"design_md": "bold-template-pack/templates/peoples-platform/design.md"
},
{
"slug": "pin-and-paper",
"name": "Pin & Paper",
"tagline": "Yellow paper with safety-pin illustrations, ink-blue handwritten Caveat, paper-grain texture.",
"mood": [
"crafted",
"handmade",
"warm",
"thoughtful",
"literary"
],
"tone": [
"literary",
"intimate",
"warm",
"grounded"
],
"formality": "medium",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel hand-crafted, warm, and literary: qualitative research findings, founder reflections, longform brand stories, workshop debriefs. The signature safety-pin illustrations and paper-grain texture make it especially good for any deck — including tech or business — that wants personality and warmth over polish.",
"avoid_for": "Decks that need to feel digital-native polished or rigorously data-driven — handwritten Caveat is intentionally informal.",
"preview_md": "bold-template-pack/templates/pin-and-paper/preview.md",
"design_md": "bold-template-pack/templates/pin-and-paper/design.md"
},
{
"slug": "pink-script",
"name": "Pink Script — After Hours",
"tagline": "Black canvas, hot pink accent, pearl-cream paper, Instrument Serif headlines: late-night editorial luxury.",
"mood": [
"nocturnal",
"moody",
"intentional",
"luxe",
"expressive"
],
"tone": [
"literary",
"sultry",
"considered",
"magazine"
],
"formality": "medium-high",
"density": "low",
"scheme": "dark",
"best_for": "Anything that should feel nocturnal, intentional, and a little luxe: fashion brand decks, creator personal brands, after-hours / nightlife / spirits launches, luxury product reveals, editorial features. Also a striking unexpected pick for a tech keynote, research synthesis, or business pitch that wants to land with magnetic confidence.",
"avoid_for": "Daytime corporate-professional and traditional B2B contexts where the dark canvas with hot-pink accent reads as too styled or too expressive.",
"preview_md": "bold-template-pack/templates/pink-script/preview.md",
"design_md": "bold-template-pack/templates/pink-script/design.md"
},
{
"slug": "playful",
"name": "Playful",
"tagline": "Sun-warm peach background with Syne display: a friendly indie launch deck.",
"mood": [
"warm",
"approachable",
"indie",
"friendly"
],
"tone": [
"upbeat",
"informal",
"welcoming"
],
"formality": "low",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel warm, indie, and approachable: creator portfolios, indie product launches, lifestyle brands, small-business pitches, newsletter / community decks. Also welcoming for any deck — including tech or research — that wants to feel friendly and human rather than corporate.",
"avoid_for": "Contexts where institutional credibility matters more than warmth — the peach palette is intentionally informal.",
"preview_md": "bold-template-pack/templates/playful/preview.md",
"design_md": "bold-template-pack/templates/playful/design.md"
},
{
"slug": "raw-grid",
"name": "Raw Grid",
"tagline": "Neo-brutalist deck with thick borders, offset shadows, and a pink/sage/ink palette.",
"mood": [
"raw",
"punchy",
"energetic",
"confident"
],
"tone": [
"direct",
"modern",
"no-nonsense",
"graphic"
],
"formality": "medium-low",
"density": "high",
"scheme": "light",
"best_for": "Anything that should feel direct and graphic-confident: founder pitches, accelerator demos, brand decks, indie launches, creator portfolios. Strong for stat slides, comparison tables, and process flows. Equally good for tech, research, or finance when the speaker wants the deck to feel scrappy-confident rather than buttoned-up.",
"avoid_for": "Contexts that need to feel soft, warm, or intentionally quiet — the brutalist borders and offset shadows commit to a graphic voice.",
"preview_md": "bold-template-pack/templates/raw-grid/preview.md",
"design_md": "bold-template-pack/templates/raw-grid/design.md"
},
{
"slug": "retro-windows",
"name": "Retro Windows",
"tagline": "Windows 95 chrome: gray title bars, MS Sans Serif, pixel typography, full nostalgia.",
"mood": [
"nostalgic",
"retro",
"geeky",
"playful"
],
"tone": [
"winking",
"nostalgic",
"geeky",
"fun"
],
"formality": "low",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel knowingly nostalgic: retro gaming, Y2K-aesthetic brands, creator portfolios with a 90s vibe, tech-history talks, deliberately tongue-in-cheek decks. A great choice anywhere a playful retro reference is the entire point.",
"avoid_for": "Decks that need to read as modern, elegant, or institutionally credible — the Win95 chrome will always read as a costume.",
"preview_md": "bold-template-pack/templates/retro-windows/preview.md",
"design_md": "bold-template-pack/templates/retro-windows/design.md"
},
{
"slug": "retro-zine",
"name": "Retro Zine",
"tagline": "Beige paper with green accent and Bebas Neue + Caveat: a riso-printed zine in HTML form.",
"mood": [
"crafted",
"lo-fi",
"underground",
"warm-retro"
],
"tone": [
"scrappy",
"warm",
"intentional",
"DIY"
],
"formality": "medium-low",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel printed, lo-fi, and crafted: indie zines and publications, music / arts brands, creator portfolios, small-batch craft launches, community decks. Also a great underdog choice for tech, research, or business decks that want a riso-print warmth instead of digital polish.",
"avoid_for": "Contexts that demand digital-native polish or fast modern-tech energy — the layered zine aesthetic intentionally feels handmade.",
"preview_md": "bold-template-pack/templates/retro-zine/preview.md",
"design_md": "bold-template-pack/templates/retro-zine/design.md"
},
{
"slug": "sakura-chroma",
"name": "Sakura Chroma",
"tagline": "Vintage Japanese cassette-package aesthetic: cream paper, diagonal rainbow ribbons, condensed bold type, JIS-style spec checkboxes.",
"mood": [
"retro",
"playful",
"kawaii-tech",
"warm",
"tactile",
"product-catalogue"
],
"tone": [
"playful",
"confident",
"warm",
"tactile",
"80s-Japanese-tech"
],
"formality": "low",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel like a vintage Japanese cassette package or a TDK / Sony / Sakura Color product catalogue: indie hardware brand decks, music-label release schedules, analog studio retrospectives, zine and magazine pitches, kawaii-tech product launches, creative-studio annual reports. Equally good for any deck wanting bold colour, condensed display type, and a tactile printed-product personality.",
"avoid_for": "Decks that need restrained, corporate, or quiet typography — the bold condensed lockups, ribbon stripes, and primary-colour palette are intentionally loud and product-page-y.",
"preview_md": "bold-template-pack/templates/sakura-chroma/preview.md",
"design_md": "bold-template-pack/templates/sakura-chroma/design.md"
},
{
"slug": "scatterbrain",
"name": "Scatterbrain",
"tagline": "Post-it inspired: pastel sticky notes, Caveat handwriting, Shrikhand and Zilla Slab type stack.",
"mood": [
"playful",
"creative",
"warm",
"messy-on-purpose",
"workshop"
],
"tone": [
"informal",
"warm",
"expressive",
"human"
],
"formality": "low",
"density": "high",
"scheme": "light",
"best_for": "Anything that should feel like a designer's whiteboard: brainstorms, workshops, creative-agency credentials, design-thinking sessions, ideation pitches, art-direction reviews. Equally fun for any deck — including tech, research, or business — that wants to read as in-progress thinking rather than polished conclusions.",
"avoid_for": "Contexts that demand precision and institutional weight — the post-it sticky-note aesthetic intentionally reads as warm and unfinished.",
"preview_md": "bold-template-pack/templates/scatterbrain/preview.md",
"design_md": "bold-template-pack/templates/scatterbrain/design.md"
},
{
"slug": "signal",
"name": "Signal",
"tagline": "Deep navy canvas with bone paper and a single muted-gold accent; institutional with quiet weight.",
"mood": [
"institutional",
"trustworthy",
"considered",
"weighty"
],
"tone": [
"sober",
"polished",
"established",
"literary"
],
"formality": "high",
"density": "high",
"scheme": "mixed",
"best_for": "Anything that should feel weighty, considered, and credibly institutional: investor decks, board presentations, consulting deliverables, legal / policy briefs, advisory pitches. Also a strong choice for tech, research, or brand work that wants to read as quietly authoritative rather than loud.",
"avoid_for": "Contexts that should feel hot, fast, or intentionally playful — the navy + gold restraint commits to a sober voice.",
"preview_md": "bold-template-pack/templates/signal/preview.md",
"design_md": "bold-template-pack/templates/signal/design.md"
},
{
"slug": "soft-editorial",
"name": "Soft Editorial",
"tagline": "Cormorant Garamond serif on warm paper with sage, blush, and lemon accents.",
"mood": [
"literary",
"elegant",
"quiet",
"warm-classical"
],
"tone": [
"literary",
"considered",
"warm",
"magazine"
],
"formality": "high",
"density": "low",
"scheme": "light",
"best_for": "Anything that should feel literary, elegant, and unhurried: editorial features, longform brand stories, gallery / museum decks, advisory deliverables, wedding / lifestyle media, founder essays. Equally good for tech, research, or business decks that want a Sunday-supplement warmth instead of corporate polish.",
"avoid_for": "Decks that need visual heat or punch — the warm-paper palette and Cormorant serif are intentionally quiet.",
"preview_md": "bold-template-pack/templates/soft-editorial/preview.md",
"design_md": "bold-template-pack/templates/soft-editorial/design.md"
},
{
"slug": "stencil-tablet",
"name": "Stencil & Tablet",
"tagline": "Bone paper with stencil-cut headlines and a six-color earth palette: archaeology meets brand.",
"mood": [
"archival",
"earthy",
"tactile",
"considered",
"graphic"
],
"tone": [
"weighty",
"considered",
"tactile",
"literary"
],
"formality": "medium-high",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel archival, tactile, and weighty-graphic: museum and cultural-institution decks, art / architecture brands, longform research, heritage and craft brands, manifestos. A great choice anytime — including across tech and business — when you want the deck to feel like a field manual rather than a slide deck.",
"avoid_for": "Contexts that demand digital-native polish or playful pop — the stencil-cut display and earth-tone palette commit to a deliberate analog feel.",
"preview_md": "bold-template-pack/templates/stencil-tablet/preview.md",
"design_md": "bold-template-pack/templates/stencil-tablet/design.md"
},
{
"slug": "studio",
"name": "Studio",
"tagline": "Black canvas with electric-yellow type; high-voltage design studio aesthetic.",
"mood": [
"electric",
"bold",
"graphic",
"design-led",
"high-contrast"
],
"tone": [
"graphic",
"loud",
"modern",
"intentional"
],
"formality": "medium",
"density": "medium",
"scheme": "dark",
"best_for": "Anything that should feel electric and design-led: studio credentials, creative agency pitches, brand showcases, art-direction reviews, fashion / sneaker brand work. Also a striking unexpected choice for tech, research, or business decks where the speaker wants the deck to *be* a brand statement.",
"avoid_for": "Contexts that should feel quiet or institutional — the black-and-electric-yellow palette is the loudest in the library.",
"preview_md": "bold-template-pack/templates/studio/preview.md",
"design_md": "bold-template-pack/templates/studio/design.md"
},
{
"slug": "vellum",
"name": "Vellum",
"tagline": "Deep navy canvas with warm-yellow Cormorant serifs and a single dusty teal accent. A quiet, scholarly aesthetic.",
"mood": [
"scholarly",
"literary",
"considered",
"quiet",
"intellectual"
],
"tone": [
"literary",
"considered",
"patient",
"intelligent"
],
"formality": "high",
"density": "low",
"scheme": "dark",
"best_for": "Anything that should feel scholarly, literary, and quietly intelligent: research synthesis, white papers, academic and policy briefs, advisory deliverables, longform editorial pieces, founder reflections. Equally strong for any deck — including tech, business, or creator work — that wants a calm, considered atmosphere instead of energetic visuals.",
"avoid_for": "Contexts that need visual heat or pop — the navy + warm-yellow Cormorant aesthetic is intentionally low-tempo.",
"preview_md": "bold-template-pack/templates/vellum/preview.md",
"design_md": "bold-template-pack/templates/vellum/design.md"
}
]
}
8-Bit Orbit Preview Card
Use this small file for title-slide previews only. For final deck generation, read the full design doc listed below.
Files
- Full design doc:
bold-template-pack/templates/8-bit-orbit/design.md - Preview card:
bold-template-pack/templates/8-bit-orbit/preview.md
Selection Metadata
- Slug:
8-bit-orbit - Tagline: Pixel-art neon arcade aesthetic on a deep navy void.
- Mood: retro-tech, playful, cyberpunk, energetic
- Tone: geeky, neon, rebellious, sci-fi
- Formality: low
- Density: medium
- Scheme: dark
- Best for: Anything that should feel like a CRT screen at 2am: cyberpunk, gaming, web3, indie dev tools, hackathon demos. Just as good for a tech talk that wants to lean into nostalgic-digital craft, a synthwave brand deck, or a creative review that wants to feel like a console.
- Avoid for: Contexts where the dark neon palette would actively work against the message — quiet institutional finance disclosures, healthcare patient-facing materials, traditional luxury.
Visual Snapshot
A retro-futuristic pixel-art presentation system that fuses 16-bit arcade nostalgia with editorial discipline. Display type runs in Tektur (a chunky geometric display face built on pixel-grid logic) paired with Chakra Petch for body and Space Mono for code-flavored labels and tabular data. The palette pivots on a deep cosmic navy (#0F1B3D / #0A0E27) lit by three saturated neons — cyan, hot pink, and a high-key yellow — with a soft lavender pastel for warm reprieves. Depth is built from stacked hard offset shadows in 4px increments (the pixel unit), CRT scanlines, atmospheric grain, vignettes, and animated starfields. The effect sits between an arcade cabinet and a Tron-era boardroom — unmistakably digital, intentionally lo-fi, and engineered to feel as if it just booted up.
8-Bit Orbit is a retro-futuristic pixel-art presentation system. Its foundational premise is the 4-pixel unit: every shadow offset, every border, every corner bracket, every label height resolves to a multiple of 4px. Layouts feel as if they were rasterized on an old CRT and dragged into HTML — and atmospheric overlays (scanlines, grain, vignette glow, animated starfields) reinforce the illusion on every surface.
Preview Ingredients
- Palette: dark-void #0A0E27; deep-navy #0F1B3D; neon-cyan #5EDCF4; neon-pink #F0A6CA; neon-yellow #F4D03F; soft-lavender #E2D5F2; white #FFFFFF
- Typography: See full design doc after selection.
- Signature move: Three-font stack: Tektur (display), Chakra Petch (body), Space Mono (HUD/labels) — never substitute, never mix outside their roles.
- Signature move: Navy ground ({colors.dark-void} / {colors.deep-navy}) alternates with colored-grid surfaces (pink, cyan, lavender) — both carry the 40px etched grid.
- Signature move: Three neons (cyan, pink, yellow) reserved for display, stats, rules, and label fills — never for body text.
- Signature move: All measurements snap to the 4px pixel unit: borders 2-4px, shadow offsets 4px / 8px, corner brackets 24×24 with 4px stroke.
- Signature move: Stacked hard offset shadows are the system's depth language — never blurred, never colored on text shadows except in the yellow→navy cascade.
International / CJK Preview Note
- If the preview uses Chinese or other CJK text, keep CJK letter-spacing at 0, loosen line-height, and avoid uppercase transforms on CJK runs.
- Use the full
design.mdCJK section after selection for exact font pairings and script-specific adjustments.
Preview Rules
- Build exactly one title slide at 1920x1080 inside the fixed-stage model.
- Preserve the palette, type roles, surface rhythm, and decorative vocabulary described above.
- Use the user's real title/subtitle/context; do not copy demo slide content.
- The rendered preview must look like a real first slide, not a template-selection card.
- Never place internal workflow text on the slide: no
preview,generated from,preview.md,template,preset,style option,Option A/B/C, file names, paths, or source-doc labels. - Never place the template name or slug on the slide itself; mention it only in the chat message.
- Never place user requirement notes such as desired vibe, audience, or internal-use labels on the slide unless the user explicitly wants those exact words in the deck.
- Use only real deck content for visible chrome: deck title, real section title, date, author, company, page number, or genuine content phrases from the user material.
- Do not read
template.htmlfor preview generation. - Do not read other templates'
design.mdfiles. - After the user picks this template for the full deck, read the full design doc before generating final slides.
Biennale Yellow Preview Card
Use this small file for title-slide previews only. For final deck generation, read the full design doc listed below.
Files
- Full design doc:
bold-template-pack/templates/biennale-yellow/design.md - Preview card:
bold-template-pack/templates/biennale-yellow/preview.md
Selection Metadata
- Slug:
biennale-yellow - Tagline: Solar yellow on warm parchment with deep indigo serif and atmospheric sun-glow gradients.
- Mood: editorial, atmospheric, warm, cultural-institution, poster-like
- Tone: literary, considered, contemplative, warm-modern, Dutch-editorial
- Formality: high
- Density: medium
- Scheme: light
- Best for: Anything that should feel like an art-biennale poster or a museum's annual programme: exhibition decks, arts-institution announcements, design conference brochures, curatorial pitches, literary publications, studio retrospectives. Equally good for any deck wanting Dutch-editorial atmosphere with an unmistakable single-color signature.
- Avoid for: Decks that need visual punch or saturated multi-color energy — the warm-paper canvas and one-yellow palette are intentionally quiet and atmospheric.
Visual Snapshot
A literary-editorial presentation system in the visual register of an art biennale catalogue or quiet exhibition poster. The aesthetic is built on warm parchment grounds (#E9E5DB) flooded with soft solar yellow (#F1EE2E) radial blooms, set against a single deep indigo navy ink color. Display type is Instrument Serif — a contemporary high-contrast serif with tall ascenders and elegant italics — paired with Archivo for sans-serif chrome and JetBrains Mono for numerical and metadata callouts. No drop shadows, no rounded corners, no bordered cards: the only structural lines are hairline 1px rules in ink. The mood sits between a folded museum brochure, a slow-reading literary quarterly, and a Mediterranean exhibition poster — confident, atmospheric, and deeply restrained.
Biennale Yellow is a literary-editorial presentation system modeled on the visual language of European art biennale catalogues, slow exhibition posters, and quarterly literary publications. There are no cards, no buttons, no shadows, no rounded corners. The structural vocabulary is just three things: paper, ink, and yellow.
Preview Ingredients
- Palette: paper #E9E5DB; paper-deep #DCD6C4; sun #F1EE2E; sun-soft #F8F39B; haze #F0DA7C; ink #1B2566; ember #E26B4A
- Typography: See full design doc after selection.
- Signature move: Warm parchment ground ({colors.paper}) on every surface; never white, never gray.
- Signature move: Single ink color ({colors.ink}) for all text and all rules — no secondary text colors.
- Signature move: Solar yellow ({colors.sun}) deployed three ways: as a flooded panel, as a soft radial bloom, as a translucent geometric tile underprint.
- Signature move: Instrument Serif handles every display moment at scales from 40px to 720px+.
- Signature move: Archivo Bold uppercase + 0.16–0.32em tracking is the universal label voice.
International / CJK Preview Note
- If the preview uses Chinese or other CJK text, keep CJK letter-spacing at 0, loosen line-height, and avoid uppercase transforms on CJK runs.
- Use the full
design.mdCJK section after selection for exact font pairings and script-specific adjustments.
Preview Rules
- Build exactly one title slide at 1920x1080 inside the fixed-stage model.
- Preserve the palette, type roles, surface rhythm, and decorative vocabulary described above.
- Use the user's real title/subtitle/context; do not copy demo slide content.
- The rendered preview must look like a real first slide, not a template-selection card.
- Never place internal workflow text on the slide: no
preview,generated from,preview.md,template,preset,style option,Option A/B/C, file names, paths, or source-doc labels. - Never place the template name or slug on the slide itself; mention it only in the chat message.
- Never place user requirement notes such as desired vibe, audience, or internal-use labels on the slide unless the user explicitly wants those exact words in the deck.
- Use only real deck content for visible chrome: deck title, real section title, date, author, company, page number, or genuine content phrases from the user material.
- Do not read
template.htmlfor preview generation. - Do not read other templates'
design.mdfiles. - After the user picks this template for the full deck, read the full design doc before generating final slides.
BlockFrame Preview Card
Use this small file for title-slide previews only. For final deck generation, read the full design doc listed below.
Files
- Full design doc:
bold-template-pack/templates/block-frame/design.md - Preview card:
bold-template-pack/templates/block-frame/preview.md
Selection Metadata
- Slug:
block-frame - Tagline: Neobrutalist deck with pastel-neon color blocks and chunky black borders.
- Mood: bold, playful, graphic, fresh
- Tone: confident, graphic, pop, design-led
- Formality: medium-low
- Density: high
- Scheme: light
- Best for: Anything that should feel pop-graphic and design-led: indie SaaS launches, agency credentials, creative reviews, brand redesigns. Also a strong unexpected pick for tech, finance, or research when the speaker wants to land as confident and contemporary rather than buttoned-up.
- Avoid for: Contexts that require quiet institutional restraint or traditional weight (regulated disclosures, formal legal briefs).
Visual Snapshot
A maximalist neobrutalist presentation system built on 4px solid black borders, 8px hard offset shadows, and a high-key candy palette of five saturated pastels plus cream and off-white. Display type runs Inter at weight 800-900 in tight uppercase; secondary chrome uses Space Grotesk as a quasi-monospace label face. Tilted decorative shapes (rotated stars, rectangles, badges) puncture the borders and break the grid intentionally. Pastels are paired loudly: pink + blue + green + yellow + cream cycle through every region with deliberate juxtaposition. The aesthetic borrows from zine layout, 1990s-revival sticker books, and contemporary toy packaging — bold, joyful, slightly chaotic, never timid.
BlockFrame is a maximalist neobrutalist presentation system built on five structural laws: every region has a 4px black border, every elevated element has an 8px hard offset shadow, every corner is square, every accent color is a saturated pastel, and every layout is allowed to be a little bit crooked. The system's joy comes from the deliberate collision of these laws — bordered cards meet bordered cards, shadows stack against shadows, tilted decorations puncture the grid intentionally.
Preview Ingredients
- Palette: black #000000; white #FFFFFF; offwhite #FFFDF5; pink #FE90E8; blue #C0F7FE; green #99E885; yellow #F7CB46; cream #FFDC8B
- Typography: See full design doc after selection.
- Signature move: 4px solid black borders on primary cards, 3px on secondary chrome — never thinner.
- Signature move: 8px hard offset shadows on primary cards, 4px on secondary chrome — solid black, zero blur.
- Signature move: Five-pastel palette (pink, blue, green, yellow, cream) plus black, white, off-white — cycled across surfaces.
- Signature move: Inter weight 800-900 uppercase with negative tracking is the display voice; Space Grotesk weight 600 uppercase with 0.08em tracking is the label voice.
- Signature move: Square corners everywhere except a single circular accent dot on stat cards.
International / CJK Preview Note
- If the preview uses Chinese or other CJK text, keep CJK letter-spacing at 0, loosen line-height, and avoid uppercase transforms on CJK runs.
- Use the full
design.mdCJK section after selection for exact font pairings and script-specific adjustments.
Preview Rules
- Build exactly one title slide at 1920x1080 inside the fixed-stage model.
- Preserve the palette, type roles, surface rhythm, and decorative vocabulary described above.
- Use the user's real title/subtitle/context; do not copy demo slide content.
- The rendered preview must look like a real first slide, not a template-selection card.
- Never place internal workflow text on the slide: no
preview,generated from,preview.md,template,preset,style option,Option A/B/C, file names, paths, or source-doc labels. - Never place the template name or slug on the slide itself; mention it only in the chat message.
- Never place user requirement notes such as desired vibe, audience, or internal-use labels on the slide unless the user explicitly wants those exact words in the deck.
- Use only real deck content for visible chrome: deck title, real section title, date, author, company, page number, or genuine content phrases from the user material.
- Do not read
template.htmlfor preview generation. - Do not read other templates'
design.mdfiles. - After the user picks this template for the full deck, read the full design doc before generating final slides.
Blue Professional Preview Card
Use this small file for title-slide previews only. For final deck generation, read the full design doc listed below.
Files
- Full design doc:
bold-template-pack/templates/blue-professional/design.md - Preview card:
bold-template-pack/templates/blue-professional/preview.md
Selection Metadata
- Slug:
blue-professional - Tagline: Cream paper background with electric cobalt blue accents; clean modern professional.
- Mood: professional, modern, calm, trustworthy
- Tone: clean, considered, polished, neutral
- Formality: medium-high
- Density: medium
- Scheme: light
- Best for: Anything that should feel modern-considered and lightly authoritative: B2B SaaS pitches, consulting deliverables, advisory updates, investor reports. Also a clean, tasteful choice whenever you want to read as professional without going stiff — research synthesis, internal reviews, brand work for service businesses.
- Avoid for: Contexts where the deck should feel hot, playful, or intentionally informal — the cool electric-blue restraint will read as overly polished.
Visual Snapshot
A restrained, consulting-grade presentation system on a warm cream canvas (#fdfae7) with a single saturated cobalt blue (#1e2bfa) as the only accent color. Display type runs Space Grotesk for headlines and numerical callouts; Inter handles body and chrome. Cards are soft-tinted cobalt at 4% opacity with 1.5px translucent borders and 10-14px rounded corners — quiet, never bordered in solid color. The aesthetic borrows from investment-research reports, McKinsey-grade quarterly briefings, and contemporary financial dashboards — measured, data-dense without feeling crowded, and unmistakably professional. The system is built for executive readability at distance, with strong typographic hierarchy and a single accent color carrying every emphasis moment.
Blue Professional is a consulting-grade presentation system designed for executive briefings, research deliverables, and quarterly reviews. Its foundational visual premise is restraint with one strong commitment: a warm cream canvas ({colors.bg} — #fdfae7) and a single saturated cobalt ({colors.primary} — #1e2bfa) that carries every accent, every metric, every CTA, every eyebrow, every chart fill. There is no secondary brand color, no palette of pastels, no warm/cool pairing — just cream, cobalt, and a tight ladder of muted grays for body text.
Preview Ingredients
- Palette: bg #FDFAE7; primary #1E2BFA; text #111111; text-muted #6B6B6B; text-light #9A9A9A; positive #059669; negative #DC2626
- Typography: See full design doc after selection.
- Signature move: Warm cream ground ({colors.bg}) on every surface — never pure white, never gray.
- Signature move: Single saturated cobalt ({colors.primary}) as the only accent — used for every eyebrow, metric, CTA, chart fill, and progress indicator.
- Signature move: Space Grotesk (display + chrome) + Inter (body) — never substitute either.
- Signature move: Cards are 4% cobalt tints with 1.5px cobalt-at-20% borders and 10-14px rounded corners.
- Signature move: Soft pill-shaped chrome ({components.tag-pill}, {components.cta-button}) with full 100px border-radius.
International / CJK Preview Note
- If the preview uses Chinese or other CJK text, keep CJK letter-spacing at 0, loosen line-height, and avoid uppercase transforms on CJK runs.
- Use the full
design.mdCJK section after selection for exact font pairings and script-specific adjustments.
Preview Rules
- Build exactly one title slide at 1920x1080 inside the fixed-stage model.
- Preserve the palette, type roles, surface rhythm, and decorative vocabulary described above.
- Use the user's real title/subtitle/context; do not copy demo slide content.
- The rendered preview must look like a real first slide, not a template-selection card.
- Never place internal workflow text on the slide: no
preview,generated from,preview.md,template,preset,style option,Option A/B/C, file names, paths, or source-doc labels. - Never place the template name or slug on the slide itself; mention it only in the chat message.
- Never place user requirement notes such as desired vibe, audience, or internal-use labels on the slide unless the user explicitly wants those exact words in the deck.
- Use only real deck content for visible chrome: deck title, real section title, date, author, company, page number, or genuine content phrases from the user material.
- Do not read
template.htmlfor preview generation. - Do not read other templates'
design.mdfiles. - After the user picks this template for the full deck, read the full design doc before generating final slides.
Bold Poster Preview Card
Use this small file for title-slide previews only. For final deck generation, read the full design doc listed below.
Files
- Full design doc:
bold-template-pack/templates/bold-poster/design.md - Preview card:
bold-template-pack/templates/bold-poster/preview.md
Selection Metadata
- Slug:
bold-poster - Tagline: Editorial poster aesthetic with massive Shrikhand display and a single fire-engine red accent.
- Mood: bold, editorial, loud, confident
- Tone: dramatic, graphic, sharp, intentional
- Formality: medium
- Density: low
- Scheme: light
- Best for: Anything that should land like a magazine cover: brand manifestos, founder vision decks, editorial / cultural pitches, creative reviews. Excellent any time you want a few words to feel like a poster — including unexpected fits like a tech keynote or a finance manifesto that wants to be quotable.
- Avoid for: Decks that need to communicate dense information per slide — the layout is built around a few large statements, not paragraphs of detail.
Visual Snapshot
A populist editorial poster system that mashes vintage Italian sports-magazine display lettering with classical serif body and tight monospace metadata. The display face is Shrikhand — a heavy slab/script hybrid with playful italic personality — rendered at poster scale (often 200-320px) and routinely tilted off-axis. Body runs Libre Baskerville for a literary editorial register; Space Grotesk handles tiny uppercase labels and chrome. The palette is uncompromising: white canvas, deep brown-black ink (#1C1410), single saturated tomato red (#D8000F), and a warm off-white (#F5F2EF) for alternating panels. Borders are bold 1.5-3px ink rules; the only shadow is a single stacked offset behind red display text. The aesthetic is loud, confident, and unmistakably print-poster — closer to a 1970s European brand annual report or a wine merchant's catalogue than a contemporary slide deck.
Bold Poster is a populist editorial poster system that lifts its visual vocabulary from vintage Italian sports magazines, mid-century European brand annual reports, and wine-merchant catalogues. The premise is that every slide should feel printed — set in heavy display type, locked to one strong red accent, on a white or off-white sheet, with grids ruled in ink and decoration kept to a strict minimum.
Preview Ingredients
- Palette: bg #FFFFFF; dark #1C1410; red #D8000F; light #F5F2EF
- Typography: See full design doc after selection.
- Signature move: White ({colors.bg}) canvas alternating with off-white ({colors.light}) panels for striping, plus dark ({colors.dark}) and red ({colors.red}) full-bleed panel surfaces for statement moments.
- Signature move: Single tomato red ({colors.red}) as the only accent — used for every numerical figure, every section rule, every label, every left-bar marker.
- Signature move: Three-face stack: Shrikhand (display + numerical), Libre Baskerville (body), Space Grotesk (mono labels + bullets + chrome).
- Signature move: Display Shrikhand is routinely tilted (-6° to +2°) — the rotation is the system's signature movement.
- Signature move: Heavy ink borders: 3px on tabular grid containers, 1.5-2px on cells, 4px red on editorial leftbar cards, 1px hairlines between bullet rows.
International / CJK Preview Note
- If the preview uses Chinese or other CJK text, keep CJK letter-spacing at 0, loosen line-height, and avoid uppercase transforms on CJK runs.
- Use the full
design.mdCJK section after selection for exact font pairings and script-specific adjustments.
Preview Rules
- Build exactly one title slide at 1920x1080 inside the fixed-stage model.
- Preserve the palette, type roles, surface rhythm, and decorative vocabulary described above.
- Use the user's real title/subtitle/context; do not copy demo slide content.
- The rendered preview must look like a real first slide, not a template-selection card.
- Never place internal workflow text on the slide: no
preview,generated from,preview.md,template,preset,style option,Option A/B/C, file names, paths, or source-doc labels. - Never place the template name or slug on the slide itself; mention it only in the chat message.
- Never place user requirement notes such as desired vibe, audience, or internal-use labels on the slide unless the user explicitly wants those exact words in the deck.
- Use only real deck content for visible chrome: deck title, real section title, date, author, company, page number, or genuine content phrases from the user material.
- Do not read
template.htmlfor preview generation. - Do not read other templates'
design.mdfiles. - After the user picks this template for the full deck, read the full design doc before generating final slides.
Broadside Preview Card
Use this small file for title-slide previews only. For final deck generation, read the full design doc listed below.
Files
- Full design doc:
bold-template-pack/templates/broadside/design.md - Preview card:
bold-template-pack/templates/broadside/preview.md
Selection Metadata
- Slug:
broadside - Tagline: Dark editorial canvas with a single fire orange accent and bilingual Latin/Chinese type stack.
- Mood: editorial, dramatic, loud, newspaper
- Tone: graphic, punchy, literary, considered
- Formality: medium-high
- Density: medium
- Scheme: dark
- Best for: Anything that should land like a broadside newspaper headline: brand manifestos, magazine and cultural pitches, design talks, bilingual EN/CN decks, founder vision statements. Also a striking pick for tech, research, or business decks that want a dramatic single-accent editorial feel.
- Avoid for: Decks that need to feel quiet, warm, or institutionally traditional — the dark canvas with fire-orange accent commits to drama.
Visual Snapshot
A protest-poster editorial system built on massive Barlow type and a single fire-orange environment color. The aesthetic is "ink on fire" — dark slides for documentation, orange slides for declaration. Display type is enormous (13vw, roughly 187px at 1440 width) in weight 900 lowercase, treating words as graphic elements rather than reading copy. The cultural reference is broadside printing, SPACE10 reports, and Wim Crouwel grids reinterpreted with one loud color and zero decoration.
Broadside is a protest-poster editorial system. The defining premise: type is so large it stops behaving as text and starts behaving as graphic primitive. Display sizes at 13vw ({typography.display}) put a single word at roughly 187px on a 1440-wide screen — wide enough that the eye scans letterforms before reading. This is the system's primary expressive instrument.
Preview Ingredients
- Palette: ink-black #111111; ink-black-alt #1A1A18; fire-orange #E85D26; cream #F0ECE5; cream-muted #888880; cream-hint #505048; border-dark #282826
- Typography: Barlow; IBM Plex Mono; {typography.label.fontFamily}
- Signature move: Massive Barlow display type at weight 900 in lowercase — never uppercase on display elements.
- Signature move: Two-register color system: dark slides with cream text, or orange slides with dark ink. No cream/white slides exist.
- Signature move: {colors.fire-orange} is both accent (on dark) and environment (on orange) — never a secondary color, always the color.
- Signature move: Single-typeface system on Barlow + IBM Plex Mono for chrome only. No serif, no script, no third face.
- Signature move: 1px hairline dividers ({colors.border-dark} on dark; rgba(17,17,17,0.2) on orange) provide all hierarchy structure.
International / CJK Preview Note
- If the preview uses Chinese or other CJK text, keep CJK letter-spacing at 0, loosen line-height, and avoid uppercase transforms on CJK runs.
- Use the full
design.mdCJK section after selection for exact font pairings and script-specific adjustments.
Preview Rules
- Build exactly one title slide at 1920x1080 inside the fixed-stage model.
- Preserve the palette, type roles, surface rhythm, and decorative vocabulary described above.
- Use the user's real title/subtitle/context; do not copy demo slide content.
- The rendered preview must look like a real first slide, not a template-selection card.
- Never place internal workflow text on the slide: no
preview,generated from,preview.md,template,preset,style option,Option A/B/C, file names, paths, or source-doc labels. - Never place the template name or slug on the slide itself; mention it only in the chat message.
- Never place user requirement notes such as desired vibe, audience, or internal-use labels on the slide unless the user explicitly wants those exact words in the deck.
- Use only real deck content for visible chrome: deck title, real section title, date, author, company, page number, or genuine content phrases from the user material.
- Do not read
template.htmlfor preview generation. - Do not read other templates'
design.mdfiles. - After the user picks this template for the full deck, read the full design doc before generating final slides.
Capsule Preview Card
Use this small file for title-slide previews only. For final deck generation, read the full design doc listed below.
Files
- Full design doc:
bold-template-pack/templates/capsule/design.md - Preview card:
bold-template-pack/templates/capsule/preview.md
Selection Metadata
- Slug:
capsule - Tagline: Modular pill-shaped cards on warm bone with a full pastel-pop palette.
- Mood: playful, modern, warm, fresh, fun
- Tone: upbeat, graphic, approachable, cool
- Formality: medium-low
- Density: medium
- Scheme: light
- Best for: Anything that should feel modular, modern, and a little Y2K: lifestyle brands, creator portfolios, DTC launches, beauty / wellness, agency credentials. Also fun for a playful tech demo or a research deck that wants pop-art clarity instead of gravitas.
- Avoid for: Contexts that require traditional institutional weight — the capsule shapes and pastel pops actively soften authority.
Visual Snapshot
A playful editorial system built on pill-shaped containers, a sun-bleached cream canvas, and a nine-color candy palette. Bodoni Moda serif headlines pair with Space Grotesk body to suggest a literary magazine that took a holiday at a 1970s ice-cream parlor. Every container that holds text is a pill (border-radius 9999px) outlined with a 2px ink stroke, casting a soft 6–12px offset shadow. The aesthetic is "Memphis-meets-editorial" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper.
Capsule is a playful editorial system whose defining structural premise is the pill: every text container is a pill, every icon is a pill, every bar is a pill, every node in a diagram is a pill. The border-radius: 9999px rule applies to virtually all UI elements, with larger panels softening to a 2rem radius. Combined with the 2px ink outline that wraps every shape, the result is a system where containers feel inflated, friendly, and graphically distinct — a nod to Memphis design and late-70s ice-cream-parlor signage without abandoning editorial discipline.
Preview Ingredients
- Palette: cream #F5F5F0; ink #1A1A1A; outline #1E1E1E; white #FFFFFF; coral #E85D4E; lime #C4D94E; lavender #C5B5E0; sky #8BB4F7
- Typography: Bodoni Moda; Space Grotesk
- Signature move: Universal pill geometry — border-radius: 9999px for small containers, 2rem for larger cards/frames.
- Signature move: 2px solid {colors.outline} stroke wraps every pill, icon, and card.
- Signature move: Bodoni Moda serif for every display/headline/stat; Space Grotesk sans for every body/label/pill text.
- Signature move: Sun-bleached cream canvas {colors.cream} with soft radial glows in candy accent colors at 6–15% opacity for background atmosphere.
- Signature move: Hard-offset shadows in low-opacity ink ({colors.shadow}) at 4/6/8/12px offsets, always solid, always bottom-right.
International / CJK Preview Note
- If the preview uses Chinese or other CJK text, keep CJK letter-spacing at 0, loosen line-height, and avoid uppercase transforms on CJK runs.
- Use the full
design.mdCJK section after selection for exact font pairings and script-specific adjustments.
Preview Rules
- Build exactly one title slide at 1920x1080 inside the fixed-stage model.
- Preserve the palette, type roles, surface rhythm, and decorative vocabulary described above.
- Use the user's real title/subtitle/context; do not copy demo slide content.
- The rendered preview must look like a real first slide, not a template-selection card.
- Never place internal workflow text on the slide: no
preview,generated from,preview.md,template,preset,style option,Option A/B/C, file names, paths, or source-doc labels. - Never place the template name or slug on the slide itself; mention it only in the chat message.
- Never place user requirement notes such as desired vibe, audience, or internal-use labels on the slide unless the user explicitly wants those exact words in the deck.
- Use only real deck content for visible chrome: deck title, real section title, date, author, company, page number, or genuine content phrases from the user material.
- Do not read
template.htmlfor preview generation. - Do not read other templates'
design.mdfiles. - After the user picks this template for the full deck, read the full design doc before generating final slides.
Related skills
How it compares
Choose frontend-slides for standalone animated HTML decks; use traditional slide apps when live collaboration and native speaker tooling matter more.
FAQ
Can frontend-slides convert an existing PowerPoint file?
frontend-slides supports creating HTML presentations from scratch and converting existing PowerPoint files into animation-rich, zero-dependency HTML slide decks playable in the browser.
How many visual themes does frontend-slides include?
frontend-slides bundles 12 curated visual themes for HTML presentations and applies an anti-AI-slop design philosophy so generated decks avoid generic template styling.
Is Frontend Slides safe to install?
skills.sh reports 1 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.