{"version":3,"file":"focusTrap-DElQPIrA.js","sources":["../../../../Coloplast.UI/src/shared/composables/focusTrap.ts"],"sourcesContent":["import { onBeforeUnmount } from 'vue';\r\n\r\ntype EmitCallback = (event: string) => void;\r\n\r\nlet trigger: HTMLElement | null;\r\n\r\nexport default function useModalFocusTrap(\r\n\tmodalRoot: HTMLElement,\r\n\temit: EmitCallback,\r\n\tcloseEvent: string,\r\n\tcloseOnEscape: boolean\r\n) {\r\n\tif (!modalRoot) {\r\n\t\tconsole.error('This component needs a root element. Make sure the component is mounted before initializing this composable.');\r\n\t\treturn {\r\n\t\t\trestoreFocus: () => {},\r\n\t\t\tupdateTrigger: () => {},\r\n\t\t\tfocus: () => {},\r\n\t\t};\r\n\t}\r\n\r\n\ttrigger = document.activeElement as HTMLElement;\r\n\r\n\tlet focusableElements: NodeListOf;\r\n\tlet firstFocusableElement: HTMLElement;\r\n\tlet lastFocusableElement: HTMLElement;\r\n\r\n\tfocusableElements = modalRoot.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])');\r\n\tfirstFocusableElement = focusableElements[0];\r\n\tlastFocusableElement = focusableElements[focusableElements.length - 1];\r\n\r\n\tif (firstFocusableElement) {\r\n\t\tfirstFocusableElement.focus();\r\n\t}\r\n\tlet observer = new MutationObserver(() => {\r\n\t\tfocusableElements = modalRoot.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])');\r\n\t\tfirstFocusableElement = focusableElements[0];\r\n\t\tlastFocusableElement = focusableElements[focusableElements.length - 1];\r\n\t\tif (document.activeElement && !modalRoot.contains(document.activeElement) && focusableElements.length > 0) {\r\n\t\t\tfocusableElements[0].focus();\r\n\t\t}\r\n\t});\r\n\r\n\tobserver.observe(modalRoot, {\r\n\t\tsubtree: true,\r\n\t\tchildList: true,\r\n\t});\r\n\r\n\tconst focus = () => {\r\n\t\tif (firstFocusableElement) {\r\n\t\t\tfirstFocusableElement.focus();\r\n\t\t}\r\n\t}\r\n\r\n\tconst restoreFocus = () => {\r\n\t\ttrigger?.focus();\r\n\t}\r\n\r\n\tconst updateTrigger = (newTrigger: HTMLElement | null) => {\r\n\t\ttrigger = newTrigger;\r\n\t}\r\n\r\n\tconst closeModal = () => {\r\n\t\trestoreFocus();\r\n\t\temit(closeEvent);\r\n\t\tobserver.disconnect();\r\n\t\tmodalRoot.removeEventListener('keydown', tabKeyHandler);\r\n\t}\r\n\r\n\tconst tabKeyHandler = (e: KeyboardEvent) => {\r\n\t\tconst escapeWasPressed = e.key === 'Escape';\r\n\t\tif (escapeWasPressed && closeOnEscape) {\r\n\t\t\tcloseModal();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst tabWasPressed = e.key === 'Tab';\r\n\t\tif (!tabWasPressed && !escapeWasPressed) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (e.shiftKey && document.activeElement === firstFocusableElement) {\r\n\t\t\te.preventDefault();\r\n\t\t\tlastFocusableElement.focus();\r\n\t\t}\r\n\t\telse if (!e.shiftKey && document.activeElement === lastFocusableElement) {\r\n\t\t\te.preventDefault();\r\n\t\t\tfirstFocusableElement.focus();\r\n\t\t}\r\n\t}\r\n\r\n\tmodalRoot.addEventListener('keydown', tabKeyHandler);\r\n\r\n\tonBeforeUnmount(() => {\r\n\t\tobserver.disconnect();\r\n\t\tmodalRoot.removeEventListener('keydown', tabKeyHandler);\r\n\t});\r\n\r\n\treturn {\r\n\t\trestoreFocus,\r\n\t\tupdateTrigger,\r\n\t\tfocus,\r\n\t};\r\n}\r\n"],"names":["trigger","useModalFocusTrap","modalRoot","emit","closeEvent","closeOnEscape","focusableElements","firstFocusableElement","lastFocusableElement","observer","focus","restoreFocus","updateTrigger","newTrigger","closeModal","tabKeyHandler","e","escapeWasPressed","onBeforeUnmount"],"mappings":"kDAIA,IAAIA,EAEJ,SAAwBC,EACvBC,EACAC,EACAC,EACAC,EACC,CACD,GAAI,CAACH,EACJ,eAAQ,MAAM,8GAA8G,EACrH,CACN,aAAc,IAAM,CAAC,EACrB,cAAe,IAAM,CAAC,EACtB,MAAO,IAAM,CAAC,CAAA,EAIhBF,EAAW,SAAS,cAEhB,IAAAM,EACAC,EACAC,EAEgBF,EAAAJ,EAAU,iBAAiB,0EAA0E,EACzHK,EAAwBD,EAAkB,CAAC,EACpBE,EAAAF,EAAkBA,EAAkB,OAAS,CAAC,EAEjEC,GACHA,EAAsB,MAAM,EAEzB,IAAAE,EAAW,IAAI,iBAAiB,IAAM,CACrBH,EAAAJ,EAAU,iBAAiB,0EAA0E,EACzHK,EAAwBD,EAAkB,CAAC,EACpBE,EAAAF,EAAkBA,EAAkB,OAAS,CAAC,EACjE,SAAS,eAAiB,CAACJ,EAAU,SAAS,SAAS,aAAa,GAAKI,EAAkB,OAAS,GACrFA,EAAA,CAAC,EAAE,OACtB,CACA,EAEDG,EAAS,QAAQP,EAAW,CAC3B,QAAS,GACT,UAAW,EAAA,CACX,EAED,MAAMQ,EAAQ,IAAM,CACfH,GACHA,EAAsB,MAAM,CAC7B,EAGKI,EAAe,IAAM,CAC1BX,GAAA,MAAAA,EAAS,OAAM,EAGVY,EAAiBC,GAAmC,CAC/Cb,EAAAa,CAAA,EAGLC,EAAa,IAAM,CACXH,IACbR,EAAKC,CAAU,EACfK,EAAS,WAAW,EACVP,EAAA,oBAAoB,UAAWa,CAAa,CAAA,EAGjDA,EAAiBC,GAAqB,CACrC,MAAAC,EAAmBD,EAAE,MAAQ,SACnC,GAAIC,GAAoBZ,EAAe,CAC3BS,IACX,MACD,CAGI,EADkBE,EAAE,MAAQ,QACV,CAACC,IAInBD,EAAE,UAAY,SAAS,gBAAkBT,GAC5CS,EAAE,eAAe,EACjBR,EAAqB,MAAM,GAEnB,CAACQ,EAAE,UAAY,SAAS,gBAAkBR,IAClDQ,EAAE,eAAe,EACjBT,EAAsB,MAAM,GAC7B,EAGS,OAAAL,EAAA,iBAAiB,UAAWa,CAAa,EAEnDG,EAAgB,IAAM,CACrBT,EAAS,WAAW,EACVP,EAAA,oBAAoB,UAAWa,CAAa,CAAA,CACtD,EAEM,CACN,aAAAJ,EACA,cAAAC,EACA,MAAAF,CAAA,CAEF"}