← Back to Portfolio
Case Study

Enterprise Design System

Building a living design language system to unify 15+ product teams, supporting 4+ products with 20+ modules through continuous evolution and collaboration

Role Lead UX Designer
Timeline 8 months
Team 4 designers
Year 2024-2025

The Challenge

⚠️

Inconsistent UI

15 product teams were building features independently, resulting in 47 different button styles and 23 color variations across the platform.

⏱️

Slow Development

Engineers spent 40% of their time recreating common UI components instead of building new features.

🔀

Poor User Experience

Users reported confusion navigating between different product modules due to inconsistent patterns and terminology.

📈

Scaling Problems

Rapid company growth meant new designers were spending weeks learning undocumented patterns.

Research & Discovery

Understanding the Problem Space

We conducted a comprehensive audit and research phase to understand the full scope of the inconsistency problem:

01

UI Audit

Catalogued all existing UI patterns across 15 products, identifying 200+ unique components with overlapping functionality.

02

Stakeholder Interviews

Interviewed 25+ designers, engineers, and product managers to understand pain points and needs.

03

Competitor Analysis

Studied design systems from companies like Atlassian, Shopify, and IBM to understand best practices.

04

Technical Assessment

Evaluated existing tech stack and determined Angular + TypeScript with Node.js backend as the foundation for our component library.

Key Insights

  • Teams wanted to move fast but needed clear guidelines and pre-built components
  • Engineers preferred code-first documentation with live examples
  • Designers needed a single source of truth in Sketch with shared libraries
  • Visual consistency and standardization were critical for brand integrity

Design System Strategy

Based on our research, we developed a three-pillar strategy to create a living design language that could scale across multiple products:

1

Atomic Design Methodology

Structured components from atoms (buttons, inputs) to organisms (forms, cards) to templates, ensuring consistency and reusability.

2

Inclusive Design

Built-in dark mode support and color vision deficiency considerations ensure components work for all users across different viewing preferences and visual needs.

3

Documentation as Product

Treated documentation with the same rigor as product features, including usage guidelines, code examples, and do's/don'ts.

Design Process

Phase 1: Foundations (Weeks 1-6)

  • Established design tokens for colors, typography, spacing, and elevation
  • Created brand guidelines and visual language with dark mode and light mode themes
  • Built foundational atoms: buttons, inputs, icons, typography
  • Set up Sketch library structure with symbols and shared styles
  • Implemented color palettes optimized for color vision deficiency

Phase 2: Core Components (Weeks 7-16)

  • Designed and built 35 core components (forms, navigation, modals, tables)
  • Conducted usability testing with 5 product teams
  • Iterated based on feedback and edge cases
  • Established component API guidelines for engineers

Phase 3: Documentation & Patterns (Weeks 17-24)

  • Published comprehensive Sketch artboards with detailed specifications
  • Created UX writing guidelines and content patterns
  • Documented common design patterns (empty states, loading, errors)
  • Developed implementation guides and best practices documentation

Phase 4: Adoption & Scale (Weeks 25-32)

  • Piloted with 3 product teams for feedback
  • Established governance model and contribution process
  • Created automated testing and visual regression tools
  • Rolled out to all teams with training workshops

Key Design Decisions

1. Design Tokens Architecture with Theme Support

We implemented a three-tier token system with built-in dark mode and color vision deficiency support:

Token Hierarchy with Theme Support
// Tier 1: Core tokens (brand colors, theme-aware)
--color-primary-light: #0066FF;
--color-primary-dark: #66B2FF;

// Tier 2: Semantic tokens (purpose-driven)
--color-action-primary: var(--color-primary-light);
[data-theme="dark"] { --color-action-primary: var(--color-primary-dark); }

// Tier 3: Component tokens (context-specific)
--button-background-primary: var(--color-action-primary);

This approach enabled seamless theme switching between light and dark modes while ensuring all color combinations meet visibility standards for users with color vision deficiency.

2. Component Variants vs. Separate Components

After testing with teams, we chose to use variants over separate components for related UI elements:

✓ Chosen Approach

Single Button Component

One button component with variant props: size, type, state

  • Easier to maintain
  • Consistent API
  • Better for designers
✗ Rejected

Multiple Button Components

PrimaryButton, SecondaryButton, GhostButton, etc.

  • More code to maintain
  • Inconsistent patterns
  • Harder to update

3. Sketch-First Workflow

We established a design-to-code workflow where Sketch is the source of truth:

  1. Design component in Sketch with all symbols and states
  2. Review with design team and stakeholders
  3. Publish Sketch artboards with detailed specifications (dimensions, colors, spacing)
  4. Engineer builds Angular component using published Sketch specs
  5. Design team reviews implementation against original Sketch designs

Component Showcase

Here are some examples of key components we built:

Button System

3 types × 3 sizes × 5 states = 45 variants, all built from one component

Form Inputs

Accessible inputs with built-in validation, error states, and help text

Card Title
Card content goes here with automatic spacing

Card Component

Flexible container with header, content, and footer slots

ℹ️ This is an informational alert message

Alert System

4 severity levels with icons, dismissible variants, and actions

Governance & Adoption

Building a Sustainable System

We established clear processes to ensure long-term success:

Contribution Model

Created an RFC (Request for Comments) process for new components. Teams could propose new components with use cases, which the design system team would evaluate and prioritize.

Office Hours

Held weekly office hours where teams could get help implementing components, ask questions, and provide feedback on pain points.

Versioning Strategy

Implemented semantic versioning with clear deprecation warnings, giving teams time to migrate before breaking changes.

Metrics Dashboard

Built analytics to track component adoption, bundle size, and performance metrics across all products.

Adoption Journey

3 teams
Month 1
8 teams
Month 3
15 teams
Month 6

Impact & Results

60%
Faster Feature Development
Teams reported shipping features 60% faster by using pre-built components instead of building from scratch
85%
UI Consistency Score
Platform-wide consistency increased from 34% to 85% based on automated audits of component usage
95%
Component Reusability
95% of new features built using existing design system components without custom code
40%
Reduction in Design Debt
Decreased unique UI patterns from 200+ to 35 standardized components
4 people
Design Team Efficiency
4-person design team successfully supporting 4+ products with 20+ modules simultaneously
4.8/5
Team Satisfaction
Average rating from quarterly surveys of designers and engineers using the system

Next Steps

The design system continues to evolve based on team needs and product requirements:

  • Advanced Patterns: Building complex patterns like data visualization, multi-step flows, and dashboards
  • Mobile Components: Extending the system to support Ionic Angular for mobile apps
  • Animation Library: Creating a suite of micro-interactions and transitions for enhanced user experience
  • Design Automation: Exploring Sketch plugins that auto-generate code from designs
  • Localization: Adding i18n support and RTL language capabilities