Skip to main content
Version: 3.0.0-beta

Usage

Choose colour by what an element does, not by which swatch looks closest. Check for a dedicated role first; otherwise choose behaviour, tone and level. Interactive levels bring their states with them. Token names below use Figma's dotted form; Getting Started shows the CSS and TypeScript forms.

Check for a dedicated role​

Some tokens name their job directly. Use them instead of forcing the tone and level matrix onto a page surface, link, focus ring or disabled control:

TokenJob
background.canvasThe page behind everything
background.surfaceThe plane content sits on: cards, panels and table bodies
background.floating, background.dialogMenus and dialogs
background.inputForm field fills
background.invertedSurfaces that stand apart, such as snackbars
border.interactive.focusFocus rings
text.interactive.link.*Link states: default, hover and pressed
text.primary, .secondary, .tertiaryText hierarchy on ordinary surfaces
icon.primary, .secondary, .tertiaryThe icon equivalents
text.inverted, icon.invertedForegrounds on background.inverted

background.surface, background.dialog and background.floating resolve to the same colour today. Keep their distinct names so their roles can change independently. Inverted does not mean dark mode: its value changes with the colour scheme. Focus, link and disabled examples appear below.

Start with behaviour​

Use interactive only when the user can act on the element; the Introduction explains the two branches. A neutral muted row can be a control or a static piece of information. Both examples below use the same tone and level, but only the actionable row has hover and pressed values:

Actionable row
Neutral muted row
background.interactive.neutral.muted.default

hover and pressed values available

Static row
Neutral muted row
background.non-interactive.neutral.muted

no interaction states

The presence of an action determines the branch, not whether a hover effect would look good. A static panel does not become interactive because it contains a separate button; that button uses its own interactive tokens.

Choose a tone​

Use accent for primary actions and selection, neutral for structure and secondary actions, and info, success, warning or danger when the content communicates that meaning. Tone does not determine how prominent a static message should be: a warning can be muted or emphasised. See the tone guide for the full distinctions.

Choose a level​

Levels depend on both the surface and whether it is interactive.

Interactive backgrounds have two levels, plus a third for selection:

LevelUse forForeground
mutedTinted controls and interactive surfaces that should not dominateTypically text.on-muted.<tone>
emphasisSolid controls and the primary actionTypically text.on-emphasis.<tone>
selectedPersistent selection, available on accent and neutral onlySee Foreground pairing

Interactive borders have muted and emphasis, each with default, hover and pressed states. They have neither a default nor a selected level.

Non-interactive backgrounds and borders have three levels and no interaction states:

LevelUse forForeground on a background
mutedThe faintest tint that still communicates a toneTypically text.on-muted.<tone>
defaultThe middle strength for a tinted elementTypically text.on-default.<tone>
emphasisA solid status fill or other strong, static signalTypically text.on-emphasis.<tone>

The foreground column applies to backgrounds, not borders. Foreground pairing covers how to check it and where the typical pairing does not hold.

default has two meanings
  • On the interactive branch, default is a state.
  • On the non-interactive branch, default is a level.
background.interactive.accent.emphasis.default
background.non-interactive.accent.default

Position tells you which one you are reading. Interactive names finish with a state; non-interactive names do not.

Interactive: a statebackground.interactive.accent.emphasis.<state>
defaultbackground.interactive.accent.emphasis.default
hoverbackground.interactive.accent.emphasis.hover
pressedbackground.interactive.accent.emphasis.pressed
Non-interactive: a levelbackground.non-interactive.accent.<level>
mutedbackground.non-interactive.accent.muted
defaultbackground.non-interactive.accent.default
emphasisbackground.non-interactive.accent.emphasis

Interactive levels and states​

Pick a level, and its default, hover and pressed states come attached. These states describe the current interaction, not a lasting choice: selected is a persistent level, and even a selected item can be hovered or pressed. Every state has its own named colour. Do not derive states with opacity or filter: brightness(): those approaches break against tinted surfaces, invert incorrectly in dark mode and leave the resulting colour without a semantic name.

Background​

The complete matrix is shown for neutral and accent because they are the two tones that also have a selected level.

neutralbackground.interactive.neutral
mutedemphasisselected
defaultbackground.interactive.neutral.muted.defaultbackground.interactive.neutral.emphasis.defaultbackground.interactive.neutral.selected.default
hoverbackground.interactive.neutral.muted.hoverbackground.interactive.neutral.emphasis.hoverbackground.interactive.neutral.selected.hover
pressedbackground.interactive.neutral.muted.pressedbackground.interactive.neutral.emphasis.pressedbackground.interactive.neutral.selected.pressed
accentbackground.interactive.accent
mutedemphasisselected
defaultbackground.interactive.accent.muted.defaultbackground.interactive.accent.emphasis.defaultbackground.interactive.accent.selected.default
hoverbackground.interactive.accent.muted.hoverbackground.interactive.accent.emphasis.hoverbackground.interactive.accent.selected.hover
pressedbackground.interactive.accent.muted.pressedbackground.interactive.accent.emphasis.pressedbackground.interactive.accent.selected.pressed

