Live Preview
"use client";
import { motion } from "framer-motion";
import { useRef, useState } from "react";
import { cn } from "@/lib/utils";
export function MagneticButton({ children, className, ...props }: any) {
const buttonRef = useRef<HTMLButtonElement>(null);
const [position, setPosition] = useState({ x: 0, y: 0 });
const handleMouse = (e: React.MouseEvent<HTMLButtonElement>) => {
if (!buttonRef.current) return;
const { clientX, clientY } = e;
const { height, width, left, top } = buttonRef.current.getBoundingClientRect();
const middleX = clientX - (left + width / 2);
const middleY = clientY - (top + height / 2);
setPosition({ x: middleX * 0.2, y: middleY * 0.2 });
};
const reset = () => {
setPosition({ x: 0, y: 0 });
};
return (
<motion.button
ref={buttonRef}
onMouseMove={handleMouse}
onMouseLeave={reset}
animate={{ x: position.x, y: position.y }}
transition={{ type: "spring", stiffness: 150, damping: 15, mass: 0.1 }}
className={cn(
"relative rounded-full bg-foreground text-background px-8 py-3 font-medium transition-colors hover:bg-[#e0e0e0]",
className
)}
{...props}
>
<span className="relative z-10">{children}</span>
</motion.button>
);
}