---
name: create-presentation
description: Wenn der user eine Präsentation erstellen will
---

---
name: html-presentation
description: "Build stunning HTML presentations as shareable artifacts. Use this skill when a user wants to create a presentation, pitch deck, slide deck, or any visual slide-based content. Outputs a single self-contained HTML file with embedded CSS and JS that works as a standalone presentation. Supports slide navigation, animations, custom branding, embedded SVG graphics, charts, and responsive design."
---

# HTML Presentation Skill

Build beautiful, self-contained HTML presentations that can be shared as artifacts, opened in any browser, or embedded anywhere. No PowerPoint, no Canva, no external dependencies.

## When To Use This Skill

- User wants to create a presentation, deck, or slides
- User wants a shareable, browser-based presentation
- User asks for an artifact-style presentation
- User wants a pitch deck, keynote, workshop slides, or any slide-based content

## The Process: Think First, Build Second

Every great presentation follows this flow:

### Phase 1: Gather Context (ASK THE USER)

Before writing a single line of code, collect the following from the user. Ask conversationally – don't dump all questions at once. Prioritize what's missing.

**Required:**
1. **Topic/Purpose** – What is this presentation about? What's the goal?
2. **Audience** – Who will see this? (Clients, team, investors, community, public?)
3. **Key Messages** – What are the 3-5 things the audience MUST take away?
4. **Slide Count** – How many slides? (Default: 8-12 for a solid deck)

**Branding (ask if not provided):**
5. **Company/Brand Name** – Who is presenting?
6. **Primary Color** – Main brand color (hex code or description like "dark navy")
7. **Secondary Color** – Accent color
8. **Font Preference** – Any specific fonts? (Will use Google Fonts)
9. **Logo** – SVG code, URL, or description (can create a text-based logo if none provided)
10. **Tone/Vibe** – Professional, casual, bold, minimal, techy, playful?

**Optional Extras:**
11. **Specific data/stats** to include
12. **Specific slides** they already have in mind
13. **Reference presentations** they like the style of

If the user just says "build me a presentation about X" without details, ask for at minimum: audience, key messages, and brand colors before proceeding.

### Phase 2: Outline & Structure

Before building, present a slide-by-slide outline to the user:

```
Slide 1: Title Slide – [Headline] + [Subtitle]
Slide 2: Problem/Context – [What we're addressing]
Slide 3: Key Point 1 – [...]
Slide 4: Key Point 2 – [...]
...
Slide N: CTA / Closing – [What's the next step?]
```

Get user approval or iterate on the structure BEFORE coding. This saves massive time.

### Phase 3: Build The Presentation

Generate a single, self-contained HTML file with everything embedded.

### Phase 4: Review & Iterate

Show the user the result. Ask: "What do you want to change?" Iterate until it's right.

---

## Technical Specification

### Output Format

One single `.html` file containing:
- All CSS inline in a `<style>` block
- All JavaScript inline in a `<script>` block
- No external dependencies except Google Fonts (loaded via `<link>`)
- SVG graphics embedded directly in the HTML
- Fully responsive

### Presentation Framework

