From slides-ai-plugin
Generates editable PowerPoint presentations via PptxGenJS with precise layout, text measurement, and overlap validation. Includes theme presets and component builders.
How this skill is triggered — by the user, by Claude, or both
Slash command
/slides-ai-plugin:pptx-slidesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generate professional, editable PowerPoint presentations using PptxGenJS (Node.js). Produces OOXML-compliant `.pptx` files with precise layout, text measurement, and overlap validation.
Generate professional, editable PowerPoint presentations using PptxGenJS (Node.js). Produces OOXML-compliant .pptx files with precise layout, text measurement, and overlap validation.
Every PPTX generation script imports the bundled TypeScript helper modules via bun:
import pptxgen from 'pptxgenjs';
import * as h from '${CLAUDE_PLUGIN_ROOT}/skills/pptx-slides/scripts/main.ts';
const pptx = new pptxgen();
pptx.layout = 'LAYOUT_16x9'; // 10" × 5.625"
Run generation scripts with bun (no build step needed):
npx -y bun ${CLAUDE_PLUGIN_ROOT}/skills/pptx-slides/scripts/main.ts theme list
Dependencies (skia-canvas, fontkit, linebreak, prismjs) are auto-installed by bun on first run — no manual install step needed.
| Module | Key Exports | Purpose |
|---|---|---|
| text | autoFontSize(), calcTextBoxHeightSimple(), scale() | Font-aware text measurement via skia-canvas, adaptive sizing |
| theme | createTheme(), PRESETS, sectionBackground() | Design token system with 12 curated presets |
| layout | warnIfSlideHasOverlaps(), alignSlideElements(), distributeSlideElements() | Overlap detection, bounds checking, positioning |
| layout_builders | addFeatureGrid(), addCardRow(), addTimeline(), addMetricsRow(), addComparisonTable() | High-level component builders |
| decorative | addStaircase(), addSectionBadge(), addProgressBar(), addSlideNumber() | Visual personality elements |
| validation | validateDeck() | Consolidated pre-save quality validation |
| code | codeToRuns() | Prism.js syntax highlighting to PptxGenJS text runs |
| image | getImageDimensions(), imageSizingCrop(), imageSizingContain() | Binary dimension detection and aspect-ratio sizing |
| svg | svgToDataUri() | SVG sanitization and base64 data URI encoding |
| util | safeOuterShadow(), normalizeColor(), inchesToEmu() | Shadow effects, color/unit conversion |
Pick a curated preset or create a custom theme:
// Use a preset
const theme = h.createTheme(h.PRESETS.darkMonospace);
// Or customize
const theme = h.createTheme({
accent: 'ff6b35',
font: { heading: 'Poppins', body: 'Inter' },
});
Available presets: darkMonospace, swissModern, boldSignal, darkBotanical, cleanCorporate, neonCyber, warmMinimal, vintageEditorial, terminalGreen, gradientWave, midnightBlue, paperInk.
For mixed-background decks, define a section map:
const sectionMap = { '0': 'brand', '1-3': 'light', '4-8': 'default' };
const colors = { brand: theme.accent, light: theme.bg.secondary, default: theme.bg.primary };
slide.background = { color: h.sectionBackground(slideIndex, sectionMap, colors) };
Use scale() instead of hardcoded font sizes — the PPTX equivalent of CSS clamp():
const titleSize = h.scale(theme.size.title.min, theme.size.title.max, { bullets: 0, textLength: title.length });
const bodySize = h.scale(theme.size.body.min, theme.size.body.max, { bullets: 5, textLength: 800 });
For precise text box fitting, use autoFontSize() with skia-canvas measurement:
const opts = h.autoFontSize('Long paragraph text...', 'Arial', { w: 8, h: 3, minFontSize: 14, maxFontSize: 28 });
slide.addText(text, { x: 1, y: 1.5, ...opts });
references/slide-patterns.mdaddFeatureGrid(), addCardRow(), etc.h.validateDeck(pptx) before saving.pptx file with speaker notes on every content slidescale() for adaptive sizing.h.resolveFont(theme, 'heading') for proper fallback chainstheme.spacing.margin)h.alignSlideElements() and h.distributeSlideElements() for precisiontheme.text.primary, theme.accent — never hardcode colorsRun h.validateDeck(pptx) before saving every deck. It checks:
scale() or autoFontSize()validateDeck() before savingfit or autoFit instead of h.autoFontSize()Design for editability — recipients must be able to modify the deck:
slide.addNotes('...') on every content slide.Build architecture diagrams using PptxGenJS native shapes rather than images:
slide.addShape('rect', { ... })slide.addShape('line', { ... })theme.accent for active components, theme.text.secondary for inactivereferences/pptxgenjs-helpers.md — Full API reference for bundled helper modulesreferences/slide-patterns.md — Detailed slide type patterns with dimensions and positioningscripts/main.ts — TypeScript CLI entry point and library re-exports (run via npx -y bun)scripts/types.ts — Shared TypeScript interfaces for all helper modulesscripts/theme.ts — 12 curated theme presets with createTheme() and resolveFont()scripts/text.ts — Font-aware text measurement via skia-canvas, autoFontSize(), scale()scripts/layout.ts — Overlap detection, element alignment, bounds checkingscripts/layout_builders.ts — addFeatureGrid(), addCardRow(), addTimeline(), etc.scripts/decorative.ts — addStaircase(), addSectionBadge(), addProgressBar()scripts/validation.ts — validateDeck() pre-save quality validationscripts/code.ts — Prism.js syntax highlighting to PptxGenJS text runsscripts/image.ts — Binary dimension detection and aspect-ratio sizingscripts/svg.ts — SVG sanitization and base64 data URI encodingscripts/util.ts — Shadow effects, color normalization, unit conversionnpx claudepluginhub proyecto26/slides-ai-plugin --plugin slides-ai-pluginReads, extracts text from, edits, and generates .pptx presentations using Python scripts and pptxgenjs. Handles templates, thumbnails, XML unpacking.
Generate, edit, and read PowerPoint presentations: create with PptxGenJS (cover/TOC/content/summary slides), edit via XML, extract text with markitdown.
Creates, edits, reads, and extracts content from .pptx presentation files using MarkItDown, python-pptx, and PptxGenJS. Includes design guidance for non-boring slides with curated color palettes and visual motifs.