/* ============================================================
   EliteDrive — Animations (animista.net style, local)
   All animations respect prefers-reduced-motion.
   ============================================================ */

@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        animation-duration: .01ms !important;
        transition-duration: .01ms !important;
    }
}

/* -------- Entrance --------------------------------------------------- */
.ed-anim-fade-in-fwd {
    animation: ed-fade-in-fwd var(--duration-slow, 320ms) var(--ease-out, cubic-bezier(.22,1,.36,1)) both;
    animation-delay: var(--delay, 0ms);
}
@keyframes ed-fade-in-fwd {
    0%   { opacity: 0; transform: translateZ(-60px); }
    100% { opacity: 1; transform: translateZ(0); }
}

.ed-anim-slide-in-blurred-left {
    animation: ed-slide-in-blurred-left 900ms var(--ease-spring, cubic-bezier(.34,1.56,.64,1)) both;
}
@keyframes ed-slide-in-blurred-left {
    0%   { transform: translateX(-1000px) scaleX(2.5) scaleY(.2);
           transform-origin: 100% 50%;
           filter: blur(40px);
           opacity: 0; }
    100% { transform: translateX(0) scaleY(1) scaleX(1);
           filter: blur(0);
           opacity: 1; }
}

.ed-anim-swing-in-top-fwd {
    animation: ed-swing-in-top-fwd 600ms var(--ease-spring, cubic-bezier(.34,1.56,.64,1)) both;
    transform-origin: top;
}
@keyframes ed-swing-in-top-fwd {
    0%   { transform: rotateX(-100deg); opacity: 0; }
    100% { transform: rotateX(0);       opacity: 1; }
}

.ed-anim-scale-up-center {
    animation: ed-scale-up-center 280ms var(--ease-spring, cubic-bezier(.34,1.56,.64,1)) both;
}
@keyframes ed-scale-up-center {
    0%   { transform: scale(.6); opacity: 0; }
    100% { transform: scale(1);  opacity: 1; }
}

/* -------- Text -------------------------------------------------------- */
.ed-anim-text-focus-in {
    animation: ed-text-focus-in 900ms var(--ease-out, cubic-bezier(.22,1,.36,1)) both;
}
@keyframes ed-text-focus-in {
    0%   { filter: blur(12px); opacity: 0; }
    100% { filter: blur(0);    opacity: 1; }
}

.ed-anim-tracking-in-expand {
    animation: ed-tracking-in-expand 700ms var(--ease-out, cubic-bezier(.22,1,.36,1)) both;
}
@keyframes ed-tracking-in-expand {
    0%   { letter-spacing: -.5em; opacity: 0; }
    40%  { opacity: .6; }
    100% { letter-spacing: normal; opacity: 1; }
}

/* -------- Feedback --------------------------------------------------- */
.ed-anim-shake {
    animation: ed-shake 380ms var(--ease-out, cubic-bezier(.22,1,.36,1));
}
@keyframes ed-shake {
    0%, 100% { transform: translateX(0); }
    20%, 60% { transform: translateX(-6px); }
    40%, 80% { transform: translateX(6px); }
}

.ed-anim-pulse-danger {
    animation: ed-pulse-danger 400ms var(--ease-out, cubic-bezier(.22,1,.36,1)) 2;
}
@keyframes ed-pulse-danger {
    0%, 100% { box-shadow: 0 0 0 0 var(--color-danger-soft); }
    50%     { box-shadow: 0 0 0 10px transparent; }
}

/* -------- Skeletons -------------------------------------------------- */
.ed-skel-row {
    height: 14px;
    border-radius: var(--radius-xs, 4px);
    margin: 10px 0;
    background: linear-gradient(90deg,
                var(--color-surface) 0%,
                var(--color-surface-hover) 50%,
                var(--color-surface) 100%);
    background-size: 200% 100%;
    animation: ed-shimmer 1.2s linear infinite;
}
@keyframes ed-shimmer {
    from { background-position: 200% 0; }
    to   { background-position: -200% 0; }
}

/* -------- Auth hero blob --------------------------------------------- */
@keyframes ed-blob-float {
    0%, 100% { transform: translate(0, 0) rotate(0deg); }
    50%      { transform: translate(-30px, 20px) rotate(25deg); }
}
