Design System Guidelines
Follow Apple, Linear, and Vercel as design inspirations. Ask yourself "How would Apple, Linear, or Vercel design this?"
When designing React components, also use the compound-components skill to build the components.
Interactions
Keyboard
- MUST: Full keyboard support per WAI-ARIA APG
- MUST: Visible focus rings (
:focus-visible; group with :focus-within)
- MUST: Manage focus (trap, move, and return) per APG patterns
Targets & Input
- MUST: Hit target >=24px (mobile >=44px). If visual <24px, expand hit area
- MUST: Mobile
<input> font-size >=16px or set:<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover"
/>
- NEVER: Disable browser zoom
- MUST:
touch-action: manipulation to prevent double-tap zoom; set -webkit-tap-highlight-color to match design
Inputs & Forms
- MUST: Hydration-safe inputs (no lost focus/value)
- NEVER: Block paste in
<input>/<textarea>
- MUST: Loading buttons show spinner and keep original label
- MUST: Enter submits focused text input. In
<textarea>, Cmd/Ctrl+Enter submits; Enter adds newline
- MUST: Keep submit enabled until request starts; then disable, show spinner, use idempotency key
- MUST: Don't block typing; accept free text and validate after
- MUST: Allow submitting incomplete forms to surface validation
- MUST: Errors inline next to fields; on submit, focus first error
- MUST:
autocomplete + meaningful name; correct type and inputmode
- SHOULD: Disable spellcheck for emails/codes/usernames
- SHOULD: Placeholders end with ellipsis and show example pattern (eg,
+1 (123) 456-7890, sk-012345...)
- MUST: Warn on unsaved changes before navigation
- MUST: Compatible with password managers & 2FA; allow pasting one-time codes
- MUST: Trim values to handle text expansion trailing spaces
- MUST: No dead zones on checkboxes/radios; label+control share one generous hit target
State & Navigation
- MUST: URL reflects state (deep-link filters/tabs/pagination/expanded panels). Prefer libs like nuqs
- MUST: Back/Forward restores scroll
- MUST: Links are links--use
<a>/<Link> for navigation (support Cmd/Ctrl/middle-click)
Feedback
- SHOULD: Optimistic UI; reconcile on response; on failure show error and rollback or offer Undo
- MUST: Confirm destructive actions or provide Undo window
- MUST: Use polite
aria-live for toasts/inline validation
- SHOULD: Ellipsis (
...) for options that open follow-ups (eg, "Rename...")
Touch/Drag/Scroll
- MUST: Design forgiving interactions (generous targets, clear affordances; avoid finickiness)
- MUST: Delay first tooltip in a group; subsequent peers no delay
- MUST: Intentional
overscroll-behavior: contain in modals/drawers
- MUST: During drag, disable text selection and set
inert on dragged element/containers
- MUST: No "dead-looking" interactive zones--if it looks clickable, it is
Autofocus
- SHOULD: Autofocus on desktop when there's a single primary input; rarely on mobile (to avoid layout shift)
Animation
- MUST: Honor
prefers-reduced-motion (provide reduced variant)
- SHOULD: Prefer CSS > Web Animations API > JS libraries
- MUST: Animate compositor-friendly props (
transform, opacity); avoid layout/repaint props (top/left/width/height)
- SHOULD: Animate only to clarify cause/effect or add deliberate delight
- SHOULD: Choose easing to match the change (size/distance/trigger)
- MUST: Animations are interruptible and input-driven (avoid autoplay)
- MUST: Correct
transform-origin (motion starts where it "physically" should)
Layout
- SHOULD: Optical alignment; adjust by +/-1px when perception beats geometry
- MUST: Deliberate alignment to grid/baseline/edges/optical centers--no accidental placement
- SHOULD: Balance icon/text lockups (stroke/weight/size/spacing/color)
- MUST: Verify mobile, laptop, ultra-wide (simulate ultra-wide at 50% zoom)
- MUST: Respect safe areas (use
env(safe-area-inset-*))
- MUST: Avoid unwanted scrollbars; fix overflows
Content & Accessibility
- SHOULD: Inline help first; tooltips last resort
- MUST: Skeletons mirror final content to avoid layout shift
- MUST:
<title> matches current context
- MUST: No dead ends; always offer next step/recovery
- MUST: Design empty/sparse/dense/error states
- SHOULD: Curly quotes (" "); avoid widows/orphans
- MUST: Tabular numbers for comparisons (
font-variant-numeric: tabular-nums or a monospace font)
- MUST: Redundant status cues (not color-only); icons have text labels
- MUST: Don't ship the schema--visuals may omit labels but accessible names still exist
- MUST: Use the ellipsis character
... (not ..)
- MUST:
scroll-margin-top on headings for anchored links; include a "Skip to content" link; hierarchical <h1-h6>
- MUST: Resilient to user-generated content (short/avg/very long)
- MUST: Locale-aware dates/times/numbers/currency
- MUST: Accurate names (
aria-label), decorative elements aria-hidden, verify in the Accessibility Tree
- MUST: Icon-only buttons have descriptive
aria-label
- MUST: Prefer native semantics (
button, a, label, table) before ARIA
- SHOULD: Right-clicking the nav logo surfaces brand assets
- MUST: Use non-breaking spaces to glue terms:
10 MB, Cmd + K, Vercel SDK
Visual Design
- SHOULD: Layered shadows (ambient + direct)
- SHOULD: Crisp edges via semi-transparent borders + shadows
- SHOULD: Nested radii: child <= parent; concentric
- SHOULD: Hue consistency: tint borders/shadows/text toward bg hue
- MUST: Accessible charts (color-blind-friendly palettes)
- MUST: Meet contrast--prefer APCA over WCAG 2
- MUST: Increase contrast on
:hover/:active/:focus
- SHOULD: Match browser UI to bg
- SHOULD: Avoid gradient banding (use masks when needed)
Performance (UX)
- SHOULD: Test iOS Low Power Mode and macOS Safari
- MUST: Mutations (
POST/PATCH/DELETE) target <500 ms
- MUST: Preload only above-the-fold images; lazy-load the rest
- MUST: Prevent CLS from images (explicit dimensions or reserved space)
1---2name: design-43description: UI/UX design guidelines for interactions, animation, layout, accessibility, and visual design. Use when building UI components, designing user experiences, or implementing user-facing features.4---5
6# Design System Guidelines
7
8Follow Apple, Linear, and Vercel as design inspirations. Ask yourself "How would Apple, Linear, or Vercel design this?"
9
10When designing React components, also use the [compound-components skill](../compound-components/SKILL.md) to build the components.
11
12## Interactions
13
14### Keyboard
15
16- MUST: Full keyboard support per [WAI-ARIA APG](https://www.w3.org/WAI/ARIA/apg/patterns/)
17- MUST: Visible focus rings (`:focus-visible`; group with `:focus-within`)
18- MUST: Manage focus (trap, move, and return) per APG patterns
19
20### Targets & Input
21
22- MUST: Hit target >=24px (mobile >=44px). If visual <24px, expand hit area
23- MUST: Mobile `<input>` font-size >=16px or set:
24 ```html
25 <meta
26 name="viewport"
27 content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover"
28 />
29 ```
30- NEVER: Disable browser zoom
31- MUST: `touch-action: manipulation` to prevent double-tap zoom; set `-webkit-tap-highlight-color` to match design
32
33### Inputs & Forms
34
35- MUST: Hydration-safe inputs (no lost focus/value)
36- NEVER: Block paste in `<input>/<textarea>`
37- MUST: Loading buttons show spinner and keep original label
38- MUST: Enter submits focused text input. In `<textarea>`, Cmd/Ctrl+Enter submits; Enter adds newline
39- MUST: Keep submit enabled until request starts; then disable, show spinner, use idempotency key
40- MUST: Don't block typing; accept free text and validate after
41- MUST: Allow submitting incomplete forms to surface validation
42- MUST: Errors inline next to fields; on submit, focus first error
43- MUST: `autocomplete` + meaningful `name`; correct `type` and `inputmode`
44- SHOULD: Disable spellcheck for emails/codes/usernames
45- SHOULD: Placeholders end with ellipsis and show example pattern (eg, `+1 (123) 456-7890`, `sk-012345...`)
46- MUST: Warn on unsaved changes before navigation
47- MUST: Compatible with password managers & 2FA; allow pasting one-time codes
48- MUST: Trim values to handle text expansion trailing spaces
49- MUST: No dead zones on checkboxes/radios; label+control share one generous hit target
50
51### State & Navigation
52
53- MUST: URL reflects state (deep-link filters/tabs/pagination/expanded panels). Prefer libs like [nuqs](https://nuqs.dev)
54- MUST: Back/Forward restores scroll
55- MUST: Links are links--use `<a>/<Link>` for navigation (support Cmd/Ctrl/middle-click)
56
57### Feedback
58
59- SHOULD: Optimistic UI; reconcile on response; on failure show error and rollback or offer Undo
60- MUST: Confirm destructive actions or provide Undo window
61- MUST: Use polite `aria-live` for toasts/inline validation
62- SHOULD: Ellipsis (`...`) for options that open follow-ups (eg, "Rename...")
63
64### Touch/Drag/Scroll
65
66- MUST: Design forgiving interactions (generous targets, clear affordances; avoid finickiness)
67- MUST: Delay first tooltip in a group; subsequent peers no delay
68- MUST: Intentional `overscroll-behavior: contain` in modals/drawers
69- MUST: During drag, disable text selection and set `inert` on dragged element/containers
70- MUST: No "dead-looking" interactive zones--if it looks clickable, it is
71
72### Autofocus
73
74- SHOULD: Autofocus on desktop when there's a single primary input; rarely on mobile (to avoid layout shift)
75
76## Animation
77
78- MUST: Honor `prefers-reduced-motion` (provide reduced variant)
79- SHOULD: Prefer CSS > Web Animations API > JS libraries
80- MUST: Animate compositor-friendly props (`transform`, `opacity`); avoid layout/repaint props (`top/left/width/height`)
81- SHOULD: Animate only to clarify cause/effect or add deliberate delight
82- SHOULD: Choose easing to match the change (size/distance/trigger)
83- MUST: Animations are interruptible and input-driven (avoid autoplay)
84- MUST: Correct `transform-origin` (motion starts where it "physically" should)
85
86## Layout
87
88- SHOULD: Optical alignment; adjust by +/-1px when perception beats geometry
89- MUST: Deliberate alignment to grid/baseline/edges/optical centers--no accidental placement
90- SHOULD: Balance icon/text lockups (stroke/weight/size/spacing/color)
91- MUST: Verify mobile, laptop, ultra-wide (simulate ultra-wide at 50% zoom)
92- MUST: Respect safe areas (use `env(safe-area-inset-*)`)
93- MUST: Avoid unwanted scrollbars; fix overflows
94
95## Content & Accessibility
96
97- SHOULD: Inline help first; tooltips last resort
98- MUST: Skeletons mirror final content to avoid layout shift
99- MUST: `<title>` matches current context
100- MUST: No dead ends; always offer next step/recovery
101- MUST: Design empty/sparse/dense/error states
102- SHOULD: Curly quotes (" "); avoid widows/orphans
103- MUST: Tabular numbers for comparisons (`font-variant-numeric: tabular-nums` or a monospace font)
104- MUST: Redundant status cues (not color-only); icons have text labels
105- MUST: Don't ship the schema--visuals may omit labels but accessible names still exist
106- MUST: Use the ellipsis character `...` (not `..`)
107- MUST: `scroll-margin-top` on headings for anchored links; include a "Skip to content" link; hierarchical `<h1-h6>`
108- MUST: Resilient to user-generated content (short/avg/very long)
109- MUST: Locale-aware dates/times/numbers/currency
110- MUST: Accurate names (`aria-label`), decorative elements `aria-hidden`, verify in the Accessibility Tree
111- MUST: Icon-only buttons have descriptive `aria-label`
112- MUST: Prefer native semantics (`button`, `a`, `label`, `table`) before ARIA
113- SHOULD: Right-clicking the nav logo surfaces brand assets
114- MUST: Use non-breaking spaces to glue terms: `10 MB`, `Cmd + K`, `Vercel SDK`
115
116## Visual Design
117
118- SHOULD: Layered shadows (ambient + direct)
119- SHOULD: Crisp edges via semi-transparent borders + shadows
120- SHOULD: Nested radii: child <= parent; concentric
121- SHOULD: Hue consistency: tint borders/shadows/text toward bg hue
122- MUST: Accessible charts (color-blind-friendly palettes)
123- MUST: Meet contrast--prefer [APCA](https://apcacontrast.com/) over WCAG 2
124- MUST: Increase contrast on `:hover/:active/:focus`
125- SHOULD: Match browser UI to bg
126- SHOULD: Avoid gradient banding (use masks when needed)
127
128## Performance (UX)
129
130- SHOULD: Test iOS Low Power Mode and macOS Safari
131- MUST: Mutations (`POST/PATCH/DELETE`) target <500 ms
132- MUST: Preload only above-the-fold images; lazy-load the rest
133- MUST: Prevent CLS from images (explicit dimensions or reserved space)