Labs

Components

Interactions

Ripple Grid

A lattice of nodes lit by propagating wavefronts. Fires automatically every 2.5 s. Click anywhere on the grid to spawn your own.

All components
Tap to ripple

Installation

Coming soon. Components will be available via the registry once checkout goes live.

Usage

<RippleGrid
  columns={8}
  rows={5}
  nodeSize={1.2}
  autoInterval={2200}
  onRipple={({ source }) => {
    if (source === "user") {
      navigator.vibrate?.(8);
      analytics.track("ripple_grid_tap");
    }
  }}
/>

Props

PropTypeDefaultDescription
columnsnumber6Number of columns in the grid.
rowsnumber4Number of rows in the grid.
nodeSizenumber1Multiplier for the node (circle) radius. `0.5` halves them, `2` doubles them.
autoPlaybooleantrueAuto-fire ripples on an interval. Drives the initial play / pause state.
autoIntervalnumber2600Interval between auto-fired ripples, in ms.
rippleDurationnumber2400Lifetime of a single ripple, in ms. Higher = slower wave.
tapToRipplebooleantrueAllow click / tap on the grid to spawn a ripple.
showControlsbooleantrueShow the play / pause control in the corner.
hintstring | nullOverride the small hint label below the grid. Pass `null` to hide.
onRipple(o: { x: number; y: number; source: "auto" | "user" }) => voidFired whenever a ripple is spawned. Use to trigger sound, haptics, or analytics.
classNamestringClasses merged onto the root wrapper.

Use cases

  • Empty-state canvas

    Reward exploration on otherwise-quiet states (no notifications, search empty, etc.).

  • Sign-in / hero background

    Subtle ambient motion behind a centered card without competing for attention.

  • 404 / not-found page

    Make a dead end feel intentional and clickable.

  • Status / health page

    Quiet ambient grid behind uptime tiles that doesn't pull focus from the data.