Back to projects Case Study
SaaS · B2B · Analytics
Design system · dashboard · data visualization

SaaS Platform Design System

Creating a scalable design foundation for a data-heavy B2B analytics platform

Analytics
Last 30 days
12.4k
Sessions
94%
Retention
$2.1M
Pipeline
Revenue by week
SegmentARRStatus
Enterprise$840kActive
Mid-market$410k
SMB$120kActive
Overview

Context

RoleLead Product Designer
Timeline10 months
Team5 designers, 8 engineers, 3 PMs
ToolsFigma, Storybook, Chart.js

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.

System map

What’s inside

Foundations and components documented with the same precision as product UI—tokens first, then patterns.

Color system

Consistent color tokens and palettes for scalable themes

Inter
Typography

A flexible type system with predefined roles and scales

Spacing and radius

Structured spacing, sizing, and corner rules

Icons

An icon set designed to stay clear and meaningful

Grid system

Responsive grids for consistent layouts

Shadows and blurs

Depth and elevation styles that add clarity

Foundations

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

Mono
11 colors
Brand
11 colors
Error
11 colors
Success
11 colors
Warning
11 colors
Info
11 colors

Primitive colors

Brand (teal)

#ccfbf1
#99f6e4
#5eead4
#2dd4bf
#14b8a6
#0d9488
#0f766e
#115e59
#134e4a

Mono

#fafaf9
#e7e5e4
#d6d3d1
#a8a29e
#78716c
#57534e
#44403c
#292524
#1c1917

Semantic ramps (excerpt)

Error
Success
Warning

Semantic variables

Variable nameDay themeNight theme
FG/Brand/PrimaryColors/Day/Brand/600Colors/Night/Brand/400
FG/Brand/SecondaryColors/Day/Brand/500Colors/Night/Brand/300
FG/Brand/HoverColors/Day/Brand/700Colors/Night/Brand/500
BG/Surface/DefaultColors/Day/Mono/WhiteColors/Night/Mono/900
Border/SubtleColors/Day/Mono/200Colors/Night/Mono/700
Status/SuccessColors/Day/Success/600Colors/Night/Success/400

Color contrast check

Text on surface
17.51
Contrast ratio · Brand on white
AAA Pass
Normal text · Large text

Automated checks against WCAG 2.1 are embedded in the token documentation so designers can ship accessible pairings without manual spreadsheet work.

Foundations

Typography

Inter for every surface—one family, explicit roles, so dense dashboards and long-form docs stay readable.

Type scale

H1 32px · 700

Analytics overview

H2 24px · 600

Cohort performance

H3 20px · 600

Module summary

H4 18px · 600

Card title

Body 16px · 400

Dense UI stays readable with calm spacing and clear hierarchy.

Small 14px · 400

Helper text for labels and metadata

Caption 12px · 500

Last updated · 2m ago

Heading scale

RoleSizeLineWeight
H132px40px700
H224px32px600
H320px28px600
H418px26px600
H516px24px600
H614px20px600

Body styles

RoleSizeLineWeight
Subtitle 116px24px500
Subtitle 214px20px500
Body 116px24px400
Body 214px20px400
Caption 112px16px500
Foundations

Spacing and radius

A consistent scale creates rhythm across dense tables and marketing surfaces alike.

Spacing

Token names follow #spacing-* mapped to pixel values.

0spacing-0
4spacing-1
8spacing-2
12spacing-3
16spacing-4
24spacing-6
32spacing-8
48spacing-12
64spacing-16
96spacing-24
128spacing-32
160spacing-40

Applied spacing

Padding and gaps use the same token scale—this strip shows common increments as proportional widths.

8px
12px
16px
24px
32px
48px

Border radius

radius-0
radius-0.5
radius-xs
radius-sm
radius-md
radius-lg
radius-xl
ScaleVariable nameValueRepresentative UI
# 0radius-00pxSharp data cells
# 0.5radius-0.52pxMicro chips
# 1radius-xs4pxTags
# 2radius-sm6pxInputs
# 3radius-md8pxButtons
# 4radius-lg12pxCards
# 5radius-xl16pxModals
Foundations

Shadows & blurs

Elevation is subtle. Shadows use low blur and tight opacity to keep focus on data.

Elevation

XSmall
Small
Medium
Large
XLarge
XXLarge

Shadow types

Drop shadow
Button-shadow
Focus-shadow
Input active

Background blur

S
M
L
XL
XXL

