Case Study · 2024–Present

← Back to Work

Tailwind Design System

A Tailwind CSS design system that eliminates the gap between Figma and production. OKLCH color tokens, Vue components, and shared scales make design-to-dev handoff feel like a non-event.

50% faster handoff Single source of truth 30+ components

Role

Design system lead · Sole designer

Team

Front-end engineers across product squads, engineering leads

Timeline

2024–present

Stack

Tailwind CSS v4, Vue.js, Figma

Design system overview
Why Build This

The product had grown organically for years. Different features had different visual languages. Spacing was inconsistent, colors drifted between hex values, and the same button existed in four slightly different implementations. Every feature I designed required re-establishing basic rules.

As the sole designer working with multiple engineering squads, I needed a system that spoke both languages. Designers think in tokens, variants, and compositions. Engineers think in utility classes, props, and state. The system had to bridge both.

Principles

Code is the source

Figma reflects code, not the other way around. Color tokens, spacing scales, and typography are defined in the Tailwind config first, then mirrored to Figma. This eliminates the "which version is right?" problem.

OKLCH everywhere

All colors use OKLCH for perceptual uniformity. A "blue-500" and "green-500" have the same perceived lightness. This makes the palette predictable across contexts and eliminates the need for manual adjustments.

Composition over configuration

Components are small and composable rather than monolithic with dozens of props. A card is a surface + padding + border, not a Card component with 15 variants. Engineers combine primitives instead of learning a proprietary API.

Components
Color tokens and OKLCH scale
Typography scale and component library
Buttons, inputs, and surface components
Technical Architecture

Tailwind v4 + Vue.js

The system runs on Tailwind CSS v4 with custom theme configuration. Vue components wrap common patterns with sensible defaults. The Tailwind config file is the design token source. Colors, spacing, typography, shadows, and border radii all live there.

Component registry

Every component is documented in a registry that lists its properties, variants, color mappings, and usage guidelines. This registry powers both the documentation site and the AI Figma plugin. The same metadata that helps designers understand a component also helps AI generate it correctly.

Audit

Starting with an honest audit

Before designing a single token, I audited the product as it actually existed. I captured every screen, pulled every color value out of the codebase, and grouped components that were meant to be the same thing. The results made the case on their own: dozens of near-identical grays, inconsistent spacing values, and four different buttons doing one job.

I shared the audit with engineering leads instead of a proposal deck. Seeing the inconsistency side by side did more to win buy-in than any argument about efficiency.

Rollout

Rolling it out without stopping the product

A full rewrite was never on the table; the product had to keep shipping. We agreed on an incremental approach:

  • New work uses the system. Every new feature is built with system tokens and components from day one.
  • Touch it, migrate it. When a squad changes an older screen, moving it onto the system is part of the work.
  • Tokens first. Colors, spacing and typography were migrated globally early on, so even untouched screens moved closer to consistency.
Obstacles

Bridging two very different tools

The hardest technical problem was keeping Figma and code genuinely in sync. The Tailwind config is the source of truth, but Figma’s variables don’t speak OKLCH natively, so tokens had to be converted carefully to stay visually identical in both places. Rather than maintain that mapping by hand, we generated it from the config, so changes flow from code into the design file and never the other way around.

The human side mattered as much. Engineers were wary of a designer-owned system slowing them down. Building it in their language (utility classes, small composable components, documented props) and reviewing component pull requests together turned it into a shared project rather than a mandate.

Collaboration

A system owned by design and engineering together

The system only works because engineering treats it as theirs too. I held a regular sync with the front-end leads to review upcoming work, agree on new components before anyone built a one-off, and retire patterns that had stopped earning their place.

Design QA moved into the pull request. Instead of comparing screenshots after release, I reviewed component changes alongside engineers, which caught drift while it was still cheap to fix and helped me understand the constraints they were working with.

Documentation was written for both audiences. Each component entry explains when to use it and when not to, shows the Figma and code versions side by side, and lists its props and variants. New engineers now learn the product’s visual language from the registry rather than by copying whatever screen looks closest.

Governance

Keeping it alive

A design system that isn’t maintained becomes another source of drift. New components follow a lightweight path: a proposal with real use cases, a build reviewed by design and engineering, and documentation in the registry before release. That same registry later became the foundation of the AI Figma Plugin, the clearest sign the system was built on solid ground.

Impact

System-level leverage.

50%

Faster design-to-development handoff

30+

Components documented and maintained

0

"Which version is right?" conversations since launch