/* ============================================================
   Animations — 合乎周礼

   Restrained, scholarly micro-interactions. No bouncy or
   jarring movement — everything feels like ink on paper.
   ============================================================ */

/* ── Pulse dot ─────────────────────────────────────────── */
@keyframes pulse-dot-anim {
    0%, 100% { opacity: 0.35; transform: scale(0.75); }
    50%      { opacity: 1.0;  transform: scale(1.0); }
}

/* ── Ink ripple (concentric circles, like a drop in water) */
@keyframes ink-ripple {
    0% {
        width: 6px;
        height: 6px;
        opacity: 0.8;
    }
    100% {
        width: 48px;
        height: 48px;
        opacity: 0;
    }
}

/* ── Fade in/out for loading text ──────────────────────── */
@keyframes fade-in-out {
    0%, 100% { opacity: 0.5; }
    50%      { opacity: 1.0; }
}

/* ── Shimmer sweep ─────────────────────────────────────── */
@keyframes shimmer-anim {
    0%   { background-position: -200% 0; }
    100% { background-position: 200% 0; }
}

/* ── Fade in + slide up ────────────────────────────────── */
@keyframes fade-in-up {
    from { opacity: 0; transform: translateY(6px); }
    to   { opacity: 1; transform: translateY(0); }
}

/* ── Checkmark pop (copy success) ──────────────────────── */
@keyframes check-pop {
    0%   { transform: scale(0); opacity: 0; }
    50%  { transform: scale(1.25); opacity: 1; }
    100% { transform: scale(1); opacity: 1; }
}

/* ── Fade in ───────────────────────────────────────────── */
@keyframes fade-in {
    from { opacity: 0; }
    to   { opacity: 1; }
}

/* ── Utility animation classes ─────────────────────────── */
.anim-fade-in {
    animation: fade-in var(--transition-slow) ease forwards;
}

.anim-fade-in-up {
    animation: fade-in-up var(--transition-slow) ease forwards;
}

/* ── Reduced motion ────────────────────────────────────── */
@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
    }
}
