.shake{animation:shake .28s ease-in-out}
@keyframes shake{0%{transform:translateX(0)}25%{transform:translateX(-6px)}50%{transform:translateX(6px)}75%{transform:translateX(-3px)}100%{transform:translateX(0)}}
.pulse{animation:pulse 1s ease-in-out}
@keyframes pulse{0%{opacity:.9}50%{opacity:1}100%{opacity:.9}}
.confetti{position:fixed;inset:0;pointer-events:none}
.loader-spin{animation:spin 0.9s linear infinite}
@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}
.dots::after{content:"";animation:dots 1.2s steps(3,end) infinite}
@keyframes dots{0%{content:"."}33%{content:".."}66%{content:"..."}100%{content:"."}}
.shimmer{background:linear-gradient(90deg,#e5e7eb 25%,#f3f4f6 50%,#e5e7eb 75%);background-size:200% 100%;animation:shimmer 1.2s ease-in-out infinite}
@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}
