Design System Components: What to Include and How to Govern Them

Mixed-media illustration: a drawn wardrobe bursts open, spilling drawn interface parts, a dozen differently shaped buttons, toggles, pie and line charts, a panel on a tuxedo hanger and a card in a Hawaiian print, all outlined in orange under a tag "Just in case"; a real steel robotic arm hanging from the top edge holds out one steel coat hanger carrying three neat drawn components, a button, a text field and a card, with a lime tag "This quarter".
Noah Chen
Product & Client Success Manager, ANODA
Published
15 min read
14 sections

In short

A component library needs a defined product scope rather than parts for every possible future flow. Components earn their cost when they cover what the product actually repeats, with relevant states, content rules, accessibility guidance and an owner. Here is what goes inside a component, what to standardise first, how Figma and code drift apart, and the governance that stops a library turning into a museum.

In this article
  1. What counts as a design system component
  2. Screens laid out in Figma are not a design system
  3. The anatomy of a production-ready component
  4. Scope the system for the product you can define
  5. Audit what has already drifted
  6. Which components to standardise first
  7. Assemble real screens before you call it finished
  8. Keep Figma components and code components in step
  9. Governance: how components are added, changed and retired
  10. How component libraries fail
  11. Diagnose which problem you actually have
  12. A component library shaped by a real product: Fusion
  13. The order we build it in
  14. Stop paying for the same interface decision again

Design system components are the reusable parts of an interface — buttons, fields, dropdowns, panels, cards, navigation — each with defined variants, states, content rules, accessibility guidance and an owner. For an implemented library, document the coded counterpart and verify its behaviour. The library is not the goal. The goal is a product that repeats its decisions instead of re-arguing them on every screen. And here is the part nobody puts in the pitch deck: the most expensive design system is the one built for a product that doesn’t exist yet.

“Make it bigger, so we never have to rebuild it.” Consider a team with a modest app and a handful of flows that asks for a design system with everything in it: charts, dashboards, every flavour of button, white-labelling just in case. We ask what they plan to build in the next three months, or the next year. The answer is some version of “we don’t know yet, but make it cover everything”.

Component libraries die of two things: bloat or neglect. Here’s what belongs inside a component, what to standardise first, and how to keep the whole thing honest after launch.

What counts as a design system component

A design system component is a reusable interface part with a defined purpose, supported variants and states, content rules, documentation and an owner. Design libraries and implemented libraries have different deliverables; when code is in scope, document and verify the mapping between them.

Think of toy bricks. Tokens are the plastic and the colours. Components are the moulded bricks that click together. Patterns are the instructions for building the fire station. A template is the baseplate with the station’s outline printed on it. The design system is the whole box, plus the rules about which bricks exist and who is allowed to mould new ones.

Term What it is Example
Design token A named value for one decision color.primary, space.3, radius.control
Style Published visual values in a design tool Text styles, colour styles
UI kit asset A drawing of a part, usually with no behaviour or code A button copied from a community file
Component A reusable part with supported variants, states, rules and an owner Button, text field, select, panel
Pattern Components combined to solve a recurring task Filtering a list, confirming a destructive action
Template A page layout with slots for content A list-and-detail screen
Design system Foundations, components, patterns, guidance and the governance that keeps them true The whole box, plus the rulebook
Illustrative example: five cards in a row labelled Token, Component, Pattern, Template and Screen. Token shows color.primary and space.4; the highlighted Component card shows an “Assign” button; Pattern shows a Technician select, a visit window of Tue 6 Oct and an Assign button; Template shows a hatched page layout; Screen shows Job 4218, Boiler service, Harlow Dental Clinic, Assign a technician.
Fictional taxonomy: named values, reusable components, task patterns, templates and screens. Composite components may span these layers; terminology varies by system.

A folder of reusable assets does not explain how to combine them into a usable task flow. Isolated components with no rules for combining them are a toolbox without a plan: every tool works, and nobody agrees what’s being built. If you need the business case for a system before zooming into its parts, start with our guide to design system elements, benefits and best practices.

