A large piece of silk fills the screen, undulating in wind with anisotropic highlights along its fibre direction. Pointer presses dent the fabric and slowly relax back.
import ClothWave from '@crazygl/hero-cloth-wave';
export default function Hero() {
return (
<ClothWave
heading="Silk in the wind."
silkColor="#5b1235"
highlightColor="#ffd29c"
anisotropy={1}
/>
);
}silkColor, highlightColor (the fibre glint), rimColor (Fresnel edge), anisotropy (highlight tightness, ~1.0–1.4 is real silk), fiberAngle (warp orientation; highlights run perpendicular), sheen (grazing-angle velvet glow).windAngle, windAmplitude (fold depth), windSpeed, scale (ripple frequency).bgTopColor / bgBottomColor gradient bleeding through the corner vignette.contentType (heading / two-columns / custom) and headingFontFamily.npm install @crazygl/hero-cloth-waveThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import ClothWave from '@crazygl/hero-cloth-wave';
export default function Landing() {
return (
<ClothWave />
);
}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 ClothWave from '@crazygl/hero-cloth-wave';
export default function Page() {
return (
<section>
<ClothWave
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}