The hero starts dark. A burst of particles explodes outward, then curves back inward and assembles into your logo. Three-phase lifecycle, additive bloom, short trails, subtle camera shake during the burst. Once the logo is assembled, move the cursor across the hero to spawn micro-firework bursts that fan out and fade. The default still capture lands mid-re-assembly — the most photogenic frame.
import FireworkLogoReveal from '@crazygl/hero-firework-logo-reveal';
export default function Hero() {
return (
<FireworkLogoReveal
logo="/brand/logo.png"
heading="Lights up."
subheading="Sparks burst, curve back, and snap into your mark."
haloHex="#ff7a3a"
accentHex="#5dd2ff"
/>
);
}logo (transparent PNG/SVG alpha mask becomes the target shape), logoZoom, logoCenterX/Y, sampleDensity.particleCount, particleSize, haloSize, tailLength, coreHex, haloHex, accentHex.burstDuration, settleDuration, burstStrength, burstDrag, attractStrength, phaseShift, loopCycle, loopInterval.pointerBurstRadius, pointerBurstCount, pointerBurstColor.transparent, bgTopHex, bgBotHex, cameraShake.npm install @crazygl/hero-firework-logo-revealThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import FireworkLogoReveal from '@crazygl/hero-firework-logo-reveal';
export default function Landing() {
return (
<FireworkLogoReveal />
);
}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 FireworkLogoReveal from '@crazygl/hero-firework-logo-reveal';
export default function Page() {
return (
<section>
<FireworkLogoReveal
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}