Not just components. A system that scales, themes, and documents itself.

Not just components. A system that scales, themes, and documents itself.

TEAM

1 Product Designer (me)

TIMELINE

2 months

METHODS

Token architecture · Component design · Accessibility (WCAG AA contrast) · Documentation

TYPE

Design System / Concept project

BACKGROUND

Pulse was built as the final project of a design systems course — and treated as if it were real.

CHALLENGE

How might we build a design system flexible enough to support multiple brand identities — without requiring a designer to manually update every component every time?

20+

20+

Reusable components built and documented in Figma

4 Brand Themes

4 Brand Themes

All driven by a single token change

Live Documentation

Live Documentation

Live documentation site — browsable by designers and developers

Live documentation site, browsable by designers and developers

My Process

My Process

1

2

3

4

5

DEFINE

Scope + token structure

FOUNDATIONS

Color, type, spacing, grid

COMPONENTS

20+ modular pieces

THEMES

4 brand variants

DOCUMENT

4 brand variants

Starting From Scratch

Starting From Scratch

The brief was open: build a scalable, token-based system from scratch. Every structural decision — how to name tokens, how many components to scope, how to handle accessibility, how to document for developers — was mine to make. I used existing systems like Material Design as reference, then deliberately chose a simpler naming convention I could defend and explain to any developer in a handoff.

Design Goals

Design Goals

1.

Establish strong design foundations

Establish strong design foundations

2.

Token-based theming

Token-based theming

3.

Build reusable, responsive components

Build reusable, responsive components

4.

Document usage guidelines

Document usage guidelines

3 decisions that shaped the system

3 decisions that shaped the system

Numeric token naming over semantic naming

Numeric token naming over semantic naming

I reviewed several naming conventions including Material Design's semantic approach (e.g. "on-primary", "surface-variant"). While semantic names communicate intent, they create confusion when building out color styles — you need to memorize what each name maps to. I chose a numeric scale (primary-100 to primary-1000) because any designer or developer can immediately understand the relationship between values without a reference guide. Lower number = lighter. Higher number = darker. No lookup needed.

Tradeoff: less intent-signaling, more immediately readable

Scoping components deliberately — not exhaustively

Scoping components deliberately — not exhaustively

A design system can always have more components. The risk is building components nobody uses, or building them before the patterns that justify them exist. I scoped Pulse to 20+ components that cover the most common UI patterns — navigation, forms, feedback, data display — rather than trying to be comprehensive. Every component in the library has a documented use case. None exist just to pad the count.

Tradeoff: smaller library, higher quality and documentation per component

WCAG AA contrast as a non-negotiable baseline

WCAG AA contrast as a non-negotiable baseline

Every color in the system was checked against WCAG AA contrast ratios (4.5:1 for text) using Figma's contrast checker before being committed to the token library. Accessibility wasn't a final review step — it was a constraint applied during color selection. This meant some aesthetically appealing colors were rejected because they failed at the text sizes the system needed to support.

Tradeoff: some colors rejected for aesthetic reasons — accessibility won

WCAG AA contrast as a non-negotiable baseline

Every color in the system was checked against WCAG AA contrast ratios (4.5:1 for text) using Figma's contrast checker before being committed to the token library. Accessibility wasn't a final review step — it was a constraint applied during color selection. This meant some aesthetically appealing colors were rejected because they failed at the text sizes the system needed to support.

Tradeoff: some colors rejected for aesthetic reasons — accessibility won

Design Goal 1:
One source of truth for color, type, and spacing.

Design Goal 1:
One source of truth for color, type, and spacing.

Every visual decision in Pulse traces back to a defined token. Change the token, change the entire system — no manual updates, no inconsistencies.

Goal 1

Goal 1

Design goal 2 :
4 themes. 1 token changeeach.

Design goal 2 :
4 themes. 1 token change each.

Light, Dark, Blue, and Rose themes aren't separate systems — they're the same system with different token values. Swap the palette, the entire product follows.

Goal 2

Goal 2

Design goal 3 :
Built from atoms up. Documented before shipped.

Design goal 3 :
Built from atoms up. Documented before shipped.

Every component is composed from smaller primitives. Nothing ships without a usage guideline — what it's for, when to use it, and what to avoid.

Goal 3

Goal 3

Goal 3

Design goal 4 :
A design system no one can find is a design system no one uses.

Design goal 4 :
A design system no one can find is a design system no one uses.

Pulse lives on a dedicated documentation site — browsable by designers and developers without opening Figma. Built via vibe coding; designed entirely by me.

Goal 4

Goal 4

Goal 4

What I'd do differently

What I'd do differently

Semantic Alias Tokens

Semantic Alias Tokens

Add semantic alias tokens on top of the primitive scale — names like "color-button-primary" that reference "primary-500" would make the system more developer-friendly in a real handoff context.

Test With Developer

Test With Developer

Test the documentation site with a developer — I designed for clarity, but I never validated whether a developer could actually find what they needed without help.

Create a free website with Framer, the website builder loved by startups, designers and agencies.