field-ui · a relational field runtime for the DOM

Elements have mass.

Importance is gravity. Signal is charge. Relation is binding. Change is decay. The forces that order the physical world translate an interface — its elements and its data alike — better than any system built for either. field-ui returns what your markup already carries as live --field-* variables you style with: every element a body in one field, where what matters pulls, what’s related binds, and what you attend to charges.

Most UI frameworks let you declare importance. field-ui is the first that enforces it — physically. You can’t style everything as urgent.

Category  add a data-* attribute, get --field-* back For  design engineers · AI-product builders · component-library authors Maturity  0.x preview — a substrate to build on, no external users yet
Install

Add it to the stack you already have.

Most projects want @field-ui/vanilla — framework-free and host-bundled, so createField works with no wiring. React users want @field-ui/react. The core engine has zero runtime dependencies.

npm i @field-ui/vanilla Recommended — framework-free, host-bundled (createField works with no wiring).
npm i @field-ui/react The <FieldField> React component + useFieldField hook.

No build step? Import from a CDN (playground / prototyping only): import { createField } from 'https://esm.sh/@field-ui/vanilla'

The full package map and an install-to-reacting-headline walkthrough live in the docs.

A real interface

A real interface you’d actually build.

An inbox of real unanswered questions, ranked by urgency — recency, votes, and views become mass. But the page holds one fixed attention budget, so brightening one ask dims the rest. No particle swarm; the measurement comes back as type and ink.

Open this example →
Why it’s different

Most frameworks let you declare importance. field-ui enforces it.

You can’t style everything as urgent — the attention budget is conserved. Express “these are related,” “the user has dwelled here,” or “this is unstable” as first-class runtime state, instead of hand-rolling badges, spinners, and bespoke animation for each. See conserved attention →

data-*you author measureruntime --field-*runtime writes back you styleCSS
You author meaning; the field returns measurement.

Stop building the systems that exist because the DOM is blind.

The DOM can’t see what matters, what’s related, or what’s gone stale — so teams build that sight by hand, again and again. field-ui gives the DOM a continuous answer, and a whole category of code stops being yours to write and maintain.

  • Priority you don’t store or sort. Importance is a measurement the field reads each frame (--field-density), not state you keep in a store and re-sort on every change. See it work →
  • “Everything is P1,” solved by a law. Attention is one conserved budget — emphasize one thing and the rest necessarily yield. The normalization pass teams enforce with scoring schemes and meetings becomes something the runtime cannot violate. See it work →
  • Relationships you don’t model. Connection emerges from proximity and conservation — threads, cross-boundary spill — instead of adjacency lists and graph traversal you maintain. See it work →
  • Staleness without timers. Recency and decay are a force in the runtime, continuous, not a cron job or a computed column you babysit. See it work →
  • One model, always current. The field re-resolves every frame, so a priority shift doesn’t fire a sort-and-re-render pass — the readout is simply already current. See it work →

field-ui doesn’t hand you a better abstraction over these jobs. It makes the question each one answered — what matters, what’s related, what’s stale — answerable by the field, so the job itself goes away.

  • Zero runtime dependencies. The core engine ships with none.
  • Costs almost nothing to run. Not main-thread-bound; sub-millisecond at real-page scale (~130 particles, 0.25 ms/frame). The live homepage runs 42 field instances at 120 fps with no long tasks on desktop. The measurements →
  • Accessible by construction. Semantic HTML stays the source of truth; reduced-motion equivalents are enforced and linted.
  • Auditable. Code-verified docs, conformance tests, a frozen 0.x API.
The wedge

Trust UI for AI output.

Show support, contradiction, confidence, and provenance for model output as an inspectable field — the same deterministic field math behind the Evidence and Search studies, aimed at where it’s most urgent.

The full engine, end to end

Now — how it works, live over the running engine.

