manifold

design system · manifold-modernist-infra · v0.1.0

A system is a tuple of tokens that satisfies a set of constraints.

Tokens are the parameter space; constraints carve out the manifold of valid systems. Family-specific constraints layer on top of universal observables.

polarity
light
density
comfortable
contrast tier
AA
constraints
12 pinned (8 universal + 4 family)

Color tokens

Each text token's contrast vs page bg in this theme. WCAG 2.1 AA target = 4.5 : 1 for normal text, 3.0 : 1 for large text and UI elements.

Active theme · bg hsl(0, 0%, 100%)
--color-bg
hsl(0, 0%, 100%)
--color-fg
hsl(0, 0%, 6%)
19.13:1 AA
--color-muted
hsl(0, 0%, 35%)
6.98:1 AA
--color-faint
hsl(0, 0%, 50%)
3.98:1 fail
--color-rule
hsl(0, 0%, 90%)
1.25:1 fail
--color-code-bg
hsl(0, 0%, 97%)
--color-accent
hsl(0, 30%, 45%)
5.91:1 AA
Light theme (prefers-color-scheme: light) · bg #ffffff
--color-bg
#ffffff
--color-fg
#0a0a0a
19.80:1 AA
--color-muted
#595959
7.00:1 AA
--color-faint
#717171
4.88:1 AA
--color-rule
#e5e5e5
1.26:1 fail
--color-code-bg
#f7f7f7
--color-accent
#0a0a0a
19.80:1 AA

Type scale

Modular scale: typeBase × typeRation. The typeRatio token comes from the family's type_system.ratio_band clamped against the persona's tone axis — currently 1.25 at base 15px.

size-xxs
The quick brown fox
7.7px · ×0.512
size-xs
The quick brown fox
9.6px · ×0.640
size-sm
The quick brown fox
12.0px · ×0.800
size-base
The quick brown fox
15.0px · ×1.000
size-lg
The quick brown fox
18.8px · ×1.250
size-xl
The quick brown fox
23.4px · ×1.562
size-2xl
The quick brown fox
29.3px · ×1.953
size-3xl
The quick brown fox
36.6px · ×2.441

Line height + layout

Spacing stops are linear multiples of spacingBase; layout dimensions and corner radii live in the same constraint catalog as colors and type. Bringhurst line-length target: 45–75 ch optimum.

kindnamevaluedescription
line-height tight 1.2 Display headlines, hero typography
line-height snug 1.4 Section headings (h2 / h3)
line-height normal 1.55 UI labels, dense data tables
line-height prose 1.7 Body paragraphs, long-form reading
layout containerMax 1200px Outer page container (.wrap)
layout contentMax 960px Data-dense content
layout proseMax 720px Bringhurst-band prose measure
layout sidebarWidth 200px Spec / API rail when present
layout topbarHeight 28px Site-header band
radius xs 2px Inline pills (token-ratio badges)
radius sm 3px Buttons, code blocks
radius md 4px Card containers, theme blocks
radius lg 6px Builder panels, large cards
radius none 0 Edge-to-edge banners

Constraint catalog (live, this family)

Universal observables (Miller, Hick, WCAG, F-pattern, iOS auto-zoom) apply to every family. Family-specific constraints layer on top — this family adds 4 rules.

gateslugkindtarget
UNIVERSALwcag-aa-textcontrast≥ 4.5 : 1 (text)
UNIVERSALwcag-aa-largecontrast≥ 3.0 : 1 (ui)
UNIVERSALmiller-chunklist-len≤ 9 items per group
UNIVERSALhick-navnav-count≤ 7 top-level / ≤ 15 expanded
UNIVERSALf-pattern-anchoranchor-pct≥ 60% paragraphs carry an anchor
UNIVERSALinfo-scentlink-blurbno bare 'click here' / 'more'
UNIVERSALios-zoominput-px≥ 16px on 360px viewport
UNIVERSALtouch-targetpx≥ 40 × 40 px on mobile
STRICTtype-ratio-bandfamily-specific1.125 ≤ typeRatio ≤ 1.25
STRICTsingle-accent-colorfamily-specific≤ 1 chromatic accent across the brand
CSSno-illustrative-photographyfamily-specific
STRICTmuted-saturation-onlyfamily-specificsaturation ∈ [0.0, 0.10]

How the deriver maps the axes

Each persona axis couples to one or more downstream tokens on each layer.

persona axis→ visual seed→ content seed
tonetype ratio · densitysentence stdev (variety)
pacingmotion preset · densitysentence length mean
warmthhue family · saturation · hue shiftperson register (impersonal-3rd ↔ 2nd)
confidencecontrast tier · type weightactive vs mixed voice
intentlayout density · code-to-prose ratiotype-token + lexical density · jargon ceiling

