/* Motion with reduced-motion fallback */
.reveal{opacity:0;transform:translateY(18px);transition:opacity var(--slow) var(--ease),transform var(--slow) var(--ease)}.reveal.is-visible{opacity:1;transform:none}
.line::after{content:"";position:absolute;right:-3px;top:-3px;width:8px;height:8px;border-radius:50%;background:var(--accent);box-shadow:0 0 14px var(--accent);animation:pulse 2.2s infinite}
@keyframes pulse{0%,100%{opacity:.35;transform:scale(.75)}50%{opacity:1;transform:scale(1.15)}}
@keyframes spin{to{transform:rotate(360deg)}}
.btn.is-loading::before{content:"";width:.9rem;height:.9rem;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:spin .75s linear infinite}
.toast{position:fixed;right:1rem;bottom:1rem;z-index:var(--z-toast);padding:.8rem 1rem;border-radius:.7rem;background:var(--text);color:var(--bg);box-shadow:var(--shadow-lg);animation:toast-in .3s var(--ease)}
@keyframes toast-in{from{opacity:0;transform:translateY(12px)}}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}.reveal{opacity:1;transform:none}}
