search⌘K

Colors

Color is one of the most load-bearing parts of the system. It does more than decorate the interface. It tells clinicians and staff what’s interactive, what state something is in, and what needs their attention right now. In a clinical workflow, that last job matters more than most products: a mislabeled color can mean a missed alert.

This page covers how color is meant to be used, the system-level decisions that shape it, and how to apply it consistently across the product.

How color is used

Color in this system does three distinct jobs. Keeping those jobs separate, rather than letting one color casually serve all three, is what keeps the system legible as it grows.

1. A tool for communicating interactive UI affordance

Color is one of the primary signals that tells someone “this is something you can act on.” Buttons, links, active states, focus rings, and selected states all rely on color to separate the interactive layer of the UI from the static layer. If everything on a page were the same neutral tone, users would have to guess what responds to a click. Color removes that guesswork.

This affordance role is intentionally consistent and narrow: a small set of colors are reserved for “this is actionable,” and those colors aren’t reused elsewhere for decoration. That consistency is what lets someone scan a dense clinical screen and immediately know where the actionable elements are, without reading every label.

2. To embed character and personality into the product

Beyond function, color is one of the clearest ways a product communicates feel. A sterile, clinical tool and a warm, approachable one can have identical information architecture and still feel completely different, and that difference lives largely in color choices, particularly at the accent layer.

For Air EMR, this means color has to walk a specific line: professional and trustworthy enough for a clinical setting, without feeling cold or sterile in a way that adds to the emotional weight clinicians already carry in their day. Accent choices are where this personality lives, and where the product’s character can flex without touching the semantic logic underneath it.

3. A semantic tool to communicate system status and intent

Color is also how the system communicates state: what’s normal, what needs attention, and what’s urgent. This is the highest-stakes use of color in the system, because getting it wrong has real consequences in a clinical context. A status color needs to mean the same thing everywhere it appears, every time, with no exceptions.

Because of that, semantic color use is the most rigidly governed part of the system, covered in detail below.

Key system considerations

All color is applied via tokens

There are no hardcoded hex values anywhere in the product. Every color used in the UI resolves through the token system (primitive → semantic → accent), described on the Design Tokens page. This is what makes everything else on this page possible: theming, surface-agnostic components, and consistent semantic meaning all depend on color being a token, not a fixed value baked into a component.

If you’re building a new component and reaching for a raw hex value, that’s a signal to check whether an existing semantic token already covers the case, and if not, to raise it rather than hardcode it.

Theming across two dimensions

The color system supports theming along two independent axes:

  1. Light and dark theme: the full UI can shift between light and dark modes. This is handled entirely at the semantic layer: semantic tokens point to different primitives depending on active theme, so components never need theme-specific logic of their own.
  2. Accent themes: currently blue, green, and purple, with room to expand. Accent themes shift the personality/brand layer of the product (primary actions, key highlights) without touching semantic meaning. Switching accent theme should never change what a color means, only how the “personality” layer of the UI looks and feels.

These two dimensions are independent of each other by design: any accent theme should work correctly in both light and dark mode, and switching theme shouldn’t require re-deciding what counts as a danger state or a success state.

A surface-agnostic color system

The system is built so that components remain fully functional and accessible regardless of the surface they’re placed on, within reason: a card on a default background, a card on an elevated surface, a card inside a colored callout. Rather than designing components against one assumed background, we design them against a set of surfaces they need to hold up on.

This is a scalability decision as much as a visual one. As Air EMR (and the broader Commure product surface) grows, new contexts and layouts will place existing components on backgrounds we didn’t originally design around. A surface-agnostic approach means we don’t have to special-case every new placement. A component that’s already proven accessible across our surface set is very likely to hold up in a new one too.

Semantic communication via color

Four semantic states carry fixed color meaning across the entire product. These mappings are not stylistic choices to be adjusted per-feature. They’re a shared vocabulary, and changing what a color means in one part of the product without changing it everywhere breaks the vocabulary for everyone.

