DesignOS component reference

Generated from the Figma Design - OS variable export — 623 variables across 7 collections. Light Mode only.

Colors 149

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.

Text 20

--text-primary#0a0a0a
--text-secondary#404040
--text-tertiary#525252
--text-quarternarycorrected#737373
--text-disabled#a3a3a3
--text-errorcorrected#dc2626
--text-error-secondary#f87171
--text-warningcorrected#d97706
--text-warning-secondary#fbbf24
--text-successcorrected#059669
--text-brand#171717
--text-brand-secondary#a3a3a3
--text-alt#ffffff
--text-placeholdercorrected#a3a3a3
--text-placeholder-alt#d4d4d4
--text-success-secondary#34d399
--text-white#ffffff
--text-dark#000000
--text-info#2563eb
--text-info-secondary#60a5fa

Background 33

--bg-primary#ffffff
--bg-primary_hover#f7f7f7
--bg-secondary#f7f7f7
--bg-tertiary#f0f0f0
--bg-quarternary#e5e5e5
--bg-disabled#f7f7f7
--bg-error#fef2f2
--bg-error-secondary#fee2e2
--bg-warning#fffbeb
--bg-warning-secondary#fef3c7
--bg-success#ecfdf5
--bg-brand-primary#f7f7f7
--bg-brand-secondary#f0f0f0
--bg-alt#171717
--bg-error-solid#dc2626
--bg-success-secondary#d1fae5
--bg-success-solid#10b981
--bg-warning-solid#f59e0b
--bg-brand-primary_hover#f0f0f0
--bg-brand-solid#0a0a0a
--bg-primary_press#f0f0f0
--bg-dark#171717
--bg-white#ffffff
--bg-info#eff6ff
--bg-info-secondary#dbeafe
--bg-info-solid#2563eb
--bg-secondary_hover#f0f0f0
--bg-secondary_press#e5e5e5
--bg-brand-hover#262626
--bg-brand-press#404040
--black#000000
--white#ffffff
--bg-brand-primary_press#e5e5e5

Border 17

--border-primary#f0f0f0
--border-secondary#e5e5e5
--border-tertiary#d4d4d4
--border-disabled#f0f0f0
--border-error#dc2626
--border-error-secondary#fecaca
--border-warning#d97706
--border-warning-secondary#fde68a
--border-success#059669
--border-brand#171717
--border-brand-secondary#e5e5e5
--border-success-secondary#a7f3d0
--border-white#ffffff
--border-info#2563eb
--border-info-secondary#bfdbfe
--border-alt#ffffff
--border-alt-2#000000

Icon 19

--icon-primary#171717
--icon-secondary#525252
--icon-tertiary#737373
--icon-disabled#a3a3a3
--icon-error#dc2626
--icon-error-secondary#f87171
--icon-warning#d97706
--icon-warning-secondary#fbbf24
--icon-success#059669
--icon-brand#171717
--icon-brand-secondary#a3a3a3
--icon-success-secondary#34d399
--icon-dark#0a0a0a
--icon-white#ffffff
--icon-alt#ffffff
--icon-info#2563eb
--icon-info-secondary#60a5fa
--icon-quarternary#a3a3a3
--icon-quinary#d4d4d4

Charts 12

--chart-blue#3b82f6
--chart-orange#fb923c
--chart-green#16a34a
--chart-red#dc2626
--chart-purple#a855f7
--chart-yellow#facc15
--chart-pink#ec4899
--chart-dark#525252
--chart-lime#65a30d
--chart-cyan#06b6d4
--chart-success#10b981
--chart-success-light#6ee7b7

Opacity 18

--opacity-light-10#ffffff1a
--opacity-light-20#ffffff33
--opacity-light-30#ffffff4d
--opacity-light-40#ffffff66
--opacity-light-50#ffffff80
--opacity-light-60#ffffff99
--opacity-light-70#ffffffb2
--opacity-light-80#ffffffcc
--opacity-light-90#ffffffe5
--opacity-dark-10#0000001a
--opacity-dark-20#00000033
--opacity-dark-30#0000004d
--opacity-dark-40#00000066
--opacity-dark-50#00000080
--opacity-dark-60#00000099
--opacity-dark-70#000000b2
--opacity-dark-80#000000cc
--opacity-dark-90#000000e5

