{"version":3,"sources":["../../src/use-scroll-lock/index.ts"],"sourcesContent":["import { useCreation } from '../use-creation'\nimport { useLatest } from '../use-latest'\nimport { useMount } from '../use-mount'\nimport { useSafeState } from '../use-safe-state'\nimport { useStableFn } from '../use-stable-fn'\nimport { useTargetElement } from '../use-target-element'\nimport { useUnmount } from '../use-unmount'\n\nimport type { ReactSetState } from '../use-safe-state'\nimport type { ElementTarget } from '../use-target-element'\n\nexport type UseScrollLockReturnsActions = {\n  /**\n   * Lock the scroll\n   */\n  lock(): void\n  /**\n   * Unlock the scroll\n   */\n  unlock(): void\n  /**\n   * Toggle the scroll lock\n   */\n  toggle(): void\n}\n\nexport type UseScrollLockReturns = [\n  /**\n   * Whether the scroll is locked\n   */\n  isLocked: boolean,\n  /**\n   * Set the scroll lock\n   */\n  setLocked: ReactSetState<boolean>,\n  /**\n   * Actions to lock/unlock the scroll\n   */\n  UseScrollLockReturnsActions,\n]\n\nconst globalOverflowCache = /* #__PURE__ */ new WeakMap<Element, CSSStyleDeclaration['overflow']>()\n\n/**\n * A React Hook that helps to lock/unlock the scroll behavior of an element.\n */\nexport function useScrollLock<T extends HTMLElement = HTMLElement>(\n  target: ElementTarget<T>,\n  initialState = false,\n): UseScrollLockReturns {\n  const el = useTargetElement<T>(target)\n  const [isLocked, setLocked] = useSafeState(initialState)\n\n  const latest = useLatest({ isLocked })\n\n  useMount(() => {\n    if (!el.current) return\n    globalOverflowCache.set(el.current, el.current.style.overflow)\n    if (isLocked) el.current.style.overflow = 'hidden'\n  })\n\n  const lock = useStableFn(() => {\n    if (!el.current || latest.current.isLocked) return\n    globalOverflowCache.set(el.current, el.current.style.overflow)\n    el.current.style.overflow = 'hidden'\n    setLocked(true)\n  })\n\n  const unlock = useStableFn(() => {\n    if (!el.current || !latest.current.isLocked) return\n    el.current.style.overflow = globalOverflowCache.get(el.current) ?? ''\n    globalOverflowCache.delete(el.current)\n    setLocked(false)\n  })\n\n  const toggle = useStableFn(() => (latest.current.isLocked ? unlock() : lock()))\n  const actions = useCreation(() => ({ lock, unlock, toggle }))\n\n  useUnmount(unlock)\n\n  return [isLocked, setLocked, actions]\n}\n"],"names":["useScrollLock","globalOverflowCache","WeakMap","target","initialState","el","useTargetElement","useSafeState","isLocked","setLocked","latest","useLatest","useMount","current","set","style","overflow","lock","useStableFn","unlock","get","delete","toggle","actions","useCreation","useUnmount"],"mappings":";;;;+BA8CgBA;;;eAAAA;;;2BA9CY;yBACF;wBACD;4BACI;2BACD;gCACK;0BACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmC3B,IAAMC,sBAAsB,aAAa,GAAG,IAAIC;AAKzC,SAASF,cACdG,MAAwB;QACxBC,eAAAA,iEAAe;IAEf,IAAMC,KAAKC,IAAAA,kCAAgB,EAAIH;IAC/B,IAA8BI,iCAAAA,IAAAA,0BAAY,EAACH,mBAApCI,WAAuBD,kBAAbE,YAAaF;IAE9B,IAAMG,SAASC,IAAAA,oBAAS,EAAC;QAAEH,UAAAA;IAAS;IAEpCI,IAAAA,kBAAQ,EAAC;QACP,IAAI,CAACP,GAAGQ,OAAO,EAAE;QACjBZ,oBAAoBa,GAAG,CAACT,GAAGQ,OAAO,EAAER,GAAGQ,OAAO,CAACE,KAAK,CAACC,QAAQ;QAC7D,IAAIR,UAAUH,GAAGQ,OAAO,CAACE,KAAK,CAACC,QAAQ,GAAG;IAC5C;IAEA,IAAMC,OAAOC,IAAAA,wBAAW,EAAC;QACvB,IAAI,CAACb,GAAGQ,OAAO,IAAIH,OAAOG,OAAO,CAACL,QAAQ,EAAE;QAC5CP,oBAAoBa,GAAG,CAACT,GAAGQ,OAAO,EAAER,GAAGQ,OAAO,CAACE,KAAK,CAACC,QAAQ;QAC7DX,GAAGQ,OAAO,CAACE,KAAK,CAACC,QAAQ,GAAG;QAC5BP,UAAU;IACZ;IAEA,IAAMU,SAASD,IAAAA,wBAAW,EAAC;QACzB,IAAI,CAACb,GAAGQ,OAAO,IAAI,CAACH,OAAOG,OAAO,CAACL,QAAQ,EAAE;YACjBP;QAA5BI,GAAGQ,OAAO,CAACE,KAAK,CAACC,QAAQ,GAAGf,CAAAA,2BAAAA,oBAAoBmB,GAAG,CAACf,GAAGQ,OAAO,eAAlCZ,sCAAAA,2BAAuC;QACnEA,oBAAoBoB,MAAM,CAAChB,GAAGQ,OAAO;QACrCJ,UAAU;IACZ;IAEA,IAAMa,SAASJ,IAAAA,wBAAW,EAAC;eAAOR,OAAOG,OAAO,CAACL,QAAQ,GAAGW,WAAWF;;IACvE,IAAMM,UAAUC,IAAAA,wBAAW,EAAC;eAAO;YAAEP,MAAAA;YAAME,QAAAA;YAAQG,QAAAA;QAAO;;IAE1DG,IAAAA,sBAAU,EAACN;IAEX,OAAO;QAACX;QAAUC;QAAWc;KAAQ;AACvC"}