Use this minimal slide framework (no external libraries needed):

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>[PRESENTATION TITLE]</title>
  <!-- Google Fonts -->
  <style>
    /* === CSS VARIABLES FOR BRANDING === */
    :root {
      --primary: #[PRIMARY_COLOR];
      --secondary: #[SECONDARY_COLOR];
      --accent: #[ACCENT_COLOR];
      --bg-dark: #[DARK_BG];
      --bg-light: #[LIGHT_BG];
      --text-primary: #[TEXT_COLOR];
      --text-light: #[TEXT_LIGHT];
      --font-heading: '[HEADING_FONT]', sans-serif;
      --font-body: '[BODY_FONT]', sans-serif;
    }

    /* === RESET & BASE === */
    * { margin: 0; padding: 0; box-sizing: border-box; }

    body {
      font-family: var(--font-body);
      background: #000;
      overflow: hidden;
      color: var(--text-primary);
    }

    /* === SLIDE CONTAINER === */
    .deck {
      width: 100vw;
      height: 100vh;
      position: relative;
    }

    .slide {
      position: absolute;
      top: 0; left: 0;
      width: 100%;
      height: 100%;
      display: flex;
      flex-direction: column;
      justify-content: center;
      padding: 60px 80px;
      opacity: 0;
      visibility: hidden;
      transition: opacity 0.5s ease, transform 0.5s ease;
      transform: translateX(30px);
    }

    .slide.active {
      opacity: 1;
      visibility: visible;
      transform: translateX(0);
    }

    /* === NAVIGATION === */
    .nav {
      position: fixed;
      bottom: 30px;
      right: 40px;
      display: flex;
      gap: 12px;
      z-index: 100;
    }

    .nav button {
      width: 44px;
      height: 44px;
      border-radius: 50%;
      border: 2px solid var(--primary);
      background: transparent;
      color: var(--primary);
      font-size: 18px;
      cursor: pointer;
      transition: all 0.2s;
      display: flex;
      align-items: center;
      justify-content: center;
    }

    .nav button:hover {
      background: var(--primary);
      color: white;
    }

    /* === PROGRESS BAR === */
    .progress {
      position: fixed;
      bottom: 0;
      left: 0;
      height: 3px;
      background: var(--primary);
      transition: width 0.3s ease;
      z-index: 100;
    }

    /* === SLIDE COUNTER === */
    .counter {
      position: fixed;
      bottom: 36px;
      left: 40px;
      font-family: var(--font-body);
      font-size: 14px;
      color: rgba(255,255,255,0.4);
      z-index: 100;
    }

    /* === TYPOGRAPHY === */
    h1 {
      font-family: var(--font-heading);
      font-size: clamp(2.5rem, 5vw, 4.5rem);
      font-weight: 900;
      line-height: 1.1;
      margin-bottom: 24px;
    }

    h2 {
      font-family: var(--font-heading);
      font-size: clamp(1.8rem, 3.5vw, 3rem);
      font-weight: 700;
      line-height: 1.2;
      margin-bottom: 20px;
    }

    h3 {
      font-family: var(--font-heading);
      font-size: clamp(1.2rem, 2vw, 1.6rem);
      font-weight: 600;
      margin-bottom: 16px;
    }

    p, li {
      font-size: clamp(1rem, 1.5vw, 1.25rem);
      line-height: 1.6;
      font-weight: 300;
    }

    /* === COMMON SLIDE LAYOUTS === */

    /* Title Slide */
    .slide-title {
      text-align: center;
      justify-content: center;
      align-items: center;
    }

    /* Split Layout: Content Left, Visual Right */
    .slide-split {
      flex-direction: row;
      align-items: center;
      gap: 60px;
      padding: 60px 80px;
    }

    .slide-split .content { flex: 1; }
    .slide-split .visual { flex: 1; display: flex; justify-content: center; align-items: center; }

    /* Grid Layout: 2x2 or 3x2 cards */
    .card-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
      gap: 24px;
      margin-top: 32px;
    }

    .card {
      background: rgba(255,255,255,0.05);
      border: 1px solid rgba(255,255,255,0.1);
      border-radius: 16px;
      padding: 32px;
      transition: transform 0.2s, border-color 0.2s;
    }

    .card:hover {
      transform: translateY(-4px);
      border-color: var(--primary);
    }

    /* Big Number / Stat */
    .stat-number {
      font-family: var(--font-heading);
      font-size: clamp(3rem, 8vw, 6rem);
      font-weight: 900;
      color: var(--primary);
      line-height: 1;
    }

    /* Quote */
    .quote {
      font-size: clamp(1.4rem, 2.5vw, 2rem);
      font-style: italic;
      border-left: 4px solid var(--primary);
      padding-left: 32px;
      max-width: 800px;
    }

    /* === STAGGERED ANIMATIONS === */
    .slide.active .animate {
      animation: fadeUp 0.6s ease forwards;
    }

    .slide.active .animate:nth-child(1) { animation-delay: 0.1s; }
    .slide.active .animate:nth-child(2) { animation-delay: 0.2s; }
    .slide.active .animate:nth-child(3) { animation-delay: 0.3s; }
    .slide.active .animate:nth-child(4) { animation-delay: 0.4s; }
    .slide.active .animate:nth-child(5) { animation-delay: 0.5s; }
    .slide.active .animate:nth-child(6) { animation-delay: 0.6s; }

    .animate {
      opacity: 0;
      transform: translateY(20px);
    }

    @keyframes fadeUp {
      to { opacity: 1; transform: translateY(0); }
    }
  </style>
