KQ-1441 · AETHER/SWIRL

Aether Swirl

A background of colour folded through itself like ink suspended in oil: a WebGL2 shader warps noise by noise by noise and draws four palette colours out into banded swirls that follow the folds, with hair-fine filaments where the bands meet and a soft sheen across their slopes, drifting and re-folding over tens of seconds. The folds deepen under the pointer, its place following on the springs.glide constants and its presence arriving on springs.drift, and a press winds the colour round the hand through a critically damped twist spring with the drift constants; keyboard focus on a control inside brings the hand there with a softer fold.

KQ-1441 · AETHER/SWIRL

Basinworks Inks

Pigments that move in the bottle

Twelve colours, ground by hand

cobalt · warp 0.60 · drifting

Install

One command — the source lands in your repo. Or copy it from the Code tab.

$ pnpm dlx shadcn@latest add @kinetiq/aether-swirl

Props

children
React.ReactNode
default —
The content on top of the colour: a hero line, a heading, a call to action.
warp
number
default 0.6
How deeply the colour folds through itself, 0 (soft clouds) to 1 (tight marbling).
speed
number
default 0.5
How fast it drifts, 0 (still) to 2.
palette
"cobalt" | "dusk" | "ember" | "lagoon" | readonly string[]
default "cobalt"
A named palette, or four CSS colours of your own, darkest first.
scale
number
default 340
The size of a swirl, px.
detail
number
default 0.6
How much fine structure the folds carry, 0 to 1.
veins
number
default 0.4
Fine filaments along the folds, 0 (none) to 1.
sheen
number
default 0.4
Light on the surface, like oil, 0 to 1.
grain
number
default 0.25
A whisper of film grain that also hides banding, 0 to 1.
interactive
boolean
default true
The pointer and keyboard focus deepen the folds, and a press winds the colour round.
pointerStrength
number
default 0.6
How much the hand deepens the folds and how hard a press winds them, 0 to 1.
radius
number
default 200
How far the hand reaches, px.
paused
boolean
default false
Hold the colour still; the hand still folds it.
seed
number
default 1
Seeds the pattern, so two swirls never match.
dpr
number
default 2
Cap on the canvas's device pixel ratio, at most 2.
onActiveChange
(active: boolean) => void
default —
Fires when the pointer or keyboard focus starts (true) or stops (false) folding the colour.
className
string
default "h-full w-full"
Sizes and shapes the box.