/* ============================================================
   animations.css — @keyframes and entrance animation bindings
   ============================================================ */

/* ---- Reusable keyframes ---- */
@keyframes chatShimmer {
    100% { transform: translateX(120%); }
}
@keyframes loadingDot {
    0%, 100% { transform: translateY(0);   opacity: 0.45; }
    50%       { transform: translateY(-3px); opacity: 1;   }
}
@keyframes blinkCursor {
    50% { opacity: 0; }
}
@keyframes micPulse {
    0%, 100% { opacity: 1;   }
    50%       { opacity: 0.5; }
}

/* ---- Entrance animations (fire once on unlock) ---- */
@keyframes evFadeUp {
    from { opacity: 0; transform: translateY(16px); }
    to   { opacity: 1; transform: translateY(0);    }
}
@keyframes evFadeDown {
    from { opacity: 0; transform: translateY(-10px); }
    to   { opacity: 1; transform: translateY(0);     }
}
@keyframes evFadeLeft {
    from { opacity: 0; transform: translateX(-12px); }
    to   { opacity: 1; transform: translateX(0);     }
}
@keyframes evFadeIn {
    from { opacity: 0; }
    to   { opacity: 1; }
}

/* Applied once via .is-revealed class added to #privateContent after unlock */
#privateContent.is-revealed .sidebar {
    animation: evFadeLeft 240ms cubic-bezier(0.22, 1, 0.36, 1) 0ms both;
}
#privateContent.is-revealed .topbar {
    animation: evFadeDown 220ms cubic-bezier(0.22, 1, 0.36, 1) 60ms both;
}
#privateContent.is-revealed .hero-group {
    animation: evFadeUp 280ms cubic-bezier(0.22, 1, 0.36, 1) 130ms both;
}
