Discover → Define → Ideate → Design → Test
Design Systems · Internal Platform · 2026Concept Project

One system,
seven teams

A case study on building Meridian — a token-based, WCAG AA-compliant design system — after an audit found each of Studio Nord's 7 product teams shipping its own inconsistent, sometimes inaccessible components.

Role

Lead Product Designer

Timeline

12 weeks, end‑to‑end

Platform

Web & Mobile

Tools

Figma · Storybook · Maze

Try the component library ↓
9:41●●● 5G 100%
Before Meridian
4 button styles across 3 teams

2 of 4 failed a contrast check.

9:41●●● 5G 100%
Meridian
Design tokens → one button, every team
WCAG AA components
48
Buttons
Form fields
Navigation

What is Meridian?

Meridian is Studio Nord's shared design system: a token-based library of accessible components, built once and consumed by all 7 product teams — instead of each team maintaining its own buttons, forms, and navigation from scratch.

The Problem

An internal audit found 4 different button styles, 6 different spacing scales, and components duplicated across teams that looked similar but behaved differently. Worse, an accessibility pass found several of those components failing WCAG AA contrast and keyboard-navigation checks — each team had rebuilt the same problems independently, with no shared source of truth to catch them.

The Goal

Build a single, token-based system that's accessible by default rather than by request, ship it in a way 7 teams with different roadmaps could actually adopt without a big-bang rewrite, and cut the back-and-forth between design and engineering that came from every team re-specifying the same components.

Why this mattered

Design debt compounds the same way technical debt does: every team that copies an old, slightly-wrong component instead of a shared one makes the next audit larger and the next fix harder. The longer 7 teams stayed on their own components, the more expensive a shared system would eventually be to retrofit.

Accessible by default
One source of truth
Adoptable incrementally
Documented, not tribal knowledge

Design Process

A five-stage double-diamond process, run end-to-end with weekly syncs alongside one PM and two engineers.

Discover

Research & competitive analysis

Define

Personas & journey mapping

Ideate

HMWs, IA & user flows

Design

Wireframes to hi-fi UI

Test

Usability testing & iteration

W1Research & interviews
W1–2Component & a11y audit
W2Personas & journeys
W3HMWs & IA
W3–4User flows
W4–6Low‑fi wireframes
W6–7Token system & style guide
W7–9Hi‑fi components
W9–10Prototype
W10–12Usability testing & pilot

Design Strategy

Four opportunities emerged for making Meridian something 7 teams would actually adopt, not just a Figma file.

01

Accessibility built into the component, not bolted on

WCAG AA contrast, focus states, and keyboard navigation ship by default — not something each team has to remember to add.

02

Tokens as the single source of truth

Color, spacing, and type live as tokens shared between Figma and code, so design and engineering can't silently drift apart again.

03

Composable, not one-size-fits-all

Components expose slots and variants instead of rigid, locked-down templates, so teams don't fork the library to get what they need.

04

A migration path, not a rewrite mandate

Teams can adopt component-by-component alongside their existing roadmap, instead of stopping feature work for a big-bang swap.

Phase 01

Discovery Phase

Understanding why 7 teams kept rebuilding the same components instead of reusing each other's, and what accessibility actually looked like across them.

Qualitative Research

1:1 moderated interviews with designers and engineers across all 7 teams.

  • Objective: uncover why teams rebuild instead of reuse, and what "adoption" would actually require
  • Method: remote 1:1 interviews, 40 minutes each
  • Sample: 14 participants — one product designer and one frontend engineer from each team

Quantitative Research

An automated component audit plus a follow-up survey validated interview themes at scale.

  • Objective: quantify component duplication and accessibility failure rate
  • Method: automated audit across all 7 codebases + a 12-question survey
  • Sample: 340 components audited + 45 survey respondents
What stops you from reusing another team's component?
Couldn't tell if it still matched our design
39%
Didn't know it existed
27%
Didn't support our use case
22%
Too much back-and-forth to get help
12%
How confident are you that your components meet accessibility standards?
Not confident, never formally checked
54%
Somewhat confident
33%
Confident — we actively test for it
13%
What would make you adopt a shared system?
Confidence it's actually accessible
44%
Faster than building it myself
34%
A clear migration path, not a rewrite
22%

Competitive Analysis

A structured review of three established design systems to map strengths, gaps, and openings for differentiation.

