DESIGN.md@plugins/motion-launch-videos/skills/motion-photo/templates · git:20260929.0c2dbc0 · 2026-09-29 · sha256 af9715e7604c8eff

DESIGN.md@plugins/motion-launch-videos/skills/motion-photo/templates git:20260929.0c2dbc0A

Immutable. This exact content never changes and is served at /api/v1/blob/af9715e7604c8eff.

# Design: <film>

The spec the film is built from. Numbers here and in the FILM config agree; when one changes, change both. Text baselines start as a first guess and are settled after the first build, from the cap heights `render.mjs layout` reports.

## Canvas, grid and formats

- Master 1080 x 1080, 60 fps, <n> s = <N> frames, hold loop. Delivered at: <9:16 (1080 x 1920), 1:1, 16:9 (1920 x 1080)>.
- Live area 104 px in from every edge. Text and tags stay inside it; photos may bleed. At 9:16 type stays between y 360 and 1560.
- Baseline unit 8 px: every text baseline is a multiple of 8.
- Tempo 120 BPM: beat 0.5 s, 16th 0.125 s, bar 2 s. Every entrance starts on a 16th.

## Palette

The photos carry the colour; the palette is for what is drawn.

| Role | Hex | Used for | Contrast on its backdrop |
|---|---|---|---|
| bg | | the page, taken from the photos | |
| ink | | type on the page, scrims | |
| paper | | type on photos and dark scenes, pills, leaders | |
| shade | | frame and cutout shadows | |
| | | accent: the price, the URL | |

## Type roles

| Role | Face | Size rule | Tracking | Use |
|---|---|---|---|---|
| display | Bricolage Grotesque 800 | cap height on the grid | 0 | beats, the name |
| mono | IBM Plex Mono 500 | 26 to 36 px | +20 to +60 | tags, labels, URL, small print |

## Images

| id | File | Pixels | Focus | Subject | Shown in | Largest shown (per format) | BRIEF row |
|---|---|---|---|---|---|---|---|
| hero | assets/<file>.jpg | | [x, y] | [x0, y0, x1, y1] | hook, full-bleed | 1:1 0.63x, 9:16 ..., 16:9 ... | A1 |

## Beat sheet

| # | Scene | Window (s) | In | Picture and move | Words | Tags (fact) |
|---|---|---|---|---|---|---|
| 0 | lockup (wrap) | frame 0, rebuilt from | | | | |
| 1 | hook | 0.00-2.50 | circle | hero, full-bleed, pull back 1.16 to 1.02 | | |
| 2 | | | wipe | | | |
| 3 | | | split | | | |
| 4 | | | shape | | | |
| 5 | lockup | | wipe | | | |

## Per beat

### Hook, 0.00 to 2.50

| Layer | Kind and size | Position (pin) | Image, fit, focus | Move (kb, drift, depth) | Enter / keys / exit |
|---|---|---|---|---|---|
| | | | | | |

- Words sit on: <a quiet part of the photo / a scrim / the page>; contrast measured <n>:1.
- Tags: <text> on <target> (fact F<n>), lands at <t>.

### ...

## Transitions

| At (s) | From | To | Mask | Notes |
|---|---|---|---|---|
| 0.00 | lockup | hook | circle from the centre | the hook's own bg inside the mask |

## Other formats

| Format | Scene | Layer | Patch | Why |
|---|---|---|---|---|
| 9:16 | hook | HERO | `full: false, pin: 't', y, w, h` | the picture above the words |
| 16:9 | hook | HERO | `pin: 'l', x, w, h` | the picture beside the words |

## Loop seam

- Frame 0 shows the lockup at rest. The first scene's mask covers it from 0.00; it leaves under the cover (wrap exit) and is rebuilt from <t>.
- Every Ken Burns move and drift ends by <t>; the last spring settles at <t> s; typing ends at <t> s; frames <n> to <N-1> are a still hold equal to frame 0.

## Review stills

Written by `render.mjs stills` (and `--format 9:16`, `--format 16:9`): each transition half-way, each scene at rest, each carousel step and slider stop, the end of each move, frame 0 and the last frame, plus `stills/contact.png`.