Color
A brand green, three status hues and a family of green-tinted neutrals. Components never use the palette directly: they use roles, and every role that carries text is measured against the surfaces it sits on.
How the palette is built
Brand and status colors are anchors, exact values chosen by design. When a role needs another tone of an anchor, for instance red text that must reach 4.5:1, that tone is derived: same hue and chroma, different lightness. Derived tones are outlined below.
Neutrals are generated. They are the brand green at very low chroma, from one formula. The hue drifts slightly from dark to light, as the hand-picked originals did, and the chroma eases off near black and white, where tint reads as dirt. Every tone is named by its CIELAB lightness L*, from 0 (black) to 100 (white), so the distance between two names predicts their contrast.
Two neutral families are anchors instead: neutral-dark holds the product’s exact dark surfaces, lines and grays, and neutral-light the few light-theme grays that do not fall on the formula.
hue(tone) = 144° − 0.09 × tone
chroma(tone) = 8.2 − 0.00125 × (tone − 55)²
neutral chroma(tone)
neutral-tinted chroma(tone) + 2.4
neutral-subdued chroma(tone) × 0.5
neutral
Brand-tinted neutral. Text, lines and most surfaces.
-
5
#0B130B -
6
#0E150E -
10
#171D17 -
12
#1B211B -
14
#1F251E -
16
#232A22 -
18
#272E26 -
21
#2D352C -
22
#2F372E -
24
#333B32 -
27
#3A4239 -
28
#3C443B -
31
#424B42 -
33
#475046 -
34
#495348 -
43
#5E685D -
46
#667064 -
47
#687266 -
48
#6B7569 -
57
#828C7F -
59
#879184 -
60
#899487 -
65
#97A194 -
67
#9CA699 -
72
#AAB3A7 -
74
#AFB9AC -
76
#B5BEB2 -
78
#BAC4B7 -
80
#C0C9BD -
84
#CBD4C8 -
85
#CED7CB -
88
#D7DFD4 -
90
#DDE5D9 -
91
#E0E8DC -
92
#E3EADF -
93
#E5EDE2 -
95
#EBF3E8 -
96
#EEF6EB
neutral-tinted
A greener neutral for map land use, chart remainders and hover fills on dark surfaces.
-
19
#263126 -
23
#2F3A2E -
27
#374336 -
36
#4C584A -
41
#576456
neutral-subdued
A quieter neutral for the dark canvas, the inverse surface and the search field.
-
2
#040904 -
20
#2E312D -
96
#F1F5EF
neutral-dark
The exact neutrals of the product’s dark theme, where the formula lands one RGB step away: surfaces, lines and the text levels it names, and the search results’ head and highlighted row (1.1).
-
2
#050705 -
6
#0F150F -
12
#1B221B -
14
#1F251F -
15
#212921 -
16
#222B22 -
17
#252C25 -
21
#2C342B -
22
#2E362E -
23
#2E392E -
27
#3A433A -
48
#6C766A -
59
#889285 -
67
#9CA699 -
80
#C0C8BC -
88
#D5DFD2 -
90
#DCE5D9
neutral-light
The exact text levels of the product’s light theme, the ink of its scrim, and the search results’ head and highlighted row (1.1).
-
7
#141618 -
28
#3D453B -
30
#424A40 -
76
#B4BEB1 -
91
#E0E9DD -
96
#F1F4F0
gray
Achromatic grays for light surfaces.
-
91
#E5E5E5 -
94
#EEEEEE -
96
#F3F3F3 -
97
#F6F6F6 -
99
#FCFCFC
green
Brand accent. Green 50 was darkened by half a tone from #1E8A3A (0.8 ΔE, invisible) so white text on it reaches 4.5:1.
-
11
#0F2112 -
20
#00390F -
29
#2F4B31 -
37
#33603B -
40
#1E6B30 -
46
#047E2FAccent text: 4.5:1 on light surfaces. -
50
#1A8838 -
67
#76B27C -
81
#97D99C -
89
#CFE6CF -
90
#D0E8CE -
91
#CDEFD0
red
Danger: delays, overdue items, destructive actions.
-
46
#D1282DDanger text: 4.5:1 on light surfaces. -
50
#DD3535 -
56
#F04B4B -
64
#F97068Danger text: 4.5:1 on dark surfaces, selected rows included.
orange
Warning: pending and on-hold states.
-
46
#A15C00Warning text: 4.5:1 on light surfaces. -
66
#DD8E35 -
73
#F2A23F -
77
#FFAC32 -
78
#FFB040
blue
Water on the route map.
-
36
#2E5B70 -
89
#D1E2E8
Accent
The brand green marks what can be acted on and what is selected. Its tonal version fills selected navigation items and segments; white text on the solid green reaches 4.5:1. Its container tint fills drop placeholders, the slot a card lands in while the overview is edited.
| Token | Preview | Light | Dark |
|---|---|---|---|
--sonar-color-accent
Brand green: primary buttons, active navigation, selected controls and link icons. |
palette.green.50
#1A8838
|
palette.green.67
#76B27C
|
|
--sonar-color-accent-container
Soft accent background: drop placeholders, the slot a card lands in while the overview is edited. |
palette.green.91
#CDEFD0
|
palette.green.81
#97D99C29
|
|
--sonar-color-accent-tonal
Tonal fill for the selected item in navigation and segmented controls. |
palette.green.90
#D0E8CE
|
palette.green.29
#2F4B31
|
|
--sonar-color-accent-inverse
Accent on inverse surfaces, such as the action in a toast. |
palette.green.81
#97D99C
|
palette.green.40
#1E6B30
|
|
--sonar-color-on-accent
Text and icons on the accent fill. |
palette.white
#FFFFFF
|
palette.green.20
#00390F
|
|
--sonar-color-on-accent-tonal
Text and icons on the tonal accent fill. |
palette.green.11
#0F2112
|
palette.green.90
#D0E8CE
|
|
--sonar-color-on-emphasis
Text on saturated fills (accent or danger) that stays white in both themes, such as badges. |
palette.white
#FFFFFF
|
palette.white
#FFFFFF
|
Text and icons
Emphasis levels, defined by contrast so both themes read alike. Every level meant to be read passes WCAG AA (4.5:1) on every surface, containers, selected rows and menus included. Icons use the same levels as the text beside them.
Placeholder text is text: WCAG makes no exception for it, so it reads at the tertiary level. It keeps a role of its own so fields can change it without touching tertiary. Disabled is exempt in WCAG and takes the product’s own gray; the control keeps its outline or shape, so it still reads as present.
Muted is body text one step quieter than default. Meta is for dates, units and
supporting figures: in dark it is the product’s own gray, quieter than tertiary. In light the product’s gray,
#737D71, reaches only 4.21:1 on a card and 3.73:1 on the page, below 4.5:1, so meta takes the
tertiary tone, #5E685D: 5.71:1 on a card, 5.05:1 on the page.
Colored text uses darker tones than the fills of the same hue in light, and lighter ones in dark. It sits on cards, pages, menus and rows; on containers, status is shown with an icon or a chip.
| Token | Preview | Light | Dark |
|---|---|---|---|
--sonar-color-text-strong
Titles and key figures. |
palette.neutral.10
#171D17
16.7:1
|
palette.neutral.92
#E3EADF
12.7:1
|
|
--sonar-color-text-default
Body text. |
palette.neutral.21
#2D352C
12.3:1
|
palette.neutral.90
#DDE5D9
12.1:1
|
|
--sonar-color-text-secondary
Navigation at rest, secondary text and icons. |
palette.neutral-light.28
#3D453B
9.6:1
|
palette.neutral-dark.80
#C0C8BC
9.1:1
|
|
--sonar-color-text-muted
Body text one step quieter than default, such as the reading of a search. |
palette.neutral-light.30
#424A40
8.9:1
|
palette.neutral-dark.67
#9CA699
6.2:1
|
|
--sonar-color-text-tertiary
Placeholders, hints and inactive legend entries: the faintest text, still 4.5:1. |
palette.neutral.43
#5E685D
5.6:1
|
palette.neutral.65
#97A194
5.8:1
|
|
--sonar-color-text-meta
Metadata and small labels: dates, units, supporting figures. The same as tertiary in light, where the product’s own gray falls below 4.5:1; quieter than tertiary in dark. |
text.tertiary
#5E685D
5.6:1
|
palette.neutral-dark.59
#889285
4.8:1
|
|
--sonar-color-text-placeholder
Placeholder text in fields. Placeholders are text, so they read at the tertiary level; a role of its own lets fields change it without touching tertiary. |
text.tertiary
#5E685D
5.6:1
|
text.tertiary
#97A194
5.8:1
|
|
--sonar-color-text-disabled
Disabled controls. Exempt from contrast in WCAG; the control keeps its outline or shape so it still reads as present. |
palette.neutral-light.76
#B4BEB1
1.8:1
|
palette.neutral-dark.27
#3A433A
1.5:1
|
|
--sonar-color-text-inverse
Text on inverse surfaces: tooltips, toasts. |
palette.neutral.95
#EBF3E8
11.6:1
|
palette.neutral.12
#1B211B
11.9:1
|
|
--sonar-color-text-accent
Accent-colored text: positive figures, links. |
palette.green.46
#047E2F
5.0:1
|
palette.green.67
#76B27C
6.2:1
|
|
--sonar-color-text-danger
Danger-colored text. |
palette.red.46
#D1282D
5.0:1
|
palette.red.64
#F97068
5.6:1
|
|
--sonar-color-text-warning
Warning-colored text. |
palette.orange.46
#A15C00
5.0:1
|
palette.orange.73
#F2A23F
7.4:1
|
Text that is not read
-
Never lower contrast with opacity, with one exception kept from the product: a chart’s
running-total toggle fades to 40 % when off. Its state is also given by
aria-pressedand by its line leaving the chart. - Neighboring days are context, not content. A month calendar fills its six rows with the days of the months around it in the disabled gray; each of those days reads at full contrast in its own month.
-
Decorative previews are hidden from assistive technology. A glimpse of the next day at the edge
of a scrolling view carries
aria-hidden="true"and no focusable content. It is exempt from contrast because the same content is one swipe away, at full contrast.
Surfaces
Light surfaces are achromatic grays with a white top bar; the green tint appears in containers, menus and states. In the dark theme everything is tinted and steps up in lightness as it comes closer.
| Token | Preview | Light | Dark |
|---|---|---|---|
--sonar-color-surface-canvas
Behind the application frame. |
palette.gray.91
#E5E5E5
|
palette.neutral-dark.2
#050705
|
|
--sonar-color-surface-page
Dashboard background. |
palette.gray.97
#F6F6F6
|
palette.neutral-dark.6
#0F150F
|
|
--sonar-color-surface-raised
Top bar and small raised controls. |
palette.white
#FFFFFF
|
palette.neutral-dark.12
#1B221B
|
|
--sonar-color-surface-card
Cards, panels and sheets. |
palette.gray.99
#FCFCFC
|
palette.neutral-dark.14
#1F251F
|
|
--sonar-color-surface-container
Segmented tracks, neutral notices and chips. |
palette.neutral.91
#E0E8DC
|
palette.neutral-tinted.19
#263126
|
|
--sonar-color-surface-container-low
Fields, neutral notices, icon wells. |
palette.neutral.93
#E5EDE2
|
palette.neutral.14
#1F251E
|
|
--sonar-color-surface-well
Product thumbnails and add buttons. |
palette.neutral.93
#E5EDE2
|
palette.neutral-dark.21
#2C342B
|
|
--sonar-color-surface-well-hover
Hover on a control drawn on the well, such as New order in the Orders card (v38 .addbtn:hover). Since 1.1. |
palette.neutral.90
#DDE5D9
|
palette.neutral-dark.27
#3A433A
|
|
--sonar-color-surface-menu
Dropdown menus. |
palette.neutral.95
#EBF3E8
|
palette.neutral-dark.16
#222B22
|
|
--sonar-color-surface-hover
Row under the pointer. |
palette.neutral.96
#EEF6EB
|
palette.neutral-dark.15
#212921
|
|
--sonar-color-surface-selected
Row whose detail panel is open. |
palette.neutral.96
#EEF6EB
|
palette.neutral-dark.21
#2C342B
|
|
--sonar-color-surface-search-head
Head row of search results: the status line (“Smart search · …”). Since 1.1. |
palette.neutral-light.96
#F1F4F0
|
palette.neutral-dark.17
#252C25
|
|
--sonar-color-surface-search-active
The highlighted search result, the one Enter chooses. Since 1.1. |
palette.neutral-light.91
#E0E9DD
|
palette.neutral-dark.23
#2E392E
|
|
--sonar-color-surface-inverse
Tooltips and toasts. |
palette.neutral-subdued.20
#2E312D
|
palette.neutral-dark.88
#D5DFD2
|
|
--sonar-color-scrim
Veil behind modal sheets and drawers. |
palette.neutral-light.7
#14161838
|
palette.black
#0000008C
|
Lines and fills
| Token | Preview | Light | Dark |
|---|---|---|---|
--sonar-color-divider
Rules between rows and blocks. |
palette.neutral.88
#D7DFD4
|
palette.neutral-dark.21
#2C342B
|
|
--sonar-color-border-strong
Outlined buttons, fields on hover. |
palette.neutral.10
#171D17
|
palette.neutral.92
#E3EADF
|
|
--sonar-color-border-emphasis
Dotted connectors, pending route segments, hover borders. |
palette.neutral.46
#667064
|
palette.neutral.60
#899487
|
|
--sonar-color-border-control
Boundaries of fields, checkboxes and switches. At least 3:1 on card (WCAG 1.4.11). |
palette.neutral.59
#879184
|
palette.neutral-dark.48
#6C766A
|
|
--sonar-color-border-muted
Sidebar separators. |
palette.neutral.76
#B5BEB2
|
palette.neutral-dark.27
#3A433A
|
|
--sonar-color-border-subtle
Dotted list separators. |
palette.neutral.84
#CBD4C8
|
palette.neutral-dark.22
#2E362E
|
|
--sonar-color-border-faint
Separators inside grouped controls. |
palette.neutral.90
#DDE5D9
|
palette.neutral.18
#272E26
|
| Token | Preview | Light | Dark |
|---|---|---|---|
--sonar-color-fill-strong
Today marker, text cursor. |
palette.neutral.10
#171D17
|
palette.neutral.92
#E3EADF
|
|
--sonar-color-fill-faint
Neutral status dots, switch thumb. |
palette.neutral.59
#879184
|
palette.neutral.47
#687266
|
|
--sonar-color-fill-muted
Inactive segments of bars and progress. |
palette.neutral.76
#B5BEB2
|
palette.neutral.27
#3A4239
|
|
--sonar-color-fill-subtle
Disabled buttons, calendar dots. |
palette.neutral.84
#CBD4C8
|
palette.neutral.22
#2F372E
|
States
Hover and pressed are translucent layers over whatever is underneath, tinted with the accent. On accent fills, the layer turns white in light and black in dark.
| Token | Preview | Light | Dark |
|---|---|---|---|
--sonar-color-state-hover
State layer for hover on icon buttons and list items. |
palette.green.50
#1A883814
|
palette.green.81
#97D99C1A
|
|
--sonar-color-state-pressed
State layer for pressed and active. |
palette.green.50
#1A88381F
|
palette.green.81
#97D99C29
|
|
--sonar-color-state-on-accent-hover
State layer for hover on accent fills. |
palette.white
#FFFFFF1A
|
palette.black
#0000001A
|
|
--sonar-color-state-on-accent-pressed
State layer for pressed on accent fills. |
palette.white
#FFFFFF1F
|
palette.black
#0000001F
|
Status
Danger flags delays, overdue invoices and stock on hold; warning flags what is pending. Status is never told by color alone: it always comes with a word or an icon.
| Token | Preview | Light | Dark |
|---|---|---|---|
--sonar-color-danger
Delays, overdue items, alerts and destructive actions: fills, icons and chart marks. |
palette.red.50
#DD3535
|
palette.red.56
#F04B4B
|
|
--sonar-color-danger-solid
Danger fill that carries text, such as notification badges: white on it reaches 4.5:1 in both themes. |
palette.red.50
#DD3535
|
palette.red.50
#DD3535
|
|
--sonar-color-danger-container
Background of alert notices. |
palette.red.50
#DD35351F
|
palette.red.56
#F04B4B1C
|
|
--sonar-color-warning
Pending and on-hold states: dots and icons. |
palette.orange.77
#FFAC32
|
palette.orange.78
#FFB040
|
|
--sonar-color-warning-container
Background of warning notices. |
palette.orange.77
#FFAC3229
|
palette.orange.78
#FFB04029
|
|
--sonar-color-success-container
Background of success notices. |
palette.green.50
#1A88381A
|
palette.green.67
#76B27C1A
|
Charts
| Token | Preview | Light | Dark |
|---|---|---|---|
--sonar-color-chart-primary
First series. |
accent
#1A8838
|
accent
#76B27C
|
|
--sonar-color-chart-secondary
Second series (cumulative). |
palette.black
#000000
|
palette.neutral-dark.90
#DCE5D9
|
|
--sonar-color-chart-alert
Values that need attention, such as stock on hold. |
danger
#DD3535
|
danger
#F04B4B
|
|
--sonar-color-chart-rest
Remainder of a whole: the rest of a donut or bar. |
palette.neutral.76
#B5BEB2
|
palette.neutral-tinted.36
#4C584A
|
|
--sonar-color-chart-grid
Grid lines. |
palette.neutral.90
#DDE5D9
|
palette.neutral.21
#2D352C
|
|
--sonar-color-chart-axis
Axis figures. |
text.default
#2D352C
|
text.default
#DDE5D9
|
|
--sonar-color-chart-tip-shadow
The chart bubble’s drop shadow; none in dark, where the bubble is light. |
palette.black
#0000001F
|
palette.black
#00000000
|
|
--sonar-color-scrollbar
Scroll indicator thumb. |
palette.neutral.90
#DDE5D9
|
palette.neutral.18
#272E26
|
Contrast
The colors below are the product’s own. Each is kept as it is because it passes its minimum where it is used: 4.5:1 for text, 3:1 for icons, chart lines and control boundaries.
| Role | Used for | Light | Dark | Minimum |
|---|---|---|---|---|
text.secondary |
Secondary text and icons | 9.6:1 | 9.1:1 | 4.5:1 |
text.muted |
Quieter body text | 8.9:1 | 6.2:1 | 4.5:1 |
text.meta |
Dates, units, supporting figures | 5.6:1 | 4.8:1 | 4.5:1 |
text.danger |
Red text | 5.0:1 | 5.6:1 | 4.5:1 |
text.accent |
Green text | 5.0:1 | 6.2:1 | 4.5:1 |
text.warning |
Orange text | 5.0:1 | 7.4:1 | 4.5:1 |
danger |
Alert icons and marks | 4.4:1 | 4.3:1 | 3:1 |
border.control |
Field and pill outlines | 3.1:1 | 3.3:1 | 3:1 |
chart.primary |
Daily line (dashed) | 4.4:1 | 6.2:1 | 3:1 |
chart.secondary |
Running total (dotted) | 20.4:1 | 12.1:1 | 3:1 |
text.disabled |
Disabled controls | 1.8:1 (exempt) | 1.5:1 (exempt) | Exempt |
The full matrix is measured from the built tokens, the same way the test suite checks them on every build. Each pair is judged against its own minimum: 4.5:1 for text; disabled is exempt. Lighter figures are pairs the system does not use. Ratios are rounded down.
| Text role | card | page | menu | container |
|---|---|---|---|---|
| strong | 16.7:1 , passes 4.5:1 | 15.8:1 , passes 4.5:1 | 15.1:1 , passes 4.5:1 | 13.6:1 , passes 4.5:1 |
| default | 12.3:1 , passes 4.5:1 | 11.7:1 , passes 4.5:1 | 11.1:1 , passes 4.5:1 | 10.1:1 , passes 4.5:1 |
| secondary | 9.6:1 , passes 4.5:1 | 9.1:1 , passes 4.5:1 | 8.7:1 , passes 4.5:1 | 7.9:1 , passes 4.5:1 |
| muted | 8.9:1 , passes 4.5:1 | 8.5:1 , passes 4.5:1 | 8.1:1 , passes 4.5:1 | 7.3:1 , passes 4.5:1 |
| meta | 5.6:1 , passes 4.5:1 | 5.3:1 , passes 4.5:1 | 5.1:1 , passes 4.5:1 | 4.6:1 , not paired |
| tertiary | 5.6:1 , passes 4.5:1 | 5.3:1 , passes 4.5:1 | 5.1:1 , passes 4.5:1 | 4.6:1 , passes 4.5:1 |
| placeholder | 5.6:1 , passes 4.5:1 | 5.3:1 , passes 4.5:1 | 5.1:1 , passes 4.5:1 | 4.6:1 , passes 4.5:1 |
| accent | 5.0:1 , passes 4.5:1 | 4.8:1 , passes 4.5:1 | 4.5:1 , passes 4.5:1 | 4.1:1 , not paired |
| danger | 5.0:1 , passes 4.5:1 | 4.7:1 , passes 4.5:1 | 4.5:1 , passes 4.5:1 | 4.1:1 , not paired |
| warning | 5.0:1 , passes 4.5:1 | 4.8:1 , passes 4.5:1 | 4.5:1 , passes 4.5:1 | 4.1:1 , not paired |
| disabled | 1.8:1 , not paired | 1.7:1 , not paired | 1.6:1 , not paired | 1.5:1 , not paired |
| Text role | card | page | menu | container |
|---|---|---|---|---|
| strong | 12.7:1 , passes 4.5:1 | 15.0:1 , passes 4.5:1 | 11.9:1 , passes 4.5:1 | 11.0:1 , passes 4.5:1 |
| default | 12.1:1 , passes 4.5:1 | 14.3:1 , passes 4.5:1 | 11.3:1 , passes 4.5:1 | 10.5:1 , passes 4.5:1 |
| secondary | 9.1:1 , passes 4.5:1 | 10.7:1 , passes 4.5:1 | 8.5:1 , passes 4.5:1 | 7.8:1 , passes 4.5:1 |
| muted | 6.2:1 , passes 4.5:1 | 7.3:1 , passes 4.5:1 | 5.7:1 , passes 4.5:1 | 5.3:1 , passes 4.5:1 |
| meta | 4.8:1 , passes 4.5:1 | 5.7:1 , passes 4.5:1 | 4.5:1 , passes 4.5:1 | 4.1:1 , not paired |
| tertiary | 5.8:1 , passes 4.5:1 | 6.9:1 , passes 4.5:1 | 5.4:1 , passes 4.5:1 | 5.0:1 , passes 4.5:1 |
| placeholder | 5.8:1 , passes 4.5:1 | 6.9:1 , passes 4.5:1 | 5.4:1 , passes 4.5:1 | 5.0:1 , passes 4.5:1 |
| accent | 6.2:1 , passes 4.5:1 | 7.4:1 , passes 4.5:1 | 5.8:1 , passes 4.5:1 | 5.4:1 , not paired |
| danger | 5.6:1 , passes 4.5:1 | 6.6:1 , passes 4.5:1 | 5.2:1 , passes 4.5:1 | 4.8:1 , not paired |
| warning | 7.4:1 , passes 4.5:1 | 8.8:1 , passes 4.5:1 | 6.9:1 , passes 4.5:1 | 6.4:1 , not paired |
| disabled | 1.5:1 , not paired | 1.8:1 , not paired | 1.4:1 , not paired | 1.3:1 , not paired |
Where the system departs from the product
The rule: the system takes the product’s colors unless a pair fails WCAG AA, and then accessibility wins. These are
the roles where the product’s color fails and the system’s replaces it, with both ratios measured on the card
(#FDFDFC in light, #1F251F in dark). Danger in dark follows the same rule: marks and
fills keep the product’s #F04B4B, red text takes #F97068, and a red fill that carries
white text takes #DD3535.
| Role | Product | Ratio | System | Ratio | Needs |
|---|---|---|---|---|---|
| Accent (light) | #1E8A3A | 4.42:1 | #1A8838 | 4.54:1 | 4.5:1 on white text on it |
| Chart line, primary (light) | #1E8A3A | 4.34:1 | #1A8838 | 4.46:1 | 3:1 on card |
| Meta text (light) | #737D71 | 4.21:1 | #5E685D | 5.71:1 | 4.5:1 on card |
| Placeholder text (light) | #8E988C | 2.94:1 | #5E685D | 5.71:1 | 4.5:1 on card |
| Placeholder text (dark) | #6C766A | 3.30:1 | #97A194 | 5.84:1 | 4.5:1 on card |
| Warning text (light) | #DD8E35 | 2.58:1 | #A15C00 | 5.10:1 | 4.5:1 on card |
| Control outline (light) | #8E988C | 2.94:1 | #879184 | 3.22:1 | 3:1 on card |
| Danger text (light) | #DD3535 | 4.45:1 | #D1282D | 5.09:1 | 4.5:1 on card |
| Danger text (dark) | #F04B4B | 4.33:1 | #F97068 | 5.62:1 | 4.5:1 on card |
| Danger fill with white text (dark) | #F04B4B | 3.61:1 | #DD3535 | 4.53:1 | 4.5:1 on white text on it |
The chart’s primary line passes with the product’s green; it follows the accent so the two never drift apart. Three
more roles differ without a contrast reason, because the palette is generated by one formula: the light menu and
inverse text (#EBF3E8 for the product’s #EEF3EA), the dark control outline
(#687266 for #6C766A) and the dark chart’s second line (#DCE5D9 for
#B7C3B4). The light and dark neutrals land within one or two RGB steps of the product’s
(ΔE under 1.7, below what the eye tells apart).