Polarize UI is a design system for interfaces that show scientific data honestly. Every measured, modelled or speculative value carries a label, and the label can never be hidden.
A label may never be hidden. Its explanation must be.
Principles
- Keep tier badges, MEASURED/PREDICTED styling, units and verdicts inline, always. Move the explanation (why that tier, how it was measured, provenance) into a
ui-notedrawer. - Never put a tier badge behind a disclosure. Never give
measuredandpredictedthe same colour, weight or style: measured values are upright, predicted values are italic. - An invented value with no source wears
specand the wordTASTEorADDED. Never render it as derived. - Do not force reuse. A one-off control belongs in its project; centralise only surfaces, type, tier badges, disclosure, tabs, cards, tables and chart palettes.
Content fundamentals
- Write plainly and hedge precisely: “MODELLED, chosen by ear, not measured.” State n, units and scope next to a number.
- Tier words are uppercase mono:
MEASURED,PREDICTED,MODELLED,EXPLORATORY,SPEC,ADDED,TASTE,REFUTED. Letter tiers are[A],[B],[C],[SPEC]. - A REFUTED badge carries its scope, reason and cheapest probe in the drawer.
- No emoji, no exclamation marks, no marketing voice.
Visual foundations
- Themes. Default is
instrument(light) withinstrument-darkunderprefers-color-scheme. Setdata-themeto pin one:instrument,instrument-dark,polarize(warm dark, clay accent),fieldguide/fieldguide-dark(magenta accent, Geist body). Pinningpolarizekeeps the pre-Instrument look. - Type: a triad. Headings in
display-1/2/3(Instrument Serif, regular case only, never uppercased). Running text intext-base(Inter 14px). Any uppercase text, any caption or eyebrow, useslabel(IBM Plex Mono). The case rule: uppercase is always mono, the serif is never uppercased. - Inter is never bold and never tracked. Hierarchy comes from size, face, colour and case, not weight.
<strong>is marked byforegroundink insidemuted-foregroundcopy. - Structure. Use hairlines (
border,border-strong) and whitespace, not boxes or shadows. Pad cards withspace-4, radiusradius-base. - One accent. Use
accentfor the single dominant action per view;ringfor a 2px solid focus outline. - Colour axes never mix. Tier colours (
measured,predicted,exploring,spec,refuted) mean evidence quality only. Chart series useseries-1..series-8in fixed order; only the first three are safe when every pair is compared. Magnitude uses the one-huesequential-*ramp. In the Polarize theme,clay= signal,ochre= human annotation,lichen= machine state. - Colour-blind safety. Every badge carries a word and a glyph as well as a colour:
◆measured,▲predicted,●exploring,◇spec,✕refuted. - Motion. 120/200/320 ms with
cubic-bezier(.2,.7,.3,1); everything honoursprefers-reduced-motion. - Spacing is a 4px scale (
space-1..space-9); radii areradius-xs..radius-pill.
Iconography
Phosphor Icons (duotone, MIT) as a self-hosted SVG sprite, inlined once by design.js, referenced as <svg class="ui-icon"><use href="#ph-play"/></svg>. Fifteen icons are in use (play, pause, stop, skip, repeat, waveform, gauge, bookmark and similar). The sprite is not part of this file set; take it from the repo’s icons/polarize-icons.svg.
Using it
- Zero-build: link
design.css, loaddesign.jsas a module, set<body class="ui">. Components areui-*classes plus<ui-tier>,<ui-note>,<ui-docs>. Hardware-style controls (knob, faders, timeline, lane, panner) are incontrols.css+controls.js. - React: shadcn/ui on the same theme (
shadcn/theme.css,tier.tsx), plus publication layouts, evidence badges and visx charts. Do not loaddesign.cssandshadcn/theme.cssin one document; both define--accent. - Versioning: the package is public and released on every push to
main; a patch release never breaks consumers. Renaming or removing a class, token, prop or export is breaking and must be marked. - Package:
@polarizetech/polarize-ui. Source: github.com/polarizetech/polarize-ui.