The info, success, warning and danger tones follow the same muted and emphasis columns, with all three states, but have no selected level, because selection is a UI state rather than a semantic condition.

Border​

Interactive borders use the same three states, but only the muted and emphasis levels:

neutralborder.interactive.neutral
mutedemphasis
defaultborder.interactive.neutral.muted.defaultborder.interactive.neutral.emphasis.default
hoverborder.interactive.neutral.muted.hoverborder.interactive.neutral.emphasis.hover
pressedborder.interactive.neutral.muted.pressedborder.interactive.neutral.emphasis.pressed
accentborder.interactive.accent
mutedemphasis
defaultborder.interactive.accent.muted.defaultborder.interactive.accent.emphasis.default
hoverborder.interactive.accent.muted.hoverborder.interactive.accent.emphasis.hover
pressedborder.interactive.accent.muted.pressedborder.interactive.accent.emphasis.pressed

There is no selected border level. A selected item can use the selected background level, which has its own default, hover and pressed states. Do not assume that selecting an item adds a border.

Non-interactive levels​

Non-interactive backgrounds and borders have muted, default and emphasis levels. These are three degrees of prominence, not interaction states. Neither surface has hover or pressed values.

Background​

The neutral and accent examples show how a static fill changes across the three levels:

background.non-interactive.<tone>.<level>
tonemuteddefaultemphasis
neutralbackground.non-interactive.neutral.mutedbackground.non-interactive.neutral.defaultbackground.non-interactive.neutral.emphasis
accentbackground.non-interactive.accent.mutedbackground.non-interactive.accent.defaultbackground.non-interactive.accent.emphasis

Border​

The same levels apply to static borders. A neutral border at the middle level is border.non-interactive.neutral.default:

border.non-interactive.<tone>.<level>
tonemuteddefaultemphasis
neutralborder.non-interactive.neutral.mutedborder.non-interactive.neutral.defaultborder.non-interactive.neutral.emphasis
accentborder.non-interactive.accent.mutedborder.non-interactive.accent.defaultborder.non-interactive.accent.emphasis

Both surfaces have the same levels for all six tones. See Foreground pairing for backgrounds with their text and icon foregrounds, or the reference for every token.

Foreground pairing​

A foreground is the text or icon that sits on a background. Choose it from the background you are placing it on.

Match the level and tone​

Each tinted or solid background level has a foreground named after it. Use the one with the same level and the same tone:

Background levelTextIcon
mutedtext.on-muted.<tone>icon.on-muted.<tone>
default (non-interactive only)text.on-default.<tone>icon.on-default.<tone>
emphasistext.on-emphasis.<tone>icon.on-emphasis.<tone>

A background.non-interactive.danger.muted fill takes text.on-muted.danger. The tone must match as well as the level: text.on-muted.accent is a different colour.

On ordinary surfaces such as background.surface and background.canvas, use text.primary, .secondary or .tertiary instead. See Check for a dedicated role.

When to use something else​

  • A component specifies another foreground. Follow the component. The warning banner uses text.primary and icon.on-default.warning on a muted fill.
  • Do not use text.inverted on solid fills. Use text.on-emphasis.<tone>. inverted belongs only on background.inverted, and its value changes with the colour scheme.

Selected backgrounds​

Selected backgrounds have no on-selected foreground. Use text.primary and icon.primary, then check each state:

Selected backgroundLight (default / hover / pressed)Dark (default / hover / pressed)Result
neutralLc 65 or higherLc 65 or higherSuitable for short labels in every state
accentAbout Lc 65 / 49 / 34About Lc 88 / 67 / 43Light hover, light pressed and dark pressed fall below Lc 60

Selected accent passes in its default state, but that does not carry through to every hover and pressed state. Check every state in both schemes, with the intended text size and weight, before you use it.

Specimens​

The gallery shows representative default-state pairings first; expand it to see every tone and level. Borders in the gallery are optional examples, not required with the fill.

Representative pairings

Surfaces

Surfaces
Sample text on this fill
Fill: background.surfaceText: text.primaryIcon: icon.secondaryBorder (example): border.non-interactive.neutral.default

