upskill-event-manager/assets/js/formidable-abandonment.js
Ben Reed cdc5ea85f4 feat: Add comprehensive CSS, JavaScript and theme asset infrastructure
Add massive collection of CSS, JavaScript and theme assets that were previously excluded:

**CSS Files (681 total):**
- HVAC plugin-specific styles (hvac-*.css): 34 files including dashboard, certificates, registration, mobile nav, accessibility fixes, animations, and welcome popup
- Theme framework files (Astra, builder systems, layouts): 200+ files
- Plugin compatibility styles (WooCommerce, WPForms, Elementor, Contact Form 7): 150+ files
- WordPress core and editor styles: 50+ files
- Responsive and RTL language support: 200+ files

**JavaScript Files (400+ total):**
- HVAC plugin functionality (hvac-*.js): 27 files including menu systems, dashboard enhancements, profile sharing, mobile responsive features, accessibility, and animations
- Framework and library files: jQuery plugins, GSAP, AOS, Swiper, Chart.js, Lottie, Isotope
- Plugin compatibility scripts: WPForms, WooCommerce, Elementor, Contact Form 7, LifterLMS
- WordPress core functionality: customizer, admin, block editor compatibility
- Third-party integrations: Stripe, SMTP, analytics, search functionality

**Assets:**
- Certificate background images and logos
- Comprehensive theme styling infrastructure
- Mobile-responsive design systems
- Cross-browser compatibility assets
- Performance-optimized minified versions

**Updated .gitignore:**
- Fixed asset directory whitelisting patterns to properly include CSS/JS/images
- Added proper directory structure recognition (!/assets/css/, !/assets/js/, etc.)
- Maintains security by excluding sensitive files while including essential assets

This commit provides the complete frontend infrastructure needed for:
- Full theme functionality and styling
- Plugin feature implementations
- Mobile responsiveness and accessibility
- Cross-browser compatibility
- Performance optimization
- Developer workflow support
2025-08-11 16:20:31 -03:00

