/** * MYP Platform - Optimierungs-Animationen * Belohnende und motivierende Animationen für Auto-Optimierung */ /* ===== MODAL FADE-IN ANIMATION ===== */ @keyframes fade-in { from { opacity: 0; backdrop-filter: blur(0px); } to { opacity: 1; backdrop-filter: blur(8px); } } .animate-fade-in { animation: fade-in 0.3s ease-out; } /* ===== BOUNCE-IN ANIMATION ===== */ @keyframes bounce-in { 0% { opacity: 0; transform: scale(0.3) translateY(-50px); } 50% { opacity: 1; transform: scale(1.05) translateY(0); } 70% { transform: scale(0.95); } 100% { opacity: 1; transform: scale(1); } } .animate-bounce-in { animation: bounce-in 0.6s cubic-bezier(0.175, 0.885, 0.32, 1.275); } /* ===== PULSE-SCALE ANIMATION ===== */ @keyframes pulse-scale { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } } .animate-pulse-scale { animation: pulse-scale 3s infinite ease-in-out; } /* ===== FLOATING ANIMATIONS ===== */ @keyframes float { 0%, 100% { transform: translateY(0px) rotate(0deg); } 33% { transform: translateY(-15px) rotate(5deg); } 66% { transform: translateY(-5px) rotate(-3deg); } } @keyframes float-delay { 0%, 100% { transform: translateY(0px) rotate(0deg); } 33% { transform: translateY(-10px) rotate(-5deg); } 66% { transform: translateY(-8px) rotate(3deg); } } .animate-float { animation: float 4s infinite ease-in-out; } .animate-float-delay { animation: float-delay 4s infinite ease-in-out; animation-delay: 1.5s; } /* ===== SLIDE-UP ANIMATIONS ===== */ @keyframes slide-up { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } .animate-slide-up { animation: slide-up 0.6s ease-out; } .animate-slide-up-delay { animation: slide-up 0.6s ease-out; animation-delay: 0.2s; animation-fill-mode: both; } .animate-slide-up-delay-2 { animation: slide-up 0.6s ease-out; animation-delay: 0.4s; animation-fill-mode: both; } .animate-slide-up-delay-3 { animation: slide-up 0.6s ease-out; animation-delay: 0.6s; animation-fill-mode: both; } /* ===== COUNT-UP ANIMATION ===== */ @keyframes count-up { from { opacity: 0; transform: scale(0.5) rotate(-10deg); } 50% { opacity: 1; transform: scale(1.2) rotate(5deg); } to { opacity: 1; transform: scale(1) rotate(0deg); } } .animate-count-up { animation: count-up 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); animation-delay: 0.3s; animation-fill-mode: both; } /* ===== GLOW ANIMATION ===== */ @keyframes glow { 0%, 100% { box-shadow: 0 0 5px rgba(59, 130, 246, 0.5), 0 0 10px rgba(59, 130, 246, 0.3), 0 0 15px rgba(59, 130, 246, 0.1); } 50% { box-shadow: 0 0 20px rgba(59, 130, 246, 0.8), 0 0 30px rgba(59, 130, 246, 0.6), 0 0 40px rgba(59, 130, 246, 0.4); } } .animate-glow { animation: glow 3s infinite ease-in-out; } /* ===== KONFETTI ANIMATION ===== */ .confetti-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; pointer-events: none; } .confetti-piece { position: absolute; width: 8px; height: 8px; top: -10px; border-radius: 2px; animation: confetti-fall linear infinite; } @keyframes confetti-fall { 0% { transform: translateY(-100vh) rotate(0deg); opacity: 1; } 100% { transform: translateY(120vh) rotate(720deg); opacity: 0; } } /* ===== ERFOLGS-BADGE SPEZIAL-ANIMATIONEN ===== */ @keyframes star-twinkle { 0%, 100% { opacity: 0.6; transform: scale(1); } 50% { opacity: 1; transform: scale(1.2); } } .badge-star { animation: star-twinkle 1.5s infinite ease-in-out; } /* ===== LOADING SPINNER IMPROVEMENTS ===== */ @keyframes spinner-glow { 0% { filter: drop-shadow(0 0 5px rgba(59, 130, 246, 0.5)); } 50% { filter: drop-shadow(0 0 15px rgba(59, 130, 246, 0.8)); } 100% { filter: drop-shadow(0 0 5px rgba(59, 130, 246, 0.5)); } } #optimization-loader .animate-spin { animation: spin 1s linear infinite, spinner-glow 2s ease-in-out infinite; } /* ===== DARK MODE OPTIMIERUNGEN ===== */ @media (prefers-color-scheme: dark) { .animate-glow { animation: glow-dark 2s infinite ease-in-out; } @keyframes glow-dark { 0%, 100% { box-shadow: 0 0 5px rgba(96, 165, 250, 0.5), 0 0 10px rgba(96, 165, 250, 0.3), 0 0 15px rgba(96, 165, 250, 0.1); } 50% { box-shadow: 0 0 20px rgba(96, 165, 250, 0.8), 0 0 30px rgba(96, 165, 250, 0.6), 0 0 40px rgba(96, 165, 250, 0.4); } } } /* ===== PERFORMANCE OPTIMIERUNGEN ===== */ .animate-bounce-in, .animate-fade-in, .animate-slide-up, .animate-slide-up-delay, .animate-slide-up-delay-2, .animate-slide-up-delay-3 { will-change: transform, opacity; } .animate-pulse-scale, .animate-float, .animate-float-delay { will-change: transform; } .animate-glow { will-change: box-shadow; } /* ===== RESPONSIVE ANPASSUNGEN ===== */ @media (max-width: 768px) { .confetti-piece { width: 6px; height: 6px; } #optimization-reward-modal .text-8xl { font-size: 4rem; } #optimization-reward-modal .max-w-md { max-width: 90vw; } } /* ===== BUTTON HOVER VERBESSERUNGEN ===== */ button:hover .badge-star { animation-duration: 0.8s; } /* ===== ZUSÄTZLICHE UTILITY CLASSES ===== */ .animate-shake { animation: shake 0.5s ease-in-out; } @keyframes shake { 0%, 100% { transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); } 20%, 40%, 60%, 80% { transform: translateX(5px); } } .animate-heartbeat { animation: heartbeat 1.5s infinite; } @keyframes heartbeat { 0%, 100% { transform: scale(1); } 14% { transform: scale(1.1); } 28% { transform: scale(1); } 42% { transform: scale(1.1); } 70% { transform: scale(1); } } /* ===== PROGRESS BAR ANIMATION ===== */ .progress-fill { animation: progress-grow 2s ease-out; } @keyframes progress-grow { from { width: 0%; } to { width: var(--progress-width, 100%); } } /* ===== SUCCESS CHECKMARK ANIMATION ===== */ .success-checkmark { animation: checkmark-draw 0.8s ease-out; } @keyframes checkmark-draw { 0% { stroke-dasharray: 0 100; } 100% { stroke-dasharray: 100 0; } }