graphics

NodeGraph

A hub-and-spoke constellation: a labeled central hub with satellite nodes that fly in from off-frame, then settle into elliptical orbits at varying radii and speeds. Connection lines hub→satellite periodically light up. All motion is a deterministic, frame-driven, seeded function (§1).

$ npx ondajs add node-graph

NodeGraph

A hub-and-spoke constellation, full-canvas. A labeled central hub rises in on the house spring, then satellites fly in from off-frame (seeded directions) and settle into elliptical orbits at varying radii and angular speeds — all a pure function of useCurrentFrame() and seed, so it renders deterministically and loops on the orbital periods (CLAUDE.md §1). Connection lines hub→satellite sit dim, then briefly light up in the accent on a deterministic, seeded-phase pulse. An optional soft Glow sits behind the hub. Looks complete with zero props (<NodeGraph />).

Props

PropTypeDefaultNotes
hubLabelstring"AI"Label inside the central hub — a character or short word.
satellites{ label, radius, speed, startAngle }[]5 sample nodesEach flies in, then orbits. radius px, speed rad/frame (signed), startAngle rad.
accentstring#D96B82Earned accent — hub tint, ring, and the lighting-up lines.
ellipsenumber0.62Vertical squash of every orbit (1 = circular).
seednumber7Drives fly-in directions and the connection-pulse phases.
delaynumber0Frames before the constellation assembles.
glowbooleantrueSoft accent glow behind the hub.
hubDiameternumber120Hub node diameter in px.
hubFontSizenumber34Hub label size in px; wins over hubSize.
hubSizesize roleSemantic role for the hub label → canvas-aware px.
backgroundstring#08080ACanvas color behind the constellation.
fontFamilystringClash DisplayFont for every label.
placementregion or {x,y,anchor}centerWhere the hub (and its orbits) is centered.

Usage

TSX
import { Sequence } from 'remotion';
import { NodeGraph } from './components/onda/node-graph/NodeGraph';

export const ConstellationScene = () => (
  <Sequence durationInFrames={240}>
    <NodeGraph
      hubLabel="AI"
      satellites={[
        { label: 'data',   radius: 260, speed: 0.010, startAngle: 0.4 },
        { label: 'model',  radius: 340, speed: -0.007, startAngle: 1.7 },
        { label: 'render', radius: 210, speed: 0.013, startAngle: 2.9 },
        { label: 'audio',  radius: 380, speed: -0.006, startAngle: 4.1 },
        { label: 'scene',  radius: 300, speed: 0.009, startAngle: 5.3 },
      ]}
    />
  </Sequence>
);