{"version":3,"file":"802.min.js?t=1744984834426","mappings":"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","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\tstatic SELECTORS = {\n\t\tCONTENT: '[data-modal-content=\"content\"]',\n\t\tCLOSE_BUTTON: '[data-modal-close-button=\"close\"]'\n\t}\n\n\tstatic EVENTS = {\n\t\tOPEN_MODAL: 'Modal Open event',\n\t\tCLOSE_MODAL: 'Modal Close event'\n\t}\n\n\tconstructor(element) {\n\t\tthis.isOpen = false\n\t\tthis.element = element\n\t\tthis.id = this.element.id\n\n\t\tthis.services = Services.getInstance()\n\t\tthis.EventEmitterService = this.services.EventEmitterService\n\n\t\tconst defaultOpen = this.element.dataset.defaultOpen\n\n\t\tthis.cacheDom()\n\t\tthis.createModal()\n\t\tthis.attachEvents()\n\n\t\tif (defaultOpen === 'true') {\n\t\t\tthis.open()\n\t\t}\n\t}\n\n\t/**\n\t * Cache DOM elements\n\t */\n\tcacheDom() {\n\t\tthis.modalContentEl = this.element.querySelector(Modal.SELECTORS.CONTENT)\n\t\tthis.closeButtonEl = this.element.querySelector(\n\t\t\tModal.SELECTORS.CLOSE_BUTTON\n\t\t)\n\t}\n\n\t/**\n\t * Add event listeners\n\t */\n\tattachEvents() {\n\t\tthis.closeButtonEl.addEventListener('click', this.close)\n\t\tthis.overlayEl.addEventListener('click', this.close)\n\t\tthis.element.addEventListener('keydown', this.handleKeyDown)\n\t\tthis.element.addEventListener('click', this.handleElementClick)\n\n\t\tthis.EventEmitterService.on(\n\t\t\tModalButton.EVENTS.BUTTON_CLICK,\n\t\t\tthis.showModalEvent\n\t\t)\n\t}\n\n\t/**\n\t * Remove event listeners\n\t */\n\tremoveEvents() {\n\t\tthis.closeButtonEl.removeEventListener('click', this.close)\n\t\tthis.overlayEl.removeEventListener('click', this.close)\n\t\tthis.element.removeEventListener('keydown', this.handleKeyDown)\n\t\tthis.element.removeEventListener('click', this.handleElementClick)\n\n\t\tthis.EventEmitterService.off(\n\t\t\tModalButton.EVENTS.BUTTON_CLICK,\n\t\t\tthis.showModalEvent\n\t\t)\n\t}\n\n\t/**\n\t * Create the modal layout and add overlay and close button\n\t */\n\tcreateModal() {\n\t\tthis.element.setAttribute('aria-hidden', 'false')\n\n\t\tthis.overlayEl = fromTemplate(\n\t\t\tModalOverlayTemplate({\n\t\t\t\tid: `${this.id}-modal-overlay`\n\t\t\t})\n\t\t)\n\n\t\tdocument.body.appendChild(this.overlayEl)\n\t\tthis.overlayEl.appendChild(this.element)\n\t\tthis.modalContentEl.classList.add('modal__content')\n\t}\n\n\t/**\n\t * Destroy the modal instance and remove event listeners\n\t */\n\tdestroy() {\n\t\tthis.removeEvents()\n\n\t\tif (this.overlayEl) {\n\t\t\tthis.overlayEl.remove()\n\t\t}\n\t}\n\n\t/**\n\t * Show modal event Modalbutton triggers click event\n\t */\n\tshowModalEvent = (id) => {\n\t\tif (id === this.id) {\n\t\t\tthis.open()\n\t\t}\n\t}\n\n\t/**\n\t * Open modal, set modal properties and styles and set focus trap\n\t */\n\topen = () => {\n\t\tthis.activeElement = document.activeElement\n\t\tthis.isOpen = true\n\n\t\tthis.element.setAttribute('aria-hidden', 'false')\n\t\tthis.element.classList.add('modal--visible')\n\t\tthis.overlayEl.classList.add('modal__overlay--visible')\n\n\t\t// Trap focus inside the modal\n\t\tconst { hasFocusableElements, focusableElements } =\n\t\t\tthis.hasFocusableContent()\n\t\tthis.element.setAttribute('tabindex', '-1')\n\n\t\tif (hasFocusableElements) {\n\t\t\tfocusableElements[0].focus()\n\t\t}\n\n\t\tthis.EventEmitterService.emit(Modal.EVENTS.OPEN_MODAL, this.id)\n\n\t\t// prevent page content from scrolling beneath the modal\n\t\tdocument.body.classList.add('no-scroll')\n\t}\n\n\t/**\n\t * close modal, set modal properties and styles and move focus to trigger\n\t */\n\tclose = () => {\n\t\tthis.isOpen = false\n\t\tthis.element.setAttribute('aria-hidden', 'true')\n\t\tthis.element.classList.remove('modal--visible')\n\t\tthis.overlayEl.classList.remove('modal__overlay--visible')\n\n\t\t// Restore the focus to the previously active element\n\t\tthis.activeElement.focus()\n\t\tthis.EventEmitterService.emit(Modal.EVENTS.CLOSE_MODAL, this.id)\n\n\t\t// remove no-scroll on body\n\t\tdocument.body.classList.remove('no-scroll')\n\t}\n\n\t/**\n\t * Validates if element has focusable children\n\t */\n\thasFocusableContent() {\n\t\tconst focusableElements = Array.from(\n\t\t\tthis.element.querySelectorAll(\n\t\t\t\t'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"]), video'\n\t\t\t)\n\t\t).filter((element) => element.offsetParent !== null)\n\n\t\treturn {\n\t\t\thasFocusableElements: focusableElements.length > 0,\n\t\t\tfocusableElements\n\t\t}\n\t}\n\n\t/**\n\t * Prevents click event from bubbling up to the overlay\n\t * @param {*} event\n\t */\n\thandleElementClick = (event) => {\n\t\tevent.stopPropagation()\n\t}\n\n\t/**\n\t * Close modal on Escape key and handle focus trap\n\t */\n\thandleKeyDown = (event) => {\n\t\tif (event.key === 'Escape') {\n\t\t\tthis.close()\n\t\t}\n\n\t\t// Focus Trap\n\t\tif (event.key === 'Tab') {\n\t\t\tconst { focusableElements } = this.hasFocusableContent()\n\n\t\t\tconst firstElement = focusableElements[0]\n\t\t\tconst lastElement = focusableElements[focusableElements.length - 1]\n\n\t\t\tif (event.shiftKey && document.activeElement === firstElement) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tlastElement.focus()\n\t\t\t} else if (!event.shiftKey && document.activeElement === lastElement) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tfirstElement.focus()\n\t\t\t}\n\t\t}\n\t}\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\tstatic SELECTORS = {\n\t\tBUTTON: '[data-cmp-is=\"modal-button\"]'\n\t}\n\n\tstatic EVENTS = {\n\t\tBUTTON_CLICK: 'modalbutton click event'\n\t}\n\n\tconstructor(element) {\n\t\tthis.element = element\n\t\tthis.services = Services.getInstance()\n\t\tthis.EventEmitterService = this.services.EventEmitterService\n\n\t\tthis.attachEvents()\n\t}\n\n\t/**\n\t * Add event listeners\n\t */\n\tattachEvents() {\n\t\tthis.element.addEventListener('click', this.openModal)\n\t}\n\n\t/**\n\t * Remove event listeners\n\t */\n\tdetachEvents() {\n\t\tthis.element.removeEventListener('click', this.openModal)\n\t}\n\n\t/**\n\t * Destroy the modal instance and remove event listeners\n\t */\n\tdestroy() {\n\t\tthis.detachEvents()\n\t}\n\n\t/**\n\t * Emits click event for modal\n\t */\n\topenModal = () => {\n\t\tconst modalId = this.element.dataset.modalId\n\n\t\tthis.EventEmitterService.emit(ModalButton.EVENTS.BUTTON_CLICK, modalId)\n\t}\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. '
content
')\n * @returns {Node} DOM Node\n */\nexport function fromTemplate(templateString) {\n\tconst el = document.createElement('div')\n\tel.innerHTML = templateString.trim()\n\n\t// If there are multiple child nodes return the wrapped elements in a div\n\tif (el.childNodes.length > 1) {\n\t\treturn el\n\t}\n\n\treturn el.firstChild\n}\n\n/**\n * @function empty\n * @description Empties all of the inner elements from an element\n * @param {Node} element Element to empty\n */\nexport function empty(element) {\n\twhile (element.firstChild) {\n\t\telement.removeChild(element.firstChild)\n\t}\n}\n\n/**\n * @function insert\n * @description Replaced the inner content of an element with a new node\n * @param {Node} node The DOM node element to insert\n * @param {Node} toElement The DOM node element to insert node into\n * @returns {Node}\n */\nexport function insert(node, toElement) {\n\t// dump the inner nodes before appending new content\n\tempty(toElement)\n\n\t// append the new node\n\ttoElement.appendChild(node)\n\n\treturn toElement\n}\n"],"names":["Modal","static","CONTENT","CLOSE_BUTTON","OPEN_MODAL","CLOSE_MODAL","constructor","element","this","isOpen","id","services","Services","getInstance","EventEmitterService","defaultOpen","dataset","cacheDom","createModal","attachEvents","open","modalContentEl","querySelector","SELECTORS","closeButtonEl","addEventListener","close","overlayEl","handleKeyDown","handleElementClick","on","ModalButton","EVENTS","BUTTON_CLICK","showModalEvent","removeEvents","removeEventListener","off","setAttribute","fromTemplate","_ref","addClassName","ModalOverlayTemplate","document","body","appendChild","classList","add","destroy","remove","activeElement","hasFocusableElements","focusableElements","hasFocusableContent","focus","emit","Array","from","querySelectorAll","filter","offsetParent","length","event","stopPropagation","key","firstElement","lastElement","shiftKey","preventDefault","BUTTON","openModal","detachEvents","modalId","templateString","el","createElement","innerHTML","trim","childNodes","firstChild","empty","removeChild","insert","node","toElement"],"sourceRoot":""}