/* ═══════════════════════════════════════════════════════════════ Advanced Animations - iOS 26 Liquid Design ═══════════════════════════════════════════════════════════════ */ /* ============================================ LIQUID MORPHING ANIMATIONS ============================================ */ @keyframes liquidMorph { 0%, 100% { border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%; } 50% { border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%; } } .liquid-shape { animation: liquidMorph 8s ease-in-out infinite; } /* ============================================ FLOATING ANIMATIONS ============================================ */ @keyframes floatSlow { 0%, 100% { transform: translateY(0) rotate(0deg); } 33% { transform: translateY(-20px) rotate(2deg); } 66% { transform: translateY(-10px) rotate(-2deg); } } @keyframes floatFast { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-15px); } } .float-slow { animation: floatSlow 6s ease-in-out infinite; } .float-fast { animation: floatFast 3s ease-in-out infinite; } /* ============================================ GLOWING PULSE ANIMATIONS ============================================ */ @keyframes glowPulse { 0%, 100% { box-shadow: 0 0 20px rgba(150, 150, 150, 0.4), 0 0 40px rgba(150, 150, 150, 0.2), 0 0 60px rgba(150, 150, 150, 0.1); } 50% { box-shadow: 0 0 30px rgba(150, 150, 150, 0.6), 0 0 60px rgba(150, 150, 150, 0.4), 0 0 90px rgba(150, 150, 150, 0.2); } } .glow-pulse { animation: glowPulse 2s ease-in-out infinite; } /* ============================================ GRADIENT ANIMATIONS ============================================ */ @keyframes gradientShift { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } .gradient-animated { background-size: 200% 200%; animation: gradientShift 10s ease infinite; } /* ============================================ RIPPLE EFFECT ============================================ */ @keyframes ripple { 0% { transform: scale(0); opacity: 1; } 100% { transform: scale(4); opacity: 0; } } .ripple-effect { position: relative; overflow: hidden; } .ripple-effect::after { content: ''; position: absolute; top: 50%; left: 50%; width: 20px; height: 20px; background: rgba(255, 255, 255, 0.5); border-radius: 50%; transform: translate(-50%, -50%) scale(0); opacity: 0; } .ripple-effect:active::after { animation: ripple 0.6s ease-out; } /* ============================================ BOUNCE ANIMATIONS ============================================ */ @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); } } .bounce-in { animation: bounceIn 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55); } /* ============================================ SLIDE ANIMATIONS ============================================ */ @keyframes slideInLeft { from { opacity: 0; transform: translateX(-100px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideInRight { from { opacity: 0; transform: translateX(100px); } to { opacity: 1; transform: translateX(0); } } .slide-in-left { animation: slideInLeft 0.6s ease; } .slide-in-right { animation: slideInRight 0.6s ease; } /* ============================================ SCALE ANIMATIONS ============================================ */ @keyframes scaleUp { from { opacity: 0; transform: scale(0.8); } to { opacity: 1; transform: scale(1); } } .scale-up { animation: scaleUp 0.4s ease; } /* ============================================ SHAKE ANIMATION (for errors) ============================================ */ @keyframes shake { 0%, 100% { transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); } 20%, 40%, 60%, 80% { transform: translateX(10px); } } .shake { animation: shake 0.5s; } /* ============================================ TYPING INDICATOR ============================================ */ @keyframes typing { 0%, 60%, 100% { transform: translateY(0); opacity: 0.5; } 30% { transform: translateY(-10px); opacity: 1; } } .typing-indicator span { display: inline-block; width: 8px; height: 8px; margin: 0 2px; background: currentColor; border-radius: 50%; opacity: 0.5; animation: typing 1.4s infinite; } .typing-indicator span:nth-child(2) { animation-delay: 0.2s; } .typing-indicator span:nth-child(3) { animation-delay: 0.4s; } /* ============================================ PROGRESS BAR ANIMATION ============================================ */ @keyframes progressFill { from { width: 0%; } to { width: var(--progress-width); } } .progress-animated { animation: progressFill 1.5s ease-out forwards; } /* ============================================ PARTICLE FLOAT ============================================ */ @keyframes particleFloat { 0% { transform: translateY(0) translateX(0); opacity: 0; } 10% { opacity: 1; } 90% { opacity: 1; } 100% { transform: translateY(-100vh) translateX(50px); opacity: 0; } } .particle { position: absolute; width: 4px; height: 4px; background: rgba(255, 255, 255, 0.5); border-radius: 50%; animation: particleFloat 15s linear infinite; } /* ============================================ BLUR IN ANIMATION ============================================ */ @keyframes blurIn { from { filter: blur(20px); opacity: 0; } to { filter: blur(0); opacity: 1; } } .blur-in { animation: blurIn 0.8s ease; } /* ============================================ ROTATION ANIMATIONS ============================================ */ @keyframes rotate360 { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .rotate-360 { animation: rotate360 2s linear infinite; } /* ============================================ WAVE ANIMATION ============================================ */ @keyframes wave { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } .wave-effect { position: relative; overflow: hidden; } .wave-effect::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent ); animation: wave 2s infinite; } /* ============================================ HOVER LIFT EFFECT ============================================ */ .hover-lift { transition: transform 0.3s ease, box-shadow 0.3s ease; } .hover-lift:hover { transform: translateY(-8px); box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); } /* ============================================ BREATH ANIMATION ============================================ */ @keyframes breathe { 0%, 100% { transform: scale(1); opacity: 0.8; } 50% { transform: scale(1.1); opacity: 1; } } .breathe { animation: breathe 3s ease-in-out infinite; } /* ============================================ STAGGER ANIMATIONS ============================================ */ .stagger-item { opacity: 0; animation: fadeInUp 0.6s ease forwards; } .stagger-item:nth-child(1) { animation-delay: 0.1s; } .stagger-item:nth-child(2) { animation-delay: 0.2s; } .stagger-item:nth-child(3) { animation-delay: 0.3s; } .stagger-item:nth-child(4) { animation-delay: 0.4s; } .stagger-item:nth-child(5) { animation-delay: 0.5s; } .stagger-item:nth-child(6) { animation-delay: 0.6s; } /* ============================================ SMOOTH SCROLL REVEAL ============================================ */ .scroll-reveal { opacity: 0; transform: translateY(50px); transition: opacity 0.6s ease, transform 0.6s ease; } .scroll-reveal.revealed { opacity: 1; transform: translateY(0); }