Mixed-media illustration: on a drawn baseplate labelled “Form”, a real steel robotic arm clamped at the left edge presses a flat paper cut-out of a button, outlined in orange and labelled “UI kit”, which curls up at the corner instead of attaching; next to it a drawn studded brick outlined in lime, labelled “Button · 6 states”, sits snapped into place.
A picture of a button doesn’t click into anything. A component does.

Screens laid out in Figma are not a design system

The most common thing we find in a product that “already has a design system” is a very large Figma file full of frames. No components. No spacing logic. No Auto Layout. Every screen was drawn, duplicated and nudged by hand. It looks tidy in a presentation and behaves like a Western town on a film lot: every saloon has a front, and there’s nothing behind the door.

It’s 2026 — working without components? Apparently that’s normal. Teams come to us all the time with a design where everything is just frames. No components, no spacing, no Auto Layout, nothing at all, on a big product. And a product manager with very honest, very sad eyes says: “It doesn’t scale.” Of course it doesn’t — you don’t have a design system. Screens laid out in Figma do not mean you have a design system.

Oksana KovalchukFounder & CEO, ANODA
Mixed-media illustration: a drawn film-set street of false fronts shaped like app screens labelled “Checkout”, “Settings” and “Dashboard”; a real steel robotic arm hanging from the top edge lifts the “Dashboard” front by its corner, revealing empty paper and two wooden props behind it with an orange note “No components”.
Great street for a photo. Just don’t try opening a door.

Without shared instances or update rules, a change can require repeated edits. A new brand colour, a longer label, one more field: somebody edits every frame by hand, misses a few, and engineering builds from whichever version they found first. You’re paying designers to do the job of a find-and-replace that was never set up, and paying engineers to guess which of three buttons is the real one.

Illustrative example: two Figma layer panels for a Job details screen. Before: Frame 2841 with groups, Rectangle 17, a text layer “Assign”, Rectangle 17 copy, a detached button and Rectangle 9 placed at x 23, y 611. After: an Auto Layout frame with gap 16 holding instances of Page header, Job summary card and an Assign form with Select / Technician, Date range / Visit window, Button / Primary / Default and Button / Secondary / Default.
Fictional Figma structure comparison. Instances and layout rules support reuse; verify overrides, library updates and the rendered result after a change.

Audit check

Open five core screens and inspect the primary action, the main input and the page header on each. Are they instances of one component, or drawings?

Failure evidence

Detached instances, repeated manual drawings and unexplained spacing differences. Layer names alone do not establish a defect.

Correction pattern

Confirm which parts should be shared, then introduce suitable components and layout rules. Preserve intentional differences and verify consuming screens.

The anatomy of a production-ready component

A button in a UI kit is a rectangle with a word in it. A button in a working system answers a dozen questions before anyone asks them. This is what we check when we review one:

  • Purpose. The job it does, and when to use something else.
  • Variants. Deliberate differences: primary, secondary, danger; medium and large.
  • States. Default, hover, focus, pressed, disabled, loading, and error where it applies.
  • Content rules. Label length, casing, icons, what happens when the text doubles in translation.
  • Behaviour. Keyboard and touch, and what a second click does while the first is still loading.
  • Responsiveness. How it stretches, wraps or stacks on smaller screens.
  • Accessibility. Contrast, visible focus, target size, the name a screen reader announces.
  • Tokens. The named values it uses, with documented consuming values and overrides to check after a change.
  • Code mapping. The coded component and the props that match each design property.
  • Tests. Visual and behavioural checks that catch a regression before users do.
  • Documentation. Usage guidance where people actually look.
  • Owner and change history. Who approves changes, and what changed in which version.
Illustrative example: a spec page for Button, Primary, size M, with an “Assign technician” button 48 px high and 24 px padding, hover, focus and loading specimens, and a list of purpose, variants, states, content, behaviour, responsive rules, accessibility, tokens, the code call, tests, owners Maya Ortiz and Tom Reed, and version 3.2.0 from Tue 15 Sep 2026.
Fictional button specification. Dimensions, content limits, breakpoints and owners are sample choices, not universal requirements or proof of accessibility.

A component with only a default state leaves behaviour unspecified. Document the states needed by the actual task and agree how design and engineering handle them. Every missing state becomes a decision someone has to invent later. Specify it once instead of paying your team to improvise it on every screen.

