← Back to Blog Engineering

Building a Web Design System That Survives First Contact With Reality

Last Rev Team May 16, 2022 8 min read
Design system architecture showing token layers, component hierarchy, and documentation pipeline

Every organization of a certain size eventually decides they need a design system. A beautiful Figma library gets built. A component library gets started. A Confluence page with brand guidelines gets published. And within six months, half the team is ignoring it.

The problem is rarely the design system itself. It is how it gets introduced, maintained, and governed. The technical decisions matter... but the organizational decisions matter more.

Why Design Systems Fail

The Sparkbox Design Systems Survey consistently finds the same failure patterns year after year. The top reasons design systems do not get adopted:

  1. No dedicated team. A design system is a product. Products without teams do not get maintained. If maintaining the design system is "everyone's job," it is nobody's job.
  2. Built in isolation. A design system built by one team and handed to another gets rejected. The teams who need to use it were not part of building it, so it does not solve their actual problems.
  3. Too rigid or too flexible. Too rigid and teams work around it. Too flexible and it does not provide enough value to justify the learning curve.
  4. No adoption strategy. Publishing a component library and hoping people use it is not a strategy. You need migration paths, training, and incentives.

Notice that none of these are technical problems. They are people problems. The best-architected design system in the world fails if the organization does not support its adoption.

Start With the Problem, Not the System

Before building anything, answer one question: what problem is this design system solving for your organization?

"Consistency" is too vague. Get specific:

  • "Our checkout flow has 4 different button styles and it is confusing users" -- that is a problem
  • "New pages take 3 weeks to build because every one is custom" -- that is a problem
  • "Our mobile experience does not match our desktop experience" -- that is a problem
  • "We have 6 products and each one looks like it was built by a different company" -- that is a problem

The problem you are solving determines the scope of the system. If your problem is button consistency, you do not need a full design system... you need a component library. If your problem is cross-product coherence, you need tokens, guidelines, and governance in addition to components.

Scope it to the problem. Build the minimum system that solves it. Expand later based on demand.

The Foundation: Design Tokens

Design tokens are the lowest layer of a design system and the most impactful. They define the visual primitives... colors, spacing, typography, shadows, borders, breakpoints... as platform-agnostic variables.

A well-structured token system has two tiers:

  • Global tokens: Raw values like blue-500: #3B82F6 or space-4: 16px
  • Semantic tokens: Purpose-driven aliases like color-primary: blue-500 or button-padding: space-4

Semantic tokens are the key. When you reference color-primary instead of blue-500, you can change the primary color across your entire system by updating one mapping. When you add a dark mode, you swap the semantic layer... color-background maps to white in light mode and gray-900 in dark mode... and every component adapts automatically.

Tools like Style Dictionary transform tokens into platform-specific output: CSS custom properties for web, Swift constants for iOS, Kotlin values for Android. One source, every platform.

Component Architecture

Components are where most design systems focus their energy. But the architecture of those components determines whether they get adopted or abandoned.

The Layering Pattern

Build components in layers:

  1. Primitives: The smallest elements with no business logic. Button, Input, Text, Icon. These are framework-level building blocks.
  2. Composites: Combinations of primitives that form recognizable patterns. SearchBar (Input + Button + Icon), FormField (Label + Input + ErrorMessage).
  3. Patterns: Higher-order compositions that solve specific UX problems. LoginForm, NavigationBar, DataTable.

Each layer depends only on the layer below it. Patterns use composites. Composites use primitives. If you change a primitive, the impact is predictable because the dependency chain is clear.

Make It Framework-Agnostic When Possible

If your organization uses React today, it might use something else in three years. Design systems that are tightly coupled to a single framework have a shorter shelf life.

The practical approach: keep your tokens and design decisions framework-agnostic. Your component implementations will be framework-specific (React, Vue, Web Components), but the design system documentation, token values, and component specifications should be independent.

Web Components are worth considering for organizations with multiple frontend stacks. They work in any framework because they are built on web standards. The developer experience is not as polished as React or Vue component models, but the portability is unmatched.

Documentation as a Product

Your design system's documentation site is its storefront. If it is hard to navigate, incomplete, or out of date, adoption will suffer regardless of how good the components are.

Effective design system documentation includes:

  • Interactive examples for every component and variant (Storybook excels here)
  • Copy-paste code snippets that work out of the box
  • Usage guidelines explaining when to use each component and when not to
  • Accessibility notes documenting ARIA patterns and keyboard behavior
  • Change logs so teams know what is new and what changed
  • Migration guides for breaking changes

The documentation should be generated from the components themselves whenever possible. Storybook stories that serve as both tests and documentation ensure the docs are always current. Static documentation sites drift out of sync within weeks.

Governance Without Bureaucracy

A design system needs governance. Without it, the library becomes a dumping ground for every one-off pattern anyone needs. With too much, it becomes a bottleneck that teams route around.

The governance model that works for most organizations:

  • Small core team (2-4 people) who own the system full-time. They review contributions, maintain quality, and set direction.
  • Contribution model where any team can propose new components. The core team reviews and either accepts, requests changes, or explains why it does not belong in the shared system.
  • Clear criteria for what belongs in the system. The rule of three is a good starting point: if three or more teams need it, it goes in the system. Fewer than that, it stays local.
  • Regular audits where the core team reviews how components are being used (and misused) across products and identifies gaps or redundancies.
  • Deprecation policy with sunset timelines so teams have time to migrate away from outdated components.

Measuring Success

A design system is an investment. Like any investment, you need to measure whether it is paying off.

The metrics that matter:

  • Adoption rate: What percentage of UI across your products uses design system components? Track this quarterly.
  • Time to ship: How long does it take to build a new page or feature? This should decrease measurably after adoption.
  • Design-dev parity: How closely does the shipped product match the design specs? Component-based systems should dramatically reduce drift.
  • Accessibility compliance: What percentage of your UI meets WCAG standards? This should trend toward 100% as library components replace custom code.
  • Developer satisfaction: Survey your teams. If they do not like using the system, they will stop using it.

How We Build Design Systems at Last Rev

At Last Rev, we treat design systems as the foundational layer of every web architecture. Tokens define the visual language. Components implement it. The CMS maps to it. And documentation keeps everyone aligned.

We start small... tokens and a core set of components... and grow based on what the team actually needs. The system is a product, not a project. It evolves over time based on real usage patterns, not theoretical requirements.

The payoff is cumulative. Every new component added to the library makes the next project faster. Every project that uses the library validates and improves it. The investment compounds over time in a way that one-off development never can.

Ready to build a design system that your team actually uses? Let's start the conversation.

Sources

  1. Sparkbox -- "Design Systems Survey" (2022)
  2. Amazon -- "Style Dictionary" Documentation
  3. MDN -- "Web Components" Documentation (2023)
  4. Storybook -- "Build Component-Driven UIs" (2023)