Orbex Sonar-DB Design system , home

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.

text
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.

  1. 5 #0B130B
  2. 6 #0E150E
  3. 10 #171D17
  4. 12 #1B211B
  5. 14 #1F251E
  6. 16 #232A22
  7. 18 #272E26
  8. 21 #2D352C
  9. 22 #2F372E
  10. 24 #333B32
  11. 27 #3A4239
  12. 28 #3C443B
  13. 31 #424B42
  14. 33 #475046
  15. 34 #495348
  16. 43 #5E685D
  17. 46 #667064
  18. 47 #687266
  19. 48 #6B7569
  20. 57 #828C7F
  21. 59 #879184
  22. 60 #899487
  23. 65 #97A194
  24. 67 #9CA699
  25. 72 #AAB3A7
  26. 74 #AFB9AC
  27. 76 #B5BEB2
  28. 78 #BAC4B7
  29. 80 #C0C9BD
  30. 84 #CBD4C8
  31. 85 #CED7CB
  32. 88 #D7DFD4
  33. 90 #DDE5D9
  34. 91 #E0E8DC
  35. 92 #E3EADF
  36. 93 #E5EDE2
  37. 95 #EBF3E8
  38. 96 #EEF6EB

neutral-tinted

A greener neutral for map land use, chart remainders and hover fills on dark surfaces.

  1. 19 #263126
  2. 23 #2F3A2E
  3. 27 #374336
  4. 36 #4C584A
  5. 41 #576456

neutral-subdued

A quieter neutral for the dark canvas, the inverse surface and the search field.

  1. 2 #040904
  2. 20 #2E312D
  3. 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).

  1. 2 #050705
  2. 6 #0F150F
  3. 12 #1B221B
  4. 14 #1F251F
  5. 15 #212921
  6. 16 #222B22
  7. 17 #252C25
  8. 21 #2C342B
  9. 22 #2E362E
  10. 23 #2E392E
  11. 27 #3A433A
  12. 48 #6C766A
  13. 59 #889285
  14. 67 #9CA699
  15. 80 #C0C8BC
  16. 88 #D5DFD2
  17. 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).

  1. 7 #141618
  2. 28 #3D453B
  3. 30 #424A40
  4. 76 #B4BEB1
  5. 91 #E0E9DD
  6. 96 #F1F4F0

gray

Achromatic grays for light surfaces.

  1. 91 #E5E5E5
  2. 94 #EEEEEE
  3. 96 #F3F3F3
  4. 97 #F6F6F6
  5. 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.

  1. 11 #0F2112
  2. 20 #00390F
  3. 29 #2F4B31
  4. 37 #33603B
  5. 40 #1E6B30
  6. 46 #047E2F Accent text: 4.5:1 on light surfaces.
  7. 50 #1A8838
  8. 67 #76B27C
  9. 81 #97D99C
  10. 89 #CFE6CF
  11. 90 #D0E8CE
  12. 91 #CDEFD0

red

Danger: delays, overdue items, destructive actions.

  1. 46 #D1282D Danger text: 4.5:1 on light surfaces.
  2. 50 #DD3535
  3. 56 #F04B4B
  4. 64 #F97068 Danger text: 4.5:1 on dark surfaces, selected rows included.

orange

Warning: pending and on-hold states.

  1. 46 #A15C00 Warning text: 4.5:1 on light surfaces.
  2. 66 #DD8E35
  3. 73 #F2A23F
  4. 77 #FFAC32
  5. 78 #FFB040

blue

Water on the route map.

  1. 36 #2E5B70
  2. 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.

Accent roles
Token Preview LightDark
--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.

Text roles
Token Preview LightDark
--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-pressed and 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.

Surface roles
Token Preview LightDark
--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

Line roles
Token Preview LightDark
--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
Fill roles
Token Preview LightDark
--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.

State layers
Token Preview LightDark
--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.

Status roles
Token Preview LightDark
--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

Chart roles
Token Preview LightDark
--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.

Product colors on cards
RoleUsed forLightDarkMinimum
text.secondary Secondary text and icons 9.6:19.1:1 4.5:1
text.muted Quieter body text 8.9:16.2:1 4.5:1
text.meta Dates, units, supporting figures 5.6:14.8:1 4.5:1
text.danger Red text 5.0:15.6:1 4.5:1
text.accent Green text 5.0:16.2:1 4.5:1
text.warning Orange text 5.0:17.4:1 4.5:1
danger Alert icons and marks 4.4:14.3:1 3:1
border.control Field and pill outlines 3.1:13.3:1 3:1
chart.primary Daily line (dashed) 4.4:16.2:1 3:1
chart.secondary Running total (dotted) 20.4:112.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.

Light theme
Text role cardpagemenucontainer
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
Dark theme
Text role cardpagemenucontainer
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.

RoleProductRatioSystemRatioNeeds
Accent (light)#1E8A3A4.42:1#1A88384.54:14.5:1 on white text on it
Chart line, primary (light)#1E8A3A4.34:1#1A88384.46:13:1 on card
Meta text (light)#737D714.21:1#5E685D5.71:14.5:1 on card
Placeholder text (light)#8E988C2.94:1#5E685D5.71:14.5:1 on card
Placeholder text (dark)#6C766A3.30:1#97A1945.84:14.5:1 on card
Warning text (light)#DD8E352.58:1#A15C005.10:14.5:1 on card
Control outline (light)#8E988C2.94:1#8791843.22:13:1 on card
Danger text (light)#DD35354.45:1#D1282D5.09:14.5:1 on card
Danger text (dark)#F04B4B4.33:1#F970685.62:14.5:1 on card
Danger fill with white text (dark)#F04B4B3.61:1#DD35354.53:14.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).