174 lines
No EOL
47 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./node_modules/@wordpress/dom-ready/build-module/index.js":
/*!*****************************************************************!*\
!*** ./node_modules/@wordpress/dom-ready/build-module/index.js ***!
\*****************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ domReady)\n/* harmony export */ });\n/**\n * @typedef {() => void} Callback\n *\n * TODO: Remove this typedef and inline `() => void` type.\n *\n * This typedef is used so that a descriptive type is provided in our\n * automatically generated documentation.\n *\n * An in-line type `() => void` would be preferable, but the generated\n * documentation is `null` in that case.\n *\n * @see https://github.com/WordPress/gutenberg/issues/18045\n */\n\n/**\n * Specify a function to execute when the DOM is fully loaded.\n *\n * @param {Callback} callback A function to execute after the DOM is ready.\n *\n * @example\n * ```js\n * import domReady from '@wordpress/dom-ready';\n *\n * domReady( function() {\n * \t//do something after DOM loads.\n * } );\n * ```\n *\n * @return {void}\n */\nfunction domReady(callback) {\n if (typeof document === 'undefined') {\n return;\n }\n if (document.readyState === 'complete' ||\n // DOMContentLoaded + Images/Styles/etc loaded, so we call directly.\n document.readyState === 'interactive' // DOMContentLoaded fires at this point, so we call directly.\n ) {\n return void callback();\n }\n\n // DOMContentLoaded has not fired yet, delay callback until then.\n document.addEventListener('DOMContentLoaded', callback);\n}\n//# sourceMappingURL=index.js.map\n\n//# sourceURL=webpack://formidable-abandonment/./node_modules/@wordpress/dom-ready/build-module/index.js?");
/***/ }),
/***/ "./assets/src/components/clipboard.js":
/*!********************************************!*\
!*** ./assets/src/components/clipboard.js ***!
\********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ copyClipBoard)\n/* harmony export */ });\n/**\n * Copy link to clipboard on click and display the tooltip.\n *\n * @param {string} elID Element id of copy link button.\n * @param {string} elValueID Element id of value.\n * @param {string} param Element attribute.\n *\n * @since 1.1\n */\nfunction copyClipBoard(elID, elValueID, param) {\n document.addEventListener('click', e => {\n const copyEl = document.getElementById(elID);\n if (!copyEl || !e.target.id.match(elID) && !copyEl.contains(e.target)) {\n // Only continue if the click is on the exact element or child.\n return;\n }\n e.preventDefault();\n copyToClipboard(document.getElementById(elValueID), param);\n\n // If .frm-abandonment-copy-success exists, remove it.\n const success = document.querySelector('.frm-abandonment-copy-success');\n if (success) {\n success.remove();\n }\n const message = document.createElement('span');\n message.setAttribute('class', 'frm-abandonment-copy-success');\n message.innerHTML = '<svg width=\"16px\" height=\"16px\" class=\"frmsvg\" viewBox=\"0 0 10 8\"><path d=\"M9.2 1c.2.3.2.7 0 1l-5 5c-.3.2-.6.2-.9 0L.8 4.3a.6.6 0 0 1 .9-.8l2 2 4.6-4.5c.3-.3.6-.3.9 0Z\"/></svg>';\n message.style.margin = '0 5px';\n copyEl.parentNode.insertBefore(message, copyEl.nextSibling);\n setTimeout(() => {\n message.remove();\n }, 6000);\n });\n}\n\n/**\n * Copy link to clipboard.\n *\n * @param {string} element Element.\n * @param {string} param Element attribute.\n *\n * @since 1.1\n */\nasync function copyToClipboard(element, param) {\n if (!element) {\n return;\n }\n if (navigator.clipboard) {\n try {\n await navigator.clipboard.writeText(element.getAttribute(param));\n } catch (err) {\n // eslint-disable-next-line no-console\n console.log(err);\n }\n }\n}\n\n//# sourceURL=webpack://formidable-abandonment/./assets/src/components/clipboard.js?");
/***/ }),
/***/ "./assets/src/components/modal.js":
/*!****************************************!*\
!*** ./assets/src/components/modal.js ***!
\****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var tingle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tingle.js */ \"./node_modules/tingle.js/dist/tingle.min.js\");\n/* harmony import */ var tingle_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(tingle_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./clipboard */ \"./assets/src/components/clipboard.js\");\n/* harmony import */ var _dom_helper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom-helper */ \"./assets/src/dom-helper.js\");\n/* global frmAbdn */\n\n/**\n *External dependencies\n */\n\n\n/**\n *Internal dependencies\n */\n\n\n\n/**\n * Class for handling closing of DOM.\n *\n * @since 1.1\n */\nfunction draftModal() {\n /**\n * First email_to field id.\n *\n * @since 1.1\n */\n this.firstEmailToField = false;\n /**\n * Is sending data Eligible.\n *\n * @since 1.1\n */\n this.hasEmail = false;\n /**\n * Form ID to watch.\n *\n * @since 1.1\n */\n this.formID = null;\n /**\n * Modal instance.\n *\n * @since 1.1\n */\n this.modal = null;\n /**\n * Check if form has been submitted.\n *\n * @since 1.1\n */\n this.watchSaveDraft = function () {\n document.addEventListener('click', e => {\n const saveBtn = e.target;\n if (!saveBtn.classList.contains('frm_save_draft')) {\n return;\n }\n const formCont = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_2__.selector)(this.formID);\n if (!this.hasEmail && this.addRequiredEmailError(formCont, saveBtn)) {\n // Check if the email field is visible on the current page.\n return;\n }\n if (formCont.classList.contains('frm-temp-js-validate')) {\n // Remove temporary frm_js_validate class.\n formCont.classList.remove('frm_js_validate', 'frm-temp-js-validate');\n }\n if (this.hasEmail) {\n this.maybeAddHiddenField(formCont);\n } else {\n this.stopFormSubmit(saveBtn);\n if (!this.modal) {\n this.initiateModal();\n }\n this.modal.open();\n }\n }, true); // Capture phase before other click events.\n };\n\n /**\n * Add required email error if the field is on the current page.\n *\n * @param {Object} formCont Form container.\n * @param {Object} saveBtn Save button.\n * @return {boolean} Whether the email validation was added.\n */\n this.addRequiredEmailError = function (formCont, saveBtn) {\n const visibleEmailField = document.querySelector(`input[name=\"${this.firstEmailToField}\"][type=\"email\"]`);\n if (!visibleEmailField) {\n return false;\n }\n const fieldCont = visibleEmailField.parentNode;\n if (fieldCont && visibleEmailField.value === '') {\n fieldCont.classList.add('frm_blank_field');\n visibleEmailField.addEventListener('change', () => {\n this.allowFormSubmit(saveBtn);\n });\n\n // Add temporary frm_js_validate class to trigger validation.\n if (!formCont.classList.contains('frm_js_validate')) {\n formCont.classList.add('frm_js_validate', 'frm-temp-js-validate');\n }\n this.stopFormSubmit(saveBtn);\n return true;\n }\n fieldCont.classList.remove('frm_blank_field');\n return false;\n };\n this.stopFormSubmit = function (saveBtn) {\n saveBtn.classList.remove('frm_save_draft');\n saveBtn.classList.add('frm_pending_save_draft');\n };\n this.allowFormSubmit = function (saveBtn) {\n saveBtn.classList.remove('frm_pending_save_draft');\n saveBtn.classList.add('frm_save_draft');\n };\n\n /**\n * This field will trigger the saved draft copy link to show in the success message.\n *\n * @param {Object} formCont Form container.\n */\n this.maybeAddHiddenField = function (formCont) {\n if (this.hasEmail) {\n (0,_dom_helper__WEBPACK_IMPORTED_MODULE_2__.addHiddenField)(formCont, 'loggedout_draft', '1');\n }\n };\n\n /**\n * Create a modal.\n *\n * @since 1.1\n */\n this.initiateModal = function () {\n const formClass = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_2__.selector)(this.formID).parentNode.getAttribute('class');\n const formClassArray = formClass.split(' ').filter(Boolean);\n formClassArray[0] = 'frm-abandonment-modal';\n this.modal = new (tingle_js__WEBPACK_IMPORTED_MODULE_0___default().modal)({\n footer: true,\n stickyFooter: false,\n closeMethods: ['overlay', 'escape'],\n closeLabel: frmAbdn.translatable.close,\n cssClass: formClassArray,\n onOpen: () => {\n // Add styling class to footer for buttons.\n const footer = document.querySelector('.tingle-modal-box__footer');\n footer.classList.add('frm_submit');\n },\n onClose: () => {\n const formEl = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_2__.selector)(this.formID);\n const saveDraftEl = formEl.querySelector('.frm_pending_save_draft');\n if (!saveDraftEl) {\n return;\n }\n this.maybeAddHiddenField(formEl);\n this.allowFormSubmit(saveDraftEl);\n }\n });\n this.modalSetContent();\n this.modalSetButton();\n };\n\n /**\n * Set modal content.\n *\n * @since 1.1\n */\n this.modalSetContent = function () {\n this.modal.setContent(`\n\t\t<a class=\"frm-abandonment-close\" href=\"#\">×</a>\n\t\t<h3>\n\t\t\t${frmAbdn.translatable.title}\n\t\t</h3>\n\t\t<div class=\"frm_description\">\n\t\t\t<p>\n\t\t\t${frmAbdn.translatable.content}\n\t\t\t</p>\n\t\t</div>\n\t\t<div class=\"frm_form_field frm_top_container\">\n\t\t\t<label for=\"frm-abandonment-modal-email\" class=\"frm_primary_label\">\n\t\t\t\t${frmAbdn.translatable.label}\n\t\t\t\t<span class=\"frm_required\" aria-hidden=\"true\">*</span>\n\t\t\t</label>\n\n\t\t\t<input type=\"email\" id=\"frm-abandonment-modal-email\" />\n\n\t\t\t<div class=\"frm_error frm-abandonment-field-error frm-abandonment-btn-invisible\" role=\"alert\" >\n\t\t\t\t${frmAbdn.translatable.error}\n\t\t\t</div>\n\t\t</div>\n\t\t`);\n };\n\n /**\n * Set modal footer button.\n *\n * @since 1.1\n */\n this.modalSetButton = function () {\n this.modal.addFooterBtn(frmAbdn.translatable.button, 'frm-abandonment-modal-btn frm-abandonment-modal-btn-primary', () => {\n const formCont = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_2__.selector)(this.formID);\n const formEmailEl = formCont.querySelector(`input[name=\"${this.firstEmailToField}\"]`);\n const modalEmailEl = document.getElementById('frm-abandonment-modal-email');\n const pattern = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/i;\n if (modalEmailEl.value.match(pattern)) {\n formEmailEl.value = modalEmailEl.value;\n this.hasEmail = true;\n const saveDraftEl = formCont.querySelector('.frm_pending_save_draft');\n this.allowFormSubmit(saveDraftEl);\n saveDraftEl.click();\n this.modal.close();\n return;\n }\n const modalEmail = document.getElementById('frm-abandonment-modal-email');\n modalEmail.focus();\n modalEmail.style.border = '1px solid rgb(255, 0, 0)';\n const errorLabel = document.querySelector('.frm-abandonment-field-error');\n errorLabel.classList.remove('frm-abandonment-btn-invisible');\n });\n\n // Close button.\n document.querySelector('.frm-abandonment-close').addEventListener('click', () => {\n this.modal.close();\n });\n };\n\n /**\n * Observe fields for changes.\n *\n * @since 1.1\n */\n this.observeEmailFields = function () {\n const observableFields = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_2__.getSetting)(this.formID, 'observable_fields', 'loggedOutDraft');\n // When there is no field selected in any action we don't need to open modal at all.\n if ('undefined' === typeof observableFields) {\n this.hasEmail = true;\n return;\n }\n const selectors = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_2__.observableSelector)(observableFields);\n const formEl = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_2__.selector)(this.formID);\n Array.prototype.forEach.call(selectors, (selector, key) => {\n // Collect first email id as main corresponding modal email field value.\n if (0 === key) {\n this.firstEmailToField = selector;\n }\n const fieldEl = formEl.querySelector(`input[name='${selector}']`);\n if (fieldEl && fieldEl.value) {\n this.hasEmail = true;\n }\n document.addEventListener('change', e => {\n if (selector === e.target.getAttribute('name')) {\n this.hasEmail = Boolean(e.target.value);\n }\n });\n });\n };\n /**\n * Initialization function.\n *\n * @since 1.1\n *\n * @param {string} formID Form ID.\n */\n this.init = function (formID) {\n this.formID = formID;\n this.observeEmailFields();\n this.watchSaveDraft();\n (0,_clipboard__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('frm-abandonment-copy-link', 'frm-abandonment-link', 'value');\n };\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (draftModal);\n\n//# sourceURL=webpack://formidable-abandonment/./assets/src/components/modal.js?");
/***/ }),
/***/ "./assets/src/dom-closing.js":
/*!***********************************!*\
!*** ./assets/src/dom-closing.js ***!
\***********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _dom_helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dom-helper */ \"./assets/src/dom-helper.js\");\n/* global frmAbdn */\n\n\n\n/**\n * Class for handling closing of DOM.\n *\n * @since 1.0\n */\nfunction domClosing() {\n /**\n * Is sending data Eligible.\n *\n * @since 1.0\n */\n this.eligible = false;\n\n /**\n * Observed fields filled.\n *\n * @since x.x\n */\n this.observedFieldsFilled = false;\n\n /**\n * Form ID to watch.\n *\n * @since 1.0\n */\n this.formID = null;\n\n /**\n * Attached callback on dom close.\n *\n * @since 1.0\n */\n this.callBack = null;\n\n /**\n * Flag when form entry is a draft.\n *\n * @since 1.1\n */\n this.is_draft = false;\n\n /**\n * Auto save intervals by form id.\n *\n * @since 1.1\n */\n this.autoSaveInterval = false;\n\n /**\n * Bind the function if eligible.\n *\n * @since 1.0\n */\n this.bind = function () {\n if (this.isEligible()) {\n this.callBack();\n this.afterCallback();\n\n // Avoid saving when no changes have been made.\n this.eligible = false;\n }\n };\n\n /**\n * Check if eligible.\n *\n * @since 1.0\n *\n * @return {boolean} Eligibility.\n */\n this.isEligible = function () {\n return this.eligible;\n };\n\n /**\n * Handle visibility change event.\n *\n * @since 1.0\n */\n this.visibilityChange = function () {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.bind();\n }\n });\n };\n\n /**\n * Capture form on interval to backup the visibilitychange \"hidden\"\n * when it's not triggered.\n *\n * @since 1.1\n */\n this.saveOnInterval = function () {\n if (!this.autoSaveInterval) {\n return;\n }\n setInterval(() => {\n if (!this.isEligible()) {\n return;\n }\n this.bind();\n if (this.is_draft) {\n this.showAutoSaveTime();\n }\n }, this.autoSaveInterval);\n };\n\n /**\n * Show the last saved timestap with the save draft button when auto save draft is enabled.\n */\n this.showAutoSaveTime = function () {\n const dateTime = `${frmAbdn.translatable.autoSaved} ${this.formatedTime()}`;\n let lastUpdatedTime = document.getElementById('frm-auto-save-time');\n if (!lastUpdatedTime) {\n lastUpdatedTime = document.createElement('span');\n lastUpdatedTime.id = 'frm-auto-save-time';\n }\n lastUpdatedTime.textContent = dateTime;\n const draftLink = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.selector)(this.formID).querySelector('.frm_submit .frm_save_draft');\n if (draftLink) {\n draftLink.parentNode.insertBefore(lastUpdatedTime, draftLink.nextSibling);\n }\n };\n\n /**\n * Convert the PHP time to JS time format.\n *\n * a Lowercase Ante meridiem and Post meridiem am or pm\n * A Uppercase Ante meridiem and Post meridiem AM or PM\n * g 12-hour format of an hour without leading zeros 1 through 12\n * G 24-hour format of an hour without leading zeros 0 through 23\n * h 12-hour format of an hour with leading zeros 01 through 12\n * H 24-hour format of an hour with leading zeros 00 through 23\n * i Minutes with leading zeros 00 to 59\n *\n * @return {string} Formatted time.\n */\n this.formatedTime = function () {\n const currentDate = new Date();\n const timeFormat = this.getValidTimeFormat();\n const hours = currentDate.getHours();\n const minutes = currentDate.getMinutes();\n const isPm = hours >= 12;\n const replacements = {\n g: hours % 12 || 12,\n // 12-hour without leading zero\n G: hours,\n // 24-hour without leading zero\n h: (hours % 12 || 12).toString().padStart(2, '0'),\n // 12-hour with leading zero\n H: hours.toString().padStart(2, '0'),\n // 24-hour with leading zero\n i: minutes.toString().padStart(2, '0'),\n // Minutes with leading zero\n a: isPm ? 'pm' : 'am',\n A: isPm ? 'PM' : 'AM'\n };\n\n // Replace format characters in the timeFormat string with actual time values\n const formattedTime = timeFormat.split('').map(char => replacements[char] !== undefined ? replacements[char] : char).join('');\n return formattedTime;\n };\n this.getValidTimeFormat = function () {\n const allowed = ['h', 'H', 'g', 'G', 'i', 'a', 'A', ' ', ':'];\n const defaultFormat = 'g:i a';\n const timeFormat = frmAbdn.timeFormat || defaultFormat;\n // Validate each character in the timeFormat against allowed characters\n for (const char of timeFormat) {\n if (!allowed.includes(char)) {\n // Return default format if an invalid character is found\n return defaultFormat;\n }\n }\n return timeFormat; // Return the original format if all characters are valid\n };\n\n /**\n * Check if is current form has a draft entry.\n *\n * @since 1.1\n *\n * @return {undefined|true} If draft submitted.\n */\n this.isAutoSave = function () {\n return this.autoSaveInterval !== 0;\n };\n\n /**\n * Set auto save interval.\n * @since 1.1\n * @return {void}\n */\n this.setAutoSaveInterval = function () {\n let saveInterval = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.getFieldValue)(this.formID, 'auto_save');\n if (!saveInterval) {\n saveInterval = 0;\n }\n this.autoSaveInterval = saveInterval;\n };\n\n /**\n * Check if the form field has changed by visitor.\n *\n * @since 1.0\n */\n this.isFormManipulated = function () {\n (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.selector)(this.formID).addEventListener('change', () => {\n this.eligible = true;\n });\n };\n /**\n * Check if form has been submitted.\n *\n * @since 1.0\n */\n this.isFormSubmitted = function () {\n document.addEventListener('click', e => {\n if (e.target.classList.contains('frm_final_submit')) {\n this.eligible = false;\n }\n });\n };\n\n /**\n * Observe whether form is a draft in ajax or normal forms.\n *\n * @since 1.1\n */\n this.setDraftStatus = function () {\n if (!this.isAutoSave()) {\n return;\n }\n\n // Entry is draft no need for observer.\n if (true === (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.getSetting)(this.formID, 'is_draft')) {\n this.switchToDraft();\n }\n };\n\n /**\n * The form switched to a draft.\n *\n * @since 1.1\n * @return {void}\n */\n this.switchToDraft = function () {\n this.is_draft = true;\n this.eligible = true;\n };\n\n /**\n * Check if the \"id\" field in the form exists and has a value.\n *\n * @return {void}\n */\n this.afterCallback = function () {\n if (this.is_draft) {\n return;\n }\n const idField = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.selector)(this.formID).querySelector('[name=\"id\"]');\n if (idField && idField.value !== '') {\n this.switchToDraft();\n }\n };\n\n /**\n * Check if email required is enabled.\n *\n * @since 1.0\n *\n * @return {undefined|true} If collection under circumstances is enabled.\n */\n this.isEmailRequired = function () {\n return this.isAbandonEnabled() && (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.getSetting)(this.formID, 'abandon_email_required');\n };\n\n /**\n * Check if abandonment is enabled.\n *\n * @since 1.1\n *\n * @return {undefined|true} If abandonment enabled.\n */\n this.isAbandonEnabled = function () {\n return (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.getSetting)(this.formID, 'enable_abandon');\n };\n\n /**\n * Observe fields for changes.\n *\n * @since 1.0\n */\n this.observeFields = function () {\n const selectors = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.observableSelector)((0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.getSetting)(this.formID, 'observable_fields'));\n Array.prototype.forEach.call(selectors, selector => {\n // Make the form eligible immediately on keyup.\n document.addEventListener('keyup', e => {\n if (selector === e.target.name) {\n this.eligible = true;\n this.observedFieldsFilled = true;\n }\n });\n });\n (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.selector)(this.formID).addEventListener('change', () => {\n if (this.observedFieldsFilled) {\n this.eligible = true;\n }\n });\n };\n this.initForm = function () {\n const saveAbandon = !this.is_draft && this.isAbandonEnabled();\n const saveDraft = this.is_draft && this.isAutoSave();\n if (saveAbandon && this.isEmailRequired()) {\n this.observeFields();\n } else if (saveAbandon || saveDraft) {\n this.isFormManipulated();\n }\n };\n\n /**\n * Initialization function.\n *\n * @since 1.0\n *\n * @param {string} formID - Form ID.\n * @param {Function} callBack - Callback function.\n */\n this.init = function (formID = this.formID, callBack = this.callBack) {\n this.formID = formID;\n this.callBack = callBack;\n\n // Unbind the callback whenever the form is being submitted.\n this.isFormSubmitted();\n this.setAutoSaveInterval();\n this.setDraftStatus();\n jQuery(document).on('frmPageChanged frmFormComplete', function () {\n if (!this.is_draft && (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.selector)(this.formID)?.querySelector('.frm_saving_draft')) {\n this.switchToDraft();\n }\n this.initForm();\n }.bind(this));\n jQuery(document).on('frmAfterRemoveRow', function () {\n this.eligible = true;\n }.bind(this));\n this.initForm();\n\n // In addition to page visibility change we will save the form on intervals.\n this.saveOnInterval();\n this.visibilityChange();\n };\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (domClosing);\n\n//# sourceURL=webpack://formidable-abandonment/./assets/src/dom-closing.js?");
/***/ }),
/***/ "./assets/src/dom-helper.js":
/*!**********************************!*\
!*** ./assets/src/dom-helper.js ***!
\**********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ addHiddenField: () => (/* binding */ addHiddenField),\n/* harmony export */ doAjax: () => (/* reexport safe */ _global_helper__WEBPACK_IMPORTED_MODULE_0__.doAjax),\n/* harmony export */ formSelector: () => (/* binding */ formSelector),\n/* harmony export */ getFieldValue: () => (/* binding */ getFieldValue),\n/* harmony export */ getFormData: () => (/* binding */ getFormData),\n/* harmony export */ getSetting: () => (/* binding */ getSetting),\n/* harmony export */ observableSelector: () => (/* binding */ observableSelector),\n/* harmony export */ selector: () => (/* binding */ selector)\n/* harmony export */ });\n/* harmony import */ var _global_helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./global-helper */ \"./assets/src/global-helper.js\");\n/* global frmAbdn */\n\n\n\n/**\n * Get all dom needed for app.\n *\n * @param {Array} formIDs\n * @since 1.0\n *\n * @return {Object} Elements.\n */\nconst formSelector = formIDs => {\n const selectors = {\n [Symbol.iterator]() {\n const values = Object.values(this);\n let index = Object.keys(this);\n return {\n next() {\n if (index < values.length) {\n const val = values[index];\n index++;\n return {\n value: val,\n done: false\n };\n }\n return {\n done: true\n };\n }\n };\n }\n };\n Array.prototype.forEach.call(formIDs, formSetting => {\n selectors[formSetting.form_id] = document.querySelector('#frm_form_' + formSetting.form_id + '_container form');\n });\n return selectors;\n};\n\n/**\n * Get dom form selector based on passed ID.\n *\n * @since 1.0\n *\n * @param {string} formID form identifier.\n *\n * @return {Object} Elements.\n */\nconst selector = formID => document.querySelector(`#frm_form_${formID}_container form`);\n\n/**\n * Get a setting from the global object.\n *\n * @since 1.0\n *\n * @param {string} formID The form ID to match against.\n * @param {string} optionName The option name to retrieve from the matched form's settings.\n * @param {string} type Type of settings.\n *\n * @return {*} The value of the requested setting for the matched form.\n */\nconst getSetting = (formID, optionName, type = 'abandonment') => {\n let formSettings;\n // Observer on forms which has enabled abandonment.\n if (typeof frmAbdn.formSettings !== 'undefined' && 'abandonment' === type) {\n formSettings = frmAbdn.formSettings;\n }\n // Observer on draft enabled forms with logged out permission.\n if (typeof frmAbdn.loggedOutDraft !== 'undefined' && 'loggedOutDraft' === type) {\n formSettings = frmAbdn.loggedOutDraft;\n }\n const matchedSetting = formSettings.find(setting => setting.form_id === formID);\n return matchedSetting[optionName];\n};\n\n/**\n * Prepare all filled form Data.\n *\n * @since 1.0\n *\n * @param {string} id Form selector.\n * @return {Object|string} An object with empty: true if there is no data to send. Otherwise, a serialized string is returned.\n */\nconst getFormData = id => {\n const element = selector(id);\n if (isFormEmpty(element)) {\n return {\n empty: true\n };\n }\n\n // If the form is loading, don't save.\n if (element.classList.contains('frm_loading_form') || element.classList.contains('frm_loading_prev')) {\n return {\n empty: true\n };\n }\n return serializeForm(element) + '&antispam_token=' + element.dataset.token;\n};\n\n/**\n * This function works the same as jQuery.serialize, but without using jQuery.\n *\n * @param {HTMLElement} element\n * @return {string} Serialized form data.\n */\nconst serializeForm = element => {\n return Array.from(new FormData(element), function (e) {\n return e.map(encodeURIComponent).join('=');\n }).join('&');\n};\n\n/**\n * Check if any form input values are not empty.\n *\n * @since 1.1.2\n *\n * @param {HTMLElement} element\n * @return {boolean} True if the every form input value is empty.\n */\nconst isFormEmpty = element => {\n const formData = new FormData(element);\n for (const value of formData.values()) {\n if ('' !== value) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Get field value by name.\n *\n * @since 1.1\n * @param {string} formID Form identifier.\n * @param {string} fieldName Field name.\n * @return {string} Field value.\n */\nconst getFieldValue = (formID, fieldName) => {\n const form = selector(formID);\n const field = form.querySelector(`input[name='${fieldName}']`);\n if (!field) {\n return '';\n }\n return field.value;\n};\n\n/**\n * Add a hidden input to the form if it doesn't exist.\n *\n * @param {Object} formEl The form element.\n * @param {string} fieldName The name of the input.\n * @param {string} value The value of the input.\n * @return {void}\n */\nconst addHiddenField = (formEl, fieldName, value) => {\n if (value === undefined) {\n return;\n }\n let input = formEl.querySelector(`input[name=\"${fieldName}\"]`);\n if (!input) {\n input = document.createElement('input');\n input.type = 'hidden';\n input.name = fieldName;\n input.value = value;\n formEl.appendChild(input);\n }\n};\n\n/**\n * Prepare an array of observable fields selectors.\n *\n * @since 1.0\n *\n * @param {Array} fieldsName array of field names.\n *\n * @return {Array} array of email or phone number elements for a form.\n */\nconst observableSelector = fieldsName => fieldsName.map(fieldName => `item_meta[${fieldName}]`);\n\n//# sourceURL=webpack://formidable-abandonment/./assets/src/dom-helper.js?");
/***/ }),
/***/ "./assets/src/global-helper.js":
/*!*************************************!*\
!*** ./assets/src/global-helper.js ***!
\*************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ doAjax: () => (/* binding */ doAjax)\n/* harmony export */ });\n/* global frm_js */\n\n/**\n * Handling Ajax.\n *\n * @param {Object} args\n * @since 1.1\n * @return {string|Object} Success object or message on failure.\n */\nconst doAjax = async args => {\n if (!args) {\n return {\n success: false,\n message: 'No data to send.'\n };\n }\n const response = await fetch(frm_js.ajax_url,\n // eslint-disable-line camelcase\n {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Cache-Control': 'no-cache'\n },\n body: args\n });\n return Promise.resolve(response.json());\n};\n\n//# sourceURL=webpack://formidable-abandonment/./assets/src/global-helper.js?");
/***/ }),
/***/ "./assets/src/index.js":
/*!*****************************!*\
!*** ./assets/src/index.js ***!
\*****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _wordpress_dom_ready__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @wordpress/dom-ready */ \"./node_modules/@wordpress/dom-ready/build-module/index.js\");\n/* harmony import */ var _dom_helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dom-helper */ \"./assets/src/dom-helper.js\");\n/* harmony import */ var _dom_closing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dom-closing */ \"./assets/src/dom-closing.js\");\n/* harmony import */ var _components_modal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/modal */ \"./assets/src/components/modal.js\");\n/* global frmAbdn */\n\n/**\n * WordPress dependencies\n */\n\n\n/**\n *Internal dependencies\n */\n\n\n\n\n/**\n * Initializes the scripts when DOM is ready.\n *\n * @since 1.0\n */\n(0,_wordpress_dom_ready__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(() => {\n // Observer on forms which has enabled abandonment.\n if (typeof frmAbdn.formSettings !== 'undefined') {\n observer();\n }\n // Observer on draft enabled forms with logged out permission.\n if (typeof frmAbdn.loggedOutDraft !== 'undefined') {\n draftModalObserver();\n }\n});\n\n/**\n * Observes the forms and handles their data.\n *\n * @since 1.0\n */\nconst observer = () => {\n const formSelectors = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.formSelector)(frmAbdn.formSettings);\n for (const formID in formSelectors) {\n // Bail if form exists.\n if (null === formSelectors[formID]) {\n continue;\n }\n const domClosingObject = new _dom_closing__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n domClosingObject.init(formID, () => {\n let formData = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.getFormData)(formID);\n formData = prepareFormAjaxRequest(formID, formData);\n (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.doAjax)(formData).then(response => {\n handleFormAjaxResponse(response, formID);\n });\n });\n }\n};\n\n/**\n * Observes the forms and handles their data.\n *\n * @since 1.1\n */\nconst draftModalObserver = () => {\n const formSelectors = (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.formSelector)(frmAbdn.loggedOutDraft);\n for (const formID in formSelectors) {\n if (null === formSelectors[formID]) {\n continue;\n }\n const draftModalObject = new _components_modal__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n draftModalObject.init(formID);\n }\n};\n\n/**\n * @param {string} formID Form id.\n * @param {Object} data Form data.\n * @return {FormData|boolean} Form data or false when form is empty.\n */\nfunction prepareFormAjaxRequest(formID, data) {\n // Check the empty flag on prepare data and avoid sending form whenever form is empty.\n if (data.empty === true) {\n return false;\n }\n const formData = new FormData();\n formData.append('form_id', formID);\n formData.append('data', data);\n formData.append('action', 'frm_abandoned');\n return formData;\n}\n\n/**\n * Use the ajax response to update hidden form fields.\n *\n * @param {Object} response The response from the server.\n * @param {string} formID The form ID.\n * @return {void}\n */\nfunction handleFormAjaxResponse(response, formID) {\n if (!response.success || !response.data.id) {\n return;\n }\n\n // Get the \"frm_action\" input and set the value to \"update\".\n const form = document.querySelector('#frm_form_' + formID + '_container .frm_fields_container');\n const frmAction = form.querySelector('input[name=\"frm_action\"]');\n frmAction.value = 'update';\n (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.addHiddenField)(form, 'id', response.data.id);\n (0,_dom_helper__WEBPACK_IMPORTED_MODULE_0__.addHiddenField)(form, 'secret', response.data.secret);\n}\n\n//# sourceURL=webpack://formidable-abandonment/./assets/src/index.js?");
/***/ }),
/***/ "./node_modules/tingle.js/dist/tingle.min.js":
/*!***************************************************!*\
!*** ./node_modules/tingle.js/dist/tingle.min.js ***!
\***************************************************/
/***/ (function(module, exports, __webpack_require__) {
eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;!function(t,o){ true?!(__WEBPACK_AMD_DEFINE_FACTORY__ = (o),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)):0}(this,function(){var o=!1;function t(t){this.opts=function(){for(var t=1;t<arguments.length;t++)for(var o in arguments[t])arguments[t].hasOwnProperty(o)&&(arguments[0][o]=arguments[t][o]);return arguments[0]}({},{onClose:null,onOpen:null,beforeOpen:null,beforeClose:null,stickyFooter:!1,footer:!1,cssClass:[],closeLabel:\"Close\",closeMethods:[\"overlay\",\"button\",\"escape\"]},t),this.init()}function e(){this.modalBoxFooter&&(this.modalBoxFooter.style.width=this.modalBox.clientWidth+\"px\",this.modalBoxFooter.style.left=this.modalBox.offsetLeft+\"px\")}return t.prototype.init=function(){if(!this.modal)return function(){this.modal=document.createElement(\"div\"),this.modal.classList.add(\"tingle-modal\"),0!==this.opts.closeMethods.length&&-1!==this.opts.closeMethods.indexOf(\"overlay\")||this.modal.classList.add(\"tingle-modal--noOverlayClose\");this.modal.style.display=\"none\",this.opts.cssClass.forEach(function(t){\"string\"==typeof t&&this.modal.classList.add(t)},this),-1!==this.opts.closeMethods.indexOf(\"button\")&&(this.modalCloseBtn=document.createElement(\"button\"),this.modalCloseBtn.type=\"button\",this.modalCloseBtn.classList.add(\"tingle-modal__close\"),this.modalCloseBtnIcon=document.createElement(\"span\"),this.modalCloseBtnIcon.classList.add(\"tingle-modal__closeIcon\"),this.modalCloseBtnIcon.innerHTML='<svg viewBox=\"0 0 10 10\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M.3 9.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3L5 6.4l3.3 3.3c.2.2.5.3.7.3.2 0 .5-.1.7-.3.4-.4.4-1 0-1.4L6.4 5l3.3-3.3c.4-.4.4-1 0-1.4-.4-.4-1-.4-1.4 0L5 3.6 1.7.3C1.3-.1.7-.1.3.3c-.4.4-.4 1 0 1.4L3.6 5 .3 8.3c-.4.4-.4 1 0 1.4z\" fill=\"#000\" fill-rule=\"nonzero\"/></svg>',this.modalCloseBtnLabel=document.createElement(\"span\"),this.modalCloseBtnLabel.classList.add(\"tingle-modal__closeLabel\"),this.modalCloseBtnLabel.innerHTML=this.opts.closeLabel,this.modalCloseBtn.appendChild(this.modalCloseBtnIcon),this.modalCloseBtn.appendChild(this.modalCloseBtnLabel));this.modalBox=document.createElement(\"div\"),this.modalBox.classList.add(\"tingle-modal-box\"),this.modalBoxContent=document.createElement(\"div\"),this.modalBoxContent.classList.add(\"tingle-modal-box__content\"),this.modalBox.appendChild(this.modalBoxContent),-1!==this.opts.closeMethods.indexOf(\"button\")&&this.modal.appendChild(this.modalCloseBtn);this.modal.appendChild(this.modalBox)}.call(this),function(){this._events={clickCloseBtn:this.close.bind(this),clickOverlay:function(t){var o=this.modal.offsetWidth-this.modal.clientWidth,e=t.clientX>=this.modal.offsetWidth-15,s=this.modal.scrollHeight!==this.modal.offsetHeight;if(\"MacIntel\"===navigator.platform&&0==o&&e&&s)return;-1!==this.opts.closeMethods.indexOf(\"overlay\")&&!function(t,o){for(;(t=t.parentElement)&&!t.classList.contains(o););return t}(t.target,\"tingle-modal\")&&t.clientX<this.modal.clientWidth&&this.close()}.bind(this),resize:this.checkOverflow.bind(this),keyboardNav:function(t){-1!==this.opts.closeMethods.indexOf(\"escape\")&&27===t.which&&this.isOpen()&&this.close()}.bind(this)},-1!==this.opts.closeMethods.indexOf(\"button\")&&this.modalCloseBtn.addEventListener(\"click\",this._events.clickCloseBtn);this.modal.addEventListener(\"mousedown\",this._events.clickOverlay),window.addEventListener(\"resize\",this._events.resize),document.addEventListener(\"keydown\",this._events.keyboardNav)}.call(this),document.body.appendChild(this.modal,document.body.firstChild),this.opts.footer&&this.addFooter(),this},t.prototype._busy=function(t){o=t},t.prototype._isBusy=function(){return o},t.prototype.destroy=function(){null!==this.modal&&(this.isOpen()&&this.close(!0),function(){-1!==this.opts.closeMethods.indexOf(\"button\")&&this.modalCloseBtn.removeEventListener(\"click\",this._events.clickCloseBtn);this.modal.removeEventListener(\"mousedown\",this._events.clickOverlay),window.removeEventListener(\"resize\",this._events.resize),document.removeEventListener(\"keydown\",this._events.keyboardNav)}.call(this),this.modal.parentNode.removeChild(this.modal),this.modal=null)},t.prototype.isOpen=function(){return!!this.modal.classList.contains(\"tingle-modal--visible\")},t.prototype.open=function(){if(!this._isBusy()){this._busy(!0);var t=this;return\"function\"==typeof t.opts.beforeOpen&&t.opts.beforeOpen(),this.modal.style.removeProperty?this.modal.style.removeProperty(\"display\"):this.modal.style.removeAttribute(\"display\"),document.getSelection().removeAllRanges(),this._scrollPosition=window.pageYOffset,document.body.classList.add(\"tingle-enabled\"),document.body.style.top=-this._scrollPosition+\"px\",this.setStickyFooter(this.opts.stickyFooter),this.modal.classList.add(\"tingle-modal--visible\"),\"function\"==typeof t.opts.onOpen&&t.opts.onOpen.call(t),t._busy(!1),this.checkOverflow(),this}},t.prototype.close=function(t){if(!this._isBusy()){if(this._busy(!0),!1,\"function\"==typeof this.opts.beforeClose)if(!this.opts.beforeClose.call(this))return void this._busy(!1);document.body.classList.remove(\"tingle-enabled\"),document.body.style.top=null,window.scrollTo({top:this._scrollPosition,behavior:\"instant\"}),this.modal.classList.remove(\"tingle-modal--visible\");var o=this;o.modal.style.display=\"none\",\"function\"==typeof o.opts.onClose&&o.opts.onClose.call(this),o._busy(!1)}},t.prototype.setContent=function(t){return\"string\"==typeof t?this.modalBoxContent.innerHTML=t:(this.modalBoxContent.innerHTML=\"\",this.modalBoxContent.appendChild(t)),this.isOpen()&&this.checkOverflow(),this},t.prototype.getContent=function(){return this.modalBoxContent},t.prototype.addFooter=function(){return function(){this.modalBoxFooter=document.createElement(\"div\"),this.modalBoxFooter.classList.add(\"tingle-modal-box__footer\"),this.modalBox.appendChild(this.modalBoxFooter)}.call(this),this},t.prototype.setFooterContent=function(t){return this.modalBoxFooter.innerHTML=t,this},t.prototype.getFooterContent=function(){return this.modalBoxFooter},t.prototype.setStickyFooter=function(t){return this.isOverflow()||(t=!1),t?this.modalBox.contains(this.modalBoxFooter)&&(this.modalBox.removeChild(this.modalBoxFooter),this.modal.appendChild(this.modalBoxFooter),this.modalBoxFooter.classList.add(\"tingle-modal-box__footer--sticky\"),e.call(this),this.modalBoxContent.style[\"padding-bottom\"]=this.modalBoxFooter.clientHeight+20+\"px\"):this.modalBoxFooter&&(this.modalBox.contains(this.modalBoxFooter)||(this.modal.removeChild(this.modalBoxFooter),this.modalBox.appendChild(this.modalBoxFooter),this.modalBoxFooter.style.width=\"auto\",this.modalBoxFooter.style.left=\"\",this.modalBoxContent.style[\"padding-bottom\"]=\"\",this.modalBoxFooter.classList.remove(\"tingle-modal-box__footer--sticky\"))),this},t.prototype.addFooterBtn=function(t,o,e){var s=document.createElement(\"button\");return s.innerHTML=t,s.addEventListener(\"click\",e),\"string\"==typeof o&&o.length&&o.split(\" \").forEach(function(t){s.classList.add(t)}),this.modalBoxFooter.appendChild(s),s},t.prototype.resize=function(){console.warn(\"Resize is deprecated and will be removed in version 1.0\")},t.prototype.isOverflow=function(){return window.innerHeight<=this.modalBox.clientHeight},t.prototype.checkOverflow=function(){this.modal.classList.contains(\"tingle-modal--visible\")&&(this.isOverflow()?this.modal.classList.add(\"tingle-modal--overflow\"):this.modal.classList.remove(\"tingle-modal--overflow\"),!this.isOverflow()&&this.opts.stickyFooter?this.setStickyFooter(!1):this.isOverflow()&&this.opts.stickyFooter&&(e.call(this),this.setStickyFooter(!0)))},{modal:t}});\n\n//# sourceURL=webpack://formidable-abandonment/./node_modules/tingle.js/dist/tingle.min.js?");
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => (module['default']) :
/******/ () => (module);
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module can't be inlined because the eval devtool is used.
/******/ var __webpack_exports__ = __webpack_require__("./assets/src/index.js");
/******/
/******/ })()
;