Tokens

Last updated 2025-07-30

Our design tokens are engineered to be readable and easy to understand, while providing a robust system able to handle the demands of every application we throw at it. A basic way to think about a design token is that it takes a single value, fits it into a system, and then applies that system throughout our different applications.


Color

Our color system is our most robust and comprehensive level of tokens, and has the most considerations across our applications. Some key points to consider in our color system:

  • Colors are assigned a name (red or blue) and numeric value. Numeric values range from zero (0) for the lightest colors in the palette to 1000 for the darkest.
  • Brand colors are always assigned 500 in our system
  • Numbers with transparency are indicated by a dash after the primary number. The number after the dash is the level of opacity (i.e. 500-16 is color 500, 16% opacity). These are used as highlights, selection / hover states, scrims, and more.

Core Colors

50#EBF3FE
100#BED9FD
200#9EC6FD
300#7DB2FC
400#5D9FFB
500#3C8CFA
500-16#3C8CFA29
500-48#3C8CFA7A
500-72#3C8CFAB8
500-96#3C8CFAF5
600#3275D0
700#285DA7
800#1E467D

Semantic / Theme Colors

Semantic colors show the application of our core colors to a theme. Naming should make it easy to understand the contextual usage of each token. For example, base-brand is used for button backgrounds, and content-on-brand would be used for icons and text appearing on that background

Content colors are for text, icons, and other elements users are expected to read or recognize.

content-primarygrey-700
content-secondarygrey-600
content-on-primarygrey-50
content-on-secondarygrey-300
content-on-brandgrey-25
blue-500
content-accentred-500
content-brandblue-500
content-disabledgrey-300
content-inactivegrey-300
content-lightgrey-25
content-darkgrey-700
content-on-lightgrey-700
content-on-darkgrey-25
content-invalidred-500
content-successgreen-500


Spacing

MARGIN
MARGIN
STACK

Our spacing grid uses base increments of 4px, creating the core spacing system. We then adapt this into a semantic sizing system to ensure consistency in execution and usage. Elements with similar content should be spaced closely together, while content shifts and breaks should be spaced further apart.

STACK

Our semantic system leverages gestalt principles to ensure like content is perceived as such by the user, and has horizontal and vertical tokens to ensure proper spacing, rhythm, and flow of content.

RHYTHM

Horizontal

STACK
  • spacing-margin is used for left & right edges, ensuring content maintains consistent horizontal width
  • STACK
  • spacing-gutter is used for spacing between items horizontally
  • STACK
  •  
    Gutter
     
RHYTHM

Vertical

STACK
  • spacing-stack is the smallest increment of vertical spacing, used for elements that are tightly correlated (like chapter headings and their content). Stack can also be used between paragraphs, lists, and images within a content section.
  • STACK
  • spacing-rhythm is used for related items in a group, that are not quite as closely related. Think subsections of a chapter: these would be separated by rhythm
  • STACK
  • spacing-flow is used for the space between separate sections of content. For example, the different chapters on this page are separated by the flow value.
  • STACK
  • spacing-generous and spacing-extreme are used when larger values are needed for delineation between discrete sections of content. Use them sparingly.
STACK

Our vertical spacing system also solves the pesky problem of trying to choose top or bottom spacing on an element

RHYTHM

Semantic Spacing

STACK

Our semantic sizes are provided for reference below. The size value references the core size, found in the subsequent table. Note that semantic values change based on the screen width where they're used, generally getting larger with the screen.

STACK

RHYTHM

Core Spacing

  • STACK
  • Our core sizes are provided for reference below. REM values should be used at all times, though the base pixel size is also provided for applications where REM is not able to be used (like Figma).

    STACK

    FLOW

    Sizing

    Our sizing system allows for clear, easy-to-understand element and container sizing to ensure consistency and legibility across all applications.

    Core Sizing

    Core sizes are the defined, explicit sizes our system is built from. In web use, we use REM values to ensure accessibility and scalability for all users.

    Content

    Our main use of semantic sizing is for the content we display for users.

    • sizing-content is the base width for all content containers in our system.
    • sizing-content-wrapper is used to create padding and backgrounds for content containers.
    • sizing-line is used to set lines of text for maximum readability. It creates lines of approximately 60 characters (11-15 words).
    • sizing-line-half creates a value of one-half the standard line length, good for footnotes and smaller content where the default line length would be too long for optimum readability.
    • sizing-icon is used for default icon sizes. It defaults to 1.5rem (24px).

    Line & Border

    Lines and borders are used to create visual separation between content, and are defined by their thickness. They are used to create visual hierarchy and guide the user's eye.


    Typography

    Our type system leverages the type scale defined in our foundations for a clear, defined hierarchy of content.

    • --font-footnote: var(--font-xs);
    • --font-caption: var(--font-sm);
    • --font-body: var(--font-base);
    • --font-title: var(--font-3xl);
    • --font-subtitle: var(--font-2xl);
    • --font-chapter: var(--font-xl);
    • --font-section: var(--font-lg);
    • --font-display: var(--font-5xl);

    Breakpoints