/* Global Animation Tokens */
:root {
    --anim-duration-fast: 0.2s;
    --anim-duration-normal: 0.3s;
    --anim-duration-slow: 0.5s;
    --anim-ease-out: cubic-bezier(0.215, 0.61, 0.355, 1);
    /* easeOutCubic */
    --anim-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
    /* springy */
}

/* Keyframes */
@keyframes fadeIn {
    from {
        opacity: 0;
    }

    to {
        opacity: 1;
    }
}

@keyframes fadeOut {
    from {
        opacity: 1;
    }

    to {
        opacity: 0;
    }
}

@keyframes slideUp {
    from {
        transform: translateY(15px);
        opacity: 0;
    }

    to {
        transform: translateY(0);
        opacity: 1;
    }
}

@keyframes slideDown {
    from {
        transform: translateY(-15px);
        opacity: 0;
    }

    to {
        transform: translateY(0);
        opacity: 1;
    }
}

@keyframes scaleIn {
    from {
        transform: scale(0.95);
        opacity: 0;
    }

    to {
        transform: scale(1);
        opacity: 1;
    }
}

@keyframes popIn {
    0% {
        transform: scale(0.9);
        opacity: 0;
    }

    60% {
        transform: scale(1.05);
        opacity: 1;
    }

    100% {
        transform: scale(1);
        opacity: 1;
    }
}

@keyframes shake {
    0%, 100% {
        transform: translateX(0);
    }
    10%, 30%, 50%, 70%, 90% {
        transform: translateX(-4px);
    }
    20%, 40%, 60%, 80% {
        transform: translateX(4px);
    }
}

@keyframes pulse {
    0%, 100% {
        opacity: 1;
    }
    50% {
        opacity: 0.6;
    }
}

@keyframes slideInRight {
    from {
        transform: translateX(100%);
        opacity: 0;
    }
    to {
        transform: translateX(0);
        opacity: 1;
    }
}

@keyframes slideOutRight {
    from {
        transform: translateX(0);
        opacity: 1;
    }
    to {
        transform: translateX(100%);
        opacity: 0;
    }
}

@keyframes bounce {
    0%, 100% {
        transform: translateY(0);
    }
    50% {
        transform: translateY(-6px);
    }
}

/* Utility Composition Classes */
.animate-fade-in {
    animation: fadeIn var(--anim-duration-normal) var(--anim-ease-out) forwards;
}

.animate-slide-up {
    animation: slideUp var(--anim-duration-normal) var(--anim-ease-out) forwards;
    will-change: transform, opacity;
}

.animate-slide-down {
    animation: slideDown var(--anim-duration-normal) var(--anim-ease-out) forwards;
    will-change: transform, opacity;
}

.animate-scale-in {
    animation: scaleIn var(--anim-duration-fast) var(--anim-ease-out) forwards;
}

.animate-pop-in {
    animation: popIn var(--anim-duration-normal) var(--anim-ease-spring) forwards;
}

.animate-shake {
    animation: shake 0.5s ease-in-out;
}

.animate-pulse {
    animation: pulse 2s ease-in-out infinite;
}

.animate-slide-in-right {
    animation: slideInRight var(--anim-duration-normal) var(--anim-ease-out) forwards;
}

.animate-slide-out-right {
    animation: slideOutRight var(--anim-duration-normal) var(--anim-ease-out) forwards;
}

.animate-bounce {
    animation: bounce 0.6s var(--anim-ease-spring);
}

/* Stagger Delays */
.delay-100 {
    animation-delay: 100ms;
}

.delay-200 {
    animation-delay: 200ms;
}

.delay-300 {
    animation-delay: 300ms;
}

/* Interactive Hover/Press Effects */
.hover-lift {
    transition: transform var(--anim-duration-fast) var(--anim-ease-out), box-shadow var(--anim-duration-fast) ease;
}

.hover-lift:hover {
    transform: translateY(-2px);
}

.hover-scale {
    transition: transform var(--anim-duration-fast) var(--anim-ease-out);
}

.hover-scale:hover {
    transform: scale(1.03);
}

.press-effect {
    transition: transform 0.1s ease;
}

.press-effect:active {
    transform: scale(0.96);
}

/* Accessibility: Reduced Motion */
@media (prefers-reduced-motion: reduce) {

    *,
    *::before,
    *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}