Motion System: Vercel
Category: Developer Tools / Deployment Platform Instant, confident, and done — motion as fast as the deploys it represents.
Motion Philosophy
Vercel's motion is inseparable from its core value proposition: speed. Every deploy is measured in seconds; every interface interaction should feel just as immediate. Animation is not decoration — it is feedback. When a deploy button is clicked, the UI must respond so fast that it feels like the platform already knew you were going to click it. Anything slower than instantaneous is a gap between action and acknowledgment, and that gap erodes confidence in the platform.
The visual language is monochrome and stark — black backgrounds, white elements, hard edges. Motion follows this aesthetic: clean transitions with no softness, no spring physics, no gradients bleeding through mid-animation. Elements enter with a sharp ease-out that front-loads the motion, so the destination is reached almost immediately. Elements that need to convey "processing" do so through deliberate, purposeful loading indicators — not spinning ornaments, but progress states that communicate real pipeline stages. The deploy log streaming in line by line is itself an animation; the system trusts that raw information is more satisfying than a polished loader.
Motion must never slow the developer down. Hover states are near-instant. Menus open quickly. The one exception is transitions that communicate a change of context — navigating from the dashboard into a project, or into deployment details — where a brief slide-in grounds the user spatially. Even then, the transition is short. Speed is the brand; every millisecond of animation is borrowed from that promise.
Duration Scale
| Token | Value | Use |
|---|---|---|
| instant | 0ms | Status badge color swaps, toggle states, icon replacements |
| fast | 100ms | Hover states, button active feedback, tooltip appearance |
| default | 150ms | Dropdown menus, popovers, command palette, small modals |
| slow | 200ms | Page-level panel transitions, deployment detail slide-in |
| slower | 300ms | Full-page context shifts, onboarding overlays |
Easing
| Token | Curve | Use |
|---|---|---|
| ease-out | cubic-bezier(0.0, 0, 0.2, 1) | Elements entering — immediate departure, decelerates to rest |
| ease-in | cubic-bezier(0.4, 0, 1, 1) | Elements exiting — accelerates away cleanly |
| ease-in-out | cubic-bezier(0.4, 0, 0.2, 1) | Elements repositioning within the layout |
| linear | cubic-bezier(0, 0, 1, 1) | Progress bars, build step indicators, continuous loops |
No spring physics. Springs introduce settling time; Vercel's motion should arrive and stop, period. The ease-out curve is chosen for maximum front-loading: the element covers most of its distance in the first third of the duration, then glides to rest.
Spring Configs (Framer Motion / react-spring)
Vercel does not use spring configurations in its product UI. All transitions use duration-based cubic-bezier easing. If a third-party component introduces spring defaults, override them.
- Override default: duration: 150ms, ease: ease-out (replace any spring with this for product UI)
Stagger Patterns
- Deployment list rows: 30ms between each row, on initial load only
- Project cards on dashboard: 40ms between each card, triggered once on mount
- Navigation items (mobile): 25ms between each item
- Build step log lines: No stagger — lines appear as they stream, driven by real data timing
- Feature list / checklist items: 35ms between each item
Enter / Exit Patterns
Fade + Slide (default — menus, modals, command palette)
enter: opacity 0→1, translateY 4px→0, duration: default (150ms), ease: ease-out
exit: opacity 1→0, translateY 0→-4px, duration: fast (100ms), ease: ease-in
Scale Pop (tooltips, popovers, small dropdowns)
enter: opacity 0→1, scale 0.97→1, duration: fast (100ms), ease: ease-out
exit: opacity 1→0, scale 1→0.97, duration: fast (100ms), ease: ease-in
Slide (project detail panel, deployment sidebar)
enter: translateX 100%→0, duration: slow (200ms), ease: ease-out
exit: translateX 0→100%, duration: default (150ms), ease: ease-in
Deploy Button State Transition
idle → deploying: label cross-fades over fast (100ms), spinner fades in over fast (100ms)
deploying → success: spinner fades out, checkmark fades in over fast (100ms),
background pulses to green then returns to default over slow (200ms) ease-out
deploying → error: same pattern, red pulse
Status Badge (Deploying / Ready / Error / Canceled)
color transition: instant (0ms) — badge color is data, not animation
dot pulse (deploying state): opacity 1→0.3, 800ms, ease: ease-in-out, infinite alternate
Interaction States
- Hover: Background fill transitions at 80ms ease-out. For bordered cards, border-color shifts at 80ms. No scale transform on hover for primary actions. Icon buttons may shift brightness via CSS filter at 80ms.
- Press/Active: scale(0.97) over 60ms ease-out. Releases immediately on pointer-up. No spring — the press should feel mechanical, not bouncy.
- Focus: Focus ring appears at 0ms — no transition. CSS
outlinewith 2px offset. Keyboard navigation must never wait for animation. - Loading (deploy in progress): Streaming log lines appear as newline-delimited data arrives. A thin linear progress bar at the top of the build pane advances with linear easing. Indeterminate states use a shimmer skeleton with a 1200ms linear CSS animation.
- Copy-to-clipboard: Icon swaps from copy to checkmark instantly (0ms), reverts after 1500ms timeout with a cross-fade at fast (100ms).
Rules
- No springs anywhere in product UI. Duration-based easing only. Speed and precision over physicality.
- Status and state changes that carry real data (build status, deployment state, error/success) must be instant — 0ms. Animating a status badge transition introduces false ambiguity about whether the state has actually changed.
- Respect
prefers-reduced-motion: collapse all durations to 0ms, disable transforms, freeze any looping animations (dot pulse, progress shimmer). - Exit animations must always be shorter than or equal to enter animations. The interface clears faster than it populates — clearing is never a ceremony.