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.
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.
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.
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.
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.
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.
The color system supports theming along two independent axes:
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.
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.
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.
| State | Color | Communicates |
|---|---|---|
| Info | Blue | Neutral, non-urgent information the user should be aware of. No action required. |
| Success | Green | A completed, confirmed, or positive outcome. Something worked as expected. |
| Warning | Yellow | Something needs attention or review before it becomes a problem, but isn't urgent yet. |
| Danger | Red | An error, blocking issue, or urgent condition requiring action, including clinically significant alerts. |
A few standing rules for semantic color:
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.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:
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.
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
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
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
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
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
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
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
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
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
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
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
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
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 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