{"version":3,"sources":["../../src/use-click-outside/index.ts"],"sourcesContent":["import { useEventListener } from '../use-event-listener'\nimport { useLatest } from '../use-latest'\nimport { useStableFn } from '../use-stable-fn'\nimport { normalizeElement, useTargetElement } from '../use-target-element'\nimport { isString, noNullish } from '../utils/basic'\n\nimport type { ElementTarget } from '../use-target-element'\n\nexport interface UseClickOutsideOptions {\n  /**\n   * List of elements that should not trigger the event.\n   */\n  ignore?: ElementTarget[]\n}\n\nexport type UseClickOutsideHandler = (evt: MouseEvent | PointerEvent) => void\n\n/**\n * A React Hook that allows you to detect clicks outside of a specified element.\n */\nexport function useClickOutside(\n  target: ElementTarget,\n  handler: UseClickOutsideHandler,\n  options: UseClickOutsideOptions = {},\n): void {\n  const { ignore = [] } = options\n  const el = useTargetElement(target)\n  const latest = useLatest({ ignore, handler })\n\n  const shouldIgnore = useStableFn((evt: MouseEvent | PointerEvent) => {\n    const elements = latest.current.ignore\n      .flatMap((el) => (isString(el) ? Array.from(document.querySelectorAll(el)) : el))\n      .map(normalizeElement)\n      .filter(noNullish)\n      .filter(Boolean)\n\n    return elements.some((el) => evt.target === el || evt.composedPath().includes(el))\n  })\n\n  const listener = useStableFn((evt: MouseEvent | PointerEvent) => {\n    const isNoElement = !el.current\n    const isInPath = el.current && (evt.target === el.current || evt.composedPath().includes(el.current))\n    const isIgnored = shouldIgnore(evt)\n\n    if (isNoElement || isInPath || isIgnored) return\n\n    latest.current.handler(evt)\n  })\n\n  useEventListener(() => window, 'click', listener, { passive: true, capture: true })\n}\n"],"names":["useClickOutside","target","handler","options","ignore","el","useTargetElement","latest","useLatest","shouldIgnore","useStableFn","evt","elements","current","flatMap","isString","Array","from","document","querySelectorAll","map","normalizeElement","filter","noNullish","Boolean","some","composedPath","includes","listener","isNoElement","isInPath","isIgnored","useEventListener","window","passive","capture"],"mappings":";;;;+BAoBgBA;;;eAAAA;;;gCApBiB;yBACP;2BACE;gCACuB;qBACf;AAgB7B,SAASA,gBACdC,MAAqB,EACrBC,OAA+B;QAC/BC,UAAAA,iEAAkC,CAAC;IAEnC,sBAAwBA,QAAhBC,QAAAA,sCAAS,EAAE;IACnB,IAAMC,KAAKC,IAAAA,kCAAgB,EAACL;IAC5B,IAAMM,SAASC,IAAAA,oBAAS,EAAC;QAAEJ,QAAAA;QAAQF,SAAAA;IAAQ;IAE3C,IAAMO,eAAeC,IAAAA,wBAAW,EAAC,SAACC;QAChC,IAAMC,WAAWL,OAAOM,OAAO,CAACT,MAAM,CACnCU,OAAO,CAAC,SAACT;mBAAQU,IAAAA,eAAQ,EAACV,MAAMW,MAAMC,IAAI,CAACC,SAASC,gBAAgB,CAACd,OAAOA;WAC5Ee,GAAG,CAACC,kCAAgB,EACpBC,MAAM,CAACC,gBAAS,EAChBD,MAAM,CAACE;QAEV,OAAOZ,SAASa,IAAI,CAAC,SAACpB;mBAAOM,IAAIV,MAAM,KAAKI,MAAMM,IAAIe,YAAY,GAAGC,QAAQ,CAACtB;;IAChF;IAEA,IAAMuB,WAAWlB,IAAAA,wBAAW,EAAC,SAACC;QAC5B,IAAMkB,cAAc,CAACxB,GAAGQ,OAAO;QAC/B,IAAMiB,WAAWzB,GAAGQ,OAAO,IAAKF,CAAAA,IAAIV,MAAM,KAAKI,GAAGQ,OAAO,IAAIF,IAAIe,YAAY,GAAGC,QAAQ,CAACtB,GAAGQ,OAAO,CAAA;QACnG,IAAMkB,YAAYtB,aAAaE;QAE/B,IAAIkB,eAAeC,YAAYC,WAAW;QAE1CxB,OAAOM,OAAO,CAACX,OAAO,CAACS;IACzB;IAEAqB,IAAAA,kCAAgB,EAAC;eAAMC;OAAQ,SAASL,UAAU;QAAEM,SAAS;QAAMC,SAAS;IAAK;AACnF"}