Interactive, emphasis

accent
Sample text on this fill
Fill: background.interactive.accent.emphasis.defaultText: text.on-emphasis.accentIcon: icon.on-emphasis.accent

Non-interactive, emphasis

success
Sample text on this fill
Fill: background.non-interactive.success.emphasisText: text.on-emphasis.successIcon: icon.on-emphasis.success

Non-interactive, default

info
Sample text on this fill
Fill: background.non-interactive.info.defaultText: text.on-default.infoIcon: icon.on-default.info

Non-interactive, muted

warning
Sample text on this fill
Fill: background.non-interactive.warning.mutedText: text.on-muted.warningIcon: icon.on-muted.warningBorder (example): border.non-interactive.warning.muted

Selected, neutral

Selected, neutral
Sample text on this fill
Fill: background.interactive.neutral.selected.defaultText: text.primaryIcon: icon.primary
Explore all tones and levels

Full pairing gallery

Surfaces

The planes your content sits on.

Surfaces
Sample text on this fill
Fill: background.surfaceText: text.primaryIcon: icon.secondaryBorder (example): border.non-interactive.neutral.default

Canvas

The page behind everything.

Canvas
Sample text on this fill
Fill: background.canvasText: text.primaryIcon: icon.secondaryBorder (example): border.non-interactive.neutral.muted

Interactive, emphasis

Solid fills you can act on, such as a primary button.

accent
Sample text on this fill
Fill: background.interactive.accent.emphasis.defaultText: text.on-emphasis.accentIcon: icon.on-emphasis.accent
neutral
Sample text on this fill
Fill: background.interactive.neutral.emphasis.defaultText: text.on-emphasis.neutralIcon: icon.on-emphasis.neutral
info
Sample text on this fill
Fill: background.interactive.info.emphasis.defaultText: text.on-emphasis.infoIcon: icon.on-emphasis.info
success
Sample text on this fill
Fill: background.interactive.success.emphasis.defaultText: text.on-emphasis.successIcon: icon.on-emphasis.success
warning
Sample text on this fill
Fill: background.interactive.warning.emphasis.defaultText: text.on-emphasis.warningIcon: icon.on-emphasis.warning
danger
Sample text on this fill
Fill: background.interactive.danger.emphasis.defaultText: text.on-emphasis.dangerIcon: icon.on-emphasis.danger

Interactive, muted

Tinted fills you can act on, such as a secondary button.

accent
Sample text on this fill
Fill: background.interactive.accent.muted.defaultText: text.on-muted.accentIcon: icon.on-muted.accentBorder (example): border.interactive.accent.muted.default
neutral
Sample text on this fill
Fill: background.interactive.neutral.muted.defaultText: text.on-muted.neutralIcon: icon.on-muted.neutralBorder (example): border.interactive.neutral.muted.default
info
Sample text on this fill
Fill: background.interactive.info.muted.defaultText: text.on-muted.infoIcon: icon.on-muted.infoBorder (example): border.interactive.info.muted.default
success
Sample text on this fill
Fill: background.interactive.success.muted.defaultText: text.on-muted.successIcon: icon.on-muted.successBorder (example): border.interactive.success.muted.default
warning
Sample text on this fill
Fill: background.interactive.warning.muted.defaultText: text.on-muted.warningIcon: icon.on-muted.warningBorder (example): border.interactive.warning.muted.default
danger
Sample text on this fill
Fill: background.interactive.danger.muted.defaultText: text.on-muted.dangerIcon: icon.on-muted.dangerBorder (example): border.interactive.danger.muted.default

Non-interactive, emphasis

Solid fills that do not respond to input, such as a status pip.

accent
Sample text on this fill
Fill: background.non-interactive.accent.emphasisText: text.on-emphasis.accentIcon: icon.on-emphasis.accent
neutral
Sample text on this fill
Fill: background.non-interactive.neutral.emphasisText: text.on-emphasis.neutralIcon: icon.on-emphasis.neutral
info
Sample text on this fill
Fill: background.non-interactive.info.emphasisText: text.on-emphasis.infoIcon: icon.on-emphasis.info
success
Sample text on this fill
Fill: background.non-interactive.success.emphasisText: text.on-emphasis.successIcon: icon.on-emphasis.success
warning
Sample text on this fill
Fill: background.non-interactive.warning.emphasisText: text.on-emphasis.warningIcon: icon.on-emphasis.warning
danger
Sample text on this fill
Fill: background.non-interactive.danger.emphasisText: text.on-emphasis.dangerIcon: icon.on-emphasis.danger

Non-interactive, default

The middle strength for a non-interactive tinted element.

