Each character rolls through a vertical stack of duplicate copies of itself in a continuous loop, with a blur pulse mid-roll and a per-character stagger.
import RollingText from '@crazygl/hero-rolling-text';
export default function Hero() {
return (
<RollingText
heading="ROLLING TEXT"
duplicateCount={8}
rollDuration={2}
animationPattern="alternating"
/>
);
}heading (the wordmark), optional subheading, ctaLabel / onCTAClick.duplicateCount (copies stacked), rollDuration, staggerDelay, blurIntensity, animationPattern (sequential / alternating), loopInterval.textColor, fontSize, letterSpacing, headingFontFamily, headingFontWeight.bgColor, accentColor / accentStrength (diagonal vignette), transparentBackground.npm install @crazygl/hero-rolling-textThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import RollingText from '@crazygl/hero-rolling-text';
export default function Landing() {
return (
<RollingText />
);
}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 RollingText from '@crazygl/hero-rolling-text';
export default function Page() {
return (
<section>
<RollingText
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}