Color
Bridge's colors from Arch: every token by job in light and dark, where each may appear, the contrast it meets, and the full Arch palette.
Bridge's colors come from Arch, the design system in Figma, and reach code as role tokens: a name for the job (--text-muted), not the paint (Slate). Pick a color by what it's for. Every token has a light and a dark value; this page shows both, with its Arch name.
Color by job
Surfaces and lines
The page, what sits on it, and the lines between things. Most of every screen is drawn from these.
--surface-primaryThe page, inputs and table rows.
- Light
- #FFFFFF
- Dark
- #0B0F1A
--surface-secondaryHover fills and light icon backgrounds.
- Light
- #F9F9FA
- Dark
- #111627
--surface-tertiarySelected and inactive fills, skeletons.
- Light
- #F2F3F5
- Dark
- #1A2035
--surface-elevatedMenus, popovers and bordered buttons: anything above the page.
- Light
- #FFFFFF
- Dark
- #151B2E
--border-defaultCard and input outlines.
- Light
- #ECEDF0
- Dark
- #252D44
--border-hoverAn outline under the pointer.
- Light
- #D9DBE1
- Dark
- #3A4460
--border-dividerLines between rows inside a card.
- Light
- #F2F3F5
- Dark
- #1E2640
Text
Five steps of ink, from headings to disabled.
--text-primaryHeadings, names, the most important text.
- Light
- #0D1531
- Dark
- #F0F1F4
--text-secondaryStrong secondary text and button labels.
- Light
- #3D445A
- Dark
- #C8CCD8
--text-bodyBody copy and descriptions.
- Light
- #676C7E
- Dark
- #9BA1B4
--text-mutedDates, metadata, column headers. Not on --surface-tertiary.
- Light
- #6D7284
- Dark
- #868CA3
--text-disabledDisabled things only. Too faint for text people need.
- Light
- #B3B7C4
- Dark
- #505872
Royal
Bridge blue. Spent on the decision, the selection and focus: see where it goes, below.
--primaryLinks, focus rings, selected states, section icons.
- Light
- #0038FF
- Dark
- #4D7AFF
--primary-hoverA link or blue control under the pointer.
- Light
- #0036D7
- Dark
- #6B91FF
--primary-activeA blue control while pressed.
- Light
- #0028C0
- Dark
- #3A66E8
--primary-solidThe primary button's fill. Anything with white text on blue.
- Light
- #0038FF
- Dark
- #2F5BFF
--primary-solid-hoverThe primary button under the pointer.
- Light
- #0036D7
- Dark
- #3D68F5
Status
Done, failed, waiting. Each comes as a strong color for icons, a tint, an outline and a text ink, and always travels with a word.
--successDone, accepted: icons and dots.
- Light
- #0EA02E
- Dark
- #34C759
--success-bgThe green tag's fill.
- Light
- #E7F6EA
- Dark
- rgba(52, 199, 89, 0.12)
--success-textGreen text.
- Light
- #005F15
- Dark
- #4ADE80
--errorFailed, declined: icons, dots and red outlines.
- Light
- #E13535
- Dark
- #FF6B6B
--error-bgThe red tag's and error banner's fill.
- Light
- #FCEBEB
- Dark
- rgba(255, 107, 107, 0.12)
--error-textRed text on a red tint.
- Light
- #9E0000
- Dark
- #FFA0A0
--danger-solidThe destructive button's fill.
- Light
- #C72B2B
- Dark
- #C0392B
--danger-textRed text on white, like the danger-ghost button.
- Light
- #C72B2B
- Dark
- #F58A8A
--warningWaiting, at risk: icons and dots.
- Light
- #F59E0B
- Dark
- #FBBF24
--warning-bgThe yellow tag's fill.
- Light
- #FCF4E6
- Dark
- rgba(251, 191, 36, 0.12)
--warning-textAmber text.
- Light
- #714A00
- Dark
- #FCD34D
Accents
Information, categories and a few marks that belong to one component.
--infoBlue tag text and avatar initials.
- Light
- #0036D7
- Dark
- #60A5FA
--info-bgBlue tag, info banner and avatar fill.
- Light
- #EEF4FF
- Dark
- rgba(96, 165, 250, 0.12)
--purplePurple tag text.
- Light
- #552BCB
- Dark
- #9A81ED
--purple-bgPurple tag fill.
- Light
- #F6F2FF
- Dark
- rgba(139, 110, 232, 0.12)
--honeyThe alum badge's outline. Only Badge uses it.
- Light
- #E19500
- Dark
- #F5C451
--badge-warningThe avatar's warning mark. Only Avatar uses it.
- Light
- #B87A00
- Dark
- #B87A00
--super-connector-fromThe Super Connector award, with --super-connector-to.
- Light
- #6A3AF3
- Dark
- #6A3AF3
--cta-fromThe call-to-action banner, with --cta-to.
- Light
- #0038FF
- Dark
- #0D1531
Using color
Royal is for the decision
A word beside every status color
Categories never look like status
Fills that carry white text
--danger-solid or --primary-solid. White text on them passes 4.5:1.--error. A color that works as an icon can fail as a fill: white on it is 4.41:1.- Green (
--success) and amber (--warning) are for icons, dots and fills. For text, use their-texttokens. --text-disabledis for disabled things only. It is 2:1 on white.--text-mutedsits on white or--surface-secondary. On--surface-tertiaryit drops under 4.5:1: use--text-bodythere.- Section and feature icons are
--primary, or green, amber or purple by topic (Card'siconColor), never an app's own accent color. - Charts use
--primaryfor series,--border-dividerfor gridlines and--text-mutedfor labels, so they work in both themes. - Never a hex value in a component. If no token fits, a new role token is added first (see Design tokens).
Where Royal goes
A closed list. If a use isn't on it, the answer is ink, a grey fill or a Tag.
| Use | How | See |
|---|---|---|
| The one main button | --primary-solid fill, white text | Button |
| Links and link buttons | --primary text that underlines on hover | Button |
| Ticked and switched-on controls | --primary-solid fill | Checkbox, Switch |
| Selection | A blue border and light blue tint on the open card; a blue line under the active tab | Card, Tabs |
| Focus | A blue ring or outline on whatever has keyboard focus | Accessibility |
| Section icons | A blue icon on an 8% blue square in a card header | Card |
| Chart series | --primary bars and lines on --border-divider gridlines | Color rules, below |
| Text selection | Royal highlight when text is selected | Styles |
- Never on headings, body text, borders or decoration.
- Never two blue buttons in one view.
- Never to mean a category: a blue Tag is a category color, not a softer primary.
Contrast
Computed from the stylesheet on every build. Text and fills behind text need 4.5:1; marks such as icons and badge glyphs need 3:1. Tinted fills are measured over the page they sit on.
| Text | On | Used for | Light | Dark |
|---|---|---|---|---|
--text-primary | --surface-primary | primary text on primary surface | 17.97:1Pass | 16.94:1Pass |
--text-primary | --surface-secondary | primary text on secondary surface | 17.08:1Pass | 15.92:1Pass |
--text-primary | --surface-elevated | primary text on elevated surface | 17.97:1Pass | 15.14:1Pass |
--text-secondary | --surface-primary | secondary text on primary surface | 9.66:1Pass | 11.92:1Pass |
--text-secondary | --surface-secondary | secondary text on secondary surface | 9.19:1Pass | 11.20:1Pass |
--text-secondary | --surface-elevated | secondary text on elevated surface | 9.66:1Pass | 10.65:1Pass |
--text-body | --surface-primary | body text on primary surface | 5.22:1Pass | 7.43:1Pass |
--text-body | --surface-secondary | body text on secondary surface | 4.96:1Pass | 6.98:1Pass |
--text-body | --surface-elevated | body text on elevated surface | 5.22:1Pass | 6.64:1Pass |
--text-muted | --surface-primary | muted text on primary surface | 4.78:1Pass | 5.73:1Pass |
--text-muted | --surface-secondary | muted text on secondary surface | 4.55:1Pass | 5.39:1Pass |
--text-muted | --surface-elevated | muted text on elevated surface | 4.78:1Pass | 5.12:1Pass |
--text-disabled | --surface-primary | disabled text (exempt from contrast rules) | 2.00:1Fail | 2.72:1Fail |
--primary | --surface-primary | links and primary-coloured text | 6.98:1Pass | 5.05:1Pass |
--danger-text | --surface-primary | danger-ghost button text | 5.51:1Pass | 8.10:1Pass |
white | --primary-solid | primary button | 6.98:1Pass | 5.17:1Pass |
white | --primary-solid-hover | primary button, hovered | 8.37:1Pass | 4.67:1Pass |
white | --danger-solid | destructive button | 5.51:1Pass | 5.44:1Pass |
white | --danger-solid-hover | destructive button, hovered | 7.17:1Pass | 4.55:1Pass |
white | --primary | why buttons don't fill with --primary | 6.98:1Pass | 3.79:1Fail |
white | --error | why buttons don't fill with --error | 4.41:1Fail | 2.78:1Fail |
--success-text | --success-bg | green tag | 7.09:1Pass | 9.20:1Pass |
--error-text | --error-bg | red tag | 7.43:1Pass | 8.53:1Pass |
--warning-text | --warning-bg | yellow tag | 7.17:1Pass | 10.71:1Pass |
--info | --info-bg | blue tag | 7.58:1Pass | 6.35:1Pass |
--purple | --purple-bg | purple tag | 7.35:1Pass | 5.42:1Pass |
white | --primary-solid | avatar member tick (a mark: needs 3:1) | 6.98:1Pass | 5.17:1Pass |
white | --super-connector-to | avatar Super Connector award, lighter end (a mark: needs 3:1) | 3.30:1Pass | 3.30:1Pass |
white | --badge-warning | avatar warning mark (a mark: needs 3:1) | 3.61:1Pass | 3.61:1Pass |
The Arch palette
Every color in Arch, as the Figma file draws it. The line under each name says which token carries it in code. “Figma only” colors are for design; when a screen needs one in code, a role token is added for the job first. Tints going lighter take a number (Royal 10); shades going darker take S and a number (Royal S10).
Royal
Charcoal
Slate
Sky
Kelly
Honey
Ruby
Purple
Gradients
Graphics
For illustrations and marketing graphics only, never interface parts.
Rules
Colors are tokens
Components use role tokens only: bg-[var(--surface-secondary)], text-[var(--text-muted)]. Never hex, rgb() or Tailwind palette classes such as bg-blue-500, and never a dark: patch to fix a color: if dark mode looks wrong, fix the token.
Fill with -solid
Anything with white text on a colored fill uses --primary-solid or --danger-solid. The brand --primary and --error are for text, icons and focus rings; as fills they fail contrast (white on --error is 4.41:1).
Never by color alone
Status and meaning are never carried by color alone. A colored tag has a word; a status color comes with an icon or text; a chart says in words what it shows.