DESIGN.md@plugins/motion-launch-videos/skills/motion-ui/templates · git:20260929.b84e32a · 2026-09-29 · sha256 58365feeeed4c3d7

DESIGN.md@plugins/motion-launch-videos/skills/motion-ui/templates git:20260929.b84e32aA

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

# Design: <film>

The spec the film is built from. Numbers here and in the FILM config agree; when one changes, change both. Screen layers are traced from the user's screenshots in screen units; callout baselines are settled after the first build, from the cap heights `render.mjs layout` reports.

## Canvas and device

- 1080 x 1080, 60 fps, 12.000 s = 720 frames, hold loop.
- Live area 104 to 976 on both axes (margin 104). The device at rest, callouts and the lockup stay inside it; the device's shadow may bleed.
- Baseline unit 8 px: every callout and lockup baseline is a multiple of 8.
- Tempo 120 BPM: beat 0.5 s, 16th 0.125 s, bar 2 s. Every action starts on a 16th.
- Device: <phone / tablet / browser>, screen <w> x <h> units (from the screenshots at <n>x), scale <s>, centre (<x>, <y>), box <x0, y0, x1, y1> on the canvas.

## Formats

Delivered: <1:1 / 9:16 / 16:9>. Positions below are in the 1080 x 1080 base; each other format is a patch in `FILM.formats` (engine.md, Formats). Say for each where the device and the words go, and what the patch changes.

| Format | Canvas | Device (centre, scale, box) | Callouts (position, pin, leader side) | Other changes | Composition |
|---|---|---|---|---|---|
| 1:1 | 1080 x 1080 | (<x>, <y>), <s>, <box> | right column, leaders left | | <lean> |
| 9:16 | 1080 x 1920 | (<x>, <y>), <s>, <box> | centred above the device, pin t, leaders down | <enter/exit offsets, zoom place, lockup size> | <lean> |
| 16:9 | 1920 x 1080 | (<x>, <y>), <s>, <box> | the column beside the device | | <lean> |

## Palette

| Role | Hex | Used for | Source (token, file or screenshot) | Contrast on its backdrop |
|---|---|---|---|---|
| bg | | the film's background | | |
| ink | | text, the device body | | |
| paper | | screen background, cards | | |
| line | | dividers, skeleton bars | | |
| muted | | secondary text, small print | | |
| brand | | buttons, the leader dot, the icon | | |
| tint | | the brand's light tint: fields, done states | | |
| shade | | the device shadow | | |

Crossfades stay in one hue (brand to tint, line to brand); scrims, ripples and the finger are neutral.

## Type roles

| Role | Face | Size rule | Use |
|---|---|---|---|
| ui | Inter 600 | 24 to 32 units | UI labels, buttons, the clock |
| display | Inter Tight 800 | cap 44 to 56 px (callouts), 36 to 44 units (titles) | callouts, large titles, the lockup name |
| mono | IBM Plex Mono 500 | 24 to 34 px | the domain, small print |

## Screens

One table per screen, traced from its screenshot. Say what was simplified.

### <screen id> (from <screenshot file>)

| Layer | Type | Box (x, y, w, h) | Paint | Text / notes |
|---|---|---|---|---|
| | | | | |

- Simplified: <rows cut, text turned into bars, ...>
- Status bar: <status role>; fixed layers: <...>; content height: <n> units.

## Script

| Beat | Time (s) | Action | Target | Notes |
|---|---|---|---|---|
| 0.25 | 0.125 | device enters | | from dy <n>, LIFT |
| | | pointer in | | |
| | | tap | | the pointer lands at <t> |
| | | push / expand | | |

## Callouts

| Id | Words | Position (x, baseline) | Names | In to out (s) |
|---|---|---|---|---|
| | | | | |

## Camera

- Focus on <id> at z <z>, placed at <fx, fy>, from <t> to <t>; back at rest by <t> (ZOOM settles 2 s after it starts).

## Loop seam

- Frame 0 shows the lockup at rest. It leaves at 0.00 (wrap exit, EXIT, 32nds by layer) and is rebuilt from <t>.
- The device waits at dy <n> (off the canvas, shadow included) before it enters, and leaves to the same place.
- The pointer is out, every caret has stopped, and the camera is at rest before the lockup.
- The last change is at <t> s (<what>); frames <n> to <N-1> are a still hold equal to frame 0.

## Review stills

Written by `render.mjs stills`: each tap, transition, state change, overlay and zoom, each callout landed, frame 0 and the last frame, plus `stills/contact.png`.