Fictional operation Idle label In-progress label
Save visit Save visit Saving visit…
Reschedule job Reschedule Rescheduling…
Cancel job Cancel job Cancelling job…

Define default, hover where supported, focus, pressed, disabled and in-progress behaviour for the relevant controls. Keep progress copy specific to the operation and verified state. Do not announce completion before confirmation; provide an appropriate recovery path when the outcome is unknown.

Inputs need explicit decisions about persistent labels, hints, validation and recovery. An unclear label or useless error turns a simple form into a support conversation. Write the rules before your customers have to ask.

Illustrative example: six text field states. Empty with the placeholder “e.g. Gate code, parking”; focused with “Gate code 4471”; filled with “Gate code 4471, bay 3”; an error on Customer phone “07700 90” saying “Enter a full UK number, 11 digits”; a disabled Job number 4218; a read-only Created by Rosa Lindqvist with a lock icon.
Fictional field states, not a complete specification. Confirm supported telephone formats, validation and recovery for the actual product.

For a form field, document the persistent label, hint, required or optional status, error message and recovery action. Define when validation runs, whether entered data survives a failed submission, and how focus moves to an error. Disabled and read-only are different states: explain what the customer can change and why. Test those decisions inside a complete form, including keyboard navigation and screen-reader announcements.

Build accessibility requirements into components and verify their use in complete screens. WCAG 2.2 level AA requires text contrast of at least 4.5:1 for normal text and 3:1 for large text, with defined exceptions. Its pointer-target criterion requires at least 24 by 24 CSS pixels or an applicable exception, including sufficient spacing. Shared fixes can reach screens that consume the updated component, but labels, keyboard order, content, configuration and complete task flows still need checks.

Review area Component guidance Screen-level verification
Labels Provide a persistent visible label and accessible name. Verify that the actual field has the intended label and association.
Focus Define and implement visible focus states. Walk the complete screen with a keyboard and check order, visibility and obstruction.
Contrast Use suitable values for applicable text and control states. Check rendered colours and backgrounds in each relevant state.
Targets Define usable controls for the supported input methods. Check actual dimensions, spacing and applicable exceptions.

Make the shared component the reliable default, then check overrides and composition on the screens that use it.

Audit check

Pick your three most used components and try to find every state, content rule, code counterpart and owner for each.

Failure evidence

Only default states in the library, loading and error states that exist in code but not in design, nobody able to say who approves a change.

Correction pattern

Write the missing states and rules into the component itself, then test them on a real screen, not a component preview.

Scope the system for the product you can define

Define the scope before estimating a component library. The first question isn’t “how big should the library be?” It’s “what will this product actually do in the next three months and the next year?”

Imagine you go to a tailor and say: I have two suits and three shirts, make me a wardrobe. He asks which country you’ll live in, what climate, what lifestyle — in some places men don’t wear shorts. And you say: I don’t know, make it for every occasion. Now picture the size of that wardrobe. Everything from Hawaiian shirts to formal suits to tuxedos. It’s an absurd request. A design system “to grow into” is exactly the same.

Oksana KovalchukFounder & CEO, ANODA

A speculative system is a jack of all trades and master of none: piles of components for flows nobody has specified, each needing documentation, updates and tests forever. Then the product grows in a direction nobody predicted, and half the wardrobe doesn’t fit anyway.

Mixed-media illustration: a drawn order form as long as a scroll, headed “Design system: everything” and outlined in orange, rolls off the edge of the table; a real steel robotic arm clamped at the right table edge lifts the scroll at the one line highlighted in lime, “3 charts”.
Conceptual illustration: turn a broad request into specified product needs; the three charts are a fictional example.

Turn the request into named tasks, deliverables and maintenance needs. A hypothetical team may discover that three chart types and consistent forms cover its current scope. Consider how much speculative scope the team can maintain:

Building a design system to grow into is silly. You can argue with me all you like — it’s silly. If you don’t need the money, you can just transfer it to us. We love money, and we’ll happily give your product five stars. But it’s a completely pointless exercise.

Oksana KovalchukFounder & CEO, ANODA