Alpha 30

--alpha-brand-accent-85#0a0a0ad9
--alpha-brand-accent-10#0a0a0a1a
--alpha-brand-accent-40#0a0a0a66
--alpha-brand-accent-60#0a0a0a99
--alpha-brand-accent-20#0a0a0a33
--alpha-neutral-accent-10#0a0a0a1a
--alpha-neutral-accent-20#0a0a0a33
--alpha-neutral-accent-40#0a0a0a66
--alpha-neutral-accent-60#0a0a0a99
--alpha-neutral-accent-85#0a0a0ad9
--alpha-success-accent-10#0596691a
--alpha-success-accent-20#05966933
--alpha-success-accent-40#05966966
--alpha-success-accent-60#05966999
--alpha-success-accent-85#059669d9
--alpha-warning-accent-10#f59e0b1a
--alpha-warning-accent-20#f59e0b33
--alpha-warning-accent-40#f59e0b66
--alpha-warning-accent-60#f59e0b99
--alpha-warning-accent-85#f59e0bd9
--alpha-blue-accent-10#2563eb1a
--alpha-blue-accent-20#2563eb33
--alpha-blue-accent-40#2563eb66
--alpha-blue-accent-60#2563eb99
--alpha-blue-accent-85#2563ebd9
--alpha-error-accent-10#dc26261a
--alpha-error-accent-20#dc262633
--alpha-error-accent-40#dc262666
--alpha-error-accent-60#dc262699
--alpha-error-accent-85#dc2626d9

Corrections applied to the export

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 variableUsedWhy
Text/text-placeholder#707070export #a3a3a3 measures 2.52:1 on bg-primary — fails AA
Text/text-error#d62525export #dc2626 measures 4.41:1 on bg-error — fails AA
Text/text-warning#a95d05export #d97706 measures 3.07:1 on bg-warning — fails AA
Text/text-success#04805aexport #059669 measures 3.58:1 on bg-success — fails AA
Text/text-quarternary#6f6f6fexport collapses the fourth text step onto the third

Roles added on top of the export

The export leaves these undefined, and every one covers a need that would otherwise fall back to a raw value.

