{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"ui-magnetic-button","type":"registry:component","title":"Magnetic Button","description":"Animated button primitive with magnetic cursor pull.","version":"1.0.0","status":"ga","files":[{"path":"src/components/ui/magnetic-button.tsx","type":"registry:component","content":"'use client'\n\nimport * as React from 'react'\n\nimport { motion, type HTMLMotionProps, type Transition } from 'motion/react'\nimport type { VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\nimport { buttonVariants } from '@/components/ui/button'\n\ninterface Position {\n  x: number\n  y: number\n}\n\ninterface MagneticButtonProps extends HTMLMotionProps<'button'>, VariantProps<typeof buttonVariants> {\n  children: React.ReactNode\n  scale?: number\n  transition?: Transition\n}\n\nfunction MagneticButton({ children, className, size, variant, ...props }: MagneticButtonProps) {\n  const ref = React.useRef<HTMLButtonElement>(null)\n  const [position, setPosition] = React.useState<Position>({ x: 0, y: 0 })\n\n  const handleMouse = (e: React.MouseEvent<HTMLButtonElement>) => {\n    if (ref.current) {\n      const { clientX, clientY } = e\n      const { height, width, left, top } = ref.current.getBoundingClientRect()\n      const middleX = clientX - (left + width / 2)\n      const middleY = clientY - (top + height / 2)\n\n      setPosition({ x: middleX, y: middleY })\n    }\n  }\n\n  const reset = () => {\n    setPosition({ x: 0, y: 0 })\n  }\n\n  const { x, y } = position\n\n  return (\n    <motion.button\n      ref={ref}\n      onMouseMove={handleMouse}\n      onMouseLeave={reset}\n      animate={{ x, y }}\n      transition={{ type: 'spring', stiffness: 150, damping: 15, mass: 0.1 }}\n      whileTap={{\n        scale: 0.95\n      }}\n      className={cn(buttonVariants({ variant, size }), 'relative transition-none', className)}\n      {...props}\n    >\n      {children}\n    </motion.button>\n  )\n}\n\nexport { MagneticButton, type MagneticButtonProps }\n"}]}