{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "halo-card",
  "type": "registry:ui",
  "description": "Composable card with animated gradient rim, frosted fill, layered shadow, and Base UI button actions",
  "dependencies": [
    "@base-ui/react",
    "motion"
  ],
  "files": [
    {
      "path": "registry/default/ui/halo-card.tsx",
      "content": "\"use client\"\n\n/**\n * Composable card matching `HaloSearchInput` / `HaloButtonPolished`:\n * animated gradient rim, frosted fill, layered shadow, fine-hover polish.\n *\n * @example\n * <HaloCard aria-label=\"Example\">\n *   <HaloCardHeader>\n *     <HaloCardTitle>Title</HaloCardTitle>\n *     <HaloCardDescription>Body copy.</HaloCardDescription>\n *   </HaloCardHeader>\n *   <HaloCardContent>Optional main area.</HaloCardContent>\n *   <HaloCardFooter>\n *     <HaloCardButton variant=\"secondary\">Cancel</HaloCardButton>\n *     <HaloCardButton variant=\"primary\">Continue</HaloCardButton>\n *   </HaloCardFooter>\n * </HaloCard>\n */\nimport {\n  forwardRef,\n  useEffect,\n  useMemo,\n  useState,\n  type ComponentProps,\n  type HTMLAttributes,\n  type ReactNode,\n} from \"react\"\nimport { Button as ButtonPrimitive } from \"@base-ui/react/button\"\nimport {\n  motion,\n  useMotionValue,\n  useReducedMotion,\n  useTransform,\n} from \"motion/react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst paddingClass = {\n  none: \"\",\n  sm: \"p-4\",\n  md: \"p-6\",\n  lg: \"p-8\",\n} as const\n\nconst BORDER_TRAIL_LOOP_MS = 5250\n\n/** Moving rim highlight along the card edge (mask = border band only). Phase persists when hover/focus stops. */\nfunction HaloCardBorderTrail({ active }: { active: boolean }) {\n  const progress = useMotionValue(0)\n  const offsetDistance = useTransform(progress, (v: number) => {\n    const wrapped = ((v % 100) + 100) % 100\n    return `${wrapped}%`\n  })\n\n  useEffect(() => {\n    if (!active) {\n      return\n    }\n    let rafId = 0\n    let last = performance.now()\n    const tick = (now: number) => {\n      const dt = now - last\n      last = now\n      const next = progress.get() + (dt / BORDER_TRAIL_LOOP_MS) * 100\n      progress.set(((next % 100) + 100) % 100)\n      rafId = requestAnimationFrame(tick)\n    }\n    rafId = requestAnimationFrame(tick)\n    return () => cancelAnimationFrame(rafId)\n  }, [active, progress])\n\n  const pathCornerRadiusPx = 16\n  const trailLengthPx = 184\n  const trailThicknessPx = 32\n\n  const trailBox = {\n    height: trailThicknessPx,\n    offsetPath: `rect(0 auto auto 0 round ${pathCornerRadiusPx}px)`,\n    width: trailLengthPx,\n  } as const\n\n  /** Feathered ends + same hue family as `borderGlowConfig` so it reads as one rim system. */\n  const ambientGradient =\n    \"linear-gradient(90deg, transparent 0%, rgba(255,0,128,0) 6%, rgba(255,0,128,0.38) 24%, rgba(121,40,202,0.5) 50%, rgba(0,212,255,0.42) 76%, rgba(0,212,255,0) 94%, transparent 100%)\"\n\n  const coreGradient =\n    \"linear-gradient(90deg, transparent 0%, rgba(255,0,128,0.72) 20%, rgba(200,140,255,0.92) 50%, rgba(0,212,255,0.78) 80%, transparent 100%)\"\n\n  return (\n    <div\n      className={cn(\n        \"pointer-events-none absolute inset-0 rounded-[inherit] border border-transparent [mask-clip:padding-box,border-box] [mask-composite:intersect] [mask-image:linear-gradient(transparent,transparent),linear-gradient(#000,#000)]\",\n        active ? \"visible opacity-100\" : \"invisible opacity-0\"\n      )}\n    >\n      {/* Wide soft bloom — ties into frosted card edge */}\n      <motion.div\n        className=\"absolute opacity-95 dark:opacity-[0.98]\"\n        style={{\n          ...trailBox,\n          filter: \"blur(12px)\",\n          offsetDistance,\n        }}\n      >\n        <div\n          className=\"size-full rounded-[999px]\"\n          style={{\n            background: ambientGradient,\n            boxShadow:\n              \"0 0 22px rgba(121,40,202,0.28), 0 0 44px rgba(0,212,255,0.18), 0 0 2px rgba(255,255,255,0.12)\",\n          }}\n        />\n      </motion.div>\n      {/* Brighter core — higher-opacity read without a hard capsule edge */}\n      <motion.div\n        className=\"absolute dark:opacity-[0.94]\"\n        style={{\n          ...trailBox,\n          filter: \"blur(4px)\",\n          offsetDistance,\n        }}\n      >\n        <div\n          className=\"size-full rounded-[999px]\"\n          style={{\n            background: coreGradient,\n            boxShadow:\n              \"0 0 14px rgba(255,0,128,0.35), 0 0 28px rgba(0,212,255,0.32), inset 0 0 1px rgba(255,255,255,0.22)\",\n          }}\n        />\n      </motion.div>\n    </div>\n  )\n}\n\nfunction borderGlowConfig(translucent: boolean, rimEmphasis: boolean) {\n  let idleOpacity: number\n  if (translucent) {\n    idleOpacity = rimEmphasis ? 0.92 : 0.72\n  } else {\n    idleOpacity = rimEmphasis ? 0.78 : 0.5\n  }\n  return {\n    opacityIdle: idleOpacity,\n    primaryBg: \"linear-gradient(90deg, #ff0080, #7928ca, #00d4ff, #0070f3)\",\n    secondaryBg: \"linear-gradient(90deg, #ff4d4d, #f9cb28, #ff0080)\",\n    tertiaryBg: \"linear-gradient(90deg, #0070f3, #00d4ff, #7928ca)\",\n    primaryLeft: [\"-5%\", \"75%\", \"-5%\"],\n    secondaryLeft: [\"65%\", \"10%\", \"65%\"],\n    tertiaryLeft: [\"25%\", \"55%\", \"25%\"],\n    durationMain: 6,\n    durationSec: 5,\n    durationTer: 4,\n  }\n}\n\ntype BorderGlowState = ReturnType<typeof borderGlowConfig>\n\nfunction GradientRimPillBlobs({\n  borderGlow,\n  reduceMotion,\n}: {\n  borderGlow: BorderGlowState\n  reduceMotion: boolean\n}) {\n  return (\n    <div className=\"pointer-events-none absolute inset-0 overflow-hidden rounded-full\">\n      <motion.div\n        animate={{\n          opacity: reduceMotion\n            ? borderGlow.opacityIdle * 0.82\n            : borderGlow.opacityIdle,\n        }}\n        className=\"absolute inset-x-0 bottom-0 h-1/2\"\n        transition={{ duration: 0.25, ease: \"easeOut\" }}\n      >\n        <motion.div\n          animate={{\n            left: borderGlow.primaryLeft,\n          }}\n          className=\"-bottom-5 absolute h-20 w-56 blur-2xl\"\n          style={{\n            background: borderGlow.primaryBg,\n          }}\n          transition={{\n            duration: reduceMotion ? 0.01 : borderGlow.durationMain,\n            repeat: reduceMotion ? 0 : Number.POSITIVE_INFINITY,\n            ease: \"easeInOut\",\n          }}\n        />\n        <motion.div\n          animate={{\n            left: borderGlow.secondaryLeft,\n          }}\n          className=\"-bottom-4 absolute h-16 w-40 blur-xl\"\n          style={{\n            background: borderGlow.secondaryBg,\n          }}\n          transition={{\n            duration: reduceMotion ? 0.01 : borderGlow.durationSec,\n            repeat: reduceMotion ? 0 : Number.POSITIVE_INFINITY,\n            ease: \"easeInOut\",\n          }}\n        />\n        <motion.div\n          animate={{\n            left: borderGlow.tertiaryLeft,\n          }}\n          className=\"-bottom-3 absolute h-14 w-32 blur-lg\"\n          style={{\n            background: borderGlow.tertiaryBg,\n          }}\n          transition={{\n            duration: reduceMotion ? 0.01 : borderGlow.durationTer,\n            repeat: reduceMotion ? 0 : Number.POSITIVE_INFINITY,\n            ease: \"easeInOut\",\n          }}\n        />\n      </motion.div>\n    </div>\n  )\n}\n\nfunction fillBackgroundFor(\n  translucent: boolean,\n  interactive: boolean,\n  rimEmphasis: boolean\n) {\n  if (translucent) {\n    if (interactive && rimEmphasis) {\n      return \"linear-gradient(to bottom, color-mix(in oklch, var(--card) 88%, transparent) 0%, color-mix(in oklch, var(--card) 74%, transparent) 100%)\"\n    }\n    return \"linear-gradient(to bottom, color-mix(in oklch, var(--card) 82%, transparent) 0%, color-mix(in oklch, var(--card) 70%, transparent) 100%)\"\n  }\n  if (interactive && rimEmphasis) {\n    return \"linear-gradient(to bottom, var(--card) 0%, color-mix(in oklch, var(--card) 90%, var(--muted)) 100%)\"\n  }\n  return \"linear-gradient(to bottom, var(--card) 0%, color-mix(in oklch, var(--card) 94%, var(--muted)) 100%)\"\n}\n\nexport interface HaloCardProps extends ComponentProps<\"div\"> {\n  children: ReactNode\n  /** Frosted inner surface so gradient blobs read through. */\n  translucent?: boolean\n  /** Hover + rim emphasis on the animated edge. */\n  interactive?: boolean\n  /** Padding inside the card surface. */\n  padding?: keyof typeof paddingClass\n}\n\nconst HaloCard = forwardRef<HTMLDivElement, HaloCardProps>(function HaloCard(\n  {\n    children,\n    className,\n    translucent = true,\n    interactive = true,\n    padding = \"md\",\n    \"aria-label\": ariaLabel = \"Card\",\n    onBlur,\n    onFocus,\n    onMouseEnter,\n    onMouseLeave,\n    ...props\n  },\n  ref\n) {\n  const [isHovered, setIsHovered] = useState(false)\n  const [isFocusedWithin, setIsFocusedWithin] = useState(false)\n  const reduceMotion = useReducedMotion() ?? false\n\n  const rimEmphasis = interactive && (isHovered || isFocusedWithin)\n\n  const borderGlow = useMemo(\n    () => borderGlowConfig(translucent, rimEmphasis),\n    [translucent, rimEmphasis]\n  )\n\n  const fillBackground = useMemo(\n    () => fillBackgroundFor(translucent, interactive, rimEmphasis),\n    [translucent, interactive, rimEmphasis]\n  )\n\n  const showTrailChrome = interactive && !reduceMotion\n  const trailActive = isHovered || isFocusedWithin\n\n  return (\n    // biome-ignore lint/a11y/noNoninteractiveElementInteractions: hover drives animated rim; focusable controls render in children.\n    // biome-ignore lint/a11y/useSemanticElements: not a form group; fieldset would be incorrect for layout chrome.\n    <div\n      aria-label={ariaLabel}\n      className={cn(\"relative w-full max-w-full\", className)}\n      data-slot=\"halo-card\"\n      onBlur={(e) => {\n        if (!e.currentTarget.contains(e.relatedTarget as Node | null)) {\n          setIsFocusedWithin(false)\n        }\n        onBlur?.(e)\n      }}\n      onFocus={(e) => {\n        if (interactive) {\n          setIsFocusedWithin(true)\n        }\n        onFocus?.(e)\n      }}\n      onMouseEnter={(e) => {\n        if (interactive) {\n          setIsHovered(true)\n        }\n        onMouseEnter?.(e)\n      }}\n      onMouseLeave={(e) => {\n        setIsHovered(false)\n        onMouseLeave?.(e)\n      }}\n      ref={ref}\n      role=\"group\"\n      {...props}\n    >\n      <div className=\"relative rounded-2xl p-px\">\n        <div className=\"pointer-events-none absolute inset-0 z-0 overflow-hidden rounded-2xl\">\n          <motion.div\n            animate={{\n              opacity: reduceMotion\n                ? borderGlow.opacityIdle * 0.82\n                : borderGlow.opacityIdle,\n            }}\n            className=\"absolute inset-x-0 bottom-0 h-[58%]\"\n            transition={{ duration: 0.25, ease: \"easeOut\" }}\n          >\n            <motion.div\n              animate={{\n                left: borderGlow.primaryLeft,\n              }}\n              className=\"-bottom-10 absolute h-32 w-88 blur-2xl\"\n              style={{\n                background: borderGlow.primaryBg,\n              }}\n              transition={{\n                duration: reduceMotion ? 0.01 : borderGlow.durationMain,\n                repeat: reduceMotion ? 0 : Number.POSITIVE_INFINITY,\n                ease: \"easeInOut\",\n              }}\n            />\n            <motion.div\n              animate={{\n                left: borderGlow.secondaryLeft,\n              }}\n              className=\"-bottom-7 absolute h-24 w-52 blur-2xl\"\n              style={{\n                background: borderGlow.secondaryBg,\n              }}\n              transition={{\n                duration: reduceMotion ? 0.01 : borderGlow.durationSec,\n                repeat: reduceMotion ? 0 : Number.POSITIVE_INFINITY,\n                ease: \"easeInOut\",\n              }}\n            />\n            <motion.div\n              animate={{\n                left: borderGlow.tertiaryLeft,\n              }}\n              className=\"-bottom-5 absolute h-20 w-44 blur-xl\"\n              style={{\n                background: borderGlow.tertiaryBg,\n              }}\n              transition={{\n                duration: reduceMotion ? 0.01 : borderGlow.durationTer,\n                repeat: reduceMotion ? 0 : Number.POSITIVE_INFINITY,\n                ease: \"easeInOut\",\n              }}\n            />\n          </motion.div>\n        </div>\n\n        <div\n          className={cn(\n            \"relative z-0 flex flex-col gap-6 rounded-[15px] border border-border/90\",\n            \"shadow-[0_1px_0_rgba(255,255,255,0.1)_inset,0_1px_2px_rgba(0,0,0,0.04),0_4px_14px_rgba(0,0,0,0.05)]\",\n            \"dark:border-border dark:shadow-[0_1px_0_rgba(255,255,255,0.06)_inset,0_1px_2px_rgba(0,0,0,0.35),0_4px_20px_rgba(0,0,0,0.35)]\",\n            \"outline-none transition-[background-color,backdrop-filter,border-color,box-shadow] duration-200 ease-out\",\n            interactive &&\n              \"fine-hover:hover:border-ring/50 fine-hover:hover:shadow-[0_1px_0_rgba(255,255,255,0.14)_inset,0_1px_2px_rgba(0,0,0,0.09),0_4px_14px_rgba(0,0,0,0.11)]\",\n            interactive &&\n              \"dark:fine-hover:hover:border-zinc-500/60 dark:fine-hover:hover:shadow-[0_1px_0_rgba(255,255,255,0.08)_inset,0_1px_2px_rgba(0,0,0,0.42),0_4px_20px_rgba(0,0,0,0.48)]\",\n            interactive &&\n              \"focus-within:border-ring/70 focus-within:shadow-[0_1px_0_rgba(255,255,255,0.14)_inset,0_1px_2px_rgba(0,0,0,0.09),0_4px_14px_rgba(0,0,0,0.11)]\",\n            interactive &&\n              \"dark:focus-within:border-zinc-500/55 dark:focus-within:shadow-[0_1px_0_rgba(255,255,255,0.08)_inset,0_1px_2px_rgba(0,0,0,0.42),0_4px_20px_rgba(0,0,0,0.48)]\",\n            translucent && \"backdrop-blur-xl backdrop-saturate-150\",\n            padding !== \"none\" && paddingClass[padding]\n          )}\n          data-slot=\"halo-card-surface\"\n          style={{ background: fillBackground }}\n        >\n          {children}\n        </div>\n\n        {showTrailChrome ? (\n          <div className=\"pointer-events-none absolute inset-0 z-10 rounded-2xl\">\n            <HaloCardBorderTrail active={trailActive} />\n          </div>\n        ) : null}\n      </div>\n    </div>\n  )\n})\n\nHaloCard.displayName = \"HaloCard\"\n\nfunction HaloCardHeader({ className, ...props }: ComponentProps<\"div\">) {\n  return (\n    <div\n      className={cn(\n        \"grid auto-rows-min items-start gap-x-4 gap-y-1.5\",\n        \"has-[>[data-slot=halo-card-action]]:grid-cols-[1fr_auto]\",\n        \"has-[>[data-slot=halo-card-description]]:grid-rows-[auto_auto]\",\n        className\n      )}\n      data-slot=\"halo-card-header\"\n      {...props}\n    />\n  )\n}\nHaloCardHeader.displayName = \"HaloCardHeader\"\n\nconst HaloCardTitle = forwardRef<HTMLHeadingElement, ComponentProps<\"h3\">>(\n  function HaloCardTitle({ className, ...props }, ref) {\n    return (\n      <h3\n        className={cn(\n          \"col-start-1 row-start-1 text-balance font-semibold text-foreground text-lg leading-tight tracking-tight antialiased\",\n          className\n        )}\n        data-slot=\"halo-card-title\"\n        ref={ref}\n        {...props}\n      />\n    )\n  }\n)\nHaloCardTitle.displayName = \"HaloCardTitle\"\n\nconst HaloCardDescription = forwardRef<\n  HTMLParagraphElement,\n  ComponentProps<\"p\">\n>(function HaloCardDescription({ className, ...props }, ref) {\n  return (\n    <p\n      className={cn(\n        \"col-start-1 row-start-2 text-pretty text-muted-foreground text-sm leading-relaxed\",\n        className\n      )}\n      data-slot=\"halo-card-description\"\n      ref={ref}\n      {...props}\n    />\n  )\n})\nHaloCardDescription.displayName = \"HaloCardDescription\"\n\nfunction HaloCardAction({ className, ...props }: ComponentProps<\"div\">) {\n  return (\n    <div\n      className={cn(\n        \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n        className\n      )}\n      data-slot=\"halo-card-action\"\n      {...props}\n    />\n  )\n}\nHaloCardAction.displayName = \"HaloCardAction\"\n\nfunction HaloCardContent({\n  className,\n  ...props\n}: HTMLAttributes<HTMLDivElement>) {\n  return (\n    <div\n      className={cn(\"flex min-h-0 flex-col gap-3\", className)}\n      data-slot=\"halo-card-content\"\n      {...props}\n    />\n  )\n}\nHaloCardContent.displayName = \"HaloCardContent\"\n\nfunction HaloCardFooter({ className, ...props }: ComponentProps<\"div\">) {\n  return (\n    <div\n      className={cn(\"flex flex-wrap items-center justify-end gap-2\", className)}\n      data-slot=\"halo-card-footer\"\n      {...props}\n    />\n  )\n}\nHaloCardFooter.displayName = \"HaloCardFooter\"\n\nexport interface HaloCardButtonProps\n  extends Omit<ComponentProps<typeof ButtonPrimitive>, \"children\"> {\n  children: ReactNode\n  /**\n   * `primary` — animated gradient rim + frosted fill (matches card chrome).\n   * `secondary` — muted surface, high-contrast `text-foreground`, subtle gradient ring (e.g. Cancel).\n   */\n  variant?: \"primary\" | \"secondary\"\n  size?: \"default\" | \"icon\"\n}\n\nconst HaloCardButton = forwardRef<HTMLButtonElement, HaloCardButtonProps>(\n  function HaloCardButton(\n    {\n      children,\n      className,\n      variant = \"primary\",\n      size = \"default\",\n      disabled,\n      onFocus,\n      onBlur,\n      onMouseEnter,\n      onMouseLeave,\n      style,\n      type,\n      ...props\n    },\n    ref\n  ) {\n    const [isHovered, setIsHovered] = useState(false)\n    const [isFocused, setIsFocused] = useState(false)\n    const reduceMotion = useReducedMotion() ?? false\n\n    const rimEmphasis = isHovered || isFocused\n\n    const borderGlow = useMemo(\n      () => borderGlowConfig(true, rimEmphasis),\n      [rimEmphasis]\n    )\n\n    const fillBackground = useMemo(\n      () => fillBackgroundFor(true, true, rimEmphasis),\n      [rimEmphasis]\n    )\n\n    if (variant === \"secondary\") {\n      return (\n        <div\n          className={cn(\"relative inline-flex max-w-full\", className)}\n          data-slot=\"halo-card-button\"\n          data-variant=\"secondary\"\n        >\n          <div\n            className={cn(\n              \"rounded-full p-px transition-opacity duration-200 ease-out\",\n              \"fine-hover:opacity-100 opacity-95\",\n              \"[background:linear-gradient(135deg,rgba(255,0,128,0.42),rgba(121,40,202,0.32),rgba(0,212,255,0.38))]\",\n              \"dark:[background:linear-gradient(135deg,rgba(232,121,249,0.32),rgba(167,139,250,0.28),rgba(34,211,238,0.35))]\"\n            )}\n          >\n            <ButtonPrimitive\n              className={cn(\n                \"relative flex min-w-0 select-none items-center justify-center rounded-full\",\n                \"border border-border/90 bg-muted font-medium text-foreground text-sm tracking-tight antialiased\",\n                \"shadow-[0_1px_0_rgba(255,255,255,0.1)_inset,0_1px_2px_rgba(0,0,0,0.06)]\",\n                \"dark:border-border dark:bg-muted dark:text-foreground\",\n                \"fine-hover:hover:border-ring/50 fine-hover:hover:bg-accent fine-hover:hover:text-accent-foreground\",\n                \"outline-none transition-[background-color,border-color,box-shadow,color,transform] duration-200 ease-out\",\n                \"focus-visible:border-ring/70 focus-visible:ring-2 focus-visible:ring-ring/30 dark:focus-visible:border-zinc-500/45\",\n                \"enabled:active:scale-[0.96] motion-reduce:enabled:active:scale-100\",\n                \"disabled:pointer-events-none disabled:opacity-50\",\n                size === \"icon\"\n                  ? \"size-11 p-0 [&_svg]:shrink-0\"\n                  : \"min-h-11 px-6 py-2.5\"\n              )}\n              disabled={disabled}\n              onBlur={(e) => {\n                setIsFocused(false)\n                onBlur?.(e)\n              }}\n              onFocus={(e) => {\n                setIsFocused(true)\n                onFocus?.(e)\n              }}\n              onMouseEnter={(e) => {\n                setIsHovered(true)\n                onMouseEnter?.(e)\n              }}\n              onMouseLeave={(e) => {\n                setIsHovered(false)\n                onMouseLeave?.(e)\n              }}\n              ref={ref}\n              type={type ?? \"button\"}\n              {...props}\n            >\n              {children}\n            </ButtonPrimitive>\n          </div>\n        </div>\n      )\n    }\n\n    return (\n      <div\n        className={cn(\"relative inline-flex max-w-full\", className)}\n        data-slot=\"halo-card-button\"\n        data-variant=\"primary\"\n      >\n        <div className=\"relative rounded-full p-px\">\n          <GradientRimPillBlobs\n            borderGlow={borderGlow}\n            reduceMotion={reduceMotion}\n          />\n          <ButtonPrimitive\n            className={cn(\n              \"relative flex min-w-0 select-none items-center justify-center rounded-full\",\n              \"border border-border/90\",\n              \"shadow-[0_1px_0_rgba(255,255,255,0.1)_inset,0_1px_2px_rgba(0,0,0,0.04),0_4px_14px_rgba(0,0,0,0.05)]\",\n              \"dark:border-border dark:shadow-[0_1px_0_rgba(255,255,255,0.06)_inset,0_1px_2px_rgba(0,0,0,0.35),0_4px_20px_rgba(0,0,0,0.35)]\",\n              \"outline-none transition-[transform,background-color,backdrop-filter,border-color,box-shadow] duration-200 ease-out\",\n              \"fine-hover:hover:border-ring/50 fine-hover:hover:shadow-[0_1px_0_rgba(255,255,255,0.12)_inset,0_2px_6px_rgba(0,0,0,0.06),0_8px_24px_rgba(0,0,0,0.08)]\",\n              \"dark:fine-hover:hover:border-zinc-500/60 dark:fine-hover:hover:shadow-[0_1px_0_rgba(255,255,255,0.08)_inset,0_4px_12px_rgba(0,0,0,0.45),0_12px_32px_rgba(0,0,0,0.45)]\",\n              \"focus-visible:border-ring/70 focus-visible:ring-2 focus-visible:ring-ring/30 dark:focus-visible:border-zinc-500/45\",\n              \"enabled:active:scale-[0.96] motion-reduce:enabled:active:scale-100\",\n              \"disabled:pointer-events-none disabled:opacity-50\",\n              \"backdrop-blur-xl backdrop-saturate-150\",\n              \"font-medium text-foreground text-sm tracking-tight antialiased\",\n              size === \"icon\"\n                ? \"size-11 p-0 [&_svg]:shrink-0\"\n                : \"min-h-11 gap-2 px-6 py-2.5\"\n            )}\n            disabled={disabled}\n            onBlur={(e) => {\n              setIsFocused(false)\n              onBlur?.(e)\n            }}\n            onFocus={(e) => {\n              setIsFocused(true)\n              onFocus?.(e)\n            }}\n            onMouseEnter={(e) => {\n              setIsHovered(true)\n              onMouseEnter?.(e)\n            }}\n            onMouseLeave={(e) => {\n              setIsHovered(false)\n              onMouseLeave?.(e)\n            }}\n            ref={ref}\n            style={{\n              ...style,\n              background: fillBackground,\n            }}\n            type={type ?? \"button\"}\n            {...props}\n          >\n            {children}\n          </ButtonPrimitive>\n        </div>\n      </div>\n    )\n  }\n)\n\nHaloCardButton.displayName = \"HaloCardButton\"\n\n/** @deprecated Use `HaloCard` — alias kept for existing imports. */\nconst HaloCardPolished = HaloCard\n\n/** @deprecated Use `HaloCardProps` */\nexport type HaloCardPolishedProps = HaloCardProps\n\nexport {\n  HaloCard,\n  HaloCardAction,\n  HaloCardButton,\n  HaloCardContent,\n  HaloCardDescription,\n  HaloCardFooter,\n  HaloCardHeader,\n  /** @deprecated Use `HaloCard` */\n  HaloCardPolished,\n  HaloCardTitle,\n}\n",
      "type": "registry:ui"
    }
  ]
}