Your headline becomes a row of soft, puffy balloon letters. Each glyph is inflated outward along its surface normal, floats gently with its own bobbing rhythm, squashes elastically when your cursor gets close, and ripples in a bounce wave when you click anywhere on the canvas.
import InflatableBalloonTypography from '@crazygl/hero-inflatable-balloon-typography';
export default function Page() {
return (
<InflatableBalloonTypography
heading="Squishy"
inflateAmount={0.7}
textColor="#ff6fb0"
/>
);
}heading (one short word balloons best), subheading, ctaLabel/onCTAClick/ctaTextColor/ctaBgColor.extrudeDepth (letter thickness), bevelSize, inflateAmount (0 = flat extrusion, 1 = fully blown-up balloon), letterSpacing.floatAmplitude/floatSpeed (per-letter bob), squashStrength/squashSpringStiffness (cursor squash), bounceWaveStrength/bounceWaveSpeed (click ripple).textColor, sheenColor, clearcoat, roughness.keyLightIntensity, envIntensity (studio reflection).transparentBackground, bgTop/bgBottom, headingFontFamily, headingFontWeight (the balloons extrude this font's real glyphs).npm install @crazygl/hero-inflatable-balloon-typographyThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import InflatableBalloonTypography from '@crazygl/hero-inflatable-balloon-typography';
export default function Landing() {
return (
<InflatableBalloonTypography />
);
}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 InflatableBalloonTypography from '@crazygl/hero-inflatable-balloon-typography';
export default function Page() {
return (
<section>
<InflatableBalloonTypography
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}