If the roadmap is uncertain, evaluate an existing system before commissioning a broad custom library. Compare current task coverage, licence terms, platform support, implementation fit and maintenance needs. Material Design and Carbon are references to investigate, not automatic fits for every product. Our round-up of design system examples provides starting points for that comparison.

Illustrative example: a table comparing Adopt, Adapt and Custom-build by roadmap, product scale, what you change, what to check first and main risk; the custom-build risk reads “Paying for a wardrobe you never wear”.
Fictional comparison of adoption, adaptation and custom work. Roadmap certainty is one input; verify task fit, licensing, platform support, accessibility and maintenance capacity.
Mixed-media illustration: a drawn sheet of ready-made components labelled “Existing system” is half repainted as a real steel robotic arm clamped at the top-left edge rolls a small paint roller across it, leaving a lime stripe labelled “Our colours”; in the corner a drawn wooden wheel on a workbench carries a crossed-out orange label “Reinvent?”.
Conceptual illustration of adapting an existing system. Verify task fit, licensing, implementation and accessibility after changes.

Audit what has already drifted

A live product has interface conventions, whether or not they form a maintained design system. Inventory repeated controls and compare dimensions, states and implementations. Some variations serve different tasks or platforms; investigate before consolidating them.

It’s a school where every classroom clock shows a slightly different time. Nobody is badly wrong, and the whole school is late. It’s a dripping tap: each inconsistency too small to prioritise, together a product that feels built by strangers.

Illustrative example: an audit table of seven Tollbrook screens, from Jobs list to Onboarding, each with a primary button of a different shape: heights from 36 to 56 px, corner radii from 4 to 28, hover on four, a loading state on two, and only two built from the Figma component.
Fictional audit inventory. Differences are review candidates; check task, platform and input method before treating a variation or missing hover state as a defect.

An audit has two halves. The interface half: an inventory of every repeated part across the core screens, with its variants, missing states and odd behaviours. The structural half: how the Figma file is built — real components or drawings, Auto Layout or hand-placed frames, detached instances, hard-coded values — and how many implementations of “the same” component live in code. The output is not a slide of screenshots. It’s a list of what to merge, what to fix and what to delete. Bringing this kind of mess back into order is the part of the job we enjoy most.

Mixed-media illustration: drawn buttons, all labelled “Primary” but of different shapes; a real steel robotic arm clamped at the bottom edge places one of them into a lime-outlined tray labelled “Primary”, while the rest lie in an orange-outlined bin labelled “Duplicates”.
Conceptual illustration of consolidation. Verify equivalent behaviour and migrate consuming screens before removing duplicates.

Audit check

Inventory one component across every core screen: size, radius, states, label style, and whether it’s a real instance in design and one implementation in code.

Failure evidence

Several implementations, differing state coverage or unexplained design-to-code mappings. Check task and platform needs before classifying them as defects.

Correction pattern

Compare behaviour and supported tasks, agree which variants should remain, and migrate consuming screens before removing redundant implementations.

Which components to standardise first

Don’t start with the prettiest component, or the one on a competitor’s showcase site. Start with what the product repeats, weighted by what hurts when it goes wrong. A corner shop stocks bread and milk before saffron.

Assess how often each candidate appears and what happens when it fails. Buttons, fields and date controls can all be priorities, but their order depends on actual tasks, observed defects and consequences. Record the evidence behind the choice rather than assigning priority from the component category.

Prioritise components using evidence from the product:

  • Frequency in supported tasks and the number of consuming screens.
  • Consequences of incorrect behaviour, including lost data, payment confusion or blocked access.
  • Accessibility defects and recovery difficulties.
  • Effort to consolidate implementations and maintain the shared version.

A rarely used payment status indicator may need urgent correction. An onboarding carousel or promotional banner may also carry important information or introduce interaction barriers. Do not classify either as harmless from its component name; assess the actual content, behaviour and task.

A practical starting point is the primitives current flows use, such as buttons, selects and text fields, then repeated composites such as cards or filter panels. Assemble representative screens early so task-level problems can change component priorities. Terms such as atoms, molecules and organisms are optional; the sequence should fit the product rather than impose a universal build order.

