Healthcare/2021-2022

Summit Health Design System

Built a comprehensive design system from the ground up, establishing reusable components and design patterns that reduced development time by 20-30% and unified the patient experience across mobile and web platforms.

Year
2021-2022
Status
Completed
Typology
Design System
Client
Summit Health (VillageMD)

Overview

Summit Health (now VillageMD) is a medical care provider offering primary and specialty care across New York, New Jersey, and Oregon. Patients access their services through mobile apps and web, where they can review medical records, schedule appointments, communicate with providers, and check test results.

The challenge

Summit Health didn't have a real design system. Patients saw inconsistent interfaces across mobile and web—different buttons, different layouts, different experiences depending on where they were in the app. Engineers were building similar components over and over, creating technical debt and slowing down development.

My role

I built the design system from the ground up. That meant creating reusable components in Figma, collaborating with engineers on implementation, establishing design patterns, documenting everything, and supporting teams as they adopted the system.

Research & discovery

I started by talking extensively with the engineering team to understand their pain points and workflow. Engineers were spending significant time recreating UI elements and dealing with inconsistent component behavior. It was clear we needed a foundation, but not an overwhelming one.

Component foundation strategy

Rather than trying to build every possible component upfront, I focused on a base set of highly reusable pieces. The strategy was pattern creation—teach teams how to combine foundational components to build complex UI without needing custom components for every use case. This meant faster initial implementation, more flexibility for product teams, less maintenance burden, and a system that could actually scale.

Design system foundations

Color system & visual direction

This was one of the harder problems to solve. Healthcare is already intimidating for a lot of people—the last thing we wanted was an interface that felt clinical, rigid, or scary. Someone's checking their lab results. Color can actually help calm the mood when you're reading medical tests.

Early designs skewed too clinical—sterile whites and grays that felt like a hospital. We needed something more welcoming and expressive while still maintaining trust and seriousness. Through testing and feedback, we landed on a coral and navy palette that feels approachable without losing professionalism. A more expressive app genuinely helps people feel less anxious.

Live Preview

Primary Colors

Click to copy
Brand Coral#EC6560

Primary actions and key brand moments

Click to copy
Navy Blue#132A53

Secondary actions and trust-building elements

Neutral Palette

Click to copy
Text Primary#1A1A1A

Main text color

Click to copy
Text Secondary#6B6B6B

Secondary text color

Click to copy
Border/Divider#E5E7EB

Borders and dividers

Click to copy
Background#F3F4F6

Background color

Semantic Colors

Click to copy
Success Green#10B981

Success states

Click to copy
Success Background#ECFDF5

Success background

Click to copy
Error Red#EF4444

Error states

Click to copy
Disabled Gray#9CA3AF

Disabled states

tsx
import SummitColorPalette from '@/components/live-components/SummitColorPalette'

<SummitColorPalette />

Typography system

We used a dual-font approach: Buenos Aires for warmth in headers and display text, DM Sans for clarity in body copy and UI elements. The combination balances personality with readability.

Live Preview
FontWeightSizeLine HeightUsageExample
DM SansRegular (400)12px / 0.75rem16pxCaptionsLast updated: Jan 5, 2024
DM SansRegular (400)14px / 0.875rem20pxSecondary bodyAdditional information and supporting text.
DM SansRegular (400)16px / 1rem1.7Body textThe quick brown fox jumps over the lazy dog.
DM SansSemibold (600)16px / 1rem1.5Buttons, emphasisSubmit Form
DM SansBold (700)18px / 1.125rem1.6HeadingsMedical Records
Buenos AiresBold (700)20px / 1.25rem1.4SubheadingsForm Fields
Buenos AiresSemibold (600)24px / 1.5rem1.3Section headingsComponent Library
Buenos AiresRegular (400)32px / 2rem1.2Display headingsDesign Engineer
tsx
import SummitTypographyTable from '@/components/live-components/SummitTypographyTable'

<SummitTypographyTable />

Component library

Buttons

Three variants: primary, secondary, and ghost. Buttons can include icons (left or right) and support default, hover, focus, and disabled states. 12px border radius, semibold (600) font weight.

Live Preview

Primary Buttons

Secondary Buttons

Ghost / Tertiary Buttons

tsx
import { Button } from '@/components/ui/button'

// Primary Button
<Button variant="primary" icon={Plus}>
  With Icon
</Button>

// Secondary Button  
<Button variant="secondary" icon={Video}>
  Setup video and audio
</Button>

// Ghost Button
<Button variant="ghost" icon={ArrowRight} iconPosition="right">
  Learn More
</Button>
tsx
import { Button } from '@/components/ui/button'

// Primary Button
<Button variant="primary" icon={Plus}>
  With Icon
</Button>

// Secondary Button  
<Button variant="secondary" icon={Video}>
  Setup video and audio
</Button>

// Ghost Button
<Button variant="ghost" icon={ArrowRight} iconPosition="right">
  Learn More
</Button>

Form fields

Input fields, select dropdowns, date pickers, checkboxes—each with consistent styling, validation states, and accessibility support.

Live Preview

Create Account

Fill in your information to get started

Must be at least 8 characters

<SelectField label=\"Gender\" options={[ { value: 'male', label: 'Male' }, { value: 'female', label: 'Female' }, ]} required />" language="tsx" />

tsx
import { InputField, SelectField } from '@/components/ui/form'

<InputField
  label="Email Address"
  type="email"
  placeholder="john.doe@example.com"
  required
/>

