--- name: pptx-design description: Morph-specific design notes — color + typography floor for deep-stage decks, plus Scene Actors / Page Types / Shape Index / Morph Animation Essentials --- # Morph Design Essentials `skills/officecli-pptx/SKILL.md` §Requirements / §Design Principles / §Visual delivery floor is the **source of truth for type hierarchy, contrast, and palette picking** in every pptx, morph or not. This file narrows that floor to the **stage-feel register** a morph deck typically shoots for: darker backgrounds, larger hero type, deeper opacity range for scene actors, and per-slide text-width generosity that survives `#sN-*` ghost churn. Where pptx SKILL.md already states a rule, the guidance here is an additive override **only if the slide is actively in a morph pair** — otherwise defer upward. --- ## 1) Color Principles (morph-stage register) ### Contrast is King — always compute, never eyeball Morph decks lean dark; mid-gray body text (`#666666`) that reads fine in a pptx base render **disappears under projector glare** the moment the backdrop goes below brightness 30. Compute before you pick: ``` Brightness = (R × 299 + G × 587 + B × 114) / 1000 ``` Deployment rule (morph-specific — stricter than pptx base): - **Dark background** (brightness < 128) → body text brightness ≥ 80% (`#FFFFFF`, `#EEEEEE`, `#CADCFC`). Chart series fills + icon strokes must clear the same floor. - **Light background** (brightness ≥ 128) → body text brightness ≤ 20% (`#000000`, `#333333`). - **Mixed / gradient background** — add a semi-transparent backing block (`opacity=0.3-0.6`) behind the run of text; do not rely on the gradient to "average out". Worked samples: - `#000000` brightness 0 → dark → white text - `#1E2761` brightness 35 → dark → white text - `#2C3E50` brightness 62 → dark → white text - `#E94560` brightness 88 → still dark → white text (common mistake: treating bright red as "mid") - `#F39C12` brightness 160 → light → dark text - `#FFFFFF` brightness 255 → light → dark text **When in doubt, push contrast.** Stage-style decks are read under projector + mixed ambient light — reviewer's monitor comfort is not the right benchmark. ### Color Hierarchy — three depth layers A morph deck has more visible elements per frame than a pptx base slide (scene actors + content + chart series + annotations). Hold the stack: ``` Background fill → Scene actors → Content (text / data / KPI) (weakest) (medium) (strongest) ``` Opacity ranges for `!!scene-*` and `!!actor-*` shapes (morph-specific — tighter than pptx base): - **≤ 0.12** — whole-deck decoration (`!!scene-grid`, `!!scene-band`, corner accents). Must not compete with content at the back of the room. - **0.3 – 0.6** — evidence / data backing blocks (`!!actor-evidence-bg`, KPI card fills). Strong enough to frame, soft enough to let numbers shine. - **0.8 – 1.0** — reserved for `!!actor-*` shapes that ARE the content (a hero ring behind a single stat, a brand color strip as the message). Use sparingly — more than 2 per slide reads as clutter. A scene actor that lands on `opacity=0.7` in the content core is usually a mis-classified actor; either lower it (it's decoration) or rename it `!!actor-*` (it's content) and plan an exit slide. ### Palette Selection — pick for mood, not for habit There are no universal palette formulas for morph decks. The four pptx canonical palettes (Executive navy / Forest & moss / Warm terracotta / Charcoal minimal) still apply, but morph decks pick more freely from the 52-style library because cross-slide motion amplifies color mood. Decision path: 1. **Match topic mood** → tech / fintech lean `dark--*`; healthcare / education lean `light--*` or `warm--*`; design / brand lean `bw--*` or `mixed--*`. 2. **Respect user-specified hex** → if the brief names a brand color, scan `reference/styles/INDEX.md` Quick Lookup for the nearest hex trio; do not force-fit the mood label. 3. **Vary by project** — avoid repeating the last three decks' palette family. `dark--premium-navy` on every pitch deck reads as a template, not a design choice. 4. **Name the palette in `brief.md`** → "warm--earth-organic palette" is a commitment; "warm tones" is not. Use `reference/styles/` for inspiration (palette + signature gesture), **not** for coordinates — per `reference/styles/INDEX.md` L5-11, the build.sh coordinates are hand-tuned for demo content. --- ## 2) Typography (morph-stage register) ### Recommended Combinations Morph decks are often viewed on stage or in projector-heavy settings where font weight carries farther than font choice. Two fonts max — one for headings, one for body. | Content Type | Primary Pair | Fallback | | ------------ | ----------------------------------------- | --------------------------------- | | English | Montserrat (title) + Inter (body) | Segoe UI / Helvetica Neue | | Chinese | Source Han Sans 思源黑体 (title + body) | PingFang SC / Microsoft YaHei | | Mixed CN/EN | Montserrat + Source Han Sans | Segoe UI + System Font | Avoid Georgia / Times for body on morph slides — serif terminals disappear when the shape interpolates mid-motion. Reserve serif for pptx base decks with no transition movement. ### Size Scale — one notch larger than pptx base A morph deck is read from farther back (stage setups, large screens) and each frame holds motion in addition to text. Size up: | Role | pptx base | morph-stage (use this) | | ------------------- | ---------- | ----------------------- | | Hero / cover title | 44-60pt | **54-72pt**, bold/black | | Section heading | 24-32pt | **28-40pt**, bold | | Body / supporting | 16-22pt | **18-24pt** | | Caption / footnote | 12-14pt | **13-16pt** (floor 13) | Do not drop below 13pt on any slide — projector glare erodes the lowest two point sizes first. ### Text Width Guidelines — widen for centered, widen for ghost churn Wrapping breaks visual hierarchy in a static deck; in a morph deck it **also breaks the motion** (the interpolation picks up the wrapped baseline and the text appears to tilt mid-transition). Make text boxes wider than you think. | Content Type | Minimum Width | Best Practice | | -------------------------------- | ---------------- | ----------------------------------------------------------- | | Centered titles (64-72pt) | 28cm | 28-30cm for 10-15 char titles, 25cm for hero statements | | Centered subtitles (28-40pt) | 25cm | Always 25-28cm to avoid mid-word breaks | | Left-aligned titles | 20cm | 20-25cm depending on content length | | Body text / cards | 8cm (single) | Single-column 8-12cm, double-column 16-18cm | | Ghost-target content (`#sN-*`) | same as source | Width must match the on-slide version — a narrower ghost pulls the morph into a resize-plus-move tilt | Common mistakes in morph decks: - Using 10-15cm for long centered subtitles → awkward wrap + visible tilt during transition. - Tight text boxes that "just fit" the text → one extra character on a cloned slide breaks layout. - Ghost target (x=36cm) sized smaller than source → morph reads as a shrink-and-move instead of a slide-off. **Rule of thumb:** when in doubt, widen. Extra whitespace is better than wrapped text during a morph interpolation. --- ## 3) Scene Actors (Animation Engine) — expanded **Purpose.** Create smooth Morph animations through persistent shapes that change properties across adjacent slides. ### Setup Define 6-8 actors on Slide 1 if the deck tells a continuous-visual story: - **Large** (5-8cm): Main visual anchors (hero circle, band, hero card) - **Medium** (2-4cm): Supporting elements (metric cards, accent rings) - **Small** (1-2cm): Accents and details (dots, dashes, icons) **Shape types** available via `--prop preset=`: `ellipse | rect | roundRect | triangle | diamond | star5 | hexagon`. Full list: `officecli help pptx shape`. ### Naming (SKILL.md is authoritative) Three-prefix system — `!!scene-*` / `!!actor-*` / `#sN-*`. Source of truth: `SKILL.md` §What is Morph? — core mechanics. This file adds only the Python-vs-shell quoting note below. **Python:** `#` and `!!` require no special quoting — pass as plain strings in `subprocess.run([..., "--prop", "name=#s1-title", ...])`. **Shell (bash/zsh):** ALWAYS single-quote to avoid history expansion on `!!` and comment-leading on `#`: `--prop 'name=!!scene-ring'` / `--prop 'name=#s1-title'`. ### Pairing example — 3 actors × 3 slides ``` Slide 1: !!scene-ring (x=5cm, y=3cm, w=8cm, fill=E94560, opacity=0.3) !!scene-dot (x=28cm, y=15cm, w=1cm) !!actor-headline (x=4cm, y=8cm, w=26cm, size=48) Slide 2: !!scene-ring (x=20cm, y=2cm, w=12cm, opacity=0.6) ← same name, new position+size !!scene-dot (x=3cm, y=16cm, w=1.5cm) ← moved to opposite corner !!actor-headline (x=1.5cm, y=1cm, w=12cm, size=24) ← shrunk + moved to top-left Slide 3: !!scene-ring (x=36cm) ← ghosted off-canvas !!scene-dot (x=10cm, y=2cm, w=1cm) !!actor-headline (x=36cm) ← ghost: new headline takes over !!actor-subpoint (x=4cm, y=8cm, w=26cm, size=36) ← new actor enters (no pair on S2 = fade in) ``` ### Per-slide content (`#sN-*`) workflow 1. **Clone previous slide** → inherited `#s(N-1)-*` content carries the old slide's prefix. 2. **Ghost inherited content** → move all `#s(N-1)-*` shapes to `x=36cm`. 3. **Add new content** → with current slide's prefix `#sN-*`. Without step 2, slides accumulate shapes → visual overlap compounds silently across the deck. --- ## 4) Page Types (mix for rhythm) Vary page types to avoid monotony. Each serves a different narrative purpose: | Type | When to use | Visual structure | |---|---|---| | **hero** | Opening, closing | Large centered title + scattered scene actors | | **statement** | Key message, transition | One impactful sentence + dramatic actor shifts (8cm+ moves) | | **pillars** | Multi-point structure | 2-4 equal columns, actors become card backgrounds (opacity 0.12) | | **evidence** | Data, statistics | 1-2 large asymmetric blocks + supporting details (opacity 0.3-0.6) | | **timeline** | Process, sequence | Horizontal or vertical flow with step backgrounds | | **comparison** | A vs B | Left-right split (50/50 or 60/40) with contrasting colors | | **grid** | Multiple items | Scattered or grid layout, lighter feel | | **quote** | Breathing moment | Centered text, minimal decoration | | **cta** | Call to action | Return to bold, centered design | | **showcase** | Featured display | Large central area for product/screenshot | **Design notes:** - **pillars**: Multi-column even distribution; scene actors morph into card backgrounds (roundRect, opacity=0.12). - **evidence**: Asymmetric — 1 large actor (30-40% canvas) + 1 medium (20-30%), opacity 0.3-0.6 allowed for data backgrounds. - **grid**: Must differ from pillars and evidence — light, scattered vs. structured. - **Variety matters**: Avoid repeating the same page type consecutively. --- ## 5) Shape Index Mechanics Shapes are numbered sequentially on each slide: `shape[1]`, `shape[2]`, `shape[3]`... When `transition=morph` is applied, CLI auto-prefixes `!!` to names — **use index paths after that** (see SKILL.md §Known Issues M-1). ### Index behavior - **On creation:** Shapes added in order get increasing indices. - **After cloning:** New slide inherits all shapes with identical indices. - **After adding to a cloned slide:** New shapes get the next available index. - **After modifying:** Index stays the same. ### Pattern for build scripts ``` Slide 1: 6 actors + 2 content = 8 shapes total Slide 2: Clone (8) → Ghost content (shape[7-8]) → Add new (shape[9+]) Slide 3: Clone (10) → Ghost content (shape[9-10]) → Add new (shape[11+]) ``` **Formula:** Next slide's first new shape index = Previous slide's total shape count + 1. **Debugging:** `officecli get $FILE '/slide[N]' --depth 1` to inspect actual indices. --- ## 6) Morph Animation Essentials ### Minimum requirements 1. Slides 2+ must have `transition=morph` (`officecli set /slide[N] --prop transition=morph`). 2. Scene actors must have identical `name=` across slides. 3. Previous per-slide content must be ghosted (`x=36cm`) before adding new content. 4. Adjacent slides should have different spatial layouts (displacement ≥ 5cm OR rotation ≥ 15° OR size delta ≥ 30% on ≥ 3 shapes). ### Creating motion Change ≥ 3 scene-actor properties between adjacent slides: - Move positions (x, y) - Resize (width, height) - Rotate (rotation degrees) - Shift colors (fill, opacity) **Goal:** Sense of movement + transformation, not just fade. ### Entrance effects on morph slides Morph handles shape transitions automatically — entrance animations are usually unnecessary. If one is needed (e.g., fade a new `#sN-*` card in), use the `with` trigger so it plays simultaneously with morph: ``` animation=fade-entrance-300-with ``` Format: `EFFECT[-DIRECTION][-DURATION][-TRIGGER]`. See `officecli help pptx animation` for preset list. --- ## 7) Style References 52 visual style directories in `reference/styles/` — see `reference/styles/INDEX.md` for the catalog. Lookup workflow is in SKILL.md §Style library lookup workflow. Key rule: **learn the approach, do not copy coordinates** (the style build.sh files have known typesetting bugs per `INDEX.md` L5-11).