Grain Gradient

A grainy, out-of-focus blend of saturated colour, like a long-exposure photo. The grain is rendered per pixel, so it stays sharp at any size.

Made for launch day

Installation

pnpm dlx shadcn@latest add https://gradients.sh/r/grain-gradient.json

Usage

import { GrainGradient } from "@/components/grain-gradient";

<GrainGradient className="h-[480px]">{children}</GrainGradient>;

The gradient fills its box, so give it a height. Children render on top.

Props

PropTypeDefault
children

Content layered on top of the gradient.

ReactNode—
colors

Two to six colours: hex, oklch(), names or var(--token).

[string, string, ...string[]]["#ffd8b4", "#e0703b", "#8a2c1d", "#2b1015"]
background

Base colour under the gradient.

string"#070505"
speed

0 to 2. How fast the gradient moves. 0 holds it still.

number0.6
loopSeconds

4 to 30. The animation repeats exactly every loopSeconds.

number16
scale

0.25 to 4. Noise frequency: higher means smaller shapes.

number1
warp

0 to 1. Domain-warp strength.

number0.55
grain

0 to 1. Film grain.

number0.5
blur

0 to 1. Softness.

number0.55
seed

Integer seed for the noise field.

number7
dither

Ordered 4×4 Bayer dither.

{ enabled?: boolean; cell?: number; levels?: number }{ enabled: false, cell: 3, levels: 8 }
interaction

0 to 1 influence of the pointer and of scroll velocity.

{ pointer?: number; scroll?: number }{ pointer: 0.25, scroll: 0.15 }
maxDpr

Device pixel ratio cap for the canvas.

number1.5
reducedMotion

"respect" shows one still frame when the user prefers reduced motion.

"respect" | "ignore""respect"
className

Classes for the outer element. Size it here; the gradient fills it.

string—