accent
Sample text on this fill
Fill: background.non-interactive.accent.defaultText: text.on-default.accentIcon: icon.on-default.accent
neutral
Sample text on this fill
Fill: background.non-interactive.neutral.defaultText: text.on-default.neutralIcon: icon.on-default.neutral
info
Sample text on this fill
Fill: background.non-interactive.info.defaultText: text.on-default.infoIcon: icon.on-default.info
success
Sample text on this fill
Fill: background.non-interactive.success.defaultText: text.on-default.successIcon: icon.on-default.success
warning
Sample text on this fill
Fill: background.non-interactive.warning.defaultText: text.on-default.warningIcon: icon.on-default.warning
danger
Sample text on this fill
Fill: background.non-interactive.danger.defaultText: text.on-default.dangerIcon: icon.on-default.danger

Non-interactive, muted

A faint tint with a tone-specific foreground; component designs may specify another.

accent
Sample text on this fill
Fill: background.non-interactive.accent.mutedText: text.on-muted.accentIcon: icon.on-muted.accentBorder (example): border.non-interactive.accent.muted
neutral
Sample text on this fill
Fill: background.non-interactive.neutral.mutedText: text.on-muted.neutralIcon: icon.on-muted.neutralBorder (example): border.non-interactive.neutral.muted
info
Sample text on this fill
Fill: background.non-interactive.info.mutedText: text.on-muted.infoIcon: icon.on-muted.infoBorder (example): border.non-interactive.info.muted
success
Sample text on this fill
Fill: background.non-interactive.success.mutedText: text.on-muted.successIcon: icon.on-muted.successBorder (example): border.non-interactive.success.muted
warning
Sample text on this fill
Fill: background.non-interactive.warning.mutedText: text.on-muted.warningIcon: icon.on-muted.warningBorder (example): border.non-interactive.warning.muted
danger
Sample text on this fill
Fill: background.non-interactive.danger.mutedText: text.on-muted.dangerIcon: icon.on-muted.dangerBorder (example): border.non-interactive.danger.muted

Selected, neutral

Short labels on a selected neutral row; check typography in every state.

Selected, neutral
Sample text on this fill
Fill: background.interactive.neutral.selected.defaultText: text.primaryIcon: icon.primary

Selected, accent (default only)

The default state only. Check APCA before using hover or pressed.

Selected, accent (default only)
Sample text on this fill
Fill: background.interactive.accent.selected.defaultText: text.primaryIcon: icon.primary

Inverted

Surfaces that stand apart from their surroundings, such as a snackbar.

Inverted
Sample text on this fill
Fill: background.invertedText: text.invertedIcon: icon.inverted

Input

Form field fills.

Input
Sample text on this fill
Fill: background.inputText: text.primaryIcon: icon.secondaryBorder (example): border.interactive.neutral.muted.default

Disabled

A disabled control has no tone.

Disabled
Sample text on this fill
Fill: background.interactive.disabledText: text.interactive.disabledIcon: icon.interactive.disabledBorder (example): border.interactive.disabled

Interactive examples​

These controls respond to input. Their backgrounds change state; foreground and border tokens are chosen for the actual design, not derived from the fill.

An emphasis action​

The default, hover and pressed colours all come from the same level:

Continue
The default state. Hover and pressed use the matching values from the same emphasis level.
.primary-action {
background: var(--eds-background-interactive-accent-emphasis-default);
color: var(--eds-text-on-emphasis-accent);
}

.primary-action:hover {
background: var(--eds-background-interactive-accent-emphasis-hover);
}

.primary-action:active {
background: var(--eds-background-interactive-accent-emphasis-pressed);
}

Swap accent for danger to create a destructive action. The level and state structure stays the same.

A muted action​

A quiet secondary action uses the neutral muted level. Its hover and pressed colours come from the same interactive family:

Secondary actionborder.interactive.neutral.muted.defaultstroke
The default state of a quiet interactive surface.
.secondary-action {
background: var(--eds-background-interactive-neutral-muted-default);
border: 1px solid var(--eds-border-interactive-neutral-muted-default);
color: var(--eds-text-on-muted-neutral);
}

.secondary-action:hover {
background: var(--eds-background-interactive-neutral-muted-hover);
border-color: var(--eds-border-interactive-neutral-muted-hover);
}

.secondary-action:active {
background: var(--eds-background-interactive-neutral-muted-pressed);
border-color: var(--eds-border-interactive-neutral-muted-pressed);
}

A selected row​

A selected neutral row moves to the selected level and still has default, hover and pressed states. It uses the neutral text.primary pairing from Foreground pairing, which does not carry over to accent selected.

