A cyberpunk control-dock hero: 1-3 CTA buttons rendered as thick glowing physical panels on a floating console, with periodic light pulses, hover halos, and click bursts. Real, clickable DOM buttons with a custom-painted WebGL glow under each one.
import NeonCtaDock from '@crazygl/hero-neon-cta-dock';
export default function Page() {
return (
<NeonCtaDock
heading="Reserve your slot."
subheading="Beta access closes Friday."
buttonCount={2}
button1Label="Get early access →"
button1Color="#56e3ff"
onButton1Click="/signup"
button2Label="View pricing"
button2Color="#a070ff"
onButton2Click={(e) => console.log('clicked', e)}
/>
);
}Each onButtonNClick accepts either a string URL (navigates via window.location.href) or a function callback (receives the MouseEvent).
heading / subheading, two-column, or fully custom node content.buttonCount (1–3), per-button labelN, colorN, and onButtonNClick.buttonGlow, pulseEnabled / pulsePeriod, hoverBoost, clickBurst.dockEnabled, dockColor, dockGlow, padding, corner radius, border colour/strength.bgTop/bgBottom gradient, transparency.parallaxStrength for the pointer-driven scene shift.npm install @crazygl/hero-neon-cta-dockThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import NeonCTADock from '@crazygl/hero-neon-cta-dock';
export default function Landing() {
return (
<NeonCTADock />
);
}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 NeonCTADock from '@crazygl/hero-neon-cta-dock';
export default function Page() {
return (
<section>
<NeonCTADock
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}