Visual foundations
Colour, type, spacing and radius, controlled from a single token source.
AITOM · AI TRANSFORMATION & BRAND GROWTH
Building on the existing whitespace, type hierarchy and greyscale interface, visual rules become an operable, verifiable design system.
Colour, type, spacing and radius, controlled from a single token source.
Actions, keyboard, feedback and errors are all part of the component.
Measured against WCAG 2.2 AA; automated checks are not treated as conformance certification.
01 / FOUNDATIONS
The core greys follow the source site; focus, form borders and status colours are local accessibility controls. Dark mode is a candidate mapping based on source research.
canvas
#ffffffsurface
#f9f9f9subtle
#f3f3f3text
#282828muted
#5d5d5dborder
#e5e5e5primary
#171717focus
#005fccdanger
#b42318success
#18794econtrol-border
#76767602 / SINGLE SOURCE
Reads tokens.json directly, including raw values, aliases and types; CSS is generated.
Showing 96 / 96 tokens
primitive.light.canvas{"colorSpace":"srgb","components":[1,1,1],"alpha":1,"hex":"#ffffff"}Measured on source: --color-surface = #fff; kept locally.primitive.light.surface{"colorSpace":"srgb","components":[0.97647059,0.97647059,0.97647059],"alpha":1,"hex":"#f9f9f9"}Measured on source: --color-surface-secondary = #f9f9f9; kept locally.primitive.light.subtle{"colorSpace":"srgb","components":[0.95294118,0.95294118,0.95294118],"alpha":1,"hex":"#f3f3f3"}Measured on source: --color-surface-tertiary = #f3f3f3; kept locally.primitive.light.text{"colorSpace":"srgb","components":[0.15686275,0.15686275,0.15686275],"alpha":1,"hex":"#282828"}Measured on source: --color-text = #282828; kept locally.primitive.light.muted{"colorSpace":"srgb","components":[0.36470588,0.36470588,0.36470588],"alpha":1,"hex":"#5d5d5d"}Measured on source: --color-text-secondary = #5d5d5d; kept locally.primitive.light.border{"colorSpace":"srgb","components":[0.89803922,0.89803922,0.89803922],"alpha":1,"hex":"#e5e5e5"}Measured on source: --color-border = color-mix(in oklab, #0d0d0d 10%, transparent); local candidate uses #e5e5e5 (differs).primitive.light.primary{"colorSpace":"srgb","components":[0.09019608,0.09019608,0.09019608],"alpha":1,"hex":"#171717"}Measured on source: --color-background-primary-solid = #181818; local candidate uses #171717 (differs).primitive.light.on-primary{"colorSpace":"srgb","components":[1,1,1],"alpha":1,"hex":"#ffffff"}Local control value; no same-name token measured on source.primitive.light.focus{"colorSpace":"srgb","components":[0,0.37254902,0.8],"alpha":1,"hex":"#005fcc"}Measured on source: --color-ring-primary = #0169cc; local candidate uses #005fcc (differs).primitive.light.danger{"colorSpace":"srgb","components":[0.70588235,0.1372549,0.09411765],"alpha":1,"hex":"#b42318"}Measured on source: --color-text-danger = #911e1b; local candidate uses #b42318 (differs).primitive.light.success{"colorSpace":"srgb","components":[0.09411765,0.4745098,0.30588235],"alpha":1,"hex":"#18794e"}Measured on source: --color-text-success = #00692a; local candidate uses #18794e (differs).primitive.light.control-border{"colorSpace":"srgb","components":[0.4627451,0.4627451,0.4627451],"alpha":1,"hex":"#767676"}Local control value; no same-name token measured on source.primitive.light.danger-solid{"colorSpace":"srgb","components":[0.70588235,0.1372549,0.09411765],"alpha":1,"hex":"#b42318"}Local addition: danger button uses a fixed dark red background with white text, keeping contrast in both themes.primitive.light.on-danger{"colorSpace":"srgb","components":[1,1,1],"alpha":1,"hex":"#ffffff"}Local addition: danger button uses a fixed dark red background with white text, keeping contrast in both themes.primitive.dark.canvas{"colorSpace":"srgb","components":[0.09019608,0.09019608,0.09019608],"alpha":1,"hex":"#171717"}Local control value; no same-name token measured on source.primitive.dark.surface{"colorSpace":"srgb","components":[0.12941176,0.12941176,0.12941176],"alpha":1,"hex":"#212121"}Local control value; no same-name token measured on source.primitive.dark.subtle{"colorSpace":"srgb","components":[0.18823529,0.18823529,0.18823529],"alpha":1,"hex":"#303030"}Measured on source: --color-surface-tertiary = #131313; local candidate uses #303030 (differs).primitive.dark.text{"colorSpace":"srgb","components":[0.96078431,0.96078431,0.96078431],"alpha":1,"hex":"#f5f5f5"}Local control value; no same-name token measured on source.primitive.dark.muted{"colorSpace":"srgb","components":[0.72156863,0.72156863,0.72156863],"alpha":1,"hex":"#b8b8b8"}Local control value; no same-name token measured on source.primitive.dark.border{"colorSpace":"srgb","components":[0.26666667,0.26666667,0.26666667],"alpha":1,"hex":"#444444"}Local control value; no same-name token measured on source.primitive.dark.primary{"colorSpace":"srgb","components":[0.96078431,0.96078431,0.96078431],"alpha":1,"hex":"#f5f5f5"}Local control value; no same-name token measured on source.primitive.dark.on-primary{"colorSpace":"srgb","components":[0.09019608,0.09019608,0.09019608],"alpha":1,"hex":"#171717"}Local control value; no same-name token measured on source.primitive.dark.focus{"colorSpace":"srgb","components":[0.54117647,0.70588235,1],"alpha":1,"hex":"#8ab4ff"}Measured on source: --color-ring-primary = #0285ff; local candidate uses #8ab4ff (differs).primitive.dark.danger{"colorSpace":"srgb","components":[1,0.60392157,0.56862745],"alpha":1,"hex":"#ff9a91"}Measured on source: --color-text-danger = #e02e2a; local candidate uses #ff9a91 (differs).primitive.dark.success{"colorSpace":"srgb","components":[0.4745098,0.84313725,0.64705882],"alpha":1,"hex":"#79d7a5"}Local control value; no same-name token measured on source.primitive.dark.control-border{"colorSpace":"srgb","components":[0.62745098,0.62745098,0.62745098],"alpha":1,"hex":"#a0a0a0"}Local control value; no same-name token measured on source.primitive.dark.danger-solid{"colorSpace":"srgb","components":[0.70588235,0.1372549,0.09411765],"alpha":1,"hex":"#b42318"}Local addition: danger button uses a fixed dark red background with white text, keeping contrast in both themes.primitive.dark.on-danger{"colorSpace":"srgb","components":[1,1,1],"alpha":1,"hex":"#ffffff"}Local addition: danger button uses a fixed dark red background with white text, keeping contrast in both themes.semantic.light.canvas--color-canvas{primitive.light.canvas}Measured on source: --color-surface = #fff; kept locally.semantic.light.surface--color-surface{primitive.light.surface}Measured on source: --color-surface-secondary = #f9f9f9; kept locally.semantic.light.subtle--color-subtle{primitive.light.subtle}Measured on source: --color-surface-tertiary = #f3f3f3; kept locally.semantic.light.text--color-text{primitive.light.text}Measured on source: --color-text = #282828; kept locally.semantic.light.muted--color-muted{primitive.light.muted}Measured on source: --color-text-secondary = #5d5d5d; kept locally.semantic.light.border--color-border{primitive.light.border}Measured on source: --color-border = color-mix(in oklab, #0d0d0d 10%, transparent); local candidate uses #e5e5e5 (differs).semantic.light.primary--color-primary{primitive.light.primary}Measured on source: --color-background-primary-solid = #181818; local candidate uses #171717 (differs).semantic.light.on-primary--color-on-primary{primitive.light.on-primary}Local control value; no same-name token measured on source.semantic.light.focus--color-focus{primitive.light.focus}Measured on source: --color-ring-primary = #0169cc; local candidate uses #005fcc (differs).semantic.light.danger--color-danger{primitive.light.danger}Measured on source: --color-text-danger = #911e1b; local candidate uses #b42318 (differs).semantic.light.success--color-success{primitive.light.success}Measured on source: --color-text-success = #00692a; local candidate uses #18794e (differs).semantic.light.control-border--color-control-border{primitive.light.control-border}Local control value; no same-name token measured on source.semantic.light.danger-solid--color-danger-solid{primitive.light.danger-solid}Local addition: danger button uses a fixed dark red background with white text, keeping contrast in both themes.semantic.light.on-danger--color-on-danger{primitive.light.on-danger}Local addition: danger button uses a fixed dark red background with white text, keeping contrast in both themes.semantic.dark.canvas--color-canvas{primitive.dark.canvas}Local control value; no same-name token measured on source.semantic.dark.surface--color-surface{primitive.dark.surface}Local control value; no same-name token measured on source.semantic.dark.subtle--color-subtle{primitive.dark.subtle}Measured on source: --color-surface-tertiary = #131313; local candidate uses #303030 (differs).semantic.dark.text--color-text{primitive.dark.text}Local control value; no same-name token measured on source.semantic.dark.muted--color-muted{primitive.dark.muted}Local control value; no same-name token measured on source.semantic.dark.border--color-border{primitive.dark.border}Local control value; no same-name token measured on source.semantic.dark.primary--color-primary{primitive.dark.primary}Local control value; no same-name token measured on source.semantic.dark.on-primary--color-on-primary{primitive.dark.on-primary}Local control value; no same-name token measured on source.semantic.dark.focus--color-focus{primitive.dark.focus}Measured on source: --color-ring-primary = #0285ff; local candidate uses #8ab4ff (differs).semantic.dark.danger--color-danger{primitive.dark.danger}Measured on source: --color-text-danger = #e02e2a; local candidate uses #ff9a91 (differs).semantic.dark.success--color-success{primitive.dark.success}Local control value; no same-name token measured on source.semantic.dark.control-border--color-control-border{primitive.dark.control-border}Local control value; no same-name token measured on source.semantic.dark.danger-solid--color-danger-solid{primitive.dark.danger-solid}Local addition: danger button uses a fixed dark red background with white text, keeping contrast in both themes.semantic.dark.on-danger--color-on-danger{primitive.dark.on-danger}Local addition: danger button uses a fixed dark red background with white text, keeping contrast in both themes.foundation.font-family--font-family["OpenAI Sans","system-ui","sans-serif"]Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.font-size-xs--font-size-xs{"value":12,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.font-size-sm--font-size-sm{"value":14,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.font-size-md--font-size-md{"value":16,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.font-size-lg--font-size-lg{"value":20,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.font-size-xl--font-size-xl{"value":24,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.font-size-2xl--font-size-2xl{"value":32,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.font-size-3xl--font-size-3xl{"value":48,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.font-size-4xl--font-size-4xl{"value":64,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.font-weight-regular--font-weight-regular400Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.font-weight-medium--font-weight-medium500Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.font-weight-semibold--font-weight-semibold600Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.line-height-body--line-height-body1.5Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.line-height-heading--line-height-heading1.1Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-0--space-0{"value":0,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-4--space-4{"value":4,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-8--space-8{"value":8,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-12--space-12{"value":12,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-16--space-16{"value":16,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-20--space-20{"value":20,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-24--space-24{"value":24,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-32--space-32{"value":32,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-40--space-40{"value":40,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-48--space-48{"value":48,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-64--space-64{"value":64,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-80--space-80{"value":80,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.space-96--space-96{"value":96,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.radius-sm--radius-sm{"value":8,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.radius-md--radius-md{"value":12,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.radius-lg--radius-lg{"value":16,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.radius-xl--radius-xl{"value":24,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.radius-pill--radius-pill{"value":9999,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.motion-fast--motion-fast{"value":120,"unit":"ms"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.motion-normal--motion-normal{"value":200,"unit":"ms"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.motion-easing--motion-easing[0.2,0,0,1]Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.content-max--content-max{"value":1440,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.foundation.control-min--control-min{"value":44,"unit":"px"}Local scale; source measurements and differences in docs/components.md. Not an official OpenAI token.component.button-radius--button-radius{foundation.radius-pill}Local control value; source differences in docs/extraction.md.component.card-radius--card-radius{foundation.radius-lg}Local control value; source differences in docs/extraction.md.component.dialog-radius--dialog-radius{foundation.radius-xl}Local control value; source differences in docs/extraction.md.No matching tokens. Try a shorter keyword, or clear the search.
03 / TYPOGRAPHY
OpenAI Sans is served from local font files and falls back to system fonts for missing glyphs. Mixed English and Traditional Chinese text needs separate visual review.
A good interface keeps complexity out of the way so learning happens naturally. Read, explore, then try it yourself.
Status, notes and sources. Supporting text keeps sufficient contrast.
05 / INPUT
06 / PATTERNS
Grey surfaces, pill-shaped actions, clear headings and generous whitespace. This demo page is a local addition.
Left/Right arrows, Home and End move and activate tabs; only the current tab is in the Tab order.
tab, tabpanel, aria-selected, aria-controls and aria-labelledby are linked in pairs.
AA is currently the acceptance target. Full conformance still requires criterion-by-criterion manual, assistive-technology and end-to-end testing; token contrast checks alone cannot claim conformance.
View the full control standardsThis page is a working design specification. System search really finds sections; enter a term that does not exist to check the empty state.
07 / GOVERNANCE
Format baseline DTCG 2025.10; accessibility target WCAG 2.2 AA; interactions follow native HTML and the WAI-ARIA APG. Local control documents below.
Run: python3 scripts/tokens.py --check
The script covers only the token types used in this project and 22 colour pairs; it is not full DTCG or WCAG certification.