TokenValueWhy
--text-on-error-solid#ffffffon-solid content; text-alt flips per mode, bg-error-solid does not
--text-on-warning-solid#0a0a0awhite on bg-warning-solid measures 2.15:1
--text-on-success-solid#0a0a0aon-solid content for bg-success-solid
--text-on-info-solid#ffffffon-solid content for bg-info-solid
--bg-error-solid_hover#ef4444error/500 — the export defines no error hover; brightens on hover so the fill stays unmistakably red
--bg-error-solid_press#b91c1cerror/700 — deepens on press, one step below the resting error/600
--bg-error_press#fecacaerror/200 — press step for the soft error surface, above bg-error-secondary
--border-control#8d8d8dinteractive control boundary; WCAG 1.4.11 needs 3:1
--border-focus-ring#171717focus treatment named in components §10.3 but untokenised
--shadow-card0 4px 24px rgba(10,10,10,.05)elevation must arrive through a named token
--shadow-evidence0 24px 60px rgba(10,10,10,.14)elevation must arrive through a named token
--ring-offsetvar(--bg-primary)inner 2px of Ring/*; must match the canvas, not literal white
--ring-brandrgba(10,10,10,0.12)outer 4px of the exported Ring/brand effect
--ring-errorrgba(255,0,0,0.12)outer 4px of the exported Ring/error effect
--motion-state160msno motion tokens in the export; §12 baseline
--motion-easecubic-bezier(.2,0,0,1)no motion tokens in the export; §12 baseline
--line-height-paragraph-md1.5line heights live in the text styles, not the variables
--line-height-paragraph-sm1.4286line heights live in the text styles, not the variables
--line-height-caption-md1.5line heights live in the text styles, not the variables

Spacing, radius and widths

2. Spacing & Size 50 · 3. Radius 11 · 4. Widths 12. Components bind to the component theme token, never to a raw radius.

Spacing & size 50

TokenValueFigma name
--spacing-00pxUI Spacing/spacing-0
--spacing-22pxUI Spacing/spacing-2
--spacing-44pxUI Spacing/spacing-4
--spacing-66pxUI Spacing/spacing-6
--spacing-88pxUI Spacing/spacing-8
--spacing-1212pxUI Spacing/spacing-12
--spacing-1616pxUI Spacing/spacing-16
--spacing-2020pxUI Spacing/spacing-20
--spacing-2424pxUI Spacing/spacing-24
--spacing-3232pxUI Spacing/spacing-32
--spacing-4040pxUI Spacing/spacing-40
--spacing-4848pxUI Spacing/spacing-48
--spacing-5656pxUI Spacing/spacing-56
--spacing-6464pxUI Spacing/spacing-64
--spacing-9696pxUI Spacing/spacing-96
--spacing-128128pxUI Spacing/spacing-128
--spacing-160160pxUI Spacing/spacing-160
--spacing-192192pxUI Spacing/spacing-192
--spacing-224224pxUI Spacing/spacing-224
--spacing-256256pxUI Spacing/spacing-256
--spacing-320320pxUI Spacing/spacing-320
--spacing-384384pxUI Spacing/spacing-384
--spacing-480480pxUI Spacing/spacing-480
--spacing-560560pxUI Spacing/spacing-560
--spacing-640640pxUI Spacing/spacing-640
--spacing-720720pxUI Spacing/spacing-720
--spacing-768768pxUI Spacing/spacing-768
--spacing-960960pxUI Spacing/spacing-960
--spacing-12801280pxUI Spacing/spacing-1280
--spacing-14401440pxUI Spacing/spacing-1440
--spacing-19201920pxUI Spacing/spacing-1920
--screen-size1440pxScreen Size/Size
--padding-padding24pxPadding/padding
--spacing-10241024pxUI Spacing/spacing-1024
--spacing-8080pxUI Spacing/spacing-80
--spacing-10801080pxUI Spacing/spacing-1080
--gap-gap24pxGap/gap
--spacing-7272pxUI Spacing/spacing-72
--font-size-display72pxFont Size/display
--font-size-header-h160pxFont Size/header-h1
--font-size-header-h248pxFont Size/header-h2
--font-size-header-h336pxFont Size/header-h3
--font-size-header-h430pxFont Size/header-h4
--font-size-header-h524pxFont Size/header-h5
--font-size-header-h620pxFont Size/header-h6
--font-size-paragraph-lg18pxFont Size/paragraph-lg
--font-size-paragraph-md16pxFont Size/paragraph-md
--font-size-paragraph-sm14pxFont Size/paragraph-sm
--font-size-caption-md12pxFont Size/caption-md
--font-size-caption-sm10pxFont Size/caption-sm

Radius 11

TokenValueFigma name
--radius-none0pxradius-none
--radius-xxs2pxradius-xxs
--radius-xs4pxradius-xs
--radius-sm6pxradius-sm
--radius-md8pxradius-md
--radius-lg12pxradius-lg
--radius-xl16pxradius-xl
--radius-2xl20pxradius-2xl
--radius-3xl24pxradius-3xl
--radius-4xl32pxradius-4xl
--radius-full100000pxradius-full

Widths 12

TokenValueFigma name
--width-xxs320pxwidth-xxs
--width-xs384pxwidth-xs
--width-sm480pxwidth-sm
--width-md560pxwidth-md
--width-lg640pxwidth-lg
--width-xl768pxwidth-xl
--width-2xl1024pxwidth-2xl
--width-3xl1080pxwidth-3xl
--width-4xl1280pxwidth-4xl
--width-5xl1440pxwidth-5xl
--width-6xl1920pxwidth-6xl
--width-xxxs256pxwidth-xxxs

Typography

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.

TokenValueFigma name
--family-displayInterFamily/display
--weight-regularregularWeight/regular
--family-headingInterFamily/heading
--family-textInterFamily/text
--family-captionInterFamily/caption
--weight-boldboldWeight/bold
--weight-mediummediumWeight/medium
--weight-semiboldsemiboldWeight/semibold

Size ramp

TokenSizeSample
--font-size-display72pxAg
--font-size-header-h160pxAg
--font-size-header-h248pxAg
--font-size-header-h336pxAg
--font-size-header-h430pxAg
--font-size-header-h524pxAg
--font-size-header-h620pxAg
--font-size-paragraph-lg18pxAg
--font-size-paragraph-md16pxAg
--font-size-paragraph-sm14pxAg
--font-size-caption-md12pxAg
--font-size-caption-sm10pxAg

Component radius themes

6. Themes 8 tokens × 4 modes. Switching the control above swaps the whole set at once.

Component themeFullNormalSharpSlightly Rounded
--button100000px8px0px12px
--modal32px16px0px20px
--modal-inner-container20px12px0px16px
--input8px8px0px12px
--calendar-header100000px12px0px16px
--pagination100000px10px0px14px
--card12px8px0px12px
--nav-item12px8px0px8px

Buttons

4 sizes × 5 types × 5 states, plus error and icon-only — 216 variants. Radius binds to --button.

Sizes

sm · 32px
md · 40px
lg · 48px
xl · 56px

Types and states

StateDefaultSecondaryOutlineGhostLinkIcon only
Default
Hover
Press
Error
Disabled
Loading

Error — hover and press

Figma exposes 🚨 Error=True only at State=Default, so these two rows are derived. Each type steps through its own error surface rather than taking one blanket overlay.

StateDefaultSecondaryOutlineGhostLink
Default
Hover
Press
TypeDefaultHoverPress
Default solidbg-error-solid 600bg-error-solid_hover 500bg-error-solid_press 700
Secondarybg-error 50bg-error-secondary 100bg-error_press 200
Outlinebg-primarybg-error 50bg-error_press 200
Ghosttransparentbg-error 50bg-error_press 200
Linknonenonenone

Why these values. The export defines no error hover or press, so both are added as semantic roles. The solid fill brightens on hover (600 → 500) and deepens on press (600 → 700), which keeps every state unmistakably red. Copying brand's step distance instead would walk error into near-black, because brand sits at the end of its ramp (950) while error sits mid-ramp.

Every state is a named fill — nothing tints, so the label holds full text-on-error-solid and no state layer sits over the content.

Contrast. White on the resting #dc2626 measures 4.9:1 and on the pressed #b91c1c 6.5:1, both clearing AA. The brightened hover #ef4444 measures 3.8:1 — under the 4.5:1 normal-text minimum. It is transient and never the resting state, but if that matters for your compliance target, drop the hover to #dc2626 and shift rest/press one step deeper.

Content colour never changes between default, hover and press. Ghost and Outline resolve to text-brand; Outline's border is border-brand-secondary.

Input field

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.

States — md

Placeholder
Label
Filled
Label
Focus
Label
Disabled
Label
Error
Label
Hint text goes here

Sizes

md · 40px
Label
lg · 48px
Label

All 13 types

Simple
Simple
Icon Leading
Icon Leading
Password
Password
Color Input
Color Input
Payment Input
Payment Input
Tag Input
Tag Input
DesignosDesign Icons
Leading Text
Leading Text
https://
Phone Number
Phone Number
🇬🇭 233
Date Input
Date Input
Trailing Icon
Trailing Icon
Number Input
Number Input
Upload File
Upload File
Choose file
Currency
Currency
GHS

Focus 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.

Input properties

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.

Playground

Label(optional)*
Hint text goes here

    

All 19 properties

PropertyKindValuesDefaultMaps to
Sizevariantmd, lgmd.dos-field--lg
Typevariant13 valuesSimpleper-type markup
StatevariantPlaceholder, Focus, Filled, Error, DisabledPlaceholder.is-* on the wrapper
has Label?booleanTrue / FalseTrue.dos-field--no-label to hide
is OptionalbooleanTrue / FalseFalse.dos-field--optional
is RequiredbooleanTrue / FalseFalse.dos-field--required
Leading IconbooleanTrue / FalseFalse.dos-field--lead-icon
← Iconswapany iconmail.dos-input__icon--lead glyph
Trailing IconbooleanTrue / FalseFalse.dos-field--trail-icon
Icon →swapany iconalert-circle.dos-input__icon--trail glyph
🌍 Countryswapany flagghanaflag in .dos-input__addon
Country CodebooleanTrue / FalseTrue.dos-field--no-country-code to hide
Password Iconswapany iconlockleading glyph on Password
View Iconswapany iconeyetrailing glyph on Password
Texttextfree texthttps://.dos-input__addon content
Payment Iconsswapcard brandmastercardtrailing brand mark
HintbooleanTrue / FalseFalse.dos-field--hint
Hint Texttextfree textHint text goes here.dos-field__hint content
Dropdown Iconswapany iconchevron-downtrailing 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.

Text area

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.

Placeholder
Label
Filled
Label
Focus
Label
Disabled
Label
Error
Label
Hint text goes here

OTP input

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.

Layouts

Input-4
OTP Verification
Input-6
OTP Verification
Input-4 Connected
OTP Verification
Input-6 Connected
OTP Verification
Input-6 Split
OTP Verification
Input-6 Split-Rounded
OTP Verification

States

Default
OTP Verification
Filled
OTP Verification
Active
OTP Verification

Badges & chips

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.

Colors × styles, plus every type

ColorLightOutlineSolidLeading IconText with Close ButtonAvatarCountryIcon Only
DefaultBadgeBadgeBadgeBadgeBadgeBadge🇬🇭Badge
BrandBadgeBadgeBadgeBadgeBadgeBadge🇬🇭Badge
SuccessBadgeBadgeBadgeBadgeBadgeBadge🇬🇭Badge
WarningBadgeBadgeBadgeBadgeBadgeBadge🇬🇭Badge
ErrorBadgeBadgeBadgeBadgeBadgeBadge🇬🇭Badge
InfoBadgeBadgeBadgeBadgeBadgeBadge🇬🇭Badge

Types across all three styles

Text Only
Badge Badge Badge
Leading Icon
Badge Badge Badge
Text with Close Button
Badge Badge Badge
Avatar
Badge Badge Badge
Country
🇬🇭Badge 🇬🇭Badge 🇬🇭Badge
Icon Only

Sizes

Badgesm · 24px
Badgemd · 28px

Alerts & snackbar

3 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.

Color = Default

brand

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

success

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

warning

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

error

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

info

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

neutral

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

Color = Light

brand

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

success

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

warning

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

error

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

info

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

neutral

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

Color = Solid

brand

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

success

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

warning

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

error

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

info

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

neutral

Stay Updated!

Check here for important announcements, latest updates, and exciting news.

Snackbar

A snackbar keeps only the status icon — the surface is always bg-dark, so a toast reads the same wherever it appears.

brand

Stay Updated!

Check here for important announcements.

success

Stay Updated!

Check here for important announcements.

warning

Stay Updated!

Check here for important announcements.

error

Stay Updated!

Check here for important announcements.

info

Stay Updated!

Check here for important announcements.

neutral

Stay Updated!

Check here for important announcements.

Banners

3 colors × 5 states — 15 variants. Full-bleed, square corners, no shadow: a banner belongs to the page edge, not to a card.

Color = Default

Color = Light

Color = Solid

Checkbox & radio

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.

Checkbox

Default · unchecked
Default · checked
Immediate
Disabled · unchecked
Disabled · checked
Default · unchecked
Default · checked
Immediate
Disabled · unchecked
Disabled · checked

Radio

Inactive
Active
Disabled
Disabled · active

Both are real <input> elements wrapped in a <label>, so the text is a click target and the control keyboard-toggles without any script.

Toggle

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 · off
md · on
md · disabled
sm · off
sm · on
sm · disabled

With text

off
on
disabled

Content divider

5 types. The rule is drawn with pseudo-elements, so a divider with centre content needs no extra markup.

Line
Line Spacing
Text & Line Divider
or
Icon Button
Text Button

Pagination & loader

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.

Type=1 — text prev/next
Type=2 — icon prev/next
Type=3 — ghost prev/next
Type=4 — arrows only

Loader

16px
24px · default
32px

Tooltip

18 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.

With supporting text — 280px

bottom left
bottom center
bottom right
top left
top center
top right
left
right
none

Title only — hugs

bottom left
bottom center
bottom right
top left
top center
top right
left
right
none

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.