Menu

Tier 2 Topic UX.2.11

Design Systems

Component libraries, design tokens, documentation standards, versioning, and governing design at scale across teams and products.

25% Theory 50% Methods & Templates 25% Examples
Theory

What a design system is and isn't

A design system is the single source of truth for a product's design — a collection of reusable components, design tokens, patterns, and guidelines that teams use to build consistent experiences at scale. It's not a style guide (which documents visual identity), not a component library (which is just the building blocks), and not a pattern library (which documents solutions to common problems). A design system includes all three, plus the governance, documentation, and tooling that make them usable across teams.

The purpose is consistency and velocity. Without a design system, every designer and developer makes independent decisions about button sizes, spacing values, color usage, and interaction patterns. The result is a product that looks and feels slightly different on every screen — "almost consistent," which is worse than intentionally different. A design system eliminates these micro-decisions by providing tested, documented, accessible components. Teams ship faster because they're assembling from a library, not designing from scratch. The system compounds: every component built once is reused hundreds of times.

When you don't need one (yet)

A design system is overhead. For a solo designer building one product, a simple style guide and a well-organized Figma file is sufficient. Design systems become valuable when: multiple designers work on the same product, a product spans multiple platforms (web, iOS, Android), multiple products share a brand identity, or hand-off friction between design and engineering is a bottleneck. If you're shipping faster without a system than you would with one, you don't need one yet.

Anatomy of a design system

A design system has layers, from abstract to concrete. Design principles guide decisions when the system doesn't have a specific rule ("clarity over cleverness," "progressive disclosure"). Design tokens are the atomic values — colors, spacing, typography, shadows, motion curves — that define the visual language. Components are the reusable UI building blocks — buttons, inputs, cards, modals, tooltips. Patterns are solutions to common design problems using components — a search-and-filter pattern, an onboarding flow pattern, a settings page pattern. Guidelines document when and how to use each element — the "why" behind the "what."

Atomic Design (Frost) Framework

Use when: structuring your component hierarchy from smallest to largest.

Brad Frost's Atomic Design provides a mental model for organizing components. Atoms: The smallest indivisible elements — buttons, labels, input fields, icons. Molecules: Simple groups of atoms that function together — a search field (input + button), a form field (label + input + help text). Organisms: Complex, distinct sections composed of molecules — a navigation header, a product card, a comment thread. Templates: Page-level layouts that arrange organisms — the structure of a settings page, a dashboard layout. Pages: Specific instances of templates with real content. The hierarchy helps teams think in layers: atoms are designed once and used everywhere; organisms are where most customization happens.

Practical

Design tokens

Token Architecture Core Method

Use when: defining the foundational values your system is built on.

Design tokens are named values that store design decisions. Instead of hardcoding #1A73E8 in fifty places, you define --color-primary: #1A73E8 once, and reference the token everywhere. When the brand color changes, you change one value. Tokens fall into categories: Color (brand, semantic, surface, text, border), Typography (font family, size scale, weight, line height, letter spacing), Spacing (padding/margin scale, typically 4px or 8px base), Sizing (icon sizes, touch targets, container widths), Shadow (elevation levels), Motion (duration, easing curves), Border (width, radius). Good token systems use semantic naming: --color-error rather than --color-red, --spacing-comfortable rather than --spacing-16.

Token Naming Convention Technique

Use when: establishing a naming system that scales without confusion.

A three-tier naming convention prevents conflicts as your system grows. Global tokens define raw values: --blue-500: #1A73E8. Semantic tokens assign meaning: --color-action: var(--blue-500). Component tokens scope to context: --button-primary-bg: var(--color-action). This layering means changing "our primary action color is blue" requires changing one semantic token, not every component token. The naming pattern: category-property-variant-state (e.g., color-text-secondary, spacing-inline-sm, shadow-elevation-high).

Start with what you have

Don't try to define tokens in the abstract. Audit your existing product's CSS: collect every color value, spacing value, font size, and shadow. You'll find dozens of near-duplicates (14px and 15px, #333 and #2D2D2D). Rationalize these into a coherent scale. A real audit of a real product is worth more than a theoretically perfect token set designed in isolation.

Component architecture

Component Inventory Core Method

Use when: starting a design system by cataloging what already exists.

Before building new components, inventory what exists. Screenshot every unique button, form field, card, modal, and navigation element across your product. Group them by type and identify inconsistencies: how many visually different buttons exist? How many variations of card layouts? This inventory reveals the scope of the problem (often 30+ button variants when 5 would suffice) and provides the basis for consolidation. Use tools like CSS Stats to audit the codebase, and compare with a visual audit of actual screens to catch inconsistencies that code analysis misses.

