{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "hero-static-radial-gradient",
  "type": "registry:ui",
  "description": "Split-layout hero section with responsive StaticRadialGradient shader visuals, CTA, and tech stack badges",
  "dependencies": [
    "@paper-design/shaders-react"
  ],
  "registryDependencies": [
    "badge",
    "button"
  ],
  "files": [
    {
      "path": "registry/default/ui/hero-static-radial-gradient.tsx",
      "content": "\"use client\"\n\nimport * as React from \"react\"\nimport type { SVGProps } from \"react\"\nimport { StaticRadialGradient } from \"@paper-design/shaders-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\n\nconst MemoizedStaticRadialGradient = React.memo(StaticRadialGradient)\n\ntype StaticRadialGradientProps = React.ComponentProps<\n  typeof StaticRadialGradient\n>\ntype StaticRadialGradientIcon = React.ComponentType<SVGProps<SVGSVGElement>>\n\nexport interface HeroStaticRadialGradientTechItem {\n  name: string\n  version?: string\n  icon?: StaticRadialGradientIcon\n}\n\nexport interface HeroStaticRadialGradientCTAProps {\n  label: React.ReactNode\n  href: string\n  target?: React.HTMLAttributeAnchorTarget\n  rel?: string\n  onClick?: React.MouseEventHandler<HTMLAnchorElement>\n  className?: string\n  buttonClassName?: string\n}\n\nexport interface HeroStaticRadialGradientRootProps\n  extends Omit<React.ComponentPropsWithoutRef<\"section\">, \"title\"> {\n  srTitle?: string\n  title?: React.ReactNode\n  subtitle?: React.ReactNode\n  description?: React.ReactNode\n  showCta?: boolean\n  ctaProps?: Partial<HeroStaticRadialGradientCTAProps>\n  renderCta?: (defaultCta: React.ReactNode) => React.ReactNode\n  showBadges?: boolean\n  techStack?: HeroStaticRadialGradientTechItem[]\n  renderBadge?: (\n    tech: HeroStaticRadialGradientTechItem,\n    index: number,\n    defaultBadge: React.ReactNode\n  ) => React.ReactNode\n  desktopShaderProps?: Partial<StaticRadialGradientProps>\n  mobileShaderProps?: Partial<StaticRadialGradientProps>\n}\n\nexport interface HeroStaticRadialGradientHeadingProps\n  extends Omit<React.ComponentPropsWithoutRef<\"div\">, \"title\"> {\n  title?: React.ReactNode\n  subtitle?: React.ReactNode\n  headingClassName?: string\n}\n\nexport interface HeroStaticRadialGradientDescriptionProps\n  extends React.ComponentPropsWithoutRef<\"div\"> {\n  description?: React.ReactNode\n  descriptionClassName?: string\n}\n\nexport interface HeroStaticRadialGradientActionsProps\n  extends React.ComponentPropsWithoutRef<\"div\"> {\n  showCta?: boolean\n  ctaProps?: Partial<HeroStaticRadialGradientCTAProps>\n  renderCta?: (defaultCta: React.ReactNode) => React.ReactNode\n}\n\nexport interface HeroStaticRadialGradientBadgesProps\n  extends React.ComponentPropsWithoutRef<\"div\"> {\n  showBadges?: boolean\n  techStack?: HeroStaticRadialGradientTechItem[]\n  renderBadge?: (\n    tech: HeroStaticRadialGradientTechItem,\n    index: number,\n    defaultBadge: React.ReactNode\n  ) => React.ReactNode\n}\n\nexport interface HeroStaticRadialGradientVisualProps\n  extends React.ComponentPropsWithoutRef<\"div\"> {\n  desktopShaderProps?: Partial<StaticRadialGradientProps>\n  desktopClassName?: string\n}\n\nexport interface HeroStaticRadialGradientMobileVisualProps\n  extends React.ComponentPropsWithoutRef<\"div\"> {\n  mobileShaderProps?: Partial<StaticRadialGradientProps>\n}\n\nexport interface HeroStaticRadialGradientProps\n  extends HeroStaticRadialGradientRootProps {\n  containerClassName?: string\n  contentClassName?: string\n  headingWrapClassName?: string\n  headingClassName?: string\n  descriptionWrapClassName?: string\n  descriptionClassName?: string\n  ctaWrapClassName?: string\n  badgesWrapClassName?: string\n  visualClassName?: string\n  mobileVisualClassName?: string\n}\n\ninterface HeroStaticRadialGradientContextValue {\n  srTitle: string\n  title: React.ReactNode\n  subtitle: React.ReactNode\n  description: React.ReactNode\n  showCta: boolean\n  mergedCtaProps: HeroStaticRadialGradientCTAProps\n  renderCta?: (defaultCta: React.ReactNode) => React.ReactNode\n  showBadges: boolean\n  techStack: HeroStaticRadialGradientTechItem[]\n  renderBadge?: HeroStaticRadialGradientBadgesProps[\"renderBadge\"]\n  mergedDesktopShaderProps: Partial<StaticRadialGradientProps>\n  mergedMobileShaderProps: Partial<StaticRadialGradientProps>\n}\n\nconst defaultDesktopShaderProps: Partial<StaticRadialGradientProps> = {\n  width: 1280,\n  height: 720,\n  colors: [\"#ed40b3\", \"#adfa1e\", \"#6ef7cc\"],\n  colorBack: \"#ffffff00\",\n  radius: 0.98,\n  focalDistance: 0,\n  focalAngle: 0,\n  falloff: 0.9,\n  mixing: 0.7,\n  distortion: 0,\n  distortionShift: 0,\n  distortionFreq: 12,\n  grainMixer: 1,\n  grainOverlay: 0.5,\n}\n\nconst defaultMobileShaderProps: Partial<StaticRadialGradientProps> = {\n  colors: [\"#ed40b3\", \"#adfa1e\", \"#6ef7cc\"],\n  colorBack: \"#ffffff00\",\n  radius: 0.98,\n  focalDistance: 0,\n  focalAngle: 0,\n  falloff: 0.9,\n  mixing: 0.7,\n  distortion: 0,\n  distortionShift: 0,\n  distortionFreq: 12,\n  grainMixer: 1,\n  grainOverlay: 0.5,\n  style: { height: \"100%\", width: \"100%\" },\n}\n\nconst defaultCtaProps: HeroStaticRadialGradientCTAProps = {\n  label: \"Check it out today \",\n  href: \"https://aisdkagents.com\",\n  target: \"_blank\",\n  rel: \"noopener noreferrer\",\n}\n\nconst defaultDescription = (\n  <>\n    Full-stack vercel ai sdk patterns for workflows, tool calling, and agent\n    orchestration. Built with{\" \"}\n    <span className=\"font-medium tracking-tight\">ai sdk v6</span> and{\" \"}\n    <span className=\"font-medium tracking-tight\">shadcn/ui</span>.\n    <span className=\"hidden sm:inline\"> Headless, themable, practical.</span>\n  </>\n)\n\nconst defaultTechStack: HeroStaticRadialGradientTechItem[] = [\n  {\n    name: \"Next.js\",\n    version: \"v16\",\n    icon: NextjsIcon,\n  },\n  {\n    name: \"AI SDK\",\n    version: \"v6\",\n    icon: AISDKIcon,\n  },\n]\n\nconst HeroStaticRadialGradientContext = React.createContext<\n  HeroStaticRadialGradientContextValue | undefined\n>(undefined)\n\nfunction useHeroStaticRadialGradientContext() {\n  const context = React.useContext(HeroStaticRadialGradientContext)\n  if (!context) {\n    throw new Error(\n      \"HeroStaticRadialGradient components must be used within HeroStaticRadialGradientRoot\"\n    )\n  }\n  return context\n}\n\nexport function useHeroStaticRadialGradient() {\n  return useHeroStaticRadialGradientContext()\n}\n\nexport const HeroStaticRadialGradientRoot = React.forwardRef<\n  HTMLElement,\n  HeroStaticRadialGradientRootProps\n>(({ className, children, srTitle = \"AI SDK Agents\", title = <span className=\"\">\n      AI SDK Agents\n    </span>, subtitle = \"Copy and Paste\", description = defaultDescription, showCta = true, ctaProps, renderCta, showBadges = true, techStack = defaultTechStack, renderBadge, desktopShaderProps, mobileShaderProps, ...props }, ref) => {\n  const mergedCtaProps = React.useMemo(\n    () => ({\n      ...defaultCtaProps,\n      ...ctaProps,\n    }),\n    [ctaProps]\n  )\n\n  const mergedDesktopShaderProps = React.useMemo(\n    () => ({\n      ...defaultDesktopShaderProps,\n      ...desktopShaderProps,\n    }),\n    [desktopShaderProps]\n  )\n\n  const mergedMobileShaderProps = React.useMemo(\n    () => ({\n      ...defaultMobileShaderProps,\n      ...mobileShaderProps,\n      style: {\n        ...(defaultMobileShaderProps.style as React.CSSProperties),\n        ...(mobileShaderProps?.style as React.CSSProperties | undefined),\n      },\n    }),\n    [mobileShaderProps]\n  )\n\n  const contextValue = React.useMemo<HeroStaticRadialGradientContextValue>(\n    () => ({\n      srTitle,\n      title,\n      subtitle,\n      description,\n      showCta,\n      mergedCtaProps,\n      renderCta,\n      showBadges,\n      techStack,\n      renderBadge,\n      mergedDesktopShaderProps,\n      mergedMobileShaderProps,\n    }),\n    [\n      srTitle,\n      title,\n      subtitle,\n      description,\n      showCta,\n      mergedCtaProps,\n      renderCta,\n      showBadges,\n      techStack,\n      renderBadge,\n      mergedDesktopShaderProps,\n      mergedMobileShaderProps,\n    ]\n  )\n\n  return (\n    <HeroStaticRadialGradientContext.Provider value={contextValue}>\n      <section\n        className={cn(\"relative h-full w-full overflow-hidden\", className)}\n        data-slot=\"hero-static-radial-gradient-root\"\n        ref={ref}\n        {...props}\n      >\n        <h1 className=\"sr-only\">{srTitle}</h1>\n        {children}\n      </section>\n    </HeroStaticRadialGradientContext.Provider>\n  )\n})\nHeroStaticRadialGradientRoot.displayName = \"HeroStaticRadialGradientRoot\"\n\nexport function HeroStaticRadialGradientContainer({\n  className,\n  ...props\n}: React.ComponentPropsWithoutRef<\"div\">) {\n  return (\n    <div\n      className={cn(\n        \"relative z-10 container grid gap-6 pb-16 sm:gap-8 sm:pb-20 lg:grid-cols-[1fr_minmax(300px,500px)] lg:items-center lg:gap-12 lg:pb-24 xl:grid-cols-[1fr_1fr]\",\n        className\n      )}\n      data-slot=\"hero-static-radial-gradient-container\"\n      {...props}\n    />\n  )\n}\n\nexport function HeroStaticRadialGradientContent({\n  className,\n  ...props\n}: React.ComponentPropsWithoutRef<\"div\">) {\n  return (\n    <div\n      className={cn(\n        \"flex flex-col justify-center gap-4 text-balance sm:gap-5 sm:px-4 md:px-8 lg:gap-6 lg:pr-0 lg:pl-4 xl:pl-8 2xl:pl-0\",\n        className\n      )}\n      data-slot=\"hero-static-radial-gradient-content\"\n      {...props}\n    />\n  )\n}\n\nexport function HeroStaticRadialGradientHeading({\n  className,\n  title,\n  subtitle,\n  headingClassName,\n  children,\n  ...props\n}: HeroStaticRadialGradientHeadingProps) {\n  const context = useHeroStaticRadialGradientContext()\n  const resolvedTitle = title ?? context.title\n  const resolvedSubtitle = subtitle ?? context.subtitle\n\n  return (\n    <div\n      className={cn(\"pt-4 text-center sm:pt-6 lg:pt-0 lg:text-left\", className)}\n      data-slot=\"hero-static-radial-gradient-heading-wrap\"\n      {...props}\n    >\n      {children ?? (\n        <div className=\"relative\">\n          <h2\n            className={cn(\n              \"relative mb-0 text-3xl font-medium tracking-[-0.04em] text-balance sm:text-4xl md:text-5xl lg:tracking-[-0.06em] xl:text-6xl 2xl:text-7xl\",\n              headingClassName\n            )}\n            data-slot=\"hero-static-radial-gradient-heading\"\n          >\n            {resolvedTitle} <br />\n            {resolvedSubtitle}\n          </h2>\n        </div>\n      )}\n    </div>\n  )\n}\n\nexport function HeroStaticRadialGradientDescription({\n  className,\n  description,\n  descriptionClassName,\n  children,\n  ...props\n}: HeroStaticRadialGradientDescriptionProps) {\n  const context = useHeroStaticRadialGradientContext()\n  const resolvedDescription = description ?? context.description\n\n  return (\n    <div\n      className={cn(\n        \"mx-auto max-w-xl pb-2 text-center sm:pb-4 lg:mx-0 lg:max-w-none lg:pb-0 lg:text-left\",\n        className\n      )}\n      data-slot=\"hero-static-radial-gradient-description-wrap\"\n      {...props}\n    >\n      {children ?? (\n        <p\n          className={cn(\n            \"text-foreground/70 md:text-foreground/80 mt-0 mb-0 font-sans text-sm sm:text-base lg:text-lg xl:text-xl\",\n            descriptionClassName\n          )}\n          data-slot=\"hero-static-radial-gradient-description\"\n        >\n          {resolvedDescription}\n        </p>\n      )}\n    </div>\n  )\n}\n\nexport function HeroStaticRadialGradientActions({\n  className,\n  showCta,\n  ctaProps,\n  renderCta,\n  children,\n  ...props\n}: HeroStaticRadialGradientActionsProps) {\n  const context = useHeroStaticRadialGradientContext()\n  const shouldShowCta = showCta ?? context.showCta\n  const resolvedCtaProps = { ...context.mergedCtaProps, ...ctaProps }\n  const resolvedRenderCta = renderCta ?? context.renderCta\n\n  if (!shouldShowCta) {\n    return null\n  }\n\n  const defaultCta = <HeroStaticRadialGradientCTA {...resolvedCtaProps} />\n\n  return (\n    <div\n      className={cn(\"flex justify-center lg:justify-start\", className)}\n      data-slot=\"hero-static-radial-gradient-cta-wrap\"\n      {...props}\n    >\n      {children ??\n        (resolvedRenderCta ? resolvedRenderCta(defaultCta) : defaultCta)}\n    </div>\n  )\n}\n\nexport function HeroStaticRadialGradientCTA({\n  label,\n  href,\n  target,\n  rel,\n  onClick,\n  className,\n  buttonClassName,\n}: HeroStaticRadialGradientCTAProps) {\n  return (\n    <div\n      className={cn(\n        \"flex items-center justify-center gap-4 pb-4 md:pb-0\",\n        className\n      )}\n      data-slot=\"hero-static-radial-gradient-cta\"\n    >\n      <Button asChild className={cn(buttonClassName)} size=\"lg\">\n        <a href={href} onClick={onClick} rel={rel} target={target}>\n          {label}\n        </a>\n      </Button>\n    </div>\n  )\n}\n\nexport function HeroStaticRadialGradientBadges({\n  className,\n  showBadges,\n  techStack,\n  renderBadge,\n  ...props\n}: HeroStaticRadialGradientBadgesProps) {\n  const context = useHeroStaticRadialGradientContext()\n  const shouldShowBadges = showBadges ?? context.showBadges\n  const resolvedTechStack = techStack ?? context.techStack\n  const resolvedRenderBadge = renderBadge ?? context.renderBadge\n\n  if (!shouldShowBadges) {\n    return null\n  }\n\n  return (\n    <div\n      className={cn(\n        \"flex flex-wrap items-center justify-center gap-2.5\",\n        className\n      )}\n      data-slot=\"hero-static-radial-gradient-badges\"\n      {...props}\n    >\n      {resolvedTechStack.map((tech, index) => {\n        const Icon = tech.icon\n        const defaultBadge = (\n          <Badge\n            className={cn(\n              \"group relative px-3.5 py-1.5 font-medium transition-all duration-150\",\n              \"border-border/50 bg-card text-card-foreground border\",\n              \"shadow-[0_1px_3px_rgba(0,0,0,0.08)] dark:shadow-[0_1px_3px_rgba(0,0,0,0.3)]\",\n              \"hover:-translate-y-px hover:shadow-[0_2px_8px_rgba(0,0,0,0.12)] dark:hover:shadow-[0_2px_8px_rgba(0,0,0,0.4)]\"\n            )}\n            data-slot=\"hero-static-radial-gradient-badge\"\n            key={tech.name}\n            variant=\"outline\"\n          >\n            {Icon ? <Icon className=\"mr-1 size-3.5 opacity-80\" /> : null}\n            <span className=\"font-semibold tracking-tight\">{tech.name}</span>\n            {tech.version ? (\n              <span className=\"font-mono text-xs opacity-50\">\n                {tech.version}\n              </span>\n            ) : null}\n          </Badge>\n        )\n\n        if (resolvedRenderBadge) {\n          return (\n            <React.Fragment key={tech.name}>\n              {resolvedRenderBadge(tech, index, defaultBadge)}\n            </React.Fragment>\n          )\n        }\n\n        return defaultBadge\n      })}\n    </div>\n  )\n}\n\nexport function HeroStaticRadialGradientVisual({\n  className,\n  desktopClassName,\n  desktopShaderProps,\n  ...props\n}: HeroStaticRadialGradientVisualProps) {\n  const context = useHeroStaticRadialGradientContext()\n  const resolvedDesktopShaderProps = {\n    ...context.mergedDesktopShaderProps,\n    ...desktopShaderProps,\n  }\n\n  return (\n    <div\n      className={cn(\n        \"relative hidden h-[350px] lg:block lg:h-[400px] xl:h-[500px]\",\n        className\n      )}\n      data-slot=\"hero-static-radial-gradient-visual\"\n      {...props}\n    >\n      <div\n        className={cn(\n          \"absolute inset-0 flex items-center justify-center overflow-hidden rounded-full\",\n          desktopClassName\n        )}\n        data-slot=\"hero-static-radial-gradient-desktop\"\n      >\n        <MemoizedStaticRadialGradient {...resolvedDesktopShaderProps} />\n      </div>\n    </div>\n  )\n}\n\nexport function HeroStaticRadialGradientMobileVisual({\n  className,\n  mobileShaderProps,\n  ...props\n}: HeroStaticRadialGradientMobileVisualProps) {\n  const context = useHeroStaticRadialGradientContext()\n  const resolvedMobileShaderProps = {\n    ...context.mergedMobileShaderProps,\n    ...mobileShaderProps,\n    style: {\n      ...(context.mergedMobileShaderProps.style as React.CSSProperties),\n      ...(mobileShaderProps?.style as React.CSSProperties | undefined),\n    },\n  }\n\n  return (\n    <div\n      className={cn(\n        \"pointer-events-none absolute inset-x-0 -bottom-20 -z-10 h-[380px] overflow-hidden lg:hidden\",\n        className\n      )}\n      data-slot=\"hero-static-radial-gradient-mobile\"\n      {...props}\n    >\n      <div className=\"from-background via-background/90 absolute inset-x-0 top-0 z-10 h-44 bg-gradient-to-b to-transparent\" />\n      <MemoizedStaticRadialGradient {...resolvedMobileShaderProps} />\n    </div>\n  )\n}\n\nexport function HeroStaticRadialGradient({\n  containerClassName,\n  contentClassName,\n  headingWrapClassName,\n  headingClassName,\n  descriptionWrapClassName,\n  descriptionClassName,\n  ctaWrapClassName,\n  badgesWrapClassName,\n  visualClassName,\n  mobileVisualClassName,\n  ...props\n}: HeroStaticRadialGradientProps) {\n  return (\n    <HeroStaticRadialGradientRoot {...props}>\n      <HeroStaticRadialGradientContainer className={containerClassName}>\n        <HeroStaticRadialGradientContent className={contentClassName}>\n          <HeroStaticRadialGradientHeading\n            className={headingWrapClassName}\n            headingClassName={headingClassName}\n          />\n          <HeroStaticRadialGradientDescription\n            className={descriptionWrapClassName}\n            descriptionClassName={descriptionClassName}\n          />\n          <HeroStaticRadialGradientActions className={ctaWrapClassName} />\n          <div\n            className={cn(\n              \"flex justify-center lg:justify-start\",\n              badgesWrapClassName\n            )}\n            data-slot=\"hero-static-radial-gradient-badges-wrap\"\n          >\n            <HeroStaticRadialGradientBadges />\n          </div>\n        </HeroStaticRadialGradientContent>\n        <HeroStaticRadialGradientVisual className={visualClassName} />\n      </HeroStaticRadialGradientContainer>\n      <HeroStaticRadialGradientMobileVisual className={mobileVisualClassName} />\n    </HeroStaticRadialGradientRoot>\n  )\n}\n\nexport function AISDKIcon(props: SVGProps<SVGSVGElement>) {\n  return (\n    <svg\n      color=\"currentcolor\"\n      data-testid=\"geist-icon\"\n      height=\"1em\"\n      strokeLinejoin=\"round\"\n      viewBox=\"0 0 16 16\"\n      width=\"1em\"\n      {...props}\n    >\n      <title>AI SDK</title>\n      <path\n        d=\"M2.5.5V0h1v.5a2 2 0 002 2H6v1h-.5a2 2 0 00-2 2V6h-1v-.5a2 2 0 00-2-2H0v-1h.5a2 2 0 002-2zM14.5 4.5V5h-1v-.5a1 1 0 00-1-1H12v-1h.5a1 1 0 001-1V1h1v.5a1 1 0 001 1h.5v1h-.5a1 1 0 00-1 1zM8.407 4.93L8.5 4h1l.093.93a5 5 0 004.478 4.477L15 9.5v1l-.93.093a5 5 0 00-4.477 4.478L9.5 16h-1l-.093-.93a5 5 0 00-4.478-4.477L3 10.5v-1l.93-.093A5 5 0 008.406 4.93z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  )\n}\n\nexport function NextjsIcon(props: SVGProps<SVGSVGElement>) {\n  const id = React.useId()\n  const maskId = `${id}-mask`\n  const paint0Id = `${id}-paint0`\n  const paint1Id = `${id}-paint1`\n\n  return (\n    <svg\n      fill=\"none\"\n      height=\"1em\"\n      viewBox=\"0 0 180 180\"\n      width=\"1em\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}\n    >\n      <title>Next.js</title>\n      <mask\n        height={180}\n        id={maskId}\n        maskUnits=\"userSpaceOnUse\"\n        style={{\n          maskType: \"alpha\",\n        }}\n        width={180}\n        x={0}\n        y={0}\n      >\n        <circle cx={90} cy={90} fill=\"black\" r={90} />\n      </mask>\n      <g mask={`url(#${maskId})`}>\n        <circle\n          cx={90}\n          cy={90}\n          fill=\"black\"\n          r={87}\n          stroke=\"white\"\n          strokeWidth={6}\n        />\n        <path\n          d=\"M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z\"\n          fill={`url(#${paint0Id})`}\n        />\n        <rect\n          fill={`url(#${paint1Id})`}\n          height={72}\n          width={12}\n          x={115}\n          y={54}\n        />\n      </g>\n      <defs>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id={paint0Id}\n          x1={109}\n          x2={144.5}\n          y1={116.5}\n          y2={160.5}\n        >\n          <stop stopColor=\"white\" />\n          <stop offset={1} stopColor=\"white\" stopOpacity={0} />\n        </linearGradient>\n        <linearGradient\n          gradientUnits=\"userSpaceOnUse\"\n          id={paint1Id}\n          x1={121}\n          x2={120.799}\n          y1={54}\n          y2={106.875}\n        >\n          <stop stopColor=\"white\" />\n          <stop offset={1} stopColor=\"white\" stopOpacity={0} />\n        </linearGradient>\n      </defs>\n    </svg>\n  )\n}\n\nexport default HeroStaticRadialGradient\n",
      "type": "registry:ui"
    }
  ]
}