Pre-shipped personas

Curated starting points from the 243-persona space.

Pre-shipped adjacent systems

Single-axis shifts from the canonical persona for this family.

Quality gates

Every page in this site is measured. Failing a gate means the design system failed — not just the content.

rulethresholdharnesswhat it enforces
heading-hierarchyno skips, exactly 1 h1statich1 → h2 → h3 in order. Skipping a level breaks screen-reader navigation.
nav-top-count≤ 7 linksstaticPrimary-nav cognitive load (Miller). Above 7 the visitor cannot hold the menu in working memory.
nav-group-count≤ 9 / groupstaticMiller chunk limit applied to sidebar groups; each group must fit in one glance.
nav-sidebar-total≤ 15 expandedstaticHick's-Law cross-group ceiling. Beyond 15 the sidebar forces an O(N) scan.
nav-active-visibleactive link visiblestaticVisibility-of-system-status: a sidebar leaf's link must not be hidden behind a collapsed group.
flat-list≤ 9 itemsstaticSame Miller limit applied to ul/ol. Longer lists require grouping.
anchor-density≥ 60% of paragraphsstaticF-pattern scannability. ≥ 60% of paragraphs need an inline code/bold/link anchor.
dry-streak≤ 4 bare paragraphsstaticInformation-scent decay. Past 4 unanchored paragraphs the reader stops scanning.
aria-buttonevery buttonstaticAccessible name required: visible text or aria-label.
aria-inputevery inputstatic<label for> association or aria-label on every input.
aria-imgevery imgstaticalt attribute on every image (empty string is valid for decorative).
landmarkmain + navstaticEvery page needs <main> and at least one <nav>.
link-scentno bare wordsstatic'here', 'click', 'more' carry no information; link text must describe the destination.
token-driftno inline hexstaticHardcoded color or font-size in style= bypasses the token system.
contrastWCAG AAstaticEvery design-token color pair: 4.5:1 normal text, 3:1 large text and UI elements.
viewport-metadevice-widthstaticWithout <meta name=viewport>, mobile Safari renders into a 980-px viewport.
flesch≥ 35contentFlesch Reading Ease over prose. Below 35 the document reads like a legal brief.
fk-grade≤ 15contentFlesch-Kincaid Grade Level. US grade 15 = first-year university; technical docs stay there or below.
avg-sentence≤ 25 wordscontentMean sentence length. Past 25, comprehension drops sharply.
info-scent-pct≥ 90%content% of links that carry an explanatory blurb. Bare 'click here' links are high-cost.
scan-anchor-pct≥ 60%contentAnchor-density rule applied to source markdown paragraphs.
max-dry-streak≤ 4contentMarkdown twin of dry-streak; consecutive paragraphs without an anchor.
longest-flat-list≤ 9contentMarkdown twin of flat-list; longest contiguous bullet/number list.
show-total≥ 1 / pagecontentEvery spec page needs at least one code block, table, or diagram.
words-per-show≤ 200contentShow-vs-tell ratio. Specs that score 400+ are print-shaped prose rendered to HTML.
voice-registerinfra-docscontentImpersonal-3rd, active voice. First or second person above threshold = register drift.
mobile-overflowscrollWidth ≤ 360pxresponsiveAt 360-px viewport, document.scrollWidth must not exceed window.innerWidth.
input-zoom-trigger≥ 16px on mobileresponsiveAt 360-px viewport, every text input's font-size must be ≥ 16px or iOS Safari auto-zooms on focus.
touch-target≥ 40 × 40 pxresponsiveWCAG 2.5.5 derivative. Every button's bounding box at 360-px viewport must be ≥ 40×40 px.
sidebar-heading-fitno overflowresponsiveSidebar group headings must fit container without wrap or truncation.
header-row-alignmentcenters within ±2 pxresponsiveBrand + nav must vertically align when on the same row.
empty-labeled-regionnon-empty bodyresponsiveEvery h2/h3 followed by a container must have visible content.
headline-width-utilizationuses 70%+ of parentresponsive<h1> wrapping unnecessarily because of max-width cap.
header-content-breathing-room≥ 32px gapresponsiveGap between site-header bottom and first <main> child top must be ≥ 32px.
catalog-artifact-existencereal artifactcatalogEvery status:ships entry must cite a file that exists in the repo.
catalog-{verb,plugin,resource}-coverageintrospector ↔ catalogcatalogEvery introspectable surface needs a catalog entry.
catalog-scene-coveragescenes referencedcatalogEvery examples/scenes/*.scene.json must be cited from a stdlib doc.
inventory-freshregenerate on changeinventoryOn-disk inventory must match a fresh introspection of source.