</head>
<body>
  <div class="deck">
    <!-- SLIDES GO HERE -->
  </div>

  <div class="nav">
    <button onclick="prev()">&#8592;</button>
    <button onclick="next()">&#8594;</button>
  </div>
  <div class="progress" id="progress"></div>
  <div class="counter" id="counter"></div>

  <script>
    let current = 0;
    const slides = document.querySelectorAll('.slide');
    const total = slides.length;

    function showSlide(n) {
      slides.forEach(s => s.classList.remove('active'));
      current = (n + total) % total;
      slides[current].classList.add('active');
      // Reset animations
      slides[current].querySelectorAll('.animate').forEach(el => {
        el.style.animation = 'none';
        el.offsetHeight; // trigger reflow
        el.style.animation = '';
      });
      document.getElementById('progress').style.width = ((current + 1) / total * 100) + '%';
      document.getElementById('counter').textContent = (current + 1) + ' / ' + total;
    }

    function next() { showSlide(current + 1); }
    function prev() { showSlide(current - 1); }

    document.addEventListener('keydown', (e) => {
      if (e.key === 'ArrowRight' || e.key === ' ') next();
      if (e.key === 'ArrowLeft') prev();
      if (e.key === 'Escape') showSlide(0);
    });

    // Touch/swipe support
    let touchStartX = 0;
    document.addEventListener('touchstart', e => touchStartX = e.touches[0].clientX);
    document.addEventListener('touchend', e => {
      const diff = touchStartX - e.changedTouches[0].clientX;
      if (Math.abs(diff) > 50) diff > 0 ? next() : prev();
    });

    showSlide(0);
  </script>
