- readsOpenAlex citation counts per paper
- becomeslog-normalized trust → each paper's mass
- writes
--w--d--field-attention - you seeheavier-cited work sits heavier in the type — weight, ink, and an anchor that deepens with consensus
No canvas is drawn here — the field is invisible; these variables are its only output. Without it you would build: a relevance score column and a sort you re-run.
field-ui · invisible fields · evidence
Trust you can feel, not read.
Research is typically served as a sorted column. Citation count compresses three things into one number — how much the field has engaged a work, whether it still holds, how many others build on it — then sorts descending. The top row wins. That's a ranking, not trust.
This is the same data from OpenAlex run as a field. Each paper is a body; its citation weight becomes gravitational mass — heavier works pull without asserting a verdict. Cross-citations thread each work to what it builds on. The field is invisible — no particle swarm, no overlay — only its effect shows in the type: weight, ink, and a left anchor that intensifies with consensus. Toggle it off and the data collapses to a plain list — the live glow goes dark with it. Change the weighting and watch the field re-settle.
size = citations — how much the field leans on each work · color = research subfield — the discipline each work binds to · hold a finding — the field gathers
- Aa size = the weighting signal
- color = the lens (a second dimension)
- shape = study type (● primary · ◆ review)
- hover → threads to the work it builds on
- glow = the engine's live density (
--d) — hold a finding and the field gathers
14 works address "does exercise improve mental health". With the field on, the heaviest are near-consensus and the faint ones are still finding their footing; hover one to light the work it builds on. Change the weighting and watch them re-settle.
- 01 13,672 citations
- 02 10,851 citations
- 03 6,046 citations
- 04 4,973 citations
- 05 3,407 citations
- 06 3,093 citations
- 07 2,787 citations
- 08 2,488 citations
- 09 2,389 citations
- 10 2,198 citations
- 11 2,012 citations
- 12 1,983 citations
- 13 1,829 citations
- 14 1,441 citations
14 works address "do violent video games increase aggression". With the field on, the heaviest are near-consensus and the faint ones are still finding their footing; hover one to light the work it builds on. Change the weighting and watch them re-settle.
- 01 631 citations
- 02 614 citations
- 03 569 citations
- 04 523 citations
- 05 366 citations
- 06 363 citations
- 07 293 citations
- 08 273 citations
- 09 252 citations
- 10 244 citations
- 11 236 citations
- 12 77 citations
- 13 70 citations
- 14 57 citations
How it's built
Every finding is ordinary semantic HTML — a <li> with a few data
attributes. field-ui reads them, runs a spatial field over the list, and writes measured
state back as CSS custom properties each frame. No canvas. No particle swarm. No JS event
listeners on individual elements. Four channels do the work: --w is the
server-computed weight, --cat the lens color, --d the engine's
live local density (hold a finding and the field gathers), and
--field-attention the recipe's eased attention metric.
1 — mark each finding as a field body
<li id="finding-W2042"
data-body="attract"
data-strength="0.87"
data-field-color="#4da3ff"
data-feedback
data-hot
style="--trust: 0.87; --cat: #4da3ff;"
>
<!-- a citation edge as a REAL platform
relationship: the registry discovers it,
and --field-coherence reads how much of
this finding's graph resolves on-page -->
<span hidden
data-field-relation="supports"
data-field-target="#finding-W1480"></span>
<!-- your ordinary HTML here -->
<span class="ev-bar" aria-hidden="true"
data-field-visual-for="#finding-W2042"
data-field-visual-role="measurement"></span>
</li> data-body="attract"— registers as a field participantdata-strength— gravitational mass (0 → faint, 2 → heavy anchor)data-field-color— accent hue for the color lensdata-feedback— opt in to receive--field-*writebacksdata-hot— the engine's live density (--d) gathers toward 1 while helddata-field-visual-for— declares the bar as this record's measurement (inspectable, lintable)
2 — CSS reads the field's output
.ev-finding {
/* --trust is server-set (0..1 log-normalized
citation score). CSS reads it directly. */
--w: var(--trust, 0.5);
/* --d is LIVE — the engine's local particle
density, written back every frame. data-hot
makes it gather toward 1 while you hold. */
--live: var(--d, 0);
opacity: calc(0.58 + var(--w) * 0.42);
border-left: 3px solid
color-mix(in srgb,
var(--cat) calc(18% + var(--w) * 82%),
var(--line));
box-shadow: 0 0 calc(var(--live) * 16px) -6px
color-mix(in srgb,
var(--cat) calc(var(--live) * 55%),
transparent);
}
.ev-title {
font-variation-settings:
'wght' calc(380 + var(--w) * 360);
} Weight, ink, font heft, and border intensity all read from one
normalized trust score; the halo reads the engine's live --d — the field
drives the measurement; CSS drives the presentation.
3 — the snapshot upgrades itself
// trust itself updates: ONCE per visit
// (~4s in), one batched request per topic
// asks OpenAlex for current counts —
fetch('https://api.openalex.org/works'
+ '?filter=ids.openalex:W301…|W204…'
+ '&select=id,cited_by_count');
// each finding updates IN PLACE
// (data-cites + the figure + a quiet
// "+N since snapshot" when it moved),
// then the SAME reweight path re-runs:
// --trust, data-strength, the bar,
// the FLIP re-sort — trust re-settles
// in front of you. Once, not a poll:
// citations move slowly; polling
// would be theater. The refresh covers every work on the page, deferred ones included — findings the accretion reveal surfaces later already carry refreshed counts, because each reveal folds in through the same reweight. Works the API doesn't return keep their snapshot values; the delta note only appears where a count actually moved.