vercel-labs / web-interface-guidelines
git clone https://github.com/vercel-labs/web-interface-guidelines.git
Guidelines for building interfaces on the Web.
+6
stars, 24h · #2,325
+~42
stars, 7 days · #2,890
+~180
stars, 30 days · #2,857
1.0k
★ total · +4% this week
71
forks · 2 open issues
Star history (as recorded here)
LanguageShell
LicenseMIT
Created2025-09-10 (1y ago)
Last push16d ago
Watchers11
OwnerOrganization
GitHub topics
Links
- GitHub: github.com/vercel-labs/web-interface-guidelines
- Homepage: https://vercel.com/design/guidelines
- Releases · Issues · Hacker News mentions
README excerpt
# Web Interface Guidelines Interfaces succeed because of hundreds of choices. This is a living, non-exhaustive list of those decisions. Most guidelines are framework-agnostic, some specific to React/Next.js. Feedback is welcome. ## Interactions - **Keyboard works everywhere.** All flows are keyboard-operable & follow the WAI-ARIA Authoring Patterns. - **Clear focus.** Every focusable element shows a visible, unobscured focus ring. Prefer `:focus-visible` over `:focus` to avoid distracting pointer users. Set `:focus-within` for grouped controls. Sticky headers, footers, banners, & overlays never cover the focused element. - **Manage focus.** Use focus traps, move & return focus according to the WAI-ARIA Patterns. - **Match visual & hit targets.** Exception: if the visual target is ` font size is ≥ 16px on mobile to prevent iOS Safari auto-zoom/pan on focus. Or set ` `. - **Respect zoom.** Never disable browser zoom. - **Hydration-safe inputs.** Inputs must not lose focus or value after hydration. - **Don’t block paste.** Never disable paste in ` ` or ` `. - **Loading buttons.** Show a loading indicator & keep the original label. - **Minimum loading-state duration.** If you show a spinner/skeleton, add a short show-delay (~150–300 ms) & a minimum visible time (~300–500 ms) to avoid flicker on fast responses. The ` ` component in React does this automatically. - **URL as state.** Persist state in the URL so share, refresh, Back/Forward navigation work e.g., nuqs. - **Optimistic updates.** Update the UI immediately when success is likely; reconcile on server response. On failure, show an error & roll back or provide Undo. - **Ellipsis for further input & loading states.** Menu options that open a follow-up e.g., "Rename…" & loading/processing states e.g., "Loading…", "Saving…", "Generating…" end with an ellipsis. - **Confirm destructive actions.** Require confirmation or provide Undo with a safe window. - **Prevent double-tap zoom on controls.** Set `touch-action: manipulation`. - **Tap highlight follows design.** Set `webkit-tap-highlight-color`. - **Design forgiving interactions.** Controls minimize finickiness with generous hit targets, clear affordances, & predictable interactions, e.g., prediction cones. - **Tooltip timing.** Delay the first tooltip in a group; subsequent peers have no delay. - **Overscroll behavior.** Set `overscroll-behavior: contain` intentionally e.g., in modals/drawers. - **Desktop rubber-banding.** To suppress rubber-band bounce, set `overscroll-behavior: none` on ` ` inside `@media (pointer: fine)`. Keep page overscroll defaults on coarse-pointer devices to preserve mobile pull-to-refresh. `pointer` describes the primary input, so test hybrid touch devices separately. `none` also disables scroll chaining & native swipe navigation. - **Scroll positions persist.** Back/Forward restores prior scroll. - **Autofocus for speed.** On desktop screens with a single primary input, autofocus. Rarely autofocus on mobile because the k