StateColorCommunicates
InfoBlueNeutral, non-urgent information the user should be aware of. No action required.
SuccessGreenA completed, confirmed, or positive outcome. Something worked as expected.
WarningYellowSomething needs attention or review before it becomes a problem, but isn't urgent yet.
DangerRedAn error, blocking issue, or urgent condition requiring action, including clinically significant alerts.

A few standing rules for semantic color:

  • One state, one color, everywhere. Info is always blue. If a future feature needs a fifth state, it gets a new dedicated color. Existing state colors are never repurposed or overloaded with a second meaning.
  • Color is never the only signal. Semantic states are always paired with an icon, label, or both. This isn’t just an accessibility requirement for color blindness. It’s also a legibility requirement for fast clinical scanning, where a shape or label is often faster to register than a hue.
  • Semantic tokens, not raw ramps. Use color-danger, not red-500 directly. This is what allows danger to shift subtly for contrast and accessibility reasons without every red usage in the product needing a manual audit.
  • Severity within a state (e.g. a “critical” tier above standard danger) should use tint or weight variation within that state’s color family, not a jump to an entirely different hue. This keeps the four-state vocabulary intact rather than growing it ad hoc.

Demo gallery

Carousel goes here, illustrating the ideals above in situ. Suggested slides to include, to make the three roles and four semantic states tangible rather than abstract:

  1. 1. Affordance in context: A dense clinical screen with interactive elements highlighted, showing how action color reads at a glance against static content.
  2. 2. Personality across accents: The same screen shown in blue, green, and purple accent themes, to show how much (and how little) shifts.
  3. 3. Light/dark parity: The same component or screen in both themes side by side, demonstrating that meaning and hierarchy hold steady across the switch.
  4. 4. Semantic states in a real workflow: An example showing info, success, warning, and danger all present in one realistic screen (e.g. a patient chart with an info banner, a saved confirmation, a documentation warning, and a critical alert), so the four states can be compared directly rather than in isolation.
  5. 5. Surface-agnostic proof: One component (e.g. a card or badge) shown placed on three or four different underlying surfaces, demonstrating it holds up without adjustment.

Color ramps

Design System 3.0’s color palette consists of 12 color ramps, 1 neutral ramp, and some smaller transparency ramps on neutrals. The scale of each ramp tightens at either end to support uniform application across both light and dark themes. The default steps are increments of 100, and the tightened end steps decrease first to an increment of 50, and then to an increment of 25.

Primitive ramps for each hue. Solid scale steps sit on the first row; alpha steps sit on the row below.

red

Solid

25

#FFF5F5

50

#FADEDE

100

#FABEBE

200

#FF8A8A

300

#F55B5B

400

#E02F2F

500

#C01717

600

#9E1212

700

#7C0E0E

800

#660B0B

900

#520808

950

#3D0606

975

#260303

Alpha

a5

#C01717

a10

#C01717

a20

#C01717

a40

#C01717

orange

Solid

25

#FFFAF0

50

#FAEDD4

100

#F7DCA6

200

#FCCF76

300

#FBB324

400

#F59E0B

500

#D97706

600

#B45F09

700

#92470E

800

#78390F

900

#59270A

950

#3D1C06

975

#241003

Alpha

a5

#D97706

a10

#D97706

a20

#D97706

a40

#D97706

yellow

Solid

25

#FFFDE5

50

#F7F3D0

100

#FAF1A0

200

#FAEC71

300

#FADA39

400

#F2C718

500

#E5AE09

600

#CF9700

700

#B27D00

800

#855F08

900

#573D00

950

#382700

975

#1F1500

Alpha

a5

#E5AE09

a10

#E5AE09

a20

#E5AE09

a40

#E5AE09

green

Solid

25

#F0FFF4

50

#DEFAE8

100

#C1F5D3

200

#8FEFB2

300

#57DE88

400

#2DC565

500

#16A34A

600

#15803D

700

#166534

800

#14532D

900

#0F3D21

950

#092416

975

#05160D

Alpha

a5

#16A34A

a10

#16A34A

a20

#16A34A

a40

#16A34A

teal

Solid

25

#F0FDFA

50

#DAF7F1

100

#B1F0E4

200

#7CEAD9

300

#2DD4BF

