Your product screenshot, printed on a softly curled sheet of paper resting under warm window light. Leaves drift overhead and cast slow, dappled shadows across the page.
import PaperShadowHero from '@crazygl/hero-paper-shadow-hero';
export default function Hero() {
return (
<PaperShadowHero
heading="Made to be read slowly."
subheading="A quieter writing space."
screenshot="/your-app-screenshot.png"
/>
);
}screenshot image; the paper sheet derives its aspect from the image so nothing stretches.paperScale, paperX/paperY, paperRotation, paperTilt, paperCurl (bottom-edge lift), paperFlow (breeze ripple), paperFlowSpeed.windowLightWarmth, lightIntensity (master), keyLightIntensity, fillLightIntensity, lightAngleX (elevation), lightAngleY (azimuth), shadowSoftness, dustCount.pointerParallax (capped ±2° at 1).transparentBackground, bgColor (cream wall).npm install @crazygl/hero-paper-shadow-heroThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import PaperAndShadow from '@crazygl/hero-paper-shadow-hero';
export default function Landing() {
return (
<PaperAndShadow />
);
}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 PaperAndShadow from '@crazygl/hero-paper-shadow-hero';
export default function Page() {
return (
<section>
<PaperAndShadow
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}