my-dosa-place-cinematic/src/components/AnimatedSection.tsx
2026-07-16 21:32:16 +05:30

61 lines
1.2 KiB
TypeScript

"use client";
import { motion } from "framer-motion";
import { ReactNode } from "react";
type AnimationVariant = "fadeUp" | "fadeIn" | "fadeLeft" | "fadeRight" | "scaleUp";
interface AnimatedSectionProps {
children: ReactNode;
className?: string;
variant?: AnimationVariant;
delay?: number;
duration?: number;
once?: boolean;
}
const variants = {
fadeUp: {
hidden: { opacity: 0, y: 48 },
visible: { opacity: 1, y: 0 },
},
fadeIn: {
hidden: { opacity: 0 },
visible: { opacity: 1 },
},
fadeLeft: {
hidden: { opacity: 0, x: -48 },
visible: { opacity: 1, x: 0 },
},
fadeRight: {
hidden: { opacity: 0, x: 48 },
visible: { opacity: 1, x: 0 },
},
scaleUp: {
hidden: { opacity: 0, scale: 0.92 },
visible: { opacity: 1, scale: 1 },
},
};
export default function AnimatedSection({
children,
className,
variant = "fadeUp",
delay = 0,
duration = 0.6,
once = true,
}: AnimatedSectionProps) {
return (
<motion.div
className={className}
initial="hidden"
whileInView="visible"
viewport={{ once, margin: "-80px" }}
variants={variants[variant]}
transition={{ duration, delay, ease: [0.25, 0.1, 0.25, 1] }}
>
{children}
</motion.div>
);
}