{"version":3,"file":"useModalFocus.mjs","sources":["../../../packages/modal/useModalFocus.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef } from 'react'\nimport { useInterceptFocus } from '../hooks/index.js'\nimport { FOCUSABLE_ELEMENTS } from './constants.js'\n\nexport const useModalFocus = (): RefObject<HTMLDivElement> => {\n  const modalRef = useRef<HTMLDivElement>(null)\n\n  const getFocusableNodes = useCallback(() => {\n    const nodes =\n      modalRef.current?.querySelectorAll(FOCUSABLE_ELEMENTS.join(',')) ?? []\n\n    return Array.from(nodes).filter(\n      (node): node is HTMLElement =>\n        node && node instanceof HTMLElement && node.offsetParent !== null,\n    )\n  }, [])\n\n  const handleRetainFocus = useCallback(\n    (event: KeyboardEvent) => {\n      const focusableNodes = getFocusableNodes()\n\n      if (focusableNodes.length === 0) return\n\n      const currentElement = document.activeElement\n      const focusedItemIndex =\n        currentElement instanceof HTMLElement &&\n        focusableNodes.indexOf(currentElement)\n\n      if (event.shiftKey && focusedItemIndex === 0) {\n        focusableNodes[focusableNodes.length - 1].focus()\n        event.preventDefault()\n      }\n\n      if (\n        !event.shiftKey &&\n        focusableNodes.length > 0 &&\n        focusedItemIndex === focusableNodes.length - 1\n      ) {\n        focusableNodes[0].focus()\n        event.preventDefault()\n      }\n    },\n    [getFocusableNodes],\n  )\n\n  useEffect(() => {\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (event.code === 'Tab') handleRetainFocus(event)\n    }\n\n    document.addEventListener('keydown', handleKeyDown)\n    return () => document.removeEventListener('keydown', handleKeyDown)\n  }, [handleRetainFocus])\n\n  const [interceptFocus, restoreFocus] = useInterceptFocus()\n\n  useEffect(() => {\n    if (!modalRef.current) return\n\n    interceptFocus(modalRef.current)\n    return restoreFocus\n  }, [interceptFocus, restoreFocus])\n\n  return modalRef\n}\n"],"names":["useModalFocus","modalRef","useRef","getFocusableNodes","useCallback","nodes","current","querySelectorAll","FOCUSABLE_ELEMENTS","join","Array","from","filter","node","HTMLElement","offsetParent","handleRetainFocus","event","focusableNodes","length","currentElement","document","activeElement","focusedItemIndex","indexOf","shiftKey","focus","preventDefault","useEffect","handleKeyDown","code","addEventListener","removeEventListener","interceptFocus","restoreFocus","useInterceptFocus"],"mappings":";;;;;;;;;;;;;;;AAIaA,MAAAA,aAAa,GAAGA,MAAiC;AAC5D,EAAA,MAAMC,QAAQ,GAAGC,MAAM,CAAiB,IAAI,CAAC,CAAA;AAE7C,EAAA,MAAMC,iBAAiB,GAAGC,WAAW,CAAC,MAAM;AAC1C,IAAA,MAAMC,KAAK,GACTJ,QAAQ,CAACK,OAAO,EAAEC,gBAAgB,CAACC,kBAAkB,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IAExE,OAAOC,KAAK,CAACC,IAAI,CAACN,KAAK,CAAC,CAACO,MAAM,CAC5BC,IAAI,IACHA,IAAI,IAAIA,IAAI,YAAYC,WAAW,IAAID,IAAI,CAACE,YAAY,KAAK,IACjE,CAAC,CAAA;GACF,EAAE,EAAE,CAAC,CAAA;AAEN,EAAA,MAAMC,iBAAiB,GAAGZ,WAAW,CAClCa,KAAoB,IAAK;AACxB,IAAA,MAAMC,cAAc,GAAGf,iBAAiB,EAAE,CAAA;AAE1C,IAAA,IAAIe,cAAc,CAACC,MAAM,KAAK,CAAC,EAAE,OAAA;AAEjC,IAAA,MAAMC,cAAc,GAAGC,QAAQ,CAACC,aAAa,CAAA;IAC7C,MAAMC,gBAAgB,GACpBH,cAAc,YAAYN,WAAW,IACrCI,cAAc,CAACM,OAAO,CAACJ,cAAc,CAAC,CAAA;AAExC,IAAA,IAAIH,KAAK,CAACQ,QAAQ,IAAIF,gBAAgB,KAAK,CAAC,EAAE;MAC5CL,cAAc,CAACA,cAAc,CAACC,MAAM,GAAG,CAAC,CAAC,CAACO,KAAK,EAAE,CAAA;MACjDT,KAAK,CAACU,cAAc,EAAE,CAAA;AACxB,KAAA;AAEA,IAAA,IACE,CAACV,KAAK,CAACQ,QAAQ,IACfP,cAAc,CAACC,MAAM,GAAG,CAAC,IACzBI,gBAAgB,KAAKL,cAAc,CAACC,MAAM,GAAG,CAAC,EAC9C;AACAD,MAAAA,cAAc,CAAC,CAAC,CAAC,CAACQ,KAAK,EAAE,CAAA;MACzBT,KAAK,CAACU,cAAc,EAAE,CAAA;AACxB,KAAA;AACF,GAAC,EACD,CAACxB,iBAAiB,CACpB,CAAC,CAAA;AAEDyB,EAAAA,SAAS,CAAC,MAAM;IACd,MAAMC,aAAa,GAAIZ,KAAoB,IAAK;MAC9C,IAAIA,KAAK,CAACa,IAAI,KAAK,KAAK,EAAEd,iBAAiB,CAACC,KAAK,CAAC,CAAA;KACnD,CAAA;AAEDI,IAAAA,QAAQ,CAACU,gBAAgB,CAAC,SAAS,EAAEF,aAAa,CAAC,CAAA;IACnD,OAAO,MAAMR,QAAQ,CAACW,mBAAmB,CAAC,SAAS,EAAEH,aAAa,CAAC,CAAA;AACrE,GAAC,EAAE,CAACb,iBAAiB,CAAC,CAAC,CAAA;EAEvB,MAAM,CAACiB,cAAc,EAAEC,YAAY,CAAC,GAAGC,iBAAiB,EAAE,CAAA;AAE1DP,EAAAA,SAAS,CAAC,MAAM;AACd,IAAA,IAAI,CAAC3B,QAAQ,CAACK,OAAO,EAAE,OAAA;AAEvB2B,IAAAA,cAAc,CAAChC,QAAQ,CAACK,OAAO,CAAC,CAAA;AAChC,IAAA,OAAO4B,YAAY,CAAA;AACrB,GAAC,EAAE,CAACD,cAAc,EAAEC,YAAY,CAAC,CAAC,CAAA;AAElC,EAAA,OAAOjC,QAAQ,CAAA;AACjB;;;;"}