8cb1f9f479
Publish SDK (PyPI) / publish (push) Has been cancelled
Publish SDK (npm) / publish (@aionui/officecli-sdk) (push) Has been cancelled
SDK smoke / smoke (windows-latest) (push) Has been cancelled
Publish SDK (npm) / publish (@officecli/officecli-sdk) (push) Has been cancelled
Publish SDK (npm) / publish (@officecli/sdk) (push) Has been cancelled
Publish SDK (npm) / publish (officecli-sdk) (push) Has been cancelled
SDK smoke / smoke (macos-latest) (push) Has been cancelled
SDK smoke / smoke (ubuntu-latest) (push) Has been cancelled
Skill parity / diff (push) Has been cancelled
255 lines
14 KiB
Markdown
255 lines
14 KiB
Markdown
---
|
||
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).
|