GTC design tokens: a single source of truth for scalable design systems

GTC tokens model for scalable UI systems

Design tokens are the building blocks of every design system. But most token systems were built for a different era, and now that AI is in the workflow, their flaws pile up—making products harder to maintain and work with.

A well-designed token structure lets a brand grow fast and stay consistent, while poor token decisions slow the product down and turn any UI and brand change into a painful process.

After 10+ years of building, refining, and rebuilding enterprise token systems, I've designed the GTC model (Global, Theme, and Component)—a bulletproof semantic token layer, fluent for both people and agents.

In this article I'll walk you through the GTC model: what design tokens actually are, why they matter, and how to structure them so they hold up as the product grows.

Design tokens are reusable design values—such as colors, spacing, and typography, that build a visual language in large-scale design systems.

People use tokens in place of hard-coded values like hex colors (#ffffff) or font sizes (16px) in design. In code these map to CSS variables, so one token controls every place it's used, and the UI stays consistent.

GTC (Global, Theme, Component) is a design token framework for large-scale UI systems. Install the /gtc-tokens skill to teach an AI agent to audit, create, and manage the design system tokens.

Get started

What are design tokens

Design tokens are standardized design decisions that are necessary for consistent business growth. They're not just a technical choice, but a product decision that shapes how your product scales over time.

Design tokens let you make big transformations to a product's UI and propagate changes in an instant, no matter the type or size of the business.

When people refer to a design token, they typically mean a design decision that unifies multiple UI elements across the product. To make that decision reusable, every token is built from two key elements:

  • Value, such as #ffffff
  • Name, such as theme.icon.default
Design token anatomy: hex value #ffffff connected to token name theme.icon.default, which applies to a star icon.

Every token name is a unique identifier for a specific value. The same value can sit under more than one name, which lets tokens reference each other and form a hierarchy.

These references between tokens are called ‘token aliases’.

Aliases are what make tokens reusable. Instead of storing its own copy of a value, a token aliases another token, so the underlying value lives in exactly one place: a Global token. Change it there once, and every token that aliases it updates too.

Aliased this way, tokens form a hierarchy: a Global token holds the raw value at the base, and a Theme token on top aliases it to an element, like this:

Token alias chain: raw #ffffff in global.color.base.0, aliased by theme.icon.default to style a UI icon element.
  • #ffffff · Raw value
  • global.color.base.0 · Global token
  • theme.icon.default · Theme token

Why design tokens are so important

Design tokenization is what allows large enterprise systems to preserve consistent UI across multiple domains and sub-products.

Design tokens create a strong contract between the product and design-system teams. The design system owns tokens, and tokens own styling, semantics, and connections to components, while feature teams can focus solely on business logic without worrying about design drift.

This clear split of domains is especially valuable during redesigns. Tokens help move to new designs faster, as any global UI change, such as style updates or component improvements, can be rolled out by updating specific token values.

A token ties one value to multiple elements, so changing the value updates all connected elements.

One design token theme.icon.default aliased to two different icons — Icon A and Icon B — so a single value controls both.

Design token types

A token type is a category of value your product reuses in more than one place: a brand palette, a type scale, a spacing size sequence, or a set of motion easings. Each token type holds the full range of values for that one aspect of the design.

To structure design tokens effectively, we first need to identify the token types our product will actually use. If our product won't need a particular type, it's better to leave it outside the system.

Grouping tokens by type keeps them organized and makes it easy to add new ones without the list getting out of hand.

In GTC, none of the token types are invented. They mirror the types from the Design Tokens Community Group (DTCG), a shared format that design tools and codebases can all read.

The GTC model defines the following token types by default:

size-unit

Unit tokens define consistent scale values, like spacing, gaps and sizes.

color

Color tokens communicate UI hierarchy, semantic meaning, and brand presence.

opacity

Opacity tokens set consistent transparency and dims for UI elements.

font-family

Font-family tokens defines the typefaces, so one change re-skins an app's entire type.

font-size

Font-size tokens keep font scaling and text-size values consistent.

line-height

Line-height tokens define consistent vertical rhythm across the UI.

font-weight

Font-weight tokens set consistent weight scaling across all text elements.

letter-spacing

Letter-spacing tokens set consistent spacing between letters.

radius

Radius tokens set a consistent border radius for UI surfaces and elements.

border

Border tokens set a border thickness and stroke styles for UI elements.

shadow

Shadow tokens keep shadow appearance and elevation styles consistent.

blur

Blur tokens set a consistent background-blur effect for UI surfaces.

motion

Motion tokens set consistent transition easings and animation timings.

z-index

Z-index set consistent stacking order for modals, overlays and floating elements.

Design tokens groups

With the token types defined, we can organize them into more detailed semantic groups—the layer where teams and agents can reason about how tokens relate to and depend on each other. The always-open question in the design system field is how to name those groups so they stay understandable as the product grows.

Across every enterprise project I've worked on, I've narrowed this down to three groups: Global, Theme, and Component (GTC). It has held up every time. The structure doesn't care what framework you're on, so it travels well between the companies I've built systems for and my own projects.

Global

Sets system-shared token types: typography, size-units, colors, effects, borders, and radii.

Theme

Sets how elements look based on the active theme, including: colors, surfaces, elements, and states.

Component

Per-component structural values: spacing, gaps, sizes, and radius, scoped to one component.

Grouping tokens this way is the whole point of the GTC model: it turns a flat list of tokens into a readable structure, a structure where every token has an obvious home and purpose, and every change is easy to track.

In GTC, each value can be updated globally across domains, narrowed to a single theme, or isolated to a specific component, making it possible to push changes exactly as far as it needs to go.

If you've used Material Design's token classes, the grouping itself will feel familiar. Material's reference, system, and component tiers line up closely with Global, Theme, and Component. The core difference is in the naming and hierarchy. Material Design applies one rigid grammar to every token, so each name becomes a long, segmented chain, e.g:

md.comp.outlined-text-field.error.focus.text.color

md.comp.filled-button.pressed.state-layer.color

md.comp.fab.primary.container.color

GTC avoids the rigid grammar. Every token belongs to a group—Global, Theme, or Component—but past that group, each name is free to take whatever best fits what the token expresses.

Names stay short where they can be and specific where they need to be. That's what keeps the system readable and easy to maintain, e.g:

global.size-unit.8

theme.button.primary.hover

component.input.spacing-gap

Global tokens

Global tokens (also called primitive tokens) include the full set of raw values sorted into types the rest of the system is built from. They're never applied to components directly instead, Theme and Component tokens reference them.

Inside the Global group, values are organized into subgroups, each covering one or more token types, for example:

Each Theme and Component token resolves to whichever Global subgroups they need. Subgroups give every primitive type a predictable place to live, so a human, or an AI agent, goes straight to it instead of scanning one flat list.

Global token subgroups (color, effects, typography, size-unit, radius, border) feeding into Theme and Component token groups.
Global token values and their connections to other design token groups.

Theme tokens

Theme tokens hold the UI's visual modes, storing information on how everything looks in a given context: surfaces, icons, text, borders, and component visual states. Theme is the layer that shifts when that context changes, for example when switching from light to dark mode.

Theme group is where "how should this look right now" is decided.

Theme resolves by mode: light and dark are the two most common color-scheme modes, and a product can add more, such as brand or high-contrast modes.

Theme tokens folder: Surface subgroup with page and container tokens displaying different hex values in Light and Dark mode.
A theme token changes surface theme when the mode switches.

A single theme token points to a different Global token in each mode, one Global for light, another for dark. The raw values still live in Global, so you attach the theme token to an element once, and it repaints itself the moment the mode changes.

Component tokens

Component tokens hold a component's structural values, storing information on how it's built and sized: spacing, gaps, font-size, line-height, radius, icon-size, and every other property that affects "how should this component work/resize".

Component group is where "how this component should be built" is decided.

Instead of storing their own raw values, component tokens reference the Global group for structural types of values like radius, size and typography.

Edge case—a structural value that has to change with the mode can route through Theme first. Font-weight is the common case: the same weight looks heavier on a dark background than on a light one, so the dark value drops a step to keep them reading the same. Robin Rendle walks through the technique in Dark mode and variable fonts.

Button component tokens: spacing, icon-size, font-size, line-height, and radius across Medium and Small size modes.
Component tokens define a component's structure and resizing behavior.

Each component is a sub-folder inside the Component group, holding its own structural tokens across one or more size modes, just as a Theme token resolves across its modes. One token holds a value for each size—so resizing a component just means selecting a different mode (medium to small).

Design tokens modes

Modes (or "contexts" in Material Design) are a token's ability to store multiple values and pick the right one based on the current UI conditions.

In practice, a mode is a property assigned to a token that tells it which value to use in a given context: dark mode, high-contrast mode like in Theme, or a size-specific mode like in the Component token group.

In GTC, modes are selected by scope, so you can change a mode for a single component or the whole page at once. A token can answer to more than one mode, for example a brand theme and specific component size, which can be activated independently.

When a token includes a mode-specific value, it's applied automatically when that mode is active. For example, a color token with a dark-mode value becomes active the moment the interface switches from light to dark.

theme.surface.page token aliasing global.color.base.1 and global.color.base.10, rendering as light and dark mode phone screens.
Modes let a token hold multiple values, one for each UI context.

Design tokens naming convention

All GTC tokens follow a level-based naming convention: where each level of the name tells you one thing about the token's final value.

In production code, tokens can have different numbers of levels depending on how much they need to express. Take the global.color.base.0 token: global says which group it belongs to, color says which subgroup it sits in, and base.0 points to the exact value.

Global tokens stay short, as they hold primitive values, but Theme and Component tokens run longer, as they carry more specific design decisions and values:

global.color.base.0

theme.button.primary.alpha.hover

component.button.font-size

Design token taxonomy rules

A design token taxonomy is the set of rules that governs how each token is named in the design system.

Each token name has two parts:

A basic global color token with 3 levels of naming hierarchy:

global.color.base.1

Token name anatomy for global.color.base.1: three levels labeled Group (global), Identifier (color), and Value (base.1).

Each level narrows what token means—so the number of levels equals tokens's specificity. A good taxonomy comes down to one best practice: balance clarity against simplicity.

GTC uses the minimum number of levels required to describe a token, and add a level of complexity only when removing it would leave the token ambiguous.

The opposite is a linear grammar, where one fixed chain is applied to every token, so each name carries the unnecessary amount of levels, whether it needs them or not.

Overly specific names grow longer and pull more rules in behind them, which is what makes a linear approach much harder to maintain over time. A single button hover color ends up spelling out levels that say the same thing:

button.primary.color.background.state.hover

Most of those levels are filler: they exist to satisfy the grammar, not to narrow down the value. GTC names the same token in just four levels:

theme.button.primary.hover

The way to hold that balance in the GTC model is a lightweight set of rules for identifying each token level. The taxonomy levels below work as guidelines for naming and arranging those levels.

Every name follows one fixed order: Group, then any of Element, Classifier, Identifier, and State. Only Group is mandatory level, and other levels never appear out of order. *But can be ignored if not present in token's intent.

1.Group—always the first level, determines the group the token belongs to.

2.Element—the UI thing the token styles (e.g. button, input, icon, text). In Global, which has no UI element, the parameter type fills this slot (e.g. color, radius).

3.Classifier—defines alternative token variants or categories of tokens (e.g., secondary, tertiary). Can be used only after the Group or Element levels.

4.Identifier—helps recognize a particular token inside the group, classifier, or element level (e.g., blue, red, dark).

5.State—the interaction or condition the value applies to, always last (e.g., default, hover, active, disabled).

GTC taxonomy: theme.button.primary.blue.hover broken into five levels — Group, Element, Classifier, Identifier, and State.

Theme token with 5 levels of taxonomy hierarchy:

theme.button.primary.blue.hover

Complex tokens like the one above don't include a value, as the final State level carries a token aliased to the Global value.

The GTC taxonomy rests on three principles:

1.A token's name must always reflect why a token exists before where it's used, encoding the full path down to its value.

Group [semantic group]

 └─ Element/Classifier/Identifier/State

      └─ Token value [spacing, color, font spec]

2.Naming levels follows a clear order, with no missing semantic groups.

Do

Group Element/Classifier/Identifier Value

Group Value

Don't

Value → ... [no group]

Element/Classifier/Identifier Value

3.Name tokens and modes by design role, never by screen, feature, or layout specification. Keep the abstraction level high.

Do

Tokens

color.

typography.

spacing.

button.

badge.

Modes

ios.

android.

small.

large.

dark.

Don't

Tokens

badge-color.

ios-typography.

sidebar-text.

login-spacing.

card-badge.

Modes

phone.

tablet.

expanded.

marketing.

dashboard.

Why design token taxonomy is important?

On their own, design tokens are just words. The taxonomy is what turns them into a shared language: each token gets meaning in the UI, and people and AI agents can make better design decisions and write better code.

That shared language works only when the names stay consistent. When each level signals what a token is for, designers and developers can find the token they need instead of adding a near-duplicate that clogs the set. Consistency matters more—larger the system grows.

While the naming convention can and should be tailored to a team's workflow, it must be defined at the foundation. Once a token set grows, changing tokens groups and taxonomy becomes disruptive to product teams and on enterprise-level it can quickly become unmanageable.

The GTC token taxonomy is more than a naming structure. It's what lets a design system keep scaling without the token set falling apart.

GTC model: global branches into theme.button/surface/icon/text and component.button/input/control/tabs on a specificity axis.
Global → {theme, component} → leaf sub-groups, organized left to right by specificity.

Why GTC model holds up for teams and AI agents

The same naming that keeps the system clear for people makes it legible to AI agents. GTC keeps each level meaningful, so an agent can read the intent and generate new names from existing examples. Every token starts with its group and says what it does, so an AI can:

The real payoff: the token names become your AI's design vocabulary.

Example GTC prompts:

  • “Make a card. For the surface use theme.surface.page, for the text use theme.text.default, and round the corners with global.radius.12.”
  • “Update an overlay surface: alias theme.surface.overlay to global.color.base.0 in light mode and global.color.base.8 in dark mode.”
  • “Dim the sidebar in dark mode: point theme.surface.container at global.color.base.2.”

FAQ

Design tokens are reusable design values, such as colors, spacing, and typography, that build a visual language in design systems. They are used in place of hard-coded values like hex codes for color in design, and in code they map to CSS variables, allowing a single token/variable to control multiple elements in the system.

Design tokens help large enterprise systems keep a consistent UI across multiple domains and sub-products. Because a global UI change, such as a style update or a component improvement, comes down to updating a few token values, it rolls out everywhere at once instead of requiring every screen to be redesigned by hand.

GTC is a non-linear three-group token model: Global, Theme, and Component. Global tokens holds the primitive raw values, Theme decides how things look across modes like light and dark, and Component decides how a component is built and sized.

A design token taxonomy is the set of rules that governs how each token is named. Every token name is important, as it allows both the product team and AI agents to reason about tokens and their purpose in the system. The GTC model holds a taxonomy to make sure each token is readable and expresses its own role in the system.

When each token name is purposeful, an AI agent can read a token's role off its name, trace an aliased value it points at, and create new tokens that fit the existing token structure instead of creating duplicates. The real payoff of the GTC model is that token names become the AI's design vocabulary.

Teach AI the GTC model, audit, create and manage GTC and DTCG tokens with AI. Install the /gtc-tokens skill to get started.

Get started

References

∗ ∗ ∗