A product demo screenshot or video floats on a screen panel with an animated cursor, a glowing motion trail, expanding click ripples, and a zoom-lens magnifier that highlights UI moments.
import FloatingScreenRecording from '@crazygl/hero-floating-screen-recording';
export default function Page() {
return (
<FloatingScreenRecording
heading="Watch it work."
screenMedia="/demo/dashboard.mp4"
cursorPath={"0.18,0.78\n0.62,0.30 click\n0.82,0.62 click zoom"}
cursorSpeed={1}
/>
);
}contentType, heading, subheading, or custom nodes.screenMedia (image or auto-looping video; panel adapts to its aspect), screenScale, screenTilt, screenX / screenY.cursorPath (one x,y [click] [zoom] waypoint per line), followPointer, cursorSpeed, trailLength, trailColor.rippleStrength / rippleColor, zoomStrength / zoomRadius.floatStrength, parallaxStrength, screenGlow, accentColor.bgTone1 / bgTone2, transparentBackground.npm install @crazygl/hero-floating-screen-recordingThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import FloatingScreenRecording from '@crazygl/hero-floating-screen-recording';
export default function Landing() {
return (
<FloatingScreenRecording />
);
}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 FloatingScreenRecording from '@crazygl/hero-floating-screen-recording';
export default function Page() {
return (
<section>
<FloatingScreenRecording
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}