Skip to main content

Surfaces

The background/elevation treatment everything else in the system sits on top of. Use to establish depth and visual hierarchy between page background, cards, and floating content. Don't use as a substitute for spacing or container tokens.

OverviewStyleAccessibility

Description

Anatomy

PartRequired?Notes
Surface fill Required The background colour itself — one of Default, Raised, Lowered, or Inverse.
Surface border Optional The paired border colour for that surface level, used when background contrast alone doesn't define the boundary (e.g. Default-on-Default nesting).
On-surface content Required Text, icon, and interactive-element colours are chosen relative to the surface they sit on, not globally — the same text token can fail contrast on Inverse where it passes on Default.

Variants

States

State Behaviour
Light theme Default and Lowered currently resolve to the same token value in Light — see Style tab. Raised is a step lighter.
Dark theme Default and Raised currently resolve to distinct neutral steps; Inverse flips to a near-white neutral, the mirror of Light's near-black Inverse.

Usage guidelines

Do / Don't

Do

Pick a component's background from Surface tokens, not a hardcoded hex value or an unrelated Primitive.

Don't

Don't reference a Primitive colour (e.g. color-neutral-10) directly in component CSS — go through the Surface (or component-level WA-native) token so a future palette change propagates.

Do

Treat Raised/Lowered as relative to their immediate parent surface, not as absolute z-index levels.

Don't

Don't stack Raised-on-Raised-on-Raised expecting each to read as progressively more elevated — the model has four levels, not infinite depth.

Layout & Spacing

Surfaces are a colour concept, not a spacing one — they carry no dimensional tokens of their own. Pair with Containers' padding/radius tokens for the actual box model.

Tokens

PartTokenValue
Surface / Default --wa-color-surface-default Light: color.surface.default · Dark: color.neutral.10
Surface / Raised --wa-color-surface-raised Light: color.surface.raised · Dark: color.neutral.05
Surface / Lowered --wa-color-surface-lowered Light: color.surface.lowered · Dark: color.neutral.10
Surface / Inverse --wa-color-surface-inverse Light: color.surface.inverse · Dark: color.neutral.95
Surface / Border --wa-color-surface-border Light and Dark: color.border.subtle

Engineering notes

  • There is no wa-surface element — Surface tokens are consumed as background-colour custom properties by whatever component needs them, the same way Containers does.
  • Reference the WA-native custom property (--wa-color-surface-*) from component code, not the raw Semantic or Primitive token — that's the same Component-vs-Semantic split documented on the Containers and token architecture pages.
  • When adding a new container-like component, check this page first before introducing a new background token.

Focus

Surfaces themselves carry no focus behaviour — they're a background concept. Focus-ring contrast against whichever surface a component sits on is that component's own responsibility.

Contrast

Contrast ratios for text/icons on each surface are the responsibility of the component consuming that surface (see each component's own Accessibility tab) — this page doesn't re-verify them independently since the same text token behaves differently depending on which surface it lands on.

Touch targets

Not applicable — surfaces have no interactive affordance on their own.

Things to avoid

  • Don't assume a contrast pass on Default automatically holds on Inverse or Raised — re-check per surface.

Was this page helpful?

Updated 2 October 2026