Everything above is built from one contract: data-* in, --field-* out. Below is the complete, executable manual — 36 forces, the presets, and the system behaviour, each demo running on the real engine.

Open the Lab →
I

Substrate

What the field is made of — and how it locks to the page.

01 — Synchronization

The platform maps semantic elements into field coordinates.

The runtime measures registered bodies through the host / platform boundary and maps each element’s box into the field — so the field and the page describe the same space.

Because it re-measures as the page changes, the field stays locked to the visible boxes through scroll, resize, and reflow.

measure: rect(el) field(x, y)
02 — Mass & damping

Particles are point-masses in a medium.

Each particle carries a velocity and a nominal mass — m = 1 by default. Every frame its velocity is multiplied by a friction factor — momentum bleeds off instead of accumulating.

vₜ₊₁ = v · f (f ≈ 0.95) · m ∝ size

Damping is why the field settles into calm swarms rather than scattering. The formula shows the opt-in mode — mass: true — where m scales with size; default particles run at nominal mass m = 1.

03 — Currents

The waves are a flow field.

Near a wave line, particles pick up a drag vector along the slope of the curve — the derivative of the sine — so they drift like debris carried down a river.

slope(x) = cos(x · freq + φ) · freq · amp · vₓ += slope · influence

It’s why the resting field feels alive without any input.

Live — the four fields

Every page already has these four. field-ui gives them behavior.

Pick one, and watch the same page resolve through a different field.

Gravity translates priority into convergence.

They are not four effects — they are four ways a semantic surface can behave.

Live — a body as a vessel

A body isn’t only a force. It can be a vessel.

Forces push and pull. But a body can also take matter in — it captures the dots near it, holds them as it fills, and releases them all at once when it’s full. Capture, hold, release: nothing conjured, nothing deleted. Matter just changes hands.

The shipped case is a sink. data-absorb sets how close it grabs from; data-max sets how much it can hold; the engine writes the fill back as --load, so the body can show how full it is. Drag it through the swarm and watch the meter climb — then pop.

captureholdrelease (at data-max)
a vessel — drag it; it fills, then pops
vessel
it captures nearby dots, holds them, and releases on supernova
II

Natural-field translations

Every interface already has priority, polarity, binding, and transformation. field-ui translates the four fundamental fields into those relations — gravity becomes priority, electromagnetism becomes polarity and signal, strong becomes binding, weak becomes transformation. The runtime tokens below are engine expressions of that grammar (true 1/d², Lorentz, Langevin, diffusion, waves) — translations, not additional fundamental fields. See the Natural Fields model.

04 — Gravity

A heavy headline with a true 1/d² pull — a real well.

True softened inverse-square — a real 1/d² law.

F = G·M·d̂ / (d² + ε²), ε = r_s = 2GM/c²; |v| ≤ c
gravity — drag me gravity true softened inverse-square — a real 1/d² law
05 — Charge

Two states that demix charged matter into +/− domains.

The signed sibling of gravity — like repels, opposite attracts.

F = −σ·q·GM·d̂ / (d² + ε²)
charge — drag me charge the signed sibling of gravity — like repels, opposite attracts
06 — Magnetism

A region that curves moving charge into cyclotron arcs.

The Lorentz force — curves a moving charge, doing no work.

v ← rotate(v, θ), θ = q·spin·B·(1 − d/r)
magnetism — drag me magnetism the Lorentz force — curves a moving charge, doing no work
07 — Thermal

A "hot" badge that agitates the field with Brownian heat.

Langevin/Brownian agitation — a real temperature in the medium.

v += √(2T) · ξ, T = S·(1 − d/r), ξ ~ N(0,1) per axis
thermal — drag me thermal Langevin/Brownian agitation — a real temperature in the medium
08 — Collide

A dense cluster where particles ricochet like billiards.

Elastic pairwise collision — the hard-sphere billiard force.

