Generated from the Figma Design - OS variable export — 623 variables across 7 collections. Light Mode only.
Every token in 1. Colors, Light Mode. Semantic roles only — the 385 tokens in 7. _Primitive are excluded by the primitive gate and must never be referenced directly.
These five depart from the raw export for a documented accessibility reason. The export value and the measurement are kept so the deviation is never silent.
| Figma variable | Used | Why |
|---|---|---|
Text/text-placeholder | #707070 | export #a3a3a3 measures 2.52:1 on bg-primary — fails AA |
Text/text-error | #d62525 | export #dc2626 measures 4.41:1 on bg-error — fails AA |
Text/text-warning | #a95d05 | export #d97706 measures 3.07:1 on bg-warning — fails AA |
Text/text-success | #04805a | export #059669 measures 3.58:1 on bg-success — fails AA |
Text/text-quarternary | #6f6f6f | export collapses the fourth text step onto the third |
The export leaves these undefined, and every one covers a need that would otherwise fall back to a raw value.
| Token | Value | Why |
|---|---|---|
--text-on-error-solid | #ffffff | on-solid content; text-alt flips per mode, bg-error-solid does not |
--text-on-warning-solid | #0a0a0a | white on bg-warning-solid measures 2.15:1 |
--text-on-success-solid | #0a0a0a | on-solid content for bg-success-solid |
--text-on-info-solid | #ffffff | on-solid content for bg-info-solid |
--bg-error-solid_hover | #ef4444 | error/500 — the export defines no error hover; brightens on hover so the fill stays unmistakably red |
--bg-error-solid_press | #b91c1c | error/700 — deepens on press, one step below the resting error/600 |
--bg-error_press | #fecaca | error/200 — press step for the soft error surface, above bg-error-secondary |
--border-control | #8d8d8d | interactive control boundary; WCAG 1.4.11 needs 3:1 |
--border-focus-ring | #171717 | focus treatment named in components §10.3 but untokenised |
--shadow-card | 0 4px 24px rgba(10,10,10,.05) | elevation must arrive through a named token |
--shadow-evidence | 0 24px 60px rgba(10,10,10,.14) | elevation must arrive through a named token |
--ring-offset | var(--bg-primary) | inner 2px of Ring/*; must match the canvas, not literal white |
--ring-brand | rgba(10,10,10,0.12) | outer 4px of the exported Ring/brand effect |
--ring-error | rgba(255,0,0,0.12) | outer 4px of the exported Ring/error effect |
--motion-state | 160ms | no motion tokens in the export; §12 baseline |
--motion-ease | cubic-bezier(.2,0,0,1) | no motion tokens in the export; §12 baseline |
--line-height-paragraph-md | 1.5 | line heights live in the text styles, not the variables |
--line-height-paragraph-sm | 1.4286 | line heights live in the text styles, not the variables |
--line-height-caption-md | 1.5 | line heights live in the text styles, not the variables |
2. Spacing & Size 50 · 3. Radius 11 · 4. Widths 12. Components bind to the component theme token, never to a raw radius.
| Token | Value | Figma name |
|---|---|---|
--spacing-0 | 0px | UI Spacing/spacing-0 |
--spacing-2 | 2px | UI Spacing/spacing-2 |
--spacing-4 | 4px | UI Spacing/spacing-4 |
--spacing-6 | 6px | UI Spacing/spacing-6 |
--spacing-8 | 8px | UI Spacing/spacing-8 |
--spacing-12 | 12px | UI Spacing/spacing-12 |
--spacing-16 | 16px | UI Spacing/spacing-16 |
--spacing-20 | 20px | UI Spacing/spacing-20 |
--spacing-24 | 24px | UI Spacing/spacing-24 |
--spacing-32 | 32px | UI Spacing/spacing-32 |
--spacing-40 | 40px | UI Spacing/spacing-40 |
--spacing-48 | 48px | UI Spacing/spacing-48 |
--spacing-56 | 56px | UI Spacing/spacing-56 |
--spacing-64 | 64px | UI Spacing/spacing-64 |
--spacing-96 | 96px | UI Spacing/spacing-96 |
--spacing-128 | 128px | UI Spacing/spacing-128 |
--spacing-160 | 160px | UI Spacing/spacing-160 |
--spacing-192 | 192px | UI Spacing/spacing-192 |
--spacing-224 | 224px | UI Spacing/spacing-224 |
--spacing-256 | 256px | UI Spacing/spacing-256 |
--spacing-320 | 320px | UI Spacing/spacing-320 |
--spacing-384 | 384px | UI Spacing/spacing-384 |
--spacing-480 | 480px | UI Spacing/spacing-480 |
--spacing-560 | 560px | UI Spacing/spacing-560 |
--spacing-640 | 640px | UI Spacing/spacing-640 |
--spacing-720 | 720px | UI Spacing/spacing-720 |
--spacing-768 | 768px | UI Spacing/spacing-768 |
--spacing-960 | 960px | UI Spacing/spacing-960 |
--spacing-1280 | 1280px | UI Spacing/spacing-1280 |
--spacing-1440 | 1440px | UI Spacing/spacing-1440 |
--spacing-1920 | 1920px | UI Spacing/spacing-1920 |
--screen-size | 1440px | Screen Size/Size |
--padding-padding | 24px | Padding/padding |
--spacing-1024 | 1024px | UI Spacing/spacing-1024 |
--spacing-80 | 80px | UI Spacing/spacing-80 |
--spacing-1080 | 1080px | UI Spacing/spacing-1080 |
--gap-gap | 24px | Gap/gap |
--spacing-72 | 72px | UI Spacing/spacing-72 |
--font-size-display | 72px | Font Size/display |
--font-size-header-h1 | 60px | Font Size/header-h1 |
--font-size-header-h2 | 48px | Font Size/header-h2 |
--font-size-header-h3 | 36px | Font Size/header-h3 |
--font-size-header-h4 | 30px | Font Size/header-h4 |
--font-size-header-h5 | 24px | Font Size/header-h5 |
--font-size-header-h6 | 20px | Font Size/header-h6 |
--font-size-paragraph-lg | 18px | Font Size/paragraph-lg |
--font-size-paragraph-md | 16px | Font Size/paragraph-md |
--font-size-paragraph-sm | 14px | Font Size/paragraph-sm |
--font-size-caption-md | 12px | Font Size/caption-md |
--font-size-caption-sm | 10px | Font Size/caption-sm |
| Token | Value | Figma name |
|---|---|---|
--radius-none | 0px | radius-none |
--radius-xxs | 2px | radius-xxs |
--radius-xs | 4px | radius-xs |
--radius-sm | 6px | radius-sm |
--radius-md | 8px | radius-md |
--radius-lg | 12px | radius-lg |
--radius-xl | 16px | radius-xl |
--radius-2xl | 20px | radius-2xl |
--radius-3xl | 24px | radius-3xl |
--radius-4xl | 32px | radius-4xl |
--radius-full | 100000px | radius-full |
| Token | Value | Figma name |
|---|---|---|
--width-xxs | 320px | width-xxs |
--width-xs | 384px | width-xs |
--width-sm | 480px | width-sm |
--width-md | 560px | width-md |
--width-lg | 640px | width-lg |
--width-xl | 768px | width-xl |
--width-2xl | 1024px | width-2xl |
--width-3xl | 1080px | width-3xl |
--width-4xl | 1280px | width-4xl |
--width-5xl | 1440px | width-5xl |
--width-6xl | 1920px | width-6xl |
--width-xxxs | 256px | width-xxxs |
5. Typography 8 tokens. The export stores weights as words and carries no line heights — both are mapped in tokens.css and listed as added roles above.
| Token | Value | Figma name |
|---|---|---|
--family-display | Inter | Family/display |
--weight-regular | regular | Weight/regular |
--family-heading | Inter | Family/heading |
--family-text | Inter | Family/text |
--family-caption | Inter | Family/caption |
--weight-bold | bold | Weight/bold |
--weight-medium | medium | Weight/medium |
--weight-semibold | semibold | Weight/semibold |
| Token | Size | Sample |
|---|---|---|
--font-size-display | 72px | Ag |
--font-size-header-h1 | 60px | Ag |
--font-size-header-h2 | 48px | Ag |
--font-size-header-h3 | 36px | Ag |
--font-size-header-h4 | 30px | Ag |
--font-size-header-h5 | 24px | Ag |
--font-size-header-h6 | 20px | Ag |
--font-size-paragraph-lg | 18px | Ag |
--font-size-paragraph-md | 16px | Ag |
--font-size-paragraph-sm | 14px | Ag |
--font-size-caption-md | 12px | Ag |
--font-size-caption-sm | 10px | Ag |
6. Themes 8 tokens × 4 modes. Switching the control above swaps the whole set at once.
| Component theme | Full | Normal | Sharp | Slightly Rounded |
|---|---|---|---|---|
--button | 100000px | 8px | 0px | 12px |
--modal | 32px | 16px | 0px | 20px |
--modal-inner-container | 20px | 12px | 0px | 16px |
--input | 8px | 8px | 0px | 12px |
--calendar-header | 100000px | 12px | 0px | 16px |
--pagination | 100000px | 10px | 0px | 14px |
--card | 12px | 8px | 0px | 12px |
--nav-item | 12px | 8px | 0px | 8px |
2 sizes × 13 types × 5 states — 130 variants. Radius binds to --input = 8px in the Full theme, not the button pill. Every field is Label / Field / Hint in a 4px column.
mdFocus and error both add a ring: 0 0 0 2px canvas offset, then 0 0 0 4px tint. The error ring is exported as literal rgba(255,0,0,.12) — pure red, not bg-error-solid.
The component set exposes 19 properties. Three are variant axes; the rest are booleans, instance swaps and text slots that toggle optional parts of the anatomy. Optional parts are authored in the markup and hidden by default, so opting in is a class — nothing re-renders.
| Property | Kind | Values | Default | Maps to |
|---|---|---|---|---|
Size | variant | md, lg | md | .dos-field--lg |
Type | variant | 13 values | Simple | per-type markup |
State | variant | Placeholder, Focus, Filled, Error, Disabled | Placeholder | .is-* on the wrapper |
has Label? | boolean | True / False | True | .dos-field--no-label to hide |
is Optional | boolean | True / False | False | .dos-field--optional |
is Required | boolean | True / False | False | .dos-field--required |
Leading Icon | boolean | True / False | False | .dos-field--lead-icon |
← Icon | swap | any icon | .dos-input__icon--lead glyph | |
Trailing Icon | boolean | True / False | False | .dos-field--trail-icon |
Icon → | swap | any icon | alert-circle | .dos-input__icon--trail glyph |
🌍 Country | swap | any flag | ghana | flag in .dos-input__addon |
Country Code | boolean | True / False | True | .dos-field--no-country-code to hide |
Password Icon | swap | any icon | lock | leading glyph on Password |
View Icon | swap | any icon | eye | trailing glyph on Password |
Text | text | free text | https:// | .dos-input__addon content |
Payment Icons | swap | card brand | mastercard | trailing brand mark |
Hint | boolean | True / False | False | .dos-field--hint |
Hint Text | text | free text | Hint text goes here | .dos-field__hint content |
Dropdown Icon | swap | any icon | chevron-down | trailing glyph on select-like types |
Hiding the label does not remove it. .dos-field--no-label paired with .sr-only keeps the label in the accessibility tree — a placeholder is not a label, and a field with neither is unusable on a screen reader.
One size, 5 states. min-height: 72px, content top-aligned. Its resting border is border-secondary, not the border-primary the input field uses — that inconsistency is in the source.
6 layouts × 3 states — 18 variants. Cells are 48px squares. Connected shares one outer border; Split is two connected groups with a rule between; Split-Rounded keeps every cell individually rounded.
2 sizes × 6 types × 3 styles × 6 colors — 216 variants. Radius binds to --button, so chips stay pills alongside the buttons. This is the one component that already ships Color=Info.
| Color | Light | Outline | Solid | Leading Icon | Text with Close Button | Avatar | Country | Icon Only |
|---|---|---|---|---|---|---|---|---|
| Default | Badge | Badge | Badge | Badge | Badge | Badge | 🇬🇭Badge | |
| Brand | Badge | Badge | Badge | Badge | Badge | Badge | 🇬🇭Badge | |
| Success | Badge | Badge | Badge | Badge | Badge | Badge | 🇬🇭Badge | |
| Warning | Badge | Badge | Badge | Badge | Badge | Badge | 🇬🇭Badge | |
| Error | Badge | Badge | Badge | Badge | Badge | Badge | 🇬🇭Badge | |
| Info | Badge | Badge | Badge | Badge | Badge | Badge | 🇬🇭Badge |
sm · 24pxmd · 28px3 colors × 2 sizes × 5 states, plus 5 snackbars — 35 variants. Large stacks the message over its actions with a dismiss button pinned top-right; Small is a single 48px row.
A snackbar keeps only the status icon — the surface is always bg-dark, so a toast reads the same wherever it appears.
Checkbox 12 variants (2 types × 2 states × checked × disabled), radio 8. Both are a 16px control; only the silhouette and the marker differ. Figma calls the indeterminate state Immediate.
Default · uncheckedDefault · checkedImmediateDisabled · uncheckedDisabled · checkedBoth are real <input> elements wrapped in a <label>, so the text is a click target and the control keyboard-toggles without any script.
12 variants — 2 types × checked × 2 sizes × disabled. Every dimension derives from the track height: width 1.8×, knob 0.8×, inset 0.1×, which is exactly how the two source sizes relate.
md · offmd · onmd · disabledsm · offsm · onsm · disabled5 types. The rule is drawn with pseudo-elements, so a divider with centre content needs no extra markup.
Pagination 4 types. All four share one filled track and a 40px page cell; only the prev/next treatment changes. The active page is a white cell with a border, not an inverted chip, and the page cells sit flush — the group has no gap.
16px24px · default32px18 variants — 2 supporting-text × 9 arrow positions, at With Style=False. The bubble is bg-alt on --radius-lg; the tail is a 12px square rotated 45° that the bubble paints over, leaving a clean triangle.
Insert Tooltip
Insert tooltip description here. It would look much better as three lines of text.
Insert Tooltip
Insert tooltip description here. It would look much better as three lines of text.
Insert Tooltip
Insert tooltip description here. It would look much better as three lines of text.
Insert Tooltip
Insert tooltip description here. It would look much better as three lines of text.
Insert Tooltip
Insert tooltip description here. It would look much better as three lines of text.
Insert Tooltip
Insert tooltip description here. It would look much better as three lines of text.
Insert Tooltip
Insert tooltip description here. It would look much better as three lines of text.
Insert Tooltip
Insert tooltip description here. It would look much better as three lines of text.
Insert Tooltip
Insert tooltip description here. It would look much better as three lines of text.
Insert Tooltip
Insert Tooltip
Insert Tooltip
Insert Tooltip
Insert Tooltip
Insert Tooltip
Insert Tooltip
Insert Tooltip
Insert Tooltip
The shadow is a filter: drop-shadow, not box-shadow — it has to follow the tail's silhouette rather than the bubble's rectangle.
Arrow Position=None drops the tail. In the source that position exists only at With Style=False, which is why the full set is 34 rather than 36.