/* @utilities/animations */ @keyframes pulsate { 0% { box-shadow: 0 0 0 0 var(--accent); transform: scale(0.9); } 50% { transform: scale(1); } 100% { box-shadow: 0 0 20px 10px transparent; transform: scale(0.9); } } @keyframes fadeInOpacity { from { opacity: 0; } to { opacity: 1; } } @keyframes fadeInTranslate { from { transform: translateY(0.75vh); } to { transform: translateY(0vh); } } @keyframes aurora { from { background-position: 50% 50%, 50% 50%; } to { background-position: 350% 50%, 350% 50%; } } @keyframes spin-slow { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @keyframes spin-reverse { from { transform: rotate(0deg); } to { transform: rotate(-360deg); } } @keyframes marquee-vertical { from { transform: translateY(0); } to { transform: translateY(-50%); } } @keyframes marquee-vertical-reverse { from { transform: translateY(-50%); } to { transform: translateY(0); } } @keyframes marquee-horizontal { from { transform: translateX(0); } to { transform: translateX(-50%); } } @keyframes marquee-horizontal-reverse { from { transform: translateX(-50%); } to { transform: translateX(0); } } @keyframes orbit { from { transform: rotate(var(--initial-position, 0deg)) translateX(var(--translate-position, 120px)) rotate(calc(-1 * var(--initial-position, 0deg))); } to { transform: rotate(calc(var(--initial-position, 0deg) + 360deg)) translateX(var(--translate-position, 120px)) rotate(calc(-1 * (var(--initial-position, 0deg) + 360deg))); } } @keyframes map-dot-pulse { 0%, 100% { transform: scale(0.4); opacity: 0.6; } 50% { transform: scale(1.4); opacity: 1; } } @keyframes progress { from { transform: scaleX(0); } to { transform: scaleX(1); } } @keyframes button-pulse { 0% { transform: scale(1); } 50% { transform: scale(0.95); } 100% { transform: scale(1); } } /* Animation classes */ .animate-pulsate { animation: pulsate 1.5s infinite; } .animation-container { animation: fadeInOpacity 0.8s ease-in-out forwards, fadeInTranslate 0.6s forwards; } .animation-container-fade { animation: fadeInOpacity 0.8s ease-in-out forwards; } .animate-spin-slow { animation: spin-slow 15s linear infinite; } .animate-spin-reverse { animation: spin-reverse 10s linear infinite; } .animate-marquee-vertical { animation: marquee-vertical 40s linear infinite; } .animate-marquee-vertical-reverse { animation: marquee-vertical-reverse 40s linear infinite; } .animate-marquee-horizontal { animation: marquee-horizontal 15s linear infinite; } .animate-marquee-horizontal-reverse { animation: marquee-horizontal-reverse 15s linear infinite; } .animate-progress { animation: progress linear forwards; } @keyframes ripple { to { transform: scale(4); opacity: 0; } } .ripple { position: absolute; border-radius: 50%; background-color: rgba(255, 255, 255, 0.7); transform: scale(0); animation: ripple 600ms linear; pointer-events: none; } @keyframes shine { 100% { left: 125%; } } @keyframes moveGradient { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } }