Your product image or video plays inside a floating retro CRT/VHS-style screen with subtle barrel curvature, scanlines, chromatic aberration, vignette and occasional tracking-noise glitch bursts. Nostalgic but polished.
import VhsProductScreen from '@crazygl/hero-vhs-product-screen';
export default function Page() {
return (
<VhsProductScreen
heading="Press play on your roadmap."
screenMedia="https://yoursite.com/demo.mp4"
curvature={0.18}
scanlineStrength={0.35}
glitchFrequency={0.2}
/>
);
}contentType, heading, subheading, column1, column2, content.tvModel (GLB), modelScale, modelTilt, monitorX, monitorY, pointerParallax.screenMedia (image/video), screenFit, screenOffsetX/Y, screenSizeScale, screenEmissive, turnOnAnimation.curvature, scanlineStrength, scanlineFrequency, chromaticEdgeIntensity, vignetteStrength.glitchFrequency, glitchIntensity, glowColor, glowStrength, backgroundColor, headingFontFamily.npm install @crazygl/hero-vhs-product-screenThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import VHSProductDemoScreen from '@crazygl/hero-vhs-product-screen';
export default function Landing() {
return (
<VHSProductDemoScreen />
);
}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 VHSProductDemoScreen from '@crazygl/hero-vhs-product-screen';
export default function Page() {
return (
<section>
<VHSProductDemoScreen
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}