Hero Liquid Metal

PreviousNext

Split-layout hero section with responsive LiquidMetal shader visuals, 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-liquid-metal.json

Usage

Quick start with the composite component

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

import { HeroLiquidMetal } from "@/components/ui/hero-liquid-metal" export default function Page() { return ( <main className="min-h-screen"> <HeroLiquidMetal width={1280} height={720} image="https://shaders.paper.design/images/logos/diamond.svg" colorBack="#ffffff00" colorTint="#2c5d72" shape={undefined} repetition={6} softness={0.8} shiftRed={1} shiftBlue={-1} distortion={0.4} contour={0.4} angle={0} speed={1} scale={0.6} fit="contain" /> </main> ) }

Compose with primitives

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

import { HeroLiquidMetalRoot, HeroLiquidMetalContainer, HeroLiquidMetalContent, HeroLiquidMetalHeading, HeroLiquidMetalDescription, HeroLiquidMetalActions, HeroLiquidMetalBadges, HeroLiquidMetalVisual, HeroLiquidMetalMobileVisual, } from "@/components/ui/hero-liquid-metal"
export default function Page() { return ( <main className="min-h-screen"> <HeroLiquidMetalRoot> <HeroLiquidMetalContainer> <HeroLiquidMetalContent> <HeroLiquidMetalHeading /> <HeroLiquidMetalDescription /> <HeroLiquidMetalActions /> <div className="flex justify-center lg:justify-start" data-slot="hero-liquid-metal-badges-wrap" > <HeroLiquidMetalBadges /> </div> </HeroLiquidMetalContent> <HeroLiquidMetalVisual /> </HeroLiquidMetalContainer> <HeroLiquidMetalMobileVisual /> </HeroLiquidMetalRoot> </main> ) }

What You Get

  • Split hero layout with copy and CTA on the left and LiquidMetal shader visual on the right.
  • Memoized LiquidMetal render path for stable re-renders.
  • Desktop and mobile shader variants with configurable tint, repetition, softness, dispersion, and distortion.
  • Root-level shader props: pass shader/common props directly on HeroLiquidMetal or HeroLiquidMetalRoot 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
HeroLiquidMetalRootHeroLiquidMetalRootPropsContext provider and root section primitive
HeroLiquidMetalContainerdiv primitiveMain hero grid wrapper
HeroLiquidMetalContentdiv primitiveLeft-side content column primitive
HeroLiquidMetalHeadingHeroLiquidMetalHeadingPropsHeading block primitive (title + subtitle)
HeroLiquidMetalDescriptionHeroLiquidMetalDescriptionPropsDescription block primitive
HeroLiquidMetalActionsHeroLiquidMetalActionsPropsCTA wrapper primitive
HeroLiquidMetalCTAHeroLiquidMetalCTAPropsReusable CTA slot component
HeroLiquidMetalBadgesHeroLiquidMetalBadgesPropsReusable badge row primitive
HeroLiquidMetalVisualHeroLiquidMetalVisualPropsDesktop visual shader wrapper primitive
HeroLiquidMetalMobileVisualHeroLiquidMetalMobileVisualPropsMobile visual shader wrapper primitive
HeroLiquidMetal / defaultHeroLiquidMetalPropsConvenience assembled version built from primitives
useHeroLiquidMetal() => HeroLiquidMetalContextValueHook for context-driven custom composition
HeroLiquidMetalShaderOverridestypeShader/common props that can be passed at the root

Props

HeroLiquidMetalRoot 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<HeroLiquidMetalCTAProps>built-in CTAOverride CTA label/link/target/rel/click handler
renderCta(defaultCta) => ReactNodeundefinedWrap or replace default CTA node
showBadgesbooleantrueToggle tech badges
techStackHeroLiquidMetalTechItem[]Next.js + AI SDKBadge data source
renderBadge(tech, index, defaultBadge) => ReactNodeundefinedCustom badge rendering hook
desktopShaderPropsPartial<LiquidMetalProps>built-in desktop shader settingsOverride desktop shader values
mobileShaderPropsPartial<LiquidMetalProps>built-in mobile shader settingsOverride mobile shader values
classNamestringundefinedRoot section class override

Root-level shader/common props (HeroLiquidMetalShaderOverrides)

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

PropTypeDefaultDescription
widthnumber | string1280CSS width style of the shader
heightnumber | string720CSS height style of the shader
imagestring | HTMLImageElement"/cult-icon.svg"Optional effect mask image (transparent background recommended)
shape"none" | "circle" | "daisy" | "metaballs"undefinedFallback predefined shape when no image is used
colorBackstring"#ffffff00"Background color
colorTintstring"#2c5d72"Overlay tint color (color burn blend)
repetitionnumber6Density of pattern stripes (1-10)
softnessnumber0.8Color transition sharpness (0-1)
shiftRednumber1R-channel dispersion (-1 to 1)
shiftBluenumber-1B-channel dispersion (-1 to 1)
distortionnumber0.4Noise distortion over pattern (0-1)
contournumber0.4Distortion strength on shape edges (0-1)
anglenumber0Pattern animation direction (0-360)
speednumber1Animation speed (0 pauses animation)
framenumberundefinedStarting point of animation
scalenumber0.6 (desktop)Overall zoom level (0.01-4)
rotationnumberundefinedOverall rotation angle (0-360)
offsetXnumberundefinedHorizontal center offset (-1 to 1)
offsetYnumberundefinedVertical center offset (-1 to 1)
fit"contain" | "cover""contain"Fit mode for rendering into canvas
originXnumberundefinedReference point for world width in canvas (0-1)
originYnumberundefinedReference point for world height in canvas (0-1)
minPixelRationumbershader defaultMinimum render pixel ratio
maxPixelCountnumbershader defaultMaximum pixel count to process

Customization Patterns

Tune LiquidMetal via root-level props

Use the composite component and pass shader props directly:

<HeroLiquidMetal width={1280} height={720} image="https://shaders.paper.design/images/logos/diamond.svg" colorBack="#ffffff00" colorTint="#2c5d72" repetition={6} softness={0.8} shiftRed={1} shiftBlue={-1} distortion={0.4} contour={0.4} angle={0} speed={1} scale={0.6} fit="contain" />

Override desktop and mobile separately

Use desktopShaderProps and mobileShaderProps when composing with primitives:

<HeroLiquidMetalRoot desktopShaderProps={{ speed: 0.7, scale: 0.8, repetition: 7, softness: 0.9, distortion: 0.3, colorTint: "#4f46e5", }} mobileShaderProps={{ speed: 0.65, scale: 0.78, colorTint: "#0ea5e9", }} > {/* compose primitives */} </HeroLiquidMetalRoot>

Swap hero copy and CTA

Replace copy and CTA target via props:

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

Compose with slot primitives

Use primitive exports for custom layout composition:

<HeroLiquidMetalRoot> <HeroLiquidMetalContainer> <HeroLiquidMetalContent> <HeroLiquidMetalHeading /> <HeroLiquidMetalDescription /> <HeroLiquidMetalActions /> <HeroLiquidMetalBadges /> </HeroLiquidMetalContent> <HeroLiquidMetalVisual desktopShaderProps={{ colorTint: "#0f766e", distortion: 0.28 }} /> </HeroLiquidMetalContainer> <HeroLiquidMetalMobileVisual /> </HeroLiquidMetalRoot>

Performance Notes

  • LiquidMetal 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 if you are not using a predefined shape.

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.