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
import { GrainGradient } from "@/components/grain-gradient";
export function GrainGradientDemo() {
return (
<GrainGradient className="flex h-[360px] items-end p-8">
<h2 className="text-3xl font-semibold tracking-tight text-white">
Made for launch day
</h2>
</GrainGradient>
);
}
Installation
pnpm dlx shadcn@latest add https://gradients.sh/r/grain-gradient.jsonUsage
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
| Prop | Type | Default |
|---|---|---|
childrenContent layered on top of the gradient. | ReactNode | — |
colorsTwo to six colours: hex, oklch(), names or var(--token). | [string, string, ...string[]] | ["#ffd8b4", "#e0703b", "#8a2c1d", "#2b1015"] |
backgroundBase colour under the gradient. | string | "#070505" |
speed0 to 2. How fast the gradient moves. 0 holds it still. | number | 0.6 |
loopSeconds4 to 30. The animation repeats exactly every loopSeconds. | number | 16 |
scale0.25 to 4. Noise frequency: higher means smaller shapes. | number | 1 |
warp0 to 1. Domain-warp strength. | number | 0.55 |
grain0 to 1. Film grain. | number | 0.5 |
blur0 to 1. Softness. | number | 0.55 |
seedInteger seed for the noise field. | number | 7 |
ditherOrdered 4×4 Bayer dither. | { enabled?: boolean; cell?: number; levels?: number } | { enabled: false, cell: 3, levels: 8 } |
interaction0 to 1 influence of the pointer and of scroll velocity. | { pointer?: number; scroll?: number } | { pointer: 0.25, scroll: 0.15 } |
maxDprDevice pixel ratio cap for the canvas. | number | 1.5 |
reducedMotion"respect" shows one still frame when the user prefers reduced motion. | "respect" | "ignore" | "respect" |
classNameClasses for the outer element. Size it here; the gradient fills it. | string | — |