{"version":3,"file":"use-auto-scroll-on-drag.cjs","names":[],"sources":["../../src/hooks/use-auto-scroll-on-drag.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useRef } from 'react';\n\nconst EDGE_THRESHOLD = 50;\nconst MAX_SCROLL_SPEED = 8;\n\ninterface UseAutoScrollOnDragOptions {\n  viewportRef: React.RefObject<HTMLDivElement | null>;\n  enabled: boolean;\n}\n\nexport function useAutoScrollOnDrag({ viewportRef, enabled }: UseAutoScrollOnDragOptions) {\n  const rafId = useRef<number | null>(null);\n  const scrollDirection = useRef<number>(0);\n\n  const stopScroll = useEffectEvent(() => {\n    if (rafId.current !== null) {\n      cancelAnimationFrame(rafId.current);\n      rafId.current = null;\n    }\n    scrollDirection.current = 0;\n  });\n\n  const startScroll = useEffectEvent(() => {\n    if (rafId.current !== null) {\n      return;\n    }\n\n    const tick = () => {\n      const viewport = viewportRef.current;\n      if (!viewport || scrollDirection.current === 0) {\n        rafId.current = null;\n        return;\n      }\n\n      viewport.scrollTop += scrollDirection.current;\n      rafId.current = requestAnimationFrame(tick);\n    };\n\n    rafId.current = requestAnimationFrame(tick);\n  });\n\n  useEffect(() => {\n    if (!enabled) {\n      return undefined;\n    }\n\n    const viewport = viewportRef.current;\n    if (!viewport) {\n      return undefined;\n    }\n\n    const handleDragOver = (event: DragEvent) => {\n      const rect = viewport.getBoundingClientRect();\n      const distanceFromTop = event.clientY - rect.top;\n      const distanceFromBottom = rect.bottom - event.clientY;\n\n      if (distanceFromTop < EDGE_THRESHOLD) {\n        const proximity = 1 - distanceFromTop / EDGE_THRESHOLD;\n        scrollDirection.current = -Math.ceil(proximity * MAX_SCROLL_SPEED);\n        startScroll();\n      } else if (distanceFromBottom < EDGE_THRESHOLD) {\n        const proximity = 1 - distanceFromBottom / EDGE_THRESHOLD;\n        scrollDirection.current = Math.ceil(proximity * MAX_SCROLL_SPEED);\n        startScroll();\n      } else {\n        stopScroll();\n      }\n    };\n\n    const handleDragEnd = () => {\n      stopScroll();\n    };\n\n    viewport.addEventListener('dragover', handleDragOver);\n    viewport.addEventListener('dragleave', handleDragEnd);\n    viewport.addEventListener('dragend', handleDragEnd);\n    viewport.addEventListener('drop', handleDragEnd);\n\n    return () => {\n      stopScroll();\n      viewport.removeEventListener('dragover', handleDragOver);\n      viewport.removeEventListener('dragleave', handleDragEnd);\n      viewport.removeEventListener('dragend', handleDragEnd);\n      viewport.removeEventListener('drop', handleDragEnd);\n    };\n  }, [enabled, viewportRef]);\n}\n"],"mappings":";;;AAEA,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;AAOzB,SAAgB,oBAAoB,EAAE,aAAa,WAAuC;CACxF,MAAM,SAAA,GAAA,MAAA,OAAA,CAA8B,IAAI;CACxC,MAAM,mBAAA,GAAA,MAAA,OAAA,CAAiC,CAAC;CAExC,MAAM,cAAA,GAAA,MAAA,eAAA,OAAkC;EACtC,IAAI,MAAM,YAAY,MAAM;GAC1B,qBAAqB,MAAM,OAAO;GAClC,MAAM,UAAU;EAClB;EACA,gBAAgB,UAAU;CAC5B,CAAC;CAED,MAAM,eAAA,GAAA,MAAA,eAAA,OAAmC;EACvC,IAAI,MAAM,YAAY,MACpB;EAGF,MAAM,aAAa;GACjB,MAAM,WAAW,YAAY;GAC7B,IAAI,CAAC,YAAY,gBAAgB,YAAY,GAAG;IAC9C,MAAM,UAAU;IAChB;GACF;GAEA,SAAS,aAAa,gBAAgB;GACtC,MAAM,UAAU,sBAAsB,IAAI;EAC5C;EAEA,MAAM,UAAU,sBAAsB,IAAI;CAC5C,CAAC;CAED,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,CAAC,SACH;EAGF,MAAM,WAAW,YAAY;EAC7B,IAAI,CAAC,UACH;EAGF,MAAM,kBAAkB,UAAqB;GAC3C,MAAM,OAAO,SAAS,sBAAsB;GAC5C,MAAM,kBAAkB,MAAM,UAAU,KAAK;GAC7C,MAAM,qBAAqB,KAAK,SAAS,MAAM;GAE/C,IAAI,kBAAkB,gBAAgB;IACpC,MAAM,YAAY,IAAI,kBAAkB;IACxC,gBAAgB,UAAU,CAAC,KAAK,KAAK,YAAY,gBAAgB;IACjE,YAAY;GACd,OAAO,IAAI,qBAAqB,gBAAgB;IAC9C,MAAM,YAAY,IAAI,qBAAqB;IAC3C,gBAAgB,UAAU,KAAK,KAAK,YAAY,gBAAgB;IAChE,YAAY;GACd,OACE,WAAW;EAEf;EAEA,MAAM,sBAAsB;GAC1B,WAAW;EACb;EAEA,SAAS,iBAAiB,YAAY,cAAc;EACpD,SAAS,iBAAiB,aAAa,aAAa;EACpD,SAAS,iBAAiB,WAAW,aAAa;EAClD,SAAS,iBAAiB,QAAQ,aAAa;EAE/C,aAAa;GACX,WAAW;GACX,SAAS,oBAAoB,YAAY,cAAc;GACvD,SAAS,oBAAoB,aAAa,aAAa;GACvD,SAAS,oBAAoB,WAAW,aAAa;GACrD,SAAS,oBAAoB,QAAQ,aAAa;EACpD;CACF,GAAG,CAAC,SAAS,WAAW,CAAC;AAC3B"}