/* Custom animations and keyframes */ /* Fade in animation */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* Slide up animation */ @keyframes slideUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } /* Bounce in animation */ @keyframes bounceIn { 0% { opacity: 0; transform: scale(0.3); } 50% { opacity: 1; transform: scale(1.05); } 70% { transform: scale(0.9); } 100% { opacity: 1; transform: scale(1); } } /* Pulse animation */ @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } /* Shimmer effect for loading states */ @keyframes shimmer { 0% { background-position: -200px 0; } 100% { background-position: calc(200px + 100%) 0; } } /* Floating animation */ @keyframes float { 0%, 100% { transform: translateY(0px); } 50% { transform: translateY(-10px); } } /* Gradient animation */ @keyframes gradientShift { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } /* Typing animation */ @keyframes typing { from { width: 0; } to { width: 100%; } } /* Blink animation for cursor */ @keyframes blink { 0%, 50% { opacity: 1; } 51%, 100% { opacity: 0; } } /* Utility classes for animations */ .animate-fade-in { animation: fadeIn 0.6s ease-out; } .animate-slide-up { animation: slideUp 0.8s ease-out; } .animate-bounce-in { animation: bounceIn 1s ease-out; } .animate-pulse { animation: pulse 2s infinite; } .animate-float { animation: float 3s ease-in-out infinite; } .animate-gradient { background-size: 200% 200%; animation: gradientShift 3s ease infinite; } .animate-shimmer { background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent); background-size: 200px 100%; animation: shimmer 1.5s infinite; } /* Staggered animations for lists */ .stagger-animation > * { opacity: 0; animation: slideUp 0.6s ease-out forwards; } .stagger-animation > *:nth-child(1) { animation-delay: 0.1s; } .stagger-animation > *:nth-child(2) { animation-delay: 0.2s; } .stagger-animation > *:nth-child(3) { animation-delay: 0.3s; } .stagger-animation > *:nth-child(4) { animation-delay: 0.4s; } .stagger-animation > *:nth-child(5) { animation-delay: 0.5s; } .stagger-animation > *:nth-child(6) { animation-delay: 0.6s; } /* Hover animations */ .hover-lift { transition: transform 0.3s ease, box-shadow 0.3s ease; } .hover-lift:hover { transform: translateY(-5px); box-shadow: 0 10px 25px rgba(0,0,0,0.15); } .hover-scale { transition: transform 0.3s ease; } .hover-scale:hover { transform: scale(1.05); } .hover-glow { transition: box-shadow 0.3s ease; } .hover-glow:hover { box-shadow: 0 0 20px rgba(79, 172, 254, 0.4); } /* Loading spinner */ .spinner { width: 40px; height: 40px; border: 4px solid rgba(0, 0, 0, 0.1); border-left-color: #4facfe; border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* Text reveal animation */ .text-reveal { overflow: hidden; position: relative; } .text-reveal::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: var(--bg-primary); animation: textReveal 1.5s ease-out forwards; } @keyframes textReveal { 0% { transform: translateX(0); } 100% { transform: translateX(100%); } } /* Parallax effect */ .parallax { transform: translateZ(0); will-change: transform; } /* Smooth scrolling */ html { scroll-behavior: smooth; } /* Reduced motion for accessibility */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }