E.05 Elanco / Design System / CLIB v1 → v2 · 2023–2024
Elanco

One vocabulary, Figma to production.

Following the Bayer Animal Health acquisition, Elanco inherited a fragmented ecosystem spanning 400+ products — and a print-first brand PDF as its only design guidance. As Lead UX Designer & Researcher I owned system definition, interface direction, and product alignment: I audited the component library, then rebuilt the foundation as a Tailwind-aligned system documented in Figma — every token and component carrying its literal utility class name, mirrored 1:1 by engineering in Storybook. Design, code, and docs stopped being translations of each other.

IndexDesign-to-code parity · Tailwind CSS · Tokens · Storybook · Governance · Interface inventory
RoleLead UX Designer & Researcher · DS owner
TeamFE · solution eng · data/AI · EKS Ops · sales
StackFigma · Tailwind · Storybook
ShippedCLIB v2 · ElancoGPT · UpLook
SP.01 Color · Primary
SP.02 Type · Open Sans Aa
SP.03 Token · Radius
SP.04 Screens · 6
xs 320 · sm 640 · md 768
lg 1024 · xl 1280 · 2xl 1536
SP.05 Components 56 families
SP.06 Icons · Heroicons 881
SP.07 Design–code parity 1:1
SP.08 Source of truth tailwind
.config.js
00Starting point
A brand PDF is not a design system — every CLIB component graded keep, kill, merge, or enhance.
DS.01 The audit

Start with the inventory, not the redesign.

What existed: brand colors and logo usage for print collateral; Open Sans everywhere because a Helvetica Neue license was refused; no icon or illustration set; and CLIB — a component library reverse-engineered from high-fidelity wireframes, marketing-heavy, with no architecture planning behind it. The goal wasn’t to throw everything away — it was to read the UX gaps and answer one question: what do we keep, what do we kill, what gets merged, and what needs enhancing for a real product workflow?

Before designing anything I ran a content inventory and interface audit with Jordan (lead front-end) and Ryan Knopp (solution engineering): every component graded keep, kill, merge, or enhance. The audit is what earned engineering’s trust before a single new component was drawn.

Jan 2023 · with lead FE + solution engineering
DS.02 Audit ledger
Found

Components sourced from hi-fi wireframes; no discovery, no architecture planning; marketing components outnumbering product primitives.

Graded

Full inventory against seven criteria: accessibility, theming, responsiveness, browser support, functionality, maintainability, and Elanco look & feel.

Decided

Keep the working primitives, kill the wireframe artifacts, merge duplicates — and rebuild the foundation on a vocabulary engineering already spoke: Tailwind.

01Parity
One source of truth — the same class name in the Figma layer, the CSS, and the story.
DS.03 The core decision

Don’t invent a naming layer.

Every color step, type size, spacing value, and breakpoint in the Figma master doc is named by its literal Tailwind utility — so a designer’s spec, an engineer’s markup, and the Storybook doc are the same words. Handoff stopped being translation.

Design · Figma

Tailwind Master Doc

Tokens, type, breakpoints, spacing / shadows / radii, 56 component families, the full Heroicons set — every layer named by its utility class.

bg-elanco-950 · text-xl · rounded-md
Shared · Tailwind config

One tailwind.config

The Elanco scales, type stack, and breakpoints live as the config engineering builds with — the token sheet is the code.

colors: { Elanco: { 50…950 } }
Engineering · Storybook

CLIB v2

Jordan’s team mirrored each family as stories under the same names, tested four ways: accessibility, interaction, snapshot, visual regression.

Button / Input / Alert / Navbar…
G.01 System principles

Principles, not preferences.

Maintain the Elanco look and feel, but make the system robust enough for data-driven and AI-powered products — themes and screen sizes where needed, with accessibility, responsiveness, and consistency written into the definition of done. The system was designed as a living document, shaped by business and user needs rather than frozen as a style guide.

Brand fidelity · structural rigor · a living document
G.02 Governance

Ownership was designed, not assumed.

I clarified ownership through a design-system owner and a cross-functional team — solution engineers, front-end, data/AI, EKS Operations, and sales — with defined approval and maintenance processes for changes, updates, and bug fixes. The MVP shipped in parallel workstreams: repository setup, the Figma system file, and implementation guidance — one shared document between design, development, and product.

DS owner · approval process · feedback loops · parallel rollout
02Tokens
The real Elanco scale — brand #0072CE preserved as the 950 anchor, rendered from its own hexes.
colors.Elanco · 50 → 950 · as declared in the tailwind.config and the Figma variable set engineers write bg-elanco-500 · designers pick the layer with the same name
DS.04 Tokenize

Brand blue becomes a 50–950 scale.

Each brand color is anchored as a named step, then extended into a fifteen-step, contrast-tested ramp in Tailwind’s shape. The scaffold had to serve 400+ Elanco sites — enough range for any product to feel distinct, one vocabulary so none of them drift. Engineers reference the step by class, never by hex.

tints.dev generation · Tailwind v3.3.2 alignment
DS.05 Primary · Navy · Teal — rendered live
DS.06 Type system · 3 semantic + 9 utility — rendered live
DS.07 Type

A type system, not just a scale.

Three reading sizes — Extra Small, Small, and Body — then nine display steps, text-xl through text-9xl, 20 up to 128 px. Every step is a named Figma text style with its size and leading baked in. A designer picks the style named text-2xl; the engineer writes the class named text-2xl. Same word, same output.

Extra Small 12/16 · Body 16/24 · text-9xl 128/128 · one type system
DS.08 Screens

Six breakpoints, drawn at their real widths.

Phone at 320 through 2XL at 1536 — Tailwind’s screens config, transcribed as Figma frames at those exact pixel widths. Responsive behavior was designed against the same six numbers the CSS compiles to, so a breakpoint bug is a config bug, never a guess.

xs 320 · sm 640 · md 768 · lg 1024 · xl 1280 · 2xl 1536
DS.09 Drag the handle — the layout reflows through the Tailwind screens
lg · 1024px sm 640 → 2xl 1536
Elanco Blue
Navy
Teal
Sand
DS.10 Buttons & state banners — the real components
Success — changes published to clib-v2.
Warning — this component is deprecated in the next release.
Error — two fields need attention before you can continue.
bg-elanco-950 · rounded-md · shadow-sm · states the brand PDF never defined
DS.11 Form fields — default, focus, error, disabled
Default
Focus
Error
Disabled
Select
Choice
rounded-md · shadow-sm · same class in the Figma layer and the markup
DS.12 Spacing · 4pt grid
p-14px
p-28px
p-312px
p-416px
p-624px
p-832px
p-1248px
p-1664px
p-2496px
DS.13 Radius · rounded
rounded-none
rounded
rounded-md
rounded-lg
rounded-full
Named by utility class — the radius a designer picks is the radius the build ships.
DS.16 Icons · Heroicons — the dashboard set, 881 glyphs
search
home
dashboard
chart-bar
bell
user
filter
calendar
export
add
more
Every glyph in the system is a Heroicon — no bespoke icons to maintain, one license, one visual weight.
03Artifacts
The documentation itself — actual exports from the Figma master doc.
AR.01 The master doc, one sheet
Master doc component sheet: button states, pagination, calendar weekday headers, alert variants, input field states, and Tailwind color scales for Slate, Gray, Red, Amber, Emerald, and Blue
The master doc, one sheet. Buttons, alerts, inputs, calendar primitives, and the Tailwind scales they draw from — every icon a Heroicon, every color a named step.
AR.02 Walked through live
The master doc, walked through live. A recorded pass through the Figma file — pages, variables, component sets, and how the Tailwind naming reads in the layers panel.
AR.03 UpLook on the system
UpLook redesigned on the system: Knowledge Solutions header, sites sidebar, diets table built from CLIB v2 components
UpLook on the system. The EKS Modernization redesign, shipped entirely on these components.
04Outcomes
What held — handoff stopped being a translation problem.
DS.14 What held

Handoff stopped being a translation problem.

Because design, config, and Storybook shared one vocabulary, adoption needed no evangelism — an engineer read a Figma layer and already knew the class to write. The audit earned buy-in before the rebuild; the naming decision kept it without governance overhead. What shipped was a shared document design, engineering, and product could all cite without a decoder ring. The system became the base for the UpLook redesign and created the conditions for fast-moving work like ElancoGPT to feel coherent and trustworthy — a living component library that supports product work over time.

O.01 Handoff 1:1 Design–code parity

Every token & component named by its literal Tailwind class — zero translation layer.

O.02 Adoption Day one No evangelism needed

Engineers already spoke the vocabulary; no bespoke naming system to learn.

O.03 Quality gates 4 test types In CLIB v2

Accessibility · interaction · snapshot · visual regression.

O.04 Velocity 3→10d Concept to production

The shared vocabulary collapsed handoff: ElancoGPT designed in three days, shipped in ten.

05Reflection
Defend / redo.
R.01 What I’d defend

Choosing leverage over authorship.

The instinct is to design a bespoke naming system and own it. Borrowing Tailwind’s vocabulary meant the system had no author to route questions through — drift became structurally impossible, and any engineer was fluent on day one because they already spoke it. Restraint was the design decision.

R.02 What I’d do differently

Run discovery on the library itself, sooner.

CLIB v1 existed because components were extracted from wireframes without asking who needed them. I inherited that lesson instead of preventing it — the audit should have been a standing practice from v1, not a rescue mission at v2.