The design system has two main parts. The css framework and the components. The css framework consists of the following parts:
All the css framework parts are in different layers and documentation for them can be found on this page. Layers follow the same order as above.
@layer reset, foundations, semantics, base, components, layouts, utils;
The component system is a collection of webcomponents There is some overlap between the two. For example there is a css-component called card as well as a webcomponent called card.
Our color system uses a three-layer architecture that separates foundation colors from semantic meaning, enabling consistent theming across light and dark modes.
The system is built on three layers:
Foundation Layer - Base HSL values (hue, saturation) without lightness:
--f-color-burgundy (356.7°, 94.8%) - Brand accent--f-color-gray (0°, 0%) - Neutrals--f-color-orange (38°, 100%) - Warm tones--f-color-red, --f-color-green, --f-color-blue - Status colorsSemantic Layer - Purpose-driven tokens that reference foundation colors:
--color-text, --color-text-weak, etc.)--color-surface, --color-surface-raised, etc.)Theme Layer - Lightness values that change between light and dark modes. Each theme adjusts only the lightness value while maintaining the same hue and saturation from the foundation layer.
All color tokens are available as CSS custom properties. Click any token name to copy it to your clipboard.
Definitions
Fills
Softer
Strokes
Text on
Text colors provide hierarchy through strength levels (default, weak, weaker, weakest) and semantic meaning for links and status messages.
var(--color-text)
  
var(--color-text-weak)
  
var(--color-text-weaker)
  
var(--color-text-weakest)
  
var(--color-text-link)
  Background colors define the base canvas, while surface colors create layered depth through raised and lowered variants.
var(--color-background)
  
var(--color-surface)
  
var(--color-surface-raised)
  Border colors define boundaries and interactive states. Use the default border for most cases, strong borders for emphasis, and semantic borders for status indicators.
var(--color-stroke)
  
var(--color-stroke-strong)
  
var(--color-stroke-hover)
  Specialized colors for buttons and icons ensure consistent interactive states.
var(--color-button-hover)
  
var(--color-button-active)
  
var(--color-icon)
  
var(--color-icon-hover)
  Our typography system uses monospace fonts for a technical, precise aesthetic.
