A 3D product model rotates on a premium polished turntable disc beside the hero copy. Studio HDRI lighting, warm key and cool fill softboxes, drag to free-spin, and pointer hover-zoom — a high-end product launch in code.
import ProductTurntableStudio from '@crazygl/hero-product-turntable-studio';
export default function Hero() {
return (
<ProductTurntableStudio
heading={"Shot in the studio.\nSpun in your browser."}
productModel="/my-product.glb"
productSide="right"
turntableSpeed={0.22}
/>
);
}react, react-dom and @crazygl/core are peer dependencies; three is bundled as a regular dependency.
productModel (GLB/GLTF), productScale, modelLift, turntableSpeed, useGlbMaterials (off → productColor / productMetallic / productRoughness).productSide, productX, productY.stageTilt, cameraDistance, zoomAmount (hover-zoom), parallaxStrength, dragInertia.discColor, discRadius, discThickness, discMetallic, discRoughness, discRimColor, rimGlow.environmentImage (HDRI), envIntensity, exposure, keyColor / keyIntensity, fillColor / fillIntensity; floorColor; bgTopColor / bgBottomColor.npm install @crazygl/hero-product-turntable-studioThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import ProductTurntableStudio from '@crazygl/hero-product-turntable-studio';
export default function Landing() {
return (
<ProductTurntableStudio />
);
}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 ProductTurntableStudio from '@crazygl/hero-product-turntable-studio';
export default function Page() {
return (
<section>
<ProductTurntableStudio
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}