{"version":3,"file":"components-modal.js","mappings":"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","sources":["webpack://silverstripe-base/./themes/app/src/scripts/common/validation.js","webpack://silverstripe-base/./themes/app/src/scripts/common/util.js","webpack://silverstripe-base/./themes/app/src/components/styled-form.js","webpack://silverstripe-base/./themes/app/src/scripts/common/ajax.js","webpack://silverstripe-base/./node_modules/a11y-dialog/dist/a11y-dialog.esm.js","webpack://silverstripe-base/./themes/app/src/scripts/components/modal.js"],"sourcesContent":["import * as validator from \"validate.js\";\nimport { scrollToIfNeeded } from \"@common/scroll-to\";\n\nvalidator.validators.checkboxGroup = function (_, group) {\n if (group) {\n const checked = group.querySelectorAll(\"input[type=checkbox]:checked\");\n\n if (checked.length) {\n return null;\n }\n }\n\n return \"^Please select one\";\n};\n\nconst findFieldWrapper = (el) => {\n if (el) {\n if (el.closest(\".form-field-wrapper\")) {\n return el.closest(\".form-field-wrapper\");\n }\n\n if (el.closest(\".form-field\")) {\n return el.closest(\".form-field\");\n }\n\n if (el.closest(\".middleColumn\")) {\n return el.closest(\".middleColumn\");\n }\n\n if (el.closest(\".field\")) {\n return el.closest(\".field\");\n }\n }\n};\n\nexport const handleBlur = (e) => {\n const fieldWrapper = findFieldWrapper(e.target);\n\n if (fieldWrapper) {\n fieldWrapper.classList.remove(\"has-error\");\n\n const existingErrorMessage = fieldWrapper.querySelector(\".form-field-message\");\n\n if (existingErrorMessage) {\n existingErrorMessage.remove();\n }\n }\n\n if (e.target.classList.contains(\"has-error\")) {\n e.target.classList.remove(\"has-error\");\n }\n};\n\nexport const buildRules = (form) => {\n const rules = {};\n\n form\n .querySelectorAll(\"[required], input.required-if, .js-dropdown.required-if select, .optionset.required-if input\")\n .forEach((field) => {\n // Ignore hidden fields\n if ((findFieldWrapper(field) && findFieldWrapper(field).offsetHeight === 0) || field.getAttribute(\"readonly\")) {\n return;\n }\n\n const fieldName = field.dataset.name ? field.dataset.name : field.name;\n\n rules[fieldName] = {\n presence: {\n allowEmpty: false,\n message: \"^Required\",\n },\n };\n\n if (field.type === \"email\") {\n rules[field.name].email = true;\n }\n });\n\n form.querySelectorAll(\"[pattern]\").forEach((field) => {\n // Ignore hidden fields\n if (findFieldWrapper(field).offsetHeight === 0 || field.readonly) {\n return;\n }\n\n rules[field.name] = {\n format: {\n pattern: field.getAttribute(\"pattern\"),\n message: \"^Required\",\n },\n };\n });\n\n form.querySelectorAll(\"[min]\").forEach((field) => {\n // Ignore hidden fields\n if (findFieldWrapper(field).offsetHeight === 0 || field.readonly) {\n return;\n }\n\n rules[field.name] = {\n length: {\n minimum: parseInt(field.min),\n },\n };\n });\n\n form.querySelectorAll(\"[data-equals]\").forEach((field) => {\n // Ignore hidden fields\n if (findFieldWrapper(field).offsetHeight === 0 || field.readonly) {\n return;\n }\n\n rules[field.name] = {\n equality: field.dataset.equals,\n };\n });\n\n form.querySelectorAll(\"[aria-required], [data-required]\").forEach((field) => {\n // Ignore hidden fields\n if ((findFieldWrapper(field) && findFieldWrapper(field).offsetHeight === 0) || field.readonly) {\n return;\n }\n\n if (field.classList.contains(\"optionset\")) {\n const radio = field.querySelector(\"input[type=radio]\");\n const checkbox = field.querySelector(\"input[type=checkbox]\");\n\n if (radio) {\n rules[radio.name] = {\n presence: {\n message: \"^Required\",\n },\n };\n }\n\n if (checkbox) {\n rules[checkbox.name] = {\n checkboxGroup: checkbox.closest(\".optionset\"),\n };\n }\n }\n });\n\n form.querySelectorAll(\".requiredcheckboxset\").forEach((field) => {\n // Ignore hidden fields\n if ((findFieldWrapper(field) && findFieldWrapper(field).offsetHeight === 0) || field.readonly) {\n return;\n }\n\n const checkbox = field.querySelector(\"input[type=checkbox]\");\n\n if (checkbox) {\n rules[checkbox.name] = {\n checkboxGroup: checkbox.closest(\".requiredcheckboxset\"),\n };\n }\n });\n\n return rules;\n};\n\nexport const handleValidation = (form) => {\n const rules = buildRules(form);\n const result = validate(form, rules);\n\n if (result !== undefined) {\n for (const [name, messages] of Object.entries(result)) {\n const field = form.querySelector(`[name=\"${name}\"]`);\n const fieldWrapper = findFieldWrapper(field);\n\n // Place error message\n if (fieldWrapper) {\n const existingErrorMessage = fieldWrapper.querySelector(\".form-field-message\");\n\n if (existingErrorMessage) {\n existingErrorMessage.remove();\n }\n\n const message = `\n
\n ${messages[0]}\n
\n `;\n fieldWrapper.insertAdjacentHTML(\"beforeend\", message);\n fieldWrapper.classList.add(\"has-error\");\n }\n\n field.classList.add(\"has-error\");\n }\n\n const shouldScroll = form.dataset.formScroll !== undefined;\n\n const firstError = form.querySelector(\".has-error\");\n\n if (shouldScroll && firstError) {\n scrollToIfNeeded(firstError, 150, () => {\n setTimeout(() => {\n firstError.querySelector(\"input\") && firstError.querySelector(\"input\").focus();\n }, 0);\n });\n }\n\n return false;\n }\n\n return true;\n};\n\nexport const validate = validator;\n","export const isTouchDevice = \"ontouchstart\" in document.documentElement;\n\nexport const generateQueryString = (data = {}) => {\n let params = data;\n\n if (data instanceof FormData === true) {\n params = {};\n\n data.forEach((value, key) => (params[key] = value));\n }\n\n for (const key in params) {\n if (params[key] === \"\") {\n delete params[key];\n }\n }\n\n return new URLSearchParams(params);\n};\n\nexport const trackGoogleAnalytics = (event) => {\n if (window.dataLayer) {\n window.dataLayer.push(event);\n }\n};\n","import \"@components/styled-form.css\";\nimport { on, fire } from \"delegated-events\";\nimport { handleValidation, handleBlur } from \"@common/validation\";\nimport ajax from \"@common/ajax\";\nimport scrollTo from \"@common/scroll-to\";\nimport { trackGoogleAnalytics } from \"@common/util\";\n\nconst setupDropdowns = async (form) => {\n const dropdowns = form.querySelectorAll(\".js-dropdown, .userform .field.dropdown\");\n\n if (!dropdowns.length) {\n return;\n }\n\n const { default: easydropdown } = await import(\"easydropdown-a11y\");\n import(\"@styles/components/dropdown.css\");\n\n dropdowns.forEach((el) => {\n const select = el.querySelector(\"select\");\n\n if (!select) {\n return;\n }\n\n const placeholder = el.querySelector('option[value=\"\"]');\n\n if (placeholder && !placeholder.hasAttribute(\"data-placeholder\")) {\n placeholder.setAttribute(\"data-placeholder\", true);\n\n if (!placeholder.textContent) {\n placeholder.textContent = \"Select One\";\n }\n }\n\n const opts = {\n behavior: {\n openOnFocus: true,\n maxVisibleItems: 8,\n liveUpdates: true,\n useNativeUiOnMobile: false,\n },\n };\n\n easydropdown(select, opts);\n });\n};\n\nconst setupMasks = async (form) => {\n const fields = form.querySelectorAll('input[type=\"tel\"], input[data-currency]');\n\n if (!fields.length) {\n return;\n }\n\n const { default: IMask } = await import(\"imask/esm/imask\");\n await import(\"imask/esm/masked/number\");\n await import(\"imask/esm/masked/pattern\");\n\n fields.forEach((field) => {\n if (field.type === \"tel\") {\n IMask(field, {\n mask: \"(000) 000-0000\",\n });\n }\n\n if (field.dataset.currency !== undefined) {\n const mask = IMask(field, {\n mask: Number,\n scale: 0,\n thousandsSeparator: \",\",\n min: 1,\n });\n\n field.addEventListener(\"updateValue\", (e) => {\n field.value = e.detail;\n mask.updateValue();\n field.dispatchEvent(new Event(\"blur\"));\n });\n }\n });\n};\n\nconst setupSpecialFields = (form) => {\n // Setup file inputs\n form.querySelectorAll(\"input[type=file]\").forEach((input) => {\n const placeholder = document.createElement(\"div\");\n placeholder.classList.add(\"file-input-placeholder\");\n\n const additionalPlaceholder = input.dataset.additionalPlaceholder;\n\n if (input.value) {\n placeholder.textContent = input.files[0].name;\n } else {\n let fieldPlaceholder = input.placeholder;\n\n if (!fieldPlaceholder) {\n fieldPlaceholder = \"Select File\";\n }\n\n placeholder.innerHTML = `${fieldPlaceholder}`;\n\n if (additionalPlaceholder !== undefined) {\n placeholder.innerHTML += additionalPlaceholder;\n }\n }\n\n input.parentNode.insertBefore(placeholder, input);\n\n placeholder.addEventListener(\"click\", () => input.click());\n\n input.addEventListener(\"change\", (e) => {\n if (e.target.files[0]) {\n placeholder.textContent = e.target.files[0].name;\n }\n });\n });\n\n form.querySelectorAll(\".form-field-wrapper.has-length-limit\").forEach((field) => {\n const input = field.querySelector(\".has-length-limit\");\n\n if (input && input.maxLength) {\n const counter = document.createElement(\"div\");\n counter.classList.add(\"length-limit-counter\");\n\n const count = document.createElement(\"span\");\n count.textContent = `(${input.value.length}/${input.maxLength})`;\n\n counter.appendChild(count);\n\n field.querySelector(\".form-field\").appendChild(counter);\n }\n });\n};\n\nconst handleLengthLimit = (e) => {\n const $input = e.target.closest(\".has-length-limit\");\n const $field = $input.closest(\".field.has-length-limit\");\n\n if ($input && $field) {\n const $count = $field.querySelector(\".length-limit-counter span\");\n $count.textContent = `(${$input.value.length}/${$input.maxLength})`;\n }\n};\n\nconst handleToggle = (e) => {\n const form = e.target.closest(\"form\");\n const field = e.target;\n const name = e.target.name;\n const selectedValue = e.target.value;\n\n form.querySelectorAll(`[data-toggle-if^=\"${name}|\"]`).forEach((input) => {\n const toggleGroup = input.closest(\".toggle-group\");\n let shouldShow = false;\n\n if (!toggleGroup) {\n return;\n }\n\n if (field.type === \"radio\") {\n const targetValues = input.dataset.toggleIf.split(\"|\");\n targetValues.shift();\n shouldShow = targetValues.indexOf(selectedValue) !== -1;\n }\n\n if (field.type === \"checkbox\") {\n shouldShow = field.checked;\n }\n\n if (shouldShow) {\n toggleGroup.classList.remove(\"hidden\");\n } else {\n toggleGroup.classList.add(\"hidden\");\n\n toggleGroup.querySelectorAll(\"input:not([type=checkbox]):not([type=radio])\").forEach((x) => (x.value = null));\n\n toggleGroup.querySelectorAll(\"input:checked\").forEach((x) => {\n if (!toggleGroup.classList.contains(\"ignore-clear\")) {\n x.checked = false;\n }\n\n form.querySelectorAll(`[data-toggle-if^=\"${x.name}|\"]`).forEach((input) => {\n const toggleGroup = input.closest(\".toggle-group\");\n toggleGroup.classList.add(\"hidden\");\n\n toggleGroup.querySelectorAll(\"input:not([type=checkbox]):not([type=radio])\").forEach((x) => (x.value = null));\n });\n });\n }\n });\n};\n\nconst toggleSubmit = (submitButton) => {\n submitButton.disabled = !submitButton.disabled;\n submitButton.classList.toggle(\"btn-loading\");\n};\n\nconst showFormMessages = (holder, message, success, autoHide) => {\n holder.style.display = \"block\";\n holder.innerHTML = message;\n\n if (success) {\n holder.classList.remove(\"form-message-error\");\n } else {\n holder.classList.add(\"form-message-error\");\n }\n\n if (autoHide) {\n setTimeout(() => {\n holder.style.display = \"none\";\n }, 5000);\n }\n};\n\nconst handleAjaxSubmit = (e) => {\n e.preventDefault();\n\n const form = e.target;\n const isValid = handleValidation(form);\n\n if (isValid) {\n const formMessages = form.querySelector(\".form-messages\");\n const submitButton = form.querySelector(\"[type=submit]\");\n let autoHideMessage = form.dataset.autoHideMessage ? form.dataset.autoHideMessage === \"true\" : true;\n toggleSubmit(submitButton);\n\n const formData = new FormData(form);\n\n ajax\n .url(form.action)\n .body(formData)\n .post()\n .json((res) => {\n if (res.success) {\n if (res.ga) {\n res.ga.forEach((event) => trackGoogleAnalytics(event));\n }\n\n form.reset();\n form.querySelectorAll(\"select\").forEach((x) => (x.value = null));\n form.querySelectorAll(\".toggle-fields\").forEach((x) => x.classList.add(\"hidden\"));\n form.querySelectorAll(\".toggle-group\").forEach((x) => x.classList.add(\"hidden\"));\n\n fire(document.documentElement, \"styledform:submit\", {\n form,\n });\n\n if (form.dataset.formHideOnSubmit) {\n form.querySelectorAll(\".form-content\").forEach((x) => x.classList.add(\"hidden\"));\n document.querySelectorAll(\".hide-on-form-submit\").forEach((x) => x.classList.add(\"hidden\"));\n autoHideMessage = false;\n\n const shouldScroll = form.dataset.formScroll !== undefined;\n\n if (shouldScroll) {\n scrollTo(document.body, 32);\n }\n }\n\n // Allow other scripts to hook into this submit\n fire(document.documentElement, \"ajaxform:submit\", {\n form: form,\n type: \"post\",\n url: new URL(form.action),\n queryParameters: new URLSearchParams(formData).toString(),\n });\n }\n\n if (res.message) {\n showFormMessages(formMessages, res.message, res.success, autoHideMessage);\n }\n })\n .catch(() => {\n showFormMessages(formMessages, \"Sorry, there was a problem with your submission\");\n })\n .finally(() => {\n toggleSubmit(submitButton);\n });\n }\n};\n\nconst handleSubmit = (e) => {\n const form = e.target;\n const isValid = handleValidation(form);\n const submitButton = form.querySelector(\"[type=submit]\");\n toggleSubmit(submitButton);\n\n if (!isValid) {\n e.preventDefault();\n toggleSubmit(submitButton);\n }\n};\n\nconst setupForm = (form) => {\n if (form) {\n setupDropdowns(form);\n setupMasks(form);\n setupSpecialFields(form);\n }\n};\n\nconst init = () => {\n if (!document.documentElement.classList.contains(\"did-form-init\")) {\n document.querySelectorAll(\".styled-form\").forEach((form) => {\n setupForm(form);\n });\n\n on(\"blur\", \".has-error\", handleBlur, { capture: true });\n on(\"change\", \".has-error\", handleBlur, { capture: true });\n on(\"change\", \".has-error blur\", handleBlur, {\n capture: true,\n });\n on(\"submit\", \".styled-form[data-form-ajax]\", handleAjaxSubmit);\n on(\"submit\", \".styled-form:not([data-form-ajax]):not(.userform)\", handleSubmit);\n on(\"change\", \"input[type=radio]\", handleToggle);\n on(\"change\", \"input[type=checkbox]\", handleToggle);\n on(\"keyup\", \"textarea.has-length-limit\", handleLengthLimit, {\n capture: true,\n });\n\n document.documentElement.classList.add(\"did-form-init\");\n }\n};\n\ninit();\n\nexport { setupForm };\n","import wretch from 'wretch'\nimport QueryStringAddon from 'wretch/addons/queryString'\n\nwretch.options({\n headers: { 'X-Requested-With': 'XMLHttpRequest' },\n})\n\nexport default wretch().addon(QueryStringAddon)\n","const not = {\n inert: ':not([inert]):not([inert] *)',\n negTabIndex: ':not([tabindex^=\"-\"])',\n disabled: ':not(:disabled)',\n};\n\nvar focusableSelectors = [\n `a[href]${not.inert}${not.negTabIndex}`,\n `area[href]${not.inert}${not.negTabIndex}`,\n `input:not([type=\"hidden\"]):not([type=\"radio\"])${not.inert}${not.negTabIndex}${not.disabled}`,\n `input[type=\"radio\"]${not.inert}${not.negTabIndex}${not.disabled}`,\n `select${not.inert}${not.negTabIndex}${not.disabled}`,\n `textarea${not.inert}${not.negTabIndex}${not.disabled}`,\n `button${not.inert}${not.negTabIndex}${not.disabled}`,\n `details${not.inert} > summary:first-of-type${not.negTabIndex}`,\n // Discard until Firefox supports `:has()`\n // See: https://github.com/KittyGiraudel/focusable-selectors/issues/12\n // `details:not(:has(> summary))${not.inert}${not.negTabIndex}`,\n `iframe${not.inert}${not.negTabIndex}`,\n `audio[controls]${not.inert}${not.negTabIndex}`,\n `video[controls]${not.inert}${not.negTabIndex}`,\n `[contenteditable]${not.inert}${not.negTabIndex}`,\n `[tabindex]${not.inert}${not.negTabIndex}`,\n];\n\n/**\n * Set the focus to the first element with `autofocus` with the element or the\n * element itself.\n */\nfunction focus(el) {\n (el.querySelector('[autofocus]') || el).focus();\n}\n/**\n * Get the first and last focusable elements within a given element.\n */\nfunction getFocusableEdges(el) {\n // Check for a focusable element within the subtree of the given element.\n const firstEl = findFocusableEl(el, true);\n // Only if we find the first element do we need to look for the last one. If\n // there’s no last element, we set `lastEl` as a reference to `firstEl` so\n // that the returned array is still always of length 2.\n const lastEl = firstEl ? findFocusableEl(el, false) || firstEl : null;\n return [firstEl, lastEl];\n}\n/**\n * Find the first focusable element inside the given element if `forward` is\n * truthy or the last focusable element otherwise.\n */\nfunction findFocusableEl(el, forward) {\n // If we’re walking forward, check if this element is focusable, and return it\n // immediately if it is.\n if (forward && isFocusable(el))\n return el;\n // We should only search the subtree of this element if it can have focusable\n // children.\n if (canHaveFocusableChildren(el)) {\n // Start walking the DOM tree, looking for focusable elements.\n // Case 1: If this element has a shadow root, search it recursively.\n if (el.shadowRoot) {\n // Descend into this subtree.\n let next = getNextChildEl(el.shadowRoot, forward);\n // Traverse the siblings, searching the subtree of each one for focusable\n // elements.\n while (next) {\n const focusableEl = findFocusableEl(next, forward);\n if (focusableEl)\n return focusableEl;\n next = getNextSiblingEl(next, forward);\n }\n }\n // Case 2: If this element is a slot for a Custom Element, search its\n // assigned elements recursively.\n else if (el.localName === 'slot') {\n const assignedElements = el.assignedElements({\n flatten: true,\n });\n if (!forward)\n assignedElements.reverse();\n for (const assignedElement of assignedElements) {\n const focusableEl = findFocusableEl(assignedElement, forward);\n if (focusableEl)\n return focusableEl;\n }\n }\n // Case 3: this is a regular Light DOM element. Search its subtree.\n else {\n // Descend into this subtree.\n let next = getNextChildEl(el, forward);\n // Traverse siblings, searching the subtree of each one\n // for focusable elements.\n while (next) {\n const focusableEl = findFocusableEl(next, forward);\n if (focusableEl)\n return focusableEl;\n next = getNextSiblingEl(next, forward);\n }\n }\n }\n // If we’re walking backward, we want to check the element’s entire subtree\n // before checking the element itself. If this element is focusable, return\n // it.\n if (!forward && isFocusable(el))\n return el;\n return null;\n}\nfunction getNextChildEl(el, forward) {\n return forward ? el.firstElementChild : el.lastElementChild;\n}\nfunction getNextSiblingEl(el, forward) {\n return forward ? el.nextElementSibling : el.previousElementSibling;\n}\n/**\n * Determine if an element is hidden from the user.\n */\nconst isHidden = (el) => {\n // Browsers hide all non- descendants of closed
elements\n // from user interaction, but those non- elements may still match our\n // focusable-selectors and may still have dimensions, so we need a special\n // case to ignore them.\n if (el.matches('details:not([open]) *') &&\n !el.matches('details>summary:first-of-type'))\n return true;\n // If this element has no painted dimensions, it's hidden.\n return !(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n};\n/**\n * Determine if an element is focusable and has user-visible painted dimensions.\n */\nconst isFocusable = (el) => {\n // A shadow host that delegates focus will never directly receive focus,\n // even with `tabindex=0`. Consider our custom element, which\n // delegates focus to its shadow button:\n //\n // \n // #shadow-root\n // \n // \n //\n // The browser acts as as if there is only one focusable element – the shadow\n // button. Our library should behave the same way.\n if (el.shadowRoot?.delegatesFocus)\n return false;\n return el.matches(focusableSelectors.join(',')) && !isHidden(el);\n};\n/**\n * Determine if an element can have focusable children. Useful for bailing out\n * early when walking the DOM tree.\n * @example\n * This div is inert, so none of its children can be focused, even though they\n * meet our criteria for what is focusable. Once we check the div, we can skip\n * the rest of the subtree.\n * ```html\n *
\n * \n * Link\n *
\n * ```\n */\nfunction canHaveFocusableChildren(el) {\n // The browser will never send focus into a Shadow DOM if the host element\n // has a negative tabindex. This applies to both slotted Light DOM Shadow DOM\n // children\n if (el.shadowRoot && el.getAttribute('tabindex') === '-1')\n return false;\n // Elemments matching this selector are either hidden entirely from the user,\n // or are visible but unavailable for interaction. Their descentants can never\n // receive focus.\n return !el.matches(':disabled,[hidden],[inert]');\n}\n/**\n * Get the active element, accounting for Shadow DOM subtrees.\n * @author Cory LaViska\n * @see: https://www.abeautifulsite.net/posts/finding-the-active-element-in-a-shadow-root/\n */\nfunction getActiveEl(root = document) {\n const activeEl = root.activeElement;\n if (!activeEl)\n return null;\n // If there’s a shadow root, recursively find the active element within it.\n // If the recursive call returns null, return the active element\n // of the top-level Document.\n if (activeEl.shadowRoot)\n return getActiveEl(activeEl.shadowRoot) || document.activeElement;\n // If not, we can just return the active element\n return activeEl;\n}\n/**\n * Trap the focus inside the given element\n */\nfunction trapTabKey(el, event) {\n const [firstFocusableEl, lastFocusableEl] = getFocusableEdges(el);\n // If there are no focusable children in the dialog, prevent the user from\n // tabbing out of it\n if (!firstFocusableEl)\n return event.preventDefault();\n const activeEl = getActiveEl();\n // If the SHIFT key is pressed while tabbing (moving backwards) and the\n // currently focused item is the first one, move the focus to the last\n // focusable item from the dialog element\n if (event.shiftKey && activeEl === firstFocusableEl) {\n // @ts-ignore: we know that `lastFocusableEl` is not null here\n lastFocusableEl.focus();\n event.preventDefault();\n }\n // If the SHIFT key is not pressed (moving forwards) and the currently focused\n // item is the last one, move the focus to the first focusable item from the\n // dialog element\n else if (!event.shiftKey && activeEl === lastFocusableEl) {\n firstFocusableEl.focus();\n event.preventDefault();\n }\n}\n/**\n * Find the closest element to the given element matching the given selector,\n * accounting for Shadow DOM subtrees.\n * @author Louis St-Amour\n * @see: https://stackoverflow.com/a/56105394\n */\nfunction closest(selector, base) {\n function from(el) {\n if (!el || el === document || el === window)\n return null;\n if (el.assignedSlot)\n el = el.assignedSlot;\n return (el.closest(selector) ||\n from(el.getRootNode().host));\n }\n return from(base);\n}\n\nconst SCOPE = 'data-a11y-dialog';\nclass A11yDialog {\n $el;\n id;\n previouslyFocused;\n shown;\n constructor(element) {\n this.$el = element;\n this.id = this.$el.getAttribute(SCOPE) || this.$el.id;\n this.previouslyFocused = null;\n this.shown = false;\n this.maintainFocus = this.maintainFocus.bind(this);\n this.bindKeypress = this.bindKeypress.bind(this);\n this.handleTriggerClicks = this.handleTriggerClicks.bind(this);\n this.show = this.show.bind(this);\n this.hide = this.hide.bind(this);\n this.$el.setAttribute('aria-hidden', 'true');\n this.$el.setAttribute('aria-modal', 'true');\n this.$el.setAttribute('tabindex', '-1');\n if (!this.$el.hasAttribute('role')) {\n this.$el.setAttribute('role', 'dialog');\n }\n document.addEventListener('click', this.handleTriggerClicks, true);\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 destroy() {\n // Dispatch a `destroy` event\n const destroyEvent = this.fire('destroy');\n // If the event was prevented, do not continue with the normal behavior\n if (destroyEvent.defaultPrevented)\n return this;\n // Hide the dialog to avoid destroying an open instance\n this.hide();\n // Remove the click event delegates for our openers and closers\n document.removeEventListener('click', this.handleTriggerClicks, true);\n // Clone and replace the dialog element to prevent memory leaks caused by\n // event listeners that the author might not have cleaned up.\n this.$el.replaceWith(this.$el.cloneNode(true));\n return this;\n }\n /**\n * Show the dialog element, trap the current focus within it, listen for some\n * specific key presses and fire all registered callbacks for `show` event\n */\n show(event) {\n // If the dialog is already open, abort\n if (this.shown)\n return this;\n // Dispatch a `show` event\n const showEvent = this.fire('show', event);\n // If the event was prevented, do not continue with the normal behavior\n if (showEvent.defaultPrevented)\n return this;\n // Keep a reference to the currently focused element to be able to restore\n // it later\n this.shown = true;\n this.$el.removeAttribute('aria-hidden');\n this.previouslyFocused = getActiveEl();\n // Due to a long lasting bug in Safari, clicking an interactive element\n // (like a '\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 const embed = opts.embed;\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 === \"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\n const form = modalEl.querySelector(\".styled-form\");\n\n if (form) {\n setupForm(form);\n }\n\n if (type === \"embed\") {\n modalContent = document.querySelector(`.${embed} .modal-content`);\n\n modalEl.querySelector(\".modal-container\").replaceChildren(modalContent);\n }\n\n fire(document.documentElement, \"modal:populate\", { modalEl });\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 embed: triggerEl.dataset.embedTarget,\n updateUrl: triggerEl.dataset.modalUpdateUrl ?? false,\n useDefaultClose: triggerEl.dataset.modalDisableDefaultClose === undefined,\n useCustomClose: triggerEl.dataset.modalUseCustomClose !== undefined,\n });\n\n return false;\n};\n\nconst handleModalReplace = async (e) => {\n e.preventDefault();\n\n const triggerEl = e.target.closest(\"[data-modal-replace]\");\n const url = triggerEl.href;\n\n const currentModal = document.querySelector(\".modal-wrapper\");\n\n const modalContent = await ajax.get(url).text();\n\n currentModal.querySelector(\".modal-container\").innerHTML = modalContent;\n};\n\nconst openModal = (opts = {}) => {\n const type = opts.type;\n const title = opts.title ?? false;\n const embed = opts.embed ?? null;\n let useCustomClose = opts.useCustomClose ?? false;\n let useDefaultClose = opts.useDefaultClose ?? true;\n\n if (type === \"video\") {\n useDefaultClose = false;\n useCustomClose = true;\n }\n\n if (type === \"subscribe\") {\n useDefaultClose = false;\n useCustomClose = true;\n }\n\n if (type === \"embed\") {\n useCustomClose = true;\n }\n\n const id = `modal-${Math.floor(Math.random() * Date.now())}`;\n const template = generateTemplate(id, useDefaultClose, useCustomClose, title, type);\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 hideModal = () => {\n modal.hide();\n };\n\n if (useCustomClose) {\n on(\"click\", \".modal-custom-close\", hideModal);\n }\n\n const currentUrl = opts.defaultUrl ?? window.location.href;\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 if (opts.updateUrl !== false) {\n window.history.replaceState({}, \"\", currentUrl);\n }\n\n if (useCustomClose) {\n off(\"click\", \".modal-custom-close\", hideModal);\n }\n\n const embed = modalEl.querySelector(\".modal-content[data-holder]\");\n\n if (embed) {\n const embedHolder = document.querySelector(`.${embed.dataset.holder}`);\n\n embedHolder.append(embed);\n }\n\n document.querySelector(\".modal-wrapper\").remove();\n });\n\n modal.on(\"destroy\", (e) => {\n document.querySelector(\".modal-wrapper\").remove();\n e.target.remove();\n });\n\n document.documentElement.addEventListener(\n \"scrollto:click\",\n () => {\n modal.hide();\n },\n { once: true },\n );\n\n modal.show();\n\n populateModal(\n {\n type: type,\n url: opts.url ?? false,\n embed: embed,\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 const replaceClickArgs = [\"click\", \"[data-modal-replace]\", handleModalReplace];\n\n off(...clickArgs);\n on(...clickArgs);\n\n off(...replaceClickArgs);\n on(...replaceClickArgs);\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":["validator","checkboxGroup","_","group","querySelectorAll","length","findFieldWrapper","el","closest","handleBlur","e","fieldWrapper","target","classList","remove","existingErrorMessage","querySelector","contains","handleValidation","form","rules","forEach","field","offsetHeight","getAttribute","fieldName","dataset","name","presence","allowEmpty","message","type","email","readonly","format","pattern","minimum","parseInt","min","equality","equals","radio","checkbox","buildRules","result","validate","undefined","messages","Object","entries","insertAdjacentHTML","add","shouldScroll","formScroll","firstError","scrollToIfNeeded","setTimeout","focus","document","documentElement","handleToggle","selectedValue","value","input","toggleGroup","shouldShow","targetValues","toggleIf","split","shift","indexOf","checked","x","toggleSubmit","submitButton","disabled","toggle","showFormMessages","holder","success","autoHide","style","display","innerHTML","setupForm","async","dropdowns","default","easydropdown","select","placeholder","hasAttribute","setAttribute","textContent","behavior","openOnFocus","maxVisibleItems","liveUpdates","useNativeUiOnMobile","setupDropdowns","fields","IMask","mask","currency","Number","scale","thousandsSeparator","addEventListener","detail","updateValue","dispatchEvent","Event","setupMasks","createElement","additionalPlaceholder","files","fieldPlaceholder","parentNode","insertBefore","click","maxLength","counter","count","appendChild","setupSpecialFields","on","capture","preventDefault","formMessages","autoHideMessage","formData","FormData","ajax","url","action","body","post","json","res","ga","event","window","dataLayer","push","trackGoogleAnalytics","reset","fire","formHideOnSubmit","scrollTo","URL","queryParameters","URLSearchParams","toString","catch","finally","isValid","$input","$field","wretch","options","headers","addon","QueryStringAddon","not","focusableSelectors","findFocusableEl","forward","isFocusable","shadowRoot","matches","canHaveFocusableChildren","next","getNextChildEl","focusableEl","getNextSiblingEl","localName","assignedElements","flatten","reverse","assignedElement","firstElementChild","lastElementChild","nextElementSibling","previousElementSibling","delegatesFocus","join","offsetWidth","getClientRects","isHidden","getActiveEl","root","activeEl","activeElement","selector","base","from","assignedSlot","getRootNode","host","SCOPE","A11yDialog","$el","id","previouslyFocused","shown","constructor","element","this","maintainFocus","bind","bindKeypress","handleTriggerClicks","show","hide","destroy","defaultPrevented","removeEventListener","replaceWith","cloneNode","removeAttribute","tagName","handler","off","customEvent","CustomEvent","cancelable","composedPath","opener","explicitCloser","implicitCloser","hasOpenPopover","key","firstFocusableEl","lastFocusableEl","firstEl","getFocusableEdges","shiftKey","trapTabKey","instantiateDialogs","readyState","handleModal","triggerEl","openModal","modal","title","modalTitle","href","embed","embedTarget","updateUrl","modalUpdateUrl","useDefaultClose","modalDisableDefaultClose","useCustomClose","modalUseCustomClose","handleModalReplace","currentModal","modalContent","get","text","opts","Math","floor","random","Date","now","template","generateTemplate","node","createRange","createContextualFragment","append","modalEl","getElementById","hideModal","currentUrl","defaultUrl","location","history","replaceState","once","replaceChildren","populateModal","init","clickArgs","replaceClickArgs","tag","src","firstScriptTag","getElementsByTagName"],"sourceRoot":""}