import { motion, useCycle } from 'framer-motion'; import { PropsWithChildren } from 'react'; type AnimateButtonProps = PropsWithChildren<{ type?: 'rotate' | 'slide' | 'scale'; direction?: 'up' | 'down' | 'left' | 'right'; offset?: number; scale?: number | { hover: number; tap: number }; }>; function AnimateButton({ children, type = 'scale', direction = 'right', offset = 10, scale = { hover: 1.05, tap: 0.95 } }: AnimateButtonProps) { let offset1; let offset2; switch (direction) { case 'up': case 'left': offset1 = offset; offset2 = 0; break; case 'right': case 'down': default: offset1 = 0; offset2 = offset; break; } const [x, cycleX] = useCycle(offset1, offset2); const [y, cycleY] = useCycle(offset1, offset2); switch (type) { case 'rotate': return ( {children} ); case 'slide': if (direction === 'up' || direction === 'down') { return ( cycleY()} onHoverStart={() => cycleY()} > {children} ); } return ( cycleX()} onHoverStart={() => cycleX()}> {children} ); case 'scale': default: if (typeof scale === 'number') { scale = { hover: scale, tap: scale }; } return ( {children} ); } } export { AnimateButton }; export type { AnimateButtonProps };