MDMaterial Design
CBCarbon (IBM)
PLPolaris (Shopify)
DescriptionGoogle's broad, general-purpose system covering nearly every UI patternIBM's enterprise system, built with accessibility as a first-class constraintShopify's system for merchant-facing admin and app-extension UI
StrengthsExtremely comprehensive, strong theming toolsRigorous WCAG compliance, excellent documentation of the "why"Practical adoption tooling, opinionated defaults reduce decisions
WeaknessesGeneric by design — heavy re-theming needed to not look like GoogleSteep learning curve, verbose for smaller teamsPatterns lean Shopify-specific, less portable elsewhere
Adoption approachAll-or-nothing theming layer across the whole productComprehensive but front-loaded — a big investment before any payoffIncremental, component-by-component adoption encouraged

Conclusion

The gap isn't another comprehensive system — it's one that combines Material's completeness, Carbon's accessibility rigor, and Polaris's incremental adoption model, without their respective weaknesses: generic re-theming, a steep upfront learning curve, and platform-specific lock-in. Meridian's opportunity is accessible-by-default components that any of the 7 teams can adopt one at a time.

Phase 02

Define Phase

Synthesizing research into shared patterns, then into two personas that anchored every design decision.

Affinity Mapping

Frustrations

Rebuilding the same button for the third time this year
No way to tell if a component is current or abandoned
Accessibility gets skipped when the deadline is tight

Needs & Wants

One place to check if a component already exists
Confidence a component meets WCAG without re-testing it
Documented props, not just a Figma frame

Behaviors

Copy an old component and tweak it rather than ask around
Skip the accessibility review under deadline pressure
Ask in Slack instead of checking docs, since docs are usually stale

Motivations

Wants to ship faster without cutting corners
Wants design and code to actually match
Wants to stop being the one explaining contrast ratios in review

User Personas

KR

Kavya Reddy

29 · Product Designer · Studio Nord

"I don't want to design a button again. I want to know the one we have is good."

Pain Points
  • Rebuilds components from scratch since she can't tell what's current
  • No visibility into whether existing components are accessible
  • Specs get lost or reinterpreted on the way to engineering
Goals
  • A component library she can trust is up to date
  • Confidence components already meet accessibility standards
  • Less time re-specifying basics, more time on the actual problem
IS

Ibrahim Sheikh

35 · Frontend Engineer · Studio Nord

"If it's not in code with the props documented, it doesn't exist to me."

Pain Points
  • Design files show intent but not exact spacing or states
  • Rebuilds the same component every project since nothing's shared
  • No easy way to verify accessibility compliance before shipping
Goals
  • Installable components with documented props, not just Figma frames
  • Confidence components are accessible without re-testing every time
  • A clear changelog when the shared system updates

Journey Mapping

Scenario: Ibrahim adopts Meridian's Button component for the first time.

PhaseDiscoveryDocumentationInstallationFirst UseTeam Rollout
ActionSees Meridian mentioned in an engineering all-handsReads the Button page — props, variants, accessibility notesInstalls the package and drops it into a branchSwaps a hardcoded button, tests keyboard navigation himselfProposes the switch to his team's next sprint
Feeling🙂 Curious😌 Reassured🙂 Confident😊 Relieved🎉 Proud
OpportunityAnnounce with real components, not just a slide deckDocument accessibility behavior, not just visual specsMake install as easy as any other internal packageLet the component work correctly on the first tryGive teams a lightweight way to propose adoption to their lead
Phase 03

Ideate Phase

Reframing research insights as "How Might We" questions, then structuring the product around them.

Accessibility

How might we make accessibility something engineers don't have to think about?

Bake WCAG AA contrast, focus states, and ARIA labeling into the component itself, not a checklist someone has to remember.

Discovery

How might we help teams find a component before they rebuild it?

A searchable component index with live examples and a "who else uses this" list.

Trust

How might we show a component is current, not abandoned?

A visible last-updated date and version number on every component's page.

Flexibility

How might we support 7 teams' different needs without forking the library?

Composable components with documented slots and variants instead of locked templates.

Handoff

How might we stop design specs and code from drifting apart?

Tokens shared directly between Figma and the component library, not hand-copied by each team.

Adoption

How might we make it easy to propose a change without needing every team's sign-off?

A lightweight RFC process for extending or changing a shared component.

Information Architecture

Meridian — Library Structure
Foundations
  • Color tokens
  • Spacing scale
  • Typography scale
Components
  • Buttons & forms
  • Navigation
  • Cards & layout
Patterns
  • Empty states
  • Error handling
  • Loading states
Accessibility
  • Contrast guidelines
  • Focus & keyboard
  • Screen reader notes
Contribution
  • Proposing a component
  • Review process
  • Versioning & changelog

User Flows

Flow 1 · Reviewing a component before reuse

Engineer opens the Components index
Finds a candidate component with its accessibility status and usage list
Does it fit their use case?
Yes
Installs it directly into their codebase
No
Opens "Request a variant" and describes the gap
Either path is logged in the component's usage history. End.

