A bold headline acts as a mask for a real-time colorful fluid. Domain-warped FBM noise advected over time + a pointer-driven velocity grid swirl two color fields inside the type while the background stays minimal. Move the cursor to inject velocity and color into the letters.
import TypographicFluidSimulation from '@crazygl/hero-typographic-fluid-simulation';
export default function Page() {
return (
<TypographicFluidSimulation
heading="FLOW"
colorA="#ff5ec4"
colorB="#5cf2ff"
/>
);
}heading (acts as the fluid mask), subheading, ctaLabel, onCTAClick.fluidScale, fluidSpeed, ambientSwirl, fluidViscosity.colorA, colorB, colorC (accent), backgroundColor.pointerInjection, pointerColorShift.textOpacity, bloomStrength (tendril glow).headingFontFamily (heavy sans with big counters), headingFontWeight.Short, bold words (3–8 letters) with large counters give the fluid the most room to swirl. Heavy sans serifs like Inter Tight 900, Sora, or Archivo Black are the sweet spot.
npm install @crazygl/hero-typographic-fluid-simulationThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import TypographicFluidSimulation from '@crazygl/hero-typographic-fluid-simulation';
export default function Landing() {
return (
<TypographicFluidSimulation />
);
}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 TypographicFluidSimulation from '@crazygl/hero-typographic-fluid-simulation';
export default function Page() {
return (
<section>
<TypographicFluidSimulation
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}