A cinematic cluster of floating media panels at staggered depths. The center panel carries your main demo — large and sharp — while the panels behind recede smaller, dimmer, and depth-blurred. Slow ambient drift, pointer parallax, and hover focus that pulls any panel forward.
import HeroVideoWall from '@crazygl/hero-video-wall';
export default function Hero() {
return (
<HeroVideoWall
heading="Every story, on the wall."
centerMedia="https://your.cdn/demo.mp4"
panelCount={8}
depthBlur={0.7}
/>
);
}Each panel slot (centerMedia, panel1Media … panel12Media) accepts an image (PNG / JPG / WebP / AVIF) or a video (MP4 / WebM). Put your strongest demo in the center slot. Videos autoplay muted and loop.
centerMedia, panel1Media…panel12Media, and panelCount (0–12 back panels).wallSpread, wallCurvature (arc toward the camera), depthStagger (how deep back panels recede), panelGap.depthBlur, depthDim, hoverFocus, scanlineStrength (sweeping light band).accentColor, glowStrength, backgroundTone, vignetteStrength, transparentBackground.driftStrength (ambient bob), parallaxStrength (pointer follow).npm install @crazygl/hero-video-wallThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import VideoWallHero from '@crazygl/hero-video-wall';
export default function Landing() {
return (
<VideoWallHero />
);
}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 VideoWallHero from '@crazygl/hero-video-wall';
export default function Page() {
return (
<section>
<VideoWallHero
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}