Vortex Gradient

Surface study no. 04

Form that refuses to hold still.

A studio for identities that move. We cast brands in liquid metal, then let them settle into something you can hold.

About this component

Vortex Gradient

A live WebGL whirlpool of color: up to six colors wound into a logarithmic spiral that turns and pulls toward its center, blended in Oklab so every mix stays clean. Fractal ripples fray the arms, the pit darkens as it falls away, and an optional bright eye glows at the heart, all under a fine film grain. Colors, base, arm count, tightness, spread, depth, turbulence, eye, center position, direction, speed, saturation and grain are all props; a new palette fades through over a set time, and the center leans gently toward the cursor. It grows softly out of its base color on load, adapts its resolution to the device, pauses offscreen, holds a still frame for reduced motion and falls back to a CSS conic sweep without WebGL.

Usage

The import and the props worth knowing about, in one place.

import { VortexGradient } from "@/components/beste/component/vortex-gradient";

// As a layer behind content
<section className="relative min-h-[40rem]">
  <VortexGradient className="absolute inset-0" />
  <div className="relative">...</div>
</section>

// A calm, sea-glass whirlpool filling the frame
<VortexGradient
  className="min-h-[32rem]"
  colors={["#0f3d3e", "#3fa7a0", "#c8f1e6", "#1c6e8c"]}
  baseColor="#061a1c"
  arms={5}
  tightness={0.8}
  spread={2}               // reaches past the frame edges
  eye={0}
  direction="counterclockwise"
/>

Props

Read from the component's own type, so this cannot drift from what it accepts.

PropTypeDefaultDescription
colorsstring[]—The colors wound into the spiral, 1 to 6. Any CSS color, tokens included.
baseColorstring—Color around the vortex, and the frame the intro grows out of.
armsnumber—Spiral arms, 1 to 8.
tightnessnumber—How tightly the arms wind toward the center, 0 (loose sweep) to 1 (tight coil).
spreadnumber—How far the color reaches from the center, 0.3 to 2 frame heights.
depthnumber—How much the whirlpool darkens as it falls toward the center, 0 to 1.
turbulencenumber—Ragged, fractal ripples along the arms, 0 (clean) to 1 (stormy).
eyenumber—A bright eye at the center, 0 (none) to 1 (large and glowing).
centerXnumber—Horizontal position of the center, 0 (left) to 1 (right).
centerYnumber—Vertical position of the center, 0 (top) to 1 (bottom).
direction"clockwise" | "counterclockwise"—Turning direction.
speednumber—How fast the vortex turns, 0 (still) to 3.
saturationnumber—Color intensity, 0 (grey) to 2 (vivid). 1 keeps the colors as given.
grainnumber—Film grain over the gradient, 0 to 1.
grainSizenumber—Size of one grain in CSS pixels, 1 to 4.
grainMotionboolean—Let the grain flicker like film instead of holding still.
transitionnumber—Seconds a change of `colors` or `baseColor` takes to fade through. 0 swaps at once.
seednumber—Picks a different pattern of ripples.
interactiveboolean—The center leans a little toward the cursor.
pausedboolean—Hold the vortex still.
classNamestring—
childrenReactNode—

More Background components

View all Background