Flow 2 · Proposing a new component

Designer opens the Contribution tab
Searches for anything close to what they need
Does something similar already exist?
Yes
Proposes extending it as a new variant
No
Submits a new component proposal for design review
Approved additions get versioned and added to the changelog. End.
Phase 04

Design Phase

From low-fidelity structure to a component library built around accessibility, composability, and clear documentation.

From Sketch to System

Low-fidelity
Mid-fidelity
Hi-fidelity
WCAG AA components
48 / 52
Buttons
Form fields

A Direction We Explored, Then Cut

Not every idea survived contact with engineers. A single mega-configurable Card component is the clearest example — and the reasoning behind cutting it shaped Meridian's whole approach to composability.

Cut after pilot rollout
9:41●●● 5G 100%
Card
22 configurable props
Show image
Show eyebrow badge
Compact density
Show footer actions
Interactive hover state
v0.3, Week 5 — one Card, every use case, 22 props to configure it.

Why it looked right on paper

Fewer components meant less to document and less to learn — one Card could become an info card, a stat card, a list item, or an empty state just by toggling props. It looked like the fastest path to consistency across 7 teams.

Why it was cut

  • In pilot feedback, engineers said the prop surface had become unreadable — most usages only ever combined the same 4 of 22 props, but every consumer still had to read all 22 to be sure.
  • Two teams shipped unsupported prop combinations that broke visually, because the mega-component allowed invalid states the design never intended to support.
  • It defeated the point of a system: reviewers could no longer recognize which "kind" of card they were looking at, reintroducing the inconsistency Meridian was meant to remove.

What replaced it

Four focused, purpose-built card components composed from the same shared primitives — matching the "composable, not one-size-fits-all" principle set in the design strategy above.

Visual Style Guide

Display — Fraunces
One system, seven teams
Body — Inter
This variant doesn't meet a 4.5:1 contrast ratio against the surface token.
Data — JetBrains Mono
--color-accent-600
Color System

Indigo

#32335C

Amber

#9C7419

Stone

#7C7F94

Paper

#F0F1F5

Rust

#B24444

Iconography

Indigo and amber replace the neutral grayscale most internal tools default to, so Meridian-built products still read as considered rather than generic; the rust token is reserved for destructive and error states only, never routine emphasis, so it keeps its meaning across 7 teams' products. Contrast ratios for every token pairing are documented, not assumed — see Accessibility below.

Key Screens

The Meridian documentation site, itself built entirely from Meridian components — the library proving its own rules.

9:41●●● 5G 100%
Meridian
v2.4 · 52 components · 7 teams adopted
WCAG AA components
48 / 52
Buttons
Form fields
Navigation
Library home — adoption status across all 7 teams, at a glance.
9:41●●● 5G 100%
Components
52 total · filter by status
ButtonStable
Used by 7 teams
Date PickerBeta
92% match Review
Legacy ModalDeprecated
Migration guide →
Component browser — status badges make adoption risk visible before install.
9:41●●● 5G 100%
Button
Stable · v2.4 · 4 variants
ContrastPrimary on paper

Verified 4.9:1 against --color-paper at every supported size. Below AA fails the build.

Keyboard focus ring
Reduced-motion variant
Component detail — every accessibility claim is measured, never assumed.
9:41●●● 5G 100%
Milestone reached
Migration · Team 6 of 7

Notifications team completed migration. One team left to full adoption.

Team adoption — quiet, factual progress tracking, not a leaderboard.
9:41●●● 5G 100%
Contribution guide
Propose or migrate a component
Passes automated a11y checks
Uses design tokens, no hardcoded values
Documented with usage examples
Contribution checklist — the bar for entry is a checklist, not tribal knowledge.

Anatomy of the Library Home

Every element on the flagship screen traces back to a specific research finding.

9:41●●● 5G 100%
Meridian
v2.4 · 52 components · 7 teams adopted
WCAG AA components
48 / 52
Buttons
Form fields
Navigation
1
2
3
4
5
1

Version and scope up top

The audit found teams couldn't tell which library version they were on — the header now states it plainly, every screen.

2

AA compliance, not a vague promise

Replaces "accessible by design" marketing language with a real, countable ratio teams can hold the library to.

3

Category order follows real usage

The most-adopted component categories surface first, so the highest-leverage gaps are never buried.

4

Amber used only where attention is earned

The one category below target uses the accent color — color signals a decision point, not decoration.

5

Bottom nav sits in the thumb zone

All five destinations are reachable one-handed — see the reachability study below.

Inclusive Design

Accessibility & Trust Cues

A design system is only as accessible as its weakest component — every token pairing and touch target was checked before it shipped, not after a team complained.

