Skip to content

Surfaces (dark & light)

Ordermatic is intentionally dual-surface: a dark β€œcockpit” frame (the rail, nav, dark panels) around a bright, scannable work surface. The design system models this with adaptive tokens that flip per surface β€” not a global light/dark toggle.

West DCsubmitted
West DCsubmitted

Nothing about the components changes between the columns. Only the wrapper differs.

Wrap a region in Surface (or set data-surface). That flips a small set of adaptive tokens and color-scheme for everything inside:

import { Surface } from '@repo/ui';
<Surface variant="dark">
<Button variant="outline">Works on dark</Button>
</Surface>
Adaptive tokenLightDark
--om-bgworkspace paperink-black
--om-panelwhiteraised navy
--om-panel-2subtle paperink
--om-textinkwhite
--om-text-2greywarm white
--om-text-mutedlight greyfog
--om-linebone borderhairline
--om-hoverpaper washwhite 6%

color-scheme rides along, so native controls (radio, checkbox, select) match their surface automatically β€” no dark widgets stranded on a light card.

  • Build primitives on adaptive tokens (--om-text, --om-panel, --om-line…), not the fixed --om-surface-* / --om-fg-on-light-* primitives. That’s what makes them work anywhere.
  • This is surface-scoped, not a user theme toggle β€” you opt a region into dark; content stays on the bright workspace by brand intent.
  • Status colors stay fixed (system signals read on both surfaces). Card is the one component where you pick the surface explicitly (variant="dark").