Component API Design Technique

Use when: defining how components are configured and composed.

Every component needs a clear API — the props, variants, and slots that determine how it's used. Props: What can be configured? A Button component might accept: variant (primary, secondary, ghost), size (sm, md, lg), disabled (boolean), icon (optional). Composition: How does it combine with other components? A Card component might accept any child content, or it might have named slots (header, body, footer). States: What states does it support? Default, hover, focus, active, disabled, loading, error. Document all states — missing state designs are the most common cause of implementation inconsistency.

Documentation that gets used

Component Documentation Template Core Method

Use when: documenting any design system component.

Every component page should include: What it is: A one-sentence description. When to use it: Common scenarios where this component is appropriate. When NOT to use it: Scenarios where a different component is better (often more valuable than "when to use"). Anatomy: A labeled diagram of the component's parts. Variants: All available variants with visual examples. States: All interactive states (default, hover, focus, disabled, loading, error). Behavior: How it responds to interaction, including responsive behavior. Accessibility: ARIA roles, keyboard interaction, screen reader behavior. Do/Don't: Visual examples of correct and incorrect usage. Code: Copy-pasteable implementation snippets.

The documentation gap

The most common design system failure is documentation that's either missing or outdated. A component without documentation will be used incorrectly or not used at all. A component with outdated documentation is worse — teams follow wrong guidance and create inconsistencies while believing they're using the system correctly. Treat documentation as part of the component — a component isn't "done" until it's documented, and updating the component means updating the docs in the same commit.

Versioning and change management

Semantic Versioning for Design Technique

Use when: managing how changes to the design system are communicated and adopted.

Apply semantic versioning (semver) principles to your design system. Patch (1.0.x): Bug fixes, small visual tweaks, documentation updates. No action needed by consumers. Minor (1.x.0): New components, new variants, non-breaking additions. Consumers can adopt at their convenience. Major (x.0.0): Breaking changes — renamed props, removed components, changed behavior. Requires migration effort from consumers. Communicate changes through a changelog, and provide migration guides for major versions. Teams using the system need to trust that updates won't break their product without warning.

Governance models

Governance Models Framework

Use when: deciding who builds, maintains, and evolves the design system.

Three common models: Centralized: A dedicated design system team builds and maintains everything. Products consume but don't contribute. Best for: large organizations with many product teams. Risk: bottleneck — the system team can't keep pace with product team needs. Federated: Representatives from each product team contribute to the system. No dedicated team. Best for: smaller organizations with collaborative culture. Risk: inconsistent quality and nobody "owns" it. Hybrid: A small core team sets standards and reviews contributions; product teams contribute components. Best for: most organizations. The core team maintains tokens, core components, and documentation standards; product teams contribute domain-specific patterns.

Contribution Process Technique

Use when: product teams need components that don't exist in the system yet.

A clear contribution process prevents both bottlenecks and chaos.

  • Step 1: Propose — the team describes the component they need, why existing components don't suffice, and whether it's product-specific or broadly useful.
  • Step 2: Design review — the system team evaluates the proposal against existing patterns, accessibility requirements, and naming conventions.
  • Step 3: Build — the contributing team builds the component following system standards.
  • Step 4: Quality gate — the system team reviews implementation, documentation, accessibility, and test coverage.
  • Step 5: Publish — the component is added to the system with full documentation. This process takes time — communicate realistic timelines and provide escape hatches for urgent needs.

Adoption and measuring impact

Adoption Tracking Technique

Use when: measuring whether the design system is actually being used.

A design system's value is proportional to its adoption. Track:

  • Component coverage — what percentage of product UI uses system components vs. custom implementations?
  • Token compliance — are products using system tokens or hardcoding values?
  • Version currency — are teams on the latest version or lagging behind?
  • Contribution velocity — are teams contributing back to the system?
  • Design-to-code fidelity — do implemented screens match the design system Figma library? These metrics reveal whether the system is driving consistency (the goal) or sitting unused (expensive shelf-ware).

Sell value, not compliance

Teams adopt a design system because it makes their work easier and faster, not because they're told to. If adoption is low, the system isn't solving real problems for its consumers. Talk to product teams: what components do they need? What's missing? What's too rigid? A design system team that listens to its users (the product teams) builds adoption naturally. A team that mandates compliance builds resentment.

Design token architecture

Design Token Architecture Core Method

Use when: building or scaling a design system that needs to bridge design tools and production code, or when supporting multiple platforms and themes.

