Tactile controls
Press must feel WIRED — 80ms in. Release springs back over the full 380ms pop tier with a real overshoot. The trick: on :active, override ONLY the transform's duration; letting go restores the spring mid-flight.
--motion-pop 380ms--ease-spring-pop ζ.62press-in 80msHover lifts are tiny and consistent: scale(1.02) or translateY(-1px) on controls, -2px on cards, press sits back at scale(0.97–0.98). Restraint reads as expensive.
Press & release
hold a button down, then let go — the release overshoots
Focus ring locks in
Tab through — the 3px ring rides the pop spring, not a fade
Lift grammar
−1px controls · −2px cards · press sits back down
The transition-split pattern
for CVA components that own a single class string
A variant component can't layer multiple transition rules, so ONE rule splits durations per property: colors ride the base tier; transform and box-shadow (the focus ring) ride the pop spring. :active then overrides only the transform slot.
.spring-press {
transition:
color var(--motion-fast) var(--ease),
background-color var(--motion-base) var(--ease),
border-color var(--motion-base) var(--ease),
box-shadow var(--motion-pop) var(--ease-spring-pop), /* ring locks in */
transform var(--motion-pop) var(--ease-spring-pop); /* release springs */
&:hover:not(:disabled) { transform: scale(1.02); }
&:active:not(:disabled) {
transform: scale(0.97);
/* override ONLY the transform's duration — press reacts in 80ms */
transition-duration: var(--motion-fast), var(--motion-base),
var(--motion-base), var(--motion-pop), 80ms;
}
}