/* ================= AI on a short leash: eased, not snapped ================= */
#ai{--ease:cubic-bezier(.2,.7,.3,1)}
#ai .pipe .stage{transition:border-color .6s var(--ease),background-color .6s var(--ease),box-shadow .6s var(--ease)}
#ai .pipe .stage::before{transition:background .6s var(--ease)} #ai .pipe .stage::after{transition:border-color .6s var(--ease)}
#ai .stage.run{animation:lift .5s var(--ease) both}
#ai .sb.pop{animation:pop2 .4s var(--ease)}
#ai .aitabs2 button{transition:border-color .5s var(--ease),background-color .5s var(--ease),color .5s var(--ease)}
#ai .aitabs2 .prog{transition:width .9s cubic-bezier(.4,0,.2,1)}
#ai .stage>:not(.sh){transition:opacity .4s ease}
#ai .ai3.dim .stage>:not(.sh){opacity:0}
#ai .in,#ai .qr,#ai .tot{animation:fade .5s var(--ease) both}
#ai .tpl .fill.new{animation:fade .45s var(--ease)}
@media (prefers-reduced-motion:reduce){#ai .in,#ai .qr,#ai .tot,#ai .stage.run,#ai .sb.pop{animation:none}#ai .stage>:not(.sh){transition:none}}