overlapping, approaching discs exchange normal momentum (e = S)
collide — drag me collide elastic pairwise collision — the hard-sphere billiard force
09 — Diffuse

A trail particles lay down and follow — stigmergy.

A pheromone field — deposit a mark and follow the diffused gradient.

deposit φ; v += ∇φ · S; field blurs ∂φ/∂t = D∇²φ
diffuse — drag me diffuse a pheromone field — deposit a mark and follow the diffused gradient
10 — Propagate

A button that fires a real shock wave across the field.

A travelling wave — particles ride the expanding front.

pulse φ at the source; v += r̂·|∇φ|·S (ride the front out); ∂²φ/∂t² = c²∇²φ
propagate — drag me propagate a travelling wave — particles ride the expanding front
11 — Memory

A frequently-used path that wears in and starts pulling harder.

The field remembers — occupancy wears in paths that pull harder.

M(x) += λ where matter sits; v += û · (1 − d/r)² · S · 0.5 · (1 + μ·M)
memory — drag me memory the field remembers — occupancy wears in paths that pull harder
III

Forces

What a single body can do to the matter around it — designed UI verbs, stable and bounded. A designed verb is not a natural field: an attractor is not gravity, a repeller is not charge.

12 — Attraction

A body can pull the field into orbit.

An attractor defines a gravity well. The pull grows as distance falls, and a tangential component bends incoming particles into stable spirals.

F = (1 − d / dmax)² · S

Drag the attractor — the force is bound to the element, not the cursor.

attractor — drag me attractor force follows the element across the field
13 — Repulsion

A body can push the field away.

A repeller is an inverted well — the force points outward, carving a clean void the rest of the field flows around.

F = −(1 − d / dmax)² · S

Drag the repeller and watch a clearing open around it.

repeller — drag me repel force points outward — a void opens in the field
14 — Reflection

A body can be a wall.

A wall is an axis-aligned box. A crossing particle has its perpendicular velocity reversed and scaled by elasticity, then is projected back out — a hard hit throws a spark.

vertical edge: vₓ ← −Cᵣ · vₓ

Drag the wall into the drifting particles to deflect them.

wall — drag me
wall
particles bounce off the bounding box
15 — Swirl

A body can spin the field.

A swirl applies a dominantly tangential force — a swirl, not a drain. The inward pull is light (the swirl dominates it roughly eightfold), so matter wheels around the body instead of falling in. A tight inward spiral is a preset (whirlpool), never the canonical verb.

v += (−d̂_y, d̂_x) · S · spin + · S · 0.12

Drag the swirl into the swarm — particles orbit rather than fall in.

swirl — drag me swirl tangential force — the field circles, never collapses
16 — Stream

A body can blow a current.

A stream emits a constant force along a heading — a fan, a jet, a prevailing wind. The swarm combs into parallel flow.

v += (cos θ, sin θ) · S · (1 − d/dmax)

Drag the jet and watch matter streak into lanes downwind.

stream — drag me stream directional current — particles comb downwind
17 — Tether

A body can tether the field at a fixed distance.

A tether has a rest length. Matter that crowds in is pushed out; matter that strays is reeled in — the swarm settles into an orbiting shell.

v += û · (drest) · k

Drag the tether — matter springs back to its radius.

tether — drag me tether a tether — matter holds a shell at the rest radius
18 — Viscosity

A body can thicken the medium.

A viscosity body neither pulls nor pushes — it bleeds momentum, as if the field turned to honey. Paired with an attractor it turns a slingshot into a settled orbit.

vv · (1 − k), k ∝ (1 − d/d_max)·S

Agitate, then watch the rush die inside the zone.

viscosity — move me viscosity a viscous zone — momentum bleeds off, the swarm settles
19 — Accretion & release

A body can hold matter — and give it back.

A sink captures particles at its core. They aren’t deleted — they’re held inside, and the element inflates as it fills. When it saturates it goes supernova: the exact particles are released radially.

