Consistent color tokens and palettes for scalable themes
SaaS Platform Design System
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 |
Context
A healthcare analytics startup 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. I led the design system initiative to bring coherence to the platform while supporting fast-paced feature development.
What’s inside
Foundations and components documented with the same precision as product UI—tokens first, then patterns.
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
Color system
Semantic tokens map to primitive scales so light and dark themes stay aligned while dashboards keep accessible contrast for dense data.
Color palette
Primitive colors
Brand (teal)
Mono
Semantic ramps (excerpt)
Semantic variables
| 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 |
Color contrast check
Automated checks against WCAG 2.1 are embedded in the token documentation so designers can ship accessible pairings without manual spreadsheet work.
Typography
Inter for every surface—one family, explicit roles, so dense dashboards and long-form docs stay readable.
Type scale
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
Heading scale
| 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 |
Body styles
| 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 |
Spacing and radius
A consistent scale creates rhythm across dense tables and marketing surfaces alike.
Spacing
Token names follow #spacing-* mapped to pixel values.
Applied spacing
Padding and gaps use the same token scale—this strip shows common increments as proportional widths.
Border radius
| 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 |
Shadows & blurs
Elevation is subtle. Shadows use low blur and tight opacity to keep focus on data.
Elevation
Shadow types
Background blur
Effect styles
- ☑ Shadow / elevation / sm
- ☑ Shadow / elevation / md
- ☑ Shadow / focus / brand
- ☐ Shadow / inner / input
Grid system
Breakpoints share a single gutter language while column counts adapt to viewport width.
Desktop · 12 columns
Tablet · 8 columns
Mobile · 4 columns
Icons
24×24 default canvas, 1.5px stroke on outline icons, filled variants for emphasis.
Outline
Line stroke 1.5 · 24×24
Solid
Simple components
Core building blocks shared across navigation, forms, and data views.
Buttons
Anatomy, sizing, and interaction states documented for handoff parity with Figma.
Anatomy
Padding is symmetric on the horizontal axis; vertical padding matches touch targets per size token.
Sizes
States × styles
Same label in every cell—read rows by state, columns by style.
Input fields
Labels, inputs, and helper text follow one vertical rhythm; variants cover dense admin flows.
Anatomy
Input types
States matrix
| Variant | Default | Hover | Typing | Focus | Error | Disabled |
|---|---|---|---|---|---|---|
| Outlined | ||||||
| Outlined filled | ||||||
| Lined |
Status badges
Five visual treatments across semantic palettes—used in tables, filters, and timeline headers.
Complex components
Composable modules for analytics workflows—tables, charts, and scheduling surfaces.
Data table
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 | ⋮ |
Cell variants
Role
Statistics
KPI tiles and chart modules share one framework for headers, filters, and footnotes.
KPI tiles
Bar chart widget
Dark mode
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.
Light theme
| Name | Role | Status |
|---|---|---|
| Sam Lee | Admin | Active |
| Ava Chen | Viewer | Pending |
| Jon Rivera | Editor | Critical |
Dark theme
| Name | Role | Status |
|---|---|---|
| Sam Lee | Admin | Active |
| Ava Chen | Viewer | Pending |
| Jon Rivera | Editor | Critical |
Token mapping
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 |
Results
Measurable outcomes after the system reached production coverage.
Key learnings
Principles I carry into the next systems-heavy product.