Motion
Short, quiet transitions that confirm what happened. Nothing moves for decoration.
Motion tells people where something came from or that their action worked. If it does neither, leave it out.
Durations
| What | Duration | Easing |
|---|---|---|
| Hover, focus and colour changes | 0.15s | ease |
| Menus and tooltips opening | 0.1 to 0.15s | ease-out |
| Content entering the page | 0.4s | [0.16, 1, 0.3, 1] |
| Dialogs and panels | 0.2s | ease-out |
These are the values the product already uses most: 0.15s CSS transitions on interactive elements, and a 0.4s fade-up for page content.
CSS transitions
Transition only the properties that change. Never use transition: all.
.campaign-row {
transition: background-color 0.15s ease, border-color 0.15s ease;
}Entering content
Use motion/react for content that appears: a short fade with a small upward move. Stagger siblings by about 0.05s.
import { motion } from "motion/react";
const fadeUp = (delay = 0) => ({
initial: { opacity: 0, y: 8 },
animate: { opacity: 1, y: 0 },
transition: { duration: 0.4, delay, ease: [0.16, 1, 0.3, 1] },
});
<motion.div {...fadeUp(0.05)}>…</motion.div>Reduced motion
Respect prefers-reduced-motion. Remove movement and keep only the fade, or show the end state at once.
@media (prefers-reduced-motion: reduce) {
.campaign-panel { animation: none; transition: none; }
}Don't
- Don't animate layout on every hover.
- Don't add bounce or spring overshoot to product UI.
- Don't delay a result so an animation can finish.