Coop Design System

Colour

Semantic colour tokens named by the job they do in the interface, not by their hex value — the foundation for consistent, themeable UI.

Colour cover

Semantic colour tokens are named by what the colour is used for in the interface, not by its hex value – for example, color.text.primary or color.background.success. They form the base for consistent, themeable UI.

This means:

  • UI stays consistent across teams and platforms.
  • Products can support different themes (light/dark and brand themes) without renaming tokens.
  • Accessibility can be improved and maintained in one place.

Theming model

All themes share the same token names.

  • Light and dark mode do not introduce new tokens.
  • A theme changes the value of a token, not its name.

Avoid creating tokens like ...light or ...dark, as this leads to duplication. Instead, use existing semantic tokens and let the theme handle the value.

How to pick the right colour token

  1. Start from the context – what surface are you on (canvas, subtle, elevated, inverse)?
  2. Choose tokens that match that surface – for example ...primary/secondary/tertiary or ...inverse / ...on-*.
  3. For interactive UI, use the interactive tokens for the right variant (primary, secondary, outlined, etc.) to keep hover/pressed states consistent.

Avoid using primitives or raw values in product code. If a suitable semantic token doesn’t exist, contact the CDS team.

Token reference

Values are defined per theme in the token packages. The table below describes how each token is used.

Background

TokenUse
color.background.backdropBackdrop/scrim behind overlays and modals.
color.background.sheetNon-interactive background.
color.background.brand.accentBrand surface (accent). Use when attention is the absolute priority.
color.background.brand.primaryBrand surface (primary). Use for brand blocks, banners, and key actions.
color.background.brand.secondaryBrand surface (secondary). Use for brand blocks and banners.
color.background.brand.tertiaryBrand surface (tertiary). Use for brand blocks and banners.
color.background.canvasApp/page canvas background (lowest layer).
color.background.elevatedUse for surfaces that appear above the main content, such as modals, flyouts, and dropdowns.
color.background.feedback.criticalFeedback surface for critical messages, such as alerts and banners.
color.background.feedback.destructiveFeedback surface for destructive messages, such as alerts and banners.
color.background.feedback.neutralFeedback surface for neutral messages, such as alerts and banners.
color.background.feedback.successFeedback surface for success messages, such as alerts and banners.
color.background.feedback.warningFeedback surface for warning messages, such as alerts and banners.
color.background.inverseInverse surface used in dark-on-light / light-on-dark contexts.
color.background.pricing.discountPricing surface for discount contexts.
color.background.pricing.memberPricing surface for member contexts.
color.background.subtleSubtle surface for low-emphasis containers (e.g. section backgrounds).
color.background.transparentNo background colour – the element takes on the background of its parent surface.

Text

TokenUse
color.text.brand.on-accentText on brand on-accent surfaces.
color.text.brand.on-primaryText on brand on-primary surfaces.
color.text.brand.on-secondaryText on brand on-secondary surfaces.
color.text.brand.on-tertiaryText on brand on-tertiary surfaces.
color.text.feedback.errorStandalone error text (e.g. inline validation).
color.text.feedback.on-criticalText on feedback critical surfaces.
color.text.feedback.on-destructiveText on feedback destructive surfaces.
color.text.feedback.on-neutralText on feedback neutral surfaces.
color.text.feedback.on-successText on feedback success surfaces.
color.text.feedback.on-warningText on feedback warning surfaces.
color.text.highlightHighlight text, such as selections and emphasis, on default surfaces.
color.text.inverseText on inverse surfaces.
color.text.pricing.on-discountText on pricing discount surfaces.
color.text.pricing.on-memberText on pricing member surfaces.
color.text.primaryPrimary body text on default surfaces.
color.text.secondarySecondary/supporting text on default surfaces.
color.text.tertiaryLow-emphasis text, such as metadata and hints, on default surfaces.

Icon