<SelectField
  label="Gender"
  options={[
    { value: 'male', label: 'Male' },
    { value: 'female', label: 'Female' },
  ]}
  required
/>

Cards

Card components show how to combine base components for common patterns like appointment cards and lab results displays.

Live Preview

Virtual Appointment

05
JAN

Dr. Annette Black, MD

Internal Medicine

10:30 AM - 11:00 AM (30 mins)

Virtual visit

In-Person Appointment

12
JAN

Dr. Sarah Johnson, MD

Cardiology

2:00 PM - 2:45 PM (45 mins)

tsx
import { AppointmentCard } from '@/components/ui/appointment-card'

<AppointmentCard
  date="05"
  month="JAN"
  doctorName="Dr. Annette Black, MD"
  specialty="Internal Medicine"
  time="10:30 AM - 11:00 AM"
  duration="30 mins"
  isVirtual={true}
/>
Live Preview

Result details

TEST NAME
Triglyceride
Units: mg/dL
100120170<200

Triglyceride

120 mg/dL
Desireable120-170 mg/dL
Borderline100-119 mg/dL or 171-200 mg/dL
High risk> 200 mg/dL

Result details

TEST NAME
Glucose
Units: mg/dL
7070100<140

Glucose

85 mg/dL
Normal<100 mg/dL
Prediabetes100-125 mg/dL
Diabetes≥126 mg/dL
tsx
import { LabResultsCard } from '@/components/ui/lab-results-card'

<LabResultsCard
  testName="Triglyceride"
  value={120}
  unit="mg/dL"
  minRange={100}
  maxRange={200}
  optimalMin={120}
  optimalMax={170}
/>
tsx
import { AppointmentCard } from '@/components/ui/appointment-card'

<AppointmentCard
  date="05"
  month="JAN"
  doctorName="Dr. Annette Black, MD"
  specialty="Internal Medicine"
  time="10:30 AM - 11:00 AM"
  duration="30 mins"
  isVirtual={true}
/>
tsx
import { LabResultsCard } from '@/components/ui/lab-results-card'

<LabResultsCard
  testName="Triglyceride"
  value={120}
  unit="mg/dL"
  minRange={100}
  maxRange={200}
  optimalMin={120}
  optimalMax={170}
/>

Data table

One of the most-used components in the system. Designed for displaying large datasets with row selection, sorting, and actions so users can efficiently navigate complex information.

Live Preview

Medication Records

Manage and view patient medication history

Medication
Dosage
Frequency
Prescribed By
Status
Lisinopril10mgOnce dailyDr. Sarah JohnsonActive
Metformin500mgTwice dailyDr. Michael ChenActive
Atorvastatin20mgOnce dailyDr. Sarah JohnsonActive
Levothyroxine75mcgOnce dailyDr. Annette BlackActive
Omeprazole40mgOnce dailyDr. Michael ChenDiscontinued
Amlodipine5mgOnce dailyDr. Sarah JohnsonActive
Losartan50mgOnce dailyDr. Annette BlackActive
Simvastatin20mgOnce dailyDr. Michael ChenActive
Metoprolol25mgTwice dailyDr. Sarah JohnsonActive
Gabapentin300mgThree times dailyDr. Annette BlackActive
Sertraline50mgOnce dailyDr. Michael ChenActive
Albuterol90mcgAs neededDr. Sarah JohnsonActive
Warfarin5mgOnce dailyDr. Annette BlackActive
Furosemide40mgOnce dailyDr. Michael ChenActive
Tramadol50mgAs neededDr. Sarah JohnsonDiscontinued
tsx
import { DataTable } from '@/components/ui/data-table'

<DataTable
  data={medicationData}
  columns={['name', 'dosage', 'frequency', 'prescribedBy', 'status']}
  onRowSelect={(rows) => console.log(rows)}
  onSort={(key, direction) => console.log(key, direction)}
/>
tsx
import { DataTable } from '@/components/ui/data-table'

<DataTable
  data={medicationData}
  columns={['name', 'dosage', 'frequency', 'prescribedBy', 'status']}
  onRowSelect={(rows) => console.log(rows)}
  onSort={(key, direction) => console.log(key, direction)}
/>

Impact & results

Development efficiency

We tracked this through Jira and Jira Align. More tickets were getting completed in faster turnaround times—around 20-30% reduction in development time. Engineers could implement features significantly faster using pre-built, tested components instead of building from scratch.

System adoption

We shipped 10 core components in the initial release. Multiple product teams started adopting the system, and we established a foundation we could keep building on.

Consistency improvements

Unified visual language across mobile and web. Predictable user experience across all patient touchpoints. Reduced design debt and technical inconsistencies.

Challenges & learnings

Getting people familiar with design systems

I think people at the time weren't as familiar with design systems—both designers and engineers to some degree. Summit had a small component library but hadn't really built out something extensive. The engineers understood pretty quickly once we got going. They could see the benefit and the proper approach. But it required education and showing value, not just announcing "here's a design system."

The workload

Building a design system from scratch is a lot of work. You're starting from nothing, but that also gives you the opportunity to define everything and really set the foundation forward. What kept me up was just getting everything done—there's so much to build, document, and coordinate.

Timeline & team

6 months from research to initial launch. I worked with 2 other designers and collaborated closely with 4-6 engineers, plus product management for prioritization.

Phases: Research & Discovery (1 month), Foundation & Core Components (2 months), Implementation & Testing (2 months), Documentation & Launch (1 month).