Your logo is frozen inside a chunky beveled cube of real refractive ice. Three.js MeshPhysicalMaterial with IOR 1.31, clearcoat, Beer-Lambert blue attenuation and chromatic dispersion bends the studio HDRI around the brand. Frost on the front face melts on load to reveal the logo inside a clear ice-cube body.
import IceEncasedLogo from '@crazygl/hero-ice-encased-logo';
export default function Page() {
return (
<IceEncasedLogo
heading={'Frozen\nin time.'}
logoImage="https://crazygl.com/samples/crazygl.svg"
frostMeltSeconds={2}
/>
);
}logoImage (SVG/PNG silhouette is extruded into a thin plate; GLB placed as-is), logoScale, plus optional backlit glow (logoEmissive, logoEmissiveIntensity).centerX, blockWidth / blockHeight / iceThickness, blockBevel, and the optics: iceColor, iceTransmission, iceTint, attenuationDistance, roughness, clearcoat, dispersion.frostInitial, frostResidual, frostMeltSeconds.environmentImage HDRI + envIntensity, three-point key/fill/rim colours and intensities.rotationSpeed, pointer parallax, dragInertia, bgTop / bgBottom, and contact-shadow controls.npm install @crazygl/hero-ice-encased-logoThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import IceEncasedLogo from '@crazygl/hero-ice-encased-logo';
export default function Landing() {
return (
<IceEncasedLogo />
);
}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 IceEncasedLogo from '@crazygl/hero-ice-encased-logo';
export default function Page() {
return (
<section>
<IceEncasedLogo
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}