Expression

Motion

How things move, and the specs that keep it consistent.

Motion here is not decoration. It exists to explain where something came from and where it went. Two easings and three durations cover everything on the site — if a new animation needs a fourth, the animation is usually wrong.

Tokens

RoleValueToken
Enter / settlecubic-bezier(0.22, 1, 0.36, 1)--ease-enter
Hover / presscubic-bezier(0.32, 0.72, 0, 1)--ease-hover
Fast200ms--duration-fast
Base400ms--duration-base
Slow / scrub1100ms--duration-slow

The two easings

Enter settles like a physical object coming to rest. Hover is sharper, because a pointer response that takes 400ms feels broken.

Enter

cubic-bezier(0.22, 1, 0.36, 1)

400ms

Hover

cubic-bezier(0.32, 0.72, 0, 1)

200ms

Interruptible, always

Every animation starts from the value currently on screen and can be reversed mid-flight. Nothing waits for a transition to finish before it will accept input. A gesture that has to complete before you can change your mind is a bug, not a flourish.

Reduced motion

Under prefers-reduced-motion: reduce the site does not simply speed animations up — it removes the ones that move things through space and keeps only opacity. Autoplaying video does not start. This is honoured everywhere, including the brand portal you are reading.

Do: Animate opacity and transform only. Both are compositor-friendly.

Do: Start from the current value, not from a hardcoded origin.

Do: Keep hover and press feedback under 200ms.

Do: Let scroll reveals settle at 400ms, staggered by no more than 60ms.

Do not: Do not animate width, height, top or left. They force layout.

Do not: Do not bounce. Overshoot reads as playful; this brand is calm.

Do not: Do not loop an animation that has no reason to repeat.

Do not: Do not block interaction while something is animating.

Geometry

RadiusValueToken
Card12px--radius-card
Button8px--radius-button
Input8px--radius-input
Pill9999px--radius-pill
SpaceValueToken
xxs4px--shrf-space-xxs
xs8px--shrf-space-xs
sm12px--shrf-space-sm
md16px--shrf-space-md
lg24px--shrf-space-lg
xl40px--shrf-space-xl
2xl64px--shrf-space-2xl
3xl96px--shrf-space-3xl

Why spacing is prefixed

The scale is named --shrf-space-* rather than --spacing-* because Tailwind v4 reserves the latter for its own utility scale. Overriding it would silently redefine every max-w-* in the codebase.
Motion — Shareefico Brand