src/process/resources/skills/morph-ppt/reference/pptx-design.md
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.
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):
#FFFFFF, #EEEEEE, #CADCFC). Chart series fills + icon strokes must clear the same floor.#000000, #333333).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 textWhen in doubt, push contrast. Stage-style decks are read under projector + mixed ambient light — reviewer's monitor comfort is not the right benchmark.
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):
!!scene-grid, !!scene-band, corner accents). Must not compete with content at the back of the room.!!actor-evidence-bg, KPI card fills). Strong enough to frame, soft enough to let numbers shine.!!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.
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:
dark--*; healthcare / education lean light--* or warm--*; design / brand lean bw--* or mixed--*.reference/styles/INDEX.md Quick Lookup for the nearest hex trio; do not force-fit the mood label.dark--premium-navy on every pitch deck reads as a template, not a design choice.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.
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.
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.
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:
Rule of thumb: when in doubt, widen. Extra whitespace is better than wrapped text during a morph interpolation.
Purpose. Create smooth Morph animations through persistent shapes that change properties across adjacent slides.
Define 6-8 actors on Slide 1 if the deck tells a continuous-visual story:
Shape types available via --prop preset=: ellipse | rect | roundRect | triangle | diamond | star5 | hexagon. Full list: officecli help pptx shape.
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'.
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)
#sN-*) workflow#s(N-1)-* content carries the old slide's prefix.#s(N-1)-* shapes to x=36cm.#sN-*.Without step 2, slides accumulate shapes → visual overlap compounds silently across the deck.
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:
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).
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.
transition=morph (officecli set /slide[N] --prop transition=morph).name= across slides.x=36cm) before adding new content.Change ≥ 3 scene-actor properties between adjacent slides:
Goal: Sense of movement + transformation, not just fade.
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.
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).