Spaces:
Sleeping
Sleeping
File size: 1,537 Bytes
f70bb71 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import {
motion,
useMotionValue,
useTransform,
AnimatePresence,
} from "framer-motion";
import { useState } from "react";
export const Card = ({ children, drag, index, setIndex, front }: any) => {
const [exitX, setExitX] = useState(0);
const x = useMotionValue(0);
const scale = useTransform(x, [-150, 0, 150], [0.5, 1, 0.5]);
const rotate = useTransform(x, [-150, 0, 150], [-45, 0, 45], {
clamp: false,
});
const variantsFrontCard = {
animate: { scale: 1, y: 0, opacity: 1 },
exit: (custom: number) => ({
x: custom,
opacity: 0,
scale: 0.5,
transition: { duration: 0.2 },
}),
};
const variantsBackCard = {
initial: { scale: 0, y: 105, opacity: 0 },
animate: { scale: 0.75, y: 30, opacity: 0 },
};
function handleDragEnd(_: any, info: any) {
if (info.offset.x < -100) {
setExitX(-250);
setIndex(index + 1);
}
if (info.offset.x > 100) {
setExitX(250);
setIndex(index + 1);
}
}
return (
<motion.div
style={{
position: "absolute",
width: "100%",
height: "100%",
top: 0,
x,
rotate,
}}
variants={front ? variantsFrontCard : variantsBackCard}
initial="initial"
animate="animate"
exit="exit"
custom={exitX}
transition={
front
? { type: "spring", stiffness: 300, damping: 20 }
: { scale: { duration: 0.2 }, opacity: { duration: 0.4 } }
}
>
{children}
</motion.div>
);
};
|