{"version":3,"file":"802.min.js?t=1743173738202","mappings":"oLAUA,MAAMA,EACJC,iBAAmB,CACjBC,QAAS,iCACTC,aAAc,qCAGhBF,cAAgB,CACdG,WAAY,mBACZC,YAAa,qBAGfC,WAAAA,CAAYC,GACVC,KAAKC,QAAS,EACdD,KAAKD,QAAUA,EACfC,KAAKE,GAAKF,KAAKD,QAAQG,GAEvBF,KAAKG,SAAWC,EAAAA,EAASC,cACzBL,KAAKM,oBAAsBN,KAAKG,SAASG,oBAEzC,MAAMC,EAAcP,KAAKD,QAAQS,QAAQD,YAEzCP,KAAKS,WACLT,KAAKU,cACLV,KAAKW,eAEe,SAAhBJ,GACFP,KAAKY,MAET,CAKAH,QAAAA,GACET,KAAKa,eAAiBb,KAAKD,QAAQe,cAActB,EAAMuB,UAAUrB,SACjEM,KAAKgB,cAAgBhB,KAAKD,QAAQe,cAChCtB,EAAMuB,UAAUpB,aAEpB,CAKAgB,YAAAA,GACEX,KAAKgB,cAAcC,iBAAiB,QAASjB,KAAKkB,OAClDlB,KAAKmB,UAAUF,iBAAiB,QAASjB,KAAKkB,OAC9ClB,KAAKD,QAAQkB,iBAAiB,UAAWjB,KAAKoB,eAC9CpB,KAAKD,QAAQkB,iBAAiB,QAASjB,KAAKqB,oBAE5CrB,KAAKM,oBAAoBgB,GACvBC,EAAAA,EAAYC,OAAOC,aACnBzB,KAAK0B,eAET,CAKAC,YAAAA,GACE3B,KAAKgB,cAAcY,oBAAoB,QAAS5B,KAAKkB,OACrDlB,KAAKmB,UAAUS,oBAAoB,QAAS5B,KAAKkB,OACjDlB,KAAKD,QAAQ6B,oBAAoB,UAAW5B,KAAKoB,eACjDpB,KAAKD,QAAQ6B,oBAAoB,QAAS5B,KAAKqB,oBAE/CrB,KAAKM,oBAAoBuB,IACvBN,EAAAA,EAAYC,OAAOC,aACnBzB,KAAK0B,eAET,CAKAhB,WAAAA,GACEV,KAAKD,QAAQ+B,aAAa,cAAe,SAEzC9B,KAAKmB,WAAYY,EAAAA,EAAAA,ICjFQC,KAAA,IAAC,GAAE9B,EAAK,GAAE,aAAE+B,EAAe,IAAID,EAAA,MAAK,2BAEnD9B,qCACkB+B,qBAE7B,ED6EGC,CAAqB,CACnBhC,GAAI,GAAGF,KAAKE,sBAIhBiC,SAASC,KAAKC,YAAYrC,KAAKmB,WAC/BnB,KAAKmB,UAAUkB,YAAYrC,KAAKD,SAChCC,KAAKa,eAAeyB,UAAUC,IAAI,iBACpC,CAKAC,OAAAA,GACExC,KAAK2B,eAED3B,KAAKmB,WACPnB,KAAKmB,UAAUsB,QAEnB,CAKAf,eAAkBxB,IACZA,IAAOF,KAAKE,IACdF,KAAKY,MACP,EAMFA,KAAOA,KACLZ,KAAK0C,cAAgBP,SAASO,cAC9B1C,KAAKC,QAAS,EAEdD,KAAKD,QAAQ+B,aAAa,cAAe,SACzC9B,KAAKD,QAAQuC,UAAUC,IAAI,kBAC3BvC,KAAKmB,UAAUmB,UAAUC,IAAI,2BAG7B,MAAM,qBAAEI,EAAoB,kBAAEC,GAC5B5C,KAAK6C,sBACP7C,KAAKD,QAAQ+B,aAAa,WAAY,MAElCa,GACFC,EAAkB,GAAGE,QAGvB9C,KAAKM,oBAAoByC,KAAKvD,EAAMgC,OAAO5B,WAAYI,KAAKE,IAG5DiC,SAASC,KAAKE,UAAUC,IAAI,YAAY,EAM1CrB,MAAQA,KACNlB,KAAKC,QAAS,EACdD,KAAKD,QAAQ+B,aAAa,cAAe,QACzC9B,KAAKD,QAAQuC,UAAUG,OAAO,kBAC9BzC,KAAKmB,UAAUmB,UAAUG,OAAO,2BAGhCzC,KAAK0C,cAAcI,QACnB9C,KAAKM,oBAAoByC,KAAKvD,EAAMgC,OAAO3B,YAAaG,KAAKE,IAG7DiC,SAASC,KAAKE,UAAUG,OAAO,YAAY,EAM7CI,mBAAAA,GACE,MAAMD,EAAoBI,MAAMC,KAC9BjD,KAAKD,QAAQmD,iBACX,oFAEFC,QAAQpD,GAAqC,OAAzBA,EAAQqD,eAE9B,MAAO,CACLT,qBAAsBC,EAAkBS,OAAS,EACjDT,oBAEJ,CAMAvB,mBAAsBiC,IACpBA,EAAMC,iBAAiB,EAMzBnC,cAAiBkC,IAMf,GALkB,WAAdA,EAAME,KACRxD,KAAKkB,QAIW,QAAdoC,EAAME,IAAe,CACvB,MAAM,kBAAEZ,GAAsB5C,KAAK6C,sBAE7BY,EAAeb,EAAkB,GACjCc,EAAcd,EAAkBA,EAAkBS,OAAS,GAE7DC,EAAMK,UAAYxB,SAASO,gBAAkBe,GAC/CH,EAAMM,iBACNF,EAAYZ,SACFQ,EAAMK,UAAYxB,SAASO,gBAAkBgB,IACvDJ,EAAMM,iBACNH,EAAaX,QAEjB,GAIJ,S,4GE7Me,MAAMvB,EACnB9B,iBAAmB,CACjBoE,OAAQ,gCAGVpE,cAAgB,CACdgC,aAAc,2BAGhB3B,WAAAA,CAAYC,GACVC,KAAKD,QAAUA,EACfC,KAAKG,SAAWC,EAAAA,EAASC,cACzBL,KAAKM,oBAAsBN,KAAKG,SAASG,oBAEzCN,KAAKW,cACP,CAKAA,YAAAA,GACEX,KAAKD,QAAQkB,iBAAiB,QAASjB,KAAK8D,UAC9C,CAKAC,YAAAA,GACE/D,KAAKD,QAAQ6B,oBAAoB,QAAS5B,KAAK8D,UACjD,CAKAtB,OAAAA,GACExC,KAAK+D,cACP,CAKAD,UAAYA,KACV,MAAME,EAAUhE,KAAKD,QAAQS,QAAQwD,QAErChE,KAAKM,oBAAoByC,KAAKxB,EAAYC,OAAOC,aAAcuC,EAAQ,E,iBCzCpE,SAASjC,EAAakC,GAC3B,MAAMC,EAAK/B,SAASgC,cAAc,OAIlC,OAHAD,EAAGE,UAAYH,EAAeI,OAG1BH,EAAGI,WAAWjB,OAAS,EAClBa,EAGFA,EAAGK,UACZ,CAOO,SAASC,EAAMzE,GACpB,KAAOA,EAAQwE,YACbxE,EAAQ0E,YAAY1E,EAAQwE,WAEhC,CASO,SAASG,EAAOC,EAAMC,GAO3B,OALAJ,EAAMI,GAGNA,EAAUvC,YAAYsC,GAEfC,CACT,C","sources":["webpack://@hero-digital/masonite/./src/components/modules/Modal/Modal.js","webpack://@hero-digital/masonite/./src/components/modules/Modal/ModalOverlay.template.js","webpack://@hero-digital/masonite/./src/components/modules/ModalButton/ModalButton.js","webpack://@hero-digital/masonite/./src/js/utilities/renderer.js"],"sourcesContent":["import Services from 'services'\nimport { fromTemplate } from 'utilities/renderer'\n\nimport ModalOverlayTemplate from './ModalOverlay.template'\n\nimport ModalButton from '../ModalButton/ModalButton'\n\n/**\n * Modal component that displays a modal\n */\nclass Modal {\n static SELECTORS = {\n CONTENT: '[data-modal-content=\"content\"]',\n CLOSE_BUTTON: '[data-modal-close-button=\"close\"]'\n }\n\n static EVENTS = {\n OPEN_MODAL: 'Modal Open event',\n CLOSE_MODAL: 'Modal Close event'\n }\n\n constructor(element) {\n this.isOpen = false\n this.element = element\n this.id = this.element.id\n\n this.services = Services.getInstance()\n this.EventEmitterService = this.services.EventEmitterService\n\n const defaultOpen = this.element.dataset.defaultOpen\n\n this.cacheDom()\n this.createModal()\n this.attachEvents()\n\n if (defaultOpen === 'true') {\n this.open()\n }\n }\n\n /**\n * Cache DOM elements\n */\n cacheDom() {\n this.modalContentEl = this.element.querySelector(Modal.SELECTORS.CONTENT)\n this.closeButtonEl = this.element.querySelector(\n Modal.SELECTORS.CLOSE_BUTTON\n )\n }\n\n /**\n * Add event listeners\n */\n attachEvents() {\n this.closeButtonEl.addEventListener('click', this.close)\n this.overlayEl.addEventListener('click', this.close)\n this.element.addEventListener('keydown', this.handleKeyDown)\n this.element.addEventListener('click', this.handleElementClick)\n\n this.EventEmitterService.on(\n ModalButton.EVENTS.BUTTON_CLICK,\n this.showModalEvent\n )\n }\n\n /**\n * Remove event listeners\n */\n removeEvents() {\n this.closeButtonEl.removeEventListener('click', this.close)\n this.overlayEl.removeEventListener('click', this.close)\n this.element.removeEventListener('keydown', this.handleKeyDown)\n this.element.removeEventListener('click', this.handleElementClick)\n\n this.EventEmitterService.off(\n ModalButton.EVENTS.BUTTON_CLICK,\n this.showModalEvent\n )\n }\n\n /**\n * Create the modal layout and add overlay and close button\n */\n createModal() {\n this.element.setAttribute('aria-hidden', 'false')\n\n this.overlayEl = fromTemplate(\n ModalOverlayTemplate({\n id: `${this.id}-modal-overlay`\n })\n )\n\n document.body.appendChild(this.overlayEl)\n this.overlayEl.appendChild(this.element)\n this.modalContentEl.classList.add('modal__content')\n }\n\n /**\n * Destroy the modal instance and remove event listeners\n */\n destroy() {\n this.removeEvents()\n\n if (this.overlayEl) {\n this.overlayEl.remove()\n }\n }\n\n /**\n * Show modal event Modalbutton triggers click event\n */\n showModalEvent = (id) => {\n if (id === this.id) {\n this.open()\n }\n }\n\n /**\n * Open modal, set modal properties and styles and set focus trap\n */\n open = () => {\n this.activeElement = document.activeElement\n this.isOpen = true\n\n this.element.setAttribute('aria-hidden', 'false')\n this.element.classList.add('modal--visible')\n this.overlayEl.classList.add('modal__overlay--visible')\n\n // Trap focus inside the modal\n const { hasFocusableElements, focusableElements } =\n this.hasFocusableContent()\n this.element.setAttribute('tabindex', '-1')\n\n if (hasFocusableElements) {\n focusableElements[0].focus()\n }\n\n this.EventEmitterService.emit(Modal.EVENTS.OPEN_MODAL, this.id)\n\n // prevent page content from scrolling beneath the modal\n document.body.classList.add('no-scroll')\n }\n\n /**\n * close modal, set modal properties and styles and move focus to trigger\n */\n close = () => {\n this.isOpen = false\n this.element.setAttribute('aria-hidden', 'true')\n this.element.classList.remove('modal--visible')\n this.overlayEl.classList.remove('modal__overlay--visible')\n\n // Restore the focus to the previously active element\n this.activeElement.focus()\n this.EventEmitterService.emit(Modal.EVENTS.CLOSE_MODAL, this.id)\n\n // remove no-scroll on body\n document.body.classList.remove('no-scroll')\n }\n\n /**\n * Validates if element has focusable children\n */\n hasFocusableContent() {\n const focusableElements = Array.from(\n this.element.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"]), video'\n )\n ).filter((element) => element.offsetParent !== null)\n\n return {\n hasFocusableElements: focusableElements.length > 0,\n focusableElements\n }\n }\n\n /**\n * Prevents click event from bubbling up to the overlay\n * @param {*} event\n */\n handleElementClick = (event) => {\n event.stopPropagation()\n }\n\n /**\n * Close modal on Escape key and handle focus trap\n */\n handleKeyDown = (event) => {\n if (event.key === 'Escape') {\n this.close()\n }\n\n // Focus Trap\n if (event.key === 'Tab') {\n const { focusableElements } = this.hasFocusableContent()\n\n const firstElement = focusableElements[0]\n const lastElement = focusableElements[focusableElements.length - 1]\n\n if (event.shiftKey && document.activeElement === firstElement) {\n event.preventDefault()\n lastElement.focus()\n } else if (!event.shiftKey && document.activeElement === lastElement) {\n event.preventDefault()\n firstElement.focus()\n }\n }\n }\n}\n\nexport default Modal\n","/**\n * Render Modal overlay template\n * @param {String} id Component ID\n * @param {String} addClassName overlay class\n */\nconst ModalOverlayTemplate = ({ id = '', addClassName = '' }) => `\n
\n `\n\nexport default ModalOverlayTemplate\n","import Services from 'services'\n\n/**\n * ModalButton component that emits a click event for the modal assigned by data-modal-id prop\n */\nexport default class ModalButton {\n static SELECTORS = {\n BUTTON: '[data-cmp-is=\"modal-button\"]'\n }\n\n static EVENTS = {\n BUTTON_CLICK: 'modalbutton click event'\n }\n\n constructor(element) {\n this.element = element\n this.services = Services.getInstance()\n this.EventEmitterService = this.services.EventEmitterService\n\n this.attachEvents()\n }\n\n /**\n * Add event listeners\n */\n attachEvents() {\n this.element.addEventListener('click', this.openModal)\n }\n\n /**\n * Remove event listeners\n */\n detachEvents() {\n this.element.removeEventListener('click', this.openModal)\n }\n\n /**\n * Destroy the modal instance and remove event listeners\n */\n destroy() {\n this.detachEvents()\n }\n\n /**\n * Emits click event for modal\n */\n openModal = () => {\n const modalId = this.element.dataset.modalId\n\n this.EventEmitterService.emit(ModalButton.EVENTS.BUTTON_CLICK, modalId)\n }\n}\n","// Utility for rendering HTML elements\n\n/**\n * @function fromTemplate\n * @description Converts an HTML element string to a DOM object\n * @param {string} templateString String representation of a DOM element (e.g. '