
The dinosaur-bitten logo
Intro, SVG, Text
NewFree
A minimal-style text animation: a fashion photographer’s menu sits on the face of a clock. The words turn on an ellipse, the one in front gains weight, the others fade lighter and vanish behind the horizon; at every step the minute hand makes a full turn. On arrival the dial moves closer and runs through the categories, then it becomes the menu. Remade from scratch from an idea on Meech213.
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 clock dial menu</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/fraunces@5.3.0/full.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage" data-stage>
<header class="top">
<span class="brand">Velure</span>
<span class="what">Photography and film</span>
</header>
<!-- the dial: words on an ellipse, a hairline horizon, ticks and two clock hands; the script places everything -->
<nav class="dial" data-dial aria-label="Menu">
<svg class="rim" data-rim aria-hidden="true"></svg>
<ul class="items" data-items role="list"></ul>
<div class="clock" aria-hidden="true">
<span class="hand hand--hour" data-hour></span>
<span class="hand hand--minute" data-minute></span>
<span class="pin" data-pin></span>
</div>
</nav>
<p class="hint" aria-hidden="true">Click a word to turn the dial</p>
</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.
16 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 clock dial menu” from Animorio and fit it into my siteThe dial is a box twice as wide as it is tall. The centre of the ellipse is at half the width and at 84 per cent of the height, the radii are 38 per cent of the width and 52 of the height: so the words at the top stay inside the box and the ones at the bottom end up under the horizon. Everything that moves depends on three numbers, the rotation, the zoom and how visible it is, which GSAP animates; a single function on GSAP's ticker puts every word, every tick and the hands in place with sine and cosine.
The list of pages goes round the dial twice, like the numbers on a clock: with five pages there are ten places, 36 degrees apart. The place in front is at minus 45 degrees, top right. For every word the distance from that place, softened with smoothstep, sets the weight (from LIGHT to HEAVY), the optical size, the scale and the shadow; the sine of the angle says whether it is above or below the horizon, and below it the opacity drops to a tenth and then to zero.
To bring a page in front the script looks for the rotation closest to the current one that puts it in the front place, so the wheel always takes the shorter way, forwards or backwards. The tween lasts 1.18 seconds with power4.inOut. The hands have no tween of their own: they are worked out from the rotation, a full turn of the minutes and an hour of the hours for every word, so they start, brake and stop with the wheel.
On arrival the dial grows to 1.5 in 0.82 seconds, with its origin at the bottom, and takes a step every 0.87 seconds through the categories; then it goes back to the first page and to zoom 1 in 0.93 seconds, the category labels go out in 0.24 seconds one every 0.018 and the pages light up in 0.52 one every 0.04. The zoom stops earlier if the widest word would leave the screen. If nobody clicks, a new timeline visits two pages, goes back to the first, fades and starts again; every click stops the one running and builds a new one from where the wheel is.
| Name | File | Default | What it changes |
|---|---|---|---|
PAGES | script.js | 'Index, Work, Films, About, Book' | The pages of the menu, separated by commas, three to six. |
CATEGORIES | script.js | 'Editorial, Beauty, Campaigns, Portraits, Music' | The categories the intro runs through, one per page. |
STEP_TIME | script.js | 1.18 | The seconds the dial takes to bring the clicked word in front. |
INTRO_STEP | script.js | 0.87 | The seconds of every step while the intro runs through the categories. |
ZOOM | script.js | 1.5 | How much the dial grows during the intro (it stays smaller if the screen is narrow). |
PAUSE | script.js | 1.4 | The seconds the menu rests on a page before the next one, when nobody clicks. |
LIGHT | script.js | 250 | The weight of the words at the sides (100 to 900). |
HEAVY | script.js | 560 | The weight of the word in front (100 to 900). |
For the menu of a site that lives on images and wants a navigation that is a gesture in itself: a photographer, a fashion studio, a director, a magazine, an archive with a few sections. It works well as an opening that shows the categories and then stays on as the menu.
The same animation with the sizes adapted: the dial takes the width of the screen and its height into account, the type shrinks with it and the intro zoom stops where the widest word would touch the edge. A tap on a word turns the dial.
Nothing turns and nothing grows: at every step the dial fades out and back in with the new word in front, and the categories give way to the pages with a fade.
GSAP 3.15.0, Fraunces (font variabile) 5.3.0.
Compressed with gzip, the three demo files weigh 5.9 KB; the libraries: GSAP 28 KB.
Tested on 22 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.