import PropTypes from 'prop-types'; import { forwardRef } from 'react'; // third-party import { motion, useCycle } from 'framer-motion'; // ==============================|| ANIMATION BUTTON ||============================== // const AnimateButton = forwardRef(({ children, type, direction, offset, scale }, ref) => { 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} ); } }); AnimateButton.propTypes = { children: PropTypes.node, offset: PropTypes.number, type: PropTypes.oneOf(['slide', 'scale', 'rotate']), direction: PropTypes.oneOf(['up', 'down', 'left', 'right']), scale: PropTypes.oneOfType([PropTypes.number, PropTypes.object]) }; AnimateButton.defaultProps = { type: 'scale', offset: 10, direction: 'right', scale: { hover: 1, tap: 0.9 } }; export default AnimateButton;