Illustrative example: three columns. Primitives: an Assign button, a Technician select, an Access notes field, a slider and a Scheduled chip. Composites: a job card for Harlow Dental Clinic, Boiler service, Tue 6 Oct 9:00, Sam K., and a filter panel. Screens: a Jobs list for Tue 6 Oct with three job cards and a note that empty, loading and error states are reused.
Fictional composition from primitives to a jobs screen. Assemble screens early and revise component priorities as task-level needs become clear.

The components of a design system fall into familiar families: actions, inputs, selection, navigation, feedback, data display, containers and overlays. The useful question isn’t “which of these do mature systems have?” (coverage varies by system). It’s “which do our flows need now?” A family without a real flow next to it waits.

Illustrative example: a table of component families for Tollbrook. Actions, inputs, selection, navigation, feedback, data display, and containers and overlays are marked Now, each next to the flows that use it; charts are marked Later, for reports planned in Q2 2027; white-label theming is marked Not yet because nobody has asked.
Fictional scope inventory with current and planned flows. Dates and priorities are sample planning choices, not an ANODA or client roadmap.

Assemble real screens before you call it finished

A component library can pass every review in isolation and still fall apart on the first real screen. It’s a wedding seating plan: every guest is delightful on their own, and then you put the exes at table four.

Even if the client doesn’t ask for it, we still assemble a few test screens and run accessibility checks on them, and check that everything composes properly. In the design system it can all look logical and correct, and then you put it together and go: oops, that came out awkward.

Oksana KovalchukFounder & CEO, ANODA

The card that looked perfect with “Jane Doe” breaks on a customer whose legal name runs to five words. The filter panel designed for three filters meets eleven. Two buttons that sat side by side wrap on a narrow phone, and the destructive action lands where “Save” used to be.

Illustrative example: two phones. In the component preview, job cards for Jane Doe and John Smith look tidy with one Scheduled badge each. In the real jobs list, the name “Northern Regional Maintenance Servi” is cut off, Overdue and Priority badges run into the card edge, no technician is shown and Reassign and Cancel buttons crowd the card.
Fictional comparison using short and longer sample content. The image illustrates possible layout failures, not recorded product-test results.

So we build representative screens from the library — the busiest list, the longest form, the smallest phone — with real data lengths, and check them: keyboard order through the whole screen, visible focus, contrast in every state, what a screen reader announces. Identify whether the failure belongs to the component or its composition on the screen. Correct the shared component when the issue repeats; fix the layout or flow when the component is being used incorrectly. Check other consuming screens for the same issue.

After correcting a shared card, check consuming screens with representative content, relevant states and supported input methods. Confirm that they use the updated version and have no conflicting overrides. Keyboard focus should reach meaningful interactive controls in a logical order; a noninteractive card does not need a focus stop merely because it is a card. Record actual contrast and assistive-technology checks rather than treating a diagram as a passed test.

Mixed-media illustration: on a drawn phone screen, a job card’s customer name “Northern Regional Maintenance Services Ltd” runs past the card and off the phone, outlined in orange; a real steel robotic arm hanging from the top edge grips the card’s edge and stretches it taller so the name wraps onto two lines, the new edge drawn in lime.
Conceptual illustration: test representative content lengths, localisation and layouts rather than relying on short sample names.

Sometimes the assembled screen reveals that the problem was never the component. The flow is confusing, the steps are in the wrong order, the screen tries to do three jobs. Standardising that just makes the confusion consistent. Fix it as product UX and interface design first, and only then turn it into reusable parts.

UI/UX design

Is the button the problem, or the flow it sits in?

If your components keep “failing” on real screens, the product logic underneath may be unfinished. We fix the flows first, then turn them into parts worth reusing.

Scope the product design work

Keep Figma components and code components in step

The Figma library and the coded component library start life as twins and drift apart like the plans filed with the council and the house the builder actually built. Three bedrooms on paper; a conservatory nobody mentioned and a staircase in a different place on site.

Design and code can drift when changes are made on one side without updating the other: a new danger variant, a renamed property, a loading state or a hard-coded radius. Compare the actual libraries and record the mismatches before another release spreads them.

