diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e43b0f9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.DS_Store
diff --git a/DESIGN.md b/DESIGN.md
new file mode 100644
index 0000000..728ca00
--- /dev/null
+++ b/DESIGN.md
@@ -0,0 +1,248 @@
+# CANCOM HTML Deck — Design System
+
+Verbindliche Grundlage für alle HTML-Präsentationen im CANCOM-Look.
+Referenz-Implementierung: `cancom-html-vs-pptx-v7.html`
+Ausgebautes Praxisbeispiel (36 Slides, Kapitel-Trenner, Mitmach-Spiel, Begriffs-Tooltips,
+Präsentations-Konfigurator, Ambient-Sound): `ki-verstehen.html` + `config.html` + `slides-manifest.js`
+Startpunkt für neue Decks: `deck-template.html`
+Copy-Paste-Bausteine: `PATTERNS.md`
+
+---
+
+## 1. Grundprinzipien
+
+1. **Ein File.** Kein Build, kein Bundler, keine Node-Dependencies. HTML + CSS + JS in einer Datei, per Doppelklick lauffähig, per Mail/Teams/SharePoint verteilbar. Einzige externe Abhängigkeit: die Fonts von Fontshare (mit lokalem Fallback).
+2. **Feste Bühne, skaliert.** Jede Slide ist exakt 1920×1080 px. Nichts wird responsiv umgebrochen — die gesamte Bühne wird per `transform: scale()` in den Viewport gerechnet. Dadurch sieht das Deck auf jedem Screen und jedem Beamer pixelidentisch aus.
+3. **Design in Tokens.** Farben, Fonts, Easings stehen ausschließlich in `:root`. Keine Hex-Codes im Slide-Markup. Ein neues Kunden-Theme = neue Token-Werte, kein Umbau.
+4. **Animation ist Argument.** Das Deck ist ein Beweis dafür, dass HTML mehr kann als PPTX. Jede Slide sollte mindestens eine Sache tun, die eine PowerPoint-Folie nicht kann — Live-Daten, echte Interaktion, GPU-Animation.
+5. **Ehrlichkeit im Ton.** Deutsch, direkt, kein Marketing-Sprech. Headlines sind kurze Sätze mit Punkt am Ende („PPTX ist Vergangenheit."), nicht Substantiv-Ketten.
+
+---
+
+## 2. Farb-Tokens
+
+| Token | Wert | Verwendung |
+|---|---|---|
+| `--cancom-red` | `#E4002B` | Signalfarbe. Akzente, Zahlen, Eyebrows, genau **ein** Highlight pro Headline |
+| `--cancom-red-glow` | `rgba(228,0,43,0.55)` | `box-shadow` / `text-shadow` Glow |
+| `--cancom-red-dim` | `rgba(228,0,43,0.15)` | Flächige Rot-Hinterlegung, Hover-Auras |
+| `--ink` | `#0A0A0F` | Standard-Slide-Hintergrund |
+| `--ink-soft` | `#14141C` | Erhöhte Flächen, Hover-States |
+| `--ink-line` | `#23232E` | Alle Rahmen und Trennlinien |
+| `--paper` | `#F5F5F2` | Primärtext auf Dunkel, Hintergrund der Closing-Slide |
+| `--paper-dim` | `rgba(245,245,242,0.6)` | Fließtext, Lead-Absätze |
+| `--paper-mute` | `rgba(245,245,242,0.35)` | Labels, Slide-Nummern, HUD |
+| `--accent-cool` | `#4CC9F0` | Zweitfarbe in Charts und Code-Highlighting |
+| `--accent-warm` | `#FFB627` | Drittfarbe, Flash-States |
+
+**Regeln**
+
+- Rot ist Signal, nicht Dekoration. Pro Slide maximal ein rotes Wort in der Headline.
+- Rot nie als große Textfläche — nur Headline-Akzente, Zahlen, Linien, Glows.
+- Semantische Ausnahmen sind erlaubt und stehen bewusst außerhalb der Marke: `#4ade80` (grün, Kurs steigt) und `#ff5060` (hellrot, Kurs fällt).
+- Die Closing-Slide dreht das Schema um: `--paper` als Hintergrund, `--ink` als Text. Das ist der einzige helle Slide — er markiert das Ende.
+
+---
+
+## 3. Typografie
+
+Drei Schriften, drei klar getrennte Jobs:
+
+| Token | Font | Job |
+|---|---|---|
+| `--font-display` | General Sans (700/600/500) | Alle Headlines, Zahlen, Buttons, Brand-Marks |
+| `--font-body` | Satoshi (700/500/400) | Fließtext, Lead-Absätze, Listen |
+| `--font-mono` | JetBrains Mono (700/500/400) | Eyebrows, Labels, HUD, Code, alles Technische |
+
+### Type-Scale (bei 1920×1080)
+
+| Rolle | Größe | Line-Height | Letter-Spacing |
+|---|---|---|---|
+| Title-Headline | 220 px | 0.88 | −0.045em |
+| Closing-Headline | 240 px | 0.86 | −0.045em |
+| Counter-Value | 220 px | 0.90 | −0.05em |
+| Slide-Title | 112 px (eng: 92 px) | 0.94 | −0.035em |
+| Versus-Headline | 100 px | 0.92 | −0.035em |
+| Card-Title | 42 px | 1.05 | −0.02em |
+| Lead-Absatz | 30 px (eng: 22–24 px) | 1.4 | normal |
+| Body / Listen | 20–24 px | 1.4–1.5 | normal |
+| Eyebrow / Label | 14–18 px | — | 0.14em–0.3em, uppercase |
+
+**Regeln**
+
+- Je größer die Schrift, desto negativer das Tracking und desto enger die Line-Height. Große Display-Typo braucht optischen Zusammenzug.
+- Mono ist **immer** uppercase mit weitem Tracking (≥ 0.14em). Es ist die „Maschinen-Stimme" des Decks.
+- Body-Text nie über 1300–1500 px Breite (`max-width` am `.slide-lead`).
+- Headlines brechen manuell per `
`. Der Zeilenumbruch ist Gestaltung, nicht Zufall.
+- Zahlen, die sich live ändern, brauchen `font-variant-numeric: tabular-nums`, sonst springt das Layout.
+
+**Schriftwahl:** Ursprünglich stand hier Clash Display. Bei sehr engem Tracking und großen
+Displaygrößen (Zahlen, Zwei-Wort-Headlines) wurde die Schrift auf Distanz schwerer lesbar —
+enge, kantige Formen laufen bei Beamer-Projektion schnell zusammen. **General Sans** ersetzt sie:
+gleiche Bühnengröße und Gewichtsstufen (500/600/700), aber offenere Punzen (a, e, s) und eine
+größere x-Höhe, die auch bei −0.04em Tracking klar bleibt. Fließtext (Satoshi) und Mono
+(JetBrains Mono) sind unverändert. Beim Schriftwechsel testen: `font-vorschau.html` zeigt
+Kandidaten direkt in Deck-Größe (92 px / 40 px) nebeneinander, bevor man sich festlegt.
+
+---
+
+## 4. Layout
+
+### Die Bühne
+
+```
+.deck-viewport → fixed, füllt das Browserfenster, schwarz, overflow hidden
+ .deck-stage → 1920×1080, transform-origin 0 0, wird per JS skaliert + zentriert
+ .slide → absolute inset 0, 1920×1080, default unsichtbar
+```
+
+Der Scale-Faktor ist `Math.min(innerWidth/1920, innerHeight/1080)`, der Rest wird als Letterbox zentriert. **Diese Struktur ist nicht optional** — sie ist der Grund, warum das Deck überall gleich aussieht.
+
+### Grid & Spacing
+
+- **Slide-Padding:** 100 px oben/unten, 120 px links/rechts (`.slide-content`). Title- und Closing-Slide: 120 px rundum.
+- **Spacing-Rhythmus:** Vielfache von 4, praktisch 8/12/16/20/24/32/44/60. Kein 13, kein 27.
+- **Gap in Grids:** 20 px (dichte Feature-Tiles), 32 px (Cards), 60 px (Spalten-Splits).
+- Content-Bereiche nutzen `flex: 1`, damit sie den Rest der Höhe füllen. Bei Grids mit fester Zeilenzahl zusätzlich `min-height: 0`, sonst sprengt Inhalt die Slide-Höhe.
+
+### Layout-Archetypen
+
+| Klasse | Struktur | Wofür |
+|---|---|---|
+| `.title-slide` | Space-between, 3 Zonen (Topbar / Headline / Meta) + Canvas-Layer | Slide 1 |
+| `.slide-content` | Eyebrow → Titel → Lead → Content-Block | Der Standard-Slide, 80 % aller Fälle |
+| `.versus` | 2 Spalten randlos + zentraler VS-Kreis | Direktvergleich, Vorher/Nachher |
+| `.counter-grid` | 3 Spalten, große animierte Zahlen | Kennzahlen |
+| `.code-slide` | Text links, Code-Window + Live-Preview rechts | Beweis-Slides |
+| `.feature-grid` | 4×2 Tiles, `.wide` = span 2 | Feature-Showcase |
+| `.closing-slide` | Hell, Space-between, Blur-Blob | Letzter Slide |
+| `.section-slide` | Dunkel, zentriert, riesige „Geister-Zahl" im Hintergrund | Kapitel-Trenner bei Themenwechsel |
+| `.game-wrap` | Satz/Lücke + Options-Buttons, JS-gesteuert | Mitmach-Slides (Publikum rät mit) |
+
+Die Slide-Nummer kommt automatisch aus `data-num="04 / 10"` am `.slide-content` (gerendert per `::before`). Sie muss beim Umbau des Decks von Hand nachgezogen werden. `.section-slide`, `.versus`, `.code-slide`, Title- und Closing-Slide tragen bewusst **kein** `data-num` — sie zählen als „Zwischenspiel", nicht als nummerierter Inhaltspunkt.
+
+### Kapitel-Trenner (`.section-slide`)
+
+Bei mehr als ~5–6 Slides pro Thema lohnt sich ein eigener Trenner-Slide vor jedem Themenwechsel — er gibt dem Publikum eine Atempause und macht die Dramaturgie sichtbar. Aufbau: riesige, transparente Zahl mit Outline (`-webkit-text-stroke`) im Hintergrund, davor ein roter Mono-Kicker („Kapitel 03 / 07") und eine kurze, große Headline plus ein Satz Unterzeile. Siehe `PATTERNS.md` Nr. 7 für den Code.
+
+Faustregel: ein Trenner pro inhaltlichem Kapitel, nicht pro Slide. Bei 30+ Slides sind 6–8 Trenner ein guter Rhythmus — mehr wirkt zerhackt, weniger verliert die Orientierung.
+
+---
+
+## 5. Motion
+
+### Reveal-System
+
+Elemente mit `.reveal` starten bei `opacity: 0; translateY(40px)` und fahren ein, sobald die Slide `.visible` bekommt. Die Staffelung läuft über `.d1`–`.d7` (100 ms → 820 ms, Schritte von ~120 ms). `.reveal-slide-x` macht dasselbe horizontal (−60 px), gedacht für die linke Versus-Spalte.
+
+```html
+
+