scale = 1 + (accreted / capacity) · 0.45 · captured = released

Nothing is conjured from thin air, and nothing vanishes. Matter changes hands.

sink — fills, then pops
core
matter accumulates, then releases on supernova
20 — Emission

A body can be a fountain.

A jet draws surrounding matter into its nozzle and relaunches it as a hot jet — the field is recycled into a stream, nothing conjured.

feed: v += d̂ · S · at nozzle: v = (cos θ, sin θ) · spd

Agitate to feed it, then watch the jet stream off along its heading.

jet — move me · jets → jet a fountain — matter is drawn in and jetted back out
IV

Designed-extended

Further designed forces, and the modifiers that wrap a sibling.

21 — Lens

A link that bends a passing flow into caustics — no capture.

Rotates velocity, preserving speed — bends paths without adding energy.

v ← rotate(v, θ_max · (1 − d/r) · sign)
lens — drag me lens rotates velocity, preserving speed — bends paths without adding energy
22 — Gate

A one-way membrane: matter passes through but not back.

A one-way membrane — passes along its heading, reflects the reverse.

if v·n < 0: v −= 2(v·n)·n
gate — drag me gate a one-way membrane — passes along its heading, reflects the reverse
23 — Buoyancy

A feed where light/hot items rise and dense ones settle.

A constant lift/sink by density — light matter rises, dense settles.

v_y −= (ρ_med − ρ_p)·g, ρ_p = base / (size·(1 + heat))
buoyancy — drag me buoyancy a constant lift/sink by density — light matter rises, dense settles
24 — Shear

A divider with laminar flow — layers slide past each other.

A laminar velocity gradient — flow grows with perpendicular offset.

v∥ += S · (offset⊥ / r) · (1 − d/r)
shear — drag me shear a laminar velocity gradient — flow grows with perpendicular offset
25 — Crystallize

A "cool" section where matter snaps onto a lattice.

Snaps cool matter onto a lattice; melts and frees it when hot.

if heat < ½: v += (node − p)·k; v *= 0.9
crystallize — drag me crystallize snaps cool matter onto a lattice; melts and frees it when hot
26 — Align

A nav where particles flock to a shared heading.

Steers toward a heading, preserving speed — flock alignment.

v += (ĥ·|v| − v)·k, ĥ = neighbour-mean heading (or the body heading)
align — drag me align steers toward a heading, preserving speed — flock alignment
27 — Wind

A hero with divergence-free turbulence drifting through it.

Divergence-free curl-noise turbulence.

v += curl(ψ)·S, ψ = sin(x·s + 0.2t)·cos(y·s − 0.2t)
wind — drag me wind divergence-free curl-noise turbulence
28 — Cohesion

A tag group that behaves like a droplet — a swarm with a skin.

Short-range pressure + mid-range pull — surface tension.

neighbours: push if d < r₀, pull if r₀ < d < r₁
cohesion — drag me cohesion short-range pressure + mid-range pull — surface tension
29 — Pressure

A dense cluster that relaxes to an even fill, like a settling fluid.

SPH density relaxation — incompressible even-fill via mutual repulsion.

ρ = Σ W(d, h); v += −k·(ρ − ρ₀)·∇W (push down the density gradient)
pressure — drag me pressure SPH density relaxation — incompressible even-fill via mutual repulsion
30 — Hunt

A two-species swarm that chases and scatters — a living ecosystem.

Two-species pursuit — predators seek prey, prey flee predators.

predator: v += seek(nearest prey)·S; prey: v += flee(nearest predator)·S
hunt — drag me hunt two-species pursuit — predators seek prey, prey flee predators
31 — Spawn

A nozzle that jets matter into the field — a literal fountain or a star seeding the void.

A source [S] — creates matter along the heading, budgeted by a lifespan + pool ceiling.

