A 3D model splits into several floating layers on load, then slowly reassembles. Hovering separates the parts again — connector lines hint at the assembly path. Cinematic three-point studio lighting with HDRI reflections.
import ProductExplodedView from '@crazygl/hero-product-exploded-view';
export default function Page() {
return (
<ProductExplodedView
heading="Engineered, layer by layer."
productModel="https://crazygl.com/samples/camera.glb"
explodeAmount={2.6}
layout="content-left"
/>
);
}contentType, heading/subheading, layout (centered / content-left / content-right), positionX / positionY.productModel (GLB/GLTF URL), modelScale, spinSpeed ambient turntable.explodeAmount, loopExplode plus holdExploded / assembleDuration / holdAssembled / explodeDuration, fallbackBands (single-mesh slicing), showConnectorLines, dragInertia.cameraDistance, parallaxAzimuth, parallaxElevation.environmentImage (HDRI), envIntensity, exposure, plus key/fill/rim light colours and intensities.transparent, bgTopColor / bgBottomColor, headingFontFamily.npm install @crazygl/hero-product-exploded-viewThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import ProductExplodedView from '@crazygl/hero-product-exploded-view';
export default function Landing() {
return (
<ProductExplodedView />
);
}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 ProductExplodedView from '@crazygl/hero-product-exploded-view';
export default function Page() {
return (
<section>
<ProductExplodedView
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}