Guidelines

Color

Black type on warm off-white, a few greys, and one brand colour per theme: blue in light, orange in dark. The work brings the rest of the colour.

Palette

Declared as --bw-* in packages/design-system/styles/system/colors.css and exposed as Tailwind colours: bg-bw-black, text-bw-dark-gray, border-bw-light-gray. Each chip shows the better of black or off-white type on it, with its WCAG contrast.

Neutrals

Most of every page. Black type on off-white, greys for everything that should step back.

Aa 17.9:1 AAA

Black

#0e0f11

bg-bw-black

Type, the dark theme's background, the solid button.

Aa 11.1:1 AAA

Darkest gray

#373737

bg-bw-darkest-gray

Raised surfaces on black: cards and panels in the dark theme.

Aa 6.5:1 AA

Dark gray

#5c595c

bg-bw-dark-gray

Secondary text on light: leads, captions, metadata.

Aa 8.3:1 AAA

Medium gray

#adaaad

bg-bw-medium-gray

Secondary text on dark, placeholders, quiet labels.

Aa 13.6:1 AAA

Light gray

#d9d9d9

bg-bw-light-gray

Rules, dividers and card borders on light.

Aa 18.0:1 AAA

Lightest gray

#f7f8f9

bg-bw-lightest-gray

Hover fills and wells: a card behind a specimen.

Aa 17.9:1 AAA

Off-white

#f9f7f5

bg-bw-off-white

The page. Warmer than white, so photography sits softly on it.

Aa 19.2:1 AAA

White

#ffffff

bg-bw-white

Pure white: type on black in the dark theme, and cards on the page.

Brand

One brand colour per theme, never both on one surface. Reach them through the brand token, not by name.

Aa 5.0:1 AA

Blue

#185cf6

bg-bw-blue

The brand colour in the light theme: links, underlines, selection.

Aa 5.3:1 AA

Orange

#fb3e03

bg-bw-orange

The brand colour in the dark theme, and the poster moments.

Supporting

Used sparingly, in campaigns and prototypes, and for state. Never as a page background.

Aa 6.9:1 AA

Green

#076248

bg-bw-green

Success and the Do column; campaign accents like the startup sprint.

Aa 5.2:1 AA

Purple

#783bfa

bg-bw-purple

Campaign accent. Illustrations, stickers, a highlighted plan.

Aa 12.6:1 AAA

Pink

#f9beff

bg-bw-pink

Campaign accent, paired with black type. Never with white.

Aa 4.5:1 AA large

Red

#e11837

bg-bw-red

Errors and the Don't column. Nothing decorative.

Brand and accent

--brand is Builtwell's colour: bw-blue in the light theme, bw-orange in the dark one. Use it for the things that say Builtwell: links, underlines, the key call to action, text selection. --accent is not a brand colour. It is the neutral grey that shadcn menus, selects and commands use for hover and highlighted rows. If it should look like Builtwell, it is brand; if it is a hover state, it is accent.

Read the case study, then start a project.

Claim your sprintSee the work
BrandingWebsites (hover, bg-accent)Marketing

Light: brand is bw-blue, accent is a near-white grey.

.light

Read the case study, then start a project.

Claim your sprintSee the work
BrandingWebsites (hover, bg-accent)Marketing

Dark: brand is bw-orange, accent is a dark grey.

.dark
// The brand, whatever the theme
<a className="text-brand underline">Read the case study</a>
<Button className="bg-brand text-brand-foreground">Claim your sprint</Button>
<div className="border-brand border-b-2" />

// Not the brand: hover and highlight in menus
<DropdownMenuItem /> // uses bg-accent on highlight, set by shadcn

Semantic tokens

The shadcn variables every component reads, from .light, :root and .dark in packages/design-system/styles/globals.css. Each chip is painted with the live variable inside that theme. Use them as utilities: bg-background, text-muted-foreground, bg-brand.
TokenLightDarkUse
--backgroundbw-off-whitebw-blackThe page. bg-background.
--foregroundbw-blackbw-whiteBody type on the page. text-foreground.
--primaryoklch(0.205 0 0)bw-whiteThe solid button and strong fills. Ink, not a colour.
--primary-foregroundoklch(0.985 0 0)bw-blackType on primary.
--mutedoklch(0.97 0 0)oklch(0.269 0 0)Quiet wells: skeletons, disabled fills, code backgrounds.
--muted-foregroundbw-dark-graybw-medium-graySecondary text: descriptions, helper text, captions.
--accentoklch(0.97 0 0)oklch(0.269 0 0)Neutral hover and highlighted rows in menus, selects and commands.
--accent-foregroundoklch(0.205 0 0)oklch(0.985 0 0)Type on accent.
--brandbw-bluebw-orangeThe brand colour. bg-brand, text-brand, border-brand.
--brand-foregroundbw-off-whitebw-blackType on brand. Also the ::selection text colour.
--borderoklch(0.922 0 0)rgb(from var(--bw-white) r g b / 0.2)Every default border, through the base layer.
--inputoklch(0.922 0 0)oklch(0.325 0 0)Field borders.
--ringoklch(0.708 0 0)oklch(0.556 0 0)Focus rings.
--destructiveoklch(0.577 0.245 27.325)oklch(0.704 0.191 22.216)Errors and destructive actions only.

Contrast

WCAG 2 contrast for the text pairs in use, computed from the hex values in colors.css. AA needs 4.5:1 for body text and 3:1 for large headings.
Aa17.94:1

Type on the page

bw-black on bw-off-white

AAA
Aa6.47:1

Leads and captions

bw-dark-gray on bw-off-white

AA
Aa2.15:1

Placeholders and quiet labels only

bw-medium-gray on bw-off-white

Fail
Aa17.94:1

Type in the dark theme

bw-off-white on bw-black

AAA
Aa8.34:1

Secondary text in the dark theme

bw-medium-gray on bw-black

AAA
Aa5.04:1

text-brand, light theme

bw-blue on bw-off-white

AA
Aa5.04:1

brand-foreground on brand, light

bw-off-white on bw-blue

AA
Aa5.29:1

text-brand, dark theme

bw-orange on bw-black

AA
Aa5.29:1

brand-foreground on brand, dark

bw-black on bw-orange

AA

Rules

  • Reach the brand colour through bg-brand, text-brand and border-brand, never bw-blue or bw-orange by name, so it follows the theme.
  • One brand colour on a surface. Blue and orange never share a screen.
  • No big orange fills. Orange is for a line, a button, a word; the poster moments are the exception, and they are rare.
  • accent is for hover and highlighted rows. Don't use it to make something look on brand.
  • Medium gray is not for body text on off-white: it fails AA. Use dark gray.
  • Green and red mean success and error before they mean anything else. Use them as accents only in campaigns.
  • destructive is for errors and destructive actions, and nothing decorative.