5.2 UI design and design systems
Overview and motivation
User interface (UI) design is the craft of shaping what people see and touch: layout, typography, colour, spacing, controls, and states. A design system takes that craft and turns it into a shared, reusable, governed asset: a documented set of principles, components, patterns, and tokens that every team draws from, so the whole product looks and behaves as one. UI design decides how one screen should look. A design system decides how ten thousand screens across many teams stay coherent.
For a large organisation, the design system is the single highest-leverage investment in UI quality and delivery speed. Without one, every team reinvents buttons, forms, modals, and error handling, each slightly different, each maintained separately, each broken separately. Users pay for this in confusion and distrust; the business pays for it in duplicated effort and uneven quality. A design system turns one-time design decisions into reusable capital: solve accessibility, responsiveness, and branding once in a component, and every team inherits the result.
Enterprise and government add two specific pressures. First, scale: hundreds of applications, many built by vendors or acquired through mergers, all need to feel like one organisation. Second, longevity and change: brands get refreshed, agencies get reorganised, and a single platform may need to serve several brands or sub-agencies from one codebase. A well-architected design system, with proper theming and tokenisation, makes these sweeping changes tractable instead of catastrophic.
Key principles
- Consistency lowers cognitive load; a button should look and behave the same everywhere.
- Design decisions are assets: capture them once as reusable components and tokens.
- Tokens are the source of truth for visual decisions; components consume tokens, never hard-coded values.
- Accessibility and responsiveness are built into components, not bolted on per screen.
- A design system is a product with users (developers and designers), not a one-off deliverable.
- Visual hierarchy guides attention: type, colour, and space should make importance obvious.
- Governance keeps a system coherent; contribution keeps it alive.
Recommendations
Structure the system in layers: tokens, components, patterns
Design tokens are named, platform-agnostic values for colour, spacing, typography, radius, elevation, and motion: the atomic decisions. Build them in tiers: a primitive palette (raw values), semantic tokens (color-action-primary, space-inset-md) that carry meaning, and component-level tokens where you need them. Components consume the semantic tokens, so a single change propagates everywhere. Above components sit patterns: proven compositions such as a data table, a multi-step form, or an empty state. Document all three layers in one place, with live examples and usage guidance.
Get the visual fundamentals right
Set up a typographic scale with clear hierarchy and generous line spacing for readability, and keep to a limited set of sizes and weights. Define colour as a system, with enough contrast for accessibility (see the accessibility chapter) and semantic roles, rather than raw hues scattered through the UI. Use a spacing scale and a layout grid so alignment and rhythm stay consistent without per-screen guesswork. Visual hierarchy should make the primary action and the most important information obvious at a glance.
Design responsive and mobile-first
Design for the smallest reasonable viewport first, then enhance for larger screens. This forces you to prioritise the essential content and controls. Use fluid layouts and relative units so interfaces adapt to any screen, rather than snapping between a few fixed breakpoints. Make touch targets large enough, and make sure interactions work with touch, mouse, and keyboard. In government especially, assume a meaningful share of your users are on small, older, or budget devices.
Make design-to-dev handoff and parity a first-class concern
A design system only pays off when the shipped UI matches the intended design and keeps matching. Aim for a single source of truth: tokens exported from the design tool feed directly into code, so designers and engineers reference the same values. Provide a coded component library that engineers will actually use, with the same names and props as the design components. Use visual regression testing (automated comparison of rendered UI against approved baseline images) and design-review checks to catch drift. And measure “design-code parity” as an explicit health metric: the share of UI built from system components versus one-off code.
Support theming and white-labelling at enterprise scale
Architect for multiple brands from the start if there is any chance you will need them. Because components consume semantic tokens, a theme is just a different set of token values, so a brand refresh or a new sub-brand becomes a data change, not a code rewrite. Support light and dark themes, high-contrast modes, and per-tenant branding through the same mechanism. Keep brand-specific logic out of components, and push it into token sets and configuration instead.
Govern the system as a product
Give the design system a dedicated team, a roadmap, versioning, a changelog, and a support channel. Spell out how teams contribute new components, and how those get reviewed and promoted. Balance central control (to preserve coherence and accessibility) with a contribution model (so the system evolves with real needs rather than becoming a bottleneck). Communicate deprecations and migrations clearly, and give consuming teams enough lead time.
Trade-offs: pros and cons
| Decision | Pros | Cons |
|---|---|---|
| Build a design system | Consistency, speed, accessibility once, easier rebrands | Upfront and ongoing cost, needs a dedicated team |
| Adopt an off-the-shelf system | Fast start, proven patterns | Generic look, harder to fit unique brand and needs |
| Strict central governance | Coherence, quality, accessibility guaranteed | Can bottleneck teams, feel bureaucratic |
| Open contribution model | Evolves with real needs, shared ownership | Risk of drift and inconsistency without review |
| Heavy tokenisation and theming | Cheap rebrands and multi-brand support | More abstraction, steeper learning curve |
Design systems trade upfront and governance cost for long-run consistency and velocity. For a small product with one team, the overhead may not pay off. For a large organisation with many teams and long-lived products, the question is not whether to have a system but how much to invest and how to govern it. The most common regret is under-investing in governance and parity tooling: the system exists on paper, but teams quietly drift away from it.
Questions to discuss with your team
How is our token architecture tiered, and are components forbidden from using hard-coded values? The whole payoff of a design system (cheap rebrands, multi-brand theming, accessibility solved once) depends on components consuming semantic tokens like
color-action-primaryrather than raw hues and pixel values scattered through code. Decide on the tiers now: a primitive palette, semantic tokens that carry meaning, and component-level tokens only where you truly need them. Over-abstraction is a real risk, so agree how many layers is too many and how a developer finds the right token quickly. Bring a grep of hard-coded colours and spacing across your codebase as evidence of drift. If brand logic is baked into components, a rebrand becomes a code rewrite instead of a config change, which is the exact catastrophe tokenisation exists to prevent.How do we measure and defend design-code parity, and what tooling catches drift automatically? A design system that exists only as a design file is a sticker sheet: engineers rebuild everything anyway and the shipped UI slowly diverges from intent. Agree on an explicit parity metric (the share of UI built from system components versus one-off code) and wire visual regression testing into CI so rendered screens are compared against approved baselines. This matters at enterprise and government scale because hundreds of applications, many built by vendors or inherited through mergers, all need to feel like one organisation. Bring the current parity number and a list of the top bespoke components teams keep rebuilding. If no one owns the metric or the regression suite, drift is already winning quietly.
How do we govern contribution, deprecation, and migration so the system neither bottlenecks teams nor fragments? Strict central control guarantees coherence and accessibility but can turn the design-system team into a bottleneck teams route around; open contribution keeps the system alive but risks divergent variants with no review. Decide the contribution path: how a team proposes a new component, who reviews it, and how it gets promoted. Equally, agree how you communicate breaking changes, because deprecations without migration support and lead time cause consuming teams to stall or fork. Bring examples of components teams built outside the system and ask why they did not contribute back. The answer usually reveals whether your governance is a service or an obstacle.
How do we guarantee that accessibility is solved once inside components, and what stops a team from shipping an inaccessible one-off? The strongest argument for a design system is that colour contrast, focus states, keyboard operation, and screen-reader semantics get solved once and inherited everywhere, but that promise collapses the moment teams hand-roll their own controls. For a large organisation this is where the biggest legal and reputational risk sits, because a single inaccessible payment form or date picker can block real users and trigger complaints across every product that copied it. Weigh central enforcement (accessible components plus a linter or review gate that rejects raw markup) against team autonomy, and decide where the hard line is. Bring the results of an accessibility audit, a list of components with their conformance status, and a count of bespoke controls teams rebuilt outside the system. In enterprise and government settings this is not a nicety: obligations such as WCAG, Section 508, and EN 301 549 make conformance a procurement and audit requirement, so a component library with documented conformance is itself a compliance asset.
How many brands, tenants, and themes must this system serve, and have we architected the token layer for that now rather than retrofitting it later? Theming is cheap if you designed for it and brutal if you did not, because a brand or tenant that was never anticipated forces brand logic back into components and undoes the whole point of tokenisation. For a large team this decision shapes years of work: a platform that must serve several brands, a light and dark theme, a high-contrast mode, and per-tenant branding needs a semantic token layer clean enough that a theme is just a different set of values. Balance that flexibility against over-abstraction, since a token tree nobody can navigate is its own failure. Bring the roadmap of brands and tenants you can foresee, the count of themes in play today, and any components that already leak brand-specific logic. In enterprise and government contexts mergers, acquisitions, and agency reorganisations routinely add brands you did not plan for, so architecting for multi-brand from the start is the difference between a data change and a multi-year rewrite.
How will we migrate legacy and vendor-built applications onto the system, and how is the design-system team funded so it survives the next budget cycle? A design system only delivers its return when real products adopt it, yet the hardest applications to convert are the old and the outsourced ones that need it most, and the team that maintains the system is often the first cut when budgets tighten. For a large organisation you have to decide between a big-bang migration and an incremental one, and how to get vendors to build on your components rather than around them. Bring an inventory of applications with their current parity score, an estimate of migration effort per application, and the contractual levers you hold over vendors. In enterprise and government settings, write design-system conformance into procurement terms so new vendor work lands on the system by default, and fund the maintaining team as durable shared infrastructure, because a system that loses its stewards in a reorganisation drifts back into fragmentation within a year.
Sector lens
Startup. With two or three engineers and no runway to spare, do not build a governed system. Spend a day or two defining a small set of semantic tokens for colour, spacing, and type, plus a dozen shared components, all in one file the whole team references. Lean on an off-the-shelf primitive library for the hard parts, and keep nothing hard-coded so your first real rebrand is a token change rather than a rewrite.
Small business. With no dedicated designer and a tight budget, buy rather than build: adopt a proven component library or UI kit and theme it lightly to your brand. Your goal is a consistent, accessible product without staffing a design-system team, so favour a system that ships accessibility and responsiveness in the box. Resist the urge to fork it, because a customised copy you cannot maintain becomes a liability the moment the upstream project moves on.
Enterprise. The problem is coherence across many teams and long-lived products, so treat the design system as governed shared infrastructure with a dedicated team, versioning, and a roadmap. Track design-code parity as a real metric, wire visual regression testing into CI, and architect the token layer for multiple brands and themes from the start. Budget the governance and migration cost explicitly, and manage adoption as a portfolio rather than assuming teams will drift onto the system on their own.
Government. Procurement rules, transparency, and public accountability shape every choice. Accessibility conformance to standards such as WCAG, Section 508, and EN 301 549 is a legal requirement, not a preference, so a component library with documented conformance becomes a compliance asset. Favour or extend a shared public design system so citizens meet the same patterns across services, write design-system use into vendor contracts, and publish your components and guidance openly so agencies and their suppliers can adopt them and be held to them.
Examples
Startup. A two-engineer startup kept rebuilding buttons and form fields slightly differently on every new screen, and the product was starting to look stitched together. Instead of a heavyweight system, they spent two days defining a small set of semantic design tokens for colour, spacing, and type, plus about a dozen shared components, all in one file the whole team referenced. Because nothing was hard-coded, when their first design-minded hire proposed a cleaner palette, the refresh was a token change that landed across the app in an afternoon rather than a screen-by-screen slog.
Enterprise. A global software company with dozens of product teams built a tokenised design system with a shared coded component library. Semantic tokens let them ship a full brand refresh across all products in weeks, instead of a multi-year per-team slog, because the change was a new token set rather than thousands of hard-coded colour edits. Design-code parity, tracked as a dashboard metric, rose as teams replaced bespoke components, which cut duplicated UI maintenance.
Government. A national government created a common design system for public services (shared components, patterns, and accessibility built in) mandated across agencies. A citizen moving between a tax service, a health service, and a licensing service meets the same header, form controls, and error patterns, which builds trust and shortens the learning curve. Agencies and their vendors ship faster and more accessibly because the hard problems are solved centrally, and the government can update guidance or accessibility fixes once and have them propagate everywhere.
Business case: motivations, ROI, and TCO
The ROI of a design system comes from removing duplication and speeding up delivery. Instead of every team designing and building the same components, they compose from a shared library, which measurably speeds up delivery and frees designers and engineers for product-specific work. Accessibility and responsiveness, solved once in components, save you the per-project remediation cost. Rebrands and theming that once took years now take weeks.
On TCO, the adoption cost is a dedicated team, tooling, and the effort for existing products to migrate onto the system. The cost of not adopting is paid continuously: duplicated build and maintenance across teams, inconsistent and inaccessible UIs that create support and legal risk, and slow, expensive rebrands. Because the duplication is spread across many teams’ budgets, it is easy to overlook: a design system makes that hidden cost visible and captures it in one place.
To make the case to leadership, quantify the duplicated component work across teams, the time-to-market gain from composition, and the cost and duration of your last rebrand versus what a tokenised system would allow. Frame the system as shared infrastructure with a measurable adoption metric (parity percentage), so its value can be tracked over time rather than just asserted.
Anti-patterns and pitfalls
- Design system as a sticker sheet: a static design file with no coded components, so engineers rebuild everything anyway.
- Hard-coded values everywhere: colours and spacing scattered through code, making theming and rebrands impossible.
- No governance: the system fragments as teams add divergent variants; consistency erodes.
- Governance without contribution: the central team becomes a bottleneck and teams route around it.
- Ignoring parity: the coded UI drifts from the design intent and no one measures the gap.
- Over-abstraction: so many tokens and layers that no one can find or use the right one.
- Brand logic baked into components: makes multi-brand and theming a code rewrite instead of a config change.
- Breaking changes without migration support: consuming teams stall or fork the system.
Maturity model
Level 1: Initiate. Each team builds its own UI ad hoc and reactively. No shared components, inconsistent look and behaviour, colours and spacing hard-coded per screen. Every rebrand is a manual screen-by-screen slog.
Level 2: Develop. A shared style guide or component library exists but is partial, optional, and often out of sync between design and code. Some teams use it, others do not, and basic practices vary widely from team to team.
Level 3: Standardise. A tokenised design system with a maintained coded library, documentation, and governance is documented and enforced across the whole organisation. Components consume semantic tokens, theming is supported, and accessibility and responsiveness are built in rather than bolted on per screen.
Level 4: Manage. The system is measured and controlled with data against baselines. Design-code parity is tracked as an explicit metric with targets per product, visual regression testing runs in CI to catch drift, and accessibility conformance is measured against standards rather than assumed. Adoption dashboards show component coverage by team, and the cost and duration of rebrands are recorded so improvement is visible over time.
Level 5: Orchestrate. The design system is a continuously improving product integrated across the organisation and adaptive to change. It has versioning, a roadmap, and a working contribution model, so it evolves with real needs. Rebrands and new themes are routine token changes, multi-brand and multi-tenant theming is normal, and the team retires, re-scopes, and promotes patterns on evidence from usage data, feeding design tooling and delivery pipelines from a single source of truth.
Ideas for discussion
- How do you balance central governance against team autonomy without either fragmenting or bottlenecking?
- What is the right metric for “design-code parity,” and how do you keep it honest?
- When should a team be allowed to build a one-off component instead of using the system?
- How do you fund and staff a design system so it survives budget cycles and reorganisations?
- How much theming flexibility is worth the added abstraction cost?
- How do you migrate legacy and vendor-built applications onto a shared system?
Key takeaways
- A design system turns one-time design decisions into reusable, governed capital.
- Structure it in layers (tokens, components, patterns), with components consuming semantic tokens.
- Build accessibility and responsiveness into components so every team inherits them.
- Treat design-code parity as a measurable health metric, not an assumption.
- Tokenisation makes rebrands and multi-brand theming a data change, not a rewrite.
- Govern the system as a product with a roadmap, versioning, and a contribution model.
- At enterprise and government scale, a shared system is the highest-leverage UI investment available.
References and further reading
- Brad Frost, Atomic Design
- Alla Kholmatova, Design Systems: A Practical Guide to Creating Design Languages
- Josef Müller-Brockmann, Grid Systems in Graphic Design
- Robert Bringhurst, The Elements of Typographic Style
- Ellen Lupton, Thinking with Type
- Luke Wroblewski, Mobile First
- Ethan Marcotte, Responsive Web Design
- Nathan Curtis, writings on design tokens and design system governance
- W3C Design Tokens Community Group, format specification
- Government design systems (e.g., UK Government Design System, U.S. Web Design System) as reference implementations