OptionalboundaryBoundary policy when the clamped position hits an edge. 'stop' cancels the decay (instant settle at the edge). 'continue' keeps decaying but subsequent ticks stay clamped (object drifts along the edge as friction decays the velocity). Default 'stop'.
OptionalboundsOptional bounds for the object's top-left corner (in world units). When
supplied, momentum-driven translation is clamped: each tick's new
position is constrained so the object's (x, y) stays inside the rect.
Without bounds, a hard flick carries the object indefinitely until
friction dampens velocity below threshold.
Note: ignores object size for now — the bound is on the top-left, not
the visible edges. A consumer wanting "object stays fully inside" should
pass bounds = { x: canvas.x, y: canvas.y, width: canvas.w - obj.w, height: canvas.h - obj.h } (and accept that it doesn't adapt to
variable-sized objects mid-flight).
OptionalfrictionOptionalnowOptional clock override for tests. Defaults to Date.now.
OptionalthresholdOptionalvelocitySample window in ms for velocity computation. Default 80ms.
Required: the per-Canvas animator that will own the decay.