Skip to content
Appetite UI Symbol
Appetite UI
App components labelled with the tokens they read, brand/base and bg/primary, with named cursors

Tokens

The tokens you design with are the values that ship.

Every color, space, radius, elevation and type step lives once as a token. One source generates CSS, SwiftUI, Compose and Flutter, so nobody retypes a hex and nobody guesses a spacing step.

Architecture

Two token levels, and you only ever touch one of them.

Every design system that survives a rebrand has this shape. Most files skip the second level, which is why changing a brand color in them means opening every screen.

The primitive collection in the Figma variables panel

Primitives are the raw scale.

A ramp of brand steps, a neutral ramp, the state colors. They carry no meaning, and no component ever reads one directly. This is the level you edit when the brand changes.

A semantic token resolving to a primitive

Semantic tokens are the layer above.

They say what a value is for rather than what it is, and they are the only thing components bind to. Move a primitive and every alias pointing at it follows, in both modes and on both platform mirrors.

One exception worth knowing. On-color tokens map to static black and static white and do not flip with the theme, because a label on a filled button stays legible in both modes only if it refuses to follow them.

Follow any token from the raw scale to the pixel it lands on.

Each row is one chain. Hover a row and the rest step back, so you can read a single value from primitive to alias to the place it actually renders.

Primitive
Semantic alias
Where it lands

Primitive

colors/blue/500

Semantic alias

brand/base

Where it lands

Button fill, links, focus ring

Primitive

colors/gray/950

Semantic alias

text/strong-950

Where it lands

Headlines and body copy

Primitive

colors/gray/50

Semantic alias

bg/weak-50

Where it lands

Cards, wells, quiet surfaces

Primitive

colors/red/500

Semantic alias

state/error/base-500

Where it lands

Field errors and destructive actions

Primitive

static/static-white-0

Semantic alias

text/on-color/strong

Where it lands

Labels on a filled button, both modes

Output

Each platform gets its tokens in the language it already speaks.

A token is not useful until it arrives in a form the platform already understands. The translation is part of the build, so what lands is idiomatic rather than converted.

Web

CSS custom properties

Both modes as scoped blocks, ready for a class or a media query. Drop it in and every value is available everywhere.

Apple

SwiftUI

Color extensions plus type that emits Dynamic Type anchors rather than fixed point sizes, so accessibility settings still do what they promise.

Android

Jetpack Compose

Color objects and a ready Material 3 typography object, so the theme arrives wired rather than described in a document.

Cross platform

Flutter

Color constants and text styles shaped for ThemeData, matching how a Flutter project already expects to be themed.

The generated CSS custom properties fileThe generated SwiftUI color and type extensionsThe generated Compose theme and typography objectThe generated Flutter ThemeData constants

The source is W3C DTCG, a public standard rather than a private schema, compiled with Style Dictionary and published as an MIT licensed repository and an npm package. If you ever stop using this system, your values leave with you in a format other tools can read. That is deliberate.

Your next rebrand is one edit.

One-time payment  |  Lifetime updates  |  Works on the free Figma plan