A silk ribbon woven from hundreds of fine luminous strands undulates across the lower third of a dark hero, while teal and amber light travels along it and glowing beads ride the filaments. Faint blueprint grid, centered copy, CTA.
import FilamentRibbon from '@crazygl/hero-filament-ribbon';
export default function Page() {
return (
<FilamentRibbon
badgeText="New — v2.0 is here"
heading="Motion that sells the story."
subheading="A hand-crafted hero with light woven through it."
ctaLabel="Get Started"
onCTAClick="/signup"
/>
);
}badgeText (pill above the heading), heading, subheading, ctaLabel + onCTAClick (URL string, or pass a function from code — same prop).ribbonY (vertical position), ribbonWidth, strandCount (filament density), waveAmount, flowSpeed, glowStrength, showBeads.tealColor / amberColor (the two traveling light pools), coreColor (white sweep), bgColor, gridOpacity for the faint blueprint grid behind the heading.npm install @crazygl/hero-filament-ribbonThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import FilamentRibbon from '@crazygl/hero-filament-ribbon';
export default function Landing() {
return (
<FilamentRibbon />
);
}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 FilamentRibbon from '@crazygl/hero-filament-ribbon';
export default function Page() {
return (
<section>
<FilamentRibbon
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}