Surface Token
You are building a new dashboard. Cards overlap tables. Modals sit on top of sidebars. Each layer needs its own background color to create visual hierarchy. Without surface tokens you end up picking colors on the fly. The result is a mess of slightly different grays that break as soon as you add dark mode or a new brand theme. Surface tokens fix this by defining roles first and letting colors follow.
A surface token is a design token that represents a specific type of background or elevation in your interface. Common names include surface-default for the main page, surface-raised for cards and panels, surface-subtle for secondary backgrounds, and surface-overlay for modals, tooltips, and dropdowns. The token acts as a reference that maps to different hex values depending on whether the app is in light mode, dark mode, or a custom branded theme. This separation of role from value is what allows systems to scale without constant manual updates. In role-based systems the surface tier sits at the bottom. Every other token, from text to borders to states, builds on top of it.
Surface tokens are not your full color palette. They are not accent colors for buttons and links. They are not semantic colors like success or warning. They are not fixed hex codes that you copy from Figma to code. They are not decorative. They are not a replacement for thinking about visual hierarchy. If you use a surface token to add personality or brand flair you have chosen the wrong tool for the job. Surface tokens are the quiet foundation. They do their work best when you do not notice them. They also reject the 60-30-10 rule. That rule measures paint coverage on a single static wall. Surface tokens ignore coverage and focus on behavior across hundreds of changing surfaces.
Look at how Linear builds their product. The 2024 version of Linear uses a strict set of surface tokens to create depth in an otherwise monochromatic dark interface. The base app background uses their surface-default token set to a deep near-black. Issue cards and panels use surface-raised a few shades lighter. The command menu and modals use surface-overlay which is lighter still to create clear separation. Because these are tokens Linear can experiment with new neutral hues across the entire product by updating a single mapping file. The change propagates everywhere without any designer hunting down stray hard-coded colors. Shopify Polaris offers another strong example. Their system defines surface tokens under the background category with roles for default, secondary, tertiary, and inverse. When they updated their design system in 2022 the surface tokens allowed them to introduce new elevation styles across their entire admin interface in weeks not months. The documentation even shows which surface pairs with which border and content tokens for guaranteed accessibility. Stripe follows the same logic on their billing pages where surface-default holds the main checkout form and surface-overlay lifts the add-card dialog above it.
You should use surface tokens any time you are creating a component that requires a background. That means page layouts, cards, navigation, sidebars, tables, form fields, and floating elements. They become indispensable when your product needs to support dark mode, multiple brand themes, or when more than two designers work on the same codebase. Stripe relies on surface tokens for their entire customer dashboard. The checkout flow uses surface-default for the page, surface-raised for the payment summary card, and surface-overlay for the coupon code modal. This consistency means their design team can focus on solving user problems instead of debating which gray is the right gray. Use them in Figma variants and CSS custom properties so a theme switch updates every instance instantly.
Do not use surface tokens for marketing creative or single canvas designs where the 60-30-10 rule still makes sense for proportion. Do not use them for text, icons, or borders. Those have their own token families. Do not create ad hoc surface colors for one-off components. That breaks the system the first time someone else tries to maintain your work. Do not rely on surface tokens alone if your product uses color to communicate meaning. You still need semantic tokens for that layer on top of the neutral surface system. Never name them after appearance like light-gray-200. That invites misuse the moment the palette updates.
Material Design 3 took surface tokens to the next level in 2021 by defining over a dozen distinct surface and on-surface roles. Their system includes surface-container-highest for the brightest elevations in dark mode and surface-container-lowest for the most subtle. The entire system is built so that adding a new dynamic color theme based on a users wallpaper only requires updating the source color. All surface tokens update automatically. Radix takes a numbered approach with their color scales. Designers pick from a 12 step neutral scale but the documentation annotates which steps are intended for surface backgrounds, which for borders, and which for solid elements. This shared vocabulary removes 90 percent of color arguments in a team setting.
Implementing surface tokens correctly requires discipline. Start by listing every distinct background context in your product. Assign each one a token name that describes its role rather than its color. Build a neutral scale with at least 8 to 12 steps. Map the roles to those steps. Then test every combination with your content tokens to confirm contrast ratios. Wire the tokens into your design library and your code base using CSS variables or equivalent. The final step is enforcement. Make it easier to use the token than to pick a custom color. The difference between a good surface token system and a bad one is attention to edge cases. What color does a disabled button background use? How does the surface change on hover for a card? Does the toast notification use a surface token or a semantic one? Answering these questions when you define the tokens saves weeks of work later. Polaris excels here by having dedicated tokens for interactive surfaces and disabled surfaces. Material 3 bakes state layers on top of surface tokens so that hover and press states are semi transparent overlays that work on any surface.
Teams that follow this process report fewer accessibility bugs, faster onboarding for new designers, and smoother dark mode launches. The surface layer becomes the stable base that lets accent colors and semantic colors do their jobs without fighting for attention. Surface tokens replace guesswork with structure so your backgrounds support the design instead of undermining it.
Surface tokens turn arbitrary backgrounds into predictable structured layers that keep your interface consistent across every mode and every update.
Read the full guide
Related terms
Keep exploring
Design Token
A named variable in a design system that stores a visual decision (color, spacing, type, radius, motion) and can resolve to different raw values per theme, platform, or context.
Color System
A color system is a structured framework of roles, rules, and token mappings that dictate exactly how colors behave across states, surfaces, themes, and components rather than a loose collection of swatches.
Neutral Scale
The 9-to-12-step ladder of tuned grays that handles surfaces, text, borders, backgrounds, and contrast in any real interface. Built before the anchor is finalized and adjusted to its temperature, it turns a moodboard into infrastructure.
Role-Based Tokens
Role-based tokens assign colors by UI purpose rather than hue or step number. Tokens like text-contrast, on-primary, bg-subtle and border-focus carry baked-in contrast ratios that satisfy WCAG AA the moment you use them.