Illustrative example: a table comparing Button properties in Figma and in code. Variant is Tertiary in Figma and link in code. Size L is missing in code. Loading and the danger variant exist only in code. Icon and Disabled match. Corner radius uses a token in Figma and a hard-coded 6px in code.
Fictional property mapping. Check intended behaviour and supported states as well as names; differently named properties can be deliberately mapped.

Maintain a property-by-property mapping between design and code, including deliberate naming differences. Where shared token generation fits the toolchain, verify transformations and consuming versions. Agree which design and engineering checks each change needs, then inspect representative screens before declaring parity.

Illustrative example: a token source holding color.primary, radius.control 8 and space.3 24 feeds both Figma variables and a generated code theme; below, a note that a typed border-radius of 6px and a pasted hex colour are how drift starts.
Fictional token pipeline. Keep generation, transformations, overrides and consuming versions in step so a shared decision stays shared.
Mixed-media illustration: two drawn blueprints side by side, “Figma” and “Code”, show the same button with its variant circled in orange, “Tertiary” on one and “link” on the other; a real steel robotic arm clamped at the top-left corner stretches a lime thread between the two circles.
Conceptual illustration of a property mapping. Different names can be intentional; document and verify the mapping.

Governance: how components are added, changed and retired

A design system is a tool, not a legal code carved in stone. It has to accept legitimate new needs and refuse duplicates, and both of those need a rule, not a mood.

A design system has to be flexible. It’s a tool; it shouldn’t lock you into some unbreakable set of rules. Everything depends on context. If the system has no panels and we need panels, obviously we add them. But if there’s already a primary button and we’re making another one, that’s not a great idea.

Oksana KovalchukFounder & CEO, ANODA

A second primary button is a second captain on the pitch: both mean well, and the team stops knowing whom to listen to. A side panel the scheduling flow genuinely needs is a new player the squad was missing. Governance is how you tell the two apart.

Illustrative example: a flow for adding components. A team needs something the system lacks, a side panel for Scheduling; the owners ask whether an existing component already does the job; the answers are use it as is, extend it with a variant or property, add a new component if it will repeat, or document a one-screen exception with an expiry date; then design and code review, release and changelog.
Fictional contribution process. Review task fit and existing options; document the owner and a suitable review date for exceptions.

Workable governance covers six things:

  • Contribution. Anyone can propose a component, with the product flow that needs it and why an existing one can’t be extended.
  • Review. Named design and engineering owners check duplication, states, accessibility and naming. Not a committee: a camel is a horse designed by a committee.
  • Exceptions. A documented one-off with an expiry date, not a quiet fork.
  • Versioning. A changelog, version numbers and breaking changes announced before they land.
  • Deprecation. A replacement, a removal date and a list of screens still affected.
  • Adoption and feedback. Which teams use which version, where instances are detached, and what consuming teams say is missing.
Illustrative example: a changelog entry for Tollbrook UI 4.0.0 dated Tue 3 Nov 2026, marked Breaking: a side panel added for Scheduling, the danger variant added in Figma, link renamed tertiary in code, the legacy modal deprecated until 5.0.0, planned for Tue 12 Jan 2027, with three screens still using it, and Button 2 removed.
Fictional changelog with sample versions and dates. Confirm replacement suitability and consuming-team migration before removal.

A component is a family recipe that every cook has adjusted a little. Is it still grandma’s soup? If the recipe card shows each change and why, yes. If it doesn’t, you have a different dish under the same name, and nobody can tell whether their screens will still taste right.

Mixed-media illustration: a drawn shelf of components holds one button labelled “Primary” and a freshly added lime panel labelled “Panel”; a real steel robotic arm clamped at the right edge holds back a second drawn button labelled “Primary (new)”, outlined in orange, at the edge of the shelf.
Conceptual illustration: review unmet task needs and existing options before adding or duplicating a component.

How component libraries fail

