Module audit
Mapped every component across 5 dashboard modules — identified 32 chart variations, 3 different table patterns, and 4 conflicting filter styles.
Creating a scalable design foundation for a data-heavy B2B analytics platform
| Segment | ARR | Status |
|---|---|---|
| Enterprise | $840k | Active |
| Mid-market | $410k | Review |
| SMB | $120k | Active |
A Series B healthcare analytics company with 200+ hospital clients needed to unify their rapidly growing dashboard product. Multiple teams were building features independently, resulting in inconsistent data visualizations, conflicting interaction patterns, and a fragmented user experience that was showing up in customer churn feedback. I led the design system initiative to bring coherence to the platform while supporting fast-paced feature development.
Mapped every component across 5 dashboard modules — identified 32 chart variations, 3 different table patterns, and 4 conflicting filter styles.
Shadowed 4 clinical analysts using the dashboards. Noticed they opened multiple modules side by side — inconsistent layouts forced them to re-learn each view.
Talked with 3 frontend engineers about pain points. Maintaining duplicate component code was eating ~20% of their sprint capacity.
Foundations and components documented with the same precision as product UI—tokens first, then patterns.
Consistent color tokens and palettes for scalable themes
A flexible type system with predefined roles and scales
Structured spacing, sizing, and corner rules
An icon set designed to stay clear and meaningful
Responsive grids for consistent layouts
Depth and elevation styles that add clarity
Key choices that shaped the system
Shared system. Teams were already duplicating work — 32 chart variations existed because each module built its own. A single source of truth meant fixes and improvements reached all modules at once.
Teal. The brand blue was too saturated for dense dashboard interfaces — it competed with status colors (red/amber/green). Teal provided enough contrast for interactive elements while staying calm at high density.
Both from day one. Setting up semantic tokens with day/night mapping added ~2 weeks upfront but saved months later. When a client requested dark mode for their NOC screens, we shipped it in 3 days.
Semantic tokens map to primitive scales so light and dark themes stay aligned while dashboards keep accessible contrast for dense data.
Brand (teal)
Mono
Semantic ramps (excerpt)
| Variable name | Day theme | Night theme |
|---|---|---|
| FG/Brand/Primary | Colors/Day/Brand/600 | Colors/Night/Brand/400 |
| FG/Brand/Secondary | Colors/Day/Brand/500 | Colors/Night/Brand/300 |
| FG/Brand/Hover | Colors/Day/Brand/700 | Colors/Night/Brand/500 |
| BG/Surface/Default | Colors/Day/Mono/White | Colors/Night/Mono/900 |
| Border/Subtle | Colors/Day/Mono/200 | Colors/Night/Mono/700 |
| Status/Success | Colors/Day/Success/600 | Colors/Night/Success/400 |
Automated checks against WCAG 2.1 are embedded in the token documentation so designers can ship accessible pairings without manual spreadsheet work.
Inter for every surface—one family, explicit roles, so dense dashboards and long-form docs stay readable.
Analytics overview
Cohort performance
Module summary
Card title
Dense UI stays readable with calm spacing and clear hierarchy.
Helper text for labels and metadata
Last updated · 2m ago
| Role | Size | Line | Weight |
|---|---|---|---|
| H1 | 32px | 40px | 700 |
| H2 | 24px | 32px | 600 |
| H3 | 20px | 28px | 600 |
| H4 | 18px | 26px | 600 |
| H5 | 16px | 24px | 600 |
| H6 | 14px | 20px | 600 |
| Role | Size | Line | Weight |
|---|---|---|---|
| Subtitle 1 | 16px | 24px | 500 |
| Subtitle 2 | 14px | 20px | 500 |
| Body 1 | 16px | 24px | 400 |
| Body 2 | 14px | 20px | 400 |
| Caption 1 | 12px | 16px | 500 |
A consistent scale creates rhythm across dense tables and marketing surfaces alike.
Token names follow #spacing-* mapped to pixel values.
Padding and gaps use the same token scale—this strip shows common increments as proportional widths.
| Scale | Variable name | Value | Representative UI |
|---|---|---|---|
| # 0 | radius-0 | 0px | Sharp data cells |
| # 0.5 | radius-0.5 | 2px | Micro chips |
| # 1 | radius-xs | 4px | Tags |
| # 2 | radius-sm | 6px | Inputs |
| # 3 | radius-md | 8px | Buttons |
| # 4 | radius-lg | 12px | Cards |
| # 5 | radius-xl | 16px | Modals |
Elevation is subtle. Shadows use low blur and tight opacity to keep focus on data.
Breakpoints share a single gutter language while column counts adapt to viewport width.
24×24 default canvas, 1.5px stroke on outline icons, filled variants for emphasis.
Line stroke 1.5 · 24×24
Core building blocks shared across navigation, forms, and data views.
Anatomy, sizing, and interaction states documented for handoff parity with Figma.
Padding is symmetric on the horizontal axis; vertical padding matches touch targets per size token.
Same label in every cell—read rows by state, columns by style.
Labels, inputs, and helper text follow one vertical rhythm; variants cover dense admin flows.
| Variant | Default | Hover | Typing | Focus | Error | Disabled |
|---|---|---|---|---|---|---|
| Outlined | ||||||
| Outlined filled | ||||||
| Lined |
Five visual treatments across semantic palettes—used in tables, filters, and timeline headers.
Composable modules for analytics workflows—tables, charts, and scheduling surfaces.
Toolbar, filters, and dense rows with consistent cell primitives.
| User | Status | Location | Tags | |||
|---|---|---|---|---|---|---|
Sam Lee Admin | Active | SF | sam@acme.io | OpsBeta | ⋮ | |
Ava Chen Viewer | Pending | NYC | ava@acme.io | Sales | ⋮ | |
Jon Rivera Editor | Terminated | ATL | jon@acme.io | HR | ⋮ | |
Mia Park Admin | Active | SEA | mia@acme.io | Ops | ⋮ | |
Leo Kim Viewer | Onboarding | CHI | leo@acme.io | CX | ⋮ | |
Nina Shah Editor | Active | SF | nina@acme.io | OpsPilot | ⋮ | |
Omar Ali Viewer | Pending | BOS | omar@acme.io | Rev | ⋮ | |
Pia Gomez Admin | Active | LA | pia@acme.io | Ops | ⋮ |
KPI tiles and chart modules share one framework for headers, filters, and footnotes.
The same semantic tokens drive both themes: surfaces, text, borders, and interactive colors remap at the system level so components stay consistent without one-off dark-mode hex values in product code.
| Name | Role | Status |
|---|---|---|
| Sam Lee | Admin | Active |
| Ava Chen | Viewer | Pending |
| Jon Rivera | Editor | Critical |
| Name | Role | Status |
|---|---|---|
| Sam Lee | Admin | Active |
| Ava Chen | Viewer | Pending |
| Jon Rivera | Editor | Critical |
Semantic tokens resolve to different primitives per theme—documentation and code reference the same names.
| Token name | Light value | Dark value |
|---|---|---|
| surface-primary | #FFFFFF | #1C1917 |
| text-primary | #1C1917 | #F5F5F5 |
| border-default | #E5E7EB | #374151 |
| interactive-primary | #0D9488 | #14B8A6 |
| surface-elevated | #F8F9FA | #262626 |
Measurable outcomes after the system reached production coverage.
All 5 modules now pull from one shared Figma library and codebase
Tracked via Jira — UI inconsistency tickets dropped from ~12/sprint to ~6/sprint
New dashboard views built in 2 days average vs. 5 days before the system
All color pairings validated against WCAG 2.1 AA — automated checks in token docs
Principles I carry into the next systems-heavy product.