Cymulate Design System

As Lead Product Designer, I built the design system from zero and evolved it over four years into a code-integrated platform powering the entire product.

Better delivery speed
80%
Less UI inconsistency

DESIGN // ENGINEERING // 2026

Cymulate Design System

[001] Problem

There was no design system when I joined Pages looked different from each other, engineers kept rebuilding the same components, and the codebase had zero theming, just hardcoded colors everywhere. Every new feature made the inconsistency worse.

[002] Constraints

I was the only designer on a live product with dense, data heavy screens.
Whatever system I built had to plug into production without slowing anyone down.

[003] Insight

Design systems don't break because of bad components. They break because no one owns what happens between Figma and code. Small mismatches pile up quietly and within months the codebase looks nothing like the designs. If the designer doesn't own the implementation layer, the system falls apart.

[004] Strategy

I structured everything with Atomic Design and built semantic tokens to separate visual decisions from code. Instead of names like blue-500 tokens like surface-primary carry meaning. Dark mode worked from day one, and adding light mode later became a config change, not a rewrite.

// Tokens

$color-primary: var(--color-blue-400);
$color-primary-hover: var(--color-blue-300);
$color-primary-focus: var(--color-blue-200);

$color-secondary: var(--color-neutral-700);
$color-secondary-hover: var(--color-neutral-600);
$color-secondary-focus: var(--color-neutral-400);

// Surface tokens

$color-surface-ground: var(--color-neutral-1000);
$color-surface-hover: var(--color-neutral-900);
$color-surface-selected: var(--color-blue-500);
$color-surface-selected-hover: var(--color-blue-600);
$color-surface-card: var(--color-neutral-900);
$color-surface-card-hover: var(--color-neutral-900);
$color-surface-menu: var(--color-neutral-800);
$color-surface-menu-hover: var(--color-neutral-700);
$color-surface-secondary-hover: var(--color-neutral-800);
$color-surface-border: var(--color-neutral-600);
$color-surface-border-subtle: var(--color-neutral-800);
$color-surface-overlay: var(--color-transparent-black);
$color-surface-shadow: var(--color-transparent-shadow);
$color-surface-highlight-100: var(--color-transparent-highlight-100);
$color-surface-highlight-200: var(--color-transparent-highlight-200);

// Severity tokens

$color-severity-info: var(--color-blue-100);
$color-severity-info-transparent: var(--color-transparent-primary);
$color-severity-success: var(--color-accent-green);
$color-severity-success-transparent: var(--color-transparent-green);
$color-severity-important: var(--color-accent-yellow);
$color-severity-important-transparent: var(--color-transparent-yellow);
$color-severity-warning: var(--color-accent-orange);
$color-severity-warning-transparent: var(--color-transparent-orange);
$color-severity-danger: var(--color-red-100);
$color-severity-danger-transparent: var(--color-transparent-red);
$color-severity-extra: var(--color-accent-purple);
$color-severity-extra-transparent: var(--color-transparent-purple);
$color-severity-unimportant: var(--color-accent-grey);
$color-severity-unimportant-transparent: var(--color-transparent-grey);

// Text tokens

$color-text-primary: var(--color-neutral-100);
$color-text-primary-invert: var(--color-neutral-1000);
$color-text-secondary: var(--color-neutral-200);
$color-text-light: var(--color-neutral-350);
$color-text-secondary-invert: var(--color-neutral-900);
$color-text-tertiary: var(--color-neutral-300);
$color-text-tertiary-invert: var(--color-neutral-800);
$color-text-selected: var(--color-blue-200);

// Button tokens

$color-button-primary: $color-primary;
$color-button-primary-hover: $color-primary-hover;
$color-button-primary-focus: $color-primary-hover;

$color-button-secondary: $color-secondary;
$color-button-secondary-hover: $color-secondary-hover;
$color-button-secondary-focus: $color-secondary-focus;

$color-button-danger: var(--color-red-200);
$color-button-danger-hover: var(--color-red-100);
$color-button-danger-focus: var(--color-red-100);

[005] Tokens

The token system has a multi-tier token architecture. raw values feed semantic names, which feed component overrides. Everything flows from one source. When the business asked for light mode, it was a variable swap, not a six month project.

the four interconnected Figma libraries — Fundamentals, Components, Design Patterns, and Icons — mirrored against their React, PrimeReact, and Sass counterparts in Storybook.

[006] Components

Four Figma libraries cover fundamentals, components, patterns, and icons, all mirrored in a React and Sass codebase. Every component has full variants, interaction states, and Storybook docs. Designers build screens in hours and engineers pull from one shared library.

[007] Code

I wrote the Sass for every component, built the mixins and utilities, and managed the token logic myself. I opened my own PRs and approved all design system code changes. No handoff, no translation errors. The designer was the implementer.

[008] Governance

I set up Storybook with engineering, documented every component in Figma, onboarded each new hire personally, and ran training for the full R&D org twice a year. Adoption stuck because people were taught the workflow, not just given a link.

[009] Execution

I owned the system end to end, working with a tech lead, a senior developer, and QA. The cycle was tight:
design in Figma, write the Sass, open a PR, review the integration. Ship fast, get feedback, iterate. The system had its own backlog like any product.

[010] Validation

I measured adoption through Storybook usage, Figma insert counts, and whether one off components showed up in code reviews. Components implementation went from days to minutes, complex flows from 1.5 weeks to 2 days.

[011] Outcome

The system became the shared language across R&D. Design reviews moved from pixel nitpicking to product thinking. Engineers stopped rebuilding basic UI. QA stopped filing visual bugs. 5 years in, I still contribute to both Figma and code. That dual ownership is what keeps it alive.