
Ink that reveals
WebGL, Hover
NewLifetime
A drawing made of thousands of dashes, like an engraving but in relief: it changes shape by flying through a cloud of dust, spins when you drag it and puffs up when you throw it.
A folder that runs on its own: index.html, style.css, script.js and the libraries from a CDN.
The code for this animation is part of lifetime access.
The preview stays open: watch it, slow it down, try it on your phone.
Lifetime accessEach drawing starts on a small 2D canvas, 168 x 210 cells, in shades of grey. For each cell we check how light it is and whether it sits on an edge; if the value beats that cell’s threshold in the 4 x 4 Bayer matrix, a horizontal dash 72% of the cell long is born there. Depth comes from the same value: light parts sit up to 42 units closer.
The dashes are a single four-vertex quad drawn thousands of times with drawArraysInstanced. Each copy carries where it starts and ends in the starting shape and in the target one, its tone, a random seed and the curve of its journey: the shader does the rest, rotation and perspective included.
A single number goes from 0 to 1 in 1.15 seconds (power2.inOut), but every dash reads it offset by its seed: t = uMix × 1.45 − seed × 0.45. Halfway through its journey it bends away from the straight line by an arc, sin(π t), sideways and in depth. Live dashes take the new places at random; extra ones shrink to a point.
While dragging, rotation grows by 0.0075 radians per pixel and tilt by 0.005; on release the speed loses e^(−2.6 × dt) and the tilt returns to place in 0.9 seconds. At rest it sways slowly (sin(t × 0.32) × 0.2). The faster it turns, the further each dash moves from the centre, up to 32% more.
| Name | File | Default | What it changes |
|---|---|---|---|
COLONNE | script.js | 168 (112 al tocco) | Cells across the drawing: higher, finer and more numerous dashes. |
TRASFORMA | script.js | 1.15 | Seconds of a shape change. |
SFASA | script.js | 0.45 | How offset the dashes start. With 0 they all start together. |
RILIEVO | script.js | 42 | Depth of the relief, in drawing units (the drawing is 380 wide). |
RAMPA | script.js | 5 colori | The colours from the lowest tone to the highest: the whole drawing recolours by changing this list. |
For a portrait, a logo or an object on the first screen of a portfolio: the same drawing becomes material, and changing it is a gesture people remember.
Fewer cells (112 x 140) and canvas density at most 1.5. The names sit in a grid under the drawing and are tapped; a sideways finger turns the relief, a vertical one stays with the page. No pointer nudge.
No cloud, no sway, no inertia and no puffing: the drawing changes at once and turns only while you drag it.
GSAP 3.15.0, Mona Sans (font variabile) 5.3.0.
Weight: 27 KB of our own files.
Tested on 27 September 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.
You’re signed in as .
Your plan is free. When lifetime access arrives, it will switch on for this same account.