{"version":3,"file":"components-modal.ca60f4381f3ae2e4f1ad.js","mappings":"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","sources":["webpack://adjusters/./node_modules/a11y-dialog/dist/a11y-dialog.esm.js","webpack://adjusters/./src/scripts/components/modal.js"],"sourcesContent":["var focusableSelectors = [\n 'a[href]:not([tabindex^=\"-\"])',\n 'area[href]:not([tabindex^=\"-\"])',\n 'input:not([type=\"hidden\"]):not([type=\"radio\"]):not([disabled]):not([tabindex^=\"-\"])',\n 'input[type=\"radio\"]:not([disabled]):not([tabindex^=\"-\"])',\n 'select:not([disabled]):not([tabindex^=\"-\"])',\n 'textarea:not([disabled]):not([tabindex^=\"-\"])',\n 'button:not([disabled]):not([tabindex^=\"-\"])',\n 'iframe:not([tabindex^=\"-\"])',\n 'audio[controls]:not([tabindex^=\"-\"])',\n 'video[controls]:not([tabindex^=\"-\"])',\n '[contenteditable]:not([tabindex^=\"-\"])',\n '[tabindex]:not([tabindex^=\"-\"])',\n];\n\nvar TAB_KEY = 'Tab';\nvar ESCAPE_KEY = 'Escape';\n\n/**\n * Define the constructor to instantiate a dialog\n *\n * @constructor\n * @param {Element} element\n */\nfunction A11yDialog(element) {\n // Prebind the functions that will be bound in addEventListener and\n // removeEventListener to avoid losing references\n this._show = this.show.bind(this);\n this._hide = this.hide.bind(this);\n this._maintainFocus = this._maintainFocus.bind(this);\n this._bindKeypress = this._bindKeypress.bind(this);\n\n this.$el = element;\n this.shown = false;\n this._id = this.$el.getAttribute('data-a11y-dialog') || this.$el.id;\n this._previouslyFocused = null;\n this._listeners = {};\n\n // Initialise everything needed for the dialog to work properly\n this.create();\n}\n\n/**\n * Set up everything necessary for the dialog to be functioning\n *\n * @param {(NodeList | Element | string)} targets\n * @return {this}\n */\nA11yDialog.prototype.create = function () {\n this.$el.setAttribute('aria-hidden', true);\n this.$el.setAttribute('aria-modal', true);\n this.$el.setAttribute('tabindex', -1);\n\n if (!this.$el.hasAttribute('role')) {\n this.$el.setAttribute('role', 'dialog');\n }\n\n // Keep a collection of dialog openers, each of which will be bound a click\n // event listener to open the dialog\n this._openers = $$('[data-a11y-dialog-show=\"' + this._id + '\"]');\n this._openers.forEach(\n function (opener) {\n opener.addEventListener('click', this._show);\n }.bind(this)\n );\n\n // Keep a collection of dialog closers, each of which will be bound a click\n // event listener to close the dialog\n const $el = this.$el;\n\n this._closers = $$('[data-a11y-dialog-hide]', this.$el)\n // This filter is necessary in case there are nested dialogs, so that\n // only closers from the current dialog are retrieved and effective\n .filter(function (closer) {\n // Testing for `[aria-modal=\"true\"]` is not enough since this attribute\n // and the collect of closers is done at instantation time, when nested\n // dialogs might not have yet been instantiated. Note that if the dialogs\n // are manually instantiated, this could still fail because none of these\n // selectors would match; this would cause closers to close all parent\n // dialogs instead of just the current one\n return closer.closest('[aria-modal=\"true\"], [data-a11y-dialog]') === $el\n })\n .concat($$('[data-a11y-dialog-hide=\"' + this._id + '\"]'));\n\n this._closers.forEach(\n function (closer) {\n closer.addEventListener('click', this._hide);\n }.bind(this)\n );\n\n // Execute all callbacks registered for the `create` event\n this._fire('create');\n\n return this\n};\n\n/**\n * Show the dialog element, disable all the targets (siblings), trap the\n * current focus within it, listen for some specific key presses and fire all\n * registered callbacks for `show` event\n *\n * @param {CustomEvent} event\n * @return {this}\n */\nA11yDialog.prototype.show = function (event) {\n // If the dialog is already open, abort\n if (this.shown) {\n return this\n }\n\n // Keep a reference to the currently focused element to be able to restore\n // it later\n this._previouslyFocused = document.activeElement;\n this.$el.removeAttribute('aria-hidden');\n this.shown = true;\n\n // Set the focus to the dialog element\n moveFocusToDialog(this.$el);\n\n // Bind a focus event listener to the body element to make sure the focus\n // stays trapped inside the dialog while open, and start listening for some\n // specific key presses (TAB and ESC)\n document.body.addEventListener('focus', this._maintainFocus, true);\n document.addEventListener('keydown', this._bindKeypress);\n\n // Execute all callbacks registered for the `show` event\n this._fire('show', event);\n\n return this\n};\n\n/**\n * Hide the dialog element, enable all the targets (siblings), restore the\n * focus to the previously active element, stop listening for some specific\n * key presses and fire all registered callbacks for `hide` event\n *\n * @param {CustomEvent} event\n * @return {this}\n */\nA11yDialog.prototype.hide = function (event) {\n // If the dialog is already closed, abort\n if (!this.shown) {\n return this\n }\n\n this.shown = false;\n this.$el.setAttribute('aria-hidden', 'true');\n\n // If there was a focused element before the dialog was opened (and it has a\n // `focus` method), restore the focus back to it\n // See: https://github.com/KittyGiraudel/a11y-dialog/issues/108\n if (this._previouslyFocused && this._previouslyFocused.focus) {\n this._previouslyFocused.focus();\n }\n\n // Remove the focus event listener to the body element and stop listening\n // for specific key presses\n document.body.removeEventListener('focus', this._maintainFocus, true);\n document.removeEventListener('keydown', this._bindKeypress);\n\n // Execute all callbacks registered for the `hide` event\n this._fire('hide', event);\n\n return this\n};\n\n/**\n * Destroy the current instance (after making sure the dialog has been hidden)\n * and remove all associated listeners from dialog openers and closers\n *\n * @return {this}\n */\nA11yDialog.prototype.destroy = function () {\n // Hide the dialog to avoid destroying an open instance\n this.hide();\n\n // Remove the click event listener from all dialog openers\n this._openers.forEach(\n function (opener) {\n opener.removeEventListener('click', this._show);\n }.bind(this)\n );\n\n // Remove the click event listener from all dialog closers\n this._closers.forEach(\n function (closer) {\n closer.removeEventListener('click', this._hide);\n }.bind(this)\n );\n\n // Execute all callbacks registered for the `destroy` event\n this._fire('destroy');\n\n // Keep an object of listener types mapped to callback functions\n this._listeners = {};\n\n return this\n};\n\n/**\n * Register a new callback for the given event type\n *\n * @param {string} type\n * @param {Function} handler\n */\nA11yDialog.prototype.on = function (type, handler) {\n if (typeof this._listeners[type] === 'undefined') {\n this._listeners[type] = [];\n }\n\n this._listeners[type].push(handler);\n\n return this\n};\n\n/**\n * Unregister an existing callback for the given event type\n *\n * @param {string} type\n * @param {Function} handler\n */\nA11yDialog.prototype.off = function (type, handler) {\n var index = (this._listeners[type] || []).indexOf(handler);\n\n if (index > -1) {\n this._listeners[type].splice(index, 1);\n }\n\n return this\n};\n\n/**\n * Iterate over all registered handlers for given type and call them all with\n * the dialog element as first argument, event as second argument (if any). Also\n * dispatch a custom event on the DOM element itself to make it possible to\n * react to the lifecycle of auto-instantiated dialogs.\n *\n * @access private\n * @param {string} type\n * @param {CustomEvent} event\n */\nA11yDialog.prototype._fire = function (type, event) {\n var listeners = this._listeners[type] || [];\n var domEvent = new CustomEvent(type, { detail: event });\n\n this.$el.dispatchEvent(domEvent);\n\n listeners.forEach(\n function (listener) {\n listener(this.$el, event);\n }.bind(this)\n );\n};\n\n/**\n * Private event handler used when listening to some specific key presses\n * (namely ESCAPE and TAB)\n *\n * @access private\n * @param {Event} event\n */\nA11yDialog.prototype._bindKeypress = function (event) {\n // This is an escape hatch in case there are nested dialogs, so the keypresses\n // are only reacted to for the most recent one\n const focused = document.activeElement;\n if (focused && focused.closest('[aria-modal=\"true\"]') !== this.$el) return\n\n // If the dialog is shown and the ESCAPE key is being pressed, prevent any\n // further effects from the ESCAPE key and hide the dialog, unless its role\n // is 'alertdialog', which should be modal\n if (\n this.shown &&\n event.key === ESCAPE_KEY &&\n this.$el.getAttribute('role') !== 'alertdialog'\n ) {\n event.preventDefault();\n this.hide(event);\n }\n\n // If the dialog is shown and the TAB key is being pressed, make sure the\n // focus stays trapped within the dialog element\n if (this.shown && event.key === TAB_KEY) {\n trapTabKey(this.$el, event);\n }\n};\n\n/**\n * Private event handler used when making sure the focus stays within the\n * currently open dialog\n *\n * @access private\n * @param {Event} event\n */\nA11yDialog.prototype._maintainFocus = function (event) {\n // If the dialog is shown and the focus is not within a dialog element (either\n // this one or another one in case of nested dialogs) or within an element\n // with the `data-a11y-dialog-focus-trap-ignore` attribute, move it back to\n // its first focusable child.\n // See: https://github.com/KittyGiraudel/a11y-dialog/issues/177\n if (\n this.shown &&\n !event.target.closest('[aria-modal=\"true\"]') &&\n !event.target.closest('[data-a11y-dialog-ignore-focus-trap]')\n ) {\n moveFocusToDialog(this.$el);\n }\n};\n\n/**\n * Convert a NodeList into an array\n *\n * @param {NodeList} collection\n * @return {Array}\n */\nfunction toArray(collection) {\n return Array.prototype.slice.call(collection)\n}\n\n/**\n * Query the DOM for nodes matching the given selector, scoped to context (or\n * the whole document)\n *\n * @param {String} selector\n * @param {Element} [context = document]\n * @return {Array}\n */\nfunction $$(selector, context) {\n return toArray((context || document).querySelectorAll(selector))\n}\n\n/**\n * Set the focus to the first element with `autofocus` with the element or the\n * element itself\n *\n * @param {Element} node\n */\nfunction moveFocusToDialog(node) {\n var focused = node.querySelector('[autofocus]') || node;\n\n focused.focus();\n}\n\n/**\n * Get the focusable children of the given element\n *\n * @param {Element} node\n * @return {Array}\n */\nfunction getFocusableChildren(node) {\n return $$(focusableSelectors.join(','), node).filter(function (child) {\n return !!(\n child.offsetWidth ||\n child.offsetHeight ||\n child.getClientRects().length\n )\n })\n}\n\n/**\n * Trap the focus inside the given element\n *\n * @param {Element} node\n * @param {Event} event\n */\nfunction trapTabKey(node, event) {\n var focusableChildren = getFocusableChildren(node);\n var focusedItemIndex = focusableChildren.indexOf(document.activeElement);\n\n // If the SHIFT key is being pressed while tabbing (moving backwards) and\n // the currently focused item is the first one, move the focus to the last\n // focusable item from the dialog element\n if (event.shiftKey && focusedItemIndex === 0) {\n focusableChildren[focusableChildren.length - 1].focus();\n event.preventDefault();\n // If the SHIFT key is not being pressed (moving forwards) and the currently\n // focused item is the last one, move the focus to the first focusable item\n // from the dialog element\n } else if (\n !event.shiftKey &&\n focusedItemIndex === focusableChildren.length - 1\n ) {\n focusableChildren[0].focus();\n event.preventDefault();\n }\n}\n\nfunction instantiateDialogs() {\n $$('[data-a11y-dialog]').forEach(function (node) {\n new A11yDialog(node);\n });\n}\n\nif (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', instantiateDialogs);\n } else {\n if (window.requestAnimationFrame) {\n window.requestAnimationFrame(instantiateDialogs);\n } else {\n window.setTimeout(instantiateDialogs, 16);\n }\n }\n}\n\nexport { A11yDialog as default };\n","import '@styles/components/modal.css'\nimport ajax from '@common/ajax'\nimport { on, off } from 'delegated-events'\nimport A11yDialog from 'a11y-dialog'\n\nconst generateTemplate = (id, useDefaultClose = true, title = false) => {\n const role = useDefaultClose ? 'dialog' : 'alertdialog'\n const labeledBy = title ? 'aria-labelledby=\"modal-title\"' : ''\n\n const html = `\n
\n
\n\n ${\n useDefaultClose === true\n ? ''\n : ''\n }\n\n
\n \n \n \n
\n
\n `\n\n return html\n}\n\nconst populateModal = async (opts = {}, modalEl) => {\n const type = opts.type\n const title = opts.title ?? ''\n const url = opts.url\n\n let modalContent = ''\n\n if (type === 'video') {\n modalContent = `\n
\n

Watch ${title}

\n
\n \n\n \n
\n
\n `\n\n modalEl.querySelector('.modal-container').innerHTML = modalContent\n }\n\n if (type === 'letter') {\n modalContent = await ajax.get(url).text()\n\n modalEl.querySelector('.modal-container').innerHTML = modalContent\n\n const { default: component } = await import(\n /* webpackChunkName: \"components-modal-slider\" */ '@scripts/components/modal-slider'\n )\n\n component.init(modalEl)\n }\n\n if (type === 'content') {\n modalContent = await ajax.get(url).text()\n\n modalEl.querySelector('.modal-container').innerHTML = modalContent\n }\n\n if (type === 'subscribe') {\n modalContent = await ajax.get(url).text()\n\n modalEl.querySelector('.modal-container').innerHTML = modalContent\n\n const { default: component } = await import(\n /* webpackChunkName: \"components-modal-subscribe\" */ '@scripts/components/modal-subscribe'\n )\n\n component.init(modalEl)\n }\n\n if (type === 'form') {\n modalContent = await ajax.get(url).text()\n\n modalEl.querySelector('.modal-container').innerHTML = modalContent\n modalEl.classList.add('as-full')\n\n const { default: component } = await import(\n /* webpackChunkName: \"components-modal-form\" */ '@scripts/components/modal-form'\n )\n\n component.init(modalEl)\n }\n}\n\nconst handleModal = (e) => {\n e.preventDefault()\n\n const triggerEl = e.target.closest('[data-modal]')\n\n openModal({\n type: triggerEl.dataset.modal,\n title: triggerEl.dataset.modalTitle,\n url: triggerEl.href,\n updateUrl: triggerEl.dataset.modalUpdateUrl ?? false,\n useDefaultClose: triggerEl.dataset.modalDisableDefaultClose === undefined,\n })\n\n return false\n}\n\nconst openModal = (opts = {}) => {\n const type = opts.type\n const title = opts.title ?? false\n let useDefaultClose = opts.useDefaultClose ?? true\n\n if (type === 'video') {\n useDefaultClose = false\n }\n\n if (type === 'subscribe') {\n useDefaultClose = false\n }\n\n if (type === \"content\") {\n useDefaultClose = false;\n }\n\n const id = `modal-${Math.floor(Math.random() * Date.now())}`\n const template = generateTemplate(id, useDefaultClose, title)\n const node = document.createRange().createContextualFragment(template)\n\n document.body.append(node)\n\n const modalEl = document.getElementById(id)\n const modal = new A11yDialog(modalEl)\n\n const currentUrl = opts.defaultUrl ?? window.location.href\n\n if (useDefaultClose === false) {\n on('click', '.modal-custom-close', () => {\n modal.hide()\n });\n }\n\n modal.on('show', () => {\n document.documentElement.classList.add('has-modal-active')\n\n if (opts.updateUrl !== false) {\n window.history.replaceState({}, '', opts.updateUrl)\n }\n })\n\n modal.on('hide', () => {\n document.documentElement.classList.remove('has-modal-active')\n\n modal.destroy()\n\n if (opts.updateUrl !== false) {\n window.history.replaceState({}, '', currentUrl)\n }\n\n if (useDefaultClose === false) {\n off(\"click\", \".modal-custom-close\", () => {\n modal.hide()\n });\n }\n })\n\n modal.on('destroy', (el) => {\n el.remove()\n })\n\n modal.show()\n\n populateModal(\n {\n type: type,\n url: opts.url ?? false,\n updateUrl: opts.updateUrl,\n defaultUrl: opts.defaultUrl,\n },\n modalEl\n )\n}\n\nexport default {\n init: () => {\n const clickArgs = ['click', '[data-modal]', handleModal]\n off(...clickArgs)\n on(...clickArgs)\n\n // If we have video modals, load the YouTube API\n if (document.querySelectorAll('[data-modal=\"video\"]').length) {\n const tag = document.createElement('script')\n tag.src = 'https://www.youtube.com/iframe_api'\n\n const firstScriptTag = document.getElementsByTagName('script')[0]\n\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag)\n }\n },\n openModal,\n}\n"],"names":["focusableSelectors","A11yDialog","element","this","_show","show","bind","_hide","hide","_maintainFocus","_bindKeypress","$el","shown","_id","getAttribute","id","_previouslyFocused","_listeners","create","$$","selector","context","collection","document","querySelectorAll","Array","prototype","slice","call","moveFocusToDialog","node","querySelector","focus","instantiateDialogs","forEach","setAttribute","hasAttribute","_openers","opener","addEventListener","_closers","filter","closer","closest","concat","_fire","event","activeElement","removeAttribute","body","removeEventListener","destroy","on","type","handler","push","off","index","indexOf","splice","listeners","domEvent","CustomEvent","detail","dispatchEvent","listener","focused","key","preventDefault","focusableChildren","join","child","offsetWidth","offsetHeight","getClientRects","length","getFocusableChildren","focusedItemIndex","shiftKey","trapTabKey","target","readyState","window","requestAnimationFrame","setTimeout","generateTemplate","useDefaultClose","title","role","labeledBy","html","populateModal","async","opts","modalEl","url","modalContent","innerHTML","ajax","text","default","component","init","classList","add","handleModal","e","triggerEl","openModal","dataset","modal","modalTitle","href","updateUrl","modalUpdateUrl","undefined","modalDisableDefaultClose","Math","floor","random","Date","now","template","createRange","createContextualFragment","append","getElementById","currentUrl","defaultUrl","location","documentElement","history","replaceState","remove","el","clickArgs","tag","createElement","src","firstScriptTag","getElementsByTagName","parentNode","insertBefore"],"sourceRoot":""}