{"version":3,"sources":["priory.modal.js"],"names":["Modal","title","titleSub","content","onAppear","onClosing","onClosed","onFailedLoad","showCloseButton","closeOnEscape","closeOnClickOutside","classes","arguments","length","undefined","titleElm","closeElm","lastFocusElm","document","createElement","type","classList","add","innerHTML","m","setAttribute","split","forEach","cl","body","appendChild","querySelector","focus","clickedOutsideEvent","e","target","this","close","destroy","silent","parentNode","removeChild","current","remove","removeEventListener","forceClose","continueClose","Promise","resolve","then","result","reject","loadedContent","container","hasIframe","querySelectorAll","shiftPressed","play","src","tabIndex","ControlBinders","run","addEventListener","closers","event","key","preventDefault","dataset","modal","modalFocusableElements","firstFocusableItemInModal","lastFocusableItemInModal","shiftKey","register","el","openModal","modalTitle","modalTitleSub","modalMethod","cloneNode","fetch","response","text","modalHideClose","modalClasses","modalOnOpen","eval","modalOnClose","modalAutoload","stopPropagation"],"mappings":"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","sourcesContent":["const Modal = function ({\r\n title = \"\",\r\n titleSub = \"\",\r\n content,\r\n onAppear,\r\n onClosing,\r\n onClosed,\r\n onFailedLoad,\r\n showCloseButton = true,\r\n closeOnEscape = true,\r\n closeOnClickOutside = true,\r\n classes = \"\"\r\n } = {}) {\r\n const titleSubElm = titleSub\r\n ?\r\n `
${titleSub}
`\r\n : '';\r\n const titleElm = title\r\n ?\r\n `
\r\n
${title}
\r\n ${titleSubElm}\r\n
`\r\n : '';\r\n const closeElm = (showCloseButton) ? `\r\n\r\n` : ``;\r\n \r\n const lastFocusElm = document.createElement(\"button\");\r\n lastFocusElm.type=\"button\";\r\n lastFocusElm.classList.add(\"modal__content__last-button\");\r\n lastFocusElm.innerHTML = `Focusable Element`\r\n\r\n const m = document.createElement(\"div\");\r\n m.classList.add(\"modal\");\r\n m.setAttribute('role', 'dialog');\r\n\r\n if (classes) {\r\n classes.split(\" \").forEach(cl => m.classList.add(cl));\r\n }\r\n\r\n m.innerHTML =\r\n `
\r\n ${titleElm}\r\n ${closeElm}\r\n
\r\n
`;\r\n\r\n document.body.appendChild(m);\r\n m.querySelector(\"[data-modal-close]\").focus();\r\n\r\n const clickedOutsideEvent = (e) => {\r\n if (!closeOnClickOutside) {\r\n return;\r\n }\r\n if (e.target === m) {\r\n this.close();\r\n }\r\n }\r\n\r\n const destroy = (silent = false) => {\r\n m.parentNode.removeChild(m);\r\n Modal.current = null;\r\n document.querySelector(\"html\").classList.remove(\"overflow-hidden\");\r\n document.querySelector(\"html\").classList.remove(\"overlay\");\r\n document.removeEventListener(\"click\", clickedOutsideEvent);\r\n if (!silent && typeof onClosed === \"function\") {\r\n onClosed();\r\n }\r\n };\r\n\r\n const addContent = loadedContent => {\r\n const container = m.querySelector(\".modal__content\");\r\n const hasIframe = loadedContent.querySelectorAll(\"iframe\").length > 0;\r\n\r\n let shiftPressed = false;\r\n\r\n if (typeof loadedContent === \"string\") {\r\n container.innerHTML = loadedContent;\r\n } else {\r\n container.appendChild(loadedContent);\r\n }\r\n \r\n if(container.querySelector(\"video\")){\r\n container.querySelector(\"video\").play();\r\n }\r\n\r\n if(hasIframe){\r\n container.querySelector(\"iframe\").src+=\"?&autoplay=1\";\r\n container.querySelector(\"iframe\").tabIndex = 0;\r\n }\r\n \r\n ControlBinders.run(container);\r\n\r\n document.addEventListener(\"click\", clickedOutsideEvent);\r\n\r\n const closers = m.querySelectorAll(\"[data-modal-close]\");\r\n\r\n closers.forEach(closeElm => {\r\n closeElm.addEventListener(\"keydown\",\r\n event => {\r\n if (event.key === 'Enter') {\r\n event.preventDefault();\r\n !closeElm.dataset.modal && this.close();\r\n document.querySelector('body').classList.add('keyboard-input');\r\n } });\r\n closeElm.addEventListener(\"click\",\r\n () => {\r\n !closeElm.dataset.modal && this.close();\r\n });\r\n });\r\n\r\n m.classList.add(\"modal--open\");\r\n document.querySelector(\"html\").classList.add(\"overflow-hidden\");\r\n document.querySelector(\"html\").classList.add(\"overlay\");\r\n\r\n const focusableElements = `button, a[href], input:not([type='hidden']), select, textarea, [tabindex]:not([tabindex=\"-1\"])`;\r\n\r\n const modalFocusableElements = m.querySelectorAll(focusableElements);\r\n const firstFocusableItemInModal = modalFocusableElements[0];\r\n const lastFocusableItemInModal = modalFocusableElements[modalFocusableElements.length - 1];\r\n \r\n\r\n closers[0].focus();\r\n\r\n container.addEventListener(\"focus\", event => {\r\n event.preventDefault();\r\n if (shiftPressed) {\r\n m.querySelectorAll(\"[data-modal-close]\")[0].focus();\r\n shiftPressed = false;\r\n }else{\r\n firstFocusableItemInModal.focus()\r\n }\r\n });\r\n\r\n if(hasIframe){\r\n //if iframe, inject a focusable element at the end\r\n container.appendChild(lastFocusElm);\r\n lastFocusElm.addEventListener(\"focus\", ()=>{\r\n if(!shiftPressed){\r\n m.querySelectorAll(\"[data-modal-close]\")[0].focus();\r\n }\r\n })\r\n }else{\r\n lastFocusableItemInModal.addEventListener('keydown', event => {\r\n if (event.key === 'Tab' && !event.shiftKey) {\r\n event.preventDefault();\r\n m.querySelectorAll(\"[data-modal-close]\")[0].focus();\r\n }\r\n });\r\n }\r\n\r\n m.querySelectorAll(\"[data-modal-close]\")[0].addEventListener('keydown', event => {\r\n if (event.key === 'Tab' && event.shiftKey) {\r\n event.preventDefault();\r\n }\r\n }\r\n );\r\n\r\n if (typeof onAppear === \"function\") {\r\n onAppear(container);\r\n }\r\n };\r\n\r\n this.close = (forceClose = false) => {\r\n const continueClose = () => {\r\n destroy();\r\n return Promise.resolve();\r\n }\r\n\r\n if (forceClose || typeof onClosing !== \"function\") {\r\n return continueClose();\r\n }\r\n\r\n return Promise.resolve(onClosing(m.querySelector(\".modal__content\")))\r\n .then(result => {\r\n if (result !== false) {\r\n return continueClose();\r\n }\r\n\r\n return Promise.reject(\"Aborted modal close\");\r\n });\r\n }\r\n\r\n if (Modal.current) {\r\n Modal.current.close(true);\r\n }\r\n\r\n Modal.current = this;\r\n this.closeOnEscape = closeOnEscape;\r\n\r\n Promise.resolve(content)\r\n .then(addContent, e => {\r\n destroy(true);\r\n\r\n if (typeof onFailedLoad === \"function\") {\r\n onFailedLoad(e);\r\n }\r\n });\r\n}\r\n\r\ndocument.addEventListener('keydown', event => {\r\n if (event.key === 'Escape' && Modal.current && Modal.current.closeOnEscape) {\r\n Modal.current.close();\r\n }\r\n});\r\n\r\nControlBinders.register(\"[data-modal]\", el => {\r\n const openModal = () => {\r\n const modal = new Modal({\r\n title: el.dataset.modalTitle,\r\n titleSub: el.dataset.modalTitleSub,\r\n content: el.dataset.modalMethod === \"clone\" ?\r\n document.querySelector(el.dataset.modal).cloneNode(true) :\r\n fetch(el.dataset.modal).then(response => response.text()),\r\n showCloseButton: !el.dataset.modalHideClose,\r\n classes: el.dataset.modalClasses,\r\n onAppear: container => {\r\n if (typeof el.dataset.modalOnOpen !== undefined && typeof eval(el.dataset.modalOnOpen) === \"function\") {\r\n return eval(el.dataset.modalOnOpen)(container);\r\n }\r\n },\r\n onClosing: container => {\r\n if (typeof el.dataset.modalOnClose !== undefined && typeof eval(el.dataset.modalOnClose) === \"function\") {\r\n return eval(el.dataset.modalOnClose)(container);\r\n }\r\n el.focus();\r\n return true;\r\n }\r\n });\r\n };\r\n\r\n if (el.dataset.modalAutoload) {\r\n openModal();\r\n }\r\n\r\n el.addEventListener(\"click\", function (event) {\r\n event.stopPropagation();\r\n openModal();\r\n });\r\n});"],"file":"priory.modal-min.js"}