TokenUse
color.icon.brand.accentBrand icon colour (accent). Use when an icon should be emphasised.
color.icon.brand.on-accentIcons on brand on-accent surfaces.
color.icon.brand.on-primaryIcons on brand on-primary surfaces.
color.icon.brand.on-secondaryIcons on brand on-secondary surfaces.
color.icon.brand.on-tertiaryIcons on brand on-tertiary surfaces.
color.icon.brand.primaryBrand icon colour (primary). Use when an icon should be brand-coloured.
color.icon.brand.secondaryBrand icon colour (secondary). Use when an icon itself should be supporting.
color.icon.brand.tertiaryBrand icon colour (tertiary). Use when an icon itself should be decorative.
color.icon.feedback.errorStandalone error icons, for example inline validation.
color.icon.feedback.on-criticalIcons on feedback critical surfaces.
color.icon.feedback.on-destructiveIcons on feedback destructive surfaces.
color.icon.feedback.on-neutralIcons on feedback neutral surfaces.
color.icon.feedback.on-successIcons on feedback success surfaces.
color.icon.feedback.on-warningIcons on feedback warning surfaces.
color.icon.highlightHighlight icons, such as selected states, on default surfaces.
color.icon.inverseIcons on inverse surfaces.
color.icon.pricing.on-discountIcons on pricing discount surfaces.
color.icon.pricing.on-memberIcons on pricing member surfaces.
color.icon.primaryPrimary icons on default surfaces.
color.icon.secondarySecondary/supporting icons on default surfaces.

Stroke

Stroke tokens cover borders, dividers, and outlines.

TokenUse
color.stroke.brand.on-accentStroke on brand on-accent surfaces.
color.stroke.brand.on-primaryStroke on brand on-primary surfaces.
color.stroke.brand.on-secondaryStroke on brand on-secondary surfaces.
color.stroke.brand.on-tertiaryStroke on brand on-tertiary surfaces.
color.stroke.dividerDefault dividers (list separators, table grid).
color.stroke.feedback.criticalStroke for feedback critical surfaces.
color.stroke.feedback.errorStandalone error stroke (e.g. invalid input outline).
color.stroke.feedback.neutralStroke for feedback neutral surfaces.
color.stroke.feedback.successStroke for feedback success surfaces.
color.stroke.feedback.warningStroke for feedback warning surfaces.
color.stroke.highlightHighlight stroke (selection, focus-adjacent decoration).
color.stroke.pricing.discountStroke for pricing discount contexts.
color.stroke.pricing.memberStroke for pricing member contexts.
color.stroke.strongHigh-emphasis stroke (strong outlines, emphasis separators).
color.stroke.subtleLow-emphasis stroke (borders on quiet surfaces).
color.stroke.transparentTransparent stroke used to reserve space without visual border.

Interactive colours

Interactive colour tokens are used for components with different states, such as buttons, controls, and cards (clickable surfaces).

  • Default / hover / pressed are defined as separate tokens to keep behavior consistent.
  • Don’t create your own hover states in product code, for example by combining background and opacity.

Cards (clickable surface)

TokenUse
color.interactive.card.backgroundInteractive component container.
color.interactive.card.background-hoverInteractive component container on hover/focus (pointer).
color.interactive.card.background-pressedInteractive component container on pressed/active.
color.interactive.card.iconIcon colour.
color.interactive.card.textText colour.
TokenUse
color.interactive.link.textText colour.
color.interactive.link.text-inverseLink text on inverse surfaces.
color.interactive.link.text-inverse-visitedVisited link text on inverse surfaces.
color.interactive.link.text-visitedVisited link text.

Controls (inputs, toggles, selection)

TokenUse
color.interactive.control.backgroundDefault background.
color.interactive.control.background-hoverBackground on hover/focus (pointer).
color.interactive.control.background-pressedBackground on pressed/active.
color.interactive.control.background-selection-offSelection background when OFF.
color.interactive.control.background-selection-onSelection background when ON.
color.interactive.control.iconIcon colour.
color.interactive.control.icon-inverse-inverseIcon used on inverse backgrounds, for example the thumb in a switch.
color.interactive.control.indicator-offIndicator/bullet when OFF.
color.interactive.control.indicator-onIndicator/bullet when ON.
color.interactive.control.strokeStroke/border colour.
color.interactive.control.stroke-hoverStroke on hover.
color.interactive.control.stroke-pressedStroke on pressed/active.
color.interactive.control.textText colour.

Read-only

TokenUse
color.interactive.background-read-onlyDefault background for read-only objects.
color.interactive.icon-read-onlyIcon colour for read-only objects.
color.interactive.stroke-read-onlyStroke colour for read-only objects.
color.interactive.text-read-onlyText colour for read-only objects.

Button and action variants

Choose the variant that matches the semantic intent (the purpose) of the action:

  • primary — main call-to-action
  • secondary — supporting action
  • subtle — low-emphasis action
  • outlined / outlined-subtle — actions that should stay light on the surface
  • inverse / outlined-inverse — actions placed on inverse surfaces
  • critical — high-risk confirmation (non-destructive)
  • destructive — destructive actions (delete, remove)

Primary

