import { Variants } from 'framer-motion'; // Animation variants for different entrance types export const fadeInUp: Variants = { hidden: { opacity: 0, y: 60, }, visible: { opacity: 1, y: 0, transition: { duration: 0.6, ease: [0.22, 1, 0.36, 1], }, }, }; export const fadeInDown: Variants = { hidden: { opacity: 0, y: -60, }, visible: { opacity: 1, y: 0, transition: { duration: 0.6, ease: [0.22, 1, 0.36, 1], }, }, }; export const fadeInLeft: Variants = { hidden: { opacity: 0, x: -60, }, visible: { opacity: 1, x: 0, transition: { duration: 0.6, ease: [0.22, 1, 0.36, 1], }, }, }; export const fadeInRight: Variants = { hidden: { opacity: 0, x: 60, }, visible: { opacity: 1, x: 0, transition: { duration: 0.6, ease: [0.22, 1, 0.36, 1], }, }, }; export const scaleIn: Variants = { hidden: { opacity: 0, scale: 0.8, }, visible: { opacity: 1, scale: 1, transition: { duration: 0.6, ease: [0.22, 1, 0.36, 1], }, }, }; export const slideInUp: Variants = { hidden: { y: 100, opacity: 0, }, visible: { y: 0, opacity: 1, transition: { duration: 0.8, ease: [0.22, 1, 0.36, 1], }, }, }; // Stagger container variant export const staggerContainer: Variants = { hidden: {}, visible: { transition: { staggerChildren: 0.1, delayChildren: 0.2, }, }, }; // Stagger item variant export const staggerItem: Variants = { hidden: { opacity: 0, y: 60, }, visible: { opacity: 1, y: 0, transition: { duration: 0.6, ease: [0.22, 1, 0.36, 1], }, }, }; // Hero section specific animations export const heroTitle: Variants = { hidden: { opacity: 0, y: 80, }, visible: { opacity: 1, y: 0, transition: { duration: 1, ease: [0.22, 1, 0.36, 1], delay: 0.2, }, }, }; export const heroSubtitle: Variants = { hidden: { opacity: 0, y: 40, }, visible: { opacity: 1, y: 0, transition: { duration: 0.8, ease: [0.22, 1, 0.36, 1], delay: 0.4, }, }, }; export const heroImage: Variants = { hidden: { opacity: 0, scale: 0.9, x: 60, }, visible: { opacity: 1, scale: 1, x: 0, transition: { duration: 1.2, ease: [0.22, 1, 0.36, 1], delay: 0.6, }, }, }; // Card animations export const cardHover: Variants = { rest: { scale: 1, y: 0, }, hover: { scale: 1.05, y: -10, transition: { duration: 0.3, ease: [0.22, 1, 0.36, 1], }, }, }; // Gallery item animations export const galleryItem: Variants = { hidden: { opacity: 0, scale: 0.8, y: 40, }, visible: { opacity: 1, scale: 1, y: 0, transition: { duration: 0.6, ease: [0.22, 1, 0.36, 1], }, }, }; // Parallax effect variant export const parallaxVariant = (offset: number): Variants => ({ animate: { y: offset, transition: { ease: "linear", duration: 0, }, }, }); // Section reveal animation export const sectionReveal: Variants = { hidden: { opacity: 0, y: 100, }, visible: { opacity: 1, y: 0, transition: { duration: 1, ease: [0.22, 1, 0.36, 1], }, }, }; // Responsive animation controls export const getReducedMotion = () => { if (typeof window !== 'undefined') { return window.matchMedia('(prefers-reduced-motion: reduce)').matches; } return false; }; // Mobile check export const isMobile = () => { if (typeof window !== 'undefined') { return window.innerWidth < 768; } return false; }; // Animation configuration based on user preferences export const getAnimationConfig = (animation: Variants): Variants => { const reducedMotion = getReducedMotion(); const mobile = isMobile(); if (reducedMotion || mobile) { // Reduce animations for accessibility and performance return { hidden: { opacity: 0 }, visible: { opacity: 1, transition: { duration: 0.3 } }, }; } return animation; };