{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "use-orbit-drag",
  "title": "useOrbitDrag",
  "description": "Rotates on horizontal drag and leaves vertical page scroll working.",
  "files": [
    {
      "path": "registry/spotcheck/hooks/use-orbit-drag.ts",
      "content": "\"use client\"\n\nimport * as React from \"react\"\n\nconst RADIANS_PER_PIXEL = 0.008\n\ntype OrbitDragOptions = {\n  /** The starting angle in radians. */\n  angle?: number\n  /** Radians turned per pixel dragged. */\n  speed?: number\n  /** Runs on every change, so a scene that renders on demand can draw the new angle. */\n  onChange?: (angle: number) => void\n}\n\n/** Turns horizontal drags into an angle. Vertical swipes stay with the page, through `pan-y`. */\nexport function useOrbitDrag({ angle = 0, speed = RADIANS_PER_PIXEL, onChange }: OrbitDragOptions = {}) {\n  const rotation = React.useRef(angle)\n  const dragging = React.useRef(false)\n  const lastX = React.useRef(0)\n\n  const release = React.useCallback(() => {\n    dragging.current = false\n  }, [])\n\n  const bind = React.useMemo(\n    () => ({\n      style: { touchAction: \"pan-y\" },\n      onPointerDown: (event: React.PointerEvent<HTMLElement>) => {\n        if (event.button !== 0) return\n        event.currentTarget.setPointerCapture(event.pointerId)\n        dragging.current = true\n        lastX.current = event.clientX\n      },\n      onPointerMove: (event: React.PointerEvent<HTMLElement>) => {\n        if (!dragging.current) return\n        rotation.current += (event.clientX - lastX.current) * speed\n        lastX.current = event.clientX\n        onChange?.(rotation.current)\n      },\n      onPointerUp: release,\n      onPointerCancel: release,\n    }),\n    [onChange, release, speed],\n  )\n\n  return { rotation, dragging, bind }\n}\n",
      "type": "registry:hook"
    }
  ],
  "type": "registry:hook"
}