Lessy design system overview: foundations, token cascade, and component library on a soft teal background.
Design system · 2023

One source of truth for design and engineering.

I built Lessy's design system in Figma in close partnership with one front-end developer, so a brand tweak shipped in a single token edit instead of a global find-and-replace.

RoleLead Product Designer
ClientLessy
Year2023
DisciplinesDesign system · Tokens · Documentation

Brief

Build a single design language for the Lessy platform so designers and engineers worked from one source of truth. The product was scaling, the team was small, and every new feature was paying a tax in re-drawn buttons, drifting colour values, and hand-off ambiguity. The system needed to remove that tax.

Problem

The same patterns kept being re-invented across screens. Hex values lived inline in components, so a brand tweak meant a global find-and-replace and a long QA tail. Interaction states drifted between surfaces because nothing pulled from a shared role layer. Hand-off relied on screenshots and memory rather than a named library.

My role

As Lead Product Designer, I led the system end-to-end in close partnership with one front-end developer:

  • Audit of inconsistencies across the existing UI
  • Token architecture: hex, primitive, role layers
  • Figma library: foundations, components, variants, states
  • Documentation for designers and engineers
  • Hand-over and adoption support across two sprint cycles
Outcome

One source of truth, shipped at speed.

+30%
front-end development efficiency, measured across two sprint cycles before and after rollout
356
reusable components in Figma
1
unified token system: hex → primitive → role
2
people, the whole team: one designer, one front-end developer

Foundations

Four foundations carried the system: colour, typography, iconography, spacing. Each was defined once, at primitive and role level, so every screen pulled from the same well instead of redrawing the bucket.

  • Colour. A primitive palette wrapped in role tokens, so brand tweaks travelled through the system in one edit.
  • Typography. A single scale for headings, body, and captions, so hierarchy read the same on every screen.
  • Iconography. A drawn-from-one-hand icon set, so the visual voice did not break between flows.
  • Spacing. Named tokens for layout rhythm, so margins and gutters stopped being decided per-screen.
Foundations usage page: colour, typography, iconography and spacing rules laid out as guidance.
Foundations: one well, four taps.

Token architecture

I chose three layers because two would not have been enough. A single hex-to-component cascade meant every brand tweak forced a global find-and-replace; a single primitive layer would have coupled colour intent to colour value. A third role layer broke that coupling: surface, border, interactive, on-surface. Components reference roles, never raw values.

Components reference roles, never raw values.

That single rule was the architectural decision the rest of the system hung off. A brand tweak became a one-line token edit. Interaction states stayed consistent because every component pulled from the same role layer. Engineers stopped chasing colour drift across the codebase.

The cascade

Hex codes sat at the base as raw values. Primitives wrapped them as named variables so a colour could be referred to by name, not number. Role tokens mapped primitives to functional jobs, so a component asked for surface rather than for a specific blue.

Diagram showing three layered rows: hex codes feeding primitives, primitives feeding role tokens, role tokens powering components.
Hex → Primitive → Role: a brand tweak now ships in one PR, not two hundred.
Primitive colour swatches: full palette of named colour values that sit between raw hex and role tokens.
The primitive layer: every colour in the system, named once.

Components

I scoped the library around the patterns the product was already re-inventing: interactive controls, forms, feedback, cards and chips, and navigation. Each pattern was named, drawn once, wired to roles, and given the states it needed.

  • Interactive. Buttons, checkboxes, switches.
  • Forms. Inputs, dropdowns, pickers.
  • Feedback. Alerts, badges, banners.
  • Containers. Cards and chips for grouping and tagging.
  • Navigation. Header and footer patterns that adapted to viewport.
Component library overview: rows of interactive controls, forms, feedback, cards, chips and navigation patterns from the Lessy library.
Library shape: composable parts, drawn once, wired to roles.

Button language

I froze the variant count at three (primary, secondary, tertiary) and resisted the pressure to add a fourth. A fourth variant would have signalled a missing primitive, not a new pattern. Holding the line forced new asks to compose from existing parts instead of inventing alongside them.

Each variant carried the same anatomy and the same state coverage: disabled, loading, hover, pressed, focus-visible. Engineering implemented one component, designed once, and shipped a whole language.

Button matrix: three variants (primary, secondary, tertiary) across all interaction states (default, hover, pressed, focus, disabled, loading).
Three variants, full state matrix: composition over invention.

Adoption

The system shipped into production over two sprint cycles. I tracked front-end build time on equivalent tickets before and after rollout: the same kind of feature, picked up by the same developer, took roughly a third less time to ship once components, tokens, and states pulled from the library instead of being rebuilt per screen.

The headline lift was 30% on front-end build time, but the effect engineering noticed first was quieter: brand tweaks stopped triggering long QA tails, and design hand-offs stopped relying on screenshots.

Live Lessy product screen showing components from the system in production: navigation, cards, and form controls pulling from role tokens.
In production: live screen composed entirely from library components.
Live Lessy product screen showing forms, buttons and feedback patterns from the system, exercised on a real flow.
Same library, different surface: tokens and components doing their work in flow.

Where it shipped

The Lessy onboarding and dashboard work that followed in 2023 ran entirely on this system: the same tokens, the same components, the same states. The dashboard composed from the library; it never invented around it. That is the system doing its job.

Methods

How the system came together: a token spine, a Figma library, paired hand-over with engineering, and documentation that lived where the work was being done.

Responsive web Component library Documentation Developer hand-over Interaction design Branding Tokens
See the system in production →

Lessy · Onboarding & Dashboard