A 3D product GLB floats in a bright seamless infinity studio — the floor sweeps continuously up into the back wall with no visible seam. Three-point softbox lighting, a soft floor reflection, and a very subtle camera dolly sell the look of a premium catalogue photoshoot.
import WhiteInfinityStudio from '@crazygl/hero-white-infinity-studio';
export default function Page() {
return (
<WhiteInfinityStudio
heading="The new flagship."
model="/path/to/my-product.glb"
stageLayout="content-left"
/>
);
}stageLayout, productX / productY, stageTone (wall tint), wallCurve (floor→wall sweep tightness).cameraDistance, cameraHeight, dollyAmplitude, pointerParallax.model (GLB/GLTF), useGlbMaterials (or override overrideColor / overrideMetalness / overrideRoughness), productScale, productTilt, productYaw, floatHeight, spinSpeed (turntable).environmentImage (HDRI), envIntensity, exposure, keyIntensity / keyWarmth, fillIntensity, rimIntensity / rimColor, shadowStrength.npm install @crazygl/hero-white-infinity-studioThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import WhiteInfinityStudio from '@crazygl/hero-white-infinity-studio';
export default function Landing() {
return (
<WhiteInfinityStudio />
);
}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 WhiteInfinityStudio from '@crazygl/hero-white-infinity-studio';
export default function Page() {
return (
<section>
<WhiteInfinityStudio
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}