Design tokens are the atomic values of a design system — colors, spacing, typography, shadows, borders — stored as platform-agnostic data rather than hardcoded CSS values. A robust token architecture has three layers. Global tokens are the raw values: color-blue-500: #2563EB, space-4: 16px. These are the palette — not meant for direct use in components. Semantic tokens map global tokens to meaning: color-action-primary: color-blue-500, space-section-gap: space-8. These express intent and enable theming — swap the mapping for dark mode or a sub-brand. Component tokens map semantic tokens to specific component properties: button-primary-bg: color-action-primary, card-padding: space-section-gap. These enable component-level overrides without breaking the system. The design-to-code bridge connects token definitions in design tools (Figma variables, Tokens Studio) to production code through automated pipelines. Changes flow from design → token definition file (JSON/YAML) → build tool (Style Dictionary, Theo) → platform outputs (CSS custom properties, iOS/Android constants, React theme objects). This automation eliminates the manual translation step where design-engineering drift historically occurs.

Content in design systems

Design systems typically govern visual components and interaction patterns — but content patterns (error messages, empty states, confirmation dialogs, naming conventions) are equally important for consistency. Integrating content into the design system means adding voice and tone tokens, content pattern documentation alongside component documentation, and naming convention guidelines that writers and designers both reference. For the full treatment of content integration into design systems, see CS.2.07 Content & Design Systems.

Templates and checklists

Checklist Design System Health Check
  • Design tokens are defined for color, typography, spacing, shadow, and motion
  • Token naming follows a consistent semantic convention
  • Core components (button, input, card, modal, toast) are documented with all states
  • Each component has "when to use" and "when NOT to use" guidance
  • Accessibility requirements (ARIA, keyboard, contrast) are documented per component
  • A contribution process exists and is documented
  • Versioning follows semver with a maintained changelog
  • Figma library and code implementation are in sync
  • Adoption metrics are tracked and reviewed quarterly
  • The system has an identified owner (person or team)
Examples

Real-world examples

Case study

Shopify Polaris: a system built for merchants and developers

Shopify's Polaris design system serves hundreds of internal developers and thousands of third-party app developers building on the Shopify platform. Its strength is its dual audience: it provides design guidance for Shopify employees and enforces consistency across the third-party app ecosystem. Polaris includes design tokens, components, pattern guidance, content guidelines (voice, grammar, naming conventions), and Figma libraries. The public documentation is comprehensive enough that external developers can build apps that feel native to the Shopify experience.

Why it works: Polaris treats the design system as a product with its own users (developers), roadmap, and support process. It's not just documentation — it's a service.

Case study

IBM Carbon: token-driven theming at enterprise scale

IBM's Carbon Design System uses a sophisticated token architecture that enables theming across IBM's vast product portfolio. Products can adopt one of four built-in themes (White, Gray 10, Gray 90, Gray 100) or create custom themes by overriding semantic tokens. This means a healthcare product and a financial product can use the same components but feel distinct. Carbon also demonstrates mature governance: a dedicated team maintains the core system, and a federated model allows business units to contribute domain-specific patterns through a structured proposal and review process.

Why it works: The token architecture solves the enterprise problem of consistency-with-flexibility. Products look like they belong together without looking identical.

Case study

Gov.uk Design System: accessibility-first, evidence-based

The UK Government Digital Service's design system is notable for its rigorous, evidence-based approach. Every component is tested with real users, including users of assistive technologies. Patterns are added only when there's evidence of a shared need across government services. The documentation is exceptionally clear — plain language, specific guidance on when to use and not use each component, and researched accessibility annotations. The contribution process requires evidence of user need, tested implementations, and accessibility audits before a pattern is accepted.

Why it works: The evidence bar ensures that every component in the system has been validated. Teams trust the system because they know each component has been tested, not just designed.

Common pitfalls

!

Building a system nobody asked for

A design system built in isolation, without input from product teams, solves theoretical problems instead of real ones. Start by understanding what product teams struggle with: inconsistency? Slow handoff? Accessibility gaps? Design the system to solve those specific problems, not to be architecturally elegant.

!

Over-engineering tokens

A token system with five levels of abstraction (global → alias → semantic → component → variant) is impressive engineering and unusable in practice. Start with two levels (global values and semantic names) and add complexity only when you hit real problems that demand it. Most products never need more than three levels.

!

Figma library ≠ design system

A Figma component library is a tool, not a system. Without documentation, guidelines, code implementation, versioning, and governance, it's just organized files. Teams that mistake their Figma library for a design system wonder why developers implement components differently from the designs — because the designs don't include the specification a developer needs.

Connected topics in your library

Deep Dive

Appendix

On this page