Token contract

Guide index · Color · Terminal

One decision, three renderings

A token names a stable visual decision at the role or recipe layer, not an ad hoc platform alias. Desktop and mobile share the same reference values and semantic roles. The terminal maps those same roles to flat cell backgrounds, foreground glyphs, and one-cell frame geometry; it does not own separate face tokens such as terminal.controlFace.

Hex values stay on Color, gradient stops on Surfaces, cuts on Shape, type metrics on Typography, spacing on Layout, and durations on Motion. This page indexes those authorities and shows how roles compose into controls. It does not publish a second copy of the numbers.

Typography and iconography split between the graphical system and the terminal: desktop and mobile share Exo 2 and Oxanium families, type roles, sizes and weights, and outlined icons at the same sizes and strokes. Both use icons; layout, padding, and component target dimensions adapt to the platform. The terminal uses one monospaced cell and the glyph guide. Color, shape, and status keep the same meaning with a thinner translation.

Role and authority

The tables below index the authoritative topic pages. They are independent of any implementation format.

Use three layers:

  1. Reference values: exact colors, lengths, durations and font families.
  2. Semantic roles: surface, foreground, boundary, action, focus, selection and status.
  3. Component recipes: button, tab, card, and field combinations of semantic roles and geometry.

A component should depend on semantic and component roles, not pick an arbitrary hex value. Never overload one value to mean blue edge, blue face, violet navigation, cyan focus and semantic success.

Reference values · Color and Surfaces

action.edge opaque sRGB · gradient.control angle and ordered stops · type.control weight 600

Semantic roles

Blue action edge · control face gradient · primary label on the control face

Component recipe · primary button

Naming and value types

Use dot-separated semantic names in this design specification. An implementation can translate them to CSS custom properties, native values or typed theme fields. Keep meaning unchanged when renaming.

Family Example names Value type Authority
Surface surface.canvas, surface.content, surface.chrome, surface.input Opaque sRGB color Color
Foreground text.primary, text.secondary Opaque sRGB color Color
Boundary line.quiet, line.essential, focus Opaque sRGB color Color
Action action.edge Opaque sRGB color Color
Navigation and selection navigation.accent, row.selectionMarker Navigation color plus persistent primary-text selection glyph Color
Semantic running.foreground/surface, positive.foreground/surface, warning.foreground/surface, danger.foreground/surface Paired colors Color
Gradient gradient.content, gradient.chrome, gradient.control, gradient.controlHover, gradient.controlPressed, gradient.selection Angle plus ordered color stops and positions Surfaces
Shape cut.panel, cut.action, cut.tab, cut.chip, radius.field, radius.join Nonnegative logical length Shape
Frame detail frame.detail.width, frame.detail.depth, frame.detail.rightInset Logical lengths; use the authoritative top-right frame embellishment dimensions Shape: top-right frame embellishment
Stroke stroke.frame, stroke.focus, focus.offset Logical length Shape
Space space.1 through named steps Logical length Layout
Size control.height.standard/dense/compact/touch, shell.header, drawer.width Logical minimum/preferred length Layout
Type type.display, type.pageTitle, type.section, type.panelHeading, type.body, type.control, type.metadata, type.badge, type.code Family, weight, size and line height Typography
Motion motion.hover, motion.press, motion.menuEnter, motion.menuExit, motion.drawer, motion.pageDetail, motion.scroll, motion.stateChange, motion.collapse, motion.listEnter, motion.listExit, motion.progressStep, motion.progressMax, motion.spinnerCycle, motion.marquee, motion.flowCycle, motion.containmentCurve, motion.standardCurve, motion.enterCurve, motion.exitCurve Duration or easing curve Motion
Terminal mapping surface.* backgrounds, line.*, focus, action.edge glyph colors, one-cell frame geometry Same semantic roles as Color and Shape; flat cells and foreground glyphs Terminal

A gradient's named stops are part of its value, not permission to substitute unrelated colors. Colors use opaque sRGB by default; scrim alpha is explicit and confined to the scrim role.

Semantic specimens

Each example shows the complete set of roles in that family using shared classes so a change in guide.css updates the specimen. Desktop and mobile share values; the terminal maps the same roles.

Surfaces

surface.canvasWorkspace
surface.contentReading plane
surface.chromeToolbar
surface.inputEditing

Foregrounds

text.primary · enabled labels and reading copy

text.secondary · metadata and disabled labels at full opacity

Boundaries, action, and focus

line.quiet

Decorative frame

line.essential

Operable edge

focus

action.edge

Selection markers

