Design system of primitives
The canonical, approved boas.dev primitive set (v3.5.0) — every component below is the live kit (boas-dev/brand/boas-kit.css + boas-vars-*.css + boas-filters.svg), not a copy. This document IS the reference; surfaces consume the kit, never reverse-engineer it. Ruled in the operator canon-curation session 2026-07-09. Flip dark/light — a mode change is paint-only.
01 Colour tokens — two poles
Everything resolves through the --c-* role cascade. The system is two poles: a blue STRUCTURE pole (frames, linework, dots-on-red) and a soft-red ATTENTION pole. The contrast rule pairs them — edge one pole, fill the opposite.
Blue — structure pole
Red — attention pole (soft; danger by colour, never a louder hue)
Surfaces + text
No grey-on-dark for text (#4a4a4a banned). Body ≥ --c-text-primary; meta ≥ --c-text-muted, chrome only.
02 Type · geometry · motion
Two faces: Bricolage Grotesque (display / human voice) + JetBrains Mono (data / chrome). Radius 3px (max 5px). Motion: --t-fast 120ms · --t-med 240ms · --t-slow 480ms; the edge breathes at 5.2s.
Bricolage Grotesque
display · headings · human voice · 600 weight, tracking −.015em
JetBrains Mono 0123
data · chrome · labels · tabular numerics
Reading tiers
14px — body / lede (--fs-body)
13.5px — dense reading (--fs-read)
11px — detail / caption floor (--fs-detail)
10px — chrome label (--fs-label)
03 Edge primitive — .edge
The house signature. A scoped ::before carries the warped frame (feTurbulence → feDisplacementMap), an ::after carries the always-on halftone, content rides sharp above. Structural variants flip the contrast pole; the FRAME character is a separate axis (§04).
.edge
Default
quiet blue-structure surface
.edge--frame
Blue-pole emphasis
blue frame · red ground · blue dots
.edge--inv
Red-pole (inverse)
red frame · blue ground · red dots
.edge--quiet
Quiet / nested
softer ground, hairline
.edge--next
Upcoming / active
blue frame accent
.edge--past
De-emphasised
transparent ground, recessed, dots dimmed
04 Edge character → role
One engine, many characters. The same feTurbulence-displacement engine produces different boundary characters by baseFrequency/scale. Ruled 2026-07-09: map a character to a role — never scatter or "pick one". House #edgeLive is the default (cards/dense).
.edge--hero
Hero / dossier
deckle torn-paper edge — front page, cover, featured
.edge--live-roll
Live / now
heavy rolling audio-viz warp · hover to stabilize (still shimmers)
.edge (house)
Cards / dense
calm breathing edge — the default, everything unassigned
.edge--aged
Past / aged
particle dissolve — decay / archived
Available — role-unassigned
--edge-whisper
Whisper
near-crisp
--edge-ridge
Ridge
topographic
--edge-strong
Strong
assertive frame
05 Fills
The interior texture. Plain flat fills are banned on screen — every surface carries texture. Ruled 2026-07-09: house halftone is the default; grain, hex, coarse are kept options; dither/contour/paper disqualified; scanline/phosphor/chroma stay v3-retired.
.edge::after
Halftone
default
--grain-sprite
Grain
atmosphere
lattice
Hex
schematic
.edge--coarse
Coarse
hero
Disqualified: dither · contour · paper. Retired (v3 drift signatures): scanline retired phosphor retired chromatic-split retired.
07 Controls — .field · .otp · .slot · .notice
The transactional family. Warp discipline: controls stay CRISP — the only in-control warps are the two sanctioned callouts: an .err field and a focused control (§08).
Verification code
08 Focus — energized edge
Ruled 2026-07-09. On focus the frame ramps to #edgeHot — it breathes harder. No ring. The surface itself signals focus, reusing the hover/live grammar. Reduced-motion falls back to a visible ring (a11y). (Focus the field / tab to the button to see it energize.)
09 Danger — colour-led
Ruled 2026-07-09. Danger reads by the red pole — red frame · warm-red ground · red halftone · red heading — on the calm house edge. The old solid double-stroke and the fragile distress warp are removed. Optional escalation is an orange "irreversible" tag in content, never a ring.
.edge.danger
Cancel this meeting?
colour-led · no solid ring · calm edge
10 Medium tiers
The same identity across three delivery media. The procedural edge runs live on the web; degrades to static for print; rasterizes for email.
Web — full
Live #edgeLive breathing edge + hover energize + halftone. The reference render.
Web — degraded + print
Reduced-motion → #edgeStatic (no animation), focus → ring. Print → flatten warp + halftone, WHITE ground (PDF is print material).
Email — hybrid (inline-only tier)
feTurbulence can't run in mail. Light deliverability body + a dark pre-rendered procedural band PNG (carries edge+halftone) + a bulletproof rastered console button + the azure 4px left-tick readout (the sanctioned mail echo of the blue-structure pole) on ice body, never white. See boas-dev/reference/email-hybrid-partial.html.
11 Laws
.err callout and focus.--c-* role cascade; data-mode="light" re-resolves colour only — identical DOM, motion, geometry.boas-dev/brand/* are the SSOT.boas.dev design system of primitives · v3.5.0 · canon-curation 2026-07-09
SSOT: boas-dev/brand/boas-kit.css · boas-vars-{dark,light}.css · boas-filters.svg — this doc renders them live.