Getting started

Token framework

How Moments tokens are structured: the three tiers and how each tier is named.

How Moments tokens are structured: why we use them, the three tiers (Core → Semantic → Component) and how each tier is named. For the practical side — adding, renaming and deprecating a token — see Token workflow. For how tokens fit the wider naming rules of the system, see Standards.


What are design tokens?

Design tokens are the single source of truth for every design decision in the design system. They are all the values needed to construct and maintain a design system — spacing, colour, typography, component styles, animation, etc. — represented as data. They can represent anything defined by design: a colour as an RGB value, an opacity as a number, an animation ease as Bézier coordinates. They're used in place of hard-coded values to ensure flexibility and unity across all product experiences.

Design tokens are directly integrated into our component libraries and UI kits. They cover the various options of platform scales, colour, component states, spacing, typography and more.

For example, the green colour for an icon on a success flag uses a design token such as colour-icon-success, instead of a specific colour value like #36B27E or Green300.

Design tokens store repetitive design decisions in a platform-agnostic way. A design decision is the choice you make from the available options — like choosing a brand colour.


Benefits of design tokens and themes

Theming with design tokens lets us make visual design changes at scale across products.

Intentional design decisions

Rather than choosing one of many shades of yellow, you make a decision based on the intention behind a style. This ensures consistency across products.

Design in one theme, get the rest for free

Our design tokens are mapped to values for light and dark themes. When you design with tokens in one theme, you can switch themes automatically with the right corresponding values.

Quick changes across the system

If changes need to be made for accessibility or other reasons, they can be made quickly across all products, without finding and replacing hard-coded values.

