Hero Heatmap

PreviousNext

Split-layout hero section with responsive Heatmap shader visuals (glowing gradient through an input shape), CTA content, and tech stack badges.

Default

AI SDK Agents

AI SDK Agents
Copy and Paste

Full-stack vercel ai sdk patterns for workflows, tool calling, and agent orchestration. Built with ai sdk v6 and shadcn/ui.

Root-level shader props

AI SDK Agents

AI SDK Agents
Copy and Paste

Full-stack vercel ai sdk patterns for workflows, tool calling, and agent orchestration. Built with ai sdk v6 and shadcn/ui.

Configured via props

Composable hero

Cursor for
Marketing

Human-in-the-loop marketing copy software that helps teams draft, review, and ship high-converting campaigns with confidence.

Installation

pnpm dlx shadcn@latest add https://cult-ui.com/r/hero-heatmap.json

Usage

Quick start with the composite component

Pass shader props directly on HeroHeatmap for a one-line hero:

import { HeroHeatmap } from "@/components/ui/hero-heatmap" export default function Page() { return ( <main className="min-h-screen"> <HeroHeatmap width={1280} height={720} image="https://shaders.paper.design/images/logos/diamond.svg" colors={[ "#112069", "#1f3ca3", "#367c66", "#adfa1e", "#ffe77a", "#ff9a1f", "#ed40b3", ]} colorBack="#000000" contour={0.5} angle={0} noise={0} innerGlow={0.5} outerGlow={0.5} speed={1} scale={0.75} /> </main> ) }

Compose with primitives

For full control over layout and copy, use the root and slot components:

import { HeroHeatmapRoot, HeroHeatmapContainer, HeroHeatmapContent, HeroHeatmapHeading, HeroHeatmapDescription, HeroHeatmapActions, HeroHeatmapBadges, HeroHeatmapVisual, HeroHeatmapMobileVisual, } from "@/components/ui/hero-heatmap"
export default function Page() { return ( <main className="min-h-screen"> <HeroHeatmapRoot> <HeroHeatmapContainer> <HeroHeatmapContent> <HeroHeatmapHeading /> <HeroHeatmapDescription /> <HeroHeatmapActions /> <div className="flex justify-center lg:justify-start" data-slot="hero-heatmap-badges-wrap" > <HeroHeatmapBadges /> </div> </HeroHeatmapContent> <HeroHeatmapVisual /> </HeroHeatmapContainer> <HeroHeatmapMobileVisual /> </HeroHeatmapRoot> </main> ) }

What You Get

  • Split hero layout with copy and CTA on the left and Heatmap shader visual on the right.
  • Memoized Heatmap render path for stable re-renders.
  • Desktop and mobile shader variants with configurable colors, contour, glow, angle, noise, speed, and scale.
  • Root-level shader props: Pass width, height, image, colors, colorBack, contour, angle, noise, innerGlow, outerGlow, speed, and scale directly on HeroHeatmap or HeroHeatmapRoot for convenience.
  • Built-in badge row for highlighting stack metadata.
  • Works as a full-width section and can be dropped into landing pages directly.

API Reference

Exports

ExportTypeDescription
HeroHeatmapRootHeroHeatmapRootPropsContext provider and root section primitive
HeroHeatmapContainerdiv primitiveMain hero grid wrapper
HeroHeatmapContentdiv primitiveLeft-side content column primitive
HeroHeatmapHeadingHeroHeatmapHeadingPropsHeading block primitive (title + subtitle)
HeroHeatmapDescriptionHeroHeatmapDescriptionPropsDescription block primitive
HeroHeatmapActionsHeroHeatmapActionsPropsCTA wrapper primitive
HeroHeatmapCTAHeroHeatmapCTAPropsReusable CTA slot component
HeroHeatmapBadgesHeroHeatmapBadgesPropsReusable badge row primitive
HeroHeatmapVisualHeroHeatmapVisualPropsDesktop visual shader wrapper primitive
HeroHeatmapMobileVisualHeroHeatmapMobileVisualPropsMobile visual shader wrapper primitive
HeroHeatmap / defaultHeroHeatmapPropsConvenience assembled version built from primitives
useHeroHeatmap() => HeroHeatmapContextValueHook for context-driven custom composition
HeroHeatmapShaderOverridestypeShader props that can be passed at the root

Props

HeroHeatmapRoot owns shared defaults, normalized shader props, and composition state.

