A polished product screenshot scanned by an animated x-ray band that reveals the underlying component structure as glowing devtools-style bboxes and accessibility outlines. Drag the pointer, or let it auto-sweep — exactly the feeling of opening the inspector on production.
import DebuggingXray from '@crazygl/hero-debugging-xray-hero';
export default function Hero() {
return (
<DebuggingXray
heading="See every render, every leak, every layout shift."
screenshot="https://crazygl.com/samples/screenshot-dashboard-dark.avif"
scanMode="both"
accentColor="#5cd5ff"
/>
);
}heading + subheading + ctaLabel/onCTAClick, two columns, or a custom node.screenshot (PNG/JPG/WebP/AVIF) plus screenshotScale, screenshotX/Y, screenshotTilt to place it as a product card.scanMode (pointer / auto / both), scanSpeed, bandWidth, accentColor.xrayMode procedural overlay or a custom xrayImage (wireframe / blueprint, cover-fit aligned).overlayStyle (bboxes / heatmap / both) and overlayDensity.parallaxStrength, bgTop/bgBottom, transparentBackground.The screenshot reads best with visible structure — dashboards, IDEs and admin UIs, whose cards, sidebars and tables give the bounding boxes real structure to discover.
npm install @crazygl/hero-debugging-xray-heroThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import DebuggingXRay from '@crazygl/hero-debugging-xray-hero';
export default function Landing() {
return (
<DebuggingXRay />
);
}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 DebuggingXRay from '@crazygl/hero-debugging-xray-hero';
export default function Page() {
return (
<section>
<DebuggingXRay
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}