
The needle gauge
Counters, Physics, SVG
NewFree
A phone’s contacts with the A to Z index on the edge: dragging a finger along the index the nearby letters swell out from the edge along an arc, the letter under the finger becomes a big bubble beside it, and the list jumps to the people with that initial with a little kick for every letter passed. Letting go, the arc sinks back on a spring.
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 alphabet index</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/figtree@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- a contacts list with the A to Z index on its edge. Drag along the index: the letters near the finger swell
out from the edge along an arc, the letter under it grows into a big bubble beside it, and the list jumps to
that letter with a small kick for every letter passed. Letting go, the arc sinks back on a spring -->
<section class="book" aria-labelledby="book-title" data-book>
<header class="book__head">
<h1 class="book__title" id="book-title">Contacts</h1>
<p class="book__sub">Everyone you know</p>
</header>
<div class="book__body">
<div class="book__list" tabindex="0" aria-label="Contacts" data-list>
<div class="book__shake" data-shake></div>
</div>
<!-- the index: the swollen track, the letters, and the bubble with the letter under the finger -->
<div class="index" data-index>
<svg class="index__track" aria-hidden="true" data-track><path data-track-path/></svg>
<div class="index__letters" role="listbox" tabindex="0" aria-label="Jump to letter" aria-orientation="vertical" data-letters></div>
<div class="bubble" aria-hidden="true" data-bubble>
<svg class="bubble__shape" viewBox="-60 -60 120 120"><path class="bubble__shadow" data-bubble-path/><path class="bubble__shadow" data-bubble-path/><path data-bubble-path/></svg>
<span class="bubble__letter" data-bubble-letter>A</span>
</div>
</div>
</div>
<p class="sr" aria-live="polite" data-live></p>
</section>
</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.
19 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 alphabet index” from Animorio and fit it into my siteThe finger’s position on the index becomes a continuous number, in letters: 0 at the middle of A, 25 at the middle of Z. From it the chosen letter: the number rounded, but only once the finger has passed the border between two letters by HYSTERESIS (so it does not flicker on the border); if the letter is empty, the nearest one with people is taken, looking first in the finger’s direction.
Every letter has a distance d from the finger, in letters, and from it a bell g = exp(-d²/2σ²) with σ = SPREAD, multiplied by how swollen the arc is. The letter moves out from the edge by BULGE × g pixels and grows by 1 + (GROW − 1) × g; to make room, all of them shift by a hyperbolic tangent of the distance, up above the finger and down below. The pale band is an SVG path taken from the same bell.
How swollen the arc is is a number on a lightly damped spring (SWELL): pressing it goes to 1, letting go it returns to 0 with a small bounce. The arc’s centre follows the finger on a stiff spring too, and the bubble follows the chosen letter. The springs are stiff, so every frame is split into steps of at most 1/120 of a second, with the frame capped at 1/30.
At every new letter the list’s scrollTop runs to the letter’s header on a stiff, nearly critical spring. A second spring, lively and lightly damped, gets a push of speed in the finger’s direction, stronger if more than one letter was passed, and moves the list a few pixels with translateY: that is the kick. Where the phone allows it, navigator.vibrate gives a tap as well.
The index is a listbox with aria-activedescendant, the letters are options and the empty ones have aria-disabled. The arrows go to the next or previous letter with people, Home and End to the ends, a typed letter goes there; the arc swells and sinks back a moment after the last key. A click on a letter (from the keyboard too) slides the finger there by itself, with GSAP.
| Name | File | Default | What it changes |
|---|---|---|---|
BULGE | script.js | 44 | How far the letter under the finger moves out from the edge, in pixels. |
SPREAD | script.js | 2.3 | How many letters on each side the arc reaches: the width of the bell. |
GROW | script.js | 1.9 | How much the letter under the finger grows. |
SWELL | script.js | [260, 0.5] | The arc swelling and sinking back: the strength of the spring and its damping (1 = no bounce). |
HYSTERESIS | script.js | 0.18 | How far past the border between two letters the finger goes before the letter changes, in letters. |
KICK | script.js | 5 | The list’s kick at every letter, in pixels. |
HAPTICS | script.js | true | A tiny vibration at every letter, on phones that allow it. |
For any long list in alphabetical order: contacts, customers, the artists of a music library, glossaries, lists of cities or countries, ingredients. With fewer than about forty entries the list scrolls easily on its own and the index is not needed.
It is made for the finger: the index has touch-action: none, so dragging along it does not scroll the page, and pointer capture keeps hold even if the finger slips off the edge. The frame is as wide as the screen minus 32 pixels and as tall as the screen allows; the list scrolls normally with the finger. Nothing spills over sideways.
The letters neither move nor grow, the band does not swell and the list does not kick: the chosen letter lights up, the bubble fades in beside it and stays a moment, and the list goes straight to the letter.
GSAP 3.15.0, Figtree (font variabile) 5.3.0.
Compressed with gzip, the three demo files weigh 10 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.