Presses settle in 160ms
Transform and filter run 160ms, one step slower than color.
Motion measured on linear.app; colors from an unofficial DESIGN.md.
Press and release quickly
Tap each button fast, then hover and release slowly.
600ms linearBad
transition: transform 600ms linear160ms soft easeGood
transition: transform 160ms cubic-bezier(0.25, 0.46, 0.45, 0.94).action {
--settle: cubic-bezier(0.25, 0.46, 0.45, 0.94); /* measured */
transition:
transform 160ms var(--settle),
filter 160ms var(--settle),
background-color 100ms var(--settle);
}
@media (hover: hover) and (pointer: fine) {
.action:hover { transform: translateY(-2px); filter: brightness(1.15); }
}
.action:active { transform: scale(0.97); }
Why it matters, pros and cons
Why it matters
- Movement covers distance, so it needs a beat longer than color.
- 160ms is long enough to read as weight and short enough to stay ahead.
- The same curve as color keeps hover and press one system.
Pros
- Rapid taps never stack up a lagging animation.
- Lift and brightness land together, so it feels physical.
- One pair of values covers buttons, tiles and rows.
Cons
- Very large elements need longer than 160ms.
- Filters cost more to paint than color on big areas.
- Measured from the live site, not a published spec.