A glowing neon-tube headline that flickers on, settles into a slow plasma breath, sparks on hover, and bends its glow toward the cursor. Rendered to a HiDPI canvas with rounded tube strokes plus stacked blurred copies for true additive bloom.
import NeonTubeTypography from '@crazygl/hero-neon-tube-typography';
export default function Hero() {
return (
<NeonTubeTypography
heading="AFTER HOURS"
tubeColor="#ff3ee0"
tubeThickness={18}
ctaLabel="Enter the show"
/>
);
}heading, subheading, ctaLabel, onCTAClick (URL string or function).tubeColor, coreColor (hot filament), tubeThickness (8–32px), brightness, bloomStrength (halo size), cornerDetail (how much letter detail / counters survive), letterSpacing.flickerOnLoad, flickerDuration, ambientFlicker (persistent electrical jitter).hoverBoost, sparkCount, sparkColor.glowDirectionStrength (anisotropic bloom lean toward the cursor).bgColor, transparent, vignetteStrength.headingFontFamily (the tube is traced from this font's glyphs; display faces like Audiowide / Monoton / Bungee read best), headingFontWeight.npm install @crazygl/hero-neon-tube-typographyThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import NeonTubeTypography from '@crazygl/hero-neon-tube-typography';
export default function Landing() {
return (
<NeonTubeTypography />
);
}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 NeonTubeTypography from '@crazygl/hero-neon-tube-typography';
export default function Page() {
return (
<section>
<NeonTubeTypography
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}