KQ-574 · GRAB/PAN

Grab Pan

A board you grab and throw. The drag is one-to-one with the pointer and follows at a third of the travel past an edge, so the end of the board is felt rather than announced; release hands the offset to a requestAnimationFrame loop that decays the release velocity against elapsed time, and the moment it touches a bound it hands over to glide for the last pixels back. Pointer capture waits for 4px so a click on the board is never swallowed, and every gesture has a keyboard equal: the viewport is focusable, arrows pan a fifth of the view on glide, and Home re-centres.

KQ-574 · GRAB/PAN
Intake
Bench 1
Bench 2
Cold store
Sweep bay
Crate line
Dock 3
Office
Yard gate
Plant

Drag to pan, or use the arrow keys.

Offset 0 / 0

Install

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

$ pnpm dlx shadcn@latest add @kinetiq/grab-pan

Props

width / height
number
default
Board size in px.
children
React.ReactNode
default
What sits on the board.
minimap
boolean
default true
Show the minimap.
viewportHeight
number
default 280
Height of the viewport the board is seen through, px.
onOffsetChange
(offset: { x: number; y: number }) => void
default
Fires with the whole-pixel offset whenever it changes.
label
string
default Board
Names the pannable region.
resetLabel
string
default Reset
Label of the re-centre control.