← All work

Case Study 02/04 · Design System

Design System — Unified Library

Scaling Consistency Across Products — one source of truth for a fragmented product ecosystem.

Client
Bank CenterCredit
Services
Design System Team
Industry
Design System
Date
2024–2026

One bank, forty different buttons

Two departments — individual banking and business owners — split across roughly 40 product teams spanning mobile, desktop, and internal services. Every team was designing on its own: buttons looked different, typography shifted from product to product, and developers often rebuilt the same component from scratch. It slowed everyone down and confused users moving between products that were supposed to feel like one bank.

My first task on the 7-person DS team was running the design audit that quantified this: cataloguing components across both departments, in Figma and in what had actually shipped in code.

~12
button variants doing the job of 3
40+
shades of "primary blue" in active use
~35%
drift between the design library and the dev library

Approximate — from the initial cross-department audit

That drift wasn't carelessness — it was teams quietly hardcoding components because the shared library didn't cover what their product owner needed.

Start with agreement, not components

Core existed to shorten the time it took to make any kind of change. Instead of updating the same button in five different files, a change was made once, in one source — Core — and synced out to every product on the platform from there.

Before drawing a single button, the priority was getting design and engineering to agree on a shared vocabulary. I proposed an atomic structure — tokens, atoms, molecules, components, organisms, and patterns — so both disciplines could point at the same layer and mean the same thing.

Tokens
color, spacing, type, effects
Atoms
buttons, inputs, icons
Molecules
form fields, list rows
Components
cards, modals, nav bars
Organisms
page sections
Patterns
full flows

Tokens were a team decision — I was one of the core contributors on color, typography, spacing, and effects.

For the numeric tokens (spacing, sizing), we used a scale that skips numbers — 50, 100, 200, 300, 400 — instead of counting 1, 2, 3, 4. That gap between steps was deliberate:

50 100 150 200 300 400

When a product genuinely needed a value between two steps — like 150 between 100 and 200 — it slotted in without renaming anything above it.

Governance was treated as part of the design work itself, not an afterthought: who could propose a new component, how a change would migrate across live products, and how teams outside the core group could contribute back.

Building Core, layer by layer

  • Defined tokens first (color, spacing, type, effects) as a team, so every layer above inherited the same foundation — I contributed to and cross-checked this layer against live products.
  • Built atoms and molecules, then assembled them into components, organisms and full patterns.
  • Wrote governance rules and a migration process so existing products could adopt Core without a full rebuild.
  • Opened a contribution path so product teams could propose additions instead of forking their own components.

Part of the library

A slice of Core in practice — charts, financial widgets, badges, checkboxes, empty states — built from the same tokens and structure, reused across products instead of rebuilt per team.

A page from the Core component library — charts, financial widgets, badges, checkboxes, and empty states

Charts, financial widgets, badges, checkboxes and empty states, all pulled from the same Core library

Core
Mobile
Desktop

How one component became two

Every mobile and desktop component pulled its base from Core, then tailored it for the platform — same logic, same tokens, different shell.

When developers went around the system

Conflict

Even with a contribution path open, developers kept hardcoding components when the library didn't cover an edge case their product owner needed on a deadline — common enough across ~40 teams that it became a recurring meeting. Being embedded in the junior banking product myself, and knowing Core from the DS side, meant I could sit in those calls and translate both ways: assess whether the request was a real gap in Core or a one-off, then propose a version that solved the product's problem without forking the component.

Keeping Core alive, not just launched

Public DS channelUpdates, process changes, and releases for a fully remote team.
Weekly design syncWalking designers through DS changes and Figma updates.
AI tone-of-voice checkA Figma/text plugin catching copy errors before review.
Git branch namingfeat/ds-*, fix/ds-*, chore/ds-*, deprecated/ds-*
Figma branch namingStatus emoji · team · feature · version · responsible — e.g. 🟢 Core · Buttons · v2 · @muslima. 🟢 ready to dev, 🟡 in review, ⚫️ archived — legible at a glance, no need to check Jira.
Weekly library checkAuditing drift and publishing updates so Core stayed a source of truth.

What changed

Approximate, adjusted for confidentiality

Components (consolidated from near-duplicates)

Before
~120
After
~35

Design-to-dev drift

Before
~35%
After
<10%

To check whether Core actually helped day to day, I timed product designers building the same screen two ways in Figma: once with the Core component library, once with one-off, legacy elements.

Time for a product designer to build a screen

Without
~2.5x
With
1x

Without the component library, building the same screen took roughly 2.5x longer.

30%
faster delivery of new features
5+
fintech products unified, across ~40 contributing teams
1
shared language across design & engineering

Core is now the shared library every product team builds from, instead of a set of guidelines teams quietly worked around. Designers and developers use the same components, with the same names, and don't have to double-check whether a screen was built from the real library or a one-off copy.