← All motion systems
Motion System

Vercel

Instant, confident, and done — motion as fast as the deploys it represents.

get_motion("vercel")
Browse all

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

TokenValueUse
instant0msStatus badge color swaps, toggle states, icon replacements
fast100msHover states, button active feedback, tooltip appearance
default150msDropdown menus, popovers, command palette, small modals
slow200msPage-level panel transitions, deployment detail slide-in
slower300msFull-page context shifts, onboarding overlays

Easing

TokenCurveUse
ease-outcubic-bezier(0.0, 0, 0.2, 1)Elements entering — immediate departure, decelerates to rest
ease-incubic-bezier(0.4, 0, 1, 1)Elements exiting — accelerates away cleanly
ease-in-outcubic-bezier(0.4, 0, 0.2, 1)Elements repositioning within the layout
linearcubic-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 outline with 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.

Use this in your agent

The DesignMD MCP server returns this full motion system in one call. Combine it with design tokens using get_full_system.

get_full_system("vercel")
Set up MCP →