# 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