Spaces:
Sleeping
Sleeping
| 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; | |
| }; |