KQ-1574 · BEAD/FOUNTAIN

Bead Fountain

A long ball chain coiled in a glazed pot, its tagged end over the rim: the pointer is the hand, catching the end on a 120 ms ease and then holding it 1:1, and as you pull away the chain pours out after it and lifts into an arc above the rim — the pile kicks every leaving bead upward at a share of the pay-out speed, so the faster the pull, the higher the fountain. Click, lift a finger or leave and the chain is thrown with the hand's own speed, falls and heaps on the floor bead against bead, then the pot winds it back in over the rim, slowing for the last beads so the tag comes home. Position-based physics at 120 Hz with the rim as a pulley; arrow keys carry the end and pour it, Space or Enter takes it or lets it go, Escape lets go.

KQ-1574 · BEAD/FOUNTAIN

Coldbrook Hardware

Ball chain, by the metre

Nickel-plated steel, No. 5 bead.

Arrow keys carry the end of the chain and pour it out; Space or Enter takes it or lets it go; Escape lets it go.

in the pot · move in to pull

Install

One command — the source lands in your repo. Or copy it from the Code tab.

$ pnpm dlx shadcn@latest add @kinetiq/bead-fountain

Props

beadSize
number
default 5
Each bead's diameter, px (3 to 10).
length
number
default 160
How many beads the chain has (20 to 400).
finish
"steel" | "brass" | "copper" | "black"
default "steel"
The metal: brushed steel, brass, copper or black nickel.
gravity
number
default 1
Gravity, as a share of the house pull (0.3 to 2).
lift
number
default 0.6
How hard the pile kicks each bead up as it leaves, as a share of the pull's speed: the fountain's height.
drag
number
default 0.2
Air drag on the beads, 0 (none) to 1 (thick air).
rewindSpeed
number
default 45
How fast the pot winds the chain back in, beads a second.
rewindDelay
number
default 900
How long the dropped chain lies still before the pot winds it in, ms.
potPosition
number
default 0.2
Where the pot stands, as a fraction of the box's width.
children
React.ReactNode
default —
Content beside the pot: a product line, a heading. The chain passes in front of it.
interactive
boolean
default true
The pointer and keys pull the chain.
disabled
boolean
default false
The chain rests in its pot and nothing pulls it.
paused
boolean
default false
Hold the chain where it is.
sound
boolean
default false
Ticks as beads run over the rim and as the dropped chain lands. Off unless asked for.
dpr
number
default 2
Cap on the canvas's device pixel ratio, at most 2.
label
string
default "Bead chain"
The chain's accessible name, for the keyboard's way in.
onStateChange
(state: "rest" | "pulling" | "falling" | "winding") => void
default —
The chain changed what it is doing: resting in the pot, being pulled, falling, or winding in.
onPour
(out: number) => void
default —
How many beads are out of the pot, at most ten times a second.
className
string
default "h-56 w-full"
Sizes the box.