mirror of
https://github.com/farcasclaudiu/Flowise.git
synced 2026-06-22 09:01:09 +03:00
0f09faa1bc
- Removed Yarn dependency and replaced with PNPM - Changed Frontend to render via vite
98 lines
2.7 KiB
React
98 lines
2.7 KiB
React
import PropTypes from 'prop-types'
|
|
import { forwardRef } from 'react'
|
|
// third-party
|
|
import { motion, useCycle } from 'framer-motion'
|
|
|
|
// ==============================|| ANIMATION BUTTON ||============================== //
|
|
|
|
const AnimateButton = forwardRef(function AnimateButton({ 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 (
|
|
<motion.div
|
|
ref={ref}
|
|
animate={{ rotate: 360 }}
|
|
transition={{
|
|
repeat: Infinity,
|
|
repeatType: 'loop',
|
|
duration: 2,
|
|
repeatDelay: 0
|
|
}}
|
|
>
|
|
{children}
|
|
</motion.div>
|
|
)
|
|
case 'slide':
|
|
if (direction === 'up' || direction === 'down') {
|
|
return (
|
|
<motion.div
|
|
ref={ref}
|
|
animate={{ y: y !== undefined ? y : '' }}
|
|
onHoverEnd={() => cycleY()}
|
|
onHoverStart={() => cycleY()}
|
|
>
|
|
{children}
|
|
</motion.div>
|
|
)
|
|
}
|
|
return (
|
|
<motion.div ref={ref} animate={{ x: x !== undefined ? x : '' }} onHoverEnd={() => cycleX()} onHoverStart={() => cycleX()}>
|
|
{children}
|
|
</motion.div>
|
|
)
|
|
|
|
case 'scale':
|
|
default:
|
|
if (typeof scale === 'number') {
|
|
scale = {
|
|
hover: scale,
|
|
tap: scale
|
|
}
|
|
}
|
|
return (
|
|
<motion.div ref={ref} whileHover={{ scale: scale?.hover }} whileTap={{ scale: scale?.tap }}>
|
|
{children}
|
|
</motion.div>
|
|
)
|
|
}
|
|
})
|
|
|
|
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
|