/* Keyframes and animation helpers */
/* ---------- animations ---------- */
@keyframes fadeUp{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
@keyframes pop{0%{opacity:0;transform:scale(.6)}100%{opacity:1;transform:scale(1)}}
@keyframes deal{0%{opacity:0;transform:translateY(40px) rotate(-6deg) scale(.9)}100%{opacity:1;transform:none}}
@keyframes flip{0%{transform:rotateY(0)}50%{transform:rotateY(90deg)}100%{transform:rotateY(0)}}
@keyframes grow{from{width:0}}
@keyframes shimmer{to{background-position:200% center}}
@keyframes bounce{0%,80%,100%{transform:translateY(0);opacity:.35}40%{transform:translateY(-5px);opacity:1}}
@keyframes rollIn{from{opacity:0;transform:translateY(60%);filter:blur(6px)}to{opacity:1;transform:none;filter:none}}
@keyframes rollOut{to{opacity:0;transform:translateY(-60%);filter:blur(6px)}}
@keyframes shake{10%,90%{transform:translateX(-1px)}20%,80%{transform:translateX(3px)}30%,50%,70%{transform:translateX(-6px)}40%,60%{transform:translateX(6px)}}
.a-up{animation:fadeUp .6s var(--ease) both;animation-delay:var(--d,0ms)}
.a-in{animation:fadeIn .5s var(--ease) both;animation-delay:var(--d,0ms)}
.a-pop{animation:pop .5s var(--spring) both;animation-delay:var(--d,0ms)}
.typing{display:inline-flex;gap:4px;margin-left:6px;vertical-align:middle}
.typing i{width:5px;height:5px;border-radius:50%;background:currentColor;animation:bounce 1.2s infinite}
.typing i:nth-child(2){animation-delay:.15s}.typing i:nth-child(3){animation-delay:.3s}
@media (prefers-reduced-motion:reduce){*,*::before{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}