400

#14B8A6

500

#0D9488

600

#0F766E

700

#115E59

800

#134E4A

900

#0D3836

950

#082524

975

#041514

Alpha

a5

#0D9488

a10

#0D9488

a20

#0D9488

a40

#0D9488

cyan

Solid

25

#EDFCFC

50

#D9F7FA

100

#B8EEF5

200

#82E7F5

300

#4CD9EE

400

#20BAD4

500

#0891B2

600

#0E7490

700

#155E75

800

#164E63

900

#103A4A

950

#0A2530

975

#05141A

Alpha

a5

#0891B2

a10

#0891B2

a20

#0891B2

a40

#0891B2

blue

Solid

25

#F2F8FF

50

#DEEAFA

100

#C4DAF5

200

#93C5FD

300

#60A5FA

400

#3B82F6

500

#2563EB

600

#1D4ED8

700

#1E40AF

800

#1E3A8A

900

#172B6B

950

#0F1D4A

975

#08102B

Alpha

a5

#2563EB

a10

#2563EB

a20

#2563EB

a40

#2563EB

indigo

Solid

25

#F5F6FF

50

#E1E3FA

100

#C6CAF5

200

#9CA9FF

300

#6B75FF

400

#5161F5

500

#473FE0

600

#3E29C4

700

#3822A8

800

#2E1C8A

900

#271673

950

#1A0F4D

975

#120A2E

Alpha

a5

#473FE0

a10

#473FE0

a20

#473FE0

a40

#473FE0

violet

Solid

25

#F6F5FF

50

#ECE8FC

100

#D9D3F5

200

#C4B5FD

300

#A78BFA

400

#8B5CF6

500

#7C3AED

600

#6D28D9

700

#5B21B6

800

#4C1D95

900

#371570

950

#290E57

975

#160830

Alpha

a5

#7C3AED

a10

#7C3AED

a20

#7C3AED

a40

#7C3AED

purple

Solid

25

#FDF4FF

50

#F6E8FA

100

#EED0F5

200

#F0AFFA

300

#E186EF

400

#C65DD3

500

#B226BF

600

#971CA1

700

#781C7D

800

#581C6B

900

#3D1250

950

#280B36

975

#14051C

Alpha

a5

#B226BF

a10

#B226BF

a20

#B226BF

a40

#B226BF

magenta

Solid

25

#FFF2F9

50

#FCE7F3

100

#F5D3E6

200

#FAA9D5

300

#F472B6

400

#EC55A0

500

#DB3981

600

#BE2A67

700

#9D174D

800

#831843

900

#5E1030

950

#3F0A20

975

#230511

Alpha

a5

#DB3981

a10

#DB3981

a20

#DB3981

a40

#DB3981

slate

Solid

25

#F4F8FC

50

#EDF2F7

100

#E2E8F0

200

#CBD5E1

300

#94A3B8

400

#64748B

500

#475569

600

#3F4E63

700

#323F54

800

#2C354D

900

#232C40

950

#1D2536

975

#151B24

Alpha

a5

#475569

a10

#475569

a20

#475569

a40

#475569

neutral

Solid

0

#FFFFFF

25

#FAFAFA

50

#F5F5F5

100

#E5E5E5

200

#D4D4D4

300

#A3A3A3

400

#737373

500

#595959

600

#454545

700

#363636

800

#2B2B2B

900

#262626

950

#1F1F1F

975

#141414

1000

#000000

Alpha

a5

#595959

a10

#595959

a20

#595959

a40

#595959

alpha

Alpha ramps exist to apply both light and dark tints to underlying colors or content. The scale of alpha ramps begins tight on the transparent end, starting with increments of 5% and 10%, and finishes before full opaqueness, increasing by increments of 20% up until 80%.

Alpha

a0white

#FFFFFF

a0black

#000000

light alpha

a5

#FFFFFF

a10

#FFFFFF

a20

#FFFFFF

a40

#FFFFFF

a60

#FFFFFF

a80

#FFFFFF

dark alpha

a5

#000000

a10

#000000

a20

#000000

a40

#000000

a60

#000000

a80

#000000