Skip to content
← All work
Case study · ASU Learning Engineering Institute

Tailwind UDS

A design system where designers and AI tools speak the same language.

Our team builds AI tools for teachers and students. The existing design system was made for websites, in Bootstrap, while every AI coding tool writes Tailwind. So I extended it into one system where Figma variables, CSS tokens, and component classes all match.

Full case study coming soon. This is a short version while I rebuild it with the full evidence.

See the full prototype
My role
Design System Engineer
Team
SDE team, ASU LEI · with Nishad Patne, Manmeet, Omkar
Timeline
6 months · Sept 2025 – Feb 2026
Used in
ReQuesta · AIX Framework
Components
70+

In 30 seconds

The problem

We were building apps with a system built for websites. AI tools wrote Tailwind; our system spoke Bootstrap.

The decision

Build on Tailwind, with a token structure where one decision creates a whole family of classes.

The result

353 + 164 tokens, 70+ components, and code that works the first time, live in the AIX Framework app.

01 · Context

6 months, 5 phases, one system.

From research to production, built alongside the products that use it.

  1. 01 · Sept 2025DiscoveryEvaluated the existing system. Found the Bootstrap and AI-tool gaps.Done
  2. 02 · Oct 2025Foundation353 primitive and 164 theme tokens; token-to-class mapping.Done
  3. 03 · Nov 2025Components70+ components, annotated in Figma with class references.Done
  4. 04 · Dec – JanImplementationExported to CSS, Tailwind config, live in AIX Framework.Done
  5. 05 · Feb 2026 →ScaleStorybook and automated Figma-to-code sync.
    In progress
How to read thisFour phases are complete. Scale is ongoing; the bar shows the average of its two workstreams.
02 · The problem

We were building apps with a system made for websites.

Every sprint needed workarounds. The team said it best.

G
Gaurav UX Designer

Every time a requirement changed, I had to detach the component and rebuild it. If we're detaching every time, what's the point of a design system?

Designer pain
M
Manmeet Developer

Copilot and ChatGPT always output Tailwind classes. Our system used Bootstrap, so I translated every class by hand.

Dev bottleneck
N
Nishad UX Designer

We needed a dropdown, a multi-step form, a tab panel. None of it existed, so everyone built one-offs.

Consistency gap
O
Omkar Developer

AI gave me Tailwind. The design system gave me Bootstrap. It wasn't a design problem. It was a system mismatch.

System mismatch
From the teamFour teammates, four versions of the same problem, one shared sigh. The messages replay in a loop, much like the problem did.

ASU UDS, before

Bootstrap, it's not you, it's us.

Bootstrap · about 12 components · website only · built in XD

AccordionsButtonsCardsFormsHeader and footerHeroesListsTabbed panel

Tailwind UDS, after

Tailwind · 70+ components · ready for apps · built in Figma · works with AI

AlertsBadgesBottom navigationChat bubbleChartsDropdownsModalsPaginationSkeletonTableToastTooltips+40 more
03 · Why Tailwind

I tested before committing.

I read the docs, then prompted AI tools and generated real component code with MCP. The output was Tailwind every time.

In plain wordsA design system is a shared kit of parts (buttons, forms, colors) so every screen looks and works the same. Ours had to match the code that AI tools write, and those tools write Tailwind.

Performance

Lightweight by design

Unused CSS is removed before deploy. Only what's in the UI ships.

AI compatibility

AI already speaks Tailwind

Copilot, ChatGPT, and Claude default to it. Matching it means AI code works right away.

Design to code

One token, many classes

Define brand once and Tailwind generates every class around it.

brand
bg-brandtext-fg-brandborder-brandring-brandbg-brand-softbg-brand-mediumbg-brand-stronghover:bg-brand
How to read thisOne theme token on the left; the utility classes it generates appear on the right.
04 · Token architecture

Change one token, update everything.

Primitives hold raw values. Themes give them roles. Components only reference themes, so they adapt to light and dark mode.

