crucıble

Trellis

A perspective-tilted wireframe sheet running a real wave simulation: pointer movement lays a wake of circular ripples that propagate outward, visibly interfere where wakes cross, and reflect off the edges; clicks drop a heavier stone, and a soft seeded rain keeps the sheet alive when idle. Wave slope bends the graphite wires and wave height lights the crests emerald with a bright-core-plus-halo glow. CPU wave grid streamed to the GPU each frame, fixed-timestep and frame-rate independent, DPR-clamped, offscreen-paused; reduced motion renders two frozen interfering ripples.

oglpro

Installation

CLI

npx shadcn@latest add @crucible/trellis

Manual — install dependencies, then copy the source

npm install ogl

Props

PropTypeDefaultDescription
divisionsnumber24Grid lines across the sheet. Higher = finer weave. Clamped 4–80.
tiltnumber0.5Perspective lean of the sheet, 0–1. 0 lies flat facing the viewer; 1 tips hard away at the top with strong foreshortening and depth fade.
waveSpeednumber1Propagation speed of ripples across the sheet, 0.1–1.5. This is real wave speed — higher values race the wavefronts outward.
dampingnumber0.4How quickly ripples die out, 0–1. Low values let wakes cross the whole sheet and reflect off the edges; high values swallow them near the source.
idleRainnumber1Idle rain: average tiny seeded ripples per second that keep the sheet alive when nobody is interacting. 0 disables. Clamped ≤8.
colors[string, string]graphite + emerald (#34d399)[line, crest] — graphite wire color and the glow that lights the crests.
interactivebooleantruePointer wake + click stones. Waves and rain continue when false.
speednumber1Global clock multiplier for the simulation and idle breathing.
intensitynumber1Response strength, 0–2: line bend, crest brightness and bloom.
pausedbooleanFreeze the render loop, holding the current frame.
Also accepts all props of React.ComponentPropsWithoutRef<"div">they pass through to the underlying element.

Honors prefers-reduced-motion with a designed static fallback, pauses offscreen and on hidden tabs, and passes className through.