--- name: presentation-building description: 'Build single-file HTML presentations with a dark theme, scroll-driven slides, responsive card grids, and reveal animations. Optional addons extend the base with features like a vertical timeline navigation. Use when the user asks to: create a presentation, build a slide deck, add or edit slides, fix slide layout or overflow issues, add timeline events, create card grids, add reveal animations, embed images or tweets, fix fullscreen rendering, or any task involving HTML presentation creation and refinement.' metadata: version: '1.0' scope: generic invocation: user --- # Presentation Builder Create polished, single-file HTML slide presentations optimised for widescreen and fullscreen delivery. ## When to Use Use this skill when asked to: - create a new presentation from scratch - add, edit, reorder, or remove slides - fix layout, overflow, or fullscreen rendering issues - add or modify optional addons (e.g. the vertical timeline navigation) - create card grids, comparison layouts, or diagrams - embed images, tweets, or interactive elements - refine typography, spacing, or visual consistency across slides ## Architecture Overview Each presentation is a **single `index.html` file** containing all markup, CSS, and JavaScript inline. No build step is required. Assets (images) live in an `attachments/` directory alongside the HTML file. ```text presentation/ index.html # The entire presentation attachments/ # Images referenced by slides 3.png ... ``` Self-contained addon reference files live under `references/addons/`. Each addon bundles the CSS, HTML, and JS required to extend the base skeleton. ### Key Technical Decisions - **Single file** — everything in one HTML file for portability - **No frameworks** — vanilla HTML, CSS, and JS only - **Dark theme** — dark background with light text, always - **Vertical scroll** — slides are full-viewport `
` elements stacked vertically - **Addon-based extensions** — optional features (e.g. timeline navigation) are self-contained addon files that merge into the base skeleton - **Responsive by default** — `clamp()` throughout; slides work on most screens, optimised for widescreen (16:9 to ultrawide) - **Fullscreen support** — press `F` to toggle; dense slides use `fit-wide` auto-scaling ## Design System ### Colour Palette ```css :root { --bg: #0a0a12; --surface: #12121e; --surface-alt: #181828; --border: #1e1e30; --text: #e8e8f0; --text-muted: #8888a0; --accent: #4ecdc4; /* Teal — primary accent */ --accent-dim: rgba(78, 205, 196, 0.15); --red: #ff6b6b; --yellow: #ffd93d; --purple: #a78bfa; --blue: #60a5fa; --font-sans: "Inter", system-ui, sans-serif; --font-mono: "JetBrains Mono", monospace; } ``` Use named CSS variables everywhere. Never use raw hex colours in slide markup. ### Typography - **Font**: Inter (sans-serif) for all text, JetBrains Mono for code and monospace elements - **Headings**: Use `clamp()` for all font sizes — specify `(min, preferred, max)` - **h1**: Title slides only. `clamp(2.4rem, 4.5vw, 5rem)`, weight 700 - **h2**: Slide titles. `clamp(1.5rem, 2.8vw, 3.2rem)`, weight 600 - **h3**: Eyebrow/section labels above `h2`. Uppercase, letter-spacing `.08em`, accent colour - **Body text**: `clamp(.88rem, 1.3vw, 1.4rem)` for bullet lists - **Strong text inside bullets**: Use `color: var(--accent)` for emphasis ### Spacing - Use `clamp()` for all padding, margins, and gaps - Pattern: `clamp(min, preferred-vw-or-vh, max)` - Never use fixed pixel values for layout spacing ### Customisation The design system above defines **defaults**, not constraints. When the user requests a different visual style or new components, adapt accordingly: **Colour changes**: If the user wants a different accent colour, light theme, or custom palette — update the `:root` CSS variables. All components use variables, so a single change propagates everywhere. Keep the variable naming convention (`--accent`, `--surface`, etc.) and update the values. **Typography changes**: If the user wants a different font, weight scheme, or sizing — update the `--font-sans` / `--font-mono` variables, adjust the `clamp()` values, and update the Google Fonts ``. The `clamp(min, preferred, max)` pattern should always be used regardless of the specific font. **New components**: When the user asks for a component that doesn't exist in the catalog (e.g. a comparison table, a code block, a quote callout, a stat counter) — create it inline following these rules: 1. Use CSS variables for colours — never hardcode hex values 2. Use `clamp()` for all sizing and spacing 3. Use the existing border-radius (`8px`–`12px`), background (`var(--surface)`), and border (`var(--border)`) patterns for visual consistency 4. Apply `.reveal` or `.reveal-stagger` for scroll animation 5. Add the component's CSS in the slide-specific CSS section or, if reused across slides, in the main `