TokenUse
color.interactive.primary.backgroundDefault background colour.
color.interactive.primary.background-hoverBackground colour on hover/focus (pointer).
color.interactive.primary.background-pressedBackground colour on pressed/active.
color.interactive.primary.iconIcon colour.
color.interactive.primary.strokeStroke/border colour.
color.interactive.primary.stroke-hoverStroke on hover.
color.interactive.primary.stroke-pressedStroke on pressed/active.
color.interactive.primary.textText colour.

Secondary

TokenUse
color.interactive.secondary.backgroundDefault background colour.
color.interactive.secondary.background-hoverBackground colour on hover/focus (pointer).
color.interactive.secondary.background-pressedBackground colour on pressed/active.
color.interactive.secondary.iconIcon colour.
color.interactive.secondary.strokeStroke/border colour.
color.interactive.secondary.stroke-hoverStroke on hover.
color.interactive.secondary.stroke-pressedStroke on pressed/active.
color.interactive.secondary.textText colour.

Subtle

TokenUse
color.interactive.subtle.backgroundDefault background colour.
color.interactive.subtle.background-hoverBackground colour on hover/focus (pointer).
color.interactive.subtle.background-pressedBackground colour on pressed/active.
color.interactive.subtle.iconIcon colour.
color.interactive.subtle.strokeStroke/border colour.
color.interactive.subtle.stroke-hoverStroke on hover.
color.interactive.subtle.stroke-pressedStroke on pressed/active.
color.interactive.subtle.textText colour.

Outlined

TokenUse
color.interactive.outlined.backgroundDefault background colour.
color.interactive.outlined.background-hoverBackground colour on hover/focus (pointer).
color.interactive.outlined.background-pressedBackground colour on pressed/active.
color.interactive.outlined.iconIcon colour.
color.interactive.outlined.strokeStroke/border colour.
color.interactive.outlined.stroke-hoverStroke on hover.
color.interactive.outlined.stroke-pressedStroke on pressed/active.
color.interactive.outlined.textText colour.

Outlined Subtle

TokenUse
color.interactive.outlined-subtle.backgroundDefault background colour.
color.interactive.outlined-subtle.background-hoverBackground colour on hover/focus (pointer).
color.interactive.outlined-subtle.background-pressedBackground colour on pressed/active.
color.interactive.outlined-subtle.iconIcon colour.
color.interactive.outlined-subtle.strokeStroke/border colour.
color.interactive.outlined-subtle.stroke-hoverStroke on hover.
color.interactive.outlined-subtle.stroke-pressedStroke on pressed/active.
color.interactive.outlined-subtle.textText colour.

Inverse

TokenUse
color.interactive.inverse.backgroundDefault background colour.
color.interactive.inverse.background-hoverBackground colour on hover/focus (pointer).
color.interactive.inverse.background-pressedBackground colour on pressed/active.
color.interactive.inverse.iconIcon colour.
color.interactive.inverse.strokeStroke/border colour.
color.interactive.inverse.stroke-hoverStroke on hover.
color.interactive.inverse.stroke-pressedStroke on pressed/active.
color.interactive.inverse.textText colour.

Outlined Inverse

TokenUse
color.interactive.outlined-inverse.backgroundDefault background colour.
color.interactive.outlined-inverse.background-hoverBackground colour on hover/focus (pointer).
color.interactive.outlined-inverse.background-pressedBackground colour on pressed/active.
color.interactive.outlined-inverse.iconIcon colour.
color.interactive.outlined-inverse.strokeStroke/border colour.
color.interactive.outlined-inverse.stroke-hoverStroke on hover.
color.interactive.outlined-inverse.stroke-pressedStroke on pressed/active.
color.interactive.outlined-inverse.textText colour.

Critical

TokenUse
color.interactive.critical.backgroundDefault background colour.
color.interactive.critical.background-hoverBackground colour on hover/focus (pointer).
color.interactive.critical.background-pressedBackground colour on pressed/active.
color.interactive.critical.iconIcon colour.
color.interactive.critical.strokeStroke/border colour.
color.interactive.critical.stroke-hoverStroke on hover.
color.interactive.critical.stroke-pressedStroke on pressed/active.
color.interactive.critical.textText colour.

Destructive

TokenUse
color.interactive.destructive.backgroundDefault background colour.
color.interactive.destructive.background-hoverBackground colour on hover/focus (pointer).
color.interactive.destructive.background-pressedBackground colour on pressed/active.
color.interactive.destructive.iconIcon colour.
color.interactive.destructive.strokeStroke/border colour.
color.interactive.destructive.stroke-hoverStroke on hover.
color.interactive.destructive.stroke-pressedStroke on pressed/active.
color.interactive.destructive.textText colour.

On this page