while engaged: emit S·2 particles/frame along the heading, each living ~90 frames
spawn — drag me spawn a source [S] — creates matter along the heading, budgeted by a lifespan + pool ceiling
32 — Link

A cluster that holds together like cloth — a soft structure that ropes and drapes.

A Verlet distance constraint — ropes, chains, cloth, soft structures.

neighbours: e = d − L; v += ½k·(e/L)·û (holds rest length L = range·0.35)
link — drag me link a Verlet distance constraint — ropes, chains, cloth, soft structures
33 — Morph

A logo or chart that assembles from drifting matter — a mark, never words.

Matter assembles into a mark / chart / logo — never words (§11).

assign p → target t (hash of gx); v += (t − p)·k + jitter·(1 − arrived)
morph — drag me morph matter assembles into a mark / chart / logo — never words (§11)
34 — Resonate

Pair with attract: a well that breathes (pulsing strength).

Pulses its sibling forces with a time-varying strength.

modifier: scales sibling S by S(t) = 1 + sin(ω·t)
resonate — drag me resonate pulses its sibling forces with a time-varying strength
35 — Spotlight

Pair with stream: a directed beam confined to a cone.

A directional gate — confines sibling forces to a beam.

modifier: gates siblings outside an angular cone of the heading
spotlight — drag me spotlight a directional gate — confines sibling forces to a beam
36 — Screen

A reading column the field quiets down around — text shielded from a noisy page.

A quiet zone — attenuates other bodies' forces inside its radius (shield, never global).

modifier: other bodies' force on matter inside r is scaled by clamp(1 − S·(1 − d/r)², min, 1)
screen — drag me screen a quiet zone — attenuates other bodies' forces inside its radius (shield, never global)
37 — Pigment

A section that stains passing matter its own color, carried away.

Conserved color transport — matter takes on and carries a tint.

on overlap: c_p ← mix(c_p, tint, rate); the color advects with matter
pigment — drag me pigment conserved color transport — matter takes on and carries a tint
38 — Field Flow

A magnet or charge whose field lines the swarm threads, like plasma along a solar prominence.

Follow the field lines — steer onto and stream down the net field a body radiates.

n̂ = netField/|netField|; v += (n̂·|v| − v)·k_steer + n̂·gain·a_accel, gain = S·(1 − d/r)
fieldflow — drag me fieldflow follow the field lines — steer onto and stream down the net field a body radiates
39 — Warp

A pair of portals: matter that enters one throat emerges from its partner, conserved.

A wormhole throat — relocates matter (conserved) to its data-pair body, twisted/scaled.

within absorbR: p ← pairCentre + R(twist)·û·(absorbR·scale + 6); v ← R(twist)·v
warp — drag me warp a wormhole throat — relocates matter (conserved) to its data-pair body, twisted/scaled
V

Presets

Cosmology as composition — named arrangements of the primitives.

40 — Blackhole

A dramatic focal element — the field pours in, circles, and is swallowed.

A well, an accretion disk, an event horizon, and lensing.

expands to: attract · swirl · sink · lens
blackhole — drag me blackhole hover to engage · 4 forces in one body
41 — Whitehole

A source that only emits — the field is pushed away and downwind.

An emission horizon that throws matter out.

expands to: repel · stream
whitehole — drag me whitehole hover to engage · 2 forces in one body
42 — Star

A balanced body — gravity’s pull held off by thermal pressure.

Hydrostatic equilibrium — gravity balanced by thermal pressure.

expands to: gravity · thermal
star — drag me star hover to engage · 2 forces in one body
43 — Quasar

An accreting core with bright jets firing from its poles.

An accreting black hole with polar jets.

expands to: attract · swirl · sink · lens · jet
quasar — drag me quasar hover to engage · 5 forces in one body
44 — Galaxy

A spiral that winds the field into arms and settles into a disk.

A spiral disk that settles into a plane.

expands to: attract · swirl · viscosity · lens
galaxy — drag me galaxy hover to engage · 4 forces in one body
45 — Nebula

