
The time wheel
Pickers, 3D, Physics
NewFree
The Run workflow button of an automation tool: a graphite pill seen from above, with a row of domino tiles standing on it in a gentle curve. Pressed, the first tile falls and the chain reaction runs across the button, faster and faster, one tile after the other, while the label follows the steps of the workflow until Workflow complete. The tiles are truly simulated rigid bodies, turning on their edge and leaning on one another; then they stand up again backwards, like a film rewound.
A folder that runs on its own: index.html, style.css, script.js and the libraries from a CDN. The React and Vue tabs hold the same demo as a ready component, which switches its animations off when it leaves the page.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>The domino button</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/geist@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the domino button: the Run workflow button of an automation tool, a graphite pill seen from above with a row
of tiles standing on it in a gentle curve. Pressed, the first tile falls and the chain runs across the pill,
one step of the workflow after the other -->
<div class="domino" data-domino>
<div class="pill" data-pill>
<canvas class="pill__scene" aria-hidden="true" data-scene></canvas>
<!-- the words lie on the pill's top, in its perspective: real text, laid there by the script -->
<span class="pill__label" aria-hidden="true" data-label>
<span class="pill__icon" data-icon><svg viewBox="0 0 24 24"><path d="M8 5.6v12.8c0 .8.9 1.3 1.6.8l9.4-6.4c.6-.4.6-1.2 0-1.6L9.6 4.8C8.9 4.3 8 4.8 8 5.6z"/></svg></span>
<span class="pill__word" data-word>Run workflow</span>
</span>
<!-- the real button: a transparent area over the pill -->
<button class="pill__hit" type="button" aria-label="Run workflow" aria-describedby="domino-note" data-hit data-autoclic></button>
</div>
<p class="note" id="domino-note"><span data-steps>4 steps</span> · <span data-last>last run 2 hours ago</span></p>
<p class="sr" aria-live="polite" data-live></p>
</div>
</main>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script>
<script src="script.js"></script>
</body>
</html>Change values, colours and text with the controls and watch the animation respond live. Or write in the code yourself. Then download the folder with your changes.
27 values to change
With the Animorio connector, Claude Code takes it from here, guide included, and fits it into your project. Paste this request:
Take “The domino button” from Animorio and fit it into my siteEach tile is a rigid body turning on the front edge of its base. Its centre of mass sits at half its height and half its thickness: its height above the top, (t/2)·sin a + (h/2)·cos a, is the tile's energy, and the tile stays up until its angle passes arctan(t/h), then gravity makes it fall faster and faster, like an inverted pendulum. The finger's push is a starting speed PUSH times the one just enough to tip it.
A fallen tile leans on the next: the angle at which it does is the one that puts its top edge exactly on the other's back face, found by bisection. So the whole fallen part of the chain depends on one angle only, the front tile's, and when the front tile lies down on the top the others stop like shingles, each on the next.
The falling part has an energy and an inertia that change with the angle: the inertia is the sum of each tile's times the square of how much it turns when the first one turns, worked out with finite differences. The equation of motion comes from the Lagrangian, q″ = (−V′ − I′·q′²/2) / I, integrated in ten steps per frame with the step capped at 1/30 of a second. At every hit the new tile joins the body and the chain keeps KEEP of its energy: that is why it starts slowly, speeds up and then runs at a steady speed, like a real chain.
The pill, the tiles and the shadows are a small model drawn on a canvas every frame: a camera raised 56 degrees projects the points with a touch of perspective, the faces turned away (told by the way they wind on the screen) are not drawn, the tiles go from the farthest to the nearest, and each face takes its light from a lamp. The shadows are the eight corners of each tile projected onto the top along the light, wrapped in a convex hull and all drawn together on a separate canvas, so where they overlap they do not get darker.
The label is real HTML text, laid on the pill's top with a matrix() made of two projected vectors, and it sinks with it. During the fall the script records the angles of every frame: the return is that recording played backwards in REWIND seconds, so the tiles stand up exactly as they fell, from the last to the first. When nothing moves the canvas is not redrawn.
| Name | File | Default | What it changes |
|---|---|---|---|
TILES | script.js | 15 | How many tiles stand in the row (the pill grows longer with them). |
GAP | script.js | 23 | The distance from one tile to the next, in pixels (a tile is 54 tall). |
GRAVITY | script.js | 950 | The pull on the tiles, in pixels per second squared: less is slow motion. |
PUSH | script.js | 1.25 | How hard the press pushes the first tile (1 = just enough to tip it). |
KEEP | script.js | 0.66 | The share of the energy the chain keeps at every hit. |
CURVE | script.js | 14 | How much the row bends, in pixels. |
DONE | script.js | 2.8 | The seconds the button says Workflow complete before the tiles stand up again. |
REWIND | script.js | 1.2 | The seconds of the rewind. |
TREMBLE | script.js | 1 | How much the tiles near the pointer tremble. |
STEPS | script.js | ['Fetching new orders', 'Enriching contacts', 'Updating the CRM', 'Posting the summary'] | The jobs of the workflow the label goes through while the chain runs. |
For the button that starts something made of steps in a row: an automation workflow, a pipeline, an import, an email sequence. The chain says without words that one step sets off the next. It works on its own, at the spot on the page where the main action is launched.
The drawing scales to the width of the screen (at 390 pixels the pill is about 350 wide) and nothing spills over. A tap presses the pill, which sinks under the finger; the trembling as the pointer passes is for the mouse only.
Nothing falls: the standing row fades into the fallen one, with its coloured backs, and the label goes straight to Workflow complete; the return is the same fade backwards. The pill does not sink and the tiles do not tremble.
GSAP 3.15.0, Geist (font variabile) 5.3.0.
Compressed with gzip, the three demo files weigh 12 KB; the libraries: GSAP 28 KB.
Tested on 5 October 2026
Use it in your own projects and in your clients’ projects. Do not resell it or redistribute it as is. GSAP stays under its own Standard license. Full license.
With your account’s email and password.
or with your email
You’re signed in as .
With your account, you can download the zip of every animation and every pack, for free.