Selected row
The default state of a selected row.
.table-row[aria-selected='true'] {
background: var(--eds-background-interactive-neutral-selected-default);
color: var(--eds-text-primary);
}

.table-row[aria-selected='true']:hover {
background: var(--eds-background-interactive-neutral-selected-hover);
}

.table-row[aria-selected='true']:active {
background: var(--eds-background-interactive-neutral-selected-pressed);
}

This working link jumps to the non-interactive examples below. Hover it to see both the text and underline change; Tab to it to see the focus ring:

Explore non-interactive examples

link sits in the tone position but is a role rather than a tone. The underline is a border.interactive.link.* token, not a colour chosen by eye:

.colour-usage-link {
color: var(--eds-text-interactive-link-default);
text-decoration: underline;
text-decoration-color: var(--eds-border-interactive-link-default);
}

.colour-usage-link:hover {
color: var(--eds-text-interactive-link-hover);
text-decoration-color: var(--eds-border-interactive-link-hover);
}

.colour-usage-link:active {
color: var(--eds-text-interactive-link-pressed);
text-decoration-color: var(--eds-border-interactive-link-pressed);
}

.colour-usage-link:focus-visible {
outline: 2px solid var(--eds-border-interactive-focus);
outline-offset: 1px;
}

icon.interactive.link.* follows the same states for a link that carries an icon.

Focus and disabled​

Focus colour is the same on every element. This static specimen shows the ring a keyboard-focused action would have:

Focused action
:focus-visible {
outline: 2px solid var(--eds-border-interactive-focus);
outline-offset: 1px;
}

Disabled is a separate neutral set rather than a faint version of the element's tone. This is a static illustration, not an interactive control:

Disabled action
.action:disabled {
background: var(--eds-background-interactive-disabled);
border: 1px solid var(--eds-border-interactive-disabled);
color: var(--eds-text-interactive-disabled);
}

A disabled destructive action is not a faint red. A control that cannot be actioned has no tone to convey.

Non-interactive examples​

These backgrounds communicate meaning without hover or pressed states. Any controls inside them use their own interactive tokens.

A warning banner​

The Figma warning Banner has a muted fill and border, a warning icon, primary text and a dismiss control. The banner surface remains non-interactive.

Check the values before continuing. Some inputs may need correction.

border.non-interactive.warning.mutedstroke
A warning Banner: static background and border.
.warning-banner {
background: var(--eds-background-non-interactive-warning-muted);
border: 1px solid var(--eds-border-non-interactive-warning-muted);
color: var(--eds-text-primary);
}

.warning-banner .warning-icon {
color: var(--eds-icon-on-default-warning);
}

A default informational panel​

Use the middle level when information needs more presence than a muted tint but is not the main focus. This panel is not a control:

Scheduled maintenance is tomorrow.
A static information panel at the non-interactive default level.
.information-panel {
background: var(--eds-background-non-interactive-info-default);
color: var(--eds-text-on-default-info);
}

There is no hover or pressed token to add to this panel. A control inside it would use its own interactive tokens.

A solid success badge​

The Figma Badge's Success / High / Solid variant uses the non-interactive emphasis fill with the matching foreground and a small, medium-weight label. The badge is not a control:

Completed
A high-emphasis solid success Badge, using its Figma typography and spacing.
.completed-badge {
background: var(--eds-background-non-interactive-success-emphasis);
color: var(--eds-text-on-emphasis-success);
font-size: var(--eds-typography-ui-sm-font-size);
font-weight: var(--eds-font-weight-bolder);
line-height: var(--eds-typography-ui-sm-line-height);
padding: var(--eds-spacing-4xs) var(--eds-spacing-2xs);
border-radius: var(--eds-corner-radius-rounded);
}

Do's and Don'ts​

Do
  • Choose by behaviour: actionable elements use interactive tokens; static surfaces do not have hover or pressed states.
  • Use the named hover and pressed tokens for interactive states.
  • Use semantic tokens and check the actual foreground, fill, scheme, state and typography with APCA.
  • Follow component-specific foregrounds when they differ from the general pairing, as the warning Banner does.
  • Use the dedicated, tone-free tokens for disabled controls.
Don't
  • Pick by appearance or give a static banner hover values.
  • Derive states with opacity or filters instead of using their named tokens.
  • Assume text.primary works on every tinted fill or every selected accent state.
  • Bind components to numbered palette steps, use text.tertiary for ordinary body text, or use data-visualization.* for interface chrome.

Coming from an earlier version​

The state and strength names changed from EDS 1.x and 2.0.0-beta, and some tokens have no direct equivalent. Migration covers both routes.