
The variable weight menu
Menus, Text, Hover, Physics
NewFree
A big Get started button made of translucent strawberry jelly, a real soft body with forty eight points round its edge, shape springs and a pressure that keeps its volume. The pointer coming from outside dents the surface until it slips inside, and the jelly trembles; pressed, it squashes under the finger and bounces back with a wobble that dies away; pulled and let go, it vibrates. The words are inside the jelly and bend with it, letter by letter.
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 jelly button</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/fredoka@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the jelly button: a soft body of strawberry jelly drawn on a canvas, under a real transparent button. The
pointer dents its surface, a press squashes it under the finger, a pull stretches it, and it wobbles back.
The words are inside the jelly and bend with it -->
<div class="jelly" data-jelly>
<div class="jelly__pot" data-pot>
<canvas class="jelly__canvas" data-canvas aria-hidden="true"></canvas>
<button class="jelly__btn" type="button" data-btn data-autoclic><span class="sr" data-name>Get started</span></button>
</div>
<p class="jelly__hint" data-rise><span data-hint>Free for 14 days · no card needed</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.
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 jelly button” from Animorio and fit it into my siteThe edge of the jelly is made of 48 points, evenly spaced round the outline of a rectangle with round ends. Each point remembers where it was and where it is: its new place comes from the last two, the forces and a damping (Verlet integration), in six steps per frame with the step capped at 1/30 of a second. When the points' energy falls below a threshold and nothing touches them, the loop stops drawing.
Each point is pulled towards the place the shape at rest would give it round the body's current centre (shape matching), and the centre is pulled towards the table, a little lower so the jelly leans its weight on it. Between neighbours there are length springs and a bending spring, which keeps each point where its two neighbours put it at rest: so the edge bends in soft waves instead of crumpling. A pressure along the normals keeps the area, and a dent on one side bulges the other.
The pointer is a fingertip POKE pixels wide. From outside it pushes the surface inwards: each point it covers slides along its normal at rest to the far side of the tip, and loses the speed that would bring it back against it, so the dent wraps round the tip and follows it. When the tip is more than POP pixels inside the shape, it slips in and the dent springs back out at once. Inside, the pointer's speed drags the nearby points.
A press squashes the shape the springs aim for (lower by SQUASH, wider by almost half as much) and sinks the top edge under the finger with a gaussian. Let go, the shape comes back at once and the springs throw it past: the bounce and the wobble come from the physics, not from a curve. Pulled, the points near the grip follow the hand up to PULL pixels, with a hyperbolic tangent that brakes the stretch.
Each letter has its centre at rest; its mean value coordinates against the 48 edge points carry it into the jelly as it is now. Two neighbouring points, four pixels to the right and below, give the local stretch, shear and turn: that is the matrix the canvas draws the letter with. So the words squash, bend and wobble with the jelly, and stay sharp text.
The body is filled with a gradient from light pink at the top to deep red at the bottom, with light gathered low in the middle; the edge has a light rim inside, where the jelly is thin, and a fine dark line. The glossy band and the reflection follow the edge points moved inwards along the normals, and the shadow on the table widens and fades when the jelly jumps.
| Name | File | Default | What it changes |
|---|---|---|---|
STIFF | script.js | 380 | How hard the jelly pulls back into its shape: higher wobbles faster. |
DAMP | script.js | 3.4 | How quickly the wobble dies away: the share of its speed it loses each second. |
SQUASH | script.js | 0.2 | How much a press squashes the jelly, as a share of its height. |
POKE | script.js | 18 | The size of the fingertip, in pixels: how wide a dent the pointer pushes. |
POP | script.js | 22 | How deep the pointer pushes the surface in, in pixels, before it slips inside. |
PULL | script.js | 60 | How far a held jelly stretches after the hand, in pixels. |
WAIT | script.js | 1.8 | The seconds the pretend sign up takes. |
DONE | script.js | 2.8 | The seconds the button says You’re in before it is ready again. |
For the main call to action of a playful product: an app for children or for food, a game, a creative tool, the launch page of a startup that wants to look friendly. It works on its own on a light background, with plenty of room round it so the jelly can jump; the colour changes in the CSS variables (the comments have mint too).
The jelly narrows to the width of the screen (at 390 pixels it stays 300 wide) and the canvas does not spill over. The finger has no hover: a touch presses the jelly where it lands, squashes it under the fingertip and makes it bounce when it lifts; dragging stretches it, and the button keeps touch-action: none so the finger pulls the jelly instead of scrolling the page.
The jelly does not move: no drop, no dents, no bounces or jumps. Pressed it darkens slightly, the words and the line below change with a fade, without rising. The drawing is redone only when something changes.
GSAP 3.15.0, Fredoka (font variabile) 5.3.0.
Compressed with gzip, the three demo files weigh 13 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.