Two brands (Platform #0066FF and Brand B #9B239F) set different values for moments.core.colour.primary.500; both flow through the same semantic token into the same Button component token, so each brand's button renders in its own colour.

One component, two brands: only the core value changes — the semantic and component tokens stay the same.


Design token types

The following types of design tokens are the building blocks and design decisions that make up the Moments design language for Easol.

Core tokens

Core tokens are the primitive values in our design language, represented by context-agnostic names. Our colour, typography and dimension values are all recorded as core tokens. They can be used directly, and are inherited by all other token types.

Semantic tokens

Semantic tokens relate to a specific context or abstraction. They communicate the intended purpose of a token, and are effective when a value with a single intent appears in multiple places.

Semantic tokens are context-specific and reference core tokens. Each semantic token has a specific intent, meaning and role. Unlike core tokens, semantic tokens appear in specific contexts or instances.

Component tokens

Component tokens are an exhaustive representation of every value associated with a component. They often inherit from semantic (alias) tokens, but are named so engineering can be as specific as possible when applying tokens in component development.

Diagram: core token moments.core.colour.primary.500 (#0066FF) feeds semantic tokens container-background.accent.default and border.accent.default, which feed component tokens for button, toggle and checkbox.

How one core value flows through semantic tokens into several component tokens.


How to name tokens

The naming structure of tokens organises the design properties and styles of the system into a logical, hierarchical structure. As Nathan Curtis describes, the right structure depends on the needs of the system and its team — what matters is that it is clear, consistent and easy to understand for everyone.

We follow a slightly different structure for each tier, because the three tiers are different levels: although each builds on the previous one, each needs its own categories. So that our products share visual similarities and the tokens share a naming structure, the bases below are used across every product in the organisation.

Don't — when a token doesn't need a segment, that segment does not go in its name. Skip it.

Examples of one token per tier: moments.core.colour.primary.500, moments.semantic.typography.medium, moments.button.typography.primary.


Core tokens

#0066FF as moments.core.colour.primary.500 and moments.core.colour.primary.700.

The naming structure for core tokens is the easiest to follow, since we only give consecutive values to our options. Only moments and core are the same for every token in this tier — the first is the name of the system, the second the name of the tier.

moments.core.category.element.amount
SegmentWhat it is
categoryThe most primitive grouping of values — what we build our Foundations with (colour, font-size, spacing…).
elementA subcategory for which value we are using. Only used in colour (primary, neutrals, error…).
amountThe value on the category's scale — size, opacity, step, etc.

Categories

Colour

Colour

Colours are a set of predefined colour values used consistently across all design assets, such as interfaces, graphics and marketing materials. moments.core.colour.primary.500

Font family

Font family

The name given to a set of fonts that share the same stylistic characteristics, with variations in thickness, width, etc. moments.core.font-family.primary

Font size

Font size

The characteristic that gives the font a specific size, large or small. moments.core.font-size.100

Line height

Line height

The spacing between lines of text. Useful for separating paragraphs, headings and subheadings. moments.core.line-height.200

Font weight

Font weight

Variations in weight/intensity within the same font family. moments.core.font-weight.bold

Letter spacing

Letter spacing

Letter spacing (character spacing or tracking) is an optically consistent adjustment to the space between letters, changing the visual density of a line or block of text. moments.core.letter-spacing.100

Text case

Text case

The distinction between uppercase (capitals) and lowercase letters. moments.core.text-case.none

Border radius

Border radius

Rounds the corners of an element's outer border edge. A single radius makes circular corners; two radii make elliptical corners. moments.core.border-radius.50

Border width

Border width

The width of an element's border on all four sides (shorthand for top, right, bottom and left). moments.core.border-width.200

Opacity

Opacity

The degree to which content behind an element is hidden — the opposite of transparency. moments.core.opacity.60

Spacing

Spacing

The length of space between elements. moments.core.spacing.125

Sizing

Sizing

The dimensions of elements such as icons and containers, ensuring consistent scale and proportion across the interface. moments.core.sizing.250

Elements

Only colours have an element in their name, since colour is the only place we use subcategories — to name all our palettes correctly and keep control and organisation within the system.

Colour elements

Colour elements

  • Primary
    • Neutrals
    • Error
    • Success
    • Any other colour palette we have in the product

Amount

Every category needs an amount, so we can define which value corresponds to each core token. The naming of the amount depends on the category.

Amount by category

Amount by category

  • Colour: 100, 200, 300… from lightest to darkest
    • Font family: primary, secondary…
    • Font size: 100, 200, 300…
    • Line height: 100, 200, 300…
    • Font weight: 100, 200, 300… (depends on the weights available in each family)
    • Spacing: 0, 25, 50…
    • Border radius: 0, 25, 50…
    • Border width: 0, 25, 50…

Semantic tokens

An Easol dashboard screen annotated with the semantic tokens used on it, e.g. moments.semantic.colour.text.base.default and moments.semantic.typography.paragraph.regular.bold.

Semantic tokens in context on an Easol dashboard.

Three examples: primary.500 → colour.text.accent.default; neutrals.950 → colour.icon.base.default; error.700 → colour.supportive-feedback.error.strong.

Semantic tokens describe the purpose of a value — where it is used and for what. They are named with this structure:

moments.semantic.category.role.variant.state
PartDescription
momentsThe design system namespace. This prefix groups all tokens belonging to the Moments Design System.
semanticThe token is a semantic value, describing its intended purpose rather than a raw design value.
categoryThe type of design property the token represents, such as colour, border-width, spacing, radius or typography.
roleThe semantic purpose or usage within the interface, for example text, background, border, icon, reactive or supportive.
variant (optional)Distinguishes visual contexts or emphasis levels within the same role, such as default, accent, inverse or subtle.
state (optional)The interaction or component state the token applies to, such as hover, pressed, focus, disabled or selected.

Categories and roles

Depending on the category, a semantic token has different properties that define where it is integrated in our components and designs.

Colour

Colour

The colour roles tell us where each token goes in any frame:

  • Text
  • Icon
  • Border
  • Container background
  • Page background
  • Supportive feedback
  • Reactive

Typography

Typography

Defined by grouping several core tokens (family, size, line height, weight, letter spacing, case) into one semantic token that gives meaning to each text style:

  • Heading
  • Paragraph
  • Label
  • Monospace

Shadows

Shadows

Shadows are defined from smoothest to strongest in colour intensity. At the component level, each shadow has to be nested to a specific colour.

Border radius

Border radius

Border radii are semantic values with a purpose-agnostic nomenclature.

Border width

Border width

Like radii, border widths are semantic values with a purpose-agnostic nomenclature.

Aspect ratio

Aspect ratio

At the semantic level the aspect ratio already carries meaning, and should only be used where a specific token exists for that use case.

Spacing

Spacing

Spacing gets a more explicit name about where it is used; it becomes most relevant at the component level.

Sizing

Sizing

Sizing tokens get clear, context-specific names that reflect their intended use. Their true significance emerges at the component level, where they define precise dimensions for each UI element.

Variant

Core values are defined with sequential numbers or pixel counts. Semantic tokens use a more flexible naming that makes tokens easier to define and apply across contexts. The convention varies by category:

Colour

Colour

Semantic colours align with the company's brand colours, named after their usage context in the interface. Examples: overlay, base, error.

Typography

Typography

Named from largest to smallest size. Component-specific styles, such as buttons, use semantic sizes like medium or small. Examples: heading, action small, paragraph, link.

Border radius

Border radius

Named after the level of roundness or where the radius is typically applied, rather than the pixel value. Examples: none, small, medium, large, full.

Shadows

Shadows

Named after elevation, visual prominence or interface context. Lower levels are subtle separation; higher levels are elements further above the page. Examples: subtle, raised, floating, overlay, focus.

Border width

Border width

Named after visual emphasis, purpose or interaction state. Border width and border colour stay separate categories so they can be applied independently. Examples: default, subtle, strong, focus, disabled.

Opacity

Opacity

Named after the visibility or emphasis it provides, not the percentage. Examples: disabled, muted, subtle, overlay, hidden.

Spacing

Spacing

Named after relative size or layout purpose. General spacing uses size-based names; more specific tokens can describe their role in a layout or component. Examples: x-small, small, medium, large, x-large, gutter.

Aspect ratio

Aspect ratio

Named after the content or element it supports, not the numerical ratio. Examples: square, avatar, thumbnail, media, landscape, portrait, video, hero.

Duration

Duration

Named after the perceived speed or purpose of the transition; the core token holds the milliseconds. Examples: instant, fast, standard, slow, emphasized.

Easing

Easing

Named after the motion intent — why the curve is used, not its maths. Examples: enter, exit, standard, emphasized, expressive. A semantic motion token can combine both: motion.enter = duration.fast + easing.enter; motion.standard = duration.standard + easing.standard; motion.emphasized = duration.slow + easing.emphasized.

State

Only colours use states — no other category has them. Colours are used differently in components depending on the variant. Not every state exists for every property, so only use the ones that are available.

Default

Default

The initial appearance of a component before any interaction — the baseline for how it looks and behaves under normal circumstances.

Hover

Hover

When the pointer is over the component without clicking. Gives visual feedback that an element is interactive.

Pressed

Pressed

When the user clicks or taps the component. Confirms the interaction was registered.

Loading

Loading

While data or content is being retrieved or processed. Shows the component is working on the request.

Disabled

Disabled

When the component can't be interacted with, temporarily or permanently — e.g. a button that stays disabled until a required field is completed.


Component tokens

Three examples of a core value flowing through a semantic token into a component token such as moments.button.colour.background.primary.default.

Component tokens are defined by the nomenclature of each component part — colour, text, text colour, border radius, etc. Each component has its own nomenclature, but parts that are the same across brands must share the same name, so theming between brands works without changing each property. Following Nathan Curtis's approach, the structure is:

system.component.category.element.variant.state
SegmentWhat it isExamples
systemAlways the same — the name of the design system.moments
componentThe name of the component we are tokenising.button, row, text-field
categoryThe main thing we are defining on the component (same categories as semantic).size, spacing, typography, colour, breakpoints, shadow
elementDepends on the component and the pieces it's made of.label, icon, background
variantDepends on the component and the variant being tokenised.primary, secondary, tertiary, error, warning, success, info
stateThe state being defined for that variant.default, hover, pressed, focus, active, disabled

A Row component annotated with its component tokens, e.g. moments.row.sizing.media.left, moments.row.border-radius, moments.row.colour.background.default.

Component tokens mapped onto the parts of a Row.

Component

Component

A reusable element or module used to build interfaces. This segment is the name of the component being tokenised.

Category

Category

The same categories as semantic tokens. It gives context about what we are tokenising.

Element

Element

Every component is different: text, description, icons or other parts change its meaning and look. Each of these parts needs its own token, which is why components need an element segment.

Variant

Variant

The same component can come in different types — primary, secondary, tertiary, or error, warning, success. Each is defined by different colour tokens, so each variant is tokenised.

State

State

Each variant has states that need defining too — hover, focus, disabled, etc. — each requiring its own token adjustments.

On this page