Color contrast

Aa
Indigo on PaperAAA10.55 : 1 — body text & headings
Aa
White on IndigoAAA11.91 : 1 — primary buttons & nav
Aa
Amber Deep — icons & large text onlyAA4.26 : 1 on white, 3.78 : 1 on paper — flagged for large text/icons only

Dynamic type support

100% — default
This variant doesn't meet a 4.5:1 contrast ratio.
150% — accessibility size
This variant doesn't meet a 4.5:1 contrast ratio.
Hard reach
Stretch
Easy reach

One-handed reachability

Primary actions, the status card, and the bottom navigation all sit in the bottom two-thirds of the screen — the zone a thumb reaches without a grip shift, enforced as a layout guideline for every product team.

Accessibility is enforced, not just documented

Every component ships with an automated contrast and focus-order check in CI — a component that fails WCAG AA can't merge, regardless of how it looks in Figma.

  Automated a11y check required to merge
Click through it

Try the Prototype

This isn't a screenshot — it's a working slice of the actual review flow tested in the study below. Tap the flagged component, then merge, escalate, or defer.

9:41●●● 5G 100%
Components
3 flagged for review this week
Date PickerBeta
92% test coverage Review →
ButtonStable
CI passing
Why we flagged this
Date Picker · Beta · 3 open issues
IssueKeyboard nav

Flagged because automated tests found arrow-key navigation doesn't wrap across month boundaries. Test coverage: 92%.

Choose a fix path
Date Picker · Beta · 3 open issues
✅ Merge the proposed patch
🧑‍💻 Escalate to component owner
🔁 Keep in Beta (defer)
Reviewed

Logged — Date Picker stays on the review queue until the keyboard-nav fix merges.

Updated

Meridian will notify every team using Date Picker once it moves out of Beta.

↑ Live demo — tap to interact
1

Browse this week's flagged components

Components CI wasn't fully confident about surface first, with a test-coverage score attached.

2

Review the reasoning

Tap in to see exactly why a component was flagged — never a black box.

3

Merge, escalate, or defer in one tap

Every path is logged against the component's history — no separate tracker required.

Phase 05

Usability Testing

Moderated testing with the engineers and designers who'd actually adopt Meridian, to validate whether the documentation and review flow held up in practice.

Method

8 participants (2 engineers and 1 designer from each of 4 pilot teams), moderated remote sessions via Maze, testing four core tasks: finding the right component in the browser, reading its accessibility notes, integrating it into an existing screen, and understanding why a component was flagged Beta.

Session recording · Task 2 — reading a component's accessibility notes

● Rec — Participant 0603:41 / 07:52
Participant 06 · reacting to the contrast-ratio badge, 03:41 "Wait — 4.9 to 1? Against what, though... oh, okay, I see, it's the paper token specifically. Huh. That's actually kind of nice, an actual number, not just 'Accessible ✓.' [laughs] Yeah okay, I'd trust that one without asking design to double-check."

This reaction — relief once the number was shown, paired with an instinct to distrust an unexplained badge — showed up in 5 of 8 sessions and directly shaped Finding 03 below.

01

Status pills went unnoticed at a glance

6 of 8 participants picked a Beta component without registering its status — the pill only appeared on the detail page, not in the browse list.

Made the status pill always visible next to the component name, in the list and the detail view.
02

"Tokens" and "Components" were confused

Several participants expected a component's tokens to live inside its own docs page, not a separate top-level section.

Added a "Uses these tokens" cross-link block directly into every component detail page.
03

Participants wanted proof, not just a badge, of accessibility

Engineers trusted "4.9:1 measured" far more than a plain "Accessible" checkmark with no number attached.

Replaced every pass/fail badge with the actual measured contrast ratio.

Component integration task success

Before iteration
58%
After iteration
94%

Developer confidence score (0–100)

Before iteration
61
After iteration
88
Results

Outcomes & Reflection

Validated through iterative usability testing across all 4 pilot teams ahead of a full 7-team rollout.

2.3x
Faster design-to-dev handoff, measured across pilot teams
48/52
Components WCAG AA compliant at launch
94%
Component-integration task success, up from 58%
7/7
Product teams adopted Meridian within the rollout window

What I learned

Documentation is only useful if it's impossible to miss — hiding accessibility status behind a detail page defeats its purpose. I also learned how much a measured number beats a claimed badge: engineers didn't want to be told a component was accessible, they wanted the ratio, so they could judge it themselves.

What's next

Next steps include closing the remaining 4 components to full WCAG AA compliance, building a Figma plugin that surfaces the same contrast data at design time, and partnering with each team's tech lead to retire the last of the pre-Meridian one-off components.