1. readsnpm weekly downloads + OSV advisories
  2. becomesdownloads → mass; an advisory → charge
  3. writes--w--cat
  4. you seecore dependencies read heavy; one advisory turns its line red and the graph feels it

No canvas is drawn here — the field is invisible; these variables are its only output. Without it you would build: a dashboard query and alert rules.

field-ui · invisible fields · dependencies

Mass you inherit. Risk that travels.

@fundamental-engine/core has zero runtime dependencies — by design. The engine you ship pulls in nothing. What's below is the build-time surface of this monorepo's real package.json files — and even that carries inherited mass: every package arrives with the weight of an ecosystem already moving through it, measured here as weekly downloads.

Risk travels the same edges. An advisory against one external package spills downstream into every workspace package that inherits it — hover a dependency and threads run to the packages it touches; hover a workspace package and its full upstream chain lights. Toggle the field off and the same data collapses to a flat manifest.

Field
Weight by
Data snapshot · 2026-06-10

size = weekly downloads — the mass the ecosystem already moves through each package · color = advisory state — red carries OSV records, blue is clean

The workspace core → site

  1. core 0 internal deps
  2. platform 1 internal dep
  3. vanilla 2 internal deps
  4. elements 3 internal deps
  5. react 2 internal deps
  6. site 3 internal deps

The build-time surface 9 external packages

  1. typescript v6.0.3

    TypeScript is a language for application scale JavaScript development

    published 54d ago coreplatformelementsvanillareact
    205.8M weekly downloads
  2. react v19.2.7 2 advisories

    React is a JavaScript library for building user interfaces.

    published 8d ago react
    134.4M weekly downloads
  3. @types/react v19.2.17

    TypeScript definitions for react

    published 4d ago react
    121.1M weekly downloads
  4. katex v0.17.0 5 advisories

    Fast math typesetting for the web.

    published 19d ago site
    14M weekly downloads
  5. mermaid v11.15.0 11 advisories

    Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and

    published 30d ago site
    8.5M weekly downloads
  6. remark-math v6.0.0

    remark plugin to parse and stringify math

    published 33mo ago site
    5.1M weekly downloads
  7. rehype-katex v7.0.1

    rehype plugin to transform inline and block math with KaTeX

    published 22mo ago site
    4.9M weekly downloads
  8. astro v6.4.5 17 advisories

    Astro is a modern site builder with web best practices, performance, and DX front-of-mind.

    published today site
    3.1M weekly downloads
  9. @astrojs/sitemap v3.7.3

    Generate a sitemap for your Astro site

    published 15d ago site
    1.5M weekly downloads

How it's built

The graph is the monorepo's own package.json files, flattened into markup: each workspace package carries its transitive upstream chain, each external dependency carries the packages that inherit it. field-ui runs an invisible field over both zones and the type carries the measurement — downloads as weight, advisories as charge. Two live channels ride on top: the page's hidden engine writes --d (local particle density) to every data-hot row and node each frame, and the scoped recipe's attention lane writes an eased --field-attention — CSS turns both into a felt glow and lift, and both go quiet when the field is off.

1 — the graph lives in data attributes

HTML
<!-- a workspace package: its full
     upstream chain, precomputed -->
<li id="ws-site" data-hot
  data-chain="ws-elements ws-core
    ws-platform ws-vanilla">

<!-- an external dep: the workspace
     packages that inherit it. The
     downloads figure declares its
     provenance as a measurement. -->
<li id="dep-mermaid"
  data-body="attract"
  data-strength="0.72"
  data-feedback data-hot
  data-uses="ws-site"
  style="--w: 0.20; --cat: #ff6b6b;">
  ...
  <span data-field-visual-for="#dep-mermaid"
        data-field-visual-role="measurement">
    <b>2.1M</b> <!-- weekly downloads -->
  </span>
</li>
  • data-uses — where this mass lands downstream
  • data-chain — everything a package stands on, transitively
  • --cat — red when OSV records exist, blue when clean
  • data-hot — opts into the live density gather: hover and --d climbs toward 1
  • data-field-visual-for — names the downloads figure a measurement of its row

2 — causality spill is hover + geometry

TypeScript
// hover a dep → thread to each
// workspace card it touches
const a = centerIn(row, zone);
for (const id of row.dataset.uses.split(" ")) {
  const node = zone.querySelector("#" + id);
  node.classList.add("cited");
  const b = centerIn(node, zone);
  d += `M${a.x} ${a.y} C ...`;
}
// the thread color is the row's --cat:
// advisory-carrying deps thread red.

// hover a workspace node → no SVG,
// just light its data-chain upstream —
// while the engine's --d gathers under
// the cursor (data-hot), so the glow
// and the chain light together.

One SVG overlay spans both zones; the cubic threads are drawn at hover time from live geometry, so reweighting never leaves stale lines.

3 — CSS reads mass, decay, and the live channels

CSS
.dp-name {
  font-variation-settings:
    'wght' calc(380 + var(--w) * 360);
}
.dp-row {
  /* --d: live local density, written by the
     hidden engine each frame; gathers on
     data-hot hover. --field-attention: the
     recipe's eased attention lane. */
  --live: var(--d, 0);
  box-shadow: 0 0 calc(var(--live) * 16px) -6px
    color-mix(in srgb, var(--cat)
      calc(var(--live) * 55%), transparent);
  opacity: calc(0.58 + var(--w) * 0.42);
}
/* an advisory badge runs hotter as the
   field gathers on its row */
.dp-adv {
  box-shadow: 0 0 calc(var(--live) * 10px)
    color-mix(in srgb, #ff6b6b
      calc(var(--live) * 45%), transparent);
}
/* decay: no publish in 90 days */
.dp-row.stale { opacity: 0.5; }

The freshness lens reweights from publish dates; packages whose dates the registry snapshot didn't report hold a neutral weight rather than faking one. The glow reads --d and --field-attention — live writes, zeroed when the field is off.

The download counts also refresh once per visit: ~4s in, the page fetches each package's last-week figure from api.npmjs.org (partial success is fine — rows the API misses keep their snapshot values), then the existing reweight path re-normalizes --w against the fresh max and FLIP re-sorts through the active lens. Once, deliberately — the figure is a weekly aggregate, and polling a number that changes weekly would be theater.