Help us improve
Share bugs, ideas, or general feedback.
From slides-ai-plugin
Generates single-file HTML presentations with viewport fitting, CSS/GSAP animations, and curated style presets. Useful for creating animated slides, web presentations, or converting PPTX to HTML.
npx claudepluginhub proyecto26/slides-ai-plugin --plugin slides-ai-pluginHow this skill is triggered — by the user, by Claude, or both
Slash command
/slides-ai-plugin:html-slidesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generate single-file, self-contained HTML presentations with professional animations, responsive viewport fitting, and curated style presets. Zero external dependencies at runtime — all CSS/JS inline.
Generates zero-dependency, animation-rich HTML presentations from scratch or by converting PPT/PPTX files. Ensures exact viewport fit for browser-based slide decks with distinctive designs.
Creates zero-dependency, animation-rich HTML presentations from scratch or by converting PPT/PPTX files into self-contained slides for talks, pitches, or tutorials.
Generates zero-dependency HTML slide presentations with inline CSS/JS and animations. Use for new decks from scratch, PPT/PPTX conversions, or enhancing existing HTML presentations.
Share bugs, ideas, or general feedback.
Generate single-file, self-contained HTML presentations with professional animations, responsive viewport fitting, and curated style presets. Zero external dependencies at runtime — all CSS/JS inline.
Every HTML presentation follows this structure:
.html file with inline CSS and JS (no build tools)100vh/100dvh with overflow: hidden:root variables for easy restyling<section> per slide, <nav> for controlsApply the viewport base CSS from assets/viewport-base.css to EVERY presentation. Key rules:
height: 100vh; height: 100dvh; overflow: hiddenclamp(min, preferred, max) for responsive scalingmin(50vh, 400px) max heightprefers-reduced-motion support includedgrid-template-columns: repeat(auto-fit, minmax(min(100%, 250px), 1fr))Never allow scrolling within a slide. If content exceeds capacity, split across multiple slides.
Edge Case: Negative Clamp Values
Use calc(-1 * clamp(...)) when you need negative viewport-edge spacing (e.g., negative margins, negative padding). This pattern preserves the clamp function's responsiveness while inverting the value.
iOS Safari 100vh Bug
The 100vh unit in iOS Safari includes the address bar, causing content to overflow. Always pair 100vh with 100dvh (dynamic viewport height) in fallback chains. Modern viewports ignore 100vh if 100dvh is present.
Use CSS animations as the baseline. Apply .reveal class with staggered transition-delay:
.reveal {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.6s var(--ease-out-expo), transform 0.6s var(--ease-out-expo);
}
.reveal.visible {
opacity: 1;
transform: translateY(0);
}
Trigger with Intersection Observer adding .visible class on viewport entry.
Easing: --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1) for all entrance animations.
For sophisticated animations, load GSAP from CDN and use timeline-based choreography. Consult references/animation-patterns.md for detailed GSAP recipes and the GSAP docs for API reference. Key integration points:
https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.jsgsap.timeline() for sequenced slide entrance animationsgsap.matchMedia() for responsive animation behaviorprefers-reduced-motion — disable animations when activeTimeline Entrance with Position Parameter Stagger reveals without explicit delays using the position parameter in timeline. Example:
const tl = gsap.timeline();
tl.to('.heading', { opacity: 1, duration: 0.6 })
.to('.subtitle', { opacity: 1, duration: 0.4 }, '<0.2') // Starts 0.2s before heading ends
.to('.bullet', { opacity: 1, stagger: 0.1 }, '<0.15');
SplitText for Headlines and Word/Char Reveals Animate individual words or characters in headlines:
gsap.registerPlugin(SplitText);
const split = new SplitText('.headline', { type: 'words,chars' });
gsap.from(split.chars, {
opacity: 0,
duration: 0.4,
stagger: 0.05,
ease: 'back.out'
});
ScrollTrigger for Slide-by-Slide Navigation Tie slide transitions to scroll position for interactive presentations:
gsap.registerPlugin(ScrollTrigger);
gsap.to('.slide', {
scrollTrigger: {
trigger: '.slide-container',
pin: true,
scrub: 1,
snap: 1 / slideCount
}
});
Spring Physics Timing from Remotion Translate Remotion spring physics into GSAP elastic easing for natural motion:
elastic.out(1, 0.1) — subtle bounce, feels polishedelastic.out(1, 0.35) — noticeable spring, modern feelelastic.out(1, 0.5) — playful bounce, energetic| Animation | CSS Class | Use Case |
|---|---|---|
| Fade + slide up | .reveal | Default entrance for text/cards |
| Scale in | .reveal-scale | Images, feature cards |
| Slide from left | .reveal-left | Two-column content |
| Blur in | .reveal-blur | Background elements, overlays |
| Stagger | :nth-child(n) delay | Lists, grid items |
Include keyboard navigation (arrows, space, Page Up/Down), touch/swipe support, and optional progress indicator. Template in references/html-template.md.
Read style preset definitions from the parent slide-design skill's references/style-presets.md. Each preset maps to CSS custom properties:
:root {
--bg-primary: #0a0a0a;
--bg-secondary: #1a1a1a;
--text-primary: #ffffff;
--text-secondary: #a0a0a0;
--accent: #4a9eff;
--accent-secondary: #ff6b6b;
--font-heading: 'Clash Display', sans-serif;
--font-body: 'IBM Plex Sans', sans-serif;
--title-size: clamp(2rem, 6vw, 5rem);
--body-size: clamp(0.9rem, 2vw, 1.25rem);
--ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
}
Load fonts from Google Fonts or Fontshare — never rely on system fonts for headings.
For each slide type, follow the HTML patterns in references/html-template.md. Key templates:
For technical presentations, embed Mermaid diagrams:
https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.9.0/mermaid.min.js<pre class="mermaid"> blocks for diagramsInclude an optional print stylesheet for PDF export via browser print:
@media print {
.slide { page-break-after: always; height: 100vh; }
.nav, .progress { display: none; }
.reveal { opacity: 1; transform: none; }
}
Avoid these common mistakes:
overflow: hidden)prefers-reduced-motion supportEmbody the principle of visual communication. Enhance instructions with visual weight and intentionality:
z-index layering, scale transformation, AND contrasting color simultaneously. Isolation requires all three.Many professional presentations alternate background colors across slide groups. To implement this:
data-theme attribute per <section> (e.g., data-theme="coral", data-theme="dark", data-theme="cream")[data-theme="coral"] { --bg-primary: #E8845C; --text-primary: #fff; }Generated HTML can include contenteditable="true" attributes on text elements, allowing users to edit slides directly in the browser before presenting.
To enable inline editing, add contenteditable="true" to text elements:
<h1 contenteditable="true">Edit this headline</h1>
<p contenteditable="true">Edit this paragraph</p>
Include this CSS for visual feedback:
[contenteditable]:hover {
outline: 2px dashed var(--accent);
cursor: text;
}
[contenteditable]:focus {
outline: 2px solid var(--accent);
}
Users can click any editable element, make changes live, and present without exporting. Disable with contenteditable="false" if read-only mode is preferred.
references/html-template.md — Complete HTML boilerplate with navigation, all slide type templatesreferences/animation-patterns.md — CSS and GSAP animation recipes with timing and easingassets/viewport-base.css — Mandatory viewport CSS (include in every presentation)scripts/extract-pptx.py — Extract text, images, and notes from PPTX files to JSON for HTML conversion