341 lines
6.8 KiB
CSS
341 lines
6.8 KiB
CSS
/**
|
|
* 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;
|
|
}
|
|
} |