Grace Lee

Building a design system people could use consistently

I consolidated a fragmented design-to-engineering workflow into a token-driven Figma system, giving teams one shared source of truth and cutting specification-related questions by roughly half. As adoption grew, I introduced component-level tokens to make intended design choices the default.

Design systemsDesign–engineering workflow
One source of truth
Sketch, Zeplin, and InVision consolidated into Figma.
~50% fewer spec questions
Engineers could inspect tokens directly in Dev Mode.
Better defaults, fewer overrides
Component-level tokens encoded intended styles into reusable patterns.
Design tokens mapping to components and front-end variables

The system surface: design tokens and components on one side, the front-end variables they map to on the other.

01 — The problem

A design system spread across too many tools

I had previously led dotData’s first design system in Sketch. As the product suite grew, maintaining it became difficult.

Handoff was spread across Sketch, Zeplin, and InVision, creating version drift and repeated clarification with engineering. The problem was not just missing components; we lacked a dependable way to communicate design decisions.

“Which spec is the real source of truth for this sprint?”

Front-end engineers · sprint feedback
The legacy update flow across Sketch, Zeplin and InVision

A component change had to be synchronized across Sketch, Zeplin, and InVision before engineering could implement it confidently.

02 — The foundation

One shared language for design and code

I rebuilt the system in Figma and replaced hard-coded values with a token architecture. Core tokens defined raw values such as color, spacing, and typography; semantic tokens expressed intended roles, such as text-primary or surface-secondary.

I aligned with front-end engineering on the implementation direction. Figma variable names mapped to CSS variables, and the core and semantic token layers were implemented in code.

Token reference chain: component resolves to semantic resolves to core

Component decisions resolve through semantic roles to core values, making both intent and global impact clear.

03 — The architecture

Separate foundations from product-specific patterns

I split the library into two tiers.

Studio Foundation

Shared tokens, controls, and layout patterns.

Studio Components

Data-aware product patterns such as entity cards, tables, and evaluation charts.

This protected the shared foundation while giving product teams room to evolve complex workflows. Contribution guidance clarified where new patterns belonged.

Within these components, I also defined behavior for real data. For example, ER cards kept long field names to one line with ellipsis truncation, preserving a consistent card height and scanning rhythm across different schemas and states.

Studio Foundation — buttons, controls and color primitives — beside Studio Components — entity-relationship cards, table preview and evaluation charts

Studio Foundation holds buttons, controls and color primitives shared across every product; Studio Components builds data-aware patterns — entity-relationship cards, table previews and evaluation charts — on top of it.

Component behavior: handling real data
ER card variants beside the inspected text style, showing one-line clamp with ellipsis truncation

ER cards preserve a consistent scanning rhythm across schemas and states. Long field names are constrained to one line and truncate with an ellipsis, while the text region flexes within the available card width.

04 — Adoption and outcome

Make the intended choice the default

A shared library improved handoff and reduced specification questions, but it did not guarantee consistent use. Documentation and peer review helped, but neither scaled reliably.

I introduced component-level tokens so reusable components carried their intended styles by default. This reduced unnecessary overrides and made system guidance part of the design workflow rather than something teams had to remember.

The system replaced fragmented handoff with a shared, token-driven workflow. Core and semantic tokens were implemented with engineering; component-level tokens were ready on the design side when I left.

My involvement

As design system owner, I led the V1.0 and V2.0 re-architecture: defining token and library architecture, aligning with front-end engineering, and evolving governance as adoption exposed gaps.

Next projectDesigning a Human–AI Production Workflow