Color
Werklist is mostly neutral, with blue kept for actions and selection and a few colors that report status. Pick a color by the job it does, and its token gives you the right value in light and in dark.
Surfaces
Surfaces stack from the page up, and the change of fill is what tells one layer from the next. Content surfaces carry no border and no shadow. Only menus, popovers and dialogs float, and they take the raised shadow.
Put a panel or a card on the page, then a band or a nested box inside the panel. Controls such as a segmented control take the control fill. A scrim darkens the page behind a dialog.
--surface-2#f6f6f8--surface-control#ebebf0--surface-strong#f1f1f4--surface-1#ffffff--bg#f5f5f7--surface-2#1e2233--surface-control#323443--surface-strong#262834--surface-1#191c2c--bg#000214- Scrim behind a dialog
- light rgba(15, 18, 35, 0.44), dark rgba(0, 2, 20, 0.66)
- --overlay
Text and icons
Set body text and headings in --text. Labels a person scans, such as column headers and field names, take --text-label. Timestamps, hints and other supporting lines take --text-muted, the quietest ink that still reads on the control fill.
Blue text and links take --brand-ink. Underline a link inside running text, because its blue is too close to the body text to be found by color alone.
--text on --surface-1--text-label on --surface-1--text-muted on --surface-1--text-muted on --surface-control--brand-ink on --surface-1--brand-ink against --textBrand blue
Blue marks what a person can act on and what they have selected. Give it to the one primary action in a view and keep the rest neutral.
Fill a primary button, or any shape that carries white text, with --brand-true. It is the same blue in both themes, so white text on it reads the same. Use --brand-blue for marks with no text on them, such as a progress bar or an unread dot. A selected row or navigation item takes the --nav-fill-active wash under ordinary text.
--on-brand on --brand-true--brand-blue on --surface-1--text on --nav-fill-active over --surface-1--brand-ink on --nav-fill-active over --surface-1Status
Green says done or approved, amber says something needs attention, and red says it failed or cannot be undone. A status always comes with a word or an icon, so a person who cannot tell red from green reads the same thing.
A status chip is a 15 percent tint of its color with the matching ink on top: --success-ink on a --success tint. Information that is neither good nor bad takes the blue tint with --brand-ink, and a neutral chip takes --surface-control with --text. The word on a chip needs at least 3.5 to 1 on its tint.
Chart series and the statuses of a board have colors of their own, set out on the Charts and Board grid pages.
--success-ink on a 15% --success tint--warning-ink on a 15% --warning tint--error-ink on a 15% --error tint--brand-ink on a 15% --brand-blue tint--text on --surface-control--badge-alert-ink on --badge-alertLight and dark
Panels and text have their own dark values. Panels step up from a near black navy page, and blue text turns lighter so it keeps its contrast. The button fill does not change.
WerkOS opens in light, and a person switches to dark on the desktop rail or in My profile. Sign in screens and everything a prospect sees, such as offers, decks and report pages, stay white in both themes.
A document page stays white and a video call stays dark, whichever theme a person chose.
--surface-1--brand-true--brand-ink--brand-blue- Default theme
- Light
- Always light
- Sign in and every page outside the app
Permitted and not permitted
Permitted
Put white text on --brand-true.
It reads 5.44 to 1 in both themes.
Set chip text in the -ink token that matches its tint.
In light, warning ink on its tint reads 4.42 to 1 on a control fill.
Use --text-muted or --text-label for quiet text.
Take every color from a token.
Not permitted
Put white text on --brand-blue.
In dark it reads 3.67 to 1.
Take chip text from the status fill, such as --warning.
In light, warning on its own tint reads 2.70 to 1 on a control fill. The -ink token reads in both themes.
Use gray-400 for text.
In light it reads 2.75 to 1 on white.
Write a hex value in code.
It keeps one value when the theme changes.