A warm, slow cloud — the field churns and light wisps rise.

A warm, slow cloud with rising wisps.

expands to: thermal · viscosity · buoyancy
nebula — drag me nebula hover to engage · 3 forces in one body
46 — Tornado

A funnel that swirls the field up its axis, ragged at the edges.

A funnel with an updraft, calmed at the edges.

expands to: swirl · stream · viscosity
tornado — drag me tornado hover to engage · 3 forces in one body
47 — Fountain

A literal fountain — matter sprays upward and falls back in an arc.

A class-[S] source jetting matter up, arcing home under gravity.

expands to: spawn · gravity
fountain — drag me fountain hover to engage · 2 forces in one body
VI

Conditions

When a force decides to act, and on which matter.

48 — Conditional

A force can choose what it touches.

Any body can carry a condition — gated on being engaged, or on a particle’s speed or heat. A selective force reads every free agent and acts only on those that match.

when = active · fast · slow · hot · cool · scrolling

The catcher below only grips hot particles. Heat the field and the excited matter is pulled in while the calm passes through.

conditional — catches heat only when hot selective attractor — grips excited matter, ignores the calm
VII

System

What emerges when the parts interact.

49 — Reciprocity

The field changes the element back.

The element bends the field — and the field’s local density bends the element in return. As particles gather on a word, it gains weight, brightness, and lift.

--field-density = density(body) weight, glow, rise

Hover the word — it pulls the field, the field piles up, and the pile makes the word heavier. A closed loop. (--d is the compact compatibility alias of --field-density.)

density → weight density gathered particles raise the element’s weight
50 — Conserved attention

The page can’t emphasize two things at once.

There is one finite budget of force for the whole page. Engage a word and it pulls force off every other — so as one gathers matter and grows heavier, the rest give theirs up. Focus isn’t styled; it’s conserved.

Σ Sᵢ · effortᵢ = constant

Hover one word — watch the others surrender their weight to it.

one budget, redistributed
focus depth weight
one finite budget — engaging one starves the rest
51 — Threads

Engaging one body wires the set.

Engage an element in a group and the field draws living threads between it and its siblings. A list stops being a list and shows itself as a connected system.

Hover any line.

a connected set
Product System Interface Material
threads connect the engaged body to its set
52 — Cross-boundary causality

Density doesn’t stop at the edge.

When a body saturates, the excess spills to its neighbours — weighted by nearness, and conserved. Engage one tile and the ones beside it light up on their own. The wiring between elements appears because matter actually flows between them.

Φᵢⱼ = κ · excessᵢ · wᵢⱼ ⁄ Σ wᵢₖ

Hover the middle tile — watch its neighbours catch, the far ones faintly.

spill → neighbours light
engage one — the excess spills to whoever’s near
53 — Formations

The whole field can change its mind.

Forces act locally. A formation acts on every particle at once — a single global bias. As you scrolled, each chapter quietly switched it.

Ambient — calm brownian drift, the resting state.

54 — Material typography

Type is a readout of mass.

The word is a body. It pulls the field, matter pools beneath it, and its whole appearance — weight, optical size, tracking, bloom, color — is a live readout of how much has gathered. One value, --field-density, drives every axis at once.

--field-density wght · opsz · tracking · bloom · color

Disturb it — the burst scatters the pile, the type goes light and pale, then it thickens back as the field resettles under its own pull. Type as a material, not a style.

density → every type axis material weight, optical size, tracking, glow and color are one density
55 — Self-laying-out

The page arranges itself.

These nodes aren’t pinned by CSS. Each one pushes off the others and drifts away from crowded field, settling into an equilibrium — and re-settling when the field is disturbed or the window resizes. Layout as a physical process, not fixed coordinates.

F = anchor + repel + density pressure

Drag the attractor through them, or resize the window — the constellation scatters and re-settles like a physical object.

