Color families
Each family runs from 50 (lightest) to 900 (darkest). The 500 step is the base color. The CSS name is under each swatch. Norway Blue and Sweden Blue are used by one mode each. Swiss red (--arche-swiss-red-web #FF0000, and --arche-swiss-red-print #DA291C for print) is used only in Klarheit and is also the Alert color.
Greece Blue
Structure and meaning: bands, links, buttons, stat numbers. Ethos uses it as its only color.
Sweden Yellow
Identity: the name on the home page, the Credits band, the selection highlight and, in Omtanke, the yellow band and the primary button on blue.
Norway Red
The logo and, in Canon, the end mark. Nøktern uses it in the Cross. It is never on text, controls, validation or cards.
Norway Blue
Nøktern's main color. No other mode uses it.
Sweden Blue
Omtanke's main color. No other mode uses it.
Neutral
Text, surfaces and borders.
Alert
Errors and alerts only. The same in every mode.
Success
Status only. The same in every mode.
Warning
Status only. The same in every mode.
Which color does which job
These are Canon's jobs. Proportions are about 60 percent neutral, 30 percent blue and 10 percent accent. Blue is the structural color. Yellow and red stay sparing and single-purpose. Other modes give the same roles different colors: see Color modes.
| Job | Role token | Light | Dark |
|---|---|---|---|
| Page background | --arche-surface-neutral-base |
neutral/white #FFFFFF | neutral/900 #1A1A1A |
| Raised surface (form fields, image tiles) | --arche-surface-neutral-raised |
neutral/white #FFFFFF | neutral/800 #333333 |
| Tinted section (stat strip, Problem, Outcome) | --arche-surface-brand-primary-subtle |
greece/blue/50 #E6ECF3 | greece/blue/700 #012E5C |
| Blue band | --arche-surface-brand-primary |
greece/blue/500 #014488 | greece/blue/500 #014488 |
| Headings | --arche-text-neutral-primary |
neutral/900 #1A1A1A | neutral/white #FFFFFF |
| Body copy | --arche-text-neutral-body |
neutral/900 #1A1A1A | neutral/100 #E5E5E5 |
| Captions and meta | --arche-text-neutral-secondary |
neutral/600 #666666 | neutral/300 #B3B3B3 |
| Links and stat numbers | --arche-text-brand-primary |
greece/blue/500 #014488 | greece/blue/200 #9EB8D2 |
| Text on blue | --arche-text-on-brand-primary |
neutral/white #FFFFFF | neutral/white #FFFFFF |
| Dividers | --arche-border-neutral-default |
neutral/200 #CCCCCC | neutral/700 #4D4D4D |
| Form bar at rest | --arche-border-neutral-strong |
neutral/500 #808080 | neutral/500 #808080 |
| Error text | --arche-text-system-alert |
system/alert/700 #AD0000 | system/alert/300 #FF7070 |
Do
- Use blue for structure, links, buttons and stat numbers.
- Use yellow for identity: a name, the Credits band or the selection highlight.
- Pair color with a second signal: weight, a label, an icon or a stroke.
- Use Greece Blue plus neutrals in charts and diagrams.
Don't
- Use Norway Red anywhere except the logo and Canon's end mark, one rule per page.
- Use alert, success or warning colors decoratively. They mean status only.
- Reach for a primitive such as
--arche-greece-blue-500inside a component. - Use yellow text on white. It fails contrast.
Contrast
WCAG AA needs 4.5:1 for text and 3:1 for large text and interface parts such as borders and focus rings. These ratios are calculated from the token values when the site builds, so they are never typed by hand.
| Pair | Needs | Light | Dark |
|---|---|---|---|
| Headings on the page | 4.5:1 | 17.40:1 Pass | 17.40:1 Pass |
| Body copy on the page | 4.5:1 | 17.40:1 Pass | 13.82:1 Pass |
| Captions and meta on the page | 4.5:1 | 5.74:1 Pass | 8.30:1 Pass |
| Links and brand text on the page | 4.5:1 | 9.62:1 Pass | 8.49:1 Pass |
| Stat numbers on the brand tint | 4.5:1 | 8.09:1 Pass | 6.62:1 Pass |
| Captions on the brand tint | 4.5:1 | 4.83:1 Pass | 6.48:1 Pass |
| Error text on the page | 4.5:1 | 7.56:1 Pass | 6.47:1 Pass |
| Headings on the brand band | 4.5:1 | 9.62:1 Pass | 9.62:1 Pass |
| Body text on the brand band | 4.5:1 | 8.09:1 Pass | 8.09:1 Pass |
| Secondary text on the brand band | 4.5:1 | 6.75:1 Pass | 6.75:1 Pass |
| Text on the yellow band | 4.5:1 | 11.59:1 Pass | 11.59:1 Pass |
| Primary button label | 4.5:1 | 9.62:1 Pass | 9.05:1 Pass |
| Primary button label on the band | 4.5:1 | 9.62:1 Pass | 9.62:1 Pass |
| Selected text | 4.5:1 | 11.59:1 Pass | 11.59:1 Pass |
| Form field bar at rest (non-text) | 3:1 | 3.95:1 Pass | 4.41:1 Pass |
| Focus ring on the page (non-text) | 3:1 | 21.00:1 Pass | 17.40:1 Pass |
| Accent rule on the page (non-text) | 3:1 | 5.43:1 Pass | 4.20:1 Pass |
| Stat numerals on the page | 3:1 | 9.62:1 Pass | 8.49:1 Pass |
One known limit: a black focus ring on the Blue 500 band is only 2.18:1, which fails. That is why on-blue surfaces use a separate white ring token, --arche-border-focus-ring-on-brand.
Dark mode
Role tokens have two values, Light and Dark, in each mode. Canon's Light sits on :root. Dark is written in two places: once for visitors who chose it with the theme toggle, and once for visitors whose browser is set to dark and who have not chosen. Every other mode adds the same pair of blocks, selected with data-mode.
:root[data-theme="dark"] {
--arche-surface-neutral-base: var(--arche-neutral-900);
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--arche-surface-neutral-base: var(--arche-neutral-900);
}
}
Use the Dark button to try it on this page. It is in the header from 1024px up, and in the footer below that.
All role tokens
116 tokens in total. Each group opens to show its Canon Light and Dark values and the primitive it points at. A role that another mode changes says so on that mode's page.
Surface (16)
| CSS name | Light | Dark |
|---|---|---|
--arche-surface-neutral-base |
neutral/white | neutral/900 |
--arche-surface-neutral-raised |
neutral/white | neutral/800 |
--arche-surface-neutral-inverse |
neutral/900 | neutral/50 |
--arche-surface-brand-primary |
greece/blue/500 | greece/blue/500 |
--arche-surface-brand-primary-subtle |
greece/blue/50 | greece/blue/700 |
--arche-surface-brand-secondary |
sweden/yellow/500 | sweden/yellow/800 |
--arche-surface-brand-secondary-subtle |
sweden/yellow/50 | sweden/yellow/900 |
--arche-surface-system-alert |
system/alert/50 | system/alert/900 |
--arche-surface-system-success |
system/success/50 | system/success/900 |
--arche-surface-system-warning |
system/warning/50 | system/warning/900 |
--arche-surface-overlay-scrim |
neutral/black-alpha-50 | neutral/black-alpha-50 |
--arche-surface-on-brand-switch-selected |
neutral/white | neutral/white |
--arche-surface-brand-secondary-band |
sweden/yellow/500 | sweden/yellow/500 |
--arche-surface-overlay-scrim-strong |
neutral/black-alpha-90 | neutral/black-alpha-90 |
--arche-surface-overlay-bar |
neutral/800 | neutral/800 |
--arche-surface-brand-accent |
norway/red/500 | norway/red/400 |
Border (12)
| CSS name | Light | Dark |
|---|---|---|
--arche-border-neutral-default |
neutral/200 | neutral/700 |
--arche-border-neutral-strong |
neutral/500 | neutral/500 |
--arche-border-neutral-emphasis |
neutral/800 | neutral/100 |
--arche-border-brand-default |
greece/blue/500 | greece/blue/400 |
--arche-border-system-alert |
system/alert/500 | system/alert/400 |
--arche-border-system-success |
system/success/500 | system/success/400 |
--arche-border-system-warning |
system/warning/500 | system/warning/400 |
--arche-border-focus-ring |
neutral/black | neutral/white |
--arche-border-focus-ring-on-brand |
neutral/white | neutral/white |
--arche-border-on-brand-divider |
greece/blue/300 | greece/blue/300 |
--arche-border-focus-ring-on-secondary |
neutral/900 | neutral/900 |
--arche-border-on-brand-cross-line |
neutral/white | neutral/white |
Text (19)
| CSS name | Light | Dark |
|---|---|---|
--arche-text-neutral-primary |
neutral/900 | neutral/white |
--arche-text-neutral-secondary |
neutral/600 | neutral/300 |
--arche-text-neutral-disabled |
neutral/400 | neutral/400 |
--arche-text-neutral-inverse |
neutral/white | neutral/900 |
--arche-text-brand-primary |
greece/blue/500 | greece/blue/200 |
--arche-text-brand-secondary |
sweden/yellow/500 | sweden/yellow/300 |
--arche-text-brand-tertiary-accent |
norway/red/500 | norway/red/400 |
--arche-text-system-alert |
system/alert/700 | system/alert/300 |
--arche-text-system-success |
system/success/700 | system/success/300 |
--arche-text-system-warning |
system/warning/700 | system/warning/300 |
--arche-text-neutral-body |
neutral/900 | neutral/100 |
--arche-text-on-brand-primary |
neutral/white | neutral/white |
--arche-text-on-brand-body |
greece/blue/50 | greece/blue/50 |
--arche-text-on-brand-secondary |
greece/blue/100 | greece/blue/100 |
--arche-text-on-brand-name |
sweden/yellow/500 | sweden/yellow/500 |
--arche-text-on-brand-switch-selected |
greece/blue/500 | greece/blue/500 |
--arche-text-on-brand-title |
sweden/yellow/500 | sweden/yellow/500 |
--arche-text-on-secondary-primary |
neutral/900 | neutral/900 |
--arche-text-on-secondary-body |
neutral/800 | neutral/800 |
Icon (8)
| CSS name | Light | Dark |
|---|---|---|
--arche-icon-neutral-default |
neutral/900 | neutral/white |
--arche-icon-neutral-muted |
neutral/400 | neutral/600 |
--arche-icon-neutral-inverse |
neutral/white | neutral/900 |
--arche-icon-brand-default |
greece/blue/500 | greece/blue/300 |
--arche-icon-system-alert |
system/alert/500 | system/alert/400 |
--arche-icon-system-success |
system/success/500 | system/success/400 |
--arche-icon-system-warning |
system/warning/500 | system/warning/400 |
--arche-icon-on-brand-default |
neutral/white | neutral/white |
Interactive (48)
| CSS name | Light | Dark |
|---|---|---|
--arche-interactive-button-primary-fill-default |
greece/blue/500 | greece/blue/200 |
--arche-interactive-button-primary-fill-hover |
greece/blue/400 | greece/blue/100 |
--arche-interactive-button-primary-fill-pressed |
greece/blue/700 | greece/blue/300 |
--arche-interactive-button-primary-fill-disabled |
neutral/200 | neutral/700 |
--arche-interactive-button-secondary-fill-default |
neutral/white | neutral/900 |
--arche-interactive-button-secondary-fill-hover |
greece/blue/50 | greece/blue/800 |
--arche-interactive-button-secondary-fill-pressed |
greece/blue/100 | greece/blue/700 |
--arche-interactive-button-secondary-fill-disabled |
neutral/white | neutral/900 |
--arche-interactive-button-secondary-border-default |
greece/blue/500 | greece/blue/200 |
--arche-interactive-button-secondary-border-disabled |
neutral/400 | neutral/600 |
--arche-interactive-button-secondary-border-inverse |
neutral/white | neutral/900 |
--arche-interactive-link-text-nav-default |
neutral/900 | neutral/white |
--arche-interactive-link-text-nav-hover |
neutral/900 | neutral/white |
--arche-interactive-link-text-nav-pressed |
neutral/black | neutral/100 |
--arche-interactive-link-text-nav-active |
neutral/900 | neutral/white |
--arche-interactive-link-text-nav-disabled |
neutral/300 | neutral/700 |
--arche-interactive-button-primary-fill-active |
greece/blue/700 | greece/blue/300 |
--arche-interactive-button-secondary-fill-active |
greece/blue/50 | greece/blue/800 |
--arche-interactive-progress |
greece/blue/500 | greece/blue/300 |
--arche-interactive-link-nav-indicator |
greece/blue/500 | greece/blue/200 |
--arche-interactive-button-primary-label-default |
neutral/white | greece/blue/900 |
--arche-interactive-button-primary-indicator |
neutral/white | greece/blue/900 |
--arche-interactive-button-secondary-border-pressed |
greece/blue/700 | greece/blue/100 |
--arche-interactive-button-secondary-label-default |
greece/blue/500 | greece/blue/200 |
--arche-interactive-button-secondary-label-pressed |
greece/blue/700 | greece/blue/100 |
--arche-interactive-button-secondary-indicator |
greece/blue/500 | greece/blue/200 |
--arche-interactive-button-tertiary-fill-hover |
greece/blue/50 | greece/blue/800 |
--arche-interactive-button-tertiary-fill-pressed |
greece/blue/100 | greece/blue/700 |
--arche-interactive-button-tertiary-fill-active |
greece/blue/50 | greece/blue/800 |
--arche-interactive-button-tertiary-label-default |
greece/blue/500 | greece/blue/200 |
--arche-interactive-button-tertiary-label-hover |
greece/blue/600 | greece/blue/100 |
--arche-interactive-button-tertiary-label-pressed |
greece/blue/700 | greece/blue/50 |
--arche-interactive-button-tertiary-label-active |
greece/blue/500 | greece/blue/200 |
--arche-interactive-button-tertiary-indicator |
greece/blue/500 | greece/blue/200 |
--arche-interactive-button-secondary-on-brand-border |
neutral/white | neutral/white |
--arche-interactive-button-secondary-on-brand-label |
neutral/white | neutral/white |
--arche-interactive-button-secondary-on-brand-fill-pressed |
greece/blue/700 | greece/blue/700 |
--arche-interactive-link-default |
greece/blue/500 | greece/blue/200 |
--arche-interactive-button-primary-on-brand-fill |
neutral/white | neutral/white |
--arche-interactive-button-primary-on-brand-label |
greece/blue/500 | greece/blue/500 |
--arche-interactive-button-secondary-on-brand-fill-hover |
greece/blue/400 | greece/blue/400 |
--arche-interactive-button-primary-on-brand-fill-hover |
greece/blue/50 | greece/blue/50 |
--arche-interactive-button-primary-on-brand-fill-pressed |
greece/blue/100 | greece/blue/100 |
--arche-interactive-link-on-brand-default |
neutral/white | neutral/white |
--arche-interactive-link-on-brand-hover |
neutral/white | neutral/white |
--arche-interactive-link-on-brand-pressed |
greece/blue/50 | greece/blue/50 |
--arche-interactive-link-on-brand-disabled |
greece/blue/100 | greece/blue/100 |
--arche-interactive-button-primary-on-brand-indicator |
greece/blue/300 | greece/blue/300 |
Logo (9)
| CSS name | Light | Dark |
|---|---|---|
--arche-logo-on-page-primary-box |
greece/blue/500 | greece/blue/500 |
--arche-logo-on-page-primary-letters |
neutral/white | neutral/white |
--arche-logo-on-page-secondary-line |
greece/blue/500 | greece/blue/200 |
--arche-logo-on-brand-primary-box |
neutral/white | neutral/white |
--arche-logo-on-brand-primary-letters |
greece/blue/500 | greece/blue/500 |
--arche-logo-on-brand-secondary-line |
neutral/white | neutral/white |
--arche-logo-on-secondary-primary-box |
greece/blue/500 | greece/blue/500 |
--arche-logo-on-secondary-primary-letters |
neutral/white | neutral/white |
--arche-logo-on-secondary-secondary-line |
greece/blue/500 | greece/blue/500 |
Selection (2)
| CSS name | Light | Dark |
|---|---|---|
--arche-selection-background |
sweden/yellow/500 | sweden/yellow/500 |
--arche-selection-text |
neutral/900 | neutral/900 |
Accent (2)
| CSS name | Light | Dark |
|---|---|---|
--arche-accent-rule |
norway/red/500 | norway/red/400 |
--arche-accent-numeral |
greece/blue/500 | greece/blue/200 |
Up next
Type
Two typefaces, fifteen styles, and how they step across three breakpoints.