Motion
Motion confirms that something changed. It never carries meaning by itself, and it never makes anyone wait.
fast · 150ms
hover, press, toggle, focus, stroke colour change
base · 200ms
panel expand, dialog enter/exit, drawer
cubic-bezier(.2,0,.38,1)
the one curve used everywhere
Animate opacity and transform only — in a preview-heavy interface where the GPU is already busy, animating height or width will drop frames. Nothing over 200ms, no bounce, no overshoot, no lingering. Generation progress is not an animation; it is a number and a stage name. No entrance animation on load: your app opens inside a container that is already visible, so a fade-in only reads as slow. prefers-reduced-motion collapses every duration to zero and nothing is lost, because no state was ever expressed by motion alone.