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
		
			
				
	
	
		
			174 lines
		
	
	
		
			No EOL
		
	
	
		
			47 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			No EOL
		
	
	
		
			47 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | ||
|  * 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");
 | ||
| /******/ 	
 | ||
| /******/ })()
 | ||
| ; |