In plain wordsA token is a named design decision, like "brand color = ASU maroon". Change it once, and every button, link, and border that uses it updates everywhere.

Components70+

Button textbg-brandtext-whiterounded-basetext-base
↑ references

Theme tokens164 · light + dark

bg-{color}text-{color}border-{color}text-{size}rounded-{size}
↑ maps to

Primitives353

Maroon 700 = #8C1D40spacing 36font sizes 11
How to read thisRead from the bottom up. Raw values become roles, and roles become components.

Familiar names on top, Tailwind underneath.

Tailwind is inline by default. I used SCSS @apply to group utilities into named classes like .btn and .form-input, so developers write btn btn-brand and the Tailwind engine runs quietly underneath.

.btn-brand {
  @apply bg-brand text-white
         rounded-base font-medium;
}
05 · Components

Every variant, every state, documented.

Each component has flexible properties, variants, and states, plus usage notes and class names annotated right in Figma.

SolidGhostOutline
BrandButtonButtonButton
SecondaryButtonButtonButton
SuccessButtonButtonButton
DangerButtonButtonButton
DefaultDefault
HoverHover
FocusFocus
DisabledDisabled
HelperA recreation of the button spec in ASU maroon and gold. The same matrix exists for alerts, badges, and forms.
Design tokens
Semantic tokens like bg-brand instead of hard-coded values
Accessibility
Keyboard navigation, focus indicators, screen-reader labels
06 · In a real project

I shipped it in AIX Framework, then sat with the developer to get it right.

Before writing a line, I asked him how the class names should feel. He knew Bootstrap, so we kept it simple: btn btn-brand, not long utility chains.

In plain wordsA color picked in Figma flows automatically into the code, so what designers draw is exactly what developers ship. No copying values by hand.

  1. Figma variablesmaroon/700 #8C1D40 bg-brand → light: maroon/700
  2. designtokens.css@theme { --color-maroon-700: #8c1d40; }
  3. styles.scss.btn-brand { @apply bg-brand text-white; }
  4. Live component<button class="btn btn-brand">✓ Works first time
How to read thisA token's path from the design file to a working button. The highlight follows it step by step.
Before

Manual export → paste into CSS → verify → fix mismatches → repeat

After

Token in Figma → synced to CSS → developer uses the class → done

07 · Impact

What shipped.

353

Primitive tokens: colors, spacing, type, borders

164

Theme tokens, light and dark

70+

Components, annotated

1

Source of truth

Early token decisions compound

One bad primitive name breaks every component downstream. The structure has to be right from the start.

Clarity enables speed

Class names that match what developers and AI already use meant almost no adoption friction.

Go deeper: governance and what's nextHow the system stays organized, and what I'm automating now

Every component tracked from idea to annotation.

I planned and tracked the system in Coda, so the team had one shared source of truth.

ComponentStates and shadesAnnotationsNotes
ColorsDoneDone
AlertsDoneDone
AccordionDoneNot startedAdd multilevel accordion
ButtonsDoneIn progress
CardsDoneNot startedFont updated to Neue Haas Grotesk
Chat bubbleDoneNot started
HelperA few rows from the real tracker.
1

Design-to-dev workflow

Every component followed the same path: definition, states, annotation, handoff.

2

Biweekly health checks

Regular reviews kept the system reliable and cut repeat cleanup.

3

Ownership and review

Clear owners and lock-in points before anything went to code.

The system is live. Now I'm automating what's still manual.

Storybook

60%

An interactive code reference for every component, not just a Figma link.

Figma API + Claude Code + MCP

30%

Read tokens straight from Figma and write them to designtokens.css, removing the manual export.

Design engineer role

80%

Writing SCSS, pairing with developers on naming, reviewing Storybook, building the pipeline.

Where this is going

Most design systems stop at documentation. This one is building toward a world where the design file is the codebase.

Your move.

Open to Product Designer roles anywhere in the US.

gaurav.inbox29@gmail.com