Typography
OPERATOR Sans carries interface text; OPERATOR Mono carries code and aligned data. See Typefaces for specimens, downloads, installation, and qualification status.
Scale
xs — 8px UPPERCASE · non-actionable only
sm — 9px UPPERCASE · non-actionable only
base — 11px mixed-case · minimum for actionable labels
md — 13px mixed-case · primary body, input text
lg — 16px UPPERCASE
xl — 20px UPPERCASE
2xl — 28px UPPERCASE
Scale tokens
Each step is a size, a line height, a tracking, and a weight. text-oprt-<step> sets all four
and tracking-oprt-<step> sets the tracking alone, both through the tokens below, so a token
override reaches every composed component. Steps are xs, sm, base, md, lg, xl, and 2xl.
| TOKEN | VALUE | USAGE |
|---|---|---|
--oprt-type-xs | 8px | Non-actionable micro-labels |
--oprt-type-sm | 9px | Non-actionable labels and overlines |
--oprt-type-base | 11px | Minimum for actionable labels |
--oprt-type-md | 13px | Primary body and input text |
--oprt-type-lg | 16px | Headings |
--oprt-type-xl | 20px | Headings |
--oprt-type-2xl | 28px | Largest headings |
Line heights stay on the 8px grid:
| TOKEN | VALUE | USAGE |
|---|---|---|
--oprt-line-xs | 16px | Line height of xs |
--oprt-line-sm | 16px | Line height of sm |
--oprt-line-base | 16px | Line height of base |
--oprt-line-md | 24px | Line height of md, and of the document |
--oprt-line-lg | 24px | Line height of lg |
--oprt-line-xl | 32px | Line height of xl |
--oprt-line-2xl | 40px | Line height of 2xl |
Tracking falls as size and weight rise. The two caps tokens are for uppercase controls and
bind to a component's size variant, never to its base class:
| TOKEN | VALUE | USAGE |
|---|---|---|
--oprt-tracking-xs | 0.14em | xs micro-labels |
--oprt-tracking-sm | 0.12em | sm micro-labels |
--oprt-tracking-caps | 0.07em | 11px uppercase controls (tracking-oprt-caps) |
--oprt-tracking-caps-lg | 0.05em | 13px uppercase controls (tracking-oprt-caps-lg) |
--oprt-tracking-base | 0.04em | base |
--oprt-tracking-md | 0.02em | md body text |
--oprt-tracking-lg | 0.10em | lg headings |
--oprt-tracking-xl | 0.07em | xl headings |
--oprt-tracking-2xl | 0.06em | 2xl headings |
Each step has a default weight: 500 for sm, lg, xl, and 2xl, and 400 for xs, base,
and md. Add font-medium where a label at base needs 500:
| TOKEN | VALUE | USAGE |
|---|---|---|
--oprt-weight-xs | 400 | Weight of xs |
--oprt-weight-sm | 500 | Weight of sm |
--oprt-weight-base | 400 | Weight of base |
--oprt-weight-md | 400 | Weight of md |
--oprt-weight-lg | 500 | Weight of lg |
--oprt-weight-xl | 500 | Weight of xl |
--oprt-weight-2xl | 500 | Weight of 2xl |
The legacy --oprt-case-xs, --oprt-case-sm, --oprt-case-base, --oprt-case-md,
--oprt-case-lg, --oprt-case-xl, and --oprt-case-2xl tokens remain for compatibility. No
utility reads them: text size never chooses letter case.
Type stack
| Role | Font | Usage |
|---|---|---|
| Primary | OPERATOR Sans | Body, headings, navigation, labels, controls, badges, descriptions |
| Aligned data | OPERATOR Mono | Code, coordinates, IDs, timestamps, JSON, manifests, numerical values |
Both variable families include weights 300–700 and separate italics. Keep interface text upright and disable programming ligatures in code and data.
Package defaults
Import @operator-ds/tokens at the application root and register
@operator-ds/tailwind. The stylesheet loads four variable WOFF2 files locally.
--oprt-font-sans (Operator Sans Family) and --oprt-font-mono (Operator Mono Family)
also supply Tailwind's font-sans and font-mono utilities.
For selective token imports, add @operator-ds/tokens/fonts once. Without the token
package, use the standalone stylesheet.
These Geist-derived fonts remain development candidates. Review their validation status; retain the included SIL Open Font License and source notices when redistributing.
Rules
Detail hierarchy
Use EntityPreview for record details in a popover, inspector, or page. The entity name leads at 16px semibold. Descriptive labels use 9px medium, uppercase, and the dim text token; values use 11px and retain their supplied case. IDs, coordinates, exact measurements, and timestamps use Mono. Actions retain the 11px minimum.
For a smaller group of facts, use
DescriptionList with layout="details".
Labels occupy the left column and values align to the right edge. Long values
wrap within their column. Keep equipment condition separate from report quality,
and use text-only status badges inside these rows. Put contextual explanation
below the related rows and actions after the details.
General rules
- Actionable labels: at least 11px (
text-oprt-base) and weight 500.text-oprt-baseis weight 400, so addfont-medium. This applies to buttons, inputs, links, menus, tabs, and other controls. Thexsandsmtokens are for non-actionable labels only. The design references MIL-STD-1472H §5.1.3.3 character height under degraded viewing; font qualification remains open. Selected text in plain text controls uses weight 600 + underline. - Uppercase interface labels: section headings, actions, tabs, short navigation and menu labels, and status badges. Docs titles, navigation, and prose keep authored case.
- Preserve content case: body/help/error text, field labels and values, names,
IDs, and code. This includes names or message subjects used as headings. Apply
casing with CSS, never by rewriting data. Wrap case-sensitive names in
normal-case tracking-normal;codeandkbdpreserve case automatically. - Choose casing explicitly.
text-oprt-*sets size, line height, weight, and tracking, not uppercase. Useuppercasefor interface labels andnormal-casefor content. - Tracking:
tracking-oprt-capsfor 11px uppercase controls,tracking-oprt-caps-lgfor 13px controls,tracking-oprt-smfor non-actionable micro-labels, and the size scale's tracking for larger headings. - Use Sans by default. Reserve Mono for character-position alignment: tabular numerals, code, prompt symbols, coordinates, IDs, timestamps, JSON, and stat-card values.