"use client"; import { useRef, useState } from "react"; import { AnimatePresence, motion } from "motion/react"; import { cn } from "@/lib/utils"; export const DirectionAwareHover = ({ imageUrl, children, childrenClassName, imageClassName, className, }: { imageUrl: string; children: React.ReactNode | string; childrenClassName?: string; imageClassName?: string; className?: string; }) => { const ref = useRef(null); const [direction, setDirection] = useState< "top" | "bottom" | "left" | "right" | string >("left"); const handleMouseEnter = ( event: React.MouseEvent ) => { if (!ref.current) return; const direction = getDirection(event, ref.current); console.log("direction", direction); switch (direction) { case 0: setDirection("top"); break; case 1: setDirection("right"); break; case 2: setDirection("bottom"); break; case 3: setDirection("left"); break; default: setDirection("left"); break; } }; const getDirection = ( ev: React.MouseEvent, obj: HTMLElement ) => { const { width: w, height: h, left, top } = obj.getBoundingClientRect(); const x = ev.clientX - left - (w / 2) * (w > h ? h / w : 1); const y = ev.clientY - top - (h / 2) * (h > w ? w / h : 1); const d = Math.round(Math.atan2(y, x) / 1.57079633 + 5) % 4; return d; }; return ( image {children} ); }; const variants = { initial: { x: 0, }, exit: { x: 0, y: 0, }, top: { y: 20, }, bottom: { y: -20, }, left: { x: 20, }, right: { x: -20, }, }; const textVariants = { initial: { y: 0, x: 0, opacity: 0, }, exit: { y: 0, x: 0, opacity: 0, }, top: { y: -20, opacity: 1, }, bottom: { y: 2, opacity: 1, }, left: { x: -2, opacity: 1, }, right: { x: 20, opacity: 1, }, };