'use client'; import { motion, useMotionValue, useTransform, useSpring } from 'framer-motion'; import { useEffect, useState } from 'react'; export const BackgroundBlobs = () => { const mouseX = useMotionValue(0); const mouseY = useMotionValue(0); const springConfig = { damping: 50, stiffness: 200 }; const springX = useSpring(mouseX, springConfig); const springY = useSpring(mouseY, springConfig); // Parallax offsets const x1 = useTransform(springX, (value) => value / 20); const y1 = useTransform(springY, (value) => value / 20); const x2 = useTransform(springX, (value) => value / -15); const y2 = useTransform(springY, (value) => value / -15); const x3 = useTransform(springX, (value) => value / 10); const y3 = useTransform(springY, (value) => value / 10); useEffect(() => { const handleMouseMove = (e: MouseEvent) => { // Center the coordinate system const { innerWidth, innerHeight } = window; const x = e.clientX - innerWidth / 2; const y = e.clientY - innerHeight / 2; mouseX.set(x); mouseY.set(y); }; window.addEventListener('mousemove', handleMouseMove); return () => window.removeEventListener('mousemove', handleMouseMove); }, [mouseX, mouseY]); // Prevent hydration mismatch const [mounted, setMounted] = useState(false); useEffect(() => { setMounted(true); }, []); if (!mounted) return null; return (
); };