A keynote-stage hero: your product screenshot lives on a massive floating screen, lit by sweeping volumetric spotlights through a low-lying carpet of theatre fog.
import StageScreen from '@crazygl/hero-stage-screen';
export default function Hero() {
return (
<StageScreen
screenshot="https://example.com/dashboard.avif"
heading="Take the stage."
subheading="Built for moments that matter."
spotCount={1}
spotIntensity={2.1}
/>
);
}heading / subheading, two-column, or custom node content.screenshot image on the screen, with screenshotX / screenshotY world offsets.screenScale, screenEmissive (glow), screenGlowColor, bezelColor, bezelWidth.spotIntensity, spotSweepSpeed, spotCount (1–4), spotlightColor.smokeParticles, fogDensity (floor haze), fogColor, floorColor, backgroundColor, floorReflectivity.pointerRotation (camera/scene reactivity to the cursor).npm install @crazygl/hero-stage-screenThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import StageScreen from '@crazygl/hero-stage-screen';
export default function Landing() {
return (
<StageScreen />
);
}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 StageScreen from '@crazygl/hero-stage-screen';
export default function Page() {
return (
<section>
<StageScreen
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}