elements find their own positions field
Product System Interface Material Motion
anchor + mutual repulsion + density pressure → equilibrium
Gallery · capture → hold → release physical

A body takes matter in — and gives it back.

Drag the vessel through the swarm: it captures nearby particles, holds them as it fills, and releases the exact count on supernova. These are the real field:captured / field:released events the engine dispatches — counted live, off the running field.

Capture, hold, release — nothing conjured, nothing deleted. Matter just changes hands.

drag the vessel; fill it; pop it
vessel
0 captured 0 released
    Gallery · the contract, live hybrid

    data-* in, --field-* out — the actual number.

    This word is a body — data-body="attract" with data-feedback on. The engine measures the density of matter gathered on it and writes it back as --field-density, the same variable you'd style with. Drag it into the swarm and watch the value — and its weight — climb.

    --field-density is read straight off the element's computed style each frame — no tricks.

    --field-density, off the live element density
    --field-density = 0.00
    drag it through the dots — the number is the gathered density
    Gallery · Field Surfaces diagnostic

    One field, every reading.

    The same particles, the same physics — only the reading changes. The matter row is the underlay switch (field.setRender): one way of drawing the substance at a time. The readings row is the overlay (field.setOverlay): line-drawn diagnostics in front of the content — and they are additive. Stack a deformation grid over traced paths over a temperature contour and read the field three ways at once.

    Scoped to this panel: the modes play across the whole-page field while it is in view, then restore to dots / off.

    matter · field.setRender(mode) — one at a time
    readings · field.setOverlay([…]) — stack as many as you like

    dots — The default — each particle a soft dot, cool centre → warm edge → accent.

    plays across the whole page field behind the content while in view
    Gallery · Contour Charge hybrid

    Charge it with attention.

    The contour-charge recipe: the word below is a real text body — sink attract, gated on engagement — wearing its generated glyph outlines as a bound representation. Hold your pointer on it and it pulls matter in, captures it, and the contour rings thicken and glow as --load rises. Take your attention away and it discharges — the engine releases exactly the matter it held, in a burst.

    The vessel charges only while attended (data-when="active"); release fires on the falling edge of attention. Conserved end to end — the same particles return to the field.

    recipe: contour-charge · sink attract ?active

    Charge

    dwell to charge it — look away (pointer off) and it lets go
    Gallery · the force vocabulary designed

    Seven forces, side by side.

    Each frame is its own little field — a live <field-cell> rendering a single force over its own particle pool, paused when off-screen. Move your cursor through one to push the matter. This is a slice of the catalog’s 36 forces; the rest compose on the page field above. Designed verbs, each bounded and legible — an attractor is not gravity; a repeller is not charge.

    Gallery · formations designed

    The whole field can change its mind.

    A formation is a global arrangement the matter falls into — field.setFormation(name). Pick one and the entire page field re-organizes: resting drift, gravity wells, directional lanes, scattered energy, or everything gathering in.

    Active only while this panel is in view, then it restores to ambient.

    field.setFormation(name)
    the matter re-arranges across the whole page
    Gallery · data as participants semantic

    Records become bodies; relevance becomes gravity.

    These rows aren’t markup — they’re data, bound to the field with bindData(records, mapper, { recipe: "search-relevance-field" }). Each record becomes a body whose pull scales with its relevance; the field (behind the list) reads the data and the rows organize around it. Re-rank, and the bodies re-settle.

    The same call powers a real search surface — data drives the field, the field renders the data.

    Gallery · applied — navigation has gravity designed

    The active item pulls focus.

    A plain nav, but every item is a body. The current one runs hot — it gathers matter, so its --field-density stays high and it reads heaviest. Hover another and it pulls the weight over. Emphasis isn’t a class you toggle; it’s where the field is densest.

    An ordinary pattern, made reciprocal — the same trick behind priority, search, and reading surfaces.

    Now go bend it yourself.