coders-club / src /lib /animations.ts
kumar-aditya's picture
Upload 108 files
a7b8df9 verified
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;
};