PropTypeDefaultDescription
srTitlestring"AI SDK Agents"Screen-reader-only heading text
titleReactNode"AI SDK Agents"First line of visible heading
subtitleReactNode"Copy and Paste"Second line of visible heading
descriptionReactNodebuilt-in marketing copySupporting paragraph content
showCtabooleantrueToggle CTA rendering
ctaPropsPartial<HeroHeatmapCTAProps>built-in CTAOverride CTA label/link/target/rel/click handler
renderCta(defaultCta) => ReactNodeundefinedWrap or replace default CTA node
showBadgesbooleantrueToggle tech badges
techStackHeroHeatmapTechItem[]Next.js + AI SDKBadge data source
renderBadge(tech, index, defaultBadge) => ReactNodeundefinedCustom badge rendering hook
desktopShaderPropsPartial<HeatmapProps>built-in desktop shader settingsOverride desktop shader values
mobileShaderPropsPartial<HeatmapProps>built-in mobile shader settingsOverride mobile shader values
classNamestringundefinedRoot section class override

Root-level shader props (HeroHeatmapShaderOverrides)

You can pass these on HeroHeatmap or HeroHeatmapRoot; they are merged into both desktop and mobile shader props (before desktopShaderProps / mobileShaderProps).

PropTypeDefaultDescription
widthnumber1280Canvas width
heightnumber720Canvas height
imagestring | HTMLImageElementdiamond SVG URLSource image or URL (shape mask for the heatmap)
colorsstring[]7-color paletteArray of hex colors for the heat gradient
colorBackstring"#000000"Background color
contournumber0.5Heat intensity near the edges of the shape (0–1)
anglenumber0Direction of the heatwaves in degrees (0–360)
noisenumber0Grain across the graphic (0–1)
innerGlownumber0.5Size of the heated area inside the shape (0–1)
outerGlownumber0.5Size of the heated area outside the shape (0–1)
speednumber1Animation speed
scalenumber0.75Overall zoom (0.01–4)

Customization Patterns

Tune Heatmap via root-level props

Use the composite component and pass shader props directly:

<HeroHeatmap image="https://shaders.paper.design/images/logos/diamond.svg" colors={["#112069", "#1f3ca3", "#367c66", "#adfa1e", "#ffe77a", "#ff9a1f", "#ed40b3"]} colorBack="#0a0a0a" contour={0.6} angle={45} innerGlow={0.6} outerGlow={0.4} noise={0.1} speed={1.2} scale={0.8} width={1280} height={720} />

Override desktop and mobile separately

Use desktopShaderProps and mobileShaderProps when composing with primitives:

<HeroHeatmapRoot desktopShaderProps={{ scale: 0.8, speed: 0.7, innerGlow: 0.6, outerGlow: 0.4, }} mobileShaderProps={{ speed: 0.65, }} > {/* compose primitives */} </HeroHeatmapRoot>

Swap hero copy and CTA

Replace copy and CTA target via props:

<HeroHeatmapRoot title="Your Product" subtitle="Ship faster" description="Reusable hero primitive with configurable Heatmap visuals." ctaProps={{ label: "Get started", href: "/signup", target: "_self", }} > {/* compose primitives */} </HeroHeatmapRoot>

Replace badge rendering

Use techStack + renderBadge for custom chips:

<HeroHeatmapRoot techStack={[ { name: "Next.js", version: "v16" }, { name: "AI SDK", version: "v6" }, { name: "Tailwind", version: "v4" }, ]} renderBadge={(tech, _index, defaultBadge) => tech.name === "AI SDK" ? ( <span className="rounded-b-full border px-3 py-1 text-xs font-semibold"> {tech.name} {tech.version} </span> ) : ( defaultBadge ) } > {/* compose primitives */} </HeroHeatmapRoot>

Compose with slot primitives

Use primitive exports for custom layout composition:

<HeroHeatmapRoot> <HeroHeatmapContainer> <HeroHeatmapContent> <HeroHeatmapHeading /> <HeroHeatmapDescription /> <HeroHeatmapActions /> <HeroHeatmapBadges /> </HeroHeatmapContent> <HeroHeatmapVisual desktopShaderProps={{ scale: 0.9, innerGlow: 0.7 }} /> </HeroHeatmapContainer> <HeroHeatmapMobileVisual /> </HeroHeatmapRoot>

Performance Notes

  • Heatmap is wrapped with memo to avoid unnecessary rerenders.
  • Mobile and desktop effects are rendered as separate sections so each layout can be tuned independently.
  • Keep the hero in client-rendered regions only ("use client" is required).

Accessibility Notes

  • Includes a screen-reader-only heading (sr-only) so page structure remains meaningful.
  • CTA link includes rel="noopener noreferrer" when opened in a new tab.
  • Ensure visible contrast remains sufficient if you change shader colors or text opacity.

Troubleshooting

Shader does not render

  • Confirm @paper-design/shaders-react is installed.
  • Verify this component runs in a client context.
  • Confirm parent containers are not clipping to zero height.
  • Ensure image is a valid URL or loaded image; the Heatmap uses it as a shape mask.

Layout looks crowded on small screens

  • Increase the mobile shader container height.
  • Reduce heading size classes or copy length.
  • Move badges under the fold for dense hero content.