{"version":3,"sources":["../../src/use-window-scroll/index.ts"],"sourcesContent":["import { useEventListener } from '../use-event-listener'\nimport { useLatest } from '../use-latest'\nimport { useLayoutMount } from '../use-layout-mount'\nimport { useMutationObserver } from '../use-mutation-observer'\nimport { useSetState } from '../use-set-state'\nimport { useStableFn } from '../use-stable-fn'\n\nimport type { Position } from '../utils/basic'\n\nexport interface UseWindowScrollOptions {\n  /**\n   * The scroll behavior, set to 'smooth' to enable smooth scrolling.\n   *\n   * @defaultValue 'auto'\n   */\n  behavior?: ScrollBehavior\n}\n\nexport interface UseWindowScrollReturns extends Position {\n  /**\n   * The maximum scroll position on the x-axis.\n   */\n  maxX: number\n  /**\n   * The maximum scroll position on the y-axis.\n   */\n  maxY: number\n  /**\n   * Scrolls the window to the specified position.\n   *\n   * @param newPos The new position to scroll to.\n   */\n  scrollTo(newPos: Partial<Position>): void\n  /**\n   * Scrolls the window to the top.\n   */\n  scrollToTop(): void\n  /**\n   * Scrolls the window to the bottom.\n   */\n  scrollToBottom(): void\n  /**\n   * Scrolls the window to the left.\n   */\n  scrollToLeft(): void\n  /**\n   * Scrolls the window to the right.\n   */\n  scrollToRight(): void\n}\n\n/**\n * A React Hook that helps to track and manipulate window scroll state.\n */\nexport function useWindowScroll(options: UseWindowScrollOptions = {}): UseWindowScrollReturns {\n  const { behavior = 'auto' } = options\n\n  const [state, setState] = useSetState<Position & { maxX: number; maxY: number }>(\n    { x: 0, y: 0, maxX: 0, maxY: 0 },\n    { deep: true },\n  )\n\n  const latest = useLatest({ behavior, state })\n\n  function updateState() {\n    setState(getPositionState())\n  }\n\n  useLayoutMount(updateState)\n\n  useMutationObserver(() => document.documentElement, updateState, {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    characterData: true,\n  })\n\n  useEventListener(() => window, ['scroll', 'resize'], updateState, { capture: false, passive: true })\n\n  const scrollTo = useStableFn((newPos: Partial<Position>) => {\n    const { behavior, state: position } = latest.current\n    const options = { behavior, left: newPos?.x ?? position.x, top: newPos?.y ?? position.y }\n    window.scrollTo(options)\n  })\n\n  const scrollToTop = useStableFn(() => scrollTo({ y: 0 }))\n  const scrollToBottom = useStableFn(() => scrollTo({ y: latest.current.state.maxY }))\n  const scrollToLeft = useStableFn(() => scrollTo({ x: 0 }))\n  const scrollToRight = useStableFn(() => scrollTo({ x: latest.current.state.maxX }))\n\n  return {\n    ...state,\n    scrollTo,\n    scrollToTop,\n    scrollToBottom,\n    scrollToLeft,\n    scrollToRight,\n  }\n}\n\nfunction getPositionState() {\n  return {\n    x: window.scrollX,\n    y: window.scrollY,\n    maxX: Math.max(document.documentElement.scrollWidth - window.innerWidth, 0),\n    maxY: Math.max(document.documentElement.scrollHeight - window.innerHeight, 0),\n  }\n}\n"],"names":["useWindowScroll","options","behavior","useSetState","x","y","maxX","maxY","deep","state","setState","latest","useLatest","updateState","getPositionState","useLayoutMount","useMutationObserver","document","documentElement","subtree","childList","attributes","characterData","useEventListener","window","capture","passive","scrollTo","useStableFn","newPos","current","position","left","top","scrollToTop","scrollToBottom","scrollToLeft","scrollToRight","scrollX","scrollY","Math","max","scrollWidth","innerWidth","scrollHeight","innerHeight"],"mappings":";;;;+BAsDgBA;;;eAAAA;;;gCAtDiB;yBACP;8BACK;mCACK;2BACR;2BACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDrB,SAASA;QAAgBC,UAAAA,iEAAkC,CAAC;IACjE,wBAA8BA,QAAtBC,UAAAA,0CAAW;IAEnB,IAA0BC,gCAAAA,IAAAA,wBAAW,EACnC;QAAEC,GAAG;QAAGC,GAAG;QAAGC,MAAM;QAAGC,MAAM;IAAE,GAC/B;QAAEC,MAAM;IAAK,QAFRC,QAAmBN,iBAAZO,WAAYP;IAK1B,IAAMQ,SAASC,IAAAA,oBAAS,EAAC;QAAEV,UAAAA;QAAUO,OAAAA;IAAM;IAE3C,SAASI;QACPH,SAASI;IACX;IAEAC,IAAAA,8BAAc,EAACF;IAEfG,IAAAA,wCAAmB,EAAC;eAAMC,SAASC,eAAe;OAAEL,aAAa;QAC/DM,SAAS;QACTC,WAAW;QACXC,YAAY;QACZC,eAAe;IACjB;IAEAC,IAAAA,kCAAgB,EAAC;eAAMC;OAAQ;QAAC;QAAU;KAAS,EAAEX,aAAa;QAAEY,SAAS;QAAOC,SAAS;IAAK;IAElG,IAAMC,WAAWC,IAAAA,wBAAW,EAAC,SAACC;QAC5B,IAAsClB,kBAAAA,OAAOmB,OAAO,EAA5C5B,WAA8BS,gBAA9BT,UAAUO,AAAOsB,WAAapB,gBAApBF;YACgBoB,WAA8BA;QAAhE,IAAM5B,UAAU;YAAEC,UAAAA;YAAU8B,MAAMH,CAAAA,YAAAA,mBAAAA,6BAAAA,OAAQzB,CAAC,cAATyB,uBAAAA,YAAaE,SAAS3B,CAAC;YAAE6B,KAAKJ,CAAAA,YAAAA,mBAAAA,6BAAAA,OAAQxB,CAAC,cAATwB,uBAAAA,YAAaE,SAAS1B,CAAC;QAAC;QACxFmB,OAAOG,QAAQ,CAAC1B;IAClB;IAEA,IAAMiC,cAAcN,IAAAA,wBAAW,EAAC;eAAMD,SAAS;YAAEtB,GAAG;QAAE;;IACtD,IAAM8B,iBAAiBP,IAAAA,wBAAW,EAAC;eAAMD,SAAS;YAAEtB,GAAGM,OAAOmB,OAAO,CAACrB,KAAK,CAACF,IAAI;QAAC;;IACjF,IAAM6B,eAAeR,IAAAA,wBAAW,EAAC;eAAMD,SAAS;YAAEvB,GAAG;QAAE;;IACvD,IAAMiC,gBAAgBT,IAAAA,wBAAW,EAAC;eAAMD,SAAS;YAAEvB,GAAGO,OAAOmB,OAAO,CAACrB,KAAK,CAACH,IAAI;QAAC;;IAEhF,OAAO,wCACFG;QACHkB,UAAAA;QACAO,aAAAA;QACAC,gBAAAA;QACAC,cAAAA;QACAC,eAAAA;;AAEJ;AAEA,SAASvB;IACP,OAAO;QACLV,GAAGoB,OAAOc,OAAO;QACjBjC,GAAGmB,OAAOe,OAAO;QACjBjC,MAAMkC,KAAKC,GAAG,CAACxB,SAASC,eAAe,CAACwB,WAAW,GAAGlB,OAAOmB,UAAU,EAAE;QACzEpC,MAAMiC,KAAKC,GAAG,CAACxB,SAASC,eAAe,CAAC0B,YAAY,GAAGpB,OAAOqB,WAAW,EAAE;IAC7E;AACF"}