{"version":3,"file":"useScrollDirection.cjs","names":["useState","isServer","useRef","useCallback"],"sources":["../../../src/hooks/useScrollDirection/useScrollDirection.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { isServer } from '../../utils/isServer/index.ts';\n\ntype ScrollDirection = 'up' | 'down' | null;\n\ntype ScrollDirectionState = {\n  /** Current scroll direction */\n  direction: ScrollDirection;\n  /** Current scroll Y position (px) */\n  position: number;\n};\n\ntype UseScrollDirectionOptions = {\n  /** Throttle interval (ms) - default: 50ms */\n  throttleMs?: number;\n};\n\n/**\n * @description\n * `useScrollDirection` is a React hook that detects scroll direction.\n * It returns scroll direction (up/down) and current scroll position.\n * Throttled by default (50ms) for performance.\n *\n * @param {UseScrollDirectionOptions} [options] - Configuration options.\n * @param {number} [options.throttleMs=50] - Throttle interval in milliseconds.\n * @returns {ScrollDirectionState} Scroll direction state: `direction` (`'up' | 'down' | null`) and `position` (px).\n *\n * @example\n * function Header() {\n *   const { direction, position } = useScrollDirection();\n *\n *   // Hide header on scroll down\n *   const isHidden = direction === 'down' && position > 100;\n *\n *   return (\n *     <header className={isHidden ? 'hidden' : 'visible'}>\n *       My Header\n *     </header>\n *   );\n * }\n */\nexport function useScrollDirection(options: UseScrollDirectionOptions = {}): ScrollDirectionState {\n  const { throttleMs = 50 } = options;\n\n  const [scrollInfo, setScrollInfo] = useState<ScrollDirectionState>({\n    direction: null,\n    position: isServer() ? 0 : window.scrollY,\n  });\n\n  const lastScrollYRef = useRef(isServer() ? 0 : window.scrollY);\n  const throttleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  const updateScrollDirection = useCallback(\n    ({ currentScrollY, lastScrollY }: { currentScrollY: number; lastScrollY: number }) => {\n      if (currentScrollY > lastScrollY) {\n        setScrollInfo({ direction: 'down', position: currentScrollY });\n        return;\n      }\n\n      if (currentScrollY < lastScrollY) {\n        setScrollInfo({ direction: 'up', position: currentScrollY });\n        return;\n      }\n    },\n    []\n  );\n\n  const startThrottle = useCallback(() => {\n    throttleTimerRef.current = setTimeout(function clearThrottle() {\n      throttleTimerRef.current = null;\n    }, throttleMs);\n  }, [throttleMs]);\n\n  useEffect(\n    function handleScrollDirectionChange() {\n      function handleScroll() {\n        if (throttleTimerRef.current != null) {\n          return;\n        }\n\n        const currentScrollY = window.scrollY;\n        const lastScrollY = lastScrollYRef.current;\n\n        lastScrollYRef.current = currentScrollY;\n        startThrottle();\n        updateScrollDirection({ currentScrollY, lastScrollY });\n      }\n\n      window.addEventListener('scroll', handleScroll, { passive: true });\n\n      return function cleanup() {\n        window.removeEventListener('scroll', handleScroll);\n        if (throttleTimerRef.current != null) {\n          clearTimeout(throttleTimerRef.current);\n        }\n      };\n    },\n    [startThrottle, updateScrollDirection]\n  );\n\n  return scrollInfo;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,mBAAmB,UAAqC,CAAC,GAAyB;CAChG,MAAM,EAAE,aAAa,OAAO;CAE5B,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAA+B;EACjE,WAAW;EACX,UAAUC,iBAAAA,SAAS,IAAI,IAAI,OAAO;CACpC,CAAC;CAED,MAAM,kBAAA,GAAiBC,MAAAA,OAAAA,CAAOD,iBAAAA,SAAS,IAAI,IAAI,OAAO,OAAO;CAC7D,MAAM,oBAAA,GAAmBC,MAAAA,OAAAA,CAA6C,IAAI;CAE1E,MAAM,yBAAA,GAAwBC,MAAAA,YAAAA,EAC3B,EAAE,gBAAgB,kBAAmE;EACpF,IAAI,iBAAiB,aAAa;GAChC,cAAc;IAAE,WAAW;IAAQ,UAAU;GAAe,CAAC;GAC7D;EACF;EAEA,IAAI,iBAAiB,aAAa;GAChC,cAAc;IAAE,WAAW;IAAM,UAAU;GAAe,CAAC;GAC3D;EACF;CACF,GACA,CAAC,CACH;CAEA,MAAM,iBAAA,GAAgBA,MAAAA,YAAAA,OAAkB;EACtC,iBAAiB,UAAU,WAAW,SAAS,gBAAgB;GAC7D,iBAAiB,UAAU;EAC7B,GAAG,UAAU;CACf,GAAG,CAAC,UAAU,CAAC;CAEf,CAAA,GAAA,MAAA,UAAA,CACE,SAAS,8BAA8B;EACrC,SAAS,eAAe;GACtB,IAAI,iBAAiB,WAAW,MAC9B;GAGF,MAAM,iBAAiB,OAAO;GAC9B,MAAM,cAAc,eAAe;GAEnC,eAAe,UAAU;GACzB,cAAc;GACd,sBAAsB;IAAE;IAAgB;GAAY,CAAC;EACvD;EAEA,OAAO,iBAAiB,UAAU,cAAc,EAAE,SAAS,KAAK,CAAC;EAEjE,OAAO,SAAS,UAAU;GACxB,OAAO,oBAAoB,UAAU,YAAY;GACjD,IAAI,iBAAiB,WAAW,MAC9B,aAAa,iBAAiB,OAAO;EAEzC;CACF,GACA,CAAC,eAAe,qBAAqB,CACvC;CAEA,OAAO;AACT"}