UX/UI design

The twentieth screen becomes expensive when every button starts another design conversation.

Three Rigoris teammates as clay figures reviewing colour swatches and screens for a design system.

The short answer

A useful design system defines shared tokens, accessible components and every important state in both design and code. Start with repeated product patterns, not an abstract library. Name ownership, contribution and release rules, migrate real workflows gradually and measure adoption by whether teams reuse the system without blocking necessary product work.

A component library is not a design system simply because the buttons match. The system becomes valuable when design and engineering use the same decisions, product work can move without reopening settled questions and the unusual cases still have a clear way to become part of the shared language.

Start with repeated product decisions, not an empty catalogue.

Audit the live product and current design files. Group components that perform the same job even when their colour, spacing or name differs. Record where inconsistency is harmless, where it creates accessibility or maintenance risk and where two patterns only look similar because their behaviour has not been documented.

Prioritise the components that appear often and carry consequential behaviour: buttons, inputs, alerts, navigation, tables, dialogs and empty states. A rare marketing card can wait. A form control used in every workflow will return the investment quickly and reveal whether the token and state model works.

Keep examples from real screens beside the audit. A library designed without product context tends to make idealised components that cannot express the messy labels, validation, permissions and loading states the application already needs.

Build foundations and states before multiplying variants.

Tokens give names to repeated decisions such as surface, text, border, spacing, type and motion. Use semantic names that describe a role, not a colour value or one page. A token called error-text can change safely across themes. A token called red-600 forces every consumer to understand why it was chosen.

Every interactive component needs the states people actually encounter: rest, hover, focus, active, disabled, loading, error and success where relevant. Include keyboard behaviour, screen-reader naming and content limits in the specification. An attractive default state is the smallest part of the component's job.

  1. 1. Audit and consolidate

    Find repeated patterns in the live product and design files, then decide which differences represent a real need and which are drift.

  2. 2. Define semantic foundations

    Create type, colour, spacing, radius and motion roles that explain their purpose and can support themes or future changes.

  3. 3. Specify complete components

    Document behaviour, content, states, accessibility and responsive rules in design and working code.

  4. 4. Prove them in real workflows

    Replace patterns inside representative product tasks and fix the system where real content exposes missing decisions.

Design and code need an explicit relationship.

Matching names help, but the stronger connection is behavioural. A designer choosing a component should see the same variants and constraints an engineer receives. The code documentation should show the product states and content rules, not only a technical property list.

Decide which source is authoritative for tokens and how changes move into the other environment. Automate what can be safely transformed, but keep review around semantic changes. Renaming a token or changing a focus style may affect many screens even if the generated file changes cleanly.

Version components and communicate consequential changes. A product team needs to know whether an update is visual, additive or likely to change behaviour. Deprecate old patterns with a migration path rather than deleting them from design while they remain active in the product.

The shared decision each design-system layer must carry
LayerDesign responsibilityCode responsibility
TokensName visual roles and relationshipsExpose stable variables and theme behaviour
ComponentsSpecify anatomy, states and contentImplement semantics, interaction and responsive rules
PatternsShow components working in a real taskCompose without bypassing component contracts
GovernanceReview additions and document rationaleVersion, test, release and migrate changes
The shared decision each design-system layer must carry

Governance should help the product move, not guard a museum.

Give the system an accountable owner and a lightweight contribution path. A team encountering a missing pattern should be able to show the product need, propose a reusable answer and get a decision within the pace of ordinary delivery. If the system blocks the work, teams will route around it and create local components.

Not every product decision belongs in the shared library. Keep one-off compositions close to their feature until a repeated need appears. Promote patterns when reuse and consistency justify the maintenance cost. The library should be smaller than the product, because its job is to hold shared decisions rather than every arrangement ever designed.

Document why a component exists and where it stops. A name and screenshot are not enough to prevent misuse. Show good examples, common mistakes and the point where a different pattern better serves the task.

Adoption is the result, not the library release.

Choose representative workflows and migrate them with the product teams who own them. Fix inconsistencies that affect usability and maintenance first. Rewriting every old screen before new work can use the system turns adoption into a long pause with no visible product benefit.

Measure reuse, duplicate patterns, contribution time and the accessibility issues found around shared components. Ask whether designers and engineers can complete common work without detaching or rebuilding the provided parts. A high component count is not evidence of a healthy system.

We build the visual rules and working components together so the handoff is a shared product rather than a design file sent across a gap. The system keeps changing after launch, but the ownership and release process make those changes deliberate.

Include the people who maintain content and test releases, not only designers and engineers. They encounter labels, localization, automation and regression risk that a component preview rarely shows. Their feedback often separates a reusable product component from a visually complete example that only works in one prepared screen.

Retire duplicates in both design and code as migration progresses. Leaving the old pattern available without a warning makes it the fastest choice under pressure, and the system accumulates a second generation of drift beside the first. Deprecation needs an owner, a replacement and a point when new use stops.

Worth knowing before you start

  • Audit the live product and group components by job before naming the first new library component.

  • Document loading, error, focus, disabled and empty states with the default state, not in a later cleanup.

  • Give teams a contribution path that fits ordinary delivery or they will create local patterns around the system.

  • Measure reuse and duplicate reduction in real workflows rather than celebrating the number of components published.

Related work

Common questions

A component library provides reusable parts. A design system also defines the foundations, behaviour, content rules, accessibility, design-to-code relationship, ownership and contribution process that keep those parts coherent. The system is the decisions and operating model around the library, not only the files.

Start when repeated patterns, inconsistent states or duplicated implementation are slowing real product work. You do not need to stop and design the whole library first. Consolidate the components used most often and prove the foundations in representative workflows while delivery continues.

No. Shared components should hold decisions used across several workflows or products. One-off compositions can remain close to their feature until a repeated need appears. Putting every unique arrangement in the system increases maintenance and makes the useful shared parts harder to find.

Use shared semantic names, matching variants and documented behaviour, define which source controls tokens and version consequential changes. Review real workflows in both design and the running product. Automated transformation helps, but it does not replace a decision about meaning, behaviour or migration.

Related

Want to talk through your situation?

A short call is usually enough to tell whether this is the right work for you. If it isn’t, we’ll say so.