
The wrecking-ball logo
Intro, Physics, SVG, Text
NewFree
In the minimal style: words inside bubbles drawn with a single line, rising slowly towards a thin rule. They knock into each other with real soft-body physics and share a flat wall where they press; when two words that belong together touch, their bubbles merge into a bigger one with the two words side by side, taking on weight. Under the rule the bubbles gather, push it up and pop in a small ring; a click pops one, a click on the empty page blows a new one.
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>Words in bubbles</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/archivo@5.3.0/wdth.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- words in hairline bubbles rising to a surface: two words that belong together merge when they touch -->
<main class="stage" data-stage>
<svg class="field" data-field aria-hidden="true">
<path class="surface" data-surface d="" />
<g data-bubbles></g>
<g data-rings></g>
</svg>
<div class="words" data-words aria-hidden="true"></div>
<p class="hint" data-hint>Click a bubble to pop it, or the empty page to blow a new one.</p>
<p class="said" data-said aria-live="polite"></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.
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 “Words in bubbles” from Animorio and fit it into my siteEvery bubble is a closed SVG path, redrawn every frame from 72 points around its centre: at each angle the radius is the circle's, plus an oval-shaped wobble, minus what its neighbours and the rule take away. The points are joined with a smooth curve (Catmull-Rom written as Bézier curves), so even where the bubble flattens there are no sharp corners. The word is an HTML element centred on the bubble's point, with its weight and width written in font-variation-settings.
The physics is our own, in fixed steps of 1/120 of a second inside gsap.ticker. Every bubble has an upward push that brings it to its speed (bigger, faster), a sideways sway and a little drag. Two bubbles that overlap push apart like two damped springs, in proportion to how far they press into each other: that is why they can press together by a few pixels. In the drawing, where two circles overlap the radius stops on the plane where the two circles cross (the radical plane): both bubbles get the same straight wall, as in foam. A knock starts an oval wobble, a damped spring along the direction of the knock.
Two words of the same pair attract each other with a small constant force and, as they come closer, take on a little weight. When they touch a single bubble is born at their centre of mass, with the area of the two together (or more, if the two words side by side do not fit). For a moment its outline is the soft union of the two old circles (a soft maximum, which makes a neck as between two drops) and a GSAP tween takes it to the new circle; then a kick to the wobble makes it swing along the line of the two bubbles. The words slide into place and take their weight and width with elastic.out; if they have to swap sides, one passes over the other.
The rule at the top is a string: a damped wave equation over a hundred or so points. A bubble that touches it pushes it up by three quarters of how far it presses in, and the rest is the bubble flattening against it. After a moment of pressure the bubble pops, the string is free and drops back with a few waves. Under the rule the bubbles attract each other a little, like cereal floating in milk, and make a small raft.
As it pops, the bubble's line becomes an SVG circle that widens by almost half, thins and fades; the letters spread, lose weight and vanish, and the bubbles nearby get a push and a wobble. The bubbles arrive on a fixed schedule with a random number that always restarts from the same seed, and the round starts again only when the page is empty and the rule is still: so every round is identical to the first. With reduced motion the physics runs all at once out of sight, half the pairs appear already merged and the bubbles stay still; a click fades them out.
| Name | File | Default | What it changes |
|---|---|---|---|
PAIRS | script.js | ['moon light', 'sea salt', 'slow motion', 'still life', 'free fall', 'paper plane'] | The pairs of words that belong together, two words per entry (up to 8 pairs, 12 letters a word). Every round sends them all up. |
RISE | script.js | 56 | How fast the bubbles rise, in pixels a second. |
SWAY | script.js | 12 | How much they sway sideways as they rise, in pixels a second. |
PULL | script.js | 1 | How strongly two words that belong together seek each other: at 0 they merge only if they meet by chance. |
SOFTNESS | script.js | 1 | How much the bubbles flatten when they press together: 0.4 is stiff, 2 is soft. |
LIGHT | script.js | 320 | The weight of the type of a word on its own, from 100 to 900. |
HEAVY | script.js | 600 | The weight two words take when they merge. |
LINE | script.js | 1 | The thickness of the bubbles' line, in pixels. |
To say that things belong together: the pairings of a restaurant or a wine bar, the services of a studio that complete each other, the keywords of a portfolio, an event page with its themes. It also works on its own as a calm, playful opening, or as a waiting page you can touch.
The same physics with the sizes adapted: words and bubbles a little smaller relative to the page and the column wider, nearly the full width. A tap on a bubble pops it, a tap on the empty page blows a new one.
Nothing rises and nothing sways: the physics runs all at once out of sight, half the pairs appear already merged in blue and the bubbles stay still in the middle, fading in. A click on a bubble fades it out, with no widening ring; when they are all gone, the group fades back in.
GSAP 3.15.0, Archivo (font variabile) 5.3.0.
Compressed with gzip, the three demo files weigh 12 KB; the libraries: GSAP 28 KB.
Tested on 16 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.