Effect styles

  • ☑ Shadow / elevation / sm
  • ☑ Shadow / elevation / md
  • ☑ Shadow / focus / brand
  • ☐ Shadow / inner / input
Foundations

Grid system

Breakpoints share a single gutter language while column counts adapt to viewport width.

Desktop · 12 columns

Column width: 72px · Gutter: 24px · Margin: 24px

Tablet · 8 columns

Gutter: 24px · Margin: 32px

Mobile · 4 columns

Gutter: 16px · Margin: 16px
Foundations

Icons

24×24 default canvas, 1.5px stroke on outline icons, filled variants for emphasis.

Outline

Line stroke 1.5 · 24×24

Solid

Components

Simple components

Core building blocks shared across navigation, forms, and data views.

Buttons
Input fields
ChipsChip
Avatars
BreadcrumbsHome / … / Label
BadgesActive
Pagination1 2 3 … 100 ›
Checkbox
Switch
TooltipPlain tooltip
Components

Buttons

Anatomy, sizing, and interaction states documented for handoff parity with Figma.

Anatomy

8px 8px 16px Button

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.

Filled
Tonal
Outline
Bare
Enabled
Hover
Active
Focus
Disabled
Components

Input fields

Labels, inputs, and helper text follow one vertical rhythm; variants cover dense admin flows.

Anatomy

Help text for validation and hints.

Input types

States matrix

VariantDefaultHoverTypingFocusErrorDisabled
Outlined
Outlined filled
Lined
Components

Status badges

Five visual treatments across semantic palettes—used in tables, filters, and timeline headers.

Filled
Tonal
Bare
Tonal-outline
Outline
Brand
Badge
Badge
Badge
Badge
Badge
Mono
Badge
Badge
Badge
Badge
Badge
Success
Badge
Badge
Badge
Badge
Badge
Error
Badge
Badge
Badge
Badge
Badge
Warning
Badge
Badge
Badge
Badge
Badge
Patterns

Complex components

Composable modules for analytics workflows—tables, charts, and scheduling surfaces.

TablesRows, filters, badges
StatisticsStats & trends
Pie chartsDonut metrics
MenuActions & shortcuts
CalendarsRange pickers
MessagesThreads & media
File uploaderStates & progress
+ moreMaps, filters…
Patterns

Data table

Toolbar, filters, and dense rows with consistent cell primitives.

User Status Location Email Tags
Sam Lee
Admin
ActiveSFsam@acme.ioOpsBeta
Ava Chen
Viewer
NYCava@acme.ioSales
Jon Rivera
Editor
TerminatedATLjon@acme.ioHR
Mia Park
Admin
ActiveSEAmia@acme.ioOps
Leo Kim
Viewer
OnboardingCHIleo@acme.ioCX
Nina Shah
Editor
ActiveSFnina@acme.ioOpsPilot
Omar Ali
Viewer
BOSomar@acme.ioRev
Pia Gomez
Admin
ActiveLApia@acme.ioOps
Showing 1–8 of 384 results 1 2 3 … 30 ›

Cell variants

Default
Title
Description
User
Name
Role
Badge
Active
Functional
Patterns

Statistics

KPI tiles and chart modules share one framework for headers, filters, and footnotes.

KPI tiles

Net revenue
$128k
vs last month
Encounters
12,480
WoW +3.2%
Completion
62%
Rolling 30d
CSAT
4.8
Risk score
74
Target 80

Bar chart widget

Monthly encounters
DWM
Interactive range · exports to PNG in documentation
Foundations

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

Actions
Form field
Stat card
Net pipeline
$2.1M
vs last quarter
Data table
NameRoleStatus
Sam LeeAdminActive
Ava ChenViewer
Jon RiveraEditorCritical
Status badges
Active Critical Inactive

Dark theme

Actions
Form field
Stat card
Net pipeline
$2.1M
vs last quarter
Data table
NameRoleStatus
Sam LeeAdminActive
Ava ChenViewer
Jon RiveraEditorCritical
Status badges
Active Critical Inactive

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
Outcome

Results

Measurable outcomes after the system reached production coverage.

5
Dashboard modules unified
~50%
Reduction in UI-related bugs
60%
Faster new feature development
100%
Accessible color contrast
Reflection

Key learnings

Principles I carry into the next systems-heavy product.

Data-heavy products need extra attention to information hierarchy — the design system must enforce visual clarity, not just consistency.
Involving engineers early in token naming and structure decisions led to much smoother adoption.