</body>
</html>
```

### Slide Types & When To Use Them

| Slide Type | Class | Use For |
|-----------|-------|---------|
| **Title** | `.slide-title` | Opening slide, section breaks |
| **Split** | `.slide-split` | Content + visual side by side |
| **Grid/Cards** | Use `.card-grid` | Features, benefits, team, comparisons |
| **Big Number** | Use `.stat-number` | Key stats, metrics, impact numbers |
| **Quote** | Use `.quote` | Testimonials, key insights |
| **Full Visual** | Custom with background SVG/image | Hero moments, transitions |
| **CTA/Closing** | `.slide-title` variant | Final slide, next steps |

### Visual Elements

**Prefer SVG graphics over images.** Claude can generate:
- Icons and illustrations as inline SVG
- Charts and data visualizations as SVG
- Abstract background shapes and patterns
- Diagrams, flowcharts, and architecture visuals
- Logo recreations as SVG

**When creating SVGs:**
- Keep them clean and minimal
- Use the brand colors from CSS variables
- Add subtle animations where appropriate (CSS `@keyframes`)
- Size them responsively using `viewBox` and percentage widths

**Background techniques:**
- Gradient meshes using CSS gradients
- Subtle pattern overlays using repeating SVG
- Glassmorphism effects with `backdrop-filter: blur()`
- Noise/grain texture using SVG `<filter>` with `feTurbulence`

### Design Rules

1. **Dark backgrounds are default.** They look better on screen, in artifacts, and in presentations. Use light slides only for contrast or specific brand requirements.

2. **One visual per slide minimum.** Every slide needs at least one non-text element: SVG graphic, chart, icon set, background shape, or decorative element.

3. **Max 6 lines of text per slide.** If you need more, split into two slides. Presentations are visual, not documents.

4. **Vary layouts across slides.** Never use the same layout twice in a row. Alternate between split, grid, full-width, centered.

5. **Use the animate class.** Add `class="animate"` to elements that should fade in with stagger. Makes the deck feel polished.

6. **Typography hierarchy is king.** Big headlines (900 weight), medium subheads (600), light body text (300). The contrast creates visual rhythm.

7. **Whitespace > More Content.** Let slides breathe. Generous padding. Don't fill every pixel.

8. **Brand consistency.** Use CSS variables for ALL colors. Never hardcode hex values in slide HTML. This makes rebranding trivial.

---

## Generating a Personalized Skill

If the user wants to create their own branded version of this skill (recommended for teams that build presentations regularly), guide them through this process:

### Step 1: Collect Brand Details

Ask the user:
- Company name
- Primary, secondary, and accent colors (hex codes)
- Preferred heading font and body font (Google Fonts)
- Logo (SVG, or create a text logo)
- Default tone (e.g., "bold and techy" or "clean and minimal")
- Any specific visual motifs they use (gradients, geometric shapes, etc.)
- Default slide count preference
- Any recurring content patterns (always have a CTA slide, always include company intro, etc.)

### Step 2: Generate The Customized Skill

Take this generic skill template and create a personalized version where:
- The CSS variables are pre-filled with their brand colors
- The font imports are pre-configured
- The default tone/style is baked into the instructions
- Logo SVG is embedded as a reusable component
- Any company-specific slide templates are included
- The "Ask User" phase is shortened since brand context is already known

### Step 3: Save & Deliver

Output the customized SKILL.md file that the user can drop into their Claude Projects or skills folder.

---

## Example Slide HTML Patterns

### Title Slide
```html
<div class="slide slide-title active">
  <div class="animate">
    <!-- LOGO SVG HERE -->
  </div>
  <h1 class="animate">Presentation Title</h1>
  <p class="animate">Subtitle or tagline goes here</p>
</div>
```

### Split Layout with SVG Visual
```html
<div class="slide slide-split">
  <div class="content">
    <h3 class="animate">Section Label</h3>
    <h2 class="animate">Main Headline For This Slide</h2>
    <p class="animate">Supporting text that explains the key point. Keep it concise and impactful.</p>
  </div>
  <div class="visual animate">
    <!-- SVG ILLUSTRATION HERE -->
  </div>
</div>
```

### Grid Cards
```html
<div class="slide">
  <h2 class="animate">Section Title</h2>
  <div class="card-grid">
    <div class="card animate">
      <!-- ICON SVG -->
      <h3>Card Title</h3>
      <p>Card description text.</p>
    </div>
    <!-- More cards... -->
  </div>
</div>
```

### Big Stat
```html
<div class="slide slide-title">
  <div class="stat-number animate">73%</div>
  <h2 class="animate">Of companies still don't use AI effectively</h2>
  <p class="animate">Source: McKinsey Digital Report 2025</p>
</div>
```

---

## Keyboard Shortcuts (Built In)

| Key | Action |
|-----|--------|
| `→` or `Space` | Next slide |
| `←` | Previous slide |
| `Escape` | Go to first slide |
| Swipe left/right | Next/previous (touch devices) |

---

## Quality Checklist

Before delivering the presentation, verify:

- [ ] All slides use CSS variables for colors (no hardcoded hex in HTML)
- [ ] Every slide has at least one visual element
- [ ] No slide has more than 6 lines of body text
- [ ] Layouts vary across slides (no two consecutive same-layout)
- [ ] Animations use the `.animate` class with stagger
- [ ] Typography hierarchy is consistent (h1 > h2 > h3 > p)
- [ ] Navigation works (arrows, keyboard, touch)
- [ ] Progress bar updates correctly
- [ ] File is fully self-contained (no external deps except Google Fonts)
- [ ] Looks good at 1920x1080 (standard presentation resolution)
- [ ] Brand colors and fonts match user requirements
