/* Advanced Animations and Transitions */ /* Smooth page transitions */ .page-enter-active, .page-leave-active { transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); } .page-enter-from, .page-leave-to { opacity: 0; transform: translateY(20px); } /* Enhanced glassmorphism hover effects */ .glass:hover, .glass-strong:hover { transform: translateY(-2px) scale(1.01); box-shadow: var(--shadow-glass), 0 0 30px rgba(59, 130, 246, 0.15); backdrop-filter: blur(30px); -webkit-backdrop-filter: blur(30px); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } /* Ripple effect for clickable elements */ .ripple { position: relative; overflow: hidden; } .ripple::before { content: ''; position: absolute; top: 50%; left: 50%; width: 0; height: 0; border-radius: 50%; background: rgba(255, 255, 255, 0.3); transform: translate(-50%, -50%); transition: width 0.6s, height 0.6s; } .ripple:active::before { width: 300px; height: 300px; } /* Floating elements animation */ @keyframes float-gentle { 0%, 100% { transform: translateY(0px); } 50% { transform: translateY(-10px); } } .float-animation { animation: float-gentle 6s ease-in-out infinite; } /* Pulse animation for active elements */ @keyframes pulse-glow { 0%, 100% { box-shadow: 0 0 5px rgba(59, 130, 246, 0.3); } 50% { box-shadow: 0 0 20px rgba(59, 130, 246, 0.6); } } .pulse-glow { animation: pulse-glow 2s ease-in-out infinite; } /* Slide in animations */ @keyframes slideInLeft { from { opacity: 0; transform: translateX(-30px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideInRight { from { opacity: 0; transform: translateX(30px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideInDown { from { opacity: 0; transform: translateY(-30px); } to { opacity: 1; transform: translateY(0); } } /* Scale animations */ @keyframes scaleIn { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: scale(1); } } @keyframes scaleOut { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.9); } } /* Rotation animations */ @keyframes rotateIn { from { opacity: 0; transform: rotate(-180deg); } to { opacity: 1; transform: rotate(0deg); } } /* Fade animations */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } @keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } /* 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); } } /* 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); } } /* Glow animation */ @keyframes glow { 0%, 100% { filter: brightness(1) drop-shadow(0 0 5px rgba(59, 130, 246, 0.3)); } 50% { filter: brightness(1.2) drop-shadow(0 0 15px rgba(139, 92, 246, 0.6)); } } /* Progress bar animation */ @keyframes progressFill { 0% { width: 0%; } 100% { width: var(--progress-width, 100%); } } /* Shimmer effect */ @keyframes shimmer { 0% { background-position: -200px 0; } 100% { background-position: calc(200px + 100%) 0; } } .shimmer { background: linear-gradient( 90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.2) 20%, rgba(255, 255, 255, 0.5) 60%, rgba(255, 255, 255, 0) ); background-size: 200px 100%; background-repeat: no-repeat; animation: shimmer 2s infinite; } /* Utility classes for animations */ .animate-slide-in-left { animation: slideInLeft 0.5s ease-out; } .animate-slide-in-right { animation: slideInRight 0.5s ease-out; } .animate-slide-in-up { animation: slideInUp 0.5s ease-out; } .animate-slide-in-down { animation: slideInDown 0.5s ease-out; } .animate-fade-in { animation: fadeIn 0.5s ease-out; } .animate-fade-in-up { animation: fadeInUp 0.5s ease-out; } .animate-bounce-in { animation: bounceIn 0.6s ease-out; } .animate-scale-in { animation: scaleIn 0.4s ease-out; } .animate-rotate-in { animation: rotateIn 0.6s ease-out; } .animate-shake { animation: shake 0.5s ease-in-out; } .animate-glow { animation: glow 3s ease-in-out infinite alternate; } .animate-pulse-glow { animation: pulse-glow 2s ease-in-out infinite; } /* Staggered animations */ .stagger-children > *:nth-child(1) { animation-delay: 0.1s; } .stagger-children > *:nth-child(2) { animation-delay: 0.2s; } .stagger-children > *:nth-child(3) { animation-delay: 0.3s; } .stagger-children > *:nth-child(4) { animation-delay: 0.4s; } .stagger-children > *:nth-child(5) { animation-delay: 0.5s; } .stagger-children > *:nth-child(n+6) { animation-delay: 0.6s; } /* Hover state enhancements */ .hover-lift { transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .hover-lift:hover { transform: translateY(-4px); } .hover-scale { transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .hover-scale:hover { transform: scale(1.05); } .hover-glow { transition: box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .hover-glow:hover { box-shadow: 0 0 20px rgba(59, 130, 246, 0.4); } /* Focus states for accessibility */ .focus-ring:focus-visible { outline: 2px solid var(--accent-primary); outline-offset: 2px; border-radius: 4px; } /* Reduced motion support */ @media (prefers-reduced-motion: reduce) { * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } .aurora-orb, .interactive-orb, .particle { animation: none !important; } .float-animation { animation: none !important; } } /* High contrast mode adjustments */ @media (prefers-contrast: high) { .glass, .glass-strong { border: 2px solid var(--text-primary); } .shimmer { background: none; } } /* Custom scrollbar animations */ ::-webkit-scrollbar-thumb { transition: background-color 0.3s ease; } ::-webkit-scrollbar-thumb:hover { background: var(--accent-secondary); } /* Loading state animations */ .loading-skeleton { background: linear-gradient( 90deg, var(--bg-glass) 25%, rgba(59, 130, 246, 0.1) 50%, var(--bg-glass) 75% ); background-size: 200% 100%; animation: shimmer 1.5s infinite; } /* Music-specific animations */ .music-playing { animation: pulse-glow 1.5s ease-in-out infinite; } .volume-wave { animation: wave 1s ease-in-out infinite; } @keyframes wave { 0%, 100% { height: 20%; } 50% { height: 100%; } } /* Success and error animations */ .success-bounce { animation: bounceIn 0.6s ease-out; color: #10b981; } .error-shake { animation: shake 0.5s ease-in-out; color: #ef4444; }