Upload a logo (SVG / PNG / GLB) and watch it become a real 3D glass paperweight: Three.js MeshPhysicalMaterial with true volumetric transmission, per-wavelength dispersion, clearcoat, Beer-Lambert attenuation, ContactShadows, an HDRI-lit studio rig and pointer-driven parallax orbit that visibly bends the photographic background through the body.
import GlassLogoSculpture from '@crazygl/hero-glass-logo-sculpture';
export default function Page() {
return (
<GlassLogoSculpture
logoImage="/brand/logo.svg"
backgroundImage="/photos/forest.jpg"
ior={1.5}
dispersionAmount={1.0}
/>
);
}You can plug in your own assets: a transparent SVG (preferred) or PNG silhouette is extruded into a beveled body; a GLB / GLTF model is used as-is (optionally re-skinned in glass via useGlbMaterials). Any JPG / PNG / WebP / AVIF photo refracts through the body, and an equirectangular HDRI lights the glass and drives its reflections.
contentType (heading / two-columns / custom), logoImage, useGlbMaterials, logoScale, centerX / logoY, extrusionDepth, bevelAmount.backgroundImage, backgroundDistance, environmentImage (HDRI).ior, dispersionAmount, thickness, attenuationColor / attenuationDistance, roughness, clearcoat / clearcoatRoughness, envIntensity.rotationSpeed, parallaxAzimuth / parallaxElevation, dragInertia.shadowStrength, shadowBlur.npm install @crazygl/hero-glass-logo-sculptureThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import GlassLogoSculpture from '@crazygl/hero-glass-logo-sculpture';
export default function Landing() {
return (
<GlassLogoSculpture />
);
}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 GlassLogoSculpture from '@crazygl/hero-glass-logo-sculpture';
export default function Page() {
return (
<section>
<GlassLogoSculpture
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}