Skip to main content
ALL WORK

Everything I got wrong is why fourteen products trust it.

Design SystemTokensReactStorybook

PROJECT OVERVIEW

The DigiLawyer design system

From a Figma file to an installable package

May 2024: I was the only designer on DigiLawyer, and the same components started arriving in the build slightly wrong. There was nothing to check the build against. Two years and three iterations later, fourteen products are built on the system that fixed it.

Components
Design tokens
Versioned releases
Products built on it
COMPANY
BigOh Tech · started on DigiLawyer
TIMELINE
May 2024 – now · 3 iterations
ROLE
Product Designer
TEAM
Me and one developer; later two designers
RESEARCH
Built all 25 components twice — Figma and React — as the audit
SCOPE
Tokens, Figma, docs site, React, Storybook, npm package

THE SITUATION

The designs were consistent. The product wasn't.

I had defined primary, secondary and tertiary buttons, and a rule for when each applied. What shipped paired primary with secondary where the pattern called for primary and tertiary. It wasn't carelessness. There was nothing to check the build against.

These were not marketing pages: people use DigiLawyer to serve legal notices, sign agreements and e-stamp documents across twenty-plus states.

CORE CHALLENGE

Give the build something to check against — and make it the easiest thing to reach for.

THE USERS

Everyone who builds on it.

  • 01

    Developers

    They need the system in the codebase, not in a Figma file.

  • 02

    Designers

    The team that grew around me — two designers who had to use it without asking me.

  • 03

    Our CEO

    Technical, and interested only in what reaches production.

PAIN POINTS

Nothing to check the build against.

  • 01

    No source of truth

    The reference was whatever shipped last.

  • 02

    Verbal handoff

    Every correction was a conversation, and conversations leave no record.

  • 03

    No shared vocabulary

    I said “tertiary”. Nothing made tertiary mean one specific thing.

  • 04

    Fourteen frozen copies

    New projects copied DigiLawyer's code, so every fix stayed where I made it.

  • 05

    AI copying hex codes

    Handing Figma to a model gave sharp output that was fundamentally wrong.

THE PROBLEM

Every review turned into a bug hunt.

My time and my engineer's went into reconciling interface details instead of shipping the product. That is the argument I took to our CEO.

DESIGN GOALS

Design goals

  • 01

    Done means installable

    Not finished until a developer can npm install it.

  • 02

    One source of truth

    Every component from variables, every variable bound to a token.

  • 03

    Names that carry the spec

    XL (48px), not XL — nobody should have to click to find out.

  • 04

    Rules before anything is touched

    Written into the repository, so AI and people follow them first.

SOLUTION

The stack, one layer deeper each time

  • 01

    Design tokens

    Primitive, semantic, component — three tiers.

  • 02

    Figma components

    Light and dark.

  • 03

    Documentation site

    Every component, every state, versioned, with a changelog.

  • 04

    React components

    The same 25, built a second time.

  • 05

    Storybook

    The library, live and interactive.

  • 06

    Published npm package

    Installed like any other dependency.

COMPONENTS

25 components

  • Button
  • Button Group
  • Checkbox
  • Radio Button
  • Toggle Switch
  • Dropdown
  • Text Input
  • Text Area
  • Upload Media
  • Slider
  • Rating
  • Date Picker
  • Options
  • Avatar
  • Alert
  • Badge
  • Breadcrumb
  • Link
  • Pagination
  • Progress Bar
  • Snackbar
  • Table
  • Tabs

DECISIONS & TRADE-OFFS

Key decisions and trade-offs

  • 01Three token tiers, not a flat list

    Decision

    A flat list of named colours was faster and would have cleared the duplication in front of me. It breaks on the first rename.

    Trade-off

    A layer of indirection — two hops before you reach a hex. It buys that reassigning a colour never touches a component.

  • 02Port one-to-one, improve nothing

    Decision

    I built all 25 components a second time in React without fixing anything on the way, so the second build worked as an audit of the first.

    Trade-off

    Twenty-five components again, with no visible progress to show for it.

  • 03Pitch it as variables

    Decision

    Our CEO thinks in code, so I described the system as what his developers already did with variables. His condition: show me in a week.

    Trade-off

    Five components in seven days, then three more months for the first working system — with no dedicated time.

  • 04Keep going when told it wasn't my job

    Decision

    A senior developer said Storybook, React and the docs weren't a designer's part. I built them anyway.

    Trade-off

    Done isn't where I stand. It's where the person using my work stands.

PROCESS

From discovery to handoff

  • Section rhythm: 120px margin, 56 · 32 · 24 · 48 steps
    SPACINGSection rhythm: 120px margin, 56 · 32 · 24 · 48 steps
  • 12 columns, 120px margins, 24px gutters
    GRID12 columns, 120px margins, 24px gutters
  • The CTA: 32px padding, 8px icon gap, icon left or right
    COMPONENTThe CTA: 32px padding, 8px icon gap, icon left or right
  • Components in the product: status, model picker
    IN USEComponents in the product: status, model picker
  • The documentation site
    DOCSThe documentation site
  • Button: the Primary + Tertiary rule
    BUTTONButton: the Primary + Tertiary rule
  • Button in Storybook
    STORYBOOKButton in Storybook

OUTCOMES

The bug tickets dried up

  • COMPONENTS

    25

  • DESIGN TOKENS

    160+

  • VERSIONED RELEASES

    130

  • PRODUCTS BUILT ON IT

    14

Today 3 designers work in the Figma library and 20+ developers build with the React package. The tokens, components and releases give 14 themed variants for 14 products, and setting up a design system for a new product went from one or two months to about 30 minutes. The conversation I took to our CEO — engineering and I reconciling UI instead of building features — stopped happening. A fix is published once and reaches every product. Observed across the months after adoption, not tracked on a dashboard; the numbers above are instrumented, in the public repo.

REFLECTION

Done isn't where I stand

REFLECTION

A design system isn't finished when it looks right in Figma. Done isn't where I stand. It's where the person using my work stands.

What's next: blocks

Pick a hero from ten versions, copy it, paste it into a project that already has the package, change the content. A section live in ten minutes instead of an afternoon.