Reciprocal
Elements bend the field; the field bends them back. Nothing is inert.
Every element is a body — it bends the field, and the field bends it back. This is that thesis as a design language: the tokens, the 34 forces, the glyphs, and the type that document it.
Everything you touch moves the field, and the field moves it back. The interface is the visible surface of one reciprocal system.
Elements bend the field; the field bends them back. Nothing is inert.
The visible surface and the invisible system are designed as one. People feel coherence before they can name it.
Load-bearing systems that still give. Constraints are forces, not walls.
The palette is the catalog. Each of the 34 forces is an accent with a canonical colour (§20.2), a glyph, and — for the nine — a discipline it maps to.
Colour is an accent, never a flood — pure hue lives on the mark and the glyph; surfaces stay deep, ink stays legible.
48121624324864Two families: Bricolage Grotesque handles prose and display; Martian Mono handles every label, counter, and measurement.
300 · Light400 · Regular500 · Medium600 · Semibold700 · Bold800 · ExtraboldDisplay 600 · −0.04em · 0.98 · Hero statements H1 600 · −0.035em · 1.0 · Page titles H2 600 · −0.03em · 1.04 · Section titles H3 600 · −0.02em · 1.1 · Card titles Body 400 · −0.011em · 1.6 · Running text Small 400 · 0 · 1.5 · Secondary text The vocabulary is verbs — what a body does to the matter around it. Each is a glyph, a two-letter symbol, a colour, and a per-frame law. Read the full manual →
Atattractv += û · (1 − d/r)² · S · 0.5 (+ orbital swirl) Pulls matter into a well — an inverse-square gravity well bent into a spiral.
Rerepelv −= û · (1 − d/r)² · S · 0.5 Pushes matter away — an inverted well that carves a clean void.
Swswirlv += û⊥ · (1 − d/r)^1.4 · S · 0.45 · spin (+ 0.12 inward) Spins matter into a whirlpool — a tangential force that circles without collapsing.
Ststreamv += ĥ · (1 − d/r)^1.1 · S · 0.5 Blows a directional current — a constant push along a fixed heading.
Viviscosityv −= v · (1 − d/r) · (0.05 + 0.07·S) Thickens the medium — viscosity that bleeds momentum off.
Jtjetfeed: v += û·(1 − d/r)²·(0.25 + 0.15·S); at the nozzle (<24px): relaunch as a jet A fountain — draws matter in, then jets it back out along a heading.
Tetetherv += û · (d − rest) · k; v *= 0.985, rest = 0.6·r A tether with a rest length — holds matter at a fixed radius.
Wlwallinside box: push out the shallower axis, v_axis ← −0.85·v_axis A surface that bounces — an elastic collision off a bounding box.
Sksinkcapture within absorbR; at capacity, release everything (supernova) Swallows matter and holds it — accretion, then supernova at the cap.
GrgravityF = G·M·d̂ / (d² + ε²), ε = r_s = 2GM/c²; |v| ≤ c A true inverse-square well — the real GM/d² law, softened at the core.
ChchargeF = −σ·q·GM·d̂ / (d² + ε²) Coulomb attraction or repulsion — inverse-square, set by sign.
Mgmagnetismv ← rotate(v, θ), θ = q·spin·B·(1 − d/r) A force perpendicular to motion — bends a moving particle without doing work.
Ththermalv += √(2T) · ξ, T = S·(1 − d/r), ξ ~ N(0,1) per axis Brownian agitation — random kicks that heat the medium.
Cocollideoverlapping, approaching discs exchange normal momentum (e = S) Hard-sphere contact — particles bounce off one another.
Dfdiffusedeposit φ; v += ∇φ · S; field blurs ∂φ/∂t = D∇²φ Lays a trail and climbs it — matter follows the diffused mark up-gradient.
Pgpropagatepulse φ at the source; v += r̂·|∇φ|·S (ride the front out); ∂²φ/∂t² = c²∇²φ A travelling wave — a disturbance that moves through the field.
MymemoryM(x) += λ where matter sits; v += û · (1 − d/r)² · S · 0.5 · (1 + μ·M) A trace of where matter has been — past paths persist and pull.
Lelensv ← rotate(v, θ_max · (1 − d/r) · sign) Bends passing tracks like refraction — focuses or scatters them.
Gagateif v·n < 0: v −= 2(v·n)·n A conditional aperture — passes some particles, blocks others.
Bybuoyancyv_y −= (ρ_med − ρ_p)·g, ρ_p = base / (size·(1 + heat)) Lifts lighter matter and sinks heavier — density against a field.
Shshearv∥ += S · (offset⊥ / r) · (1 − d/r) Opposing currents at a boundary — a velocity gradient.
Czcrystallizeif heat < ½: v += (node − p)·k; v *= 0.9 Snaps matter onto a lattice — order grown from a seed.
Alalignv += (ĥ·|v| − v)·k, ĥ = neighbour-mean heading (or the body heading) Turns matter to a common heading — flocking orientation.
Wdwindv += curl(ψ)·S, ψ = sin(x·s + 0.2t)·cos(y·s − 0.2t) A broad, noisy current — turbulent drift across the field.
Cncohesionneighbours: push if d < r₀, pull if r₀ < d < r₁ Mutual attraction within a group — a surface tension.
Prpressureρ = Σ W(d, h); v += −k·(ρ − ρ₀)·∇W (push down the density gradient) Outward push from crowding — a density repulsion.
Huhuntpredator: v += seek(nearest prey)·S; prey: v += flee(nearest predator)·S Tracks and chases a target — pursuit steering.
Spspawnwhile engaged: emit S·2 particles/frame along the heading, each living ~90 frames Seeds new matter at a source — emission of fresh particles.
Lklinkneighbours: e = d − L; v += ½k·(e/L)·û (holds rest length L = range·0.35) Binds two bodies with a constraint — rigid or elastic.
Momorphassign p → target t (hash of gx); v += (t − p)·k + jitter·(1 − arrived) Matter assembles into a mark — a logo or chart grown from drifting particles, never words.
Rsresonatemodifier: scales sibling S by S(t) = 1 + sin(ω·t) A modifier that breathes — scales its sibling forces with a pulsing strength.
Slspotlightmodifier: gates siblings outside an angular cone of the heading A modifier cone — confines its sibling forces to a directed beam.
Pmpigmenton overlap: c_p ← mix(c_p, tint, rate); the colour advects with matter Carries colour through the medium — a dye that mixes.
Fffieldflown̂ = netField/|netField|; v += (n̂·|v| − v)·k_steer + n̂·gain·a_accel, gain = S·(1 − d/r) Follows the field lines — matter streams along the field a body radiates.
Forces act locally; a formation is a single global bias over every particle. Five of them, one per section of the journey.
Ambient Wells Lanes Scatter Accretion The force glyphs are pure CSS shapes — they double as the icon set and the system vocabulary. One easing curve drives all motion.
attractrepelswirlstreamviscosityjettetherwallsinkgravitychargemagnetismthermalcollidediffusepropagatememorylensgatebuoyancyshearcrystallizealignwindcohesionpressurehuntspawnlinkmorphresonatespotlightpigmentfieldflowblackholewhiteholestarquasargalaxynebulatornadofountainThe shared parts the Lab and the design system both run on — a status pill, a
segmented toggle, force-tinted tabs, and a mono readout. Each tints to the active force via --fc.
The Lab's advanced inputs, drawn properly — slider, stepper, angle dial,
dual range, and styled select. Pick a force to re-tint the whole set via --cc.
0.9sopacity + 28px rise0.45slit / dim cross-fade~2slerp 0.03 / framecontinuouslerp 0.08 / frameEasing: cubic-bezier(0.16, 1, 0.3, 1) — everywhere.