A full-bleed image gallery where each slide carries its own picture and copy. Image and text transition independently — fade, Ken-Burns zoom, push-slide, clip wipe or blur-morph for the image; fade, rise, clip-reveal or blur for the text. Autoplay, arrows, dots, counter, swipe.
import GallerySlider from '@crazygl/hero-gallery-slider';
export default function Page() {
return (
<GallerySlider
slideCount={3}
imageTransition="blur"
textTransition="clip"
slide1Image="/img/one.jpg"
slide1Heading="Tiered in white sugar"
slide1CtaLabel="Discover"
slide1CtaHref="/products"
/>
);
}slideCount (1–5) and per-slide slideNImage, slideNEyebrow, slideNHeading, slideNSubtext, slideNCtaLabel, slideNCtaHref.imageTransition, textTransition, duration, easing, and ambient kenBurns.autoplay, interval, and toggles for showArrows, showDots, showCounter, showProgress.textPosition, textColor, accentColor, scrim, headingFont/bodyFont, and CTA ctaColor/ctaTextColor/ctaShape.npm install @crazygl/hero-gallery-sliderThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import GallerySlider from '@crazygl/hero-gallery-slider';
export default function Landing() {
return (
<GallerySlider />
);
}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 GallerySlider from '@crazygl/hero-gallery-slider';
export default function Page() {
return (
<section>
<GallerySlider
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}