Design System Roadmap
A design system is the shared set of principles, tokens, components and rules that lets many people build a consistent, accessible product. Front-end engineers, product designers and engineering managers meet them in most mid-size and large companies, and building or extending one is a common senior task.
This roadmap follows the order in which real systems grow: why you need one, how to audit what exists and set a direction, then the visual foundations and tokens, the first components, documentation, engineering practice, and finally governance, adoption and measurement. Each topic has a short explanation and an exercise. Core topics are expected in interviews, recommended topics are common in practice, and optional topics can wait.
By the end you can plan a system, build and document accessible components, release them safely and show that they are working. Practise in system design practice and track your progress in progress page.
- Level
- Beginner to advanced
- Time
- 10-14 weeks at about 8 hours a week, less if you already build front-end interfaces
- Scope
- 66 topics in 8 stages
- Before you start
- HTML Roadmap and CSS Roadmap fundamentals; Some component-based UI experience, for example React Roadmap; Basic familiarity with a design tool such as Figma; Git and GitHub Roadmap basics
What you will be able to do
- Explain what a design system is, how it differs from a component library and when a team needs one.
- Audit an existing interface and turn the findings into a vision, principles and a roadmap.
- Define design tokens for colour, type, spacing and themes with a clear naming scheme.
- Build accessible core components with all their states and document how to use them.
- Write usage, content and microcopy guidance that teams follow.
- Test, version and release the system with semantic versioning and a clear policy.
- Set up governance and contribution so the system does not stall or fragment.
- Measure adoption and health and present results to stakeholders.
The roadmap at a glance
- Stage 1Foundations and the Case for a Design SystemBeginner · 1 week · 8 topics
- Stage 2Starting a System: Audit, Vision and PlanBeginner · 1-2 weeks · 10 topics
- Stage 3Visual Foundations and TokensIntermediate · 2 weeks · 8 topics
- Stage 4Core Components: Actions, Inputs and FormsIntermediate · 2 weeks · 7 topics
- Stage 5Feedback, Navigation and Content ComponentsIntermediate · 2 weeks · 10 topics
- Stage 6Patterns, Content and DocumentationIntermediate · 1-2 weeks · 8 topics
- Stage 7Tooling, Engineering and QualityAdvanced · 2-3 weeks · 7 topics
- Stage 8Governance, Adoption and MeasurementAdvanced · 2 weeks · 8 topics
Stage 1 Foundations and the Case for a Design System
Goal. Explain what a design system is, why teams build one and who takes part.
What is Design System Core
A design system is a shared set of decisions, parts and rules that lets many people build a consistent product. It has three layers that depend on each other: the principles and visual language that say how the product should look and sound, reusable design and code components that implement them, and documentation and process that explain how to use and change them.
A system is more than a pile of buttons. A pattern library without guidance, ownership and a way to change it goes out of date quickly. The point is that a decision made once, such as the focus ring on inputs, is applied everywhere.
Practice. Write a three-sentence definition of a design system for a colleague who has never heard the term.
Design System Basics Core
The basic parts are design tokens (named values for colour, spacing and type), components (buttons, inputs, dialogs), patterns (how components combine for tasks such as signing in), guidelines (when and why to use each), and tooling that delivers all of it to designers and developers.
Think of the parts as layers. Tokens sit at the bottom and change rarely. Components use tokens. Patterns use components. Pages use patterns. Changing a token ripples upwards, which is both the power and the risk.
Practice. Pick one screen from any product and label which parts are tokens, components and patterns.
Terminology Core
Learn the vocabulary because meetings depend on it. A component is a reusable interface part. A variant is a version of it, such as a destructive button. A state is a condition, such as hover, focus or disabled. A prop is a setting a developer passes in. A token is a named value. A pattern solves a recurring task. A primitive is a low-level building block without styling decisions.
Teams often use the words keywords such as deprecated and stable to describe maturity. Agree on these words and publish a glossary so designers and engineers mean the same thing.
Practice. Create a glossary of ten terms with an example from a real interface for each.
Need of design system Core
Teams reach for a system when they see the same problems: five slightly different blue buttons, inconsistent spacing, repeated work rebuilding a modal, accessibility fixed in one place and missed in another, and slow onboarding for new people. A system cuts duplicate work, raises quality and lets product teams spend time on real problems.
It is not free. A small team with one product may be better served by a shared style file. Estimate the cost of maintenance against the savings before you commit, and be honest in that case.
Practice. Count the distinct button styles in a real product and estimate the time spent rebuilding them.
Design System vs Component Library Core
A component library is code: packaged components in one framework. A design system is the larger whole: principles, design files, tokens, guidance, governance and usually a component library as one output. You can have a library without a system, which is common, and the result is consistent code but inconsistent decisions.
Related terms are UI kit, a set of design-tool assets for mock-ups, and style guide, a document of visual rules. A kit is for designers, a library for developers, and the system joins them.
Practice. Sort five open or public artefacts you know into: style guide, UI kit, component library, full system.
Design System Examples Recommended
Studying mature public systems teaches structure. Material Design from Google, Carbon from IBM, Polaris from Shopify, Atlassian Design System, GOV.UK Design System and Primer from GitHub all publish principles, tokens, components and usage guidance. They differ in focus: government systems stress accessibility and plain language, product systems stress density and speed.
Do not copy a system whole. Notice how each documents a component: purpose, anatomy, variants, states, behaviour, accessibility notes and code. That template is worth borrowing.
Practice. Compare how two public systems document their button and list the sections both include.
Atomic Design Recommended
Atomic design is a mental model that names the levels of composition. Atoms are the smallest parts, such as a label or input. Molecules combine atoms, such as a labelled field. Organisms are larger sections, such as a header. Templates arrange them into layouts and pages fill templates with real content.
It is a teaching aid, not a rule. Real teams often disagree about whether something is a molecule or an organism, and that argument is not useful. Use the levels to talk about composition and to decide what belongs in the system.
Practice. Break a checkout page into atoms, molecules and organisms in a diagram.
Stakeholders Involved in Building Core
A system touches many people. Designers define the language, front-end engineers build components, product managers prioritise work, accessibility specialists review, content designers write guidance, and engineering leadership funds the effort. Product teams are the customers, and their feedback decides whether the system lives.
Name a core team with clear ownership, and a wider group of contributors. Without an owner and a budget the system becomes a side project that fades. Early on, get an executive sponsor who understands the long-term return.
Practice. Write a one-page responsibility chart saying who decides, who builds and who is consulted for a new component.
Stage 2 Starting a System: Audit, Vision and Plan
Goal. Take stock of an existing product, set direction and plan a first release.
Making a Design System Core
There are two starting points. From scratch means you define the language and components deliberately, which suits a new product or a rebrand. From existing design means you extract the system from a live product, which suits most real teams: you consolidate what exists, remove duplicates and fix the worst inconsistencies.
Starting from existing work is faster and easier to sell, because it proves value on screens people already know. Starting from scratch gives cleaner results but needs more time before anyone benefits.
Practice. Decide which route fits a product you know and write down the reasons.
Identify Existing Design Process Core
Before changing anything, learn how design and development work today. How are designs handed over? Where do components live? Who approves changes? How do teams share files? Which tools are in use? Interview designers and developers and map the process on a single page.
A system must fit the way people work or they will route around it. This step also finds friction that the system can remove, which becomes your first success story.
Practice. Interview two colleagues about how a new screen goes from idea to production and draw the flow.
Existing Design Analysis Core
Analysis looks at the products themselves. Collect screens across products and platforms, list components in use, find duplicated patterns and note where code and design differ. Group similar items and count them to show the scale of the problem.
Pair this with data about people: support tickets about confusing screens, accessibility reports and development time spent on UI rework. Numbers turn opinion into a case.
Practice. Create a spreadsheet inventory of all form fields across three screens, with their sizes and styles.
Performing a Visual Audit Core
A visual audit is a systematic inventory of the interface. Take screenshots and record every colour, font size, spacing value, border radius, shadow and icon style. Counting usually exposes dozens of near-identical greys and many type sizes.
Tools can extract computed styles from a live site, and an interface inventory board in a design file lets you place similar items side by side. Present the findings plainly: "we use 37 colours where 12 would do".
Practice. Audit one page and list how many distinct colours, font sizes and spacing values it uses.
Vision Core
A vision states what the system is for and what success looks like, in a sentence a stakeholder can repeat: for example, any team can ship an accessible, on-brand screen without custom design work. It should be specific enough to say no to work that does not serve it.
Back the vision with a few measurable goals, such as the share of screens using system components, or the time taken to build a standard page.
Practice. Draft a vision sentence and three measurable goals for a system at a company you know.
Design Principles Core
Principles are short rules that guide decisions when no guideline fits. Good ones are specific and sometimes uncomfortable: "clarity over cleverness", "accessible by default", "show less, reveal on demand". A vague principle such as "be simple" helps nobody.
Test each by asking whether a reasonable team could pick the opposite. If not, it is not a real principle. Use them in design critiques to resolve arguments.
Practice. Write four principles and an example decision that each one would settle.
Design Language Recommended
The design language is the visual and verbal character of the product: how it uses colour, shape, motion, imagery, layout and voice. It makes the product recognisable and sets the mood. Decide whether corners are sharp or round, how much white space there is, how motion feels and how formal the tone is.
It sits between brand identity and components. Brand gives it personality, and the language turns that into concrete, repeatable choices that tokens and components then encode.
Practice. Describe the design language of a product you like in five adjectives, backed by visible examples.
Roadmap Core
A roadmap sequences the work: foundations first (tokens, colour, type, spacing), then the most-used components (button, input, select, modal), then patterns and documentation. Order by usage and pain, not by what is interesting to build.
Share it openly and revise it. A public roadmap lets product teams plan around you and tells them where to request features. Keep the next quarter specific and the rest rough.
Practice. Draft a six-month roadmap and rank items by how many teams would use them.
Milestones Recommended
Milestones turn the roadmap into checkpoints, for example: tokens published, the first ten components released, the first product migrated, accessibility audit complete. Each should have a visible outcome and a date.
Celebrate them in public. Visible progress builds trust and keeps funding. Do not promise broad coverage in the first milestone, which is how systems miss deadlines.
Practice. Define four milestones for the first year, each with a measurable result.
Pilot Core
A pilot tests the system in one real product with a willing team before wide release. Choose a team with a real deadline and a mix of simple and awkward screens. Support them closely, record friction and fix what you learn.
The pilot proves the components work in production, produces a case study, and exposes missing components and unclear docs. Expect it to change your plans, and treat that as a success.
Practice. Plan a pilot: pick a team, scope the screens and list the questions you want answered.
Stage 3 Visual Foundations and Tokens
Goal. Define tokens for colour, type, spacing and layout, and make them accessible and themeable.
Design Tokens and Naming Core
A design token is a named value for a design decision, stored in a format that tools can read. Instead of using #0b5fff in forty places, you reference color.action.primary. Change the token and every use updates, in design files and in code.
{
"color": {
"action": { "primary": { "value": "{color.blue.600}" } }
},
"space": { "md": { "value": "16px" } }
}A build step such as Style Dictionary can turn one source into CSS variables, native platform values and design-tool variables. The Design Tokens Community Group format is a shared standard for this file.
Token and Naming. Each token needs a name, and naming is the hard part. Use layers. Primitive tokens name raw values (blue-600). Semantic tokens name purpose (color-text-danger) and point to primitives. Component tokens are specific to one part (button-padding-x).
Practice. Define ten tokens in a JSON file and generate a CSS custom properties file from it.
Color Core
Colour starts with a palette: a few brand hues, neutrals, and a scale of lightness steps for each so you can choose accessible pairings. Build scales that are perceptually even and check each pair of text and background for contrast.
Keep the palette small. Every extra colour is something to document, test and maintain. Express colours as tokens, never as raw values in components.
Color Guidelines. Colour guidelines say how to use the palette: which colours are for actions, which for text, what share of the screen the brand colour should take, and which pairs are allowed. Include contrast ratios and examples of good and bad use.
Functional Colors. Functional colours carry meaning: success, warning, danger, information, and states such as selected, disabled and focus. They are semantic tokens, so color-feedback-success can point to a different green in dark mode.
Practice. Build a nine-step scale for one hue and mark the steps that pass contrast against white.
Typography Core
Typography defines font families, a type scale, weights, line heights and letter spacing. Use a modular scale such as 12, 14, 16, 20, 24, 32, so steps feel related, and define named styles such as heading-1, body and caption.
Limit families to one or two, load them efficiently and provide a fallback stack. Specify responsive behaviour: headings usually shrink on small screens. Store the styles as tokens or composite tokens.
Readability. Readability depends on size, contrast, line length and line height. Body text of 16 pixels or more, line height around 1.4 to 1.6, and lines of about 45 to 75 characters suit most reading. Avoid long blocks in capitals and thin weights on small text.
Practice. Define a type scale with eight named styles and apply it to a sample article page.
Units, Sizes and Sizing Recommended
Choose units on purpose. rem scales with the user's root font size and suits type and spacing. px suits borders and hairlines. em scales with the parent and suits component-internal spacing. Percentages and viewport units suit fluid layout, and unitless values suit line height.
Document the choice and keep tokens in one unit family. Mixed units are a common source of off-by-one visual bugs and accessibility failures when text is resized.
Sizes and Sizing. Define sizes for interactive parts in a small set: for example small, medium and large for buttons and inputs, each with fixed height, padding and font size. Consistent heights let a button and an input line up in a row.
Practice. Convert a pixel-based spacing scale to rem and verify it at two root font sizes.
Spacing Core
A spacing scale gives every gap a named value: 4, 8, 12, 16, 24, 32, 48 pixels or similar, based on a common unit such as 4 or 8. Use it for padding, margins and gaps so layouts feel rhythmic.
Offer guidance on which spacing to use between related items versus separate sections. Prefer gap in flex and grid layouts to margins on children, because it composes better and avoids edge cases.
Grid and Grid Relation. A grid sets columns, gutters and margins to align content across a page. Twelve columns is common because it divides into halves, thirds and quarters. Modern CSS Grid and Flexbox can implement it with few lines, and you can also use container queries to let components respond to their own space.
Practice. Replace arbitrary margins on a page with values from a spacing scale.
Breakpoints and Responsiveness Core
Breakpoints are widths at which the layout changes. Use a short list, such as 480, 768, 1024 and 1280 pixels, named by device class, and write media queries mobile first. Choose breakpoints where your content breaks, not for specific phones.
Responsiveness also covers images, touch targets, navigation patterns and behaviour in components. Components should adapt to their container and be tested at each breakpoint and across orientation changes.
Practice. Make a navigation component that switches between a bar and a menu at a chosen breakpoint.
Icon and Icons Recommended
Icons support recognition but rarely replace words. Draw them on a shared grid with consistent stroke, corner and optical size, and deliver as SVG using currentColor so they inherit text colour. Offer a limited set and a process for requests.
Decorative icons need empty alt text or aria-hidden. Icon-only buttons need an accessible label. Reserved icons are those whose meaning is fixed across the product, such as a trash can for delete or a cross for close; do not reuse them for other purposes.
Logo File Formats. Provide the logo in the formats teams need: SVG for web and scalable use, PNG for places that need raster images, and PDF or EPS for print. Include light and dark backgrounds, a monochrome version for single-colour printing, and a small mark for favicons and avatars.
Practice. Build an icon button with an accessible name and test it with a screen reader.
Dark Mode Recommended
Dark mode is not inverting colours. Define a second set of semantic token values so surfaces become dark, text stays readable and elevation is shown with lighter surfaces rather than shadows. Respect the system setting through prefers-color-scheme and let users override it.
:root { --surface: #ffffff; --text: #1a1a1a; }
@media (prefers-color-scheme: dark) {
:root { --surface: #14171c; --text: #ececec; }
}Check contrast again, desaturate bright colours and review images and illustrations. Theming through semantic tokens makes this a configuration change rather than a rewrite.
Practice. Add a dark theme to a small component set using only token overrides.
Stage 4 Core Components: Actions, Inputs and Forms
Goal. Design and build the accessible controls that most products use daily.
Component Core
A good component has a clear purpose, a small, typed interface, all its states built in, and accessibility handled inside it. Its anatomy is documented: the parts it is made of, the variants, and what is configurable. It does not own page layout or business logic.
Decide between composition and configuration. A card with slots for header and footer composes well; a card with thirty boolean props does not. Prefer a few well-chosen props and children over many switches.
Practice. Design the prop interface for a card component and remove any prop that can be handled by composition.
Core Components Core
Core components are those nearly every screen uses: button, link, text input, select, checkbox, radio, switch, modal, tooltip and a layout set. Build them first, since they deliver value to every team and test your tokens and process.
For each, define states: default, hover, focus, active, disabled, loading and error. Missing states are the main reason product teams build their own variant.
Practice. Make a matrix of states for a text input and check that all of them exist in the design file and the code.
Button and Buttons Core
The button is the most used component. Define a hierarchy: primary (one per view), secondary, tertiary or ghost, and destructive. Offer sizes, an optional icon and a loading state. Use a real button element for actions and a link for navigation.
<button type="button" class="btn btn--primary" disabled>Save</button>Labels start with a verb and say what happens. Keep focus styles visible. Disabled buttons give no feedback, so consider explaining why an action is unavailable instead.
Practice. Build a button with three variants and a loading state, and check keyboard operation.
Input Text and Textarea Core
A text input needs a visible label, optional hint, error message, and states for focus, disabled, read-only and invalid. Associate the label with the input and connect the error through aria-describedby. Choose the right type and autocomplete values so mobile keyboards and password managers help.
The textarea follows the same rules and adds a resize policy and an optional character counter. Do not use placeholders as labels, because they disappear and have poor contrast.
Practice. Build a text field component with label, hint and error and test it with a screen reader.
Input Checkbox, Input Radio and Input Switch Core
A checkbox allows zero or more choices and can have an indeterminate state. A radio group allows exactly one choice from a visible set. A switch changes a setting immediately, like a light switch, while a checkbox usually waits for a submit action.
Use native inputs and style them rather than rebuilding with divs. Make the whole label clickable, group related controls in a fieldset with a legend, and ensure the checked state is not conveyed by colour alone.
Practice. Build the three controls with native inputs and verify they work with keyboard only.
Select and Dropdowns Core
A select picks from a list. The native element is accessible and works well on mobile; use it unless you need search, multi-select with tags or rich options. A custom dropdown or combobox must implement the full pattern: roles, arrow-key navigation, type-ahead, escape to close and correct focus handling.
Do not build this casually. Many custom dropdowns fail screen readers. Consider a headless library that provides accessible behaviour while you supply styling.
Practice. Compare a native select with a custom combobox on a screen reader and list the gaps.
Forms and Visual Forms Core
Forms combine fields, validation and submission. Define layout rules: single column by default, labels above fields, grouped sections, and primary action at the end. Validate on blur or submit rather than on every keystroke, explain errors in plain words next to the field, and summarise them at the top for long forms.
Visual forms covers the look of these rules: spacing between fields, alignment, required markers and error styling. Keep forms short, mark optional rather than required fields where most are required, and never clear user input on error.
Practice. Build a sign-up form with inline errors and an error summary, and test it with the keyboard.
Stage 5 Feedback, Navigation and Content Components
Goal. Build the components that inform, group and guide people through an interface.
Modal Core
A modal interrupts the user to ask for a decision or input, so use it sparingly. It must trap focus, move focus into the dialog on open, return focus to the trigger on close, close on Escape, and block the content behind it. The native dialog element now handles much of this.
<dialog id="confirm">
<h2>Delete project?</h2>
<button>Cancel</button> <button>Delete</button>
</dialog>Give it a title and describe its purpose to assistive technology. Avoid modals for long tasks, and avoid stacking one on another.
Practice. Build a confirmation dialog and check focus movement with the keyboard.
Toast Core
A toast is a brief message that appears after an action, such as "Saved". It must be announced to screen readers using a live region, stay long enough to read, be dismissible, and never be the only place for critical information or actions.
Avoid toasts for errors that need action, and avoid stacking many. Pause the timer on hover and focus. Provide a position that does not hide important controls.
Practice. Build a toast with an aria-live region and a dismiss button.
Tooltip Recommended
A tooltip shows short, non-essential help on hover and keyboard focus. It must not hold interactive content, must be dismissible with Escape, and should remain visible while the pointer moves over it. Do not put needed information in tooltips; touch users cannot hover.
Link the tooltip to its trigger with aria-describedby. If you need links or buttons inside, use a popover instead.
Practice. Add a tooltip to an icon button and test it on touch and with the keyboard.
Tabs Core
Tabs split related content into panels where one is visible at a time. Implement the tabs pattern: a tablist with tab and tabpanel roles, arrow keys to move between tabs, and a clear selected state. Tabs switch views of the same page, while navigation links go elsewhere.
Keep labels short and few; if the labels need wrapping or scrolling, use another pattern. Make sure the selected tab is not shown by colour alone.
Practice. Build a tab set with arrow-key support and automatic or manual activation.
Card and Cards Recommended
A card groups related information about one subject, such as a product or an article, and often links to detail. Keep structure consistent: media, title, supporting text, actions. Make the whole card clickable only through one primary link to avoid confusing focus order.
Cards in a grid should align and handle uneven content with sensible truncation. Avoid putting too many actions inside one.
Practice. Build a card with an image, title and one link whose click area covers the whole card.
Badge, Banner and Avatar Recommended
A badge is a small label or count, such as "New" or a notification number. A banner shows page-level or system-level messages, such as maintenance, with a type, optional action and dismiss control. An avatar shows a person or entity as an image or initials, with sizes and a fallback.
Do not rely on colour alone for badges, give images meaningful alt text or hide purely decorative avatars, and announce important banners with a suitable role.
Practice. Build the three components and decide which tokens each one uses.
List Recommended
Lists present items of the same kind in a column. Use real ul, ol or dl markup so assistive technology reports the number of items. Define variants: plain, divided, selectable and with actions or avatars.
For long lists add paging, infinite scroll with care, or virtualisation. Interactive rows need a clear focus state and a single predictable way to activate them.
Practice. Build a selectable list with keyboard support and a visible focus ring.
Loading Indicator Recommended
A loading indicator tells people that work is in progress. Use a spinner for short, unknown waits, a progress bar when you know the percentage, and a skeleton screen when the shape of the content is known. Announce the state to assistive technology and avoid flashing for very quick loads by delaying display slightly.
Do not block the whole page when only a part is loading. Offer cancel or retry on long operations.
Practice. Build a skeleton for a card list and a delayed spinner that appears only after 300 milliseconds.
Carousel Optional
Carousels rotate content horizontally. They often hide content from users and have poor interaction rates, so use them only when necessary. If you must, avoid autoplay, provide visible previous and next controls, indicators, keyboard access and a way to pause.
Check that each slide is reachable by assistive technology and that swipe gestures have button alternatives.
Practice. Build a carousel without autoplay and list the accessibility checks it passes.
Other Components Optional
Beyond the common set, systems add breadcrumbs, pagination, accordions, date pickers, data tables, steppers, menus and empty states. Build them when real demand appears, not on a guess.
Apply a request process: ask how many teams need it, whether an existing component could be extended, and who will own it. Complex components such as date pickers and data tables are costly to make accessible, so consider adopting a well-tested open source base.
Practice. Write a request template that a team fills in to propose a new component.
Stage 6 Patterns, Content and Documentation
Goal. Write guidance and documentation that teams actually use.
Pattern Core
A pattern is a tested solution to a recurring task that combines components, for example sign-in, search with filters, empty states or error recovery. It includes the layout, the content, the states and the behaviour over time.
Patterns are where consistency matters most for users, because people experience tasks and not components. Document the problem, the solution, when to use it and when not to.
Practice. Document an empty-state pattern with three examples and the cases where it should not be used.
Usage Guidance Core
Usage guidance tells people when to choose a component, when not to, and what to use instead. Pair do and do-not examples with a one-line reason. Include behaviour, content rules and accessibility notes alongside visuals.
Good guidance saves support questions. Write it as an answer to "should I use this?" rather than as a description of what the component looks like.
Practice. Write do and do-not guidance for the button, with three examples of each.
Placement Guidance and Small Use Guidance Recommended
Placement guidance says where components belong: primary action on the right in dialogs, navigation on the left for desktop, alerts at the top of the content they refer to. It prevents inconsistent layouts of the same task.
Small use guidance covers constrained space, such as mobile screens, dense tables or narrow side panels: which variants shrink, what to truncate and what to hide. Test components at small sizes before releasing them.
Practice. List placement rules for five components and check them against existing screens.
Tone of Voice and Writing Guidelines Recommended
Tone of voice describes how the product sounds: friendly but not casual, direct, calm in errors. Writing guidelines turn that into rules: sentence case for headings, verbs on buttons, plain words, active voice, and consistent names for things.
Offer word lists, capitalisation rules and examples of before and after. Have a content designer review common messages so that voice is consistent from sign-up to support emails.
Practice. Rewrite five unclear interface messages following a short set of writing rules.
Microcopy Guidelines Recommended
Microcopy is the small text in the interface: button labels, field hints, empty states, confirmations and error messages. It guides people at the moment of decision, so it deserves its own guidelines.
A good error says what happened, why and what to do next, without blame: "We could not save your changes. Check your connection and try again". Avoid jargon, avoid exclamation marks, and leave room for translation, since many languages are longer than English.
Practice. Write microcopy for a failed payment, covering the message, the button and a hint.
Regional Requirements Recommended
Products used in several countries must handle regional needs: languages and scripts, right-to-left layout, date, time and number formats, currencies, address and name formats, legal text, and accessibility laws such as the European Accessibility Act. Components should use logical CSS properties like margin-inline-start to support right-to-left.
Plan for text expansion in translation, avoid text in images, and test with real content in each language. Include regional rules in the guidance.
Practice. Switch a component to right-to-left and fix everything that breaks.
Documentation Core
Documentation is the product that most people see. For each component provide: purpose, a live example, anatomy, variants and props, states, accessibility notes, content rules, do and do-not guidance, and a changelog. Also write getting-started and migration guides.
A component catalog, often built with Storybook or a docs site, shows each component in isolation with controls. Keep docs next to code so they change together, and treat missing documentation as a bug.
Practice. Document one component with all the sections above and ask a colleague to use it without help.
Guidelines Core
Guidelines are the rules and advice that sit beside components: accessibility requirements, content style, layout, motion and contribution rules. They make decisions repeatable.
Keep them short, searchable and concrete. A long guideline nobody reads is worse than none. Link each to the principle behind it, so people can apply the idea to cases the guideline did not foresee.
Practice. Pick one guideline and rewrite it in under 100 words with an example.
Stage 7 Tooling, Engineering and Quality
Goal. Build, test, version and release the system as a product.
Tooling Core
Tooling spans design, code and delivery. For design: a shared library with variables and components. For code: a monorepo with a build tool, a package per framework target, Storybook for development, and a continuous integration pipeline. For delivery: a package registry and a documentation site.
Keep the toolchain small and stable. Each tool has an upgrade cost, and consumers will inherit your choices of framework, bundler and styling approach.
Design Editor and Plugins. The design editor, for example Figma, holds the design library: components with variants, variables for tokens, and shared styles. Structure the file so designers can find parts, and mirror the names used in code to ease handoff.
Practice. Set up a small monorepo with one package and Storybook and publish it to a local registry.
Component Library Core
The component library is the coded version of the system. Choose the implementation approach: native web components for framework independence, or a library per framework such as React. Style with tokens through CSS custom properties so teams can theme without forking.
Publish it as a versioned package with tree-shakable exports and types. Design the API for the long term: props are a contract and changing them costs every consumer.
Practice. Publish a package with two components that consume tokens through CSS custom properties.
Code Style Core
Code style rules keep contributions uniform: naming, file layout, prop conventions, CSS methodology and comments. Enforce them with linters and formatters so reviews focus on design and behaviour rather than formatting.
Document how a component folder looks, with the component, styles, tests, stories and docs together. A template generator makes the right structure the easy one.
Version Control. Keep tokens, code and docs in version control with a clear branching strategy, normally short-lived branches merged to a main branch. Require reviews and passing checks before merge. Design files need versioning too: tag library versions and keep a changelog that links design changes to code releases.
Practice. Create a script that scaffolds a new component folder with all expected files.
Unit Testing Core
Test components on three levels. Unit tests check behaviour and props with a tool such as Jest or Vitest and Testing Library. Visual regression tests compare screenshots to catch accidental style changes. Interaction tests in Storybook or Playwright check keyboard use and focus.
Test through the rendered output the way a user would, by role and label, not by class names. Run all tests in continuous integration, because every change to a shared component can break many products.
Accessibility Testing. Accessibility testing combines automated and manual checks. Automated tools such as axe find about a third of problems: missing labels, contrast failures and invalid roles. Manual checks cover keyboard operation, focus order, screen reader behaviour, zoom and reduced motion.
Practice. Write a test that opens a dialog, checks focus moves into it and confirms Escape closes it.
Accessibility Core
Accessibility is a built-in quality of every component. That means semantic HTML first, ARIA only where native elements fall short, visible focus, sufficient contrast, keyboard operation, accessible names and support for reduced motion and text resizing. The system is the best place to solve these once for every product.
Know the main standard, WCAG, and its four principles: perceivable, operable, understandable and reliable with assistive technology. Include accessibility notes and tests in each component definition, not as an extra phase.
Practice. Audit a component against the four WCAG principles and list fixes.
Performance Recommended
A slow library slows every product. Keep bundles small with tree-shaking and per-component imports, avoid heavy dependencies, keep CSS lean and load fonts and icons efficiently. Measure the size of each component and set budgets in continuous integration.
Check runtime cost too: avoid unnecessary re-renders, large animations and layout thrash. Publish performance notes for expensive components such as tables.
Logging. Logging in a design system means light signals that help maintainers: warnings for deprecated props and invalid combinations in development, and optional telemetry hooks that let a product report component errors. Do not collect personal data and do not log in production by default.
Practice. Measure the gzipped size of each export and fail the build when one grows beyond a budget.
Semantic Versioning Core
Semantic versioning uses three numbers, major.minor.patch. A patch fixes bugs without changing behaviour, a minor adds features compatibly, and a major breaks compatibility. For a design system, a breaking change includes a removed prop, a renamed token, and a visual change big enough to disrupt layouts.
Automate it with conventional commits and a release tool, publish a changelog, and give consumers a deprecation period with warnings before removal.
Release Strategy. Decide how and when releases happen: continuous releases of patches and minors, and scheduled majors with migration guides and codemods. Use pre-release channels such as next for early feedback, and keep a support policy that says how long older majors get fixes.
Practice. Classify ten changes as patch, minor or major and justify each one.
Stage 8 Governance, Adoption and Measurement
Goal. Run the system as a product with contribution, communication and metrics.
Governance Core
Governance defines who decides what goes into the system and how. Common models: a centralised core team owns everything, a federated model has contributors from product teams under shared rules, and a hybrid keeps the core in a central team while others add components through a review process.
Whatever the model, write down the decision rights, the intake and review process, the quality bar for acceptance and the rules for deprecation. Without governance, the system fragments or becomes a bottleneck.
Practice. Describe a governance model for a company with five product teams and justify the choice.
Contribution Guidelines Core
Contribution guidelines tell outsiders how to propose and add work: how to request a component, what research or evidence is needed, the definition of done (design, code, tests, accessibility, docs), and how long review takes. Keep it welcoming and give a checklist.
A clear route for contribution turns product teams from critics into co-owners, and stops the long queue of requests behind the core team.
Commit Guidelines and PR Templates. Commit guidelines standardise messages, for example the conventional commit form feat(button): add loading state, which allows automatic changelogs and version bumps. A pull request template asks for the description, screenshots, accessibility checks, a link to the design and a note on breaking changes.
Practice. Write a contribution guide with a definition of done and a worked example of a small contribution.
Communication Channel Recommended
Pick clear places for conversation: a chat channel for questions, an announcement channel for releases, and an issue tracker for requests and bugs. Respond quickly and publicly so other people can learn from answers.
Publish who is on rotation for support and what response times to expect. A silent system loses trust faster than a flawed one.
Community Meetings and Open Hours. Community meetings bring contributors together to share roadmap updates, demos and decisions. Open hours are regular drop-in sessions where anyone can ask questions or get help with adoption or contributions.
Practice. Set up a questions channel and answer the first five questions publicly with links to docs.
Ticketing and Project Management Recommended
Track work in an issue tracker with templates for bugs, component requests and documentation fixes. Use labels for component, severity and status, and keep a public board so requesters can see progress.
Project management means planning in cycles, balancing roadmap work against support, and limiting work in progress. Reserve capacity for bugs and requests so the team is not always firefighting.
Practice. Create issue templates for a bug and a component request and set up a board with four columns.
User Onboarding Recommended
Onboarding helps new designers and developers become productive: a getting-started guide, a sample project, a recorded walkthrough and a short checklist for the first week. Track how long a new person takes to ship their first screen with the system.
Make the first step trivial: one install command and a working example. Remove any steps people ask about repeatedly.
Practice. Ask someone new to follow your getting-started guide and fix every point where they hesitate.
Component Analytics and Tooling Analytics Recommended
Component analytics measure adoption: which components products use, how often, which versions, and how many custom replacements exist. Static analysis of repositories gives accurate counts, and design tools can report library usage and detached instances.
Tooling analytics look at the tools themselves: documentation site visits, search terms with no results, package downloads and time to build. Use the data to prioritise, not to judge teams.
Service and Health Metrics. Health metrics show whether the system is working as a product. Track adoption share, version spread, number of detached or overridden components, accessibility defects found, time to resolve bugs and requests, and satisfaction from a regular survey of users.
Practice. Write a script that scans repositories and counts imports of each component.
A/B Tests and Experiments Optional
Systems can support experiments by making variants easy to switch with props or feature flags, and by logging events consistently. Teams can then test a new layout or label without forking a component.
Be careful: experiments in shared components affect many products, so use flags scoped to a product and remove them when done. Use experiments to settle design questions, such as which button label works, with evidence instead of opinion.
Practice. Design a flag that lets a product test two variants of one component without changing the library.
FAQs Optional
A frequently asked questions page absorbs repeated questions: how to install, how to theme, how to request a component, what is stable, how to migrate. Build it from real questions in your channel and keep it short.
Review it every quarter and move stable answers into the main documentation. If a question appears often, treat it as a sign that the docs or the component are unclear.
Practice. Collect the ten most asked questions from a support channel and answer each in three sentences.
Projects to build
Build these in order. Each one should end up in a public repository with a short README that explains your decisions.
- Interface audit reportBeginner
Pick a real website or app. Capture screens, count colours, type sizes, spacing values and button styles, and produce a short report with the inventory, the biggest inconsistencies and a first set of recommendations.
Visual audit · Analysis · Presenting findings
- Token set and themeBeginner
Define primitive and semantic tokens in a JSON file, generate CSS custom properties with a build script, and create light and dark themes by overriding only semantic tokens.
Design tokens · Naming · Dark mode · Build tooling
- Accessible form kitIntermediate
Build text input, textarea, checkbox, radio, switch, select and a form layout using tokens. Test each with keyboard and screen reader and write a documentation page with states and do and do-not guidance.
Forms · Accessibility · Documentation · Testing
- Feedback components with testsIntermediate
Build a modal, toast and tooltip with correct focus management and live regions. Add interaction tests, a visual regression test and an automated accessibility check running in continuous integration.
Modal · Toast · Tooltip · Unit Testing · Accessibility Testing
- Published component packageAdvanced
Package your components with types, a Storybook documentation site, semantic versioning, conventional commits and an automated release workflow. Write a migration guide for a deliberate breaking change.
Packaging · Storybook · Semantic Versioning · Release strategy
- Governance and adoption planAdvanced
Write a plan for introducing a system at a company with several product teams: pilot team, governance model, contribution guide, communication channels and five health metrics with targets.
Governance · Pilot · Metrics · Communication
Interview questions
Try to answer each question out loud before you open the answer.
What is a design system and why would a company build one?Junior
It is a shared set of principles, tokens, components and guidance, with the process to keep them current. Companies build one to make products consistent, speed up delivery by reusing parts, build accessibility in once, and onboard people faster. It has a cost in maintenance and governance, so I would first show the duplicated effort it would remove.
What is the difference between a design system and a component library?Junior
A component library is code: reusable components in one framework. A design system also includes principles, design files, tokens, usage guidance, content rules and governance. A library alone gives consistent code but not consistent decisions, and it often drifts away from the design files. The library is one output of the system.
What are design tokens and how do you name them?Junior
Tokens are named values for design decisions, such as colours and spacing, stored in a format that design and code tools can read. I use layers: primitive tokens for raw values, semantic tokens for purpose, and component tokens for specific parts. I name by role, not appearance, so a rebrand does not invalidate names, and I keep a consistent order of category, property, variant and state.
How would you start a design system in a company with several existing products?Mid
I would audit the products to inventory and quantify inconsistency, interview designers and developers about their process, and find a sponsor. Then I would set a vision and principles, build tokens and the most used components, and pilot with one team on real work. After learning from the pilot, I would document, set up governance and widen adoption.
How do you make components accessible?Mid
I start with semantic HTML and add ARIA only where native elements fall short. Every component has keyboard support, visible focus, accessible names, enough contrast and support for reduced motion and text resizing. Complex widgets follow the established ARIA patterns. I test with automated tools and manually with a screen reader, and I document accessibility in each component page.
How do you support dark mode and theming?Mid
I put decisions in semantic tokens and let a theme be a different set of token values. Components reference only semantic tokens, so switching theme is a change of variables, not code. I respect prefers-color-scheme, allow user override, and recheck contrast and imagery for each theme. Brand themes for different products work the same way.
How would you version and release a design system?Mid
With semantic versioning: patches for fixes, minors for compatible features, majors for breaking changes, which include removed props and renamed tokens. I automate changelogs and releases from conventional commits, deprecate with warnings and a migration guide before removal, provide codemods for large changes, and keep a published support policy.
How do you decide what goes into the system?Mid
I look for evidence of reuse: several teams need it, it appears in the audit repeatedly, and it has a clear owner. One-off components stay in the product. I ask whether an existing component can be extended, and I apply a definition of done covering design, code, tests, accessibility and documentation before accepting it.
Describe governance models for design systems.Senior
In a centralised model a core team owns everything, which gives consistency but can bottleneck. A federated model lets product teams contribute under shared rules, which scales but risks drift. A hybrid keeps a core team for foundations and quality review while contributors add components through a defined process. I choose by team size, number of products and available capacity.
How do you drive adoption and measure success?Senior
I make the system the easiest path: good docs, quick support and migration help. I find champions in product teams and publish case studies from the pilot. I measure the share of screens built with system components, versions in use, custom overrides, defects, time to build standard pages and user satisfaction, then review these against the goals.
How would you handle a team that needs a component the system lacks?Senior
I would first check whether an existing component can meet the need. If not, I would offer a route: the team builds it following the contribution guide with design and accessibility review, or the core team schedules it. In the short term they may build a local version, tracked in an issue, with an agreement to merge or replace it later.
How do you test a component library?Mid
Unit and interaction tests check behaviour, keyboard handling and focus. Visual regression tests catch unintended style changes. Automated accessibility checks run on each story, and complex components get manual screen reader reviews. Everything runs in continuous integration, since a change to one shared component can affect every product.
When should you not build a design system?Senior
When there is one small product and team, little duplicated work, or no one to maintain it. A shared stylesheet and a handful of documented components may be enough. A system without an owner and funding decays and becomes a source of friction, so I would start small and grow it as the need and the capacity appear.
How should a modal dialog behave for accessibility?Mid
On open, focus moves into the dialog and the content behind becomes inert. Focus stays inside until it closes, Escape closes it, and focus returns to the trigger. It has a title and a role of dialog, and the native dialog element supplies much of this. I avoid modals for long tasks and never stack them.
How do you handle a breaking visual change across many products?Senior
I announce early with the reason and the date, ship it behind a flag or a major version, and publish a migration guide with before and after images and a codemod where possible. I offer office hours, track migration progress with usage analytics, and keep the old version supported for an agreed time.
Common mistakes
- Building every component before anyone needs it; start from the audit and the most-used parts.
- Naming tokens after appearance such as
blue-button; name by role so rebrands and themes stay simple. - Treating the system as a design project only; involve engineers from the start so code and design stay in step.
- Skipping accessibility until later; build keyboard, focus and contrast support into each component from the first version.
- Using colour as the only signal for errors or status; add text or an icon.
- Building a custom dropdown or modal without the full accessible pattern; use native elements or a tested headless library.
- Releasing breaking changes without deprecation warnings and a migration guide; use semantic versioning and a clear policy.
- Having no owner, budget or contribution route; define governance so the system neither stalls nor fragments.
- Writing documentation as a description of looks; write it as guidance on when and why to use each part.
- Measuring only downloads; track adoption, overrides, defects and satisfaction against the goals.
Ready-for-interview checklist
- I can explain what a design system is and how it differs from a UI kit and a component library.
- I can run a visual audit and present the findings to stakeholders.
- I can write a vision, principles and a prioritised roadmap.
- I can define layered design tokens with a role-based naming scheme.
- I can build a colour scale and check text contrast against WCAG.
- I can define type, spacing and breakpoint scales and explain unit choices.
- I can build accessible inputs, buttons, selects and forms with all their states.
- I can implement a modal, toast, tooltip and tabs with correct focus and ARIA behaviour.
- I can document a component with anatomy, states, guidance and accessibility notes.
- I can test components with unit, visual and accessibility checks in continuous integration.
- I can apply semantic versioning and plan a release and deprecation strategy.
- I can describe governance models and write contribution guidelines.
- I can choose metrics for adoption and health and explain what they show.
Related roadmaps
- CSS RoadmapCascade, layout with flexbox and grid, responsive design, animation.
- React RoadmapComponents, hooks, state, data fetching, performance and testing.
- HTML RoadmapSemantic structure, forms, media, accessibility and SEO basics.
- TypeScript RoadmapTypes, generics, narrowing, utility types and project setup.
- Next.js RoadmapApp Router, server components, data fetching, caching and deployment.
- Git and GitHub RoadmapCommits, branches, rebasing, pull requests, Actions and recovery.
FAQ
How long does it take to build a design system?
A useful first version, with tokens and ten to fifteen core components, can take three to six months for a small team. The system never finishes: it is a product that needs ongoing ownership, support and releases.
Do I need Figma and Storybook to start?
No. They are common and helpful, but the key assets are decisions, tokens and shared language. Start with an audit and a token file, then add tools when the number of components makes them worthwhile.
Should I build my own system or use an existing one?
For small teams, adopting and theming a well-maintained open source system saves a great deal of work. Build your own when your brand, platforms or accessibility needs are not met, and consider wrapping an open source base for hard components such as date pickers.
Is a design system only for large companies?
No, but the benefit grows with the number of products and people. A small team can start with tokens and a few documented components and grow from there.
What skills does a design system role need?
Strong front-end skills with accessibility, an eye for visual design, comfort writing documentation and good communication with designers and product teams. Experience with versioning, testing and release tooling matters for engineering roles.