---
name: fwu-design
description: "Erstelle PowerPoint-Folien im Corporate Design des FWU (Institut für Film und Bild, Medieninstitut der Länder). Triggert IMMER, wenn der User Folien, Decks, Präsentationen oder Statusberichte mit FWU-Bezug, FWU-Design oder FWU-Branding möchte — auch wenn er den Begriff 'FWU-Design' nicht explizit nennt. Triggert ebenso bei Begriffen wie 'Statusbericht AIS', 'AIS Programm', 'telli', 'eduCheck', 'VIDIS', 'HubbS', 'SODIX', 'MEM' oder anderen FWU-Produktnamen. Triggert auch bei jedem Bezug zur Datei 'Statusbericht_Template.pptx' oder ähnlichen FWU-Templates. Nutzt das mitgelieferte FWU-Master-Template mit allen 20 Layouts (Titelfolien, Kapiteltrenner, Inhaltsfolien, Zweispalter, Galerie, Abschluss, Produkt-Layouts) und erzeugt Folien, die optisch identisch zum Original-FWU-Statusbericht sind — Logo, Schriftart Rethink Sans, Farbpalette, Footer und Foliennummern werden automatisch vom Master vererbt."
---

# FWU Design — PowerPoint im FWU Corporate Design

Dieser Skill erzeugt PowerPoint-Decks im offiziellen FWU-Design (Institut für Film und Bild, Medieninstitut der Länder). Er nutzt ein mitgeliefertes Master-Template, dessen Layouts das gesamte FWU-Branding (Logo, "75 Jahre FWU"-Badge, Schrift, Farben, Footer) automatisch vererben. Du musst die Marke nicht nachbauen — nur die Layouts korrekt befüllen.

## Wann diesen Skill nutzen

Immer, wenn ein FWU-Deck entstehen soll. Typische Auslöser:

- "Mach mir einen Statusbericht für AIS / telli / Februar 2026 …"
- "Bau mir 3 Folien zum Thema X im FWU-Design"
- "Erstelle eine Präsentation für die didacta zum AIS Programm"
- "Aus diesem Reporting bitte ein Slidedeck im FWU-Stil"
- Jede Anfrage, die FWU-Produkte (AIS, telli, eduCheck, VIDIS, HubbS, SODIX, MEM) erwähnt und ein Deck/Folien als Output verlangt

## Workflow

1. **Template ist Pflicht-Ausgangspunkt.** Niemals von null in `pptxgenjs` o.ä. nachbauen — die Schrift Rethink Sans, das Logo, die "75 Jahre FWU"-Marke und die exakte Farb-Tonalität sind nur über das Template korrekt.
2. **Mit dem Helper-Script starten:** `python scripts/new_deck.py <output.pptx>` legt eine leere Datei mit allen Mastern/Layouts an.
3. **Folien per python-pptx hinzufügen** über die Layout-Indizes (siehe unten).
4. **Visuell prüfen** mit dem QA-Workflow aus dem `pptx`-Skill (PDF-Konvertierung + Subagent-Inspektion). Mindestens einmal vor Auslieferung.

## Schnellreferenz: Layouts und Platzhalter

Ausführliche Beschreibung mit Maßen und Hinweisen: siehe [`references/layouts.md`](references/layouts.md). Hier die wichtigsten Layouts in der Reihenfolge, wie sie typischerweise in einem Statusbericht-Deck vorkommen:

| `slide_layouts[i]` | Layout-Name | Wozu |
|---|---|---|
| `[0]` | Titelfolie orange | Cover des Decks (vollflächig orange, weißer Titel, Datum unten rechts) |
| `[1]` | Titelfolie nude | Alternative Cover-/Trennseite mit Peach-Hintergrund — wird im Original auch als Sub-Brand-Trenner ("telli", "Programmpläne") genutzt |
| `[2]` | Kapiteltrennseite | Vollorange Trenner zwischen Hauptkapiteln, mit großer Kapitelnummer |
| `[6]` | Text Headline und Quellenangabe | Standard-Inhaltsfolie **mit** drei Quellen-Boxen rechts (Quellen müssen befüllt oder gelöscht werden, sonst sichtbarer Lorem-ipsum-Rest) |
| `[7]` | Headline und Text oder Medien 2 | **Standard-Inhaltsfolie ohne Quellenboxen — Default für die meisten Folien** |
| `[8]` | Textseite mit plakativem Fließtext | Inhalt mit großem, prominenten Fließtext |
| `[9]` | Textseite Zweispaltig | Zwei nebeneinander liegende Textspalten |
| `[10]` | Text und Galerie | Text plus bis zu 6 Bildkacheln |
| `[12]` | Abschlussfolie | "Vielen Dank"-Schluss mit Kontaktdaten rechts |

