An editorial product-launch hero: a serif headline, a pill call-to-action and a fanned trio of device mockups that rise into place with a staggered, spring-eased reveal. Cards drift subtly with the pointer.
import LaunchReveal from '@crazygl/hero-launch-reveal';
export default function Hero() {
return (
<LaunchReveal
label="✦ Checkout+"
heading={'Transforming post-purchase\none upgraded customer at a time'}
ctaLabel="Offer Customer Upgrades"
imageCenter="https://crazygl.com/samples/launch-screen-1.png"
/>
);
}label, multi-line heading, subheading, ctaLabel / ctaHref.imageCenter / imageLeft / imageRight (+ optional per-card links). Tall device screenshots fan best.mockupSize, sideScale, fanSpread, fanTilt, sideDrop, cardRadius, shadow.depth3d, depthAngle, depthTilt (pointer tilt), perspective.duration, stagger, rise, loopReveal, parallax, sideParallax.headingSize / headingWeight, headingFontFamily, bodyFontFamily.npm install @crazygl/hero-launch-revealThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import LaunchReveal from '@crazygl/hero-launch-reveal';
export default function Landing() {
return (
<LaunchReveal />
);
}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 LaunchReveal from '@crazygl/hero-launch-reveal';
export default function Page() {
return (
<section>
<LaunchReveal
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}