We see the same failure modes in almost every design system component library we audit:

  • Unclear design-to-code handoff. Design assets without an agreed implementation mapping can leave engineers to resolve behaviour and states independently.
  • Undocumented states. The default is beautiful; everything else is improvised in production.
  • Components detached from real workflows. Designed for a preview page, broken on the busiest screen.
  • Duplicated variants. “Button”, “Button 2”, “Button-new” and “Primary FINAL”, each used by somebody.
  • Inaccessible defaults. One low-contrast colour in a component, copied onto every screen that uses it.
  • Rigid rules. A system without a way to evaluate legitimate new needs can encourage untracked local variants. It’s a school uniform policy that bans coats in winter: pupils wear their own anyway, and now there’s no uniform at all.
  • Low adoption. A library nobody uses is a first-aid kit locked in the manager’s office: expensive, present and useless when it’s needed.
Illustrative example: two asset panels. Before: eight button components named Button, Button 2, Button-new, Primary FINAL, CTA big (marketing), Btn / blue / hover, Button (Sam, do not use) and Invoice send button, tagged as duplicates, a state saved as a copy, abandoned or one screen. After: three components, Button with three variants and six states, a labelled Icon button and a Link for navigation only.
Fictional consolidation example. Compare semantics, behaviour and task needs before merging; similar names alone do not establish duplication.
Mixed-media illustration: a drawn glass display case on a plinth holds a pristine binder labelled “Component library” beside an orange sign “Do not touch”, surrounded by drawn app screens assembled from mismatched buttons; a real steel robotic arm clamped at the top-left corner lifts the glass lid off the case.
A library in a glass case is a museum. The product outside is built from whatever was lying around.

Diagnose which problem you actually have

A request for more components can reflect several problems: a missing part or pattern, unsuitable foundations, poor documentation, low adoption or a confusing task flow. Inspect the actual libraries and screens before choosing the response.

Investigate several possible causes before adding a component. Repeated custom work may indicate a missing component, but it can also reflect poor discoverability, unsuitable behaviour or incompatible implementation. Differences in colour or spacing may come from token values, overrides or version adoption. Check the library, consuming code, documentation and actual task before choosing the correction.

Choose the correction after checking the cause. A new or revised component may be part of the solution, but it does not replace task design, documentation, adoption or maintenance work.

A component library shaped by a real product: Fusion

In our Fusion dating-app design, compatibility had to be visible on the discovery card while personality badges remained consistent across the experience. We designed the new mobile app in light and dark, with a component library for those repeated elements, then handed off a documented type scale, components and interaction states.

The product was also planning additional matching modes. The design task was to leave room for those modes while keeping the current onboarding and compatibility flow coherent. We handed the client a reusable design library and interaction states ready for engineering. Agree ownership of the implementation alongside the design handoff so the system remains useful after delivery.

The order we build it in

When the product and its near-term roadmap are clear enough to design for, this is the sequence we follow when we build and govern a design system with a product team:

  1. Clarify the product and a credible roadmap. Flows that exist, flows that are planned, and wishes.
  2. Audit the interface and the Figma structure. Duplicates, missing states, drawings posing as components.
  3. Decide whether to adopt, adapt or custom-build. Compare task coverage, implementation fit, licensing and maintenance capacity.
  4. Prioritise repeated and high-impact primitives. What repeats, and what hurts when inconsistent.
  5. Compose them into patterns and representative screens. With real data.
  6. Test accessibility, states and flexibility. On assembled screens, not previews.
  7. Document how additions are approved and duplicates prevented.
  8. Evolve the system as verified product needs appear.

For the full build process, step by step, see our guide on how to build a design system.

Build the system for the product you can define, not for every product you might imagine. Standardise what the product genuinely repeats, prove the parts work together on real screens, and leave room for the next legitimate need without letting a second primary button sneak in. A set of neatly arranged Figma screens without components, constraints and governing logic is not a design system. It’s a very expensive photo album.

Design systems

Seven primary buttons and a Figma file nobody trusts?

We audit the existing library, consolidate repeated components and test the design on representative screens. A coded component library and implementation parity are scoped separately with frontend engineering.

Talk to us about your design system

Stop paying for the same interface decision again

A bigger library does not solve a product full of conflicting buttons, missing states and screens engineers have to interpret. It gives you more parts to maintain while the same confusion keeps spreading. ANODA audits what your product repeats, fixes the shared decisions and builds components around actual flows. The Fusion project shows that approach in compatibility cards, personality badges and a documented design handoff. Build a useful component system with ANODA so your next screen starts from decisions worth repeating.

Related reading

All articles