Produktspezifische Master 1–7 enthalten je ein Layout für `Bildseite mit Textbox`, `eduCheck`, `VIDIS`, `AIS`, `HubbS`, `SODIX`, `MEM`. Diese werden über `prs.slide_masters[N].slide_layouts[0]` adressiert.

## Platzhalter-Indizes (idx)

PowerPoint adressiert Platzhalter über `placeholder_format.idx` — diese Werte sind **nicht** mit der Reihenfolge in `.placeholders` identisch. Zugriff immer über die Helper-Funktion `set_ph(slide, idx, text)` aus dem Helper-Script oder direkt:

```python
for ph in slide.placeholders:
    if ph.placeholder_format.idx == 12:
        ph.text = "..."
```

**Konventionen über alle Inhaltslayouts hinweg:**

- `idx=0` → Folientitel (TITLE)
- `idx=10` → Foliennummer (auto)
- `idx=11` → Footer-Text (z.B. `Stg AIS, 20.2`) — wird beim Erstellen einer neuen Folie meist automatisch leer sein, kann gefüllt werden
- `idx=12`, `idx=13` → Body / Spalten (je nach Layout)
- `idx=20` → **Kapitelnummer oben links** (z.B. `"01"`)
- `idx=21` → **Kapiteltext oben links** unter der Nummer (z.B. `"Statusbericht AIS\nFebruar 2026"`). Max. ~15 Zeichen pro Zeile — bei längeren Texten bricht das Layout mitten im Wort um (Breite nur ~1" bei 11pt). Lieber kurz halten: `"telli Q1 2026"` statt `"Quartalsreport telli\nQ1 2026"`.
- `idx=22`–`27` → Inhalts-Container in mehrspaltigen Layouts (Galerie, Inhaltsverzeichnis)

**Sonderfälle:**

- **Layout 0 (Titelfolie orange) / 1 (Titelfolie nude):** `idx=11` ist die optionale Overhead-Zeile über dem Titel; `idx=12` ist der eigentliche Titel (max. 3 Zeilen). Datum unten rechts wird automatisch über ein Datumsfeld gesetzt.
- **Layout 2 (Kapiteltrennseite):** `idx=20` = Nummer ("01"), `idx=12` = Kapiteltitel, `idx=11` = Beschreibungstext darunter.
- **Layout 6 (mit Quellen):** Die drei Quellen-Boxen rechts (Position ≈ 11.6"/3.1", 4.2", 5.3") sind keine echten Platzhalter, sondern Layout-eigene Textboxen mit Lorem-ipsum-Inhalt. Sie erscheinen sichtbar, wenn die Folie nicht überschrieben wird. Wenn keine Quellen benötigt werden: **Layout 7 nutzen.** Wenn Quellen rein sollen: per `add_textbox` an gleicher Position überlagern oder per XML-Manipulation überschreiben.
- **Layout 12 (Abschluss):** `idx=12` = Schlusstitel ("Vielen Dank"), `idx=13` = Untertitel ("Fragen?").

## Code-Pattern: Folie hinzufügen

**Tipp:** Für die üblichen Bausteine (`set_ph`, `add_card`, `stat_callout`, `add_textbox`, FWU-Farb-Konstanten) gibt es ein Helper-Modul unter `scripts/helpers.py`:

```python
import sys
sys.path.insert(0, "/mnt/skills/user/fwu-design/scripts")
from helpers import set_ph, stat_callout, add_card, ORANGE, MAGENTA, PEACH
```

```python
from pptx import Presentation
from pathlib import Path

# Frisches Deck aus Template (Helper kümmert sich ums Folien-Löschen):
import subprocess
out = "mein_deck.pptx"
subprocess.run(["python", "scripts/new_deck.py", out], check=True)
prs = Presentation(out)

def set_ph(slide, idx, text):
    """Setze Text in Platzhalter über idx. Liefert den Platzhalter zurück oder None."""
    for ph in slide.placeholders:
        if ph.placeholder_format.idx == idx:
            ph.text = text
            return ph
    return None

# Titelfolie
s = prs.slides.add_slide(prs.slide_layouts[0])
set_ph(s, 11, "Statusbericht")             # optionale Overhead-Zeile
set_ph(s, 12, "AIS / telli\nApril 2026")   # Haupttitel, max 3 Zeilen

# Kapiteltrennseite
s = prs.slides.add_slide(prs.slide_layouts[2])
set_ph(s, 20, "01")
set_ph(s, 12, "Programm Status")
set_ph(s, 11, "Aktueller Stand AIS / telli")

# Standard-Inhaltsfolie (ohne Quellen — fast immer die richtige Wahl)
s = prs.slides.add_slide(prs.slide_layouts[7])
set_ph(s, 0,  "AIS Programm Status")
set_ph(s, 20, "01")
set_ph(s, 21, "Statusbericht AIS\nApril 2026")
# Inhalt im idx=22 (OBJECT-Platzhalter) als Textframe nutzen oder Tabelle/Bild einfügen

# Zweispalter
s = prs.slides.add_slide(prs.slide_layouts[9])
set_ph(s, 0,  "Erreichte vs. anstehende Meilensteine")
set_ph(s, 20, "06")
set_ph(s, 21, "Statusbericht AIS\nApril 2026")
set_ph(s, 12, "Erreicht\n• Sprint 3 abgeschlossen\n• PoC läuft")
set_ph(s, 13, "Anstehend\n• Pilotschulen-Auswahl\n• DSFA-Entwurf")

# Abschluss
s = prs.slides.add_slide(prs.slide_layouts[12])
set_ph(s, 12, "Vielen Dank")
set_ph(s, 13, "Fragen?")

prs.save(out)
```

## Tabellen, Diagramme, Bilder

Standard python-pptx-Methoden auf dem Slide funktionieren uneingeschränkt:

- **Tabelle:** `slide.shapes.add_table(rows, cols, left, top, width, height)` — als Standardposition für eine Inhaltsfolie passen `Inches(2.24), Inches(1.91), Inches(10.5), Inches(4.5)` (rechts vom Kapitel-Block, unter dem Titel).
- **Diagramm:** `slide.shapes.add_chart(...)` — die Theme-Farben (`#FE7235` als Akzent 1) werden korrekt angewendet, weil das Theme mitgeliefert wird.
- **Bild:** `slide.shapes.add_picture(path, left, top, width, height)`.

Wenn du eine Folie mit Inhalt-Platzhalter (`idx=22`, OBJECT-Typ in Layout 7) befüllst, kannst du `placeholder.insert_table()` / `insert_picture()` verwenden — dann wird der Platzhalter durch den Inhalt ersetzt, ohne dass du Koordinaten brauchst.

## Farben (für eigene Shapes/Highlights)

| Verwendung | Hex | Beispiel |
|---|---|---|
| Primär Orange | `#FE7235` | Akzente, Highlights, Status-OK |
| Sekundär Peach | `#FEF3E9` | Hintergrund-Boxen, Karten |
| Alternative Peach (kräftiger) | `#FFDCBD` | Card-Header, Badges |
| Magenta-Akzent | `#96375C` | Sub-Akzent, kontrastierende Highlights |
| Magenta hell | `#ECB9CE` | Magenta-Backgrounds |
| Gelb | `#F7B335` / `#FBD022` | Status-Warnung, Highlights |

Die Schrift **Rethink Sans** ist im Theme als major + minor Font hinterlegt — neu hinzugefügte Textboxen erben sie automatisch über den Theme-Standard.

## Stat-Callouts — Schriftgrößen-Daumenregel

Für große Kennzahlen in Cards gilt bei Rethink Sans Bold und Card-Breite ~3.45":

| Zahlen-Länge | Max. Font-Size | Beispiel |
|---|---|---|
| 1–2 Zeichen | 52pt+ | `"60"` |
| 3–4 Zeichen | 48pt | `"2.4M"` |
| 5 Zeichen | 42pt | `"36.831"` |
| 6 Zeichen | 40pt | `"123.456"` |
| **7 Zeichen** | **38pt** | `"918.328"` |
| 8+ Zeichen | 32pt oder umbrechen | `"1.234.567"` |

**Grund:** Bei schmaleren Cards (<3.5") bricht Rethink Sans Bold ab 40pt bei 7-stelligen Zahlen um — das zerstört das Layout, weil die Card-Höhe fix ist und das Label aus der Card herausfließt. **Im Zweifel kleiner wählen und die Card weiter/höher ziehen statt eng schneiden.**

Wenn breitere Cards gebraucht werden (z.B. bei 2 statt 3 Cards pro Reihe), geht bei 4.8"-Cards problemlos 42pt auch für 7-stellige Zahlen. Die Funktion `stat_callout()` in `scripts/helpers.py` wendet diese Regel automatisch an.

## Footer / Fußnote / Header

Der globale Footer (orange Pille unten rechts mit "Statusbericht AIS / Februar 2026"), die FWU-Logo-Marke oben rechts und die Foliennummer kommen vom Master und werden auf jeder Folie automatisch gerendert. **Manuelles Hinzufügen ist nicht nötig und führt zu Doppelungen.**

Wenn der Header-Text dynamisch sein soll (z.B. Monat ändern), nutze die Footer-Felder via `set_ph(s, 11, "Stg AIS, 20.2")` und `set_ph(s, 21, "Statusbericht AIS\nApril 2026")` pro Folie.

## QA — Pflicht vor Auslieferung

```bash
# In Bilder konvertieren
python /mnt/skills/public/pptx/scripts/office/soffice.py --headless --convert-to pdf output.pptx
rm -f slide-*.jpg
pdftoppm -jpeg -r 150 output.pdf slide

# Inhalte prüfen
extract-text output.pptx | grep -iE "lorem|ipsum|placeholder|TODO|\[insert"
# Falls Treffer: Lorem-Reste in den Layout-eigenen Quellenboxen (Layout 6) — entweder wechseln zu Layout 7 oder Quellen explizit überschreiben.
```

Visuelle Inspektion gegen die Originaldatei `assets/template.pptx` als Referenz.

## Bekannte Stolperfallen

1. **Folien aus dem Template löschen verlangt das Entfernen der Relationship**, sonst gibt es beim nächsten `prs.save()` Duplicate-Name-Errors. Das Helper-Script `new_deck.py` macht das richtig — niemals manuell mit `del prs.slides._sldIdLst[i]` arbeiten.
2. **Layout 6** zeigt sichtbares Lorem-ipsum aus den Layout-eigenen Quellenboxen, wenn die Folie nicht überschrieben wird. **Default für Inhaltsfolien ist deshalb Layout 7.**
3. **Die Datums-Felder auf der Titelfolie aktualisieren sich** beim Öffnen automatisch auf das aktuelle Datum (LibreOffice) bzw. das letzte Speicherdatum (PowerPoint). Wenn ein fixes Datum gewünscht ist, muss das Datumsfeld via XML durch statischen Text ersetzt werden.
4. **Sub-Brand-Pillen** (das kleine `🔻 telli`-Etikett oben links auf telli-Folien) sind im Original manuell platzierte Shapes, kein Layout-Element. Wenn sie gebraucht werden, einmal als Shape-Gruppe nachbauen und kopieren.
5. **Typografische Anführungszeichen (`„"` / `""`) im Python-Quellcode vermeiden**, wenn der äußere String doppelte `"` nutzt. Typografische Zeichen wie `„`, `"`, `—` innerhalb eines `f"..."`-Strings können bei bestimmten Dateicodierungen einen `SyntaxError: invalid character` auslösen. Entweder: äußere Strings als `'...'` setzen, oder typografische Zeichen als `\u201e` / `\u2014` escapen, oder durch ASCII-Äquivalente ersetzen (`"..."`, `-`).