Primary font for body text and UI elements
Display font for headings and emphasis
The type scale provides consistent sizing across all text elements:
2rem bold / 1.1 (Departure Mono)1.5rem medium / 1.1 (IBM Plex Mono)Body text for paragraphs and general content.
1rem regular / 1.4 (IBM Plex Mono)Small text for captions and secondary information.
0.875rem regular / 1.4 (IBM Plex Mono)The .typesetting class is used for long-form written content like articles, blog posts, and documentation. It automatically manages vertical rhythm and spacing between text elements.
This is a paragraph without the typesetting class. Notice how the spacing feels inconsistent and elements appear cramped together.
Another paragraph here to show the spacing issues when not using the typesetting utility.
This is a paragraph with the typesetting class applied. The spacing is consistent and creates a natural reading rhythm.
Another paragraph demonstrating the improved vertical rhythm and breathing room between elements.
Utility classes for spacing, borders, and layout. All utilities use logical properties for better internationalization support.
Utilities support directional variants using logical property naming:
-i — inline (horizontal: left & right)-is — inline-start (left in LTR, right in RTL)-ie — inline-end (right in LTR, left in RTL)-b — block (vertical: top & bottom)-bs — block-start (top)-be — block-end (bottom)Most utilities support these size scales:
000, 00, 1-15fluid-1 through fluid-10 (responsive, scale with viewport)auto (margin only)Border utilities add borders to elements using the [data-border] attribute. Combine with [data-variant] for different looks.
Use [data-variant] to apply different border styles:
[data-border] [data-variant=“strong”]
[data-border] [data-variant=“accent”]
Available variants: strong, accent, danger, success, neutral, info, warning
Background utilities apply background colors using the [data-background] attribute. Use [data-text] for text colors on accent fills.
[data-background]
[data-background=“surface”]
[data-background=“surface-raised”]
[data-background=“accent-softer”] [data-text=“on-accent-soft”]
[data-background=“accent-soft”] [data-text=“on-accent-soft”]
[data-background=“accent-mid”] [data-text=“on-accent-mid”]
[data-background=“accent-loud”] [data-text=“on-accent-loud”]
[data-background=“accent-louder”] [data-text=“on-accent-loud”]
Gap utilities control spacing between flex or grid items. Works with any layout container that supports the gap property.
Available sizes: 000, 00, 1-15, fluid-1 through fluid-10
Margin utilities add space outside elements using the [data-margin] attribute. Supports all directional variants and includes auto for centering.
[data-margin=“1”]
[data-margin=“fluid-5”]
Available sizes: 000, 00, 1-15, fluid-1 through fluid-10, auto
Padding utilities add space inside elements using the [data-padding] attribute.
Available sizes: 000, 00, 1-15, fluid-1 through fluid-10
Stack components create flex layouts for arranging items vertically or horizontally.
.stack — vertical stack (column, default).stack[data-direction="row"] — horizontal stackCombine with [data-gap], [data-align], and [data-justify] attributes for spacing and alignment.
.stack
.stack
.stack [data-gap=“3”]
.stack [data-gap=“3”]
.stack [data-direction=“row”]
.stack [data-direction=“row”]
.stack [data-direction=“row”] [data-gap=“3”]
.stack [data-direction=“row”] [data-gap=“3”]
more content
.stack [data-direction=“row”] [data-align=“start”]
.stack [data-direction=“row”] [data-align=“start”]
more content
.stack [data-direction=“row”] [data-align=“end”]
.stack [data-direction=“row”] [data-align=“end”]
more content
.stack [data-direction=“row”] [data-justify=“center”]
.stack [data-direction=“row”] [data-justify=“center”]
more content
.stack [data-direction=“row”] [data-align=“stretch”] [data-gap=“3”]
.stack [data-direction=“row”] [data-align=“stretch”] [data-gap=“3”]
more content
Grid-based alternative to Stack. Uses display: grid with grid-auto-flow instead of flexbox.
.stack2 — vertical stack (row, default).stack2[data-direction="row"] — horizontal stack (column)Combine with [data-gap], [data-align], and [data-justify] attributes for spacing and alignment.
.stack2
.stack2
.stack2 [data-gap=“3”]
.stack2 [data-gap=“3”]
.stack2 [data-direction=“row”]
.stack2 [data-direction=“row”]
.stack2 [data-direction=“row”] [data-gap=“3”]
.stack2 [data-direction=“row”] [data-gap=“3”]
more content
.stack2 [data-direction=“row”] [data-align=“start”]
.stack2 [data-direction=“row”] [data-align=“start”]
more content
.stack2 [data-direction=“row”] [data-align=“end”]
.stack2 [data-direction=“row”] [data-align=“end”]
more content
.stack2 [data-direction=“row”] [data-justify=“center”]
.stack2 [data-direction=“row”] [data-justify=“center”]
more content
.stack2 [data-direction=“row”] [data-align=“stretch”] [data-gap=“3”]
.stack2 [data-direction=“row”] [data-align=“stretch”] [data-gap=“3”]
more content
Alignment utilities for controlling justify-content and align-items using data attributes.
Controls main-axis alignment (horizontal in row, vertical in column).
[data-justify="start"] — align items to start[data-justify="center"] — center items[data-justify="end"] — align items to end[data-justify="between"] — space between items[data-justify="around"] — space around items[data-justify="evenly"] — even space distributionControls cross-axis alignment (vertical in row, horizontal in column).
[data-align="start"] — align items to start[data-align="center"] — center items[data-align="end"] — align items to end[data-align="baseline"] — align items to text baseline[data-align="stretch"] — stretch items to fill containerThe .typesetting class creates consistent vertical rhythm for text-heavy content using CSS Grid.
Apply .typesetting to containers with:
This is a paragraph without the typesetting class. Notice how the spacing feels inconsistent and elements appear cramped together.
Another paragraph here to show the spacing issues when not using the typesetting utility.
This is a paragraph with the typesetting class applied. The spacing is consistent and creates a natural reading rhythm.
Another paragraph demonstrating the improved vertical rhythm and breathing room between elements.
Reusable components ensure consistency and accelerate development.
Buttons trigger actions and come in multiple variants for different contexts.
Form elements follow consistent styling patterns and provide clear feedback states.
Navigation components help users move through the interface efficiently.
Cards group related content and actions in a contained, scannable format.
This is the main content of the card element.
It uses web components with shadow DOM.
This card element has a outline variant.
This card element has a title but no footer.
Card Element with Content Only
No title or footer, just content.
Card Elements in a .collection
This is the main content.
Using web components.
More text
This is the main content.
Using web components.
Shorter content.
Another card.
Tab containers provide accessible navigation between related content panels.
Content for tab 1
Content for tab 2
Content for tab 3
For full documentation, see the official tab-container-element docs.
All components are documented with usage examples, props, and accessibility considerations.