
Words that melt into each other
Text, Scroll, SVG
NewFree
A product launch countdown drawn with a single line: a thin circle draws itself, opens into six arcs that become the number, and every new figure is redrawn from the strokes of the one before. At zero the arcs turn back into the circle. Minimal style.
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 counting circle</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/jost@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage" data-stage>
<!-- one thin line: a circle that draws itself, breaks into arcs and counts down a product launch, each figure
redrawn from the arcs of the one before; at zero the arcs close back into the circle -->
<svg class="figure" viewBox="-90 -62 180 124" role="img" aria-label="Countdown" data-figure>
<g class="line" data-line></g>
</svg>
<p class="caption">
<span class="caption__clip"><span class="caption__name" data-name>Halo</span></span>
<span class="caption__clip caption__state" data-state>
<span class="caption__phrase caption__phrase--soon" data-soon>launches in</span>
<span class="caption__phrase caption__phrase--live" data-live>is live</span>
</span>
</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.
15 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 counting circle” from Animorio and fit it into my siteEvery figure is drawn by hand from straight lines and circle arcs in a box 100 tall: the zero is a stadium (two half circles and two sides), the eight two circles, the six a diagonal running into a circle, the nine is the six upside down. Every figure has exactly three strokes; the ones with fewer (the one, the seven) repeat a piece of a stroke on top of it, where it does not show. Each stroke is sampled into 72 points spaced evenly along its length, so any two strokes have the same points and can be blended.
The line on the page is six paths, always the same ones. The circle is six arcs of 60 degrees; a two-figure number uses three strokes per figure; a single figure takes them twice, one on top of the other. The figures are set side by side by their true width (the width of their points, not of the box), so the one is narrow and the 10 sits in the middle as it would in a good typeface.
At every change the script tries every way of giving the six strokes on the page to the six strokes of the new figure (720) and, for each pair, the stroke turned the other way round as well: it picks the way that moves the line the least, adding up the distances of the points. That is why the 9 grows out of the 10 keeping the ring of the zero, and the 8 out of the 9 keeping its loop: the figure is redrawn from the one that was there.
The movement is one tween on a clock, and every point has its own time: the point at the end of the stroke starts later, by a share TRAIL, and every stroke starts 35 thousandths after the one before. Each point's value goes through the EASE (back.out), so the settling runs along the line like a wave. Meanwhile the tail of the stroke lifts off the page, the more the further it goes, and comes down as it lands: you see the head running and the stroke redrawn behind it. Drawing and wiping are stroke-dasharray, worked out on the true length of each stroke.
A paused timeline only holds the moments (drawing, opening, every second, closing, leaving) with tl.call, and every moment starts its tweens from the state it finds the line in: so the next round starts clean with restart. The line of type below is split into letters that rise and drop out of a window with hidden overflow; the window's width follows the new phrase, and the name gets heavier letter by letter on the wght axis of the variable font.
| Name | File | Default | What it changes |
|---|---|---|---|
START | script.js | 10 | The number the countdown starts from, 1 to 99. |
TICK | script.js | 1 | How many seconds each number stays: 1 is a real countdown. |
MORPH | script.js | 0.56 | How many seconds a stroke takes to redraw itself into the next figure (it always stays shorter than the tick). |
TRAIL | script.js | 0.42 | How far the tail of each stroke lags behind its head: 0 moves the whole stroke at once, 0.8 makes it run like a pen. |
EASE | script.js | 'back.out(1.7)' | How the strokes land: back.out goes a hair past the spot and settles; elastic.out(1, 0.5) bounces more, power3.out stops dead. |
STROKE | script.js | 1.5 | How thick the line is, in hundredths of the figure's height. |
ACCENT_FROM | script.js | 3 | From this number down the line turns the accent colour. |
HOLD | script.js | 2.4 | How many seconds the closed circle stays once the product is live, before it unwinds and starts again. |
For the wait before a launch: a product's coming soon page, the countdown before a live stream, the opening of a sale, the start of an event, the screen before a video. Also as an elegant loading screen for a brand that lives on thin lines and empty space.
The same animation with the sizes adapted: the circle and the number take almost the whole width, the line stays thin in proportion, the type underneath gets smaller. A tap starts it over.
Nothing moves: the circle fades in already drawn, each number fades into the next, at zero it fades into the orange circle and the words change with a fade.
GSAP 3.15.0, Jost (font variabile) 5.3.0.
Compressed with gzip, the three demo files weigh 6.8 KB; the libraries: GSAP 28 KB.
Tested on 14 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.