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 glowing assembly line under your first impression."
ctaLabel="Get Started"
onCTAClick="/signup"
cubeCount={5}
/>
);
}badgeText (pill above the heading), heading, subheading, ctaLabel + onCTAClick (URL string, or pass a function from code — same prop).cubeCount (glowing sources riding the line), beltSpeed, ribDensity (roller fineness), curveHeight (how much the line rises and dips), sceneRotate (how much the whole 3D scene turns with the cursor), glowStrength.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>
);
}