
The word behind fluted glass
WebGL, Text, Hover
NewFree
A minimal-style WebGL animated headline: a word printed on a pale linen panel, in the middle of a warm white page. The pointer pinches the cloth and pulls it: the fabric follows the finger and the folds run along the pull, sculpted by the light, while the panel's shadow widens. Let go and the linen springs back and settles; a tap leaves a crease that slowly relaxes.
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>Ordo Linen</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/fraunces@5.3.0/index.css">
<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>
<!-- a word printed on a swatch of linen: the pointer pinches the cloth and pulls it, the folds run along the pull
and spring back when you let go; a tap leaves a crease that slowly relaxes -->
<main class="pagina" data-pagina>
<canvas class="tela" aria-hidden="true" data-tela></canvas>
<div class="ripiego" aria-hidden="true"><span data-ripiego>Woven</span></div>
<h1 class="parola" data-parola>Woven</h1>
<header class="testa">
<p class="marchio" data-entra>Ordo Linen</p>
<p class="testa__nota" data-entra>Washed linen, cut to order</p>
</header>
<footer class="piede">
<p class="nota" data-entra data-nota>Pinch and pull the cloth, tap to crease it</p>
<p class="stato" data-entra>Cloth <span data-stato>resting</span></p>
</footer>
</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.
20 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 linen headline that wrinkles” from Animorio and fit it into my siteEverything is a single WebGL 2 fragment shader on a triangle as big as the page. For each pixel a function, stoffa(p), says two things: how high the cloth is there, in pixels, and where the linen lying there comes from, that is how far it has been pulled from its place. The folds are the height; the weave, the ink and the hem are read at the original point, so they move with the fabric.
Each grip has the point where the linen was taken and the point where the finger is now. The linen near the grip moves with the pull, with a Gaussian weight as wide as REACH. The folds lie along the segment between the two points, a little behind it too, and are a cosine across the pull: a higher ridge in the middle and two or three lower ones at the sides, as deep as the pull is long.
The slope comes from the screen derivatives, dFdx and dFdy, so the cloth function is called only once per pixel, and becomes a normal; the light comes from the top left, with a faint sheen. The weave is a grid of THREAD-pixel threads, warp and weft alternating over and under as in plain cloth, each thread with its own random thickness and a few paler slubs; where the threads get thinner than a pixel the weave fades, so it does not shimmer.
The grips live in JavaScript: held, the cloth follows the finger on a stiff spring with a hint of lag; released, it goes back on a softer spring that overshoots a little; a tap's crease is born already pulled in a random direction and returns slowly. There are at most four grips, and one that is back in place is removed.
Under the panel there is a soft shadow computed from a rounded rectangle; where the cloth lifts the shadow drops a few pixels and blurs more, as under a cloth held between the fingers.
| Name | File | Default | What it changes |
|---|---|---|---|
WORD | script.js | Woven | The word printed on the linen. |
REACH | script.js | 1 | How wide the finger's grip on the cloth is: higher, wider and longer folds. |
FOLDS | script.js | 1 | How deep the folds are. |
SPRING | script.js | 1 | How stiff the spring that brings the cloth back is: higher, it returns sooner and wobbles less. |
CREASE | script.js | 1 | How strong the crease left by a tap is. |
THREAD | script.js | 2.4 | The thickness of a linen thread, in px. |
WEIGHT | script.js | 560 | The weight of the word. |
As the opening headline of a linen workshop, a fabric shop, a tailor or a clothing brand; behind the name of a hotel or a holiday home that makes a point of its textiles; on a textile product page, where the fabric should feel touchable even through the screen.
The same animation: the panel is sized on both width and height and stays inside the frame with space around it; a finger presses and drags the cloth, a tap creases it. Without a mouse there is no pointer dimple, and the line at the bottom says press instead of pinch.
The linen is already flat and still with the word printed: no folds, no springs, no fake hand. The labels fade in.
GSAP 3.15.0, Fraunces (font variabile) 5.3.0, Archivo (font variabile) 5.3.0.
Compressed with gzip, the three demo files weigh 9.4 KB; the libraries: GSAP 28 KB.
Tested on 24 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.