A reactive component — no particles

The field is a behaviour layer, not a particle background. Here it runs contained inside one list and signals-only — nothing is drawn. The only thing you see is an ordinary list whose rows gain weight, lift, and glow from the field, and respond when you engage them. This is what you'd actually build.

  • Production incident — checkout 500s now · on-call
  • Design review: onboarding flow 2pm · 4 people
  • PR #318 — signals-first default review requested
  • Weekly metrics digest fyi
  • Renew TLS certificate in 9 days
  • Coffee chat with Sam sometime
A plain list — no canvas, no particles. A contained, signals-only field gives each row weight from its --field-density; hover or focus a row and the field gathers toward it.

Hover or tab through the rows. Each is a [data-body]; the contained field gathers its invisible matter toward them and writes the local density back as --d (the field-namespaced --field-density holds the same value). Important rows are visibly heavier; engaging one pulls the field toward it. There is no <canvas> on this page — the field is pure signal.

Copy it into your app

Three parts: the markup, the field, and the CSS that reads what the field writes.

<ul class="inbox" data-reactive-list>
  <li data-body="attract" data-feedback data-strength="1.0" data-range="180">Production incident</li>
  <li data-body="attract" data-feedback data-strength="0.62" data-range="180">Design review</li>
  <li data-body="attract" data-feedback data-strength="0.30" data-range="180">Weekly digest</li>
</ul>

render: 'none' is the default since #538 — a field draws nothing until you ask it to. bounds scopes the field to one element instead of the window. Together they make the field a component, not a backdrop.