Theming

The board paints with its own tokens, all prefixed --bk-. Set them once on a wrapper and every screen follows; set none and you get the defaults, which are neutral rather than anyone's brand.

.bk-root {
  --bk-primary: var(--my-brand);
  --bk-primary-hover: var(--my-brand-soft);
  --bk-font-sans: var(--my-sans);
}

The defaults live on .bk-root in the package's tokens.css; your theme maps them to whatever your product already has. Nothing else is needed — the board's classes are flat bk-* inside @layer boardkit, so your own rules win without a specificity fight.

The contract#

Colour

TokenWhat it paints
--bk-paper, --bk-paper-warmpage and raised surfaces
--bk-ink, --bk-ink-mid, --bk-ink-muted, --bk-ink-fainttext, from body to the faintest label
--bk-line, --bk-line-softborders and separators
--bk-primary, --bk-primary-hover, --bk-primary-fgthe main action
--bk-accent-50 … --bk-accent-700the accent ramp (chips, highlights, the drag target)
--bk-loud, --bk-loud-hover, --bk-loud-fgthe one button that has to shout
--bk-danger, --bk-successdestructive and confirming states

Type: --bk-font-sans, --bk-font-display, --bk-font-mono.

Motion and shape: --bk-dur, --bk-ease, --bk-radius-sm, --bk-radius-md, --bk-radius-pill, --bk-shadow-sm, --bk-shadow-md.

Optional, no default (each use carries a fallback):

TokenWhat happens without it
--bk-topbar-hthe detail panel assumes 62 px of fixed header and starts that far down
--bk-code-fontcode blocks fall back to --bk-font-mono

If your top bar has a different height — or publishes it at runtime — map --bk-topbar-h to it. A six-pixel lie there moves the whole detail panel on a phone, which is exactly how it was found.

What a real mapping looks like#

Not every token maps one to one, and that is fine:

.bk-root {
  --bk-primary: var(--vs-maroon);
  --bk-primary-hover: var(--vs-maroon-soft);   /* not a -hover of its own */
  --bk-accent-300: var(--vs-rose-300);         /* a whole ramp, renamed */
  --bk-topbar-h: var(--vs-topbar-h);           /* published at runtime */
}

How to check you got it right#

Take a screenshot before and after the theme, at 1440 and at 390. The extraction of these tokens was verified that way and landed at 0.000 % pixel difference on every board screen; anything above antialiasing noise is a token you have not mapped.