navigation.accent · Preferences
row.selectionMarker · Record 042

Semantic status pairs

positiveReady
warningNeeds review
dangerFailed

Gradients

gradient.content
gradient.chrome
gradient.control
gradient.controlHover
gradient.controlPressed
gradient.selection

Shape cuts

cut.panel · 12px

cut.action · 8pxcut.tab · 10pxcut.chip · 6px
radius.field · 4px

Spacing

space.1
space.2
space.3
space.4
space.5
space.6
space.8
space.12

Control heights

standard · 40px

Action

dense · 32px

Action

compact · 28px

Action

touch · 48px

Action

Type roles

type.display

Oracle

type.pageTitle

Validation

type.section

Evidence

type.panelHeading

On this page

type.body

Body copy.

type.control

Run validation

type.metadata

Job 042

type.badge

Ready

type.code

revision: 8

Motion

TokenValue
motion.hover120ms
motion.press80ms
motion.menuEnter / motion.menuExit120ms
motion.drawer / motion.collapse180ms
motion.pageDetail160ms
motion.scroll200ms
motion.stateChange160ms
motion.listEnter / motion.listExit160ms
motion.progressStep60ms per whole segment
motion.progressMax1500ms maximum catch-up; shorten segment intervals for large jumps
motion.spinnerCycle1000ms
motion.marquee3500ms
motion.flowCycle1200ms
motion.standardCurvecubic-bezier(0.2, 0, 0, 1)
motion.enterCurvecubic-bezier(0, 0, 0.2, 1)
motion.exitCurvecubic-bezier(0.4, 0, 1, 1)
motion.containmentCurvecubic-bezier(0.4, 0, 0.2, 1)

Component aliases

Component decision Shared meaning Desktop and mobile Terminal
Primary button Dominant local action Control gradient + action edge + primary text + control weight 600 Containing background + bold pale primary label in brackets
Secondary button Alternate action beside primary Same control gradient + essential neutral edge + primary text + weight 500 Same containing background and brackets; essential edge color
Selected content tab Active panel in a tab strip Control gradient + action top marker + primary text Bold pale label with square-profile endcap; containing background
Inactive tab Available but not active panel Content gradient + quiet edge + secondary text Secondary text label; containing background
Keyboard focus Where input goes next Existing 1px contour recolored cyan, 0 offset; semantic-edge exceptions use surface.focus Cyan control label; unchanged value and persistent selection glyph; cyan pane frame
Selected navigation Current destination in a nav list Neutral selection gradient + violet leading edge + bold navigation label Primary-text ▸ marker on content surface
Selected data row Current record in a collection Neutral selection gradient + persistent ▸ glyph + bold primary text Primary-text ▸ marker on content surface
Neutral editable field Valid text entry Input surface + essential edge + primary text Input surface cell + essential edge glyphs
Invalid field Rejected value with explanation Input surface + danger edge + associated error; focus uses the lighter surface.focus fill Danger edge cue + message; focus stays cyan
Status badge Short semantic state word Matching semantic foreground/surface pair Bracketed status word in semantic foreground
Disabled action Action that cannot run yet Content surface + quiet edge + full-opacity secondary label Readable label + nearby reason sentence; terminal (disabled) only when the sentence will not fit

Selection and focus are separate aliases even if a host platform combines them in one native widget. Terminal aliases flatten gradients as specified by the terminal chapter; they do not reuse GUI gradient objects as strings.

Primary

Secondary

Selected tab

OverviewActivity

Inactive tab

Details

Focus

Nav selection

Preferences

Data row

Record 042

Field

revision: 8

Invalid field

Enter a single token.

Status badge

Ready

Disabled

Change the draft before saving.

Portability

CSS logical dimensions become density-independent native layout lengths, with separately scaled type. A 12px panel cut means a 12-unit logical cut in native composition; it does not mean 12 physical pixels on every display. A terminal corner is one cell and has no fixed pixel equivalent.

Role separation is a contract: action.edge, gradient.control, navigation.accent and focus stay distinct roles. A blue face never recolors violet workflow categories or cyan diagnostics.

Keep theme values at explicit composition boundaries. Do not create ad hoc per-component theme objects that drift from the role tables. Theme overrides must replace coherent role pairs/recipes and preserve contrast, geometry and state separation.

Governance

When a value changes, update its authority page and every affected recipe and example before the guide counts as consistent.

A renderer is not accepted merely because its token names match. Review complete states, typography, contour joins, adjacent contrast, text scaling and terminal fallbacks. The accessibility checklist and component recipes define the review envelope.