The whole background is a thin soap-bubble film — a translucent holographic membrane rendered with physically-based thin-film interference. Slow domain-warped flow drives the film thickness, so restrained pastel rainbows drift across the surface. The pointer presses on the membrane: the film stretches under the cursor and sends out concentric tension waves — single-wavefront ripples that perturb the thickness and shift the colour as they expand. Elegant, futuristic, premium.
import IridescentMembrane from '@crazygl/hero-iridescent-membrane';
export default function Hero() {
return (
<IridescentMembrane
heading="A surface of light."
iridescence={2}
filmThickness={1.2}
/>
);
}filmThickness (interference orders), iridescence (colour saturation), baseTint, flowSpeed, scale of the flow field.rippleStrength, rippleSpeed, rippleWidth (crispness of each tension ring).textShade, a soft dark vignette behind the copy.transparent to composite the film over an existing page background.npm install @crazygl/hero-iridescent-membraneThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import IridescentMembrane from '@crazygl/hero-iridescent-membrane';
export default function Landing() {
return (
<IridescentMembrane />
);
}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 IridescentMembrane from '@crazygl/hero-iridescent-membrane';
export default function Page() {
return (
<section>
<IridescentMembrane
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}