/* ===== Animations ===== */
@keyframes fadeIn {
    from { opacity: 0; }
    to { opacity: 1; }
}
@keyframes slideUp {
    from { opacity: 0; transform: translateY(16px); }
    to { opacity: 1; transform: translateY(0); }
}
@keyframes slideDown {
    from { opacity: 0; transform: translateY(-16px); }
    to { opacity: 1; transform: translateY(0); }
}
@keyframes float {
    0%, 100% { transform: translateY(0); }
    50% { transform: translateY(-8px); }
}
@keyframes pulse {
    0%, 100% { transform: scale(1); }
    50% { transform: scale(1.05); }
}
@keyframes toastIn {
    from { opacity: 0; transform: translateX(60px); }
    to { opacity: 1; transform: translateX(0); }
}
@keyframes toastOut {
    from { opacity: 1; transform: translateX(0); }
    to { opacity: 0; transform: translateX(60px); }
}
@keyframes countUp {
    from { opacity: 0; transform: scale(0.5); }
    to { opacity: 1; transform: scale(1); }
}
@keyframes shimmer {
    0% { background-position: -200% 0; }
    100% { background-position: 200% 0; }
}

/* Loading shimmer */
.skeleton {
    background: linear-gradient(90deg,
        var(--border-light) 25%,
        rgba(108,92,231,0.08) 50%,
        var(--border-light) 75%);
    background-size: 200% 100%;
    animation: shimmer 1.5s infinite;
    border-radius: var(--radius-sm);
    min-height: 20px;
}

/* Staggered animation */
.stagger-in > * {
    animation: slideUp 0.4s var(--ease) both;
}
.stagger-in > *:nth-child(1) { animation-delay: 0.05s; }
.stagger-in > *:nth-child(2) { animation-delay: 0.1s; }
.stagger-in > *:nth-child(3) { animation-delay: 0.15s; }
.stagger-in > *:nth-child(4) { animation-delay: 0.2s; }
.stagger-in > *:nth-child(5) { animation-delay: 0.25s; }
.stagger-in > *:nth-child(6) { animation-delay: 0.3s; }

/* Ripple effect */
.ripple {
    position: relative; overflow: hidden;
}
.ripple::after {
    content: ''; position: absolute;
    width: 100%; height: 100%;
    top: 0; left: 0;
    background: radial-gradient(circle, rgba(255,255,255,0.3) 10%, transparent 10%);
    transform: scale(10); opacity: 0;
    transition: transform 0.5s, opacity 0.8s;
}
.ripple:active::after {
    transform: scale(0); opacity: 1;
    transition: 0s;
}

/* Success flash */
.flash-success {
    animation: flashGreen 0.6s var(--ease);
}
@keyframes flashGreen {
    0% { box-shadow: 0 0 0 0 rgba(0,184,148,0.4); }
    50% { box-shadow: 0 0 0 12px rgba(0,184,148,0); }
    100% { box-shadow: var(--shadow-md); }
}
