/* ============================================================
   animations.css
   All @keyframes definitions used across the application.
   ============================================================ */

/* ── Progress bar cursor blink ── */
@keyframes cursorBlink {
    0%, 100% { opacity: 1; }
    50% { opacity: 0; }
}

/* ── Progress bar neon shimmer ── */
@keyframes neonShimmer {
    0% { background-position: 100% 0; }
    100% { background-position: -100% 0; }
}

/* ── Progress bar complete pulse ── */
@keyframes completePulse {
    0% { box-shadow: 0 0 8px rgba(96, 165, 250, 0.5); }
    50% { box-shadow: 0 0 20px rgba(96, 165, 250, 0.9), 0 0 40px rgba(96, 165, 250, 0.4); }
    100% { box-shadow: 0 0 12px rgba(96, 165, 250, 0.7), 0 0 30px rgba(96, 165, 250, 0.3); }
}

/* ── Loading typewriter ── */
@keyframes typewriter {
    0%, 100% { width: 0; }
    50% { width: 10ch; }
}

/* ── Dissolve out (progress bar removal) ── */
@keyframes dissolveOut {
    0% { opacity: 1; transform: translateY(0); filter: blur(0); }
    60% { opacity: 0.3; transform: translateY(-3px); filter: blur(1px); }
    100% { opacity: 0; transform: translateY(-6px); filter: blur(3px); }
}

/* ── Collapse space (progress bar removal) ── */
@keyframes collapseSpace {
    0% { max-height: 120px; margin-bottom: 20px; opacity: 1; }
    100% { max-height: 0; margin-bottom: 0; opacity: 0; overflow: hidden; }
}

/* ── Date selector matrix materialize ── */
@keyframes matrixMaterialize {
    0% {
        opacity: 0;
        filter: blur(6px);
        transform: translateY(-8px) scaleY(0.92);
    }
    30% {
        opacity: 0.5;
        filter: blur(3px);
        transform: translateY(-2px) scaleY(0.98);
    }
    70% {
        opacity: 0.9;
        filter: blur(0.5px);
        transform: translateY(1px) scaleY(1.005);
    }
    100% {
        opacity: 1;
        filter: blur(0);
        transform: translateY(0) scaleY(1);
    }
}

/* ── Date selector inner item reveal ── */
@keyframes matrixItemReveal {
    0% { opacity: 0; filter: blur(4px); transform: translateY(-4px); }
    60% { opacity: 0.7; filter: blur(1px); transform: translateY(0); }
    100% { opacity: 1; filter: blur(0); transform: translateY(0); }
}

/* ── Progress bar materialize ── */
@keyframes progressMaterialize {
    0% {
        opacity: 0;
        filter: blur(4px);
        transform: translateY(-5px);
        border-color: var(--border-medium);
        box-shadow: 0 0 15px rgba(96, 165, 250, 0.12);
    }
    50% {
        opacity: 0.7;
        filter: blur(1px);
        transform: translateY(1px);
        border-color: var(--border-subtle);
    }
    100% {
        opacity: 1;
        filter: blur(0);
        transform: translateY(0);
        border-color: var(--border-subtle);
        box-shadow: none;
    }
}

/* ── Stat value icy pulse variants ── */
@keyframes icyPulse {
    0%, 100% { color: #e8eeff; text-shadow: 0 0 6px rgba(96, 165, 250, 0.15); }
    50% { color: #dce6fa; text-shadow: 0 0 12px rgba(96, 165, 250, 0.25); }
}
@keyframes icyPulseGreen {
    0%, 100% { color: #c0eecd; text-shadow: 0 0 8px rgba(25, 254, 143, 0.2); }
    50% { color: #ade8bd; text-shadow: 0 0 14px rgba(25, 254, 143, 0.35); }
}
@keyframes icyPulseRed {
    0%, 100% { color: #eec0c0; text-shadow: 0 0 8px rgba(209, 0, 0, 0.2); }
    50% { color: #e8adad; text-shadow: 0 0 14px rgba(209, 0, 0, 0.35); }
}

/* ── Section fade in ── */
@keyframes sectionFadeIn {
    0% {
        opacity: 0;
        filter: blur(6px);
        transform: translateY(-8px) scaleY(0.92);
        border-color: var(--border-medium);
        box-shadow: 0 0 20px rgba(96, 165, 250, 0.15), inset 0 0 30px rgba(96, 165, 250, 0.05);
    }
    30% {
        opacity: 0.5;
        filter: blur(3px);
        transform: translateY(-2px) scaleY(0.98);
        border-color: var(--border-subtle);
        box-shadow: 0 0 12px rgba(96, 165, 250, 0.1);
    }
    70% {
        opacity: 0.9;
        filter: blur(0.5px);
        transform: translateY(1px) scaleY(1.005);
        border-color: var(--border-subtle);
    }
    100% {
        opacity: 1;
        filter: blur(0);
        transform: translateY(0) scaleY(1);
        border-color: var(--border-subtle);
        box-shadow: none;
    }
}

/* ── Vapor in (pair/category chips, splitter popup) ── */
@keyframes vaporIn {
    0% {
        opacity: 0;
        filter: blur(6px);
        transform: scale(0.92) translateY(-4px);
        border-color: transparent;
        box-shadow: 0 0 12px rgba(96, 165, 250, 0.15);
    }
    50% {
        opacity: 0.7;
        filter: blur(2px);
        transform: scale(1.01) translateY(0);
        border-color: var(--border-subtle);
        box-shadow: 0 0 8px rgba(96, 165, 250, 0.08);
    }
    100% {
        opacity: 1;
        filter: blur(0);
        transform: scale(1) translateY(0);
        border-color: var(--border-subtle);
        box-shadow: 0 0 4px rgba(96, 165, 250, 0.06);
    }
}

/* ── Expiry bar grow ── */
@keyframes barGrow {
    0% { transform: scaleX(0); }
    100% { transform: scaleX(1); }
}

/* ── Neon border pulse ── */
@keyframes neonBorderPulse {
    0%, 100% { border-color: rgba(96, 165, 250, 0.35); box-shadow: 0 0 4px rgba(96, 165, 250, 0.1); }
    50% { border-color: rgba(96, 165, 250, 0.7); box-shadow: 0 0 12px rgba(96, 165, 250, 0.25); }
}

/* ── Gravity center pulse ── */
@keyframes gcPulse {
    0%, 100% { transform: translate(-50%, -50%) scale(1); }
    50% { transform: translate(-50%, -50%) scale(1.2); }
}

