Motion graphicsAiky @0xAiky2026-10-180:14

Code-based UI motion design loop

Views
9.8K
Likes
147
Replies
8
Saves
159

A looping UI motion design video rendered entirely in code (no After Effects) using Claude Opus 5.5, built from an open-sourced structured prompt template specifying UI states, spring animations and beat-synced edits, rendered with Playwright and ffmpeg.

Full prompt2,757 chars

<inputs>
Ask me for: 8 to 12 UI states I want the shape to transform into (e.g. button, loader, player, slider, toggle, tabs, chart, command palette, toast), pure black and white or one accent color, and a royalty-free song around 120 BPM (e.g. Mixkit, free for commercial use).
</inputs>

<direction>
Dribbble-level UI motion. One shape, no cuts: every state is the same element morphing its size, radius and color while its content swaps with a quick blur.
A cursor controls every change with real clicks and drags. Light warm-gray canvas, black and white components, one clean UI font (Geist).
Springs everywhere, with only a tiny overshoot. The camera zooms so each state fills the entire frame. The last frame matches the first frame, so it loops perfectly.
Banned: bouncy easing, particle bursts, glows, gradients on UI chrome, mismatched icon strokes, dead time, anything that looks like a template.
</direction>

<structure>
120 BPM, 7 bars, something happens on every beat.
Button → loader → check → dynamic island → music player with a play/pause morph → scrub the progress bar → it becomes a volume slider that stretches when dragged past max → a toggle flips on the beat → the knob becomes a liquid tab indicator → the tabs expand into a chart that draws itself, with a tooltip on hover → it collapses into ⌘K → type to filter → enter → toast → back to the button.
</structure>

<build>
One HTML file, square 1440x1440. Every style is calculated from time inside seek(t): no CSS transitions, no timers, no state carried between frames.
Springs use closed-form step responses. A value that changes targets multiple times is the sum of one spring per change, so it remains a pure function of time.
The tab indicator's two edges follow different springs, so the leading edge stretches ahead of the trailing one. Use the same trick for the toggle knob.
Drags use direct manipulation: while the cursor is held, the value is calculated from its position. On release it springs back from wherever it was.
Analyze the song with numpy to find the beat grid and start on a downbeat. Position every UI sound by its measured peak.
Render with Playwright: 4 subframes per frame, blended with ffmpeg tmix for motion blur at 60fps.
Render one frame per beat before the full render. Fix anything off the grid, cramped or difficult to read.
</build>

<gotchas>
Never put will-change on anything the camera scales or the text becomes blurry.
Text that swaps inside a morphing container needs its own enter and exit timing or it overlaps.
Make the final frame identical to the first, including cursor position and speed, or the loop stutters.
</gotchas>

<start>
Ask me for the inputs, then show me the state list on the beat grid before writing any code.
</start>

Source: the original post. Kept in its original language, unedited.

Tools the creator mentioned

PlaywrightffmpegNumPy

Original post: https://x.com/0xAiky/status/2111814234090693110

All works are open data at GitHub · awesome-opus-5.5-video.

Model attribution is as stated by the creator and was not independently reproduced. View counts are a snapshot from 2026-10-19. The work belongs to its creator; DM @GoSailGlobal on X for corrections or removal.

More motion graphics