A dark editorial hero lit by a single grainy warm gradient that ramps along one animated sine contour (no mirrored band). The contour breathes with a pseudo-random amplitude, and the giant wordmark is rendered into the same shader so it is revealed by the light — bright where the gradient washes over it, sinking into near-black shadow elsewhere. Quantised, dithered and grained for a retro/print texture.
import DitherGradient from '@crazygl/hero-dither-gradient';
export default function Hero() {
return (
<DitherGradient
wordmark="CGL"
eyebrow={"Design for those who\nwant to become a better\nversion of themselves."}
colorHot="#ffe6c8"
/>
);
}eyebrow (multi-line) and the big wordmark.waveAmplitude, waveFrequency, waveWidth, waveTilt, waveBaseY, flowSpeed, ampSpeed, intensity.bands (quantised steps), dither (stipple strength), grain.colorBase, colorDeep, colorMid, colorWarm, colorHot, plus textColor.wordmarkFont, wordmarkWeight, wordmarkSize, wordmarkY, textGlow, textAmbient.npm install @crazygl/hero-dither-gradientThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import DitherGradient from '@crazygl/hero-dither-gradient';
export default function Landing() {
return (
<DitherGradient />
);
}The wrapper renders static HTML on the server and only initialises the canvas after hydration, so search engines see your copy.
// app/page.tsx — works in SSR-first frameworks (Next, Remix, Astro, etc.)
'use client';
import DitherGradient from '@crazygl/hero-dither-gradient';
export default function Page() {
return (
<section>
<DitherGradient
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}