Skip to main content

Case Study: Building a Token-Driven Design System

Evidence note:

This is a sanitized composite drawn from real design-system and UI-platform work across multiple products. Numbers are expressed as ranges or directional outcomes to preserve confidentiality while remaining useful.

1. Context and Constraints

Product Context

  • multiple web applications under one brand family
  • inconsistent UI patterns across products
  • accessibility regressions appearing over time
  • designers and engineers working in parallel without a stable shared language

Organizational Context

  • 4 frontend teams
  • no dedicated design-system team at the outset
  • pressure to ship features quickly
  • expected future brand evolution

Technical Context

  • React-based applications
  • hardcoded design values in many components
  • inconsistent APIs across shared UI
  • limited documentation and no safe deprecation path

2. Baseline Problems

UX and Consistency

  • similar components behaved differently across products
  • visual drift was weakening product credibility
  • accessibility fixes were reactive and repetitive

Developer Experience

  • component APIs exposed too many styling knobs
  • teams could misuse components easily
  • documentation described usage but not intent

Strategic Risk

  • rebranding would have required manual edits across hundreds of components
  • there was no trustworthy way to evolve shared UI without fear of breakage

3. Architecture Goals

  1. treat UI as a platform, not a pile of components
  2. encode design intent in tokens
  3. make accessibility the default path
  4. give teams a safe evolution and deprecation model
  5. improve adoption by making the recommended path easier

4. Key Decisions

ADR-001: Token-First Foundation

Decision:

  • introduce semantic design tokens as the foundation for themes and component behavior

Why:

  • reduce coupling between design intent and raw implementation values
  • support rebranding and accessibility tuning

Accepted cost:

  • higher up-front taxonomy work
  • more coordination with design

ADR-002: Composition Over Broad Configuration

Decision:

  • constrain component APIs and prefer composition over long prop surfaces

Why:

  • reduce invalid states
  • improve readability
  • make accessibility easier to preserve

Accepted cost:

  • some edge-case flexibility moved into documented extension points

ADR-003: Versioning and Deprecation Policy

Decision:

  • version the system deliberately and publish deprecation windows

Why:

  • build trust with consuming teams
  • make changes predictable

Accepted cost:

  • maintenance overhead
  • need for better release discipline

5. Implementation Shape

System Structure

Key Rules

  • components consume semantic tokens, not raw values
  • primitives own semantic HTML and accessibility defaults
  • documented extension points replace ad-hoc prop sprawl
  • Storybook acts as a usage surface, not only a screenshot gallery

6. Baseline -> Intervention -> Outcome

AreaBaselineInterventionOutcome after two major release cycles
duplicated UI workthe same component patterns were reimplemented across teamstoken-first primitives and shared patternsduplicated UI implementation dropped materially, estimated in the 25-40% range on common surfaces
accessibility regressionsrecurring issues in focus order, contrast, and semantic misuseaccessible primitives plus review and testing expectationsrepeated regression classes became less frequent and easier to catch before release
onboardingnew engineers learned component quirks by trial and errorStorybook examples, API guidance, migration docsonboarding to the shared system became noticeably faster and less support-heavy
rebrand readinessdesign changes implied broad manual editssemantic tokens plus theming layerbrand-level changes moved from component rewrite work toward theme and token changes

7. What Worked

  • teams trusted the system more because change policy became explicit
  • semantic tokens created a shared language between design and engineering
  • adoption improved when migration guides and examples were treated as part of the product
  • accessibility got better because it was built into primitives instead of layered on later

8. What I Would Revisit Today

  • add automated visual regression coverage earlier
  • define token naming governance sooner to avoid early semantic drift
  • track adoption metrics by team and surface from the start instead of relying on anecdotal confidence

9. Lessons

  • design systems become architectural when they encode constraints and evolution rules
  • token discipline is not design theater; it is change management
  • versioning and migration guidance are trust features
  • adoption is earned by speed and clarity, not by mandate