Motion vocabulary · Device frames
Chat conversation
A WhatsApp-style chat in a phone: typing indicators, messages typed and sent, bubbles that pop, read ticks, auto-scroll.
Live loop · 10 s · 1920×1080 at 24 fps
Parameters
| Parameter | Type | What it does |
|---|---|---|
| src | "/assets/<picture>.jpg" | one of the site's own pictures (a photo, a poster), shown at the frame's width; never a page capture (owner 2026-10-19: rebuild it as `screen`) |
| screen | html string | the screen as the shot's own HTML: the page's elements rebuilt (the default) |
| scroll | [{at, y, dur?}] | sparse scroll moves (sine in-out, default 900 ms) |
| taps | [{at, x, y}] | taps in screen px |
| notifications | [{at, app?, title, body?, hold_ms?}] | banners that drop in |
| messages | [{at, from: "me"|"them", text}] | chat: the conversation |
| url / name / chatPalette | string | browser address; chat contact name; "brand" or "whatsapp" |
| x / y / scale / tilt / enter | px / deg | placement; tilt = rotateY; enter "rise" | "none" |
| lang | "en" | "zh" | the device chrome words ("online", "Message", "now"); default "zh" when the content is Chinese |
| ease | {"<move>": ease} | retune any named move (see the entry's moves): a preset name ("out-expo"), a cubic-bezier [x1, y1, x2, y2], {spring: [hz, damping]} or {trapezoid: [accel, decel]}. A wrong move name or curve throws, it never falls back. A move measured from a reference clip (the replica workbench's measure/*.json, frame-keyed) becomes a curve without conversion: MV.fitEase(doc, "x", {from: 133, to: 142}) or `motion-fit <file> --measure x --from 133 --to 142 --ease` |
| brand | hexDefault: #6B5BFF | the site's brand colour; the component derives its accent (>= 3:1 on the stage), surfaces and ink from it |
| stage | "dark" | "light"Default: "dark" | the stage the component sits on |
| display | font stemDefault: "Inter-Bold" | headline stem; name it in the call so the runtime loads it |
| body | font stemDefault: "Inter-Regular" | UI / body stem; name it in the call so the runtime loads it |
| start_ms | msDefault: 300 | when the component starts, ms into the shot |
| background | booleanDefault: false | draw the stage background (off: transparent over the shot's own stage) |
| place | {x, y, w, h, z?} | the component's place in the shot's layout: it fits its 1920x1080 composition into this stage rect (centred, aspect kept); z orders components front to back. Default: the whole stage |
Moves and their curves
Every move is eased on its own. Retune one with ease: { "<move>": <curve> }, a curve name or cubic-bezier handles.
| Move | Curve | What it does |
|---|---|---|
| device.in | out-quart | the device rising 90 px and growing from 0.96x as it enters |
| tap.approach | out-cubic | the finger dot shrinking onto the tap point |
| tap.ring | out-cubic | the ring spreading from the tap |
| note.drop | {"spring":[1.82,0.84]} | a notification dropping in from the top with a small overshoot |
| note.up | in-cubic | the notification sliding back up after its hold |
| chat.scroll | out-quint | the thread scrolling up as each message or typing bubble arrives (360 ms) |
| bubble.pop | {"spring":[2.22,0.82]} | each message bubble popping in from 0.7x |
This demo
| variant | "chat" |
|---|---|
| name | "LaunchReel" |
| chatPalette | "whatsapp" |
| messages | [{"at":1300,"from":"them","text":"Hi! Send me your product link."},{"at":3000,"from":"me","text":"Here it is: launchreel.ai"},{"at":4800,"from":"them","text":"Got it. I planned six shots for your film."},{"at":6600,"from":"me","text":"Looks good. Make the film."},{"at":8200,"from":"them","text":"Rendering now."}] |
| brand | #2F9E6E |
| stage | light |
<script src="/vendor/motion-vocab.js"></script>
MV.bind("s3", MV.device(el, {"variant":"chat","name":"LaunchReel","chatPalette":"whatsapp","messages":[{"at":1300,"from":"them","text":"Hi! Send me your product link."},{"at":3000,"from":"me","text":"Here it is: launchreel.ai"},{"at":4800,"from":"them","text":"Got it. I planned six shots for your film."},{"at":6600,"from":"me","text":"Looks good. Make the film."},{"at":8200,"from":"them","text":"Rendering now."}],"brand":"#2F9E6E","stage":"light","display":"Inter-Bold","body":"Inter-Regular"}));When to use it in a launch film
A product that works in a conversation (support, an assistant, a bot), or a customer's words as proof.
Why it works
Everyone knows how a chat moves, so the viewer reads the content, not the interface.
Do not combine with
- invented customer quotes (only words from the brief or the site)
- more than about six messages in one shot
Job in the film
Natural length
4.0–14.0 s
More device frames
Phone with scroll, tap and notification
A phone rises in, its screen scrolls on eased keys, a tap ripples, a notification drops in.
Laptop with scroll-through
A laptop with the site on screen; the page scrolls through its sections on sparse eased keys.
Browser window
A clean browser window with the product's address, scroll-through, a click ripple and a toast in the corner.