Key takeaways
- A design system is a single source of truth for how your product looks and behaves, shared by design and engineering.
- Start with foundations — colour roles, spacing, type and motion — before building a single component.
- Build components in layers (primitives, components, patterns) so each depends only on the layer below.
- Treat the system as a product: give it an owner, a contribution process, versions and usage data.
On this page
As product teams grow, inconsistency creeps in. Two developers interpret the same design in slightly different ways. Designers recreate a component that already exists in another file. Buttons drift into five shades of the same colour.
None of it looks dramatic on its own. Together, it makes a product feel less trustworthy — and makes every new feature slower to design, build and review. A design system fixes this at the source.
What a design system actually is
A design system is a single source of truth for how your product looks and behaves. It usually includes:
- Foundations — colour, typography, spacing, radius, elevation and motion, stored as design tokens.
- Components — buttons, inputs, cards, menus, modals and the rest, in design and in code.
- Patterns — tried-and-tested combinations, like forms, empty states and navigation.
- Guidelines — when to use what, with examples of doing it right and wrong.
The key word is shared. A design system lives in design files and in code, so what designers draw is what developers ship.
Start with foundations
Before you build a single component, get the foundations right. These decisions compound — get them wrong early and you'll pay for it in every review for years; get them right and the rest flows naturally.
Colour by role, not by value
Don't stop at a palette of hex codes. Define semantic roles — primary, surface, text, muted text, border, success, warning, danger — and map your colours to them. Components then use roles ("surface"), not raw colours ("#FFFFFF"), which makes dark mode and rebrands far easier.
A spacing scale
Pick a base unit — a 4px or 8px grid is a reliable choice — and a short scale of steps. Consistent spacing is the invisible backbone of every polished interface.
A type ramp
Define a small set of text styles — display, headings, body, small, caption — with sizes, weights and line heights for each, and how they adapt on mobile.
Motion
Agree on a few durations and easing curves. Consistent motion makes a product feel calm and intentional.
Build components in layers
Structure your components so each layer depends only on the layer below it:
- Primitives — the building blocks: box, text, icon, stack.
- Components — built from primitives: button, input, badge, card.
- Patterns — built from components: a sign-up form, a pricing table, a page header.
This keeps components small, predictable and easy to change. When a primitive improves, everything built on it improves too.
Give every component a clear set of variants (primary, secondary, ghost), sizes and states — default, hover, focus, active, disabled, loading and error. Missing states are where inconsistency sneaks back in.
Document where people work
The best documentation sits right next to the component — in your design tool and in your component library (Storybook or similar) — not in a separate document nobody opens. For each component, show:
- What it's for, and when not to use it.
- Live examples of each variant and state.
- Accessibility notes: keyboard behaviour, labels and contrast.
- Code snippets that can be copied as they are.
Proximity drives adoption. If the right way is the easiest way, people will use it.
Build accessibility in from the start
A design system is the most efficient place to get accessibility right, because every fix ships to every screen at once. Check colour contrast on your colour roles, make focus states visible, size touch targets generously and give every interactive component the right labels and keyboard behaviour.
Keep it alive
A design system is a product, not a one-off deliverable. To stop it going stale:
- Give it an owner. Someone needs to be responsible for its quality and direction.
- Create a contribution process so teams can propose new components or changes without breaking stability.
- Version it like any other package, with release notes.
- Measure usage. If a component exists but nobody uses it, find out why — usually it's a documentation gap or an API that doesn't match how people actually build.
Where to start this month
You don't need a 200-page system on day one. A practical first step:
- Audit your product: screenshot every button, input and card you have.
- Define colour roles, a spacing scale and a type ramp.
- Build the 15–20 components you use most, with all their states.
- Document them where your team works.
- Replace old one-off components as you touch each screen.
If you